]> granicus.if.org Git - php/commitdiff
Removed unnecessary checks
authorDmitry Stogov <dmitry@zend.com>
Thu, 13 Dec 2012 13:29:30 +0000 (17:29 +0400)
committerDmitry Stogov <dmitry@zend.com>
Thu, 13 Dec 2012 13:29:30 +0000 (17:29 +0400)
Zend/zend_execute.h
Zend/zend_execute_API.c
Zend/zend_vm_def.h
Zend/zend_vm_execute.h

index ab560b3da341b48964463716f8cf72d1fe08292f..729015c37160d2c2d35671fa3047d90ee3960c4a 100644 (file)
@@ -287,17 +287,21 @@ static zend_always_inline void zend_vm_stack_free(void *ptr TSRMLS_DC)
        }
 }
 
-static zend_always_inline void zend_vm_stack_clear_multiple(TSRMLS_D)
+static zend_always_inline void zend_vm_stack_clear_multiple(int nested TSRMLS_DC)
 {
        void **p = EG(argument_stack)->top - 1;
-       int delete_count = (int)(zend_uintptr_t) *p;
+       void **end = p - (int)(zend_uintptr_t)*p;
 
-       while (--delete_count>=0) {
+       while (p != end) {
                zval *q = *(zval **)(--p);
                *p = NULL;
                i_zval_ptr_dtor(q ZEND_FILE_LINE_CC);
        }
-       zend_vm_stack_free_int(p TSRMLS_CC);
+       if (nested) {
+               EG(argument_stack)->top = p;
+       } else {
+               zend_vm_stack_free_int(p TSRMLS_CC);
+       }
 }
 
 static zend_always_inline int zend_vm_stack_get_args_count_ex(zend_execute_data *ex)
index 042b83c7672a00547c90f0d02562942bb5229f38..010f5b780c686cd8f67c76321b434a1340cf4d65 100644 (file)
@@ -841,7 +841,7 @@ int zend_call_function(zend_fcall_info *fci, zend_fcall_info_cache *fci_cache TS
                                        if (i || UNEXPECTED(ZEND_VM_STACK_ELEMETS(EG(argument_stack)) == (EG(argument_stack)->top))) {
                                                /* hack to clean up the stack */
                                                zend_vm_stack_push((void *) (zend_uintptr_t)i TSRMLS_CC);
-                                               zend_vm_stack_clear_multiple(TSRMLS_C);
+                                               zend_vm_stack_clear_multiple(0 TSRMLS_CC);
                                        }
 
                                        zend_error(E_WARNING, "Parameter %d to %s%s%s() expected to be a reference, value given",
@@ -995,7 +995,7 @@ int zend_call_function(zend_fcall_info *fci, zend_fcall_info_cache *fci_cache TS
                        *fci->retval_ptr_ptr = NULL;
                }
        }
-       zend_vm_stack_clear_multiple(TSRMLS_C);
+       zend_vm_stack_clear_multiple(0 TSRMLS_CC);
 
        if (EG(This)) {
                zval_ptr_dtor(&EG(This));
index ef3f80e596aa84b50ead7855f739c01ef5b7072e..ab40e0bb21a7d3e3ff888db6a426ffed41ee1969 100644 (file)
@@ -1922,7 +1922,7 @@ ZEND_VM_HELPER(zend_leave_helper, ANY, ANY)
 
                        EX(call)--;
 
-                       zend_vm_stack_clear_multiple(TSRMLS_C);
+                       zend_vm_stack_clear_multiple(1 TSRMLS_CC);
 
                        if (UNEXPECTED(EG(exception) != NULL)) {
                                zend_throw_exception_internal(NULL TSRMLS_CC);
@@ -2098,7 +2098,7 @@ ZEND_VM_HELPER(zend_do_fcall_common_helper, ANY, ANY)
 
        EX(call)--;
 
-       zend_vm_stack_clear_multiple(TSRMLS_C);
+       zend_vm_stack_clear_multiple(1 TSRMLS_CC);
 
        if (UNEXPECTED(EG(exception) != NULL)) {
                zend_throw_exception_internal(NULL TSRMLS_CC);
index 4e4dedfd0888b3932e86c1f409609d127f6582eb..7f3420f93a8591366272ba4bf72a1f17eb0cb6c3 100644 (file)
@@ -463,7 +463,7 @@ static int ZEND_FASTCALL zend_leave_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS)
 
                        EX(call)--;
 
-                       zend_vm_stack_clear_multiple(TSRMLS_C);
+                       zend_vm_stack_clear_multiple(1 TSRMLS_CC);
 
                        if (UNEXPECTED(EG(exception) != NULL)) {
                                zend_throw_exception_internal(NULL TSRMLS_CC);
@@ -639,7 +639,7 @@ static int ZEND_FASTCALL zend_do_fcall_common_helper_SPEC(ZEND_OPCODE_HANDLER_AR
 
        EX(call)--;
 
-       zend_vm_stack_clear_multiple(TSRMLS_C);
+       zend_vm_stack_clear_multiple(1 TSRMLS_CC);
 
        if (UNEXPECTED(EG(exception) != NULL)) {
                zend_throw_exception_internal(NULL TSRMLS_CC);