diff options
-rw-r--r-- | Zend/tests/this_in_eval.phpt | 18 | ||||
-rw-r--r-- | Zend/zend_execute.c | 25 |
2 files changed, 35 insertions, 8 deletions
diff --git a/Zend/tests/this_in_eval.phpt b/Zend/tests/this_in_eval.phpt new file mode 100644 index 0000000000..ed3926cd66 --- /dev/null +++ b/Zend/tests/this_in_eval.phpt @@ -0,0 +1,18 @@ +--TEST-- +$this in eval() block +--FILE-- +<?php +class C { + function foo() { + eval('var_dump($this);'); + eval('var_dump($this);'); + } +} +$x = new C; +$x->foo(); +--EXPECT-- +object(C)#1 (0) { +} +object(C)#1 (0) { +} + diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index 10b147394a..c6c73490e5 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -2180,13 +2180,15 @@ static zend_always_inline void i_init_code_execute_data(zend_execute_data *execu EX(call) = NULL; EX(return_value) = return_value; - zend_attach_symbol_table(execute_data); - - if (op_array->this_var != (uint32_t)-1 && EXPECTED(Z_OBJ(EX(This)))) { - ZVAL_OBJ(EX_VAR(op_array->this_var), Z_OBJ(EX(This))); + if (UNEXPECTED(op_array->this_var != (uint32_t)-1) && EXPECTED(Z_OBJ(EX(This)))) { GC_REFCOUNT(Z_OBJ(EX(This)))++; + if (!zend_hash_str_add(EX(symbol_table), "this", sizeof("this")-1, &EX(This))) { + GC_REFCOUNT(Z_OBJ(EX(This)))--; + } } + zend_attach_symbol_table(execute_data); + if (!op_array->run_time_cache) { op_array->run_time_cache = emalloc(op_array->cache_size); memset(op_array->run_time_cache, 0, op_array->cache_size); @@ -2208,6 +2210,13 @@ static zend_always_inline void i_init_execute_data(zend_execute_data *execute_da EX(return_value) = return_value; if (UNEXPECTED(EX(symbol_table) != NULL)) { + if (UNEXPECTED(op_array->this_var != (uint32_t)-1) && EXPECTED(Z_OBJ(EX(This)))) { + GC_REFCOUNT(Z_OBJ(EX(This)))++; + if (!zend_hash_str_add(EX(symbol_table), "this", sizeof("this")-1, &EX(This))) { + GC_REFCOUNT(Z_OBJ(EX(This)))--; + } + } + zend_attach_symbol_table(execute_data); } else { uint32_t first_extra_arg, num_args; @@ -2258,11 +2267,11 @@ static zend_always_inline void i_init_execute_data(zend_execute_data *execute_da var++; } while (var != end); } - } - if (op_array->this_var != (uint32_t)-1 && EXPECTED(Z_OBJ(EX(This)))) { - ZVAL_OBJ(EX_VAR(op_array->this_var), Z_OBJ(EX(This))); - GC_REFCOUNT(Z_OBJ(EX(This)))++; + if (op_array->this_var != (uint32_t)-1 && EXPECTED(Z_OBJ(EX(This)))) { + ZVAL_OBJ(EX_VAR(op_array->this_var), Z_OBJ(EX(This))); + GC_REFCOUNT(Z_OBJ(EX(This)))++; + } } if (!op_array->run_time_cache) { |