Index: zend_vm_execute.h
===================================================================
--- zend_vm_execute.h	(revision 291846)
+++ zend_vm_execute.h	(working copy)
@@ -754,7 +754,9 @@
 			if (EX(object)) {
 				Z_ADDREF_P(EX(object));
 			}
+			if(opline->extended_value != ZEND_FETCH_ADD_LOCK) {
 
+			}
 			ZEND_VM_NEXT_OPCODE();
 		}
 
@@ -948,7 +950,9 @@
 			if (EX(object)) {
 				Z_ADDREF_P(EX(object));
 			}
-			zval_dtor(free_op2.var);
+			if(opline->extended_value != ZEND_FETCH_ADD_LOCK) {
+				zval_dtor(free_op2.var);
+			}
 			ZEND_VM_NEXT_OPCODE();
 		}
 
@@ -1049,7 +1053,9 @@
 			if (EX(object)) {
 				Z_ADDREF_P(EX(object));
 			}
-			if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+			if(opline->extended_value != ZEND_FETCH_ADD_LOCK) {
+				if (free_op2.var) {zval_ptr_dtor(&free_op2.var);};
+			}
 			ZEND_VM_NEXT_OPCODE();
 		}
 
@@ -1173,7 +1179,9 @@
 			if (EX(object)) {
 				Z_ADDREF_P(EX(object));
 			}
+			if(opline->extended_value != ZEND_FETCH_ADD_LOCK) {
 
+			}
 			ZEND_VM_NEXT_OPCODE();
 		}
 
Index: zend_compile.c
===================================================================
--- zend_compile.c	(revision 291846)
+++ zend_compile.c	(working copy)
@@ -1704,6 +1704,36 @@
 }
 /* }}} */
 
+void zend_do_begin_chain_function_call(znode *function_var TSRMLS_DC) /* {{{ */
+{
+	unsigned char *ptr = NULL;
+	zend_op *opline;
+
+	opline = get_next_op(CG(active_op_array) TSRMLS_CC);
+	opline->opcode = ZEND_INIT_FCALL_BY_NAME;
+	opline->op2 = *function_var;
+	/* do not free function_var in ZEND_INIT_FCALL_BY_NAME, since fcall may need it */
+	opline->extended_value = ZEND_FETCH_ADD_LOCK;
+	SET_UNUSED(opline->op1);
+
+	zend_stack_push(&CG(function_call_stack), (void *) &ptr, sizeof(zend_function *));
+	zend_do_extended_fcall_begin(TSRMLS_C);
+}
+/* }}} */
+
+void zend_do_end_chain_function_call(znode *function_var TSRMLS_DC) /* {{{ */
+{
+	unsigned char *ptr = NULL;
+	zend_op *opline;
+
+	opline = get_next_op(CG(active_op_array) TSRMLS_CC);
+	opline->opcode = (function_var->op_type == IS_TMP_VAR) ? ZEND_FREE : ZEND_SWITCH_FREE;
+	opline->op1 = *function_var;
+	SET_UNUSED(opline->op2);
+	opline->extended_value = 0;
+}
+/* }}} */
+
 void zend_resolve_non_class_name(znode *element_name, zend_bool check_namespace TSRMLS_DC) /* {{{ */
 {
 	znode tmp;
Index: zend_compile.h
===================================================================
--- zend_compile.h	(revision 291846)
+++ zend_compile.h	(working copy)
@@ -433,6 +433,8 @@
 void zend_do_end_function_call(znode *function_name, znode *result, const znode *argument_list, int is_method, int is_dynamic_fcall TSRMLS_DC);
 void zend_do_return(znode *expr, int do_end_vparse TSRMLS_DC);
 void zend_do_handle_exception(TSRMLS_D);
+void zend_do_begin_chain_function_call(znode *function_var TSRMLS_DC);
+void zend_do_end_chain_function_call(znode *function_var TSRMLS_DC);
 
 void zend_do_begin_lambda_function_declaration(znode *result, znode *function_token, int return_reference TSRMLS_DC);
 void zend_do_fetch_lexical_variable(znode *varname, zend_bool is_ref TSRMLS_DC);
Index: zend_language_parser.y
===================================================================
--- zend_language_parser.y	(revision 291846)
+++ zend_language_parser.y	(working copy)
@@ -875,6 +875,10 @@
 
 base_variable_with_function_calls:
 		base_variable		{ $$ = $1; }
+	| 	function_call { zend_do_begin_variable_parse(TSRMLS_C); } '(' 
+		{ zend_do_begin_chain_function_call(&$1 TSRMLS_CC); }
+			function_call_parameter_list
+		')' { zend_do_end_function_call(&$1, &$$, &$5, 0, 1 TSRMLS_CC); zend_do_end_chain_function_call(&$1 TSRMLS_CC); zend_do_extended_fcall_end(TSRMLS_C); $$.u.EA.type = ZEND_PARSED_FUNCTION_CALL; }	
 	|	function_call { zend_do_begin_variable_parse(TSRMLS_C); $$ = $1; $$.u.EA.type = ZEND_PARSED_FUNCTION_CALL; }
 ;
 
Index: zend_vm_def.h
===================================================================
--- zend_vm_def.h	(revision 291846)
+++ zend_vm_def.h	(working copy)
@@ -2094,7 +2094,9 @@
 			if (EX(object)) {
 				Z_ADDREF_P(EX(object));
 			}
-			FREE_OP2();
+			if(opline->extended_value != ZEND_FETCH_ADD_LOCK) {
+				FREE_OP2();
+			}
 			ZEND_VM_NEXT_OPCODE();
 		}
 
