diff options
author | Zeev Suraski <zeev@php.net> | 1999-04-13 20:50:31 +0000 |
---|---|---|
committer | Zeev Suraski <zeev@php.net> | 1999-04-13 20:50:31 +0000 |
commit | 7c2155c1adc9bc0f7ebe7a8fce0f4f86aadba7cc (patch) | |
tree | 85fe12d6cd92080b902e0d9bfeb0ef1048aa87ec | |
parent | e1e2226b926cf52c7d3d99ec7aeb3924983ceedc (diff) | |
download | php-git-7c2155c1adc9bc0f7ebe7a8fce0f4f86aadba7cc.tar.gz |
Move Ai stuff before get_zval_*(), like Andi suggested. Fixes Sascha's huge
memory leak
-rw-r--r-- | Zend/zend_execute.c | 24 |
1 files changed, 16 insertions, 8 deletions
diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index cd1472a1bd..d5de1b9f87 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -1230,11 +1230,24 @@ binary_assign_op_addr: { } break; case ZEND_INIT_FCALL_BY_NAME: { - zval *function_name = get_zval_ptr(&opline->op2, Ts, &free_op2, BP_VAR_R); + zval *function_name; zend_function *function; HashTable *active_function_table; zval tmp; + if ((opline>EG(active_op_array)->opcodes) + && (opline-1)->opcode == ZEND_JMP_NO_CTOR) { + /* constructor call */ + if (opline->op1.op_type==IS_VAR) { + EG(AiCount)++; + } + if (opline->op2.op_type==IS_VAR) { + EG(AiCount)++; + } + } + + function_name = get_zval_ptr(&opline->op2, Ts, &free_op2, BP_VAR_R); + tmp = *function_name; zval_copy_ctor(&tmp); convert_to_string(&tmp); @@ -1255,12 +1268,6 @@ binary_assign_op_addr: { } else { /* used for member function calls */ object_ptr = get_zval_ptr_ptr(&opline->op1, Ts, BP_VAR_R); - if (opline->op1.op_type==IS_VAR - && opline>EG(active_op_array)->opcodes - && (opline-1)->opcode == ZEND_JMP_NO_CTOR) { - /* constructor call */ - EG(AiCount)++; - } if (!object_ptr || (*object_ptr)->value.obj.ce->handle_function_call) { /* overloaded function call */ zend_overloaded_element overloaded_element; @@ -1804,9 +1811,10 @@ send_by_ref: } break; case ZEND_JMP_NO_CTOR: { - zval *object = get_zval_ptr(&opline->op1, Ts, &free_op1, BP_VAR_R); + zval *object; EG(AiCount)++; + object = get_zval_ptr(&opline->op1, Ts, &free_op1, BP_VAR_R); if (!object->value.obj.ce->handle_function_call && !zend_hash_exists(&object->value.obj.ce->function_table, object->value.obj.ce->name, object->value.obj.ce->name_length+1)) { opline = op_array->opcodes + opline->op2.u.opline_num; |