com php-src: Fixed memory leak.: Zend/tests/this_in_eval. phpt Zend/zend_execute.c
| From: | Dmitry Stogov | Date: | Wed, 23 Sep 2015 20:16:30 +0000 |
| Subject: | com php-src: Fixed memory leak.: Zend/tests/this_in_eval. phpt Zend/zend_execute.c | ||
| Groups: | php.cvs | ||
| Request: | Send a blank email to php-cvs+get-89149@lists.php.net to get a copy of this message | ||
Commit: 62c96059a203308a93c801f3748a2bdc4777bc91
Author: Dmitry Stogov <dmitry@zend.com> Wed, 23 Sep 2015 23:16:30 +0300
Parents: 75984aef44ef0b999d0c9b6baca5d7e429266078
Branches: PHP-7.0 master
Link: http://git.php.net/?p=php-src.git;a=commitdiff;h=62c96059a203308a93c801f3748a2bdc4777bc91
Log:
Fixed memory leak.
Changed paths:
A Zend/tests/this_in_eval.phpt
M Zend/zend_execute.c
Diff:
diff --git a/Zend/tests/this_in_eval.phpt b/Zend/tests/this_in_eval.phpt
new file mode 100644
index 0000000..ed3926c
--- /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 10b1473..c6c7349 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) {