summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Zend/tests/this_in_eval.phpt18
-rw-r--r--Zend/zend_execute.c25
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) {