]> granicus.if.org Git - php/commitdiff
Merge branch 'PHP-5.3' into PHP-5.4
authorDmitry Stogov <dmitry@zend.com>
Mon, 25 Mar 2013 11:23:49 +0000 (15:23 +0400)
committerDmitry Stogov <dmitry@zend.com>
Mon, 25 Mar 2013 11:23:49 +0000 (15:23 +0400)
* PHP-5.3:
  Fixed bug #63914 (zend_do_fcall_common_helper_SPEC does not handle exceptions properly). (Jeff Welch)

Conflicts:
NEWS
Zend/zend_vm_def.h
Zend/zend_vm_execute.h

1  2 
NEWS
Zend/zend_vm_def.h
Zend/zend_vm_execute.h

diff --cc NEWS
index bc132d46337b4e6e36633a7f46bac031e15da1d6,9d5fc6d760ebf5e2098a0314f6ae351508a0bd0b..c14ea1cc873368b811922b5c20504d1a0e3b9ae0
--- 1/NEWS
--- 2/NEWS
+++ b/NEWS
@@@ -1,16 -1,12 +1,18 @@@
  PHP                                                                        NEWS
  |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
 -?? ??? 2013, PHP 5.3.24
 -
 +?? ??? 2013, PHP 5.4.14
  - Core
 +  . Fixed bug #64432 (more empty delimiter warning in strX methods). (Laruence)
 +  . Fixed bug #64417 (ArrayAccess::&offsetGet() in a trait causes fatal error).
 +    (Dmitry)
    . Fixed bug #64370 (microtime(true) less than $_SERVER['REQUEST_TIME_FLOAT']).
      (Anatol)
 +  . Fixed bug #64239 (Debug backtrace changed behavior since 5.4.10 or 5.4.11).
 +    (Dmitry, Laruence)
 +  . Fixed bug #63976 (Parent class incorrectly using child constant in class
 +    property). (Dmitry)
+   . Fixed bug #63914 (zend_do_fcall_common_helper_SPEC does not handle
+     exceptions properly). (Jeff Welch)
    . Fixed bug #62343 (Show class_alias In get_declared_classes()) (Dmitry)
  
  - PCRE:
index e5cdd1d1fbd287a067dafe8cd790fec39876b9e0,eed924518eface65653f1e3f6417848eda29f6d4..ffa94a18625da73d65d1e8ff83dc992e8ba65d53
@@@ -2652,17 -2299,9 +2652,12 @@@ ZEND_VM_HELPER(zend_do_fcall_common_hel
  
        zend_arg_types_stack_3_pop(&EG(arg_types_stack), &EX(called_scope), &EX(current_object), &EX(fbc));
        EX(function_state).arguments = zend_vm_stack_push_args(opline->extended_value TSRMLS_CC);
 +      LOAD_OPLINE();
 +
 +      if (fbc->type == ZEND_INTERNAL_FUNCTION) {
 +              temp_variable *ret = &EX_T(opline->result.var);
  
-               MAKE_STD_ZVAL(ret->var.ptr);
-               ZVAL_NULL(ret->var.ptr);
-               ret->var.ptr_ptr = &ret->var.ptr;
-               ret->var.fcall_returned_reference = (fbc->common.fn_flags & ZEND_ACC_RETURN_REFERENCE) != 0;
 -      if (EX(function_state).function->type == ZEND_INTERNAL_FUNCTION) {
 -              if (EX(function_state).function->common.arg_info) {
 +              if (fbc->common.arg_info) {
                        zend_uint i=0;
                        zval **p = (zval**)EX(function_state).arguments;
                        ulong arg_count = opline->extended_value;
                        }
                }
  
-               if (!zend_execute_internal) {
-                       /* saves one function call if zend_execute_internal is not used */
-                       fbc->internal_function.handler(opline->extended_value, ret->var.ptr, (fbc->common.fn_flags & ZEND_ACC_RETURN_REFERENCE) ? &ret->var.ptr : NULL, EX(object), RETURN_VALUE_USED(opline) TSRMLS_CC);
-               } else {
-                       zend_execute_internal(EXECUTE_DATA, RETURN_VALUE_USED(opline) TSRMLS_CC);
-               }
+               if (EXPECTED(EG(exception) == NULL)) {
 -                      ALLOC_INIT_ZVAL(EX_T(opline->result.u.var).var.ptr);
 -                      EX_T(opline->result.u.var).var.ptr_ptr = &EX_T(opline->result.u.var).var.ptr;
 -                      EX_T(opline->result.u.var).var.fcall_returned_reference = EX(function_state).function->common.return_reference;
++                      MAKE_STD_ZVAL(ret->var.ptr);
++                      ZVAL_NULL(ret->var.ptr);
++                      ret->var.ptr_ptr = &ret->var.ptr;
++                      ret->var.fcall_returned_reference = (fbc->common.fn_flags & ZEND_ACC_RETURN_REFERENCE) != 0;
  
-               if (!RETURN_VALUE_USED(opline)) {
-                       zval_ptr_dtor(&ret->var.ptr);
+                       if (!zend_execute_internal) {
+                               /* saves one function call if zend_execute_internal is not used */
 -                              ((zend_internal_function *) EX(function_state).function)->handler(opline->extended_value, EX_T(opline->result.u.var).var.ptr, EX(function_state).function->common.return_reference?&EX_T(opline->result.u.var).var.ptr:NULL, EX(object), RETURN_VALUE_USED(opline) TSRMLS_CC);
++                              fbc->internal_function.handler(opline->extended_value, ret->var.ptr, (fbc->common.fn_flags & ZEND_ACC_RETURN_REFERENCE) ? &ret->var.ptr : NULL, EX(object), RETURN_VALUE_USED(opline) TSRMLS_CC);
+                       } else {
+                               zend_execute_internal(EXECUTE_DATA, RETURN_VALUE_USED(opline) TSRMLS_CC);
+                       }
+                       if (!RETURN_VALUE_USED(opline)) {
 -                              zval_ptr_dtor(&EX_T(opline->result.u.var).var.ptr);
++                              zval_ptr_dtor(&ret->var.ptr);
+                       }
                }
 -      } else if (EX(function_state).function->type == ZEND_USER_FUNCTION) {
 +      } else if (fbc->type == ZEND_USER_FUNCTION) {
                EX(original_return_value) = EG(return_value_ptr_ptr);
                EG(active_symbol_table) = NULL;
 -              EG(active_op_array) = &EX(function_state).function->op_array;
 +              EG(active_op_array) = &fbc->op_array;
                EG(return_value_ptr_ptr) = NULL;
 -              if (RETURN_VALUE_USED(opline)) {                        
 -                      EG(return_value_ptr_ptr) = &EX_T(opline->result.u.var).var.ptr;
 -                      EX_T(opline->result.u.var).var.ptr = NULL;
 -                      EX_T(opline->result.u.var).var.ptr_ptr = &EX_T(opline->result.u.var).var.ptr;
 -                      EX_T(opline->result.u.var).var.fcall_returned_reference = EX(function_state).function->common.return_reference;
 +              if (RETURN_VALUE_USED(opline)) {
 +                      temp_variable *ret = &EX_T(opline->result.var);
 +
 +                      ret->var.ptr = NULL;
 +                      EG(return_value_ptr_ptr) = &ret->var.ptr;
 +                      ret->var.ptr_ptr = &ret->var.ptr;
 +                      ret->var.fcall_returned_reference = (fbc->common.fn_flags & ZEND_ACC_RETURN_REFERENCE) != 0;
                }
  
 -              if (zend_execute == execute && !EG(exception)) {
 -                      EX(call_opline) = opline;
 -                      ZEND_VM_ENTER();
 +              if (EXPECTED(zend_execute == execute)) {
 +                      if (EXPECTED(EG(exception) == NULL)) {
 +                              ZEND_VM_ENTER();
 +                      }
                } else {
                        zend_execute(EG(active_op_array) TSRMLS_CC);
                }
index 97e5a8e93fd05eab8139917b7b6430c25d6e8318,6edc91a7424d5239d39d7de8ce651e1bc5acd738..1860a0f9baa9c8c9647172d5f34651b8cdcd9198
@@@ -616,17 -299,9 +616,12 @@@ static int ZEND_FASTCALL zend_do_fcall_
  
        zend_arg_types_stack_3_pop(&EG(arg_types_stack), &EX(called_scope), &EX(current_object), &EX(fbc));
        EX(function_state).arguments = zend_vm_stack_push_args(opline->extended_value TSRMLS_CC);
 +      LOAD_OPLINE();
 +
 +      if (fbc->type == ZEND_INTERNAL_FUNCTION) {
 +              temp_variable *ret = &EX_T(opline->result.var);
  
-               MAKE_STD_ZVAL(ret->var.ptr);
-               ZVAL_NULL(ret->var.ptr);
-               ret->var.ptr_ptr = &ret->var.ptr;
-               ret->var.fcall_returned_reference = (fbc->common.fn_flags & ZEND_ACC_RETURN_REFERENCE) != 0;
 -      if (EX(function_state).function->type == ZEND_INTERNAL_FUNCTION) {
 -              if (EX(function_state).function->common.arg_info) {
 +              if (fbc->common.arg_info) {
                        zend_uint i=0;
                        zval **p = (zval**)EX(function_state).arguments;
                        ulong arg_count = opline->extended_value;
                        }
                }
  
-               if (!zend_execute_internal) {
-                       /* saves one function call if zend_execute_internal is not used */
-                       fbc->internal_function.handler(opline->extended_value, ret->var.ptr, (fbc->common.fn_flags & ZEND_ACC_RETURN_REFERENCE) ? &ret->var.ptr : NULL, EX(object), RETURN_VALUE_USED(opline) TSRMLS_CC);
-               } else {
-                       zend_execute_internal(execute_data, RETURN_VALUE_USED(opline) TSRMLS_CC);
-               }
+               if (EXPECTED(EG(exception) == NULL)) {
 -                      ALLOC_INIT_ZVAL(EX_T(opline->result.u.var).var.ptr);
 -                      EX_T(opline->result.u.var).var.ptr_ptr = &EX_T(opline->result.u.var).var.ptr;
 -                      EX_T(opline->result.u.var).var.fcall_returned_reference = EX(function_state).function->common.return_reference;
++                      MAKE_STD_ZVAL(ret->var.ptr);
++                      ZVAL_NULL(ret->var.ptr);
++                      ret->var.ptr_ptr = &ret->var.ptr;
++                      ret->var.fcall_returned_reference = (fbc->common.fn_flags & ZEND_ACC_RETURN_REFERENCE) != 0;
+                       if (!zend_execute_internal) {
+                               /* saves one function call if zend_execute_internal is not used */
 -                              ((zend_internal_function *) EX(function_state).function)->handler(opline->extended_value, EX_T(opline->result.u.var).var.ptr, EX(function_state).function->common.return_reference?&EX_T(opline->result.u.var).var.ptr:NULL, EX(object), RETURN_VALUE_USED(opline) TSRMLS_CC);
++                              fbc->internal_function.handler(opline->extended_value, ret->var.ptr, (fbc->common.fn_flags & ZEND_ACC_RETURN_REFERENCE) ? &ret->var.ptr : NULL, EX(object), RETURN_VALUE_USED(opline) TSRMLS_CC);
+                       } else {
+                               zend_execute_internal(execute_data, RETURN_VALUE_USED(opline) TSRMLS_CC);
+                       }
  
-               if (!RETURN_VALUE_USED(opline)) {
-                       zval_ptr_dtor(&ret->var.ptr);
+                       if (!RETURN_VALUE_USED(opline)) {
 -                              zval_ptr_dtor(&EX_T(opline->result.u.var).var.ptr);
++                              zval_ptr_dtor(&ret->var.ptr);
+                       }
                }
 -      } else if (EX(function_state).function->type == ZEND_USER_FUNCTION) {
 +      } else if (fbc->type == ZEND_USER_FUNCTION) {
                EX(original_return_value) = EG(return_value_ptr_ptr);
                EG(active_symbol_table) = NULL;
 -              EG(active_op_array) = &EX(function_state).function->op_array;
 +              EG(active_op_array) = &fbc->op_array;
                EG(return_value_ptr_ptr) = NULL;
                if (RETURN_VALUE_USED(opline)) {
 -                      EG(return_value_ptr_ptr) = &EX_T(opline->result.u.var).var.ptr;
 -                      EX_T(opline->result.u.var).var.ptr = NULL;
 -                      EX_T(opline->result.u.var).var.ptr_ptr = &EX_T(opline->result.u.var).var.ptr;
 -                      EX_T(opline->result.u.var).var.fcall_returned_reference = EX(function_state).function->common.return_reference;
 +                      temp_variable *ret = &EX_T(opline->result.var);
 +
 +                      ret->var.ptr = NULL;
 +                      EG(return_value_ptr_ptr) = &ret->var.ptr;
 +                      ret->var.ptr_ptr = &ret->var.ptr;
 +                      ret->var.fcall_returned_reference = (fbc->common.fn_flags & ZEND_ACC_RETURN_REFERENCE) != 0;
                }
  
 -              if (zend_execute == execute && !EG(exception)) {
 -                      EX(call_opline) = opline;
 -                      ZEND_VM_ENTER();
 +              if (EXPECTED(zend_execute == execute)) {
 +                      if (EXPECTED(EG(exception) == NULL)) {
 +                              ZEND_VM_ENTER();
 +                      }
                } else {
                        zend_execute(EG(active_op_array) TSRMLS_CC);
                }