]> granicus.if.org Git - php/commitdiff
Fixed passing by reference
authorDmitry Stogov <dmitry@zend.com>
Tue, 4 Mar 2014 19:54:05 +0000 (23:54 +0400)
committerDmitry Stogov <dmitry@zend.com>
Tue, 4 Mar 2014 19:54:05 +0000 (23:54 +0400)
Zend/zend_vm_def.h
Zend/zend_vm_execute.h

index 134948e96c0830b2ff9dc54b43cd2202de94a0af..85670884c83c5f593a48063bb7d1e3952ad60515 100644 (file)
@@ -1889,7 +1889,7 @@ ZEND_VM_HELPER(zend_leave_helper, ANY, ANY)
 
                        if (UNEXPECTED(EG(exception) != NULL)) {
                                zend_throw_exception_internal(NULL TSRMLS_CC);
-                               if (RETURN_VALUE_USED(opline) /*???&& EX_VAR(opline->result.var) */) {
+                               if (RETURN_VALUE_USED(opline)) {
                                        zval_ptr_dtor(EX_VAR(opline->result.var));
                                }
                                HANDLE_EXCEPTION_LEAVE();
@@ -2077,7 +2077,7 @@ ZEND_VM_HELPER(zend_do_fcall_common_helper, ANY, ANY)
 
        if (UNEXPECTED(EG(exception) != NULL)) {
                zend_throw_exception_internal(NULL TSRMLS_CC);
-               if (RETURN_VALUE_USED(opline) /*???&& EX_T(opline->result.var).var.ptr*/) {
+               if (RETURN_VALUE_USED(opline)) {
                        zval_ptr_dtor(EX_VAR(opline->result.var));
                }
                HANDLE_EXCEPTION();
@@ -3076,15 +3076,30 @@ ZEND_VM_HANDLER(106, ZEND_SEND_VAR_NO_REF, VAR|CV, ANY)
        }
 
        varptr = GET_OP1_ZVAL_PTR(BP_VAR_R);
-//???  if ((!(opline->extended_value & ZEND_ARG_SEND_FUNCTION) ||
-//???       EX_T(opline->op1.var).var.fcall_returned_reference) &&
-//???      (Z_ISREF_P(varptr) || Z_REFCOUNT_P(varptr) == 1)) {
-//???          Z_SET_ISREF_P(varptr);
-//???          if (OP1_TYPE == IS_CV) {
-//???                  Z_ADDREF_P(varptr);
-//???          }
-//???          zend_vm_stack_push(varptr TSRMLS_CC);
-//???  } else {
+//???
+#if 0
+       if ((!(opline->extended_value & ZEND_ARG_SEND_FUNCTION) ||
+            EX_T(opline->op1.var).var.fcall_returned_reference) &&
+           (Z_ISREF_P(varptr) || Z_REFCOUNT_P(varptr) == 1)) {
+               Z_SET_ISREF_P(varptr);
+               if (OP1_TYPE == IS_CV) {
+                       Z_ADDREF_P(varptr);
+               }
+               zend_vm_stack_push(varptr TSRMLS_CC);
+#else
+       if (Z_ISREF_P(varptr)) {
+               if (OP1_TYPE == IS_CV) {
+                       Z_ADDREF_P(varptr);
+               }
+               zend_vm_stack_push(varptr TSRMLS_CC);
+       } else if (!Z_REFCOUNTED_P(varptr) || Z_REFCOUNT_P(varptr) == 1) {
+               ZVAL_NEW_REF(varptr, varptr);
+               if (OP1_TYPE == IS_CV) {
+                       Z_ADDREF_P(varptr);
+               }
+               zend_vm_stack_push(varptr TSRMLS_CC);
+#endif
+       } else {
                zval val;
 
                if ((opline->extended_value & ZEND_ARG_COMPILE_TIME_BOUND) ?
@@ -3098,7 +3113,7 @@ ZEND_VM_HANDLER(106, ZEND_SEND_VAR_NO_REF, VAR|CV, ANY)
                }
                FREE_OP1_IF_VAR();
                zend_vm_stack_push(&val TSRMLS_CC);
-//???  }
+       }
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
 }
index 3aa996951f5e8ed7edb090bf14ecebbdd96173b2..16cb547a7c81aa63712be89b0ff7297de52bb45b 100644 (file)
@@ -454,7 +454,7 @@ static int ZEND_FASTCALL zend_leave_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS)
 
                        if (UNEXPECTED(EG(exception) != NULL)) {
                                zend_throw_exception_internal(NULL TSRMLS_CC);
-                               if (RETURN_VALUE_USED(opline) /*???&& EX_VAR(opline->result.var) */) {
+                               if (RETURN_VALUE_USED(opline)) {
                                        zval_ptr_dtor(EX_VAR(opline->result.var));
                                }
                                HANDLE_EXCEPTION_LEAVE();
@@ -642,7 +642,7 @@ static int ZEND_FASTCALL zend_do_fcall_common_helper_SPEC(ZEND_OPCODE_HANDLER_AR
 
        if (UNEXPECTED(EG(exception) != NULL)) {
                zend_throw_exception_internal(NULL TSRMLS_CC);
-               if (RETURN_VALUE_USED(opline) /*???&& EX_T(opline->result.var).var.ptr*/) {
+               if (RETURN_VALUE_USED(opline)) {
                        zval_ptr_dtor(EX_VAR(opline->result.var));
                }
                HANDLE_EXCEPTION();
@@ -12817,15 +12817,30 @@ static int ZEND_FASTCALL  ZEND_SEND_VAR_NO_REF_SPEC_VAR_HANDLER(ZEND_OPCODE_HAND
        }
 
        varptr = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
-//???  if ((!(opline->extended_value & ZEND_ARG_SEND_FUNCTION) ||
-//???       EX_T(opline->op1.var).var.fcall_returned_reference) &&
-//???      (Z_ISREF_P(varptr) || Z_REFCOUNT_P(varptr) == 1)) {
-//???          Z_SET_ISREF_P(varptr);
-//???          if (IS_VAR == IS_CV) {
-//???                  Z_ADDREF_P(varptr);
-//???          }
-//???          zend_vm_stack_push(varptr TSRMLS_CC);
-//???  } else {
+//???
+#if 0
+       if ((!(opline->extended_value & ZEND_ARG_SEND_FUNCTION) ||
+            EX_T(opline->op1.var).var.fcall_returned_reference) &&
+           (Z_ISREF_P(varptr) || Z_REFCOUNT_P(varptr) == 1)) {
+               Z_SET_ISREF_P(varptr);
+               if (IS_VAR == IS_CV) {
+                       Z_ADDREF_P(varptr);
+               }
+               zend_vm_stack_push(varptr TSRMLS_CC);
+#else
+       if (Z_ISREF_P(varptr)) {
+               if (IS_VAR == IS_CV) {
+                       Z_ADDREF_P(varptr);
+               }
+               zend_vm_stack_push(varptr TSRMLS_CC);
+       } else if (!Z_REFCOUNTED_P(varptr) || Z_REFCOUNT_P(varptr) == 1) {
+               ZVAL_NEW_REF(varptr, varptr);
+               if (IS_VAR == IS_CV) {
+                       Z_ADDREF_P(varptr);
+               }
+               zend_vm_stack_push(varptr TSRMLS_CC);
+#endif
+       } else {
                zval val;
 
                if ((opline->extended_value & ZEND_ARG_COMPILE_TIME_BOUND) ?
@@ -12839,7 +12854,7 @@ static int ZEND_FASTCALL  ZEND_SEND_VAR_NO_REF_SPEC_VAR_HANDLER(ZEND_OPCODE_HAND
                }
                zval_ptr_dtor_nogc(free_op1.var);
                zend_vm_stack_push(&val TSRMLS_CC);
-//???  }
+       }
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
 }
@@ -29930,15 +29945,30 @@ static int ZEND_FASTCALL  ZEND_SEND_VAR_NO_REF_SPEC_CV_HANDLER(ZEND_OPCODE_HANDL
        }
 
        varptr = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op1.var TSRMLS_CC);
-//???  if ((!(opline->extended_value & ZEND_ARG_SEND_FUNCTION) ||
-//???       EX_T(opline->op1.var).var.fcall_returned_reference) &&
-//???      (Z_ISREF_P(varptr) || Z_REFCOUNT_P(varptr) == 1)) {
-//???          Z_SET_ISREF_P(varptr);
-//???          if (IS_CV == IS_CV) {
-//???                  Z_ADDREF_P(varptr);
-//???          }
-//???          zend_vm_stack_push(varptr TSRMLS_CC);
-//???  } else {
+//???
+#if 0
+       if ((!(opline->extended_value & ZEND_ARG_SEND_FUNCTION) ||
+            EX_T(opline->op1.var).var.fcall_returned_reference) &&
+           (Z_ISREF_P(varptr) || Z_REFCOUNT_P(varptr) == 1)) {
+               Z_SET_ISREF_P(varptr);
+               if (IS_CV == IS_CV) {
+                       Z_ADDREF_P(varptr);
+               }
+               zend_vm_stack_push(varptr TSRMLS_CC);
+#else
+       if (Z_ISREF_P(varptr)) {
+               if (IS_CV == IS_CV) {
+                       Z_ADDREF_P(varptr);
+               }
+               zend_vm_stack_push(varptr TSRMLS_CC);
+       } else if (!Z_REFCOUNTED_P(varptr) || Z_REFCOUNT_P(varptr) == 1) {
+               ZVAL_NEW_REF(varptr, varptr);
+               if (IS_CV == IS_CV) {
+                       Z_ADDREF_P(varptr);
+               }
+               zend_vm_stack_push(varptr TSRMLS_CC);
+#endif
+       } else {
                zval val;
 
                if ((opline->extended_value & ZEND_ARG_COMPILE_TIME_BOUND) ?
@@ -29952,7 +29982,7 @@ static int ZEND_FASTCALL  ZEND_SEND_VAR_NO_REF_SPEC_CV_HANDLER(ZEND_OPCODE_HANDL
                }
 
                zend_vm_stack_push(&val TSRMLS_CC);
-//???  }
+       }
        CHECK_EXCEPTION();
        ZEND_VM_NEXT_OPCODE();
 }