]> granicus.if.org Git - php/commitdiff
- Improve tracking
authorZeev Suraski <zeev@php.net>
Mon, 18 Aug 2003 22:31:11 +0000 (22:31 +0000)
committerZeev Suraski <zeev@php.net>
Mon, 18 Aug 2003 22:31:11 +0000 (22:31 +0000)
- Fix several overloading issues

Zend/zend.h
Zend/zend_alloc.c
Zend/zend_compile.h
Zend/zend_execute.c

index c2b291d0bcd9237c6f39d2f58bacabc81234e11c..d508991bcbef8529e0c38b5ad6e0743b3d28ebc7 100644 (file)
@@ -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)
index 0669f8942bcad6eeba78a73650f62835feba2f95..509af4a7598d83dbbfe303677971a0295b6af6fe 100644 (file)
@@ -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;
index 8e93dbb90e74614ddc1aa2eb3c54e51f3f9acf00..9cb30999fade3b8bea35d322ef718cf1b5c5682b 100644 (file)
@@ -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
index aa6607d35c21514c5e331aa300962fd0254e8b40..584d979a42627abcb96f8243a0f86a5b96858942 100644 (file)
@@ -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;
                }
        }