]> granicus.if.org Git - php/commitdiff
Fix $this CV init for include/eval
authorNikita Popov <nikic@php.net>
Sun, 5 Oct 2014 21:38:59 +0000 (23:38 +0200)
committerNikita Popov <nikic@php.net>
Sun, 5 Oct 2014 21:38:59 +0000 (23:38 +0200)
Fixes bug #68148

Zend/tests/bug68148.phpt [new file with mode: 0644]
Zend/zend_execute.c

diff --git a/Zend/tests/bug68148.phpt b/Zend/tests/bug68148.phpt
new file mode 100644 (file)
index 0000000..fcbf69b
--- /dev/null
@@ -0,0 +1,17 @@
+--TEST--
+Bug #68148: $this is null inside include
+--FILE--
+<?php
+
+class Test {
+    public function method() {
+        eval('var_dump($this);');
+    }
+}
+
+(new Test)->method();
+
+?>
+--EXPECT--
+object(Test)#1 (0) {
+}
index 45911a8a9939e8ddfd6099214602aa8b1b02a0dd..e6e017605835882dc5aed22d46d05c95369e2fd0 100644 (file)
@@ -1506,6 +1506,11 @@ static zend_always_inline void i_init_code_execute_data(zend_execute_data *execu
 
        zend_attach_symbol_table(execute_data);
 
+       if (op_array->this_var != -1 && 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 && op_array->last_cache_slot) {
                op_array->run_time_cache = ecalloc(op_array->last_cache_slot, sizeof(void*));
        }
@@ -1573,11 +1578,11 @@ static zend_always_inline void i_init_execute_data(zend_execute_data *execute_da
                                var++;
                        } while (var != end);
                }
+       }
 
-               if (op_array->this_var != -1 && 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 != -1 && 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 && op_array->last_cache_slot) {