]> granicus.if.org Git - php/commitdiff
Beef up debug macros
authorZeev Suraski <zeev@php.net>
Sat, 28 Aug 1999 10:18:54 +0000 (10:18 +0000)
committerZeev Suraski <zeev@php.net>
Sat, 28 Aug 1999 10:18:54 +0000 (10:18 +0000)
Zend/zend.h
Zend/zend_alloc.c
Zend/zend_alloc.h
Zend/zend_variables.c

index 1b183193c8a655781fd8fa81155ffc063dc7211e..a8f21042877fa5b595fcecac8b12b100863162b0 100644 (file)
 #endif
 
 #ifdef ZEND_DEBUG
-#define ZEND_FILE_LINE_D                       char *__zend_filename, uint __zend_lineno
-#define ZEND_FILE_LINE_DC                      , char *__zend_filename, uint __zend_lineno
-#define ZEND_FILE_LINE_RELAY_C         __zend_filename, __zend_lineno
-#define ZEND_FILE_LINE_RELAY_CC                , __zend_filename, __zend_lineno
-#define ZEND_FILE_LINE_C                       __FILE__, __LINE__
-#define ZEND_FILE_LINE_CC                      , __FILE__, __LINE__
+#define ZEND_FILE_LINE_D                               char *__zend_filename, uint __zend_lineno
+#define ZEND_FILE_LINE_DC                              , ZEND_FILE_LINE_D
+#define ZEND_FILE_LINE_ORIG_D                  char *__zend_orig_filename, uint __zend_orig_lineno
+#define ZEND_FILE_LINE_ORIG_DC                 , ZEND_FILE_LINE_ORIG_D
+#define ZEND_FILE_LINE_RELAY_C                 __zend_filename, __zend_lineno
+#define ZEND_FILE_LINE_RELAY_CC                        , ZEND_FILE_LINE_RELAY_C
+#define ZEND_FILE_LINE_C                               __FILE__, __LINE__
+#define ZEND_FILE_LINE_CC                              , ZEND_FILE_LINE_C
+#define ZEND_FILE_LINE_EMPTY_C                 NULL, 0
+#define ZEND_FILE_LINE_EMPTY_CC                        , ZEND_FILE_LINE_EMPTY_C
+#define ZEND_FILE_LINE_ORIG_RELAY_C            __zend_orig_filename, __zend_orig_lineno
+#define ZEND_FILE_LINE_ORIG_RELAY_CC   , ZEND_FILE_LINE_ORIG_RELAY_C
 #else
 #define ZEND_FILE_LINE_D
 #define ZEND_FILE_LINE_DC
+#define ZEND_FILE_LINE_ORIG_D
+#define ZEND_FILE_LINE_ORIG_DC
 #define ZEND_FILE_LINE_RELAY_C
 #define ZEND_FILE_LINE_RELAY_CC
 #define ZEND_FILE_LINE_C
 #define ZEND_FILE_LINE_CC
+#define ZEND_FILE_LINE_EMPTY_C
+#define ZEND_FILE_LINE_EMPTY_CC
+#define ZEND_FILE_LINE_ORIG_RELAY_C
+#define ZEND_FILE_LINE_ORIG_RELAY_CC
 #endif /* ZEND_DEBUG */
 
 
index 7992c4c93ea786349e28c777e74537e0d974f079..1f78882cc3cc19b38fa4e626f0a0a64e89b3c2fe 100644 (file)
@@ -97,7 +97,7 @@ static zend_alloc_globals alloc_globals;
 
 
 
-ZEND_API void *_emalloc(size_t size ZEND_FILE_LINE_DC)
+ZEND_API void *_emalloc(size_t size ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC)
 {
        mem_header *p;
        ALS_FETCH();
@@ -109,6 +109,8 @@ ZEND_API void *_emalloc(size_t size ZEND_FILE_LINE_DC)
 #if ZEND_DEBUG
                p->filename = __zend_filename;
                p->lineno = __zend_lineno;
+               p->orig_filename = __zend_orig_filename;
+               p->orig_lineno = __zend_orig_lineno;
                p->magic = MEM_BLOCK_START_MAGIC;
                p->reported = 0;
 #endif
@@ -136,6 +138,8 @@ ZEND_API void *_emalloc(size_t size ZEND_FILE_LINE_DC)
 #if ZEND_DEBUG
        p->filename = __zend_filename;
        p->lineno = __zend_lineno;
+       p->orig_filename = __zend_orig_filename;
+       p->orig_lineno = __zend_orig_lineno;
        p->magic = MEM_BLOCK_START_MAGIC;
        p->reported = 0;
        *((long *)(((char *) p) + sizeof(mem_header)+size+PLATFORM_PADDING+END_ALIGNMENT(size))) = MEM_BLOCK_END_MAGIC;
@@ -148,13 +152,13 @@ ZEND_API void *_emalloc(size_t size ZEND_FILE_LINE_DC)
 }
 
 
-ZEND_API void _efree(void *ptr ZEND_FILE_LINE_DC)
+ZEND_API void _efree(void *ptr ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC)
 {
        mem_header *p = (mem_header *) ((char *)ptr - sizeof(mem_header) - PLATFORM_PADDING);
        ALS_FETCH();
 
 #if ZEND_DEBUG
-       if (!_mem_block_check(ptr, 1 ZEND_FILE_LINE_RELAY_CC)) {
+       if (!_mem_block_check(ptr, 1 ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_ORIG_RELAY_CC)) {
                return;
        }
        memset(ptr, 0x5a, p->size);
@@ -180,17 +184,13 @@ ZEND_API void _efree(void *ptr ZEND_FILE_LINE_DC)
 }
 
 
-ZEND_API void *_ecalloc(size_t nmemb, size_t size ZEND_FILE_LINE_DC)
+ZEND_API void *_ecalloc(size_t nmemb, size_t size ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC)
 {
        void *p;
        int final_size=size*nmemb;
 
        HANDLE_BLOCK_INTERRUPTIONS();
-#if ZEND_DEBUG
-       p = _emalloc(final_size ZEND_FILE_LINE_RELAY_CC);
-#else
-       p = emalloc(final_size);
-#endif
+       p = _emalloc(final_size ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_ORIG_RELAY_CC);
        if (!p) {
                HANDLE_UNBLOCK_INTERRUPTIONS();
                return (void *) p;
@@ -201,18 +201,14 @@ ZEND_API void *_ecalloc(size_t nmemb, size_t size ZEND_FILE_LINE_DC)
 }
 
 
-ZEND_API void *_erealloc(void *ptr, size_t size, int allow_failure ZEND_FILE_LINE_DC)
+ZEND_API void *_erealloc(void *ptr, size_t size, int allow_failure ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC)
 {
        mem_header *p = (mem_header *) ((char *)ptr-sizeof(mem_header)-PLATFORM_PADDING);
        mem_header *orig = p;
        ALS_FETCH();
 
        if (!ptr) {
-#if ZEND_DEBUG
-               return _emalloc(size ZEND_FILE_LINE_RELAY_CC);
-#else
-               return emalloc(size);
-#endif
+               return _emalloc(size ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_ORIG_RELAY_CC);
        }
        HANDLE_BLOCK_INTERRUPTIONS();
        REMOVE_POINTER_FROM_LIST(p);
@@ -247,18 +243,14 @@ ZEND_API void *_erealloc(void *ptr, size_t size, int allow_failure ZEND_FILE_LIN
 }
 
 
-ZEND_API char *_estrdup(const char *s ZEND_FILE_LINE_DC)
+ZEND_API char *_estrdup(const char *s ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC)
 {
        int length;
        char *p;
 
        length = strlen(s)+1;
        HANDLE_BLOCK_INTERRUPTIONS();
-#if ZEND_DEBUG
-       p = (char *) _emalloc(length ZEND_FILE_LINE_RELAY_CC);
-#else
-       p = (char *) emalloc(length);
-#endif
+       p = (char *) _emalloc(length ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_ORIG_RELAY_CC);
        if (!p) {
                HANDLE_UNBLOCK_INTERRUPTIONS();
                return (char *)NULL;
@@ -269,16 +261,12 @@ ZEND_API char *_estrdup(const char *s ZEND_FILE_LINE_DC)
 }
 
 
-ZEND_API char *_estrndup(const char *s, uint length ZEND_FILE_LINE_DC)
+ZEND_API char *_estrndup(const char *s, uint length ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC)
 {
        char *p;
 
        HANDLE_BLOCK_INTERRUPTIONS();
-#if ZEND_DEBUG
-       p = (char *) _emalloc(length+1 ZEND_FILE_LINE_RELAY_CC);
-#else
-       p = (char *) emalloc(length+1);
-#endif
+       p = (char *) _emalloc(length+1 ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_ORIG_RELAY_CC);
        if (!p) {
                HANDLE_UNBLOCK_INTERRUPTIONS();
                return (char *)NULL;
@@ -400,7 +388,7 @@ void zend_debug_alloc_output(char *format, ...)
 }
 
 
-ZEND_API int _mem_block_check(void *ptr, int silent ZEND_FILE_LINE_DC)
+ZEND_API int _mem_block_check(void *ptr, int silent ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC)
 {
        mem_header *p = (mem_header *) ((char *)ptr - sizeof(mem_header) - PLATFORM_PADDING);
        int no_cache_notice=0;
@@ -419,6 +407,9 @@ ZEND_API int _mem_block_check(void *ptr, int silent ZEND_FILE_LINE_DC)
                zend_message_dispatcher(ZMSG_LOG_SCRIPT_NAME, NULL);
                zend_debug_alloc_output("---------------------------------------\n");
                zend_debug_alloc_output("%s(%d) : Block 0x%0.8lX status:\n" ZEND_FILE_LINE_RELAY_CC, (long) p);
+               if (__zend_orig_filename) {
+                       zend_debug_alloc_output("%s(%d) : Actual location (location was relayed)\n" ZEND_FILE_LINE_ORIG_RELAY_CC);
+               }
                zend_debug_alloc_output("%10s\t","Beginning:  ");
        }
 
@@ -433,7 +424,7 @@ ZEND_API int _mem_block_check(void *ptr, int silent ZEND_FILE_LINE_DC)
                                zend_debug_alloc_output("Freed\n");
                                had_problems=1;
                        } else {
-                               return _mem_block_check(ptr, 0 ZEND_FILE_LINE_RELAY_CC);
+                               return _mem_block_check(ptr, 0 ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_ORIG_RELAY_CC);
                        }
                        break;
                case MEM_BLOCK_CACHED_MAGIC:
@@ -444,7 +435,7 @@ ZEND_API int _mem_block_check(void *ptr, int silent ZEND_FILE_LINE_DC)
                                }
                        } else {
                                if (!no_cache_notice) {
-                                       return _mem_block_check(ptr, 0 ZEND_FILE_LINE_RELAY_CC);
+                                       return _mem_block_check(ptr, 0 ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_ORIG_RELAY_CC);
                                }
                        }
                        break;
@@ -452,7 +443,7 @@ ZEND_API int _mem_block_check(void *ptr, int silent ZEND_FILE_LINE_DC)
                        if (!silent) {
                                zend_debug_alloc_output("Overrun (magic=0x%0.8lX, expected=0x%0.8lX)\n", p->magic, MEM_BLOCK_START_MAGIC);
                        } else {
-                               return _mem_block_check(ptr, 0 ZEND_FILE_LINE_RELAY_CC);
+                               return _mem_block_check(ptr, 0 ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_ORIG_RELAY_CC);
                        }
                        had_problems=1;
                        valid_beginning=0;
@@ -468,7 +459,7 @@ ZEND_API int _mem_block_check(void *ptr, int silent ZEND_FILE_LINE_DC)
                int i;
 
                if (silent) {
-                       return _mem_block_check(ptr, 0 ZEND_FILE_LINE_RELAY_CC);
+                       return _mem_block_check(ptr, 0 ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_ORIG_RELAY_CC);
                }
                had_problems=1;
                overflow_ptr = ((char *) p)+sizeof(mem_header)+p->size+PLATFORM_PADDING;
@@ -510,7 +501,7 @@ ZEND_API int _mem_block_check(void *ptr, int silent ZEND_FILE_LINE_DC)
 }
 
 
-ZEND_API void _full_mem_check(int silent ZEND_FILE_LINE_DC)
+ZEND_API void _full_mem_check(int silent ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC)
 {
        mem_header *p;
        int errors=0;
@@ -523,7 +514,7 @@ ZEND_API void _full_mem_check(int silent ZEND_FILE_LINE_DC)
        zend_debug_alloc_output("Full Memory Check at %s:%d\n" ZEND_FILE_LINE_RELAY_CC);
 
        while (p) {
-               if (!_mem_block_check((void *)((char *)p + sizeof(mem_header) + PLATFORM_PADDING), (silent?2:3) ZEND_FILE_LINE_RELAY_CC)) {
+               if (!_mem_block_check((void *)((char *)p + sizeof(mem_header) + PLATFORM_PADDING), (silent?2:3) ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_ORIG_RELAY_CC)) {
                        errors++;
                }
                p = p->pNext;
@@ -534,13 +525,13 @@ ZEND_API void _full_mem_check(int silent ZEND_FILE_LINE_DC)
 #endif
 
 
-ZEND_API void _persist_alloc(void *ptr ZEND_FILE_LINE_DC)
+ZEND_API void _persist_alloc(void *ptr ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC)
 {
        mem_header *p = (mem_header *) ((char *)ptr-sizeof(mem_header)-PLATFORM_PADDING);
        ALS_FETCH();
 
 #if ZEND_DEBUG
-       _mem_block_check(ptr, 1 ZEND_FILE_LINE_RELAY_CC);
+       _mem_block_check(ptr, 1 ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_ORIG_RELAY_CC);
 #endif
 
        HANDLE_BLOCK_INTERRUPTIONS();
index f64d86c1b76c2d4b4593a505ce373462bfc6705c..d6e2b3b80932ca7335491c3ed9adaa64065d0362 100644 (file)
@@ -34,6 +34,8 @@ typedef struct _mem_header {
        char *filename;
        uint lineno;
        int reported;
+       char *orig_filename;
+       uint orig_lineno;
 #endif
     struct _mem_header *pNext;
     struct _mem_header *pLast;
@@ -58,33 +60,33 @@ ZEND_API char *zend_strndup(const char *s, unsigned int length);
 
 BEGIN_EXTERN_C()
 
-ZEND_API void *_emalloc(size_t size ZEND_FILE_LINE_DC);
-ZEND_API void _efree(void *ptr ZEND_FILE_LINE_DC);
-ZEND_API void *_ecalloc(size_t nmemb, size_t size ZEND_FILE_LINE_DC);
-ZEND_API void *_erealloc(void *ptr, size_t size, int allow_failure ZEND_FILE_LINE_DC);
-ZEND_API char *_estrdup(const char *s ZEND_FILE_LINE_DC);
-ZEND_API char *_estrndup(const char *s, unsigned int length ZEND_FILE_LINE_DC);
-ZEND_API void _persist_alloc(void *ptr ZEND_FILE_LINE_DC);
+ZEND_API void *_emalloc(size_t size ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC);
+ZEND_API void _efree(void *ptr ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC);
+ZEND_API void *_ecalloc(size_t nmemb, size_t size ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC);
+ZEND_API void *_erealloc(void *ptr, size_t size, int allow_failure ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC);
+ZEND_API char *_estrdup(const char *s ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC);
+ZEND_API char *_estrndup(const char *s, unsigned int length ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC);
+ZEND_API void _persist_alloc(void *ptr ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC);
 
 /* Standard wrapper macros */
-#define emalloc(size)                                  _emalloc((size) ZEND_FILE_LINE_CC)
-#define efree(ptr)                                             _efree((ptr) ZEND_FILE_LINE_CC)
-#define ecalloc(nmemb,size)                            _ecalloc((nmemb),(size) ZEND_FILE_LINE_CC)
-#define erealloc(ptr,size)                             _erealloc((ptr),(size),0 ZEND_FILE_LINE_CC)
-#define erealloc_recoverable(ptr,size) _erealloc((ptr),(size),1 ZEND_FILE_LINE_CC)
-#define estrdup(s)                                             _estrdup((s) ZEND_FILE_LINE_CC)
-#define estrndup(s,length)                             _estrndup((s),(length) ZEND_FILE_LINE_CC)
-#define persist_alloc(p)                               _persist_alloc((p) ZEND_FILE_LINE_CC)
+#define emalloc(size)                                  _emalloc((size) ZEND_FILE_LINE_CC ZEND_FILE_LINE_EMPTY_CC)
+#define efree(ptr)                                             _efree((ptr) ZEND_FILE_LINE_CC ZEND_FILE_LINE_EMPTY_CC)
+#define ecalloc(nmemb,size)                            _ecalloc((nmemb), (size) ZEND_FILE_LINE_CC ZEND_FILE_LINE_EMPTY_CC)
+#define erealloc(ptr,size)                             _erealloc((ptr), (size),0 ZEND_FILE_LINE_CC ZEND_FILE_LINE_EMPTY_CC)
+#define erealloc_recoverable(ptr,size) _erealloc((ptr), (size),1 ZEND_FILE_LINE_CC ZEND_FILE_LINE_EMPTY_CC)
+#define estrdup(s)                                             _estrdup((s) ZEND_FILE_LINE_CC ZEND_FILE_LINE_EMPTY_CC)
+#define estrndup(s,length)                             _estrndup((s), (length) ZEND_FILE_LINE_CC ZEND_FILE_LINE_EMPTY_CC)
+#define persist_alloc(p)                               _persist_alloc((p) ZEND_FILE_LINE_CC ZEND_FILE_LINE_EMPTY_CC)
 
 /* Relay wrapper macros */
-#define emalloc_rel(size)                                      _emalloc((size) ZEND_FILE_LINE_RELAY_CC)
-#define efree_rel(ptr)                                         _efree((ptr) ZEND_FILE_LINE_RELAY_CC)
-#define ecalloc_rel(nmemb, size)                       _ecalloc((nmemb), (size) ZEND_FILE_LINE_RELAY_CC)
-#define erealloc_rel(ptr, size)                                _erealloc((ptr), (size), 0 ZEND_FILE_LINE_RELAY_CC)
-#define erealloc_recoverable_rel(ptr, size)    _erealloc((ptr), (size), 1 ZEND_FILE_LINE_RELAY_CC)
-#define estrdup_rel(s)                                         _estrdup((s) ZEND_FILE_LINE_RELAY_CC)
-#define estrndup_rel(s, length)                                _estrndup((s) ZEND_FILE_LINE_RELAY_CC)
-#define persist_alloc_rel(p)                           _persist_alloc((p) ZEND_FILE_LINE_RELAY_CC)
+#define emalloc_rel(size)                                      _emalloc((size) ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_CC)
+#define efree_rel(ptr)                                         _efree((ptr) ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_CC)
+#define ecalloc_rel(nmemb, size)                       _ecalloc((nmemb), (size) ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_CC)
+#define erealloc_rel(ptr, size)                                _erealloc((ptr), (size), 0 ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_CC)
+#define erealloc_recoverable_rel(ptr, size)    _erealloc((ptr), (size), 1 ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_CC)
+#define estrdup_rel(s)                                         _estrdup((s) ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_CC)
+#define estrndup_rel(s, length)                                _estrndup((s), (length) ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_CC)
+#define persist_alloc_rel(p)                           _persist_alloc((p) ZEND_FILE_LINE_RELAY_CC ZEND_FILE_LINE_CC)
 
 /* Selective persistent/non persistent allocation macros */
 #define pemalloc(size,persistent) ((persistent)?malloc(size):emalloc(size))
@@ -103,11 +105,10 @@ ZEND_API void start_memory_manager(void);
 ZEND_API void shutdown_memory_manager(int silent, int clean_cache);
 
 #if ZEND_DEBUG
-ZEND_API int _mem_block_check(void *ptr, int silent ZEND_FILE_LINE_DC);
-ZEND_API void _full_mem_check(int silent ZEND_FILE_LINE_DC);
-#define mem_block_check(ptr, silent) _mem_block_check(ptr, silent ZEND_FILE_LINE_CC)
-#define mem_block_check(ptr, silent) _mem_block_check(ptr, silent ZEND_FILE_LINE_CC)
-#define full_mem_check(silent) _full_mem_check(silent ZEND_FILE_LINE_CC)
+ZEND_API int _mem_block_check(void *ptr, int silent ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC);
+ZEND_API void _full_mem_check(int silent ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC);
+#define mem_block_check(ptr, silent) _mem_block_check(ptr, silent ZEND_FILE_LINE_CC ZEND_FILE_LINE_EMPTY_CC)
+#define full_mem_check(silent) _full_mem_check(silent ZEND_FILE_LINE_CC ZEND_FILE_LINE_EMPTY_CC)
 #else
 #define mem_block_check(type, ptr, silent)
 #define full_mem_check(silent)
index 81372839b89179d0e4b7bbc21d031c1357c73174..1a54465cc3a621a275c2f823e467583a42ca6e31 100644 (file)
@@ -117,7 +117,7 @@ ZEND_API int _zval_copy_ctor(zval *zvalue ZEND_FILE_LINE_DC)
                                        return SUCCESS;
                                }
                        }
-                       zvalue->value.str.val = (char *) estrndup(zvalue->value.str.val, zvalue->value.str.len);
+                       zvalue->value.str.val = (char *) estrndup_rel(zvalue->value.str.val, zvalue->value.str.len);
                        break;
                case IS_ARRAY: {
                                zval *tmp;
@@ -128,7 +128,7 @@ ZEND_API int _zval_copy_ctor(zval *zvalue ZEND_FILE_LINE_DC)
                                        var_reset(zvalue);
                                        return FAILURE;
                                }
-                               zvalue->value.ht = (HashTable *) emalloc(sizeof(HashTable));
+                               zvalue->value.ht = (HashTable *) emalloc_rel(sizeof(HashTable));
                                zend_hash_init(zvalue->value.ht, 0, NULL, PVAL_PTR_DTOR, 0);
                                zend_hash_copy(zvalue->value.ht, original_ht, (void (*)(void *)) zval_add_ref, (void *) &tmp, sizeof(zval *));
                        }
@@ -137,7 +137,7 @@ ZEND_API int _zval_copy_ctor(zval *zvalue ZEND_FILE_LINE_DC)
                                zval *tmp;
                                HashTable *original_ht = zvalue->value.obj.properties;
 
-                               zvalue->value.obj.properties = (HashTable *) emalloc(sizeof(HashTable));
+                               zvalue->value.obj.properties = (HashTable *) emalloc_rel(sizeof(HashTable));
                                zend_hash_init(zvalue->value.obj.properties, 0, NULL, PVAL_PTR_DTOR, 0);
                                zend_hash_copy(zvalue->value.obj.properties, original_ht, (void (*)(void *)) zval_add_ref, (void *) &tmp, sizeof(zval *));
                        }