summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndi Gutmans <andi@php.net>1999-11-19 16:55:25 +0000
committerAndi Gutmans <andi@php.net>1999-11-19 16:55:25 +0000
commit817a11e7edf459116a180a3051349a845666969e (patch)
tree394882fad9d53d441cfaf1b87cae0f794a0a01f3
parent0094b765ebb58ce9d91dbfabf5f55f21d0932113 (diff)
downloadphp-git-817a11e7edf459116a180a3051349a845666969e.tar.gz
- Functions whose return values aren't used have them freed in DO_FCALL
and don't need a special ZEND_FREE opcode following them anymore
-rw-r--r--Zend/zend.h2
-rw-r--r--Zend/zend_execute.c9
2 files changed, 6 insertions, 5 deletions
diff --git a/Zend/zend.h b/Zend/zend.h
index 52e74c8648..429f9fae79 100644
--- a/Zend/zend.h
+++ b/Zend/zend.h
@@ -96,7 +96,7 @@ typedef unsigned char zend_bool;
#include "zend_hash.h"
#include "zend_llist.h"
-#define INTERNAL_FUNCTION_PARAMETERS int ht, zval *return_value, HashTable *list, HashTable *plist, zval *this_ptr, char return_value_used
+#define INTERNAL_FUNCTION_PARAMETERS int ht, zval *return_value, HashTable *list, HashTable *plist, zval *this_ptr, int return_value_used
#define INTERNAL_FUNCTION_PARAM_PASSTHRU ht, return_value, list, plist, this_ptr, return_value_used
/*
diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c
index b4baddcb7c..2256b1bf37 100644
--- a/Zend/zend_execute.c
+++ b/Zend/zend_execute.c
@@ -1464,17 +1464,15 @@ overloaded_function_call_cont:
do_fcall_common:
{
zval *original_return_value;
+ int return_value_not_used = (opline->result.u.EA.type & EXT_TYPE_UNUSED);
zend_ptr_stack_push(&EG(argument_stack), (void *) opline->extended_value);
if (function_state.function->type==ZEND_INTERNAL_FUNCTION) {
var_uninit(&Ts[opline->result.u.var].tmp_var);
- ((zend_internal_function *) function_state.function)->handler(opline->extended_value, &Ts[opline->result.u.var].tmp_var, &EG(regular_list), &EG(persistent_list), object.ptr, (opline->result.u.EA.type ^ EXT_TYPE_UNUSED));
+ ((zend_internal_function *) function_state.function)->handler(opline->extended_value, &Ts[opline->result.u.var].tmp_var, &EG(regular_list), &EG(persistent_list), object.ptr, !return_value_not_used);
if (object.ptr) {
object.ptr->refcount--;
}
- if (opline->result.u.EA.type & EXT_TYPE_UNUSED) {
- zendi_zval_dtor(Ts[opline->result.u.var].tmp_var);
- }
} else if (function_state.function->type==ZEND_USER_FUNCTION) {
HashTable *calling_symbol_table;
@@ -1520,6 +1518,9 @@ do_fcall_common:
call_overloaded_function(opline->extended_value, &Ts[opline->result.u.var].tmp_var, &EG(regular_list), &EG(persistent_list) ELS_CC);
efree(fbc);
}
+ if (return_value_not_used) {
+ zendi_zval_dtor(Ts[opline->result.u.var].tmp_var);
+ }
object.ptr = zend_ptr_stack_pop(&EG(arg_types_stack));
if (opline->opcode == ZEND_DO_FCALL_BY_NAME) {
fbc = zend_ptr_stack_pop(&EG(arg_types_stack));