]> granicus.if.org Git - php/commitdiff
better fix for #48409 , #48428 , #48228
authorArnaud Le Blanc <lbarnaud@php.net>
Mon, 1 Jun 2009 15:07:27 +0000 (15:07 +0000)
committerArnaud Le Blanc <lbarnaud@php.net>
Mon, 1 Jun 2009 15:07:27 +0000 (15:07 +0000)
Zend/zend.h
Zend/zend_ptr_stack.h
Zend/zend_types.h
Zend/zend_vm_def.h
Zend/zend_vm_execute.h

index 3acdcf17dcf2e277319ec45c5ee2845ce4864755..8cf757bb465c0374620b7b9fb3e55c99b20ac1c5 100644 (file)
@@ -193,6 +193,12 @@ char *alloca ();
 # define ZEND_FASTCALL
 #endif
 
+#if defined(__GNUC__) && ZEND_GCC_VERSION >= 3400
+#else
+# define __restrict__
+#endif
+#define restrict __restrict__
+
 #if (HAVE_ALLOCA || (defined (__GNUC__) && __GNUC__ >= 2)) && !(defined(ZTS) && defined(ZEND_WIN32)) && !(defined(ZTS) && defined(NETWARE)) && !(defined(ZTS) && defined(HPUX)) && !defined(DARWIN)
 # define ZEND_ALLOCA_MAX_SIZE (32 * 1024)
 # define ALLOCA_FLAG(name) \
index ffa074608e3f9edead3ad144ef0b3f99ddf05930..7230375c5d0895e73eb434a320fdedd16780dfb3 100644 (file)
@@ -81,7 +81,7 @@ static inline void zend_ptr_stack_2_push(zend_ptr_stack *stack, void *a, void *b
 #undef ZEND_PTR_STACK_NUM_ARGS
 }
 
-static inline void zend_ptr_stack_3_pop(zend_ptr_stack *stack, void **a, void **b, void **c)
+static inline void zend_ptr_stack_3_pop(zend_ptr_stack *stack, zend_alias *restrict a, zend_alias *restrict b, zend_alias *restrict c)
 {
        *a = *(--stack->top_element);
        *b = *(--stack->top_element);
@@ -89,7 +89,7 @@ static inline void zend_ptr_stack_3_pop(zend_ptr_stack *stack, void **a, void **
        stack->top -= 3;
 }
 
-static inline void zend_ptr_stack_2_pop(zend_ptr_stack *stack, void **a, void **b)
+static inline void zend_ptr_stack_2_pop(zend_ptr_stack *stack, zend_alias *restrict a, zend_alias *restrict b)
 {
        *a = *(--stack->top_element);
        *b = *(--stack->top_element);
index 124adf4adfa0c19f9bbbea26af7919087799311d..e3d765529c88f91b09314bd04c7d16888e88f9ce 100644 (file)
@@ -50,6 +50,12 @@ typedef long zend_intptr_t;
 typedef unsigned long zend_uintptr_t;
 #endif
 
+#if defined(__GNUC__) && ZEND_GCC_VERSION >= 3400
+typedef void* __attribute__((__may_alias__)) zend_alias;
+#else
+typedef void* zend_alias;
+#endif
+
 typedef unsigned int zend_object_handle;
 typedef struct _zend_object_handlers zend_object_handlers;
 
index 7f5e364e2d52f5bad2e8e8a2d286d191dd1ce560..8909566e2dbd1adc1fedc2ce37d86bcf19a5841b 100644 (file)
@@ -2362,9 +2362,7 @@ ZEND_VM_HELPER(zend_do_fcall_common_helper, ANY, ANY)
                EG(called_scope) = EX(called_scope);
        }
 
-       EX(called_scope) = zend_ptr_stack_pop(&EG(arg_types_stack));
-       EX(current_object) = zend_ptr_stack_pop(&EG(arg_types_stack));
-       EX(fbc) = zend_ptr_stack_pop(&EG(arg_types_stack));
+       zend_ptr_stack_3_pop(&EG(arg_types_stack), (zend_alias*)&EX(called_scope), (zend_alias*)&EX(current_object), (zend_alias*)&EX(fbc));
        EX(function_state).arguments = zend_vm_stack_push_args(opline->extended_value TSRMLS_CC);
 
        if (EX(function_state).function->type == ZEND_INTERNAL_FUNCTION) {
@@ -4490,8 +4488,7 @@ ZEND_VM_HANDLER(149, ZEND_HANDLE_EXCEPTION, ANY, ANY)
                        zval_ptr_dtor(&EX(object));
                }
                EX(called_scope) = DECODE_CTOR(EX(called_scope));
-               EX(object) = zend_ptr_stack_pop(&EG(arg_types_stack));
-               EX(fbc) = zend_ptr_stack_pop(&EG(arg_types_stack));
+               zend_ptr_stack_2_pop(&EG(arg_types_stack), (zend_alias*)&EX(object), (zend_alias*)&EX(fbc));
        }
 
        for (i=0; i<EX(op_array)->last_brk_cont; i++) {
index 742c42c828094997e26095d04150873fd4260c6a..9e1d11fb90fa6b7978df417b28046f78d9e080fb 100644 (file)
@@ -298,9 +298,7 @@ static int ZEND_FASTCALL zend_do_fcall_common_helper_SPEC(ZEND_OPCODE_HANDLER_AR
                EG(called_scope) = EX(called_scope);
        }
 
-       EX(called_scope) = zend_ptr_stack_pop(&EG(arg_types_stack));
-       EX(current_object) = zend_ptr_stack_pop(&EG(arg_types_stack));
-       EX(fbc) = zend_ptr_stack_pop(&EG(arg_types_stack));
+       zend_ptr_stack_3_pop(&EG(arg_types_stack), (zend_alias*)&EX(called_scope), (zend_alias*)&EX(current_object), (zend_alias*)&EX(fbc));
        EX(function_state).arguments = zend_vm_stack_push_args(opline->extended_value TSRMLS_CC);
 
        if (EX(function_state).function->type == ZEND_INTERNAL_FUNCTION) {
@@ -646,8 +644,7 @@ static int ZEND_FASTCALL  ZEND_HANDLE_EXCEPTION_SPEC_HANDLER(ZEND_OPCODE_HANDLER
                        zval_ptr_dtor(&EX(object));
                }
                EX(called_scope) = DECODE_CTOR(EX(called_scope));
-               EX(object) = zend_ptr_stack_pop(&EG(arg_types_stack));
-               EX(fbc) = zend_ptr_stack_pop(&EG(arg_types_stack));
+               zend_ptr_stack_2_pop(&EG(arg_types_stack), (zend_alias*)&EX(object), (zend_alias*)&EX(fbc));
        }
 
        for (i=0; i<EX(op_array)->last_brk_cont; i++) {