diff options
author | Zeev Suraski <zeev@php.net> | 2003-08-18 22:31:11 +0000 |
---|---|---|
committer | Zeev Suraski <zeev@php.net> | 2003-08-18 22:31:11 +0000 |
commit | 49c4866a4798716e40c6502dfb2edca7611edbfd (patch) | |
tree | f541f22b24cdcbdb41097f4efa9253ac767dbaa6 | |
parent | 0dba58c373b3e96cf2fd064cc08de7f298d60e5f (diff) | |
download | php-git-49c4866a4798716e40c6502dfb2edca7611edbfd.tar.gz |
- Improve tracking
- Fix several overloading issues
-rw-r--r-- | Zend/zend.h | 1 | ||||
-rw-r--r-- | Zend/zend_alloc.c | 11 | ||||
-rw-r--r-- | Zend/zend_compile.h | 9 | ||||
-rw-r--r-- | Zend/zend_execute.c | 7 |
4 files changed, 19 insertions, 9 deletions
diff --git a/Zend/zend.h b/Zend/zend.h index c2b291d0bc..d508991bcb 100644 --- a/Zend/zend.h +++ b/Zend/zend.h @@ -510,6 +510,7 @@ ZEND_API int zend_get_configuration_directive(char *name, uint name_length, zval #define ZMSG_MEMORY_LEAK_DETECTED 4L #define ZMSG_MEMORY_LEAK_REPEATED 5L #define ZMSG_LOG_SCRIPT_NAME 6L +#define ZMSG_MEMORY_LEAKS_GRAND_TOTAL 7L #define ZVAL_ADDREF(pz) (++(pz)->refcount) diff --git a/Zend/zend_alloc.c b/Zend/zend_alloc.c index 0669f8942b..509af4a759 100644 --- a/Zend/zend_alloc.c +++ b/Zend/zend_alloc.c @@ -471,10 +471,7 @@ ZEND_API void start_memory_manager(TSRMLS_D) ZEND_API void shutdown_memory_manager(int silent, int clean_cache TSRMLS_DC) { zend_mem_header *p, *t; - -#if ZEND_DEBUG - int had_leaks = 0; -#endif + zend_uint grand_total_leaks=0; #if defined(ZEND_MM) && !ZEND_DEBUG if (clean_cache) { @@ -534,7 +531,7 @@ ZEND_API void shutdown_memory_manager(int silent, int clean_cache TSRMLS_DC) zend_mem_header *iterator; int total_leak=0, total_leak_count=0; - had_leaks = 1; + grand_total_leaks++; if (!silent) { zend_message_dispatcher(ZMSG_MEMORY_LEAK_DETECTED, t); } @@ -565,6 +562,10 @@ ZEND_API void shutdown_memory_manager(int silent, int clean_cache TSRMLS_DC) } } + if (grand_total_leaks > 0) { + zend_message_dispatcher(ZMSG_MEMORY_LEAKS_GRAND_TOTAL, &grand_total_leaks); + } + #if MEMORY_LIMIT AG(memory_exhausted)=0; AG(allocated_memory_peak) = 0; diff --git a/Zend/zend_compile.h b/Zend/zend_compile.h index 8e93dbb90e..9cb30999fa 100644 --- a/Zend/zend_compile.h +++ b/Zend/zend_compile.h @@ -720,10 +720,11 @@ int zendlex(znode *zendlval TSRMLS_DC); #define BP_VAR_UNSET 6 -#define ZEND_INTERNAL_FUNCTION 1 -#define ZEND_USER_FUNCTION 2 -#define ZEND_OVERLOADED_FUNCTION 3 -#define ZEND_EVAL_CODE 4 +#define ZEND_INTERNAL_FUNCTION 1 +#define ZEND_USER_FUNCTION 2 +#define ZEND_OVERLOADED_FUNCTION 3 +#define ZEND_EVAL_CODE 4 +#define ZEND_OVERLOADED_FUNCTION_TEMPORARY 5 #define ZEND_INTERNAL_CLASS 1 #define ZEND_USER_CLASS 2 diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index aa6607d35c..584d979a42 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -2567,9 +2567,16 @@ int zend_do_fcall_common_helper(ZEND_OPCODE_HANDLER_ARGS) zend_error(E_ERROR, "Cannot call overloaded function for non-object"); } + if (EX(function_state).function->type == ZEND_OVERLOADED_FUNCTION_TEMPORARY) { + efree(EX(function_state).function->common.function_name); + } efree(EX(fbc)); + if (!return_value_used) { zval_ptr_dtor(&EX_T(EX(opline)->result.u.var).var.ptr); + } else { + EX_T(EX(opline)->result.u.var).var.ptr->is_ref = 0; + EX_T(EX(opline)->result.u.var).var.ptr->refcount = 1; } } |