summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Zend/zend.h1
-rw-r--r--Zend/zend_alloc.c11
-rw-r--r--Zend/zend_compile.h9
-rw-r--r--Zend/zend_execute.c7
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;
}
}