com php-src: Fixed memory leak.: Zend/tests/this_in_eval. phpt Zend/zend_execute.c

From: 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) {

« previous php.cvs (#89149) next »