Refactored GC (incomplete)

This commit is contained in:
Dmitry Stogov 2014-03-19 17:00:28 +04:00
parent 2e3e96b24b
commit b7938ab1bd
27 changed files with 571 additions and 783 deletions

View file

@ -681,6 +681,16 @@ END_EXTERN_C()
zval_copy_ctor(__z1); \
} while (0)
#define ZVAL_UNREF(z) do { \
zval *_z = (z); \
zend_reference *ref; \
ZEND_ASSERT(Z_ISREF_P(_z)); \
ref = Z_REF_P(_z); \
ZVAL_COPY_VALUE(_z, &ref->val); \
GC_REMOVE_FROM_BUFFER(ref); \
efree(ref); \
} while (0)
// TODO: invalud ???
#define INIT_PZVAL_COPY(z, v) \
do { \
@ -720,9 +730,7 @@ END_EXTERN_C()
zval *__zv = (zv); \
if (Z_ISREF_P(__zv)) { \
if (Z_REFCOUNT_P(__zv) == 1) { \
zend_reference *ref = Z_REF_P(__zv); \
ZVAL_COPY_VALUE(__zv, &ref->val); \
efree(ref); \
ZVAL_UNREF(__zv); \
} else { \
zval *ref = Z_REFVAL_P(__zv); \
Z_DELREF_P(__zv); \

View file

@ -242,6 +242,7 @@ static void zend_closure_free_storage(zend_object *object TSRMLS_DC) /* {{{ */
zval_ptr_dtor(&closure->this_ptr);
}
GC_REMOVE_FROM_BUFFER(closure);
efree(closure);
}
/* }}} */

View file

@ -96,9 +96,7 @@ static zend_always_inline void zend_pzval_unlock_free_func(zval *z TSRMLS_DC)
if (Z_REFCOUNTED_P(z)) {
if (!Z_DELREF_P(z)) {
ZEND_ASSERT(z != &EG(uninitialized_zval));
GC_REMOVE_ZVAL_FROM_BUFFER(z);
zval_dtor(z);
efree(z);
}
}
}
@ -911,11 +909,10 @@ static inline zval* zend_assign_tmp_to_variable(zval *variable_ptr, zval *value
GC_ZVAL_CHECK_POSSIBLE_ROOT(variable_ptr);
ZVAL_COPY_VALUE(variable_ptr, value);
} else {
zval garbage;
zend_refcounted *garbage = Z_COUNTED_P(variable_ptr);
ZVAL_COPY_VALUE(&garbage, variable_ptr);
ZVAL_COPY_VALUE(variable_ptr, value);
_zval_dtor_func(&garbage ZEND_FILE_LINE_CC);
_zval_dtor_func(garbage ZEND_FILE_LINE_CC);
}
return variable_ptr;
}
@ -946,21 +943,20 @@ static inline zval* zend_assign_const_to_variable(zval *variable_ptr, zval *valu
zval_copy_ctor(variable_ptr);
}
} else {
zval garbage;
zend_refcounted *garbage = Z_COUNTED_P(variable_ptr);
ZVAL_COPY_VALUE(&garbage, variable_ptr);
ZVAL_COPY_VALUE(variable_ptr, value);
if (Z_REFCOUNTED_P(value)) {
zval_copy_ctor(variable_ptr);
}
_zval_dtor_func(&garbage ZEND_FILE_LINE_CC);
_zval_dtor_func(garbage ZEND_FILE_LINE_CC);
}
return variable_ptr;
}
static inline zval* zend_assign_to_variable(zval *variable_ptr, zval *value TSRMLS_DC)
{
zval garbage;
zend_refcounted *garbage;
int is_ref = 0;
if (EXPECTED(!Z_REFCOUNTED_P(variable_ptr))) {
@ -982,7 +978,7 @@ static inline zval* zend_assign_to_variable(zval *variable_ptr, zval *value TSRM
Z_OBJ_HANDLER_P(variable_ptr, set)(variable_ptr, value TSRMLS_CC);
} else if (EXPECTED(variable_ptr != value)) {
if (Z_REFCOUNT_P(variable_ptr)==1) {
ZVAL_COPY_VALUE(&garbage, variable_ptr);
garbage = Z_COUNTED_P(variable_ptr);
if (EXPECTED(!Z_ISREF_P(value))) {
if (!is_ref) {
ZVAL_COPY(variable_ptr, value);
@ -992,15 +988,13 @@ static inline zval* zend_assign_to_variable(zval *variable_ptr, zval *value TSRM
} else {
if (Z_REFCOUNT_P(value) == 1) {
//??? auto dereferencing
zend_reference *ref = Z_REF_P(value);
ZVAL_COPY_VALUE(value, Z_REFVAL_P(value));
ZVAL_UNREF(value);
ZVAL_COPY(variable_ptr, value);
efree(ref);
} else {
ZVAL_DUP(variable_ptr, Z_REFVAL_P(value));
}
}
_zval_dtor_func(&garbage ZEND_FILE_LINE_CC);
_zval_dtor_func(garbage ZEND_FILE_LINE_CC);
} else { /* we need to split */
Z_DELREF_P(variable_ptr);
GC_ZVAL_CHECK_POSSIBLE_ROOT(variable_ptr);
@ -1015,10 +1009,8 @@ assign_simple:
assign_ref:
if (Z_REFCOUNT_P(value) == 1) {
//??? auto dereferencing
zend_reference *ref = Z_REF_P(value);
ZVAL_COPY_VALUE(value, Z_REFVAL_P(value));
ZVAL_UNREF(value);
ZVAL_COPY(variable_ptr, value);
efree(ref);
} else {
ZVAL_DUP(variable_ptr, Z_REFVAL_P(value));
}

View file

@ -79,8 +79,7 @@ static zend_always_inline void i_zval_ptr_dtor(zval *zval_ptr ZEND_FILE_LINE_DC
(type != IS_STRING || !IS_INTERNED(Z_STR_P(zval_ptr)))) {
if (!Z_DELREF_P(zval_ptr)) {
ZEND_ASSERT(zval_ptr != &EG(uninitialized_zval));
GC_REMOVE_ZVAL_FROM_BUFFER(zval_ptr);
_zval_dtor_func_for_ptr(zval_ptr ZEND_FILE_LINE_CC);
_zval_dtor_func_for_ptr(Z_COUNTED_P(zval_ptr) ZEND_FILE_LINE_CC);
} else {
if (Z_REFCOUNT_P(zval_ptr) == 1 && Z_TYPE_P(zval_ptr) == IS_REFERENCE) {
/* convert reference to regular value */
@ -98,8 +97,7 @@ static zend_always_inline void i_zval_ptr_dtor_nogc(zval *zval_ptr ZEND_FILE_LIN
if (Z_REFCOUNTED_P(zval_ptr)) {
if (!Z_DELREF_P(zval_ptr)) {
ZEND_ASSERT(zval_ptr != &EG(uninitialized_zval));
GC_REMOVE_ZVAL_FROM_BUFFER(zval_ptr);
_zval_dtor_func_for_ptr(zval_ptr ZEND_FILE_LINE_CC);
_zval_dtor_func_for_ptr(Z_COUNTED_P(zval_ptr) ZEND_FILE_LINE_CC);
} else {
if (Z_REFCOUNT_P(zval_ptr) == 1 && Z_TYPE_P(zval_ptr) == IS_REFERENCE) {
/* convert reference to regular value */

File diff suppressed because it is too large Load diff

View file

@ -61,17 +61,17 @@
do {(v) = (v) | GC_COLOR;} while (0)
#define GC_ZVAL_ADDRESS(v) \
GC_ADDRESS(Z_GC_BUFFER_P(v))
GC_ADDRESS(Z_GC_INFO_P(v))
#define GC_ZVAL_SET_ADDRESS(v, a) \
GC_SET_ADDRESS(Z_GC_BUFFER_P(v), (a))
GC_SET_ADDRESS(Z_GC_INFO_P(v), (a))
#define GC_ZVAL_GET_COLOR(v) \
GC_GET_COLOR(Z_GC_BUFFER_P(v))
GC_GET_COLOR(Z_GC_INFO_P(v))
#define GC_ZVAL_SET_COLOR(v, c) \
GC_SET_COLOR(Z_GC_BUFFER_P(v), (c))
GC_SET_COLOR(Z_GC_INFO_P(v), (c))
#define GC_ZVAL_SET_BLACK(v) \
GC_SET_BLACK(Z_GC_BUFFER_P(v))
GC_SET_BLACK(Z_GC_INFO_P(v))
#define GC_ZVAL_SET_PURPLE(v) \
GC_SET_PURPLE(Z_GC_BUFFER_P(v))
GC_SET_PURPLE(Z_GC_INFO_P(v))
typedef struct _gc_root_buffer {
struct _gc_root_buffer *prev; /* double-linked list */
@ -89,9 +89,8 @@ typedef struct _zend_gc_globals {
gc_root_buffer *first_unused; /* pointer to first unused buffer */
gc_root_buffer *last_unused; /* pointer to last unused buffer */
zend_refcounted *zval_to_free; /* temporary list of zvals to free */
zend_refcounted *free_list;
zend_refcounted *next_to_free;
gc_root_buffer to_free; /* list to free */
gc_root_buffer *next_to_free;
zend_uint gc_runs;
zend_uint collected;
@ -100,13 +99,9 @@ typedef struct _zend_gc_globals {
zend_uint root_buf_length;
zend_uint root_buf_peak;
zend_uint zval_possible_root;
zend_uint zobj_possible_root;
zend_uint zval_buffered;
zend_uint zobj_buffered;
zend_uint zval_remove_from_buffer;
zend_uint zobj_remove_from_buffer;
zend_uint zval_marked_grey;
zend_uint zobj_marked_grey;
#endif
} zend_gc_globals;
@ -123,8 +118,8 @@ extern ZEND_API zend_gc_globals gc_globals;
BEGIN_EXTERN_C()
ZEND_API int gc_collect_cycles(TSRMLS_D);
ZEND_API void gc_zval_possible_root(zend_refcounted *ref TSRMLS_DC);
ZEND_API void gc_remove_zval_from_buffer(zend_refcounted *ref TSRMLS_DC);
ZEND_API void gc_possible_root(zend_refcounted *ref TSRMLS_DC);
ZEND_API void gc_remove_from_buffer(zend_refcounted *ref TSRMLS_DC);
ZEND_API void gc_globals_ctor(TSRMLS_D);
ZEND_API void gc_globals_dtor(TSRMLS_D);
ZEND_API void gc_init(TSRMLS_D);
@ -132,24 +127,21 @@ ZEND_API void gc_reset(TSRMLS_D);
END_EXTERN_C()
#define GC_ZVAL_CHECK_POSSIBLE_ROOT(z) \
gc_zval_check_possible_root((z) TSRMLS_CC)
gc_check_possible_root((z) TSRMLS_CC)
#define GC_REMOVE_ZVAL_FROM_BUFFER(z) do { \
if (GC_ZVAL_ADDRESS(z)) { \
gc_remove_zval_from_buffer(Z_COUNTED_P(z) TSRMLS_CC); \
#define GC_REMOVE_FROM_BUFFER(p) do { \
zend_refcounted *_p = (zend_refcounted*)(p); \
if (GC_ADDRESS(_p->u.v.gc_info)) { \
gc_remove_from_buffer(_p TSRMLS_CC); \
} \
} while (0)
#define GC_REMOVE_ZOBJ_FROM_BUFFER(z) do { \
if (GC_ADDRESS((z)->gc.u.v.buffer)) { \
gc_remove_zval_from_buffer(&(z)->gc TSRMLS_CC); \
} \
} while (0)
static zend_always_inline void gc_zval_check_possible_root(zval *z TSRMLS_DC)
static zend_always_inline void gc_check_possible_root(zval *z TSRMLS_DC)
{
if (Z_TYPE_P(z) == IS_ARRAY || Z_TYPE_P(z) == IS_OBJECT) {
gc_zval_possible_root(Z_COUNTED_P(z) TSRMLS_CC);
if (Z_TYPE_P(z) == IS_OBJECT ||
(Z_ISREF_P(z) &&
(Z_TYPE_P(Z_REFVAL_P(z)) == IS_ARRAY || Z_TYPE_P(Z_REFVAL_P(z)) == IS_OBJECT))) {
gc_possible_root(Z_COUNTED_P(z) TSRMLS_CC);
}
}

View file

@ -207,6 +207,8 @@ static void zend_generator_free_storage(zend_object *object TSRMLS_DC) /* {{{ */
zend_generator_close(generator, 0 TSRMLS_CC);
zend_object_std_dtor(&generator->std TSRMLS_CC);
GC_REMOVE_FROM_BUFFER(generator);
efree(generator);
}
/* }}} */

View file

@ -31,7 +31,7 @@ ZEND_API void zend_object_std_init(zend_object *object, zend_class_entry *ce TSR
object->gc.refcount = 1;
object->gc.u.v.type = IS_OBJECT;
object->gc.u.v.flags = 0;
object->gc.u.v.buffer = 0;
object->gc.u.v.gc_info = 0;
object->ce = ce;
object->properties = NULL;
object->guards = NULL;
@ -125,6 +125,7 @@ ZEND_API void zend_objects_destroy_object(zend_object *object TSRMLS_DC)
ZEND_API void zend_object_free(zend_object *object TSRMLS_DC)
{
zend_object_std_dtor(object TSRMLS_CC);
GC_REMOVE_FROM_BUFFER(object);
efree(object);
}

View file

@ -53,10 +53,6 @@ ZEND_API void zend_objects_store_call_destructors(zend_objects_store *objects TS
obj->gc.refcount++;
obj->handlers->dtor_obj(obj TSRMLS_CC);
obj->gc.refcount--;
if (obj->gc.refcount == 0) {
GC_REMOVE_ZOBJ_FROM_BUFFER(obj TSRMLS_CC);
}
}
}
}
@ -86,7 +82,6 @@ ZEND_API void zend_objects_store_free_object_storage(zend_objects_store *objects
zend_object *obj = objects->object_buckets[i];
if (IS_VALID(obj)) {
GC_REMOVE_ZOBJ_FROM_BUFFER(obj TSRMLS_CC);
objects->object_buckets[i] = SET_INVALID(obj);
if (obj->handlers->free_obj) {
obj->handlers->free_obj(obj TSRMLS_CC);
@ -121,6 +116,17 @@ ZEND_API void zend_objects_store_put(zend_object *object TSRMLS_DC)
SET_BUCKET_NUMBER(EG(objects_store).object_buckets[handle], EG(objects_store).free_list_head); \
EG(objects_store).free_list_head = handle;
ZEND_API void zend_objects_store_free(zend_object *object TSRMLS_DC) /* {{{ */
{
int handle = object->handle;
if (object->handlers->free_obj) {
object->handlers->free_obj(object TSRMLS_CC);
}
ZEND_OBJECTS_STORE_ADD_TO_FREE_LIST(handle);
}
/* }}} */
ZEND_API void zend_objects_store_del(zend_object *object TSRMLS_DC) /* {{{ */
{
/* Make sure we hold a reference count during the destructor call
@ -149,7 +155,6 @@ ZEND_API void zend_objects_store_del(zend_object *object TSRMLS_DC) /* {{{ */
if (object->gc.refcount == 0) {
zend_uint handle = object->handle;
//??? GC_REMOVE_ZOBJ_FROM_BUFFER(obj);
if (object->handlers->free_obj) {
zend_try {
object->handlers->free_obj(object TSRMLS_CC);
@ -251,7 +256,7 @@ ZEND_API zend_object *zend_object_create_proxy(zval *object, zval *member TSRMLS
obj->std.gc.refcount = 1;
obj->std.gc.u.v.type = IS_OBJECT;
obj->std.gc.u.v.buffer = 0;
obj->std.gc.u.v.gc_info = 0;
obj->std.ce = NULL;
obj->std.properties = NULL;
obj->std.guards = NULL;

View file

@ -88,6 +88,7 @@ ZEND_API void zend_objects_store_destroy(zend_objects_store *objects);
/* Store API functions */
ZEND_API void zend_objects_store_put(zend_object *object TSRMLS_DC);
ZEND_API void zend_objects_store_del(zend_object *object TSRMLS_DC);
ZEND_API void zend_objects_store_free(zend_object *object TSRMLS_DC);
/* See comment in zend_objects_API.c before you use this */
ZEND_API void zend_object_store_set_object(zval *zobject, zend_object *object TSRMLS_DC);

View file

@ -187,9 +187,7 @@ try_again:
switch (Z_TYPE_P(op)) {
case IS_REFERENCE:
if (Z_REFCOUNT_P(op) == 1) {
zend_reference *ref = Z_REF_P(op);
ZVAL_COPY_VALUE(op, Z_REFVAL_P(op));
efree(ref);
ZVAL_UNREF(op);
} else {
Z_DELREF_P(op);
ZVAL_COPY_VALUE(op, Z_REFVAL_P(op));
@ -1531,7 +1529,6 @@ static inline void zend_free_obj_get_result(zval *op TSRMLS_DC) /* {{{ */
{
if (Z_REFCOUNTED_P(op)) {
if (Z_REFCOUNT_P(op) == 0) {
GC_REMOVE_ZVAL_FROM_BUFFER(op);
zval_dtor(op);
} else {
zval_ptr_dtor(op);

View file

@ -100,7 +100,7 @@ static zend_always_inline zend_string *zend_str_alloc(int len, int persistent)
ret->gc.refcount = 1;
ret->gc.u.v.type = IS_STRING;
ret->gc.u.v.flags = (persistent ? IS_STR_PERSISTENT : 0);
ret->gc.u.v.buffer = 0;
ret->gc.u.v.gc_info = 0;
ret->h = 0;
ret->len = len;
return ret;

View file

@ -103,7 +103,7 @@ struct _zend_refcounted {
struct {
zend_uchar type;
zend_uchar flags; /* used for strings & objects */
zend_ushort buffer; /* keeps GC root number or 0 */
zend_ushort gc_info; /* keeps GC root number (or 0) and color */
} v;
zend_uint long_type;
} u;
@ -271,8 +271,8 @@ struct _zend_ast_ref {
#define Z_GC_TYPE(zval) Z_COUNTED(zval)->type
#define Z_GC_TYPE_P(zval_p) Z_GC_TYPE(*(zval_p))
#define Z_GC_BUFFER(zval) Z_COUNTED(zval)->u.v.buffer
#define Z_GC_BUFFER_P(zval_p) Z_GC_BUFFER(*(zval_p))
#define Z_GC_INFO(zval) Z_COUNTED(zval)->u.v.gc_info
#define Z_GC_INFO_P(zval_p) Z_GC_INFO(*(zval_p))
#define Z_STR(zval) (zval).value.str
#define Z_STR_P(zval_p) Z_STR(*(zval_p))
@ -395,7 +395,7 @@ struct _zend_ast_ref {
zend_array *_arr = emalloc(sizeof(zend_array)); \
_arr->gc.refcount = 1; \
_arr->gc.u.v.type = IS_ARRAY; \
_arr->gc.u.v.buffer = 0; \
_arr->gc.u.v.gc_info = 0; \
Z_ARR_P(__z) = _arr; \
Z_TYPE_P(__z) = IS_ARRAY; \
} while (0)
@ -405,7 +405,7 @@ struct _zend_ast_ref {
zend_array *_arr = malloc(sizeof(zend_array)); \
_arr->gc.refcount = 1; \
_arr->gc.u.v.type = IS_ARRAY; \
_arr->gc.u.v.buffer = 0; \
_arr->gc.u.v.gc_info = 0; \
Z_ARR_P(__z) = _arr; \
Z_TYPE_P(__z) = IS_ARRAY; \
} while (0)
@ -426,7 +426,7 @@ struct _zend_ast_ref {
zend_resource *_res = emalloc(sizeof(zend_resource)); \
_res->gc.refcount = 1; \
_res->gc.u.v.type = IS_RESOURCE; \
_res->gc.u.v.buffer = 0; \
_res->gc.u.v.gc_info = 0; \
_res->handle = (h); \
_res->type = (t); \
_res->ptr = (p); \
@ -439,7 +439,7 @@ struct _zend_ast_ref {
zend_resource *_res = malloc(sizeof(zend_resource)); \
_res->gc.refcount = 1; \
_res->gc.u.v.type = IS_RESOURCE; \
_res->gc.u.v.buffer = 0; \
_res->gc.u.v.gc_info = 0; \
_res->handle = (h); \
_res->type = (t); \
_res->ptr = (p); \
@ -458,7 +458,7 @@ struct _zend_ast_ref {
zend_reference *_ref = emalloc(sizeof(zend_reference)); \
_ref->gc.refcount = 1; \
_ref->gc.u.v.type = IS_REFERENCE; \
_ref->gc.u.v.buffer = 0; \
_ref->gc.u.v.gc_info = 0; \
_ref->val = *(r); \
Z_REF_P(z) = _ref; \
Z_TYPE_P(z) = IS_REFERENCE; \
@ -469,7 +469,7 @@ struct _zend_ast_ref {
zend_ast_ref *_ast = emalloc(sizeof(zend_ast_ref)); \
_ast->gc.refcount = 1; \
_ast->gc.u.v.type = IS_CONSTANT_AST; \
_ast->gc.u.v.buffer = 0; \
_ast->gc.u.v.gc_info = 0; \
_ast->ast = (a); \
Z_AST_P(__z) = _ast; \
Z_TYPE_P(__z) = IS_CONSTANT_AST; \
@ -499,7 +499,7 @@ struct _zend_ast_ref {
zend_str_offset *x = emalloc(sizeof(zend_str_offset)); \
x->gc.refcount = 1; \
x->gc.u.v.type = IS_STR_OFFSET; \
x->gc.u.v.buffer = 0; \
x->gc.u.v.gc_info = 0; \
x->str = (s); \
x->offset = (o); \
Z_STR_OFFSET_P(z) = x; \

View file

@ -27,114 +27,132 @@
#include "zend_constants.h"
#include "zend_list.h"
ZEND_API void _zval_dtor_func(zval *zvalue ZEND_FILE_LINE_DC)
ZEND_API void _zval_dtor_func(zend_refcounted *p ZEND_FILE_LINE_DC)
{
switch (Z_TYPE_P(zvalue) & IS_CONSTANT_TYPE_MASK) {
//??? switch (Z_TYPE_P(zvalue) & IS_CONSTANT_TYPE_MASK) {
switch (p->u.v.type) {
case IS_STRING:
case IS_CONSTANT:
CHECK_ZVAL_STRING_REL(zvalue);
STR_RELEASE(Z_STR_P(zvalue));
break;
case IS_CONSTANT: {
zend_string *str = (zend_string*)p;
//??? CHECK_ZVAL_STRING_REL(zvalue);
STR_RELEASE(str);
goto exit;
}
case IS_ARRAY:
case IS_CONSTANT_ARRAY: {
zend_array *arr =(zend_array*)p;
TSRMLS_FETCH();
if (Z_ARRVAL_P(zvalue) != &EG(symbol_table).ht) {
if (arr != &EG(symbol_table)) {
/* break possible cycles */
Z_TYPE_P(zvalue) = IS_NULL;
zend_hash_destroy(Z_ARRVAL_P(zvalue));
efree(Z_ARR_P(zvalue));
arr->gc.u.v.type = IS_NULL;
zend_hash_destroy(&arr->ht);
goto gc_exit;
}
goto exit;
}
break;
case IS_CONSTANT_AST:
zend_ast_destroy(Z_AST_P(zvalue)->ast);
efree(Z_AST_P(zvalue));
break;
case IS_OBJECT:
{
case IS_CONSTANT_AST: {
zend_ast_ref *ast =(zend_ast_ref*)p;
zend_ast_destroy(ast->ast);
efree(ast);
goto exit;
}
case IS_OBJECT: {
zend_object *obj = (zend_object*)p;
TSRMLS_FETCH();
OBJ_RELEASE(Z_OBJ_P(zvalue));
OBJ_RELEASE(obj);
goto exit;
}
break;
case IS_RESOURCE:
{
case IS_RESOURCE: {
zend_resource *res = (zend_resource*)p;
TSRMLS_FETCH();
if (Z_DELREF_P(zvalue) == 0) {
if (--res->gc.refcount == 0) {
/* destroy resource */
zend_list_delete(Z_RES_P(zvalue));
zend_list_delete(res);
}
goto exit;
}
break;
case IS_REFERENCE:
if (Z_DELREF_P(zvalue) == 0) {
zval_dtor(Z_REFVAL_P(zvalue));
efree(Z_REF_P(zvalue));
case IS_REFERENCE: {
zend_reference *ref = (zend_reference*)p;
if (--ref->gc.refcount == 0) {
zval_dtor(&ref->val);
goto gc_exit;
}
goto exit;
}
break;
case IS_LONG:
case IS_DOUBLE:
case IS_BOOL:
case IS_NULL:
default:
return;
break;
goto exit;
}
gc_exit:
GC_REMOVE_FROM_BUFFER(p);
efree(p);
exit:
return;
}
ZEND_API void _zval_dtor_func_for_ptr(zval *zvalue ZEND_FILE_LINE_DC)
ZEND_API void _zval_dtor_func_for_ptr(zend_refcounted *p ZEND_FILE_LINE_DC)
{
switch (Z_TYPE_P(zvalue) & IS_CONSTANT_TYPE_MASK) {
//??? switch (Z_TYPE_P(zvalue) & IS_CONSTANT_TYPE_MASK) {
switch (p->u.v.type) {
case IS_STRING:
case IS_CONSTANT:
CHECK_ZVAL_STRING_REL(zvalue);
STR_FREE(Z_STR_P(zvalue));
break;
case IS_CONSTANT: {
zend_string *str = (zend_string*)p;
//??? CHECK_ZVAL_STRING_REL(zvalue);
STR_FREE(str);
goto exit;
}
case IS_ARRAY:
case IS_CONSTANT_ARRAY: {
zend_array *arr =(zend_array*)p;
TSRMLS_FETCH();
if (Z_ARRVAL_P(zvalue) != &EG(symbol_table).ht) {
if (arr != &EG(symbol_table)) {
/* break possible cycles */
Z_TYPE_P(zvalue) = IS_NULL;
zend_hash_destroy(Z_ARRVAL_P(zvalue));
efree(Z_ARR_P(zvalue));
arr->gc.u.v.type = IS_NULL;
zend_hash_destroy(&arr->ht);
goto gc_exit;
}
goto exit;
}
break;
case IS_CONSTANT_AST:
zend_ast_destroy(Z_AST_P(zvalue)->ast);
efree(Z_AST_P(zvalue));
break;
case IS_OBJECT:
{
case IS_CONSTANT_AST: {
zend_ast_ref *ast =(zend_ast_ref*)p;
zend_ast_destroy(ast->ast);
efree(ast);
goto exit;
}
case IS_OBJECT: {
zend_object *obj = (zend_object*)p;
TSRMLS_FETCH();
zend_objects_store_del(Z_OBJ_P(zvalue) TSRMLS_CC);
zend_objects_store_del(obj TSRMLS_CC);
goto exit;
}
break;
case IS_RESOURCE:
{
case IS_RESOURCE: {
zend_resource *res = (zend_resource*)p;
TSRMLS_FETCH();
/* destroy resource */
zend_list_delete(Z_RES_P(zvalue));
zend_list_delete(res);
goto exit;
}
case IS_REFERENCE: {
zend_reference *ref = (zend_reference*)p;
zval_dtor(&ref->val);
goto gc_exit;
}
break;
case IS_REFERENCE:
zval_dtor(Z_REFVAL_P(zvalue));
efree(Z_REF_P(zvalue));
break;
case IS_LONG:
case IS_DOUBLE:
case IS_BOOL:
case IS_NULL:
default:
return;
break;
goto exit;
}
gc_exit:
GC_REMOVE_FROM_BUFFER(p);
efree(p);
exit:
return;
}
ZEND_API void _zval_internal_dtor(zval *zvalue ZEND_FILE_LINE_DC)
@ -264,7 +282,6 @@ ZEND_API void _zval_dtor_wrapper(zval *zvalue)
{
TSRMLS_FETCH();
GC_REMOVE_ZVAL_FROM_BUFFER(zvalue);
zval_dtor(zvalue);
}

View file

@ -25,15 +25,15 @@
BEGIN_EXTERN_C()
ZEND_API void _zval_dtor_func(zval *zvalue ZEND_FILE_LINE_DC);
ZEND_API void _zval_dtor_func_for_ptr(zval *zvalue ZEND_FILE_LINE_DC);
ZEND_API void _zval_dtor_func(zend_refcounted *p ZEND_FILE_LINE_DC);
ZEND_API void _zval_dtor_func_for_ptr(zend_refcounted *p ZEND_FILE_LINE_DC);
static zend_always_inline void _zval_dtor(zval *zvalue ZEND_FILE_LINE_DC)
{
if (!Z_REFCOUNTED_P(zvalue)) {
return;
}
_zval_dtor_func(zvalue ZEND_FILE_LINE_RELAY_CC);
_zval_dtor_func(Z_COUNTED_P(zvalue) ZEND_FILE_LINE_RELAY_CC);
}
ZEND_API void _zval_copy_ctor_func(zval *zvalue ZEND_FILE_LINE_DC);

View file

@ -405,7 +405,6 @@ ZEND_VM_HELPER_EX(zend_binary_assign_op_obj_helper, VAR|UNUSED|CV, CONST|TMP|VAR
zval *value = Z_OBJ_HT_P(z)->get(z TSRMLS_CC);
if (Z_REFCOUNT_P(z) == 0) {
GC_REMOVE_ZVAL_FROM_BUFFER(z);
zval_dtor(z);
}
z = value;
@ -652,7 +651,6 @@ ZEND_VM_HELPER_EX(zend_pre_incdec_property_helper, VAR|UNUSED|CV, CONST|TMP|VAR|
zval *value = Z_OBJ_HT_P(z)->get(z TSRMLS_CC);
if (Z_REFCOUNT_P(z) == 0) {
GC_REMOVE_ZVAL_FROM_BUFFER(z);
zval_dtor(z);
}
z = value;
@ -750,7 +748,6 @@ ZEND_VM_HELPER_EX(zend_post_incdec_property_helper, VAR|UNUSED|CV, CONST|TMP|VAR
zval *value = Z_OBJ_HT_P(z)->get(z TSRMLS_CC);
if (Z_REFCOUNT_P(z) == 0) {
GC_REMOVE_ZVAL_FROM_BUFFER(z);
zval_dtor(z);
}
z = value;
@ -4368,16 +4365,11 @@ ZEND_VM_HANDLER(77, ZEND_FE_RESET, CONST|TMP|VAR|CV, ANY)
//??? dereference
if (Z_ISREF_P(array_ref)) {
if (Z_REFCOUNT_P(array_ref) == 1) {
zend_reference *ref = Z_REF_P(array_ref);
ZVAL_COPY(array_ref, &ref->val);
efree(ref);
ZVAL_UNREF(array_ref);
array_ptr = array_ref;
} else {
Z_ADDREF_P(array_ref);
}
} else {
Z_ADDREF_P(array_ref);
}
Z_ADDREF_P(array_ref);
}
}
}

View file

@ -3079,16 +3079,11 @@ static int ZEND_FASTCALL ZEND_FE_RESET_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_A
//??? dereference
if (Z_ISREF_P(array_ref)) {
if (Z_REFCOUNT_P(array_ref) == 1) {
zend_reference *ref = Z_REF_P(array_ref);
ZVAL_COPY(array_ref, &ref->val);
efree(ref);
ZVAL_UNREF(array_ref);
array_ptr = array_ref;
} else {
Z_ADDREF_P(array_ref);
}
} else {
Z_ADDREF_P(array_ref);
}
Z_ADDREF_P(array_ref);
}
}
}
@ -8180,16 +8175,11 @@ static int ZEND_FASTCALL ZEND_FE_RESET_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARG
//??? dereference
if (Z_ISREF_P(array_ref)) {
if (Z_REFCOUNT_P(array_ref) == 1) {
zend_reference *ref = Z_REF_P(array_ref);
ZVAL_COPY(array_ref, &ref->val);
efree(ref);
ZVAL_UNREF(array_ref);
array_ptr = array_ref;
} else {
Z_ADDREF_P(array_ref);
}
} else {
Z_ADDREF_P(array_ref);
}
Z_ADDREF_P(array_ref);
}
}
}
@ -13359,16 +13349,11 @@ static int ZEND_FASTCALL ZEND_FE_RESET_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARG
//??? dereference
if (Z_ISREF_P(array_ref)) {
if (Z_REFCOUNT_P(array_ref) == 1) {
zend_reference *ref = Z_REF_P(array_ref);
ZVAL_COPY(array_ref, &ref->val);
efree(ref);
ZVAL_UNREF(array_ref);
array_ptr = array_ref;
} else {
Z_ADDREF_P(array_ref);
}
} else {
Z_ADDREF_P(array_ref);
}
Z_ADDREF_P(array_ref);
}
}
}
@ -14079,7 +14064,6 @@ static int ZEND_FASTCALL zend_binary_assign_op_obj_helper_SPEC_VAR_CONST(int (*b
zval *value = Z_OBJ_HT_P(z)->get(z TSRMLS_CC);
if (Z_REFCOUNT_P(z) == 0) {
GC_REMOVE_ZVAL_FROM_BUFFER(z);
zval_dtor(z);
}
z = value;
@ -14325,7 +14309,6 @@ static int ZEND_FASTCALL zend_pre_incdec_property_helper_SPEC_VAR_CONST(incdec_t
zval *value = Z_OBJ_HT_P(z)->get(z TSRMLS_CC);
if (Z_REFCOUNT_P(z) == 0) {
GC_REMOVE_ZVAL_FROM_BUFFER(z);
zval_dtor(z);
}
z = value;
@ -14423,7 +14406,6 @@ static int ZEND_FASTCALL zend_post_incdec_property_helper_SPEC_VAR_CONST(incdec_
zval *value = Z_OBJ_HT_P(z)->get(z TSRMLS_CC);
if (Z_REFCOUNT_P(z) == 0) {
GC_REMOVE_ZVAL_FROM_BUFFER(z);
zval_dtor(z);
}
z = value;
@ -16577,7 +16559,6 @@ static int ZEND_FASTCALL zend_binary_assign_op_obj_helper_SPEC_VAR_TMP(int (*bin
zval *value = Z_OBJ_HT_P(z)->get(z TSRMLS_CC);
if (Z_REFCOUNT_P(z) == 0) {
GC_REMOVE_ZVAL_FROM_BUFFER(z);
zval_dtor(z);
}
z = value;
@ -16824,7 +16805,6 @@ static int ZEND_FASTCALL zend_pre_incdec_property_helper_SPEC_VAR_TMP(incdec_t i
zval *value = Z_OBJ_HT_P(z)->get(z TSRMLS_CC);
if (Z_REFCOUNT_P(z) == 0) {
GC_REMOVE_ZVAL_FROM_BUFFER(z);
zval_dtor(z);
}
z = value;
@ -16922,7 +16902,6 @@ static int ZEND_FASTCALL zend_post_incdec_property_helper_SPEC_VAR_TMP(incdec_t
zval *value = Z_OBJ_HT_P(z)->get(z TSRMLS_CC);
if (Z_REFCOUNT_P(z) == 0) {
GC_REMOVE_ZVAL_FROM_BUFFER(z);
zval_dtor(z);
}
z = value;
@ -18653,7 +18632,6 @@ static int ZEND_FASTCALL zend_binary_assign_op_obj_helper_SPEC_VAR_VAR(int (*bin
zval *value = Z_OBJ_HT_P(z)->get(z TSRMLS_CC);
if (Z_REFCOUNT_P(z) == 0) {
GC_REMOVE_ZVAL_FROM_BUFFER(z);
zval_dtor(z);
}
z = value;
@ -18900,7 +18878,6 @@ static int ZEND_FASTCALL zend_pre_incdec_property_helper_SPEC_VAR_VAR(incdec_t i
zval *value = Z_OBJ_HT_P(z)->get(z TSRMLS_CC);
if (Z_REFCOUNT_P(z) == 0) {
GC_REMOVE_ZVAL_FROM_BUFFER(z);
zval_dtor(z);
}
z = value;
@ -18998,7 +18975,6 @@ static int ZEND_FASTCALL zend_post_incdec_property_helper_SPEC_VAR_VAR(incdec_t
zval *value = Z_OBJ_HT_P(z)->get(z TSRMLS_CC);
if (Z_REFCOUNT_P(z) == 0) {
GC_REMOVE_ZVAL_FROM_BUFFER(z);
zval_dtor(z);
}
z = value;
@ -20843,7 +20819,6 @@ static int ZEND_FASTCALL zend_binary_assign_op_obj_helper_SPEC_VAR_UNUSED(int (*
zval *value = Z_OBJ_HT_P(z)->get(z TSRMLS_CC);
if (Z_REFCOUNT_P(z) == 0) {
GC_REMOVE_ZVAL_FROM_BUFFER(z);
zval_dtor(z);
}
z = value;
@ -22264,7 +22239,6 @@ static int ZEND_FASTCALL zend_binary_assign_op_obj_helper_SPEC_VAR_CV(int (*bina
zval *value = Z_OBJ_HT_P(z)->get(z TSRMLS_CC);
if (Z_REFCOUNT_P(z) == 0) {
GC_REMOVE_ZVAL_FROM_BUFFER(z);
zval_dtor(z);
}
z = value;
@ -22510,7 +22484,6 @@ static int ZEND_FASTCALL zend_pre_incdec_property_helper_SPEC_VAR_CV(incdec_t in
zval *value = Z_OBJ_HT_P(z)->get(z TSRMLS_CC);
if (Z_REFCOUNT_P(z) == 0) {
GC_REMOVE_ZVAL_FROM_BUFFER(z);
zval_dtor(z);
}
z = value;
@ -22608,7 +22581,6 @@ static int ZEND_FASTCALL zend_post_incdec_property_helper_SPEC_VAR_CV(incdec_t i
zval *value = Z_OBJ_HT_P(z)->get(z TSRMLS_CC);
if (Z_REFCOUNT_P(z) == 0) {
GC_REMOVE_ZVAL_FROM_BUFFER(z);
zval_dtor(z);
}
z = value;
@ -24195,7 +24167,6 @@ static int ZEND_FASTCALL zend_binary_assign_op_obj_helper_SPEC_UNUSED_CONST(int
zval *value = Z_OBJ_HT_P(z)->get(z TSRMLS_CC);
if (Z_REFCOUNT_P(z) == 0) {
GC_REMOVE_ZVAL_FROM_BUFFER(z);
zval_dtor(z);
}
z = value;
@ -24440,7 +24411,6 @@ static int ZEND_FASTCALL zend_pre_incdec_property_helper_SPEC_UNUSED_CONST(incde
zval *value = Z_OBJ_HT_P(z)->get(z TSRMLS_CC);
if (Z_REFCOUNT_P(z) == 0) {
GC_REMOVE_ZVAL_FROM_BUFFER(z);
zval_dtor(z);
}
z = value;
@ -24538,7 +24508,6 @@ static int ZEND_FASTCALL zend_post_incdec_property_helper_SPEC_UNUSED_CONST(incd
zval *value = Z_OBJ_HT_P(z)->get(z TSRMLS_CC);
if (Z_REFCOUNT_P(z) == 0) {
GC_REMOVE_ZVAL_FROM_BUFFER(z);
zval_dtor(z);
}
z = value;
@ -25599,7 +25568,6 @@ static int ZEND_FASTCALL zend_binary_assign_op_obj_helper_SPEC_UNUSED_TMP(int (*
zval *value = Z_OBJ_HT_P(z)->get(z TSRMLS_CC);
if (Z_REFCOUNT_P(z) == 0) {
GC_REMOVE_ZVAL_FROM_BUFFER(z);
zval_dtor(z);
}
z = value;
@ -25845,7 +25813,6 @@ static int ZEND_FASTCALL zend_pre_incdec_property_helper_SPEC_UNUSED_TMP(incdec_
zval *value = Z_OBJ_HT_P(z)->get(z TSRMLS_CC);
if (Z_REFCOUNT_P(z) == 0) {
GC_REMOVE_ZVAL_FROM_BUFFER(z);
zval_dtor(z);
}
z = value;
@ -25943,7 +25910,6 @@ static int ZEND_FASTCALL zend_post_incdec_property_helper_SPEC_UNUSED_TMP(incdec
zval *value = Z_OBJ_HT_P(z)->get(z TSRMLS_CC);
if (Z_REFCOUNT_P(z) == 0) {
GC_REMOVE_ZVAL_FROM_BUFFER(z);
zval_dtor(z);
}
z = value;
@ -26920,7 +26886,6 @@ static int ZEND_FASTCALL zend_binary_assign_op_obj_helper_SPEC_UNUSED_VAR(int (*
zval *value = Z_OBJ_HT_P(z)->get(z TSRMLS_CC);
if (Z_REFCOUNT_P(z) == 0) {
GC_REMOVE_ZVAL_FROM_BUFFER(z);
zval_dtor(z);
}
z = value;
@ -27166,7 +27131,6 @@ static int ZEND_FASTCALL zend_pre_incdec_property_helper_SPEC_UNUSED_VAR(incdec_
zval *value = Z_OBJ_HT_P(z)->get(z TSRMLS_CC);
if (Z_REFCOUNT_P(z) == 0) {
GC_REMOVE_ZVAL_FROM_BUFFER(z);
zval_dtor(z);
}
z = value;
@ -27264,7 +27228,6 @@ static int ZEND_FASTCALL zend_post_incdec_property_helper_SPEC_UNUSED_VAR(incdec
zval *value = Z_OBJ_HT_P(z)->get(z TSRMLS_CC);
if (Z_REFCOUNT_P(z) == 0) {
GC_REMOVE_ZVAL_FROM_BUFFER(z);
zval_dtor(z);
}
z = value;
@ -28242,7 +28205,6 @@ static int ZEND_FASTCALL zend_binary_assign_op_obj_helper_SPEC_UNUSED_UNUSED(int
zval *value = Z_OBJ_HT_P(z)->get(z TSRMLS_CC);
if (Z_REFCOUNT_P(z) == 0) {
GC_REMOVE_ZVAL_FROM_BUFFER(z);
zval_dtor(z);
}
z = value;
@ -28658,7 +28620,6 @@ static int ZEND_FASTCALL zend_binary_assign_op_obj_helper_SPEC_UNUSED_CV(int (*b
zval *value = Z_OBJ_HT_P(z)->get(z TSRMLS_CC);
if (Z_REFCOUNT_P(z) == 0) {
GC_REMOVE_ZVAL_FROM_BUFFER(z);
zval_dtor(z);
}
z = value;
@ -28903,7 +28864,6 @@ static int ZEND_FASTCALL zend_pre_incdec_property_helper_SPEC_UNUSED_CV(incdec_t
zval *value = Z_OBJ_HT_P(z)->get(z TSRMLS_CC);
if (Z_REFCOUNT_P(z) == 0) {
GC_REMOVE_ZVAL_FROM_BUFFER(z);
zval_dtor(z);
}
z = value;
@ -29001,7 +28961,6 @@ static int ZEND_FASTCALL zend_post_incdec_property_helper_SPEC_UNUSED_CV(incdec_
zval *value = Z_OBJ_HT_P(z)->get(z TSRMLS_CC);
if (Z_REFCOUNT_P(z) == 0) {
GC_REMOVE_ZVAL_FROM_BUFFER(z);
zval_dtor(z);
}
z = value;
@ -30907,16 +30866,11 @@ static int ZEND_FASTCALL ZEND_FE_RESET_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS
//??? dereference
if (Z_ISREF_P(array_ref)) {
if (Z_REFCOUNT_P(array_ref) == 1) {
zend_reference *ref = Z_REF_P(array_ref);
ZVAL_COPY(array_ref, &ref->val);
efree(ref);
ZVAL_UNREF(array_ref);
array_ptr = array_ref;
} else {
Z_ADDREF_P(array_ref);
}
} else {
Z_ADDREF_P(array_ref);
}
Z_ADDREF_P(array_ref);
}
}
}
@ -31495,7 +31449,6 @@ static int ZEND_FASTCALL zend_binary_assign_op_obj_helper_SPEC_CV_CONST(int (*bi
zval *value = Z_OBJ_HT_P(z)->get(z TSRMLS_CC);
if (Z_REFCOUNT_P(z) == 0) {
GC_REMOVE_ZVAL_FROM_BUFFER(z);
zval_dtor(z);
}
z = value;
@ -31740,7 +31693,6 @@ static int ZEND_FASTCALL zend_pre_incdec_property_helper_SPEC_CV_CONST(incdec_t
zval *value = Z_OBJ_HT_P(z)->get(z TSRMLS_CC);
if (Z_REFCOUNT_P(z) == 0) {
GC_REMOVE_ZVAL_FROM_BUFFER(z);
zval_dtor(z);
}
z = value;
@ -31838,7 +31790,6 @@ static int ZEND_FASTCALL zend_post_incdec_property_helper_SPEC_CV_CONST(incdec_t
zval *value = Z_OBJ_HT_P(z)->get(z TSRMLS_CC);
if (Z_REFCOUNT_P(z) == 0) {
GC_REMOVE_ZVAL_FROM_BUFFER(z);
zval_dtor(z);
}
z = value;
@ -33775,7 +33726,6 @@ static int ZEND_FASTCALL zend_binary_assign_op_obj_helper_SPEC_CV_TMP(int (*bina
zval *value = Z_OBJ_HT_P(z)->get(z TSRMLS_CC);
if (Z_REFCOUNT_P(z) == 0) {
GC_REMOVE_ZVAL_FROM_BUFFER(z);
zval_dtor(z);
}
z = value;
@ -34021,7 +33971,6 @@ static int ZEND_FASTCALL zend_pre_incdec_property_helper_SPEC_CV_TMP(incdec_t in
zval *value = Z_OBJ_HT_P(z)->get(z TSRMLS_CC);
if (Z_REFCOUNT_P(z) == 0) {
GC_REMOVE_ZVAL_FROM_BUFFER(z);
zval_dtor(z);
}
z = value;
@ -34119,7 +34068,6 @@ static int ZEND_FASTCALL zend_post_incdec_property_helper_SPEC_CV_TMP(incdec_t i
zval *value = Z_OBJ_HT_P(z)->get(z TSRMLS_CC);
if (Z_REFCOUNT_P(z) == 0) {
GC_REMOVE_ZVAL_FROM_BUFFER(z);
zval_dtor(z);
}
z = value;
@ -35726,7 +35674,6 @@ static int ZEND_FASTCALL zend_binary_assign_op_obj_helper_SPEC_CV_VAR(int (*bina
zval *value = Z_OBJ_HT_P(z)->get(z TSRMLS_CC);
if (Z_REFCOUNT_P(z) == 0) {
GC_REMOVE_ZVAL_FROM_BUFFER(z);
zval_dtor(z);
}
z = value;
@ -35972,7 +35919,6 @@ static int ZEND_FASTCALL zend_pre_incdec_property_helper_SPEC_CV_VAR(incdec_t in
zval *value = Z_OBJ_HT_P(z)->get(z TSRMLS_CC);
if (Z_REFCOUNT_P(z) == 0) {
GC_REMOVE_ZVAL_FROM_BUFFER(z);
zval_dtor(z);
}
z = value;
@ -36070,7 +36016,6 @@ static int ZEND_FASTCALL zend_post_incdec_property_helper_SPEC_CV_VAR(incdec_t i
zval *value = Z_OBJ_HT_P(z)->get(z TSRMLS_CC);
if (Z_REFCOUNT_P(z) == 0) {
GC_REMOVE_ZVAL_FROM_BUFFER(z);
zval_dtor(z);
}
z = value;
@ -37790,7 +37735,6 @@ static int ZEND_FASTCALL zend_binary_assign_op_obj_helper_SPEC_CV_UNUSED(int (*b
zval *value = Z_OBJ_HT_P(z)->get(z TSRMLS_CC);
if (Z_REFCOUNT_P(z) == 0) {
GC_REMOVE_ZVAL_FROM_BUFFER(z);
zval_dtor(z);
}
z = value;
@ -39077,7 +39021,6 @@ static int ZEND_FASTCALL zend_binary_assign_op_obj_helper_SPEC_CV_CV(int (*binar
zval *value = Z_OBJ_HT_P(z)->get(z TSRMLS_CC);
if (Z_REFCOUNT_P(z) == 0) {
GC_REMOVE_ZVAL_FROM_BUFFER(z);
zval_dtor(z);
}
z = value;
@ -39322,7 +39265,6 @@ static int ZEND_FASTCALL zend_pre_incdec_property_helper_SPEC_CV_CV(incdec_t inc
zval *value = Z_OBJ_HT_P(z)->get(z TSRMLS_CC);
if (Z_REFCOUNT_P(z) == 0) {
GC_REMOVE_ZVAL_FROM_BUFFER(z);
zval_dtor(z);
}
z = value;
@ -39420,7 +39362,6 @@ static int ZEND_FASTCALL zend_post_incdec_property_helper_SPEC_CV_CV(incdec_t in
zval *value = Z_OBJ_HT_P(z)->get(z TSRMLS_CC);
if (Z_REFCOUNT_P(z) == 0) {
GC_REMOVE_ZVAL_FROM_BUFFER(z);
zval_dtor(z);
}
z = value;

View file

@ -2440,6 +2440,7 @@ static void date_object_free_storage_date(zend_object *object TSRMLS_DC) /* {{{
}
zend_object_std_dtor(&intern->std TSRMLS_CC);
GC_REMOVE_FROM_BUFFER(object);
efree(intern);
} /* }}} */
@ -2451,6 +2452,7 @@ static void date_object_free_storage_timezone(zend_object *object TSRMLS_DC) /*
free(intern->tzi.z.abbr);
}
zend_object_std_dtor(&intern->std TSRMLS_CC);
GC_REMOVE_FROM_BUFFER(object);
efree(intern);
} /* }}} */
@ -2460,6 +2462,7 @@ static void date_object_free_storage_interval(zend_object *object TSRMLS_DC) /*
timelib_rel_time_dtor(intern->diff);
zend_object_std_dtor(&intern->std TSRMLS_CC);
GC_REMOVE_FROM_BUFFER(object);
efree(intern);
} /* }}} */
@ -2481,6 +2484,7 @@ static void date_object_free_storage_period(zend_object *object TSRMLS_DC) /* {{
timelib_rel_time_dtor(intern->interval);
zend_object_std_dtor(&intern->std TSRMLS_CC);
GC_REMOVE_FROM_BUFFER(object);
efree(intern);
} /* }}} */

View file

@ -319,6 +319,7 @@ static void reflection_free_objects_storage(zend_object *object TSRMLS_DC) /* {{
intern->ptr = NULL;
zval_ptr_dtor(&intern->obj);
zend_object_std_dtor(object TSRMLS_CC);
GC_REMOVE_FROM_BUFFER(object);
efree(intern);
}
/* }}} */

View file

@ -170,6 +170,7 @@ static void spl_array_object_free_storage(zend_object *object TSRMLS_DC)
efree(intern->debug_info);
}
GC_REMOVE_FROM_BUFFER(object);
efree(intern);
}
/* }}} */

View file

@ -127,6 +127,7 @@ static void spl_filesystem_object_free_storage(zend_object *object TSRMLS_DC) /*
//????zend_iterator_dtor(&intern->it->intern);
}
GC_REMOVE_FROM_BUFFER(object);
efree(intern);
} /* }}} */

View file

@ -367,6 +367,7 @@ static void spl_dllist_object_free_storage(zend_object *object TSRMLS_DC) /* {{{
efree(intern->debug_info);
}
GC_REMOVE_FROM_BUFFER(object);
efree(intern);
}
/* }}} */

View file

@ -210,6 +210,7 @@ static void spl_fixedarray_object_free_storage(zend_object *object TSRMLS_DC) /*
zend_object_std_dtor(&intern->std TSRMLS_CC);
zval_ptr_dtor(&intern->retval);
GC_REMOVE_FROM_BUFFER(object);
efree(intern);
}
/* }}} */

View file

@ -378,6 +378,7 @@ static void spl_heap_object_free_storage(zend_object *object TSRMLS_DC) /* {{{ *
efree(intern->debug_info);
}
GC_REMOVE_FROM_BUFFER(object);
efree(intern);
}
/* }}} */

View file

@ -889,6 +889,7 @@ static void spl_RecursiveIteratorIterator_free_storage(zend_object *_object TSRM
smart_str_free(&object->postfix[0]);
GC_REMOVE_FROM_BUFFER(_object);
efree(object);
}
/* }}} */
@ -2268,6 +2269,7 @@ static void spl_dual_it_free_storage(zend_object *_object TSRMLS_DC)
//zend_object_std_dtor(&object->std TSRMLS_CC);
GC_REMOVE_FROM_BUFFER(_object);
efree(object);
}
/* }}} */

View file

@ -114,6 +114,7 @@ void spl_SplObjectStorage_free_storage(zend_object *object TSRMLS_DC) /* {{{ */
efree(intern->debug_info);
}
GC_REMOVE_FROM_BUFFER(object);
efree(intern);
} /* }}} */

View file

@ -2258,9 +2258,7 @@ PHPAPI int php_array_merge(HashTable *dest, HashTable *src, int recursive TSRMLS
if (Z_ISREF_P(dest_entry)) {
if (Z_REFCOUNT_P(dest_entry) == 1) {
zend_reference *ref = Z_REF_P(dest_entry);
ZVAL_COPY_VALUE(dest_entry, dest_zval);
efree(ref);
ZVAL_UNREF(dest_entry);
} else {
Z_DELREF_P(dest_entry);
ZVAL_DUP(dest_entry, dest_zval);