mirror of
https://github.com/php/php-src.git
synced 2025-08-16 05:58:45 +02:00
parent
110bf9c720
commit
6cc487df2c
4 changed files with 2218 additions and 2294 deletions
|
@ -303,10 +303,8 @@ typedef enum {
|
|||
!(EG(current_execute_data)->prev_execute_data->opline->result_type & EXT_TYPE_UNUSED))
|
||||
|
||||
#if defined(__GNUC__) && __GNUC__ >= 3 && !defined(__INTEL_COMPILER) && !defined(DARWIN) && !defined(__hpux) && !defined(_AIX) && !defined(__osf__)
|
||||
# define ZEND_NORETURN __attribute__((noreturn))
|
||||
void zend_error_noreturn(int type, const char *format, ...) __attribute__ ((noreturn));
|
||||
#else
|
||||
# define ZEND_NORETURN
|
||||
# define zend_error_noreturn zend_error
|
||||
#endif
|
||||
|
||||
|
@ -746,7 +744,7 @@ END_EXTERN_C()
|
|||
ZEND_ASSERT(Z_ISREF_P(_z)); \
|
||||
ref = Z_REF_P(_z); \
|
||||
ZVAL_COPY_VALUE(_z, &ref->val); \
|
||||
efree_size(ref, sizeof(zend_reference)); \
|
||||
efree(ref); \
|
||||
} while (0)
|
||||
|
||||
#define SEPARATE_STRING(zv) do { \
|
||||
|
|
4457
Zend/zend_alloc.c
4457
Zend/zend_alloc.c
File diff suppressed because it is too large
Load diff
|
@ -52,98 +52,24 @@ typedef struct _zend_leak_info {
|
|||
|
||||
BEGIN_EXTERN_C()
|
||||
|
||||
ZEND_API char* ZEND_FASTCALL zend_strndup(const char *s, unsigned int length) ZEND_ATTRIBUTE_MALLOC;
|
||||
ZEND_API char *zend_strndup(const char *s, unsigned int length) ZEND_ATTRIBUTE_MALLOC;
|
||||
|
||||
ZEND_API void* ZEND_FASTCALL _emalloc(size_t size ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC) ZEND_ATTRIBUTE_MALLOC ZEND_ATTRIBUTE_ALLOC_SIZE(1);
|
||||
ZEND_API void* ZEND_FASTCALL _safe_emalloc(size_t nmemb, size_t size, size_t offset ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC) ZEND_ATTRIBUTE_MALLOC;
|
||||
ZEND_API void* ZEND_FASTCALL _safe_malloc(size_t nmemb, size_t size, size_t offset) ZEND_ATTRIBUTE_MALLOC;
|
||||
ZEND_API void ZEND_FASTCALL _efree(void *ptr ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC);
|
||||
ZEND_API void* ZEND_FASTCALL _ecalloc(size_t nmemb, size_t size ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC) ZEND_ATTRIBUTE_MALLOC ZEND_ATTRIBUTE_ALLOC_SIZE2(1,2);
|
||||
ZEND_API void* ZEND_FASTCALL _erealloc(void *ptr, size_t size, int allow_failure ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC) ZEND_ATTRIBUTE_ALLOC_SIZE(2);
|
||||
ZEND_API void* ZEND_FASTCALL _safe_erealloc(void *ptr, size_t nmemb, size_t size, size_t offset ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC);
|
||||
ZEND_API void* ZEND_FASTCALL _safe_realloc(void *ptr, size_t nmemb, size_t size, size_t offset);
|
||||
ZEND_API char* ZEND_FASTCALL _estrdup(const char *s ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC) ZEND_ATTRIBUTE_MALLOC;
|
||||
ZEND_API char* ZEND_FASTCALL _estrndup(const char *s, unsigned int length ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC) ZEND_ATTRIBUTE_MALLOC;
|
||||
ZEND_API size_t ZEND_FASTCALL _zend_mem_block_size(void *ptr TSRMLS_DC ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC);
|
||||
|
||||
#include "zend_alloc_sizes.h"
|
||||
|
||||
/* _emalloc() & _efree() specialization */
|
||||
#if !ZEND_DEBUG && !defined(_WIN32)
|
||||
|
||||
# define _ZEND_BIN_ALLOCATOR_DEF(_num, _size, _offset, _elements, _pages, x, y) \
|
||||
ZEND_API void* ZEND_FASTCALL _emalloc_ ## _size(void) ZEND_ATTRIBUTE_MALLOC;
|
||||
|
||||
ZEND_MM_BINS_INFO(_ZEND_BIN_ALLOCATOR_DEF, x, y)
|
||||
|
||||
ZEND_API void* ZEND_FASTCALL _emalloc_large(size_t size) ZEND_ATTRIBUTE_MALLOC ZEND_ATTRIBUTE_ALLOC_SIZE(1);
|
||||
ZEND_API void* ZEND_FASTCALL _emalloc_huge(size_t size) ZEND_ATTRIBUTE_MALLOC ZEND_ATTRIBUTE_ALLOC_SIZE(1);
|
||||
|
||||
# define _ZEND_BIN_ALLOCATOR_SELECTOR_START(_num, _size, _offset, _elements, _pages, size, y) \
|
||||
((size <= _size) ? _emalloc_ ## _size() :
|
||||
# define _ZEND_BIN_ALLOCATOR_SELECTOR_END(_num, _size, _offset, _elements, _pages, size, y) \
|
||||
)
|
||||
|
||||
# define ZEND_ALLOCATOR(size) \
|
||||
ZEND_MM_BINS_INFO(_ZEND_BIN_ALLOCATOR_SELECTOR_START, size, y) \
|
||||
((size <= ZEND_MM_MAX_LARGE_SIZE) ? _emalloc_large(size) : _emalloc_huge(size)) \
|
||||
ZEND_MM_BINS_INFO(_ZEND_BIN_ALLOCATOR_SELECTOR_END, size, y)
|
||||
|
||||
# define _emalloc(size) \
|
||||
(__builtin_constant_p(size) ? \
|
||||
ZEND_ALLOCATOR(size) \
|
||||
: \
|
||||
_emalloc(size) \
|
||||
)
|
||||
|
||||
# define _ZEND_BIN_DEALLOCATOR_DEF(_num, _size, _offset, _elements, _pages, x, y) \
|
||||
ZEND_API void ZEND_FASTCALL _efree_ ## _size(void *);
|
||||
|
||||
ZEND_MM_BINS_INFO(_ZEND_BIN_DEALLOCATOR_DEF, x, y)
|
||||
|
||||
ZEND_API void ZEND_FASTCALL _efree_large(void *, size_t size);
|
||||
ZEND_API void ZEND_FASTCALL _efree_huge(void *, size_t size);
|
||||
|
||||
# define _ZEND_BIN_DEALLOCATOR_SELECTOR_START(_num, _size, _offset, _elements, _pages, ptr, size) \
|
||||
if (size <= _size) { _efree_ ## _size(ptr); } else
|
||||
|
||||
# define ZEND_DEALLOCATOR(ptr, size) \
|
||||
ZEND_MM_BINS_INFO(_ZEND_BIN_DEALLOCATOR_SELECTOR_START, ptr, size) \
|
||||
if (size <= ZEND_MM_MAX_LARGE_SIZE) { _efree_large(ptr, size); } \
|
||||
else { _efree_huge(ptr, size); }
|
||||
|
||||
# define efree_size(ptr, size) do { \
|
||||
if (__builtin_constant_p(size)) { \
|
||||
ZEND_DEALLOCATOR(ptr, size) \
|
||||
} else { \
|
||||
_efree(ptr); \
|
||||
} \
|
||||
} while (0)
|
||||
# define efree_size_rel(ptr, size) \
|
||||
efree_size(ptr, size)
|
||||
|
||||
#else
|
||||
|
||||
# define efree_size(ptr, size) \
|
||||
efree(ptr)
|
||||
# define efree_size_rel(ptr, size) \
|
||||
efree_rel(ptr)
|
||||
|
||||
#define _emalloc_large _emalloc
|
||||
#define _emalloc_huge _emalloc
|
||||
#define _efree_large _efree
|
||||
#define _efree_huge _efree
|
||||
|
||||
#endif
|
||||
ZEND_API void *_emalloc(size_t size ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC) ZEND_ATTRIBUTE_MALLOC ZEND_ATTRIBUTE_ALLOC_SIZE(1);
|
||||
ZEND_API void *_safe_emalloc(size_t nmemb, size_t size, size_t offset ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC) ZEND_ATTRIBUTE_MALLOC;
|
||||
ZEND_API void *_safe_malloc(size_t nmemb, size_t size, size_t offset) ZEND_ATTRIBUTE_MALLOC;
|
||||
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_ATTRIBUTE_MALLOC ZEND_ATTRIBUTE_ALLOC_SIZE2(1,2);
|
||||
ZEND_API void *_erealloc(void *ptr, size_t size, int allow_failure ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC) ZEND_ATTRIBUTE_ALLOC_SIZE(2);
|
||||
ZEND_API void *_safe_erealloc(void *ptr, size_t nmemb, size_t size, size_t offset ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC);
|
||||
ZEND_API void *_safe_realloc(void *ptr, size_t nmemb, size_t size, size_t offset);
|
||||
ZEND_API char *_estrdup(const char *s ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC) ZEND_ATTRIBUTE_MALLOC;
|
||||
ZEND_API char *_estrndup(const char *s, unsigned int length ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC) ZEND_ATTRIBUTE_MALLOC;
|
||||
ZEND_API size_t _zend_mem_block_size(void *ptr TSRMLS_DC ZEND_FILE_LINE_DC ZEND_FILE_LINE_ORIG_DC);
|
||||
|
||||
/* Standard wrapper macros */
|
||||
#define emalloc(size) _emalloc((size) ZEND_FILE_LINE_CC ZEND_FILE_LINE_EMPTY_CC)
|
||||
#define emalloc_large(size) _emalloc_large((size) ZEND_FILE_LINE_CC ZEND_FILE_LINE_EMPTY_CC)
|
||||
#define emalloc_huge(size) _emalloc_huge((size) ZEND_FILE_LINE_CC ZEND_FILE_LINE_EMPTY_CC)
|
||||
#define safe_emalloc(nmemb, size, offset) _safe_emalloc((nmemb), (size), (offset) ZEND_FILE_LINE_CC ZEND_FILE_LINE_EMPTY_CC)
|
||||
#define efree(ptr) _efree((ptr) ZEND_FILE_LINE_CC ZEND_FILE_LINE_EMPTY_CC)
|
||||
#define efree_large(ptr) _efree_large((ptr) ZEND_FILE_LINE_CC ZEND_FILE_LINE_EMPTY_CC)
|
||||
#define efree_huge(ptr) _efree_huge((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 safe_erealloc(ptr, nmemb, size, offset) _safe_erealloc((ptr), (nmemb), (size), (offset) ZEND_FILE_LINE_CC ZEND_FILE_LINE_EMPTY_CC)
|
||||
|
@ -196,7 +122,6 @@ inline static void * __zend_realloc(void *p, size_t len)
|
|||
#define pemalloc(size, persistent) ((persistent)?__zend_malloc(size):emalloc(size))
|
||||
#define safe_pemalloc(nmemb, size, offset, persistent) ((persistent)?_safe_malloc(nmemb, size, offset):safe_emalloc(nmemb, size, offset))
|
||||
#define pefree(ptr, persistent) ((persistent)?free(ptr):efree(ptr))
|
||||
#define pefree_size(ptr, size, persistent) ((persistent)?free(ptr):efree_size(ptr, size))
|
||||
#define pecalloc(nmemb, size, persistent) ((persistent)?__zend_calloc((nmemb), (size)):ecalloc((nmemb), (size)))
|
||||
#define perealloc(ptr, size, persistent) ((persistent)?__zend_realloc((ptr), (size)):erealloc((ptr), (size)))
|
||||
#define safe_perealloc(ptr, nmemb, size, offset, persistent) ((persistent)?_safe_realloc((ptr), (nmemb), (size), (offset)):safe_erealloc((ptr), (nmemb), (size), (offset)))
|
||||
|
@ -238,13 +163,13 @@ END_EXTERN_C()
|
|||
(ht) = (HashTable *) emalloc(sizeof(HashTable))
|
||||
|
||||
#define FREE_HASHTABLE(ht) \
|
||||
efree_size(ht, sizeof(HashTable))
|
||||
efree(ht)
|
||||
|
||||
#define ALLOC_HASHTABLE_REL(ht) \
|
||||
(ht) = (HashTable *) emalloc_rel(sizeof(HashTable))
|
||||
|
||||
#define FREE_HASHTABLE_REL(ht) \
|
||||
efree_size_rel(ht, sizeof(HashTable))
|
||||
efree_rel(ht)
|
||||
|
||||
/* Heap functions */
|
||||
typedef struct _zend_mm_heap zend_mm_heap;
|
||||
|
|
|
@ -46,7 +46,7 @@ ZEND_API void _zval_dtor_func(zend_refcounted *p ZEND_FILE_LINE_DC)
|
|||
GC_TYPE(arr) = IS_NULL;
|
||||
zend_hash_destroy(&arr->ht);
|
||||
GC_REMOVE_FROM_BUFFER(arr);
|
||||
efree_size(arr, sizeof(zend_array));
|
||||
efree(arr);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
@ -54,7 +54,7 @@ ZEND_API void _zval_dtor_func(zend_refcounted *p ZEND_FILE_LINE_DC)
|
|||
zend_ast_ref *ast = (zend_ast_ref*)p;
|
||||
|
||||
zend_ast_destroy(ast->ast);
|
||||
efree_size(ast, sizeof(zend_ast_ref));
|
||||
efree(ast);
|
||||
break;
|
||||
}
|
||||
case IS_OBJECT: {
|
||||
|
@ -78,7 +78,7 @@ ZEND_API void _zval_dtor_func(zend_refcounted *p ZEND_FILE_LINE_DC)
|
|||
zend_reference *ref = (zend_reference*)p;
|
||||
if (--GC_REFCOUNT(ref) == 0) {
|
||||
zval_ptr_dtor(&ref->val);
|
||||
efree_size(ref, sizeof(zend_reference));
|
||||
efree(ref);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
@ -106,7 +106,7 @@ ZEND_API void _zval_dtor_func_for_ptr(zend_refcounted *p ZEND_FILE_LINE_DC)
|
|||
GC_TYPE(arr) = IS_NULL;
|
||||
zend_hash_destroy(&arr->ht);
|
||||
GC_REMOVE_FROM_BUFFER(arr);
|
||||
efree_size(arr, sizeof(zend_array));
|
||||
efree(arr);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
@ -114,7 +114,7 @@ ZEND_API void _zval_dtor_func_for_ptr(zend_refcounted *p ZEND_FILE_LINE_DC)
|
|||
zend_ast_ref *ast = (zend_ast_ref*)p;
|
||||
|
||||
zend_ast_destroy(ast->ast);
|
||||
efree_size(ast, sizeof(zend_ast_ref));
|
||||
efree(ast);
|
||||
break;
|
||||
}
|
||||
case IS_OBJECT: {
|
||||
|
@ -136,7 +136,7 @@ ZEND_API void _zval_dtor_func_for_ptr(zend_refcounted *p ZEND_FILE_LINE_DC)
|
|||
zend_reference *ref = (zend_reference*)p;
|
||||
|
||||
zval_ptr_dtor(&ref->val);
|
||||
efree_size(ref, sizeof(zend_reference));
|
||||
efree(ref);
|
||||
break;
|
||||
}
|
||||
default:
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue