mirror of
https://github.com/php/php-src.git
synced 2025-08-15 13:38:49 +02:00
Refactored GC (incomplete)
This commit is contained in:
parent
2e3e96b24b
commit
b7938ab1bd
27 changed files with 571 additions and 783 deletions
14
Zend/zend.h
14
Zend/zend.h
|
@ -681,6 +681,16 @@ END_EXTERN_C()
|
||||||
zval_copy_ctor(__z1); \
|
zval_copy_ctor(__z1); \
|
||||||
} while (0)
|
} 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 ???
|
// TODO: invalud ???
|
||||||
#define INIT_PZVAL_COPY(z, v) \
|
#define INIT_PZVAL_COPY(z, v) \
|
||||||
do { \
|
do { \
|
||||||
|
@ -720,9 +730,7 @@ END_EXTERN_C()
|
||||||
zval *__zv = (zv); \
|
zval *__zv = (zv); \
|
||||||
if (Z_ISREF_P(__zv)) { \
|
if (Z_ISREF_P(__zv)) { \
|
||||||
if (Z_REFCOUNT_P(__zv) == 1) { \
|
if (Z_REFCOUNT_P(__zv) == 1) { \
|
||||||
zend_reference *ref = Z_REF_P(__zv); \
|
ZVAL_UNREF(__zv); \
|
||||||
ZVAL_COPY_VALUE(__zv, &ref->val); \
|
|
||||||
efree(ref); \
|
|
||||||
} else { \
|
} else { \
|
||||||
zval *ref = Z_REFVAL_P(__zv); \
|
zval *ref = Z_REFVAL_P(__zv); \
|
||||||
Z_DELREF_P(__zv); \
|
Z_DELREF_P(__zv); \
|
||||||
|
|
|
@ -242,6 +242,7 @@ static void zend_closure_free_storage(zend_object *object TSRMLS_DC) /* {{{ */
|
||||||
zval_ptr_dtor(&closure->this_ptr);
|
zval_ptr_dtor(&closure->this_ptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
GC_REMOVE_FROM_BUFFER(closure);
|
||||||
efree(closure);
|
efree(closure);
|
||||||
}
|
}
|
||||||
/* }}} */
|
/* }}} */
|
||||||
|
|
|
@ -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_REFCOUNTED_P(z)) {
|
||||||
if (!Z_DELREF_P(z)) {
|
if (!Z_DELREF_P(z)) {
|
||||||
ZEND_ASSERT(z != &EG(uninitialized_zval));
|
ZEND_ASSERT(z != &EG(uninitialized_zval));
|
||||||
GC_REMOVE_ZVAL_FROM_BUFFER(z);
|
|
||||||
zval_dtor(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);
|
GC_ZVAL_CHECK_POSSIBLE_ROOT(variable_ptr);
|
||||||
ZVAL_COPY_VALUE(variable_ptr, value);
|
ZVAL_COPY_VALUE(variable_ptr, value);
|
||||||
} else {
|
} else {
|
||||||
zval garbage;
|
zend_refcounted *garbage = Z_COUNTED_P(variable_ptr);
|
||||||
|
|
||||||
ZVAL_COPY_VALUE(&garbage, variable_ptr);
|
|
||||||
ZVAL_COPY_VALUE(variable_ptr, value);
|
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;
|
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);
|
zval_copy_ctor(variable_ptr);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
zval garbage;
|
zend_refcounted *garbage = Z_COUNTED_P(variable_ptr);
|
||||||
|
|
||||||
ZVAL_COPY_VALUE(&garbage, variable_ptr);
|
|
||||||
ZVAL_COPY_VALUE(variable_ptr, value);
|
ZVAL_COPY_VALUE(variable_ptr, value);
|
||||||
if (Z_REFCOUNTED_P(value)) {
|
if (Z_REFCOUNTED_P(value)) {
|
||||||
zval_copy_ctor(variable_ptr);
|
zval_copy_ctor(variable_ptr);
|
||||||
}
|
}
|
||||||
_zval_dtor_func(&garbage ZEND_FILE_LINE_CC);
|
_zval_dtor_func(garbage ZEND_FILE_LINE_CC);
|
||||||
}
|
}
|
||||||
return variable_ptr;
|
return variable_ptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline zval* zend_assign_to_variable(zval *variable_ptr, zval *value TSRMLS_DC)
|
static inline zval* zend_assign_to_variable(zval *variable_ptr, zval *value TSRMLS_DC)
|
||||||
{
|
{
|
||||||
zval garbage;
|
zend_refcounted *garbage;
|
||||||
int is_ref = 0;
|
int is_ref = 0;
|
||||||
|
|
||||||
if (EXPECTED(!Z_REFCOUNTED_P(variable_ptr))) {
|
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);
|
Z_OBJ_HANDLER_P(variable_ptr, set)(variable_ptr, value TSRMLS_CC);
|
||||||
} else if (EXPECTED(variable_ptr != value)) {
|
} else if (EXPECTED(variable_ptr != value)) {
|
||||||
if (Z_REFCOUNT_P(variable_ptr)==1) {
|
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 (EXPECTED(!Z_ISREF_P(value))) {
|
||||||
if (!is_ref) {
|
if (!is_ref) {
|
||||||
ZVAL_COPY(variable_ptr, value);
|
ZVAL_COPY(variable_ptr, value);
|
||||||
|
@ -992,15 +988,13 @@ static inline zval* zend_assign_to_variable(zval *variable_ptr, zval *value TSRM
|
||||||
} else {
|
} else {
|
||||||
if (Z_REFCOUNT_P(value) == 1) {
|
if (Z_REFCOUNT_P(value) == 1) {
|
||||||
//??? auto dereferencing
|
//??? auto dereferencing
|
||||||
zend_reference *ref = Z_REF_P(value);
|
ZVAL_UNREF(value);
|
||||||
ZVAL_COPY_VALUE(value, Z_REFVAL_P(value));
|
|
||||||
ZVAL_COPY(variable_ptr, value);
|
ZVAL_COPY(variable_ptr, value);
|
||||||
efree(ref);
|
|
||||||
} else {
|
} else {
|
||||||
ZVAL_DUP(variable_ptr, Z_REFVAL_P(value));
|
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 */
|
} else { /* we need to split */
|
||||||
Z_DELREF_P(variable_ptr);
|
Z_DELREF_P(variable_ptr);
|
||||||
GC_ZVAL_CHECK_POSSIBLE_ROOT(variable_ptr);
|
GC_ZVAL_CHECK_POSSIBLE_ROOT(variable_ptr);
|
||||||
|
@ -1015,10 +1009,8 @@ assign_simple:
|
||||||
assign_ref:
|
assign_ref:
|
||||||
if (Z_REFCOUNT_P(value) == 1) {
|
if (Z_REFCOUNT_P(value) == 1) {
|
||||||
//??? auto dereferencing
|
//??? auto dereferencing
|
||||||
zend_reference *ref = Z_REF_P(value);
|
ZVAL_UNREF(value);
|
||||||
ZVAL_COPY_VALUE(value, Z_REFVAL_P(value));
|
|
||||||
ZVAL_COPY(variable_ptr, value);
|
ZVAL_COPY(variable_ptr, value);
|
||||||
efree(ref);
|
|
||||||
} else {
|
} else {
|
||||||
ZVAL_DUP(variable_ptr, Z_REFVAL_P(value));
|
ZVAL_DUP(variable_ptr, Z_REFVAL_P(value));
|
||||||
}
|
}
|
||||||
|
|
|
@ -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)))) {
|
(type != IS_STRING || !IS_INTERNED(Z_STR_P(zval_ptr)))) {
|
||||||
if (!Z_DELREF_P(zval_ptr)) {
|
if (!Z_DELREF_P(zval_ptr)) {
|
||||||
ZEND_ASSERT(zval_ptr != &EG(uninitialized_zval));
|
ZEND_ASSERT(zval_ptr != &EG(uninitialized_zval));
|
||||||
GC_REMOVE_ZVAL_FROM_BUFFER(zval_ptr);
|
_zval_dtor_func_for_ptr(Z_COUNTED_P(zval_ptr) ZEND_FILE_LINE_CC);
|
||||||
_zval_dtor_func_for_ptr(zval_ptr ZEND_FILE_LINE_CC);
|
|
||||||
} else {
|
} else {
|
||||||
if (Z_REFCOUNT_P(zval_ptr) == 1 && Z_TYPE_P(zval_ptr) == IS_REFERENCE) {
|
if (Z_REFCOUNT_P(zval_ptr) == 1 && Z_TYPE_P(zval_ptr) == IS_REFERENCE) {
|
||||||
/* convert reference to regular value */
|
/* 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_REFCOUNTED_P(zval_ptr)) {
|
||||||
if (!Z_DELREF_P(zval_ptr)) {
|
if (!Z_DELREF_P(zval_ptr)) {
|
||||||
ZEND_ASSERT(zval_ptr != &EG(uninitialized_zval));
|
ZEND_ASSERT(zval_ptr != &EG(uninitialized_zval));
|
||||||
GC_REMOVE_ZVAL_FROM_BUFFER(zval_ptr);
|
_zval_dtor_func_for_ptr(Z_COUNTED_P(zval_ptr) ZEND_FILE_LINE_CC);
|
||||||
_zval_dtor_func_for_ptr(zval_ptr ZEND_FILE_LINE_CC);
|
|
||||||
} else {
|
} else {
|
||||||
if (Z_REFCOUNT_P(zval_ptr) == 1 && Z_TYPE_P(zval_ptr) == IS_REFERENCE) {
|
if (Z_REFCOUNT_P(zval_ptr) == 1 && Z_TYPE_P(zval_ptr) == IS_REFERENCE) {
|
||||||
/* convert reference to regular value */
|
/* convert reference to regular value */
|
||||||
|
|
940
Zend/zend_gc.c
940
Zend/zend_gc.c
File diff suppressed because it is too large
Load diff
|
@ -61,17 +61,17 @@
|
||||||
do {(v) = (v) | GC_COLOR;} while (0)
|
do {(v) = (v) | GC_COLOR;} while (0)
|
||||||
|
|
||||||
#define GC_ZVAL_ADDRESS(v) \
|
#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) \
|
#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) \
|
#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) \
|
#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) \
|
#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) \
|
#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 {
|
typedef struct _gc_root_buffer {
|
||||||
struct _gc_root_buffer *prev; /* double-linked list */
|
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 *first_unused; /* pointer to first unused buffer */
|
||||||
gc_root_buffer *last_unused; /* pointer to last unused buffer */
|
gc_root_buffer *last_unused; /* pointer to last unused buffer */
|
||||||
|
|
||||||
zend_refcounted *zval_to_free; /* temporary list of zvals to free */
|
gc_root_buffer to_free; /* list to free */
|
||||||
zend_refcounted *free_list;
|
gc_root_buffer *next_to_free;
|
||||||
zend_refcounted *next_to_free;
|
|
||||||
|
|
||||||
zend_uint gc_runs;
|
zend_uint gc_runs;
|
||||||
zend_uint collected;
|
zend_uint collected;
|
||||||
|
@ -100,13 +99,9 @@ typedef struct _zend_gc_globals {
|
||||||
zend_uint root_buf_length;
|
zend_uint root_buf_length;
|
||||||
zend_uint root_buf_peak;
|
zend_uint root_buf_peak;
|
||||||
zend_uint zval_possible_root;
|
zend_uint zval_possible_root;
|
||||||
zend_uint zobj_possible_root;
|
|
||||||
zend_uint zval_buffered;
|
zend_uint zval_buffered;
|
||||||
zend_uint zobj_buffered;
|
|
||||||
zend_uint zval_remove_from_buffer;
|
zend_uint zval_remove_from_buffer;
|
||||||
zend_uint zobj_remove_from_buffer;
|
|
||||||
zend_uint zval_marked_grey;
|
zend_uint zval_marked_grey;
|
||||||
zend_uint zobj_marked_grey;
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
} zend_gc_globals;
|
} zend_gc_globals;
|
||||||
|
@ -123,8 +118,8 @@ extern ZEND_API zend_gc_globals gc_globals;
|
||||||
|
|
||||||
BEGIN_EXTERN_C()
|
BEGIN_EXTERN_C()
|
||||||
ZEND_API int gc_collect_cycles(TSRMLS_D);
|
ZEND_API int gc_collect_cycles(TSRMLS_D);
|
||||||
ZEND_API void gc_zval_possible_root(zend_refcounted *ref TSRMLS_DC);
|
ZEND_API void gc_possible_root(zend_refcounted *ref TSRMLS_DC);
|
||||||
ZEND_API void gc_remove_zval_from_buffer(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_ctor(TSRMLS_D);
|
||||||
ZEND_API void gc_globals_dtor(TSRMLS_D);
|
ZEND_API void gc_globals_dtor(TSRMLS_D);
|
||||||
ZEND_API void gc_init(TSRMLS_D);
|
ZEND_API void gc_init(TSRMLS_D);
|
||||||
|
@ -132,24 +127,21 @@ ZEND_API void gc_reset(TSRMLS_D);
|
||||||
END_EXTERN_C()
|
END_EXTERN_C()
|
||||||
|
|
||||||
#define GC_ZVAL_CHECK_POSSIBLE_ROOT(z) \
|
#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 { \
|
#define GC_REMOVE_FROM_BUFFER(p) do { \
|
||||||
if (GC_ZVAL_ADDRESS(z)) { \
|
zend_refcounted *_p = (zend_refcounted*)(p); \
|
||||||
gc_remove_zval_from_buffer(Z_COUNTED_P(z) TSRMLS_CC); \
|
if (GC_ADDRESS(_p->u.v.gc_info)) { \
|
||||||
|
gc_remove_from_buffer(_p TSRMLS_CC); \
|
||||||
} \
|
} \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
#define GC_REMOVE_ZOBJ_FROM_BUFFER(z) do { \
|
static zend_always_inline void gc_check_possible_root(zval *z TSRMLS_DC)
|
||||||
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)
|
|
||||||
{
|
{
|
||||||
if (Z_TYPE_P(z) == IS_ARRAY || Z_TYPE_P(z) == IS_OBJECT) {
|
if (Z_TYPE_P(z) == IS_OBJECT ||
|
||||||
gc_zval_possible_root(Z_COUNTED_P(z) TSRMLS_CC);
|
(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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -207,6 +207,8 @@ static void zend_generator_free_storage(zend_object *object TSRMLS_DC) /* {{{ */
|
||||||
zend_generator_close(generator, 0 TSRMLS_CC);
|
zend_generator_close(generator, 0 TSRMLS_CC);
|
||||||
|
|
||||||
zend_object_std_dtor(&generator->std TSRMLS_CC);
|
zend_object_std_dtor(&generator->std TSRMLS_CC);
|
||||||
|
|
||||||
|
GC_REMOVE_FROM_BUFFER(generator);
|
||||||
efree(generator);
|
efree(generator);
|
||||||
}
|
}
|
||||||
/* }}} */
|
/* }}} */
|
||||||
|
|
|
@ -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.refcount = 1;
|
||||||
object->gc.u.v.type = IS_OBJECT;
|
object->gc.u.v.type = IS_OBJECT;
|
||||||
object->gc.u.v.flags = 0;
|
object->gc.u.v.flags = 0;
|
||||||
object->gc.u.v.buffer = 0;
|
object->gc.u.v.gc_info = 0;
|
||||||
object->ce = ce;
|
object->ce = ce;
|
||||||
object->properties = NULL;
|
object->properties = NULL;
|
||||||
object->guards = 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_API void zend_object_free(zend_object *object TSRMLS_DC)
|
||||||
{
|
{
|
||||||
zend_object_std_dtor(object TSRMLS_CC);
|
zend_object_std_dtor(object TSRMLS_CC);
|
||||||
|
GC_REMOVE_FROM_BUFFER(object);
|
||||||
efree(object);
|
efree(object);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -53,10 +53,6 @@ ZEND_API void zend_objects_store_call_destructors(zend_objects_store *objects TS
|
||||||
obj->gc.refcount++;
|
obj->gc.refcount++;
|
||||||
obj->handlers->dtor_obj(obj TSRMLS_CC);
|
obj->handlers->dtor_obj(obj TSRMLS_CC);
|
||||||
obj->gc.refcount--;
|
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];
|
zend_object *obj = objects->object_buckets[i];
|
||||||
|
|
||||||
if (IS_VALID(obj)) {
|
if (IS_VALID(obj)) {
|
||||||
GC_REMOVE_ZOBJ_FROM_BUFFER(obj TSRMLS_CC);
|
|
||||||
objects->object_buckets[i] = SET_INVALID(obj);
|
objects->object_buckets[i] = SET_INVALID(obj);
|
||||||
if (obj->handlers->free_obj) {
|
if (obj->handlers->free_obj) {
|
||||||
obj->handlers->free_obj(obj TSRMLS_CC);
|
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); \
|
SET_BUCKET_NUMBER(EG(objects_store).object_buckets[handle], EG(objects_store).free_list_head); \
|
||||||
EG(objects_store).free_list_head = handle;
|
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) /* {{{ */
|
ZEND_API void zend_objects_store_del(zend_object *object TSRMLS_DC) /* {{{ */
|
||||||
{
|
{
|
||||||
/* Make sure we hold a reference count during the destructor call
|
/* 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) {
|
if (object->gc.refcount == 0) {
|
||||||
zend_uint handle = object->handle;
|
zend_uint handle = object->handle;
|
||||||
|
|
||||||
//??? GC_REMOVE_ZOBJ_FROM_BUFFER(obj);
|
|
||||||
if (object->handlers->free_obj) {
|
if (object->handlers->free_obj) {
|
||||||
zend_try {
|
zend_try {
|
||||||
object->handlers->free_obj(object TSRMLS_CC);
|
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.refcount = 1;
|
||||||
obj->std.gc.u.v.type = IS_OBJECT;
|
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.ce = NULL;
|
||||||
obj->std.properties = NULL;
|
obj->std.properties = NULL;
|
||||||
obj->std.guards = NULL;
|
obj->std.guards = NULL;
|
||||||
|
|
|
@ -88,6 +88,7 @@ ZEND_API void zend_objects_store_destroy(zend_objects_store *objects);
|
||||||
/* Store API functions */
|
/* Store API functions */
|
||||||
ZEND_API void zend_objects_store_put(zend_object *object TSRMLS_DC);
|
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_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 */
|
/* 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);
|
ZEND_API void zend_object_store_set_object(zval *zobject, zend_object *object TSRMLS_DC);
|
||||||
|
|
|
@ -187,9 +187,7 @@ try_again:
|
||||||
switch (Z_TYPE_P(op)) {
|
switch (Z_TYPE_P(op)) {
|
||||||
case IS_REFERENCE:
|
case IS_REFERENCE:
|
||||||
if (Z_REFCOUNT_P(op) == 1) {
|
if (Z_REFCOUNT_P(op) == 1) {
|
||||||
zend_reference *ref = Z_REF_P(op);
|
ZVAL_UNREF(op);
|
||||||
ZVAL_COPY_VALUE(op, Z_REFVAL_P(op));
|
|
||||||
efree(ref);
|
|
||||||
} else {
|
} else {
|
||||||
Z_DELREF_P(op);
|
Z_DELREF_P(op);
|
||||||
ZVAL_COPY_VALUE(op, Z_REFVAL_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_REFCOUNTED_P(op)) {
|
||||||
if (Z_REFCOUNT_P(op) == 0) {
|
if (Z_REFCOUNT_P(op) == 0) {
|
||||||
GC_REMOVE_ZVAL_FROM_BUFFER(op);
|
|
||||||
zval_dtor(op);
|
zval_dtor(op);
|
||||||
} else {
|
} else {
|
||||||
zval_ptr_dtor(op);
|
zval_ptr_dtor(op);
|
||||||
|
|
|
@ -100,7 +100,7 @@ static zend_always_inline zend_string *zend_str_alloc(int len, int persistent)
|
||||||
ret->gc.refcount = 1;
|
ret->gc.refcount = 1;
|
||||||
ret->gc.u.v.type = IS_STRING;
|
ret->gc.u.v.type = IS_STRING;
|
||||||
ret->gc.u.v.flags = (persistent ? IS_STR_PERSISTENT : 0);
|
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->h = 0;
|
||||||
ret->len = len;
|
ret->len = len;
|
||||||
return ret;
|
return ret;
|
||||||
|
|
|
@ -103,10 +103,10 @@ struct _zend_refcounted {
|
||||||
struct {
|
struct {
|
||||||
zend_uchar type;
|
zend_uchar type;
|
||||||
zend_uchar flags; /* used for strings & objects */
|
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;
|
} v;
|
||||||
zend_uint long_type;
|
zend_uint long_type;
|
||||||
} u;
|
} u;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct _zend_string {
|
struct _zend_string {
|
||||||
|
@ -271,8 +271,8 @@ struct _zend_ast_ref {
|
||||||
#define Z_GC_TYPE(zval) Z_COUNTED(zval)->type
|
#define Z_GC_TYPE(zval) Z_COUNTED(zval)->type
|
||||||
#define Z_GC_TYPE_P(zval_p) Z_GC_TYPE(*(zval_p))
|
#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_INFO(zval) Z_COUNTED(zval)->u.v.gc_info
|
||||||
#define Z_GC_BUFFER_P(zval_p) Z_GC_BUFFER(*(zval_p))
|
#define Z_GC_INFO_P(zval_p) Z_GC_INFO(*(zval_p))
|
||||||
|
|
||||||
#define Z_STR(zval) (zval).value.str
|
#define Z_STR(zval) (zval).value.str
|
||||||
#define Z_STR_P(zval_p) Z_STR(*(zval_p))
|
#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)); \
|
zend_array *_arr = emalloc(sizeof(zend_array)); \
|
||||||
_arr->gc.refcount = 1; \
|
_arr->gc.refcount = 1; \
|
||||||
_arr->gc.u.v.type = IS_ARRAY; \
|
_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_ARR_P(__z) = _arr; \
|
||||||
Z_TYPE_P(__z) = IS_ARRAY; \
|
Z_TYPE_P(__z) = IS_ARRAY; \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
@ -405,7 +405,7 @@ struct _zend_ast_ref {
|
||||||
zend_array *_arr = malloc(sizeof(zend_array)); \
|
zend_array *_arr = malloc(sizeof(zend_array)); \
|
||||||
_arr->gc.refcount = 1; \
|
_arr->gc.refcount = 1; \
|
||||||
_arr->gc.u.v.type = IS_ARRAY; \
|
_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_ARR_P(__z) = _arr; \
|
||||||
Z_TYPE_P(__z) = IS_ARRAY; \
|
Z_TYPE_P(__z) = IS_ARRAY; \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
@ -426,7 +426,7 @@ struct _zend_ast_ref {
|
||||||
zend_resource *_res = emalloc(sizeof(zend_resource)); \
|
zend_resource *_res = emalloc(sizeof(zend_resource)); \
|
||||||
_res->gc.refcount = 1; \
|
_res->gc.refcount = 1; \
|
||||||
_res->gc.u.v.type = IS_RESOURCE; \
|
_res->gc.u.v.type = IS_RESOURCE; \
|
||||||
_res->gc.u.v.buffer = 0; \
|
_res->gc.u.v.gc_info = 0; \
|
||||||
_res->handle = (h); \
|
_res->handle = (h); \
|
||||||
_res->type = (t); \
|
_res->type = (t); \
|
||||||
_res->ptr = (p); \
|
_res->ptr = (p); \
|
||||||
|
@ -439,7 +439,7 @@ struct _zend_ast_ref {
|
||||||
zend_resource *_res = malloc(sizeof(zend_resource)); \
|
zend_resource *_res = malloc(sizeof(zend_resource)); \
|
||||||
_res->gc.refcount = 1; \
|
_res->gc.refcount = 1; \
|
||||||
_res->gc.u.v.type = IS_RESOURCE; \
|
_res->gc.u.v.type = IS_RESOURCE; \
|
||||||
_res->gc.u.v.buffer = 0; \
|
_res->gc.u.v.gc_info = 0; \
|
||||||
_res->handle = (h); \
|
_res->handle = (h); \
|
||||||
_res->type = (t); \
|
_res->type = (t); \
|
||||||
_res->ptr = (p); \
|
_res->ptr = (p); \
|
||||||
|
@ -458,7 +458,7 @@ struct _zend_ast_ref {
|
||||||
zend_reference *_ref = emalloc(sizeof(zend_reference)); \
|
zend_reference *_ref = emalloc(sizeof(zend_reference)); \
|
||||||
_ref->gc.refcount = 1; \
|
_ref->gc.refcount = 1; \
|
||||||
_ref->gc.u.v.type = IS_REFERENCE; \
|
_ref->gc.u.v.type = IS_REFERENCE; \
|
||||||
_ref->gc.u.v.buffer = 0; \
|
_ref->gc.u.v.gc_info = 0; \
|
||||||
_ref->val = *(r); \
|
_ref->val = *(r); \
|
||||||
Z_REF_P(z) = _ref; \
|
Z_REF_P(z) = _ref; \
|
||||||
Z_TYPE_P(z) = IS_REFERENCE; \
|
Z_TYPE_P(z) = IS_REFERENCE; \
|
||||||
|
@ -469,7 +469,7 @@ struct _zend_ast_ref {
|
||||||
zend_ast_ref *_ast = emalloc(sizeof(zend_ast_ref)); \
|
zend_ast_ref *_ast = emalloc(sizeof(zend_ast_ref)); \
|
||||||
_ast->gc.refcount = 1; \
|
_ast->gc.refcount = 1; \
|
||||||
_ast->gc.u.v.type = IS_CONSTANT_AST; \
|
_ast->gc.u.v.type = IS_CONSTANT_AST; \
|
||||||
_ast->gc.u.v.buffer = 0; \
|
_ast->gc.u.v.gc_info = 0; \
|
||||||
_ast->ast = (a); \
|
_ast->ast = (a); \
|
||||||
Z_AST_P(__z) = _ast; \
|
Z_AST_P(__z) = _ast; \
|
||||||
Z_TYPE_P(__z) = IS_CONSTANT_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)); \
|
zend_str_offset *x = emalloc(sizeof(zend_str_offset)); \
|
||||||
x->gc.refcount = 1; \
|
x->gc.refcount = 1; \
|
||||||
x->gc.u.v.type = IS_STR_OFFSET; \
|
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->str = (s); \
|
||||||
x->offset = (o); \
|
x->offset = (o); \
|
||||||
Z_STR_OFFSET_P(z) = x; \
|
Z_STR_OFFSET_P(z) = x; \
|
||||||
|
|
|
@ -27,114 +27,132 @@
|
||||||
#include "zend_constants.h"
|
#include "zend_constants.h"
|
||||||
#include "zend_list.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_STRING:
|
||||||
case IS_CONSTANT:
|
case IS_CONSTANT: {
|
||||||
CHECK_ZVAL_STRING_REL(zvalue);
|
zend_string *str = (zend_string*)p;
|
||||||
STR_RELEASE(Z_STR_P(zvalue));
|
//??? CHECK_ZVAL_STRING_REL(zvalue);
|
||||||
break;
|
STR_RELEASE(str);
|
||||||
|
goto exit;
|
||||||
|
}
|
||||||
case IS_ARRAY:
|
case IS_ARRAY:
|
||||||
case IS_CONSTANT_ARRAY: {
|
case IS_CONSTANT_ARRAY: {
|
||||||
|
zend_array *arr =(zend_array*)p;
|
||||||
TSRMLS_FETCH();
|
TSRMLS_FETCH();
|
||||||
|
|
||||||
if (Z_ARRVAL_P(zvalue) != &EG(symbol_table).ht) {
|
if (arr != &EG(symbol_table)) {
|
||||||
/* break possible cycles */
|
/* break possible cycles */
|
||||||
Z_TYPE_P(zvalue) = IS_NULL;
|
arr->gc.u.v.type = IS_NULL;
|
||||||
zend_hash_destroy(Z_ARRVAL_P(zvalue));
|
zend_hash_destroy(&arr->ht);
|
||||||
efree(Z_ARR_P(zvalue));
|
goto gc_exit;
|
||||||
}
|
}
|
||||||
|
goto exit;
|
||||||
}
|
}
|
||||||
break;
|
case IS_CONSTANT_AST: {
|
||||||
case IS_CONSTANT_AST:
|
zend_ast_ref *ast =(zend_ast_ref*)p;
|
||||||
zend_ast_destroy(Z_AST_P(zvalue)->ast);
|
|
||||||
efree(Z_AST_P(zvalue));
|
zend_ast_destroy(ast->ast);
|
||||||
break;
|
efree(ast);
|
||||||
case IS_OBJECT:
|
goto exit;
|
||||||
{
|
}
|
||||||
|
case IS_OBJECT: {
|
||||||
|
zend_object *obj = (zend_object*)p;
|
||||||
TSRMLS_FETCH();
|
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();
|
TSRMLS_FETCH();
|
||||||
|
|
||||||
if (Z_DELREF_P(zvalue) == 0) {
|
if (--res->gc.refcount == 0) {
|
||||||
/* destroy resource */
|
/* destroy resource */
|
||||||
zend_list_delete(Z_RES_P(zvalue));
|
zend_list_delete(res);
|
||||||
}
|
}
|
||||||
|
goto exit;
|
||||||
}
|
}
|
||||||
break;
|
case IS_REFERENCE: {
|
||||||
case IS_REFERENCE:
|
zend_reference *ref = (zend_reference*)p;
|
||||||
if (Z_DELREF_P(zvalue) == 0) {
|
if (--ref->gc.refcount == 0) {
|
||||||
zval_dtor(Z_REFVAL_P(zvalue));
|
zval_dtor(&ref->val);
|
||||||
efree(Z_REF_P(zvalue));
|
goto gc_exit;
|
||||||
|
}
|
||||||
|
goto exit;
|
||||||
}
|
}
|
||||||
break;
|
|
||||||
case IS_LONG:
|
|
||||||
case IS_DOUBLE:
|
|
||||||
case IS_BOOL:
|
|
||||||
case IS_NULL:
|
|
||||||
default:
|
default:
|
||||||
return;
|
goto exit;
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
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_STRING:
|
||||||
case IS_CONSTANT:
|
case IS_CONSTANT: {
|
||||||
CHECK_ZVAL_STRING_REL(zvalue);
|
zend_string *str = (zend_string*)p;
|
||||||
STR_FREE(Z_STR_P(zvalue));
|
//??? CHECK_ZVAL_STRING_REL(zvalue);
|
||||||
break;
|
STR_FREE(str);
|
||||||
|
goto exit;
|
||||||
|
}
|
||||||
case IS_ARRAY:
|
case IS_ARRAY:
|
||||||
case IS_CONSTANT_ARRAY: {
|
case IS_CONSTANT_ARRAY: {
|
||||||
|
zend_array *arr =(zend_array*)p;
|
||||||
TSRMLS_FETCH();
|
TSRMLS_FETCH();
|
||||||
|
|
||||||
if (Z_ARRVAL_P(zvalue) != &EG(symbol_table).ht) {
|
if (arr != &EG(symbol_table)) {
|
||||||
/* break possible cycles */
|
/* break possible cycles */
|
||||||
Z_TYPE_P(zvalue) = IS_NULL;
|
arr->gc.u.v.type = IS_NULL;
|
||||||
zend_hash_destroy(Z_ARRVAL_P(zvalue));
|
zend_hash_destroy(&arr->ht);
|
||||||
efree(Z_ARR_P(zvalue));
|
goto gc_exit;
|
||||||
}
|
}
|
||||||
|
goto exit;
|
||||||
}
|
}
|
||||||
break;
|
case IS_CONSTANT_AST: {
|
||||||
case IS_CONSTANT_AST:
|
zend_ast_ref *ast =(zend_ast_ref*)p;
|
||||||
zend_ast_destroy(Z_AST_P(zvalue)->ast);
|
|
||||||
efree(Z_AST_P(zvalue));
|
zend_ast_destroy(ast->ast);
|
||||||
break;
|
efree(ast);
|
||||||
case IS_OBJECT:
|
goto exit;
|
||||||
{
|
}
|
||||||
|
case IS_OBJECT: {
|
||||||
|
zend_object *obj = (zend_object*)p;
|
||||||
TSRMLS_FETCH();
|
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();
|
TSRMLS_FETCH();
|
||||||
|
|
||||||
/* destroy resource */
|
/* 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:
|
default:
|
||||||
return;
|
goto exit;
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
gc_exit:
|
||||||
|
GC_REMOVE_FROM_BUFFER(p);
|
||||||
|
efree(p);
|
||||||
|
exit:
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
ZEND_API void _zval_internal_dtor(zval *zvalue ZEND_FILE_LINE_DC)
|
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();
|
TSRMLS_FETCH();
|
||||||
|
|
||||||
GC_REMOVE_ZVAL_FROM_BUFFER(zvalue);
|
|
||||||
zval_dtor(zvalue);
|
zval_dtor(zvalue);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -25,15 +25,15 @@
|
||||||
|
|
||||||
BEGIN_EXTERN_C()
|
BEGIN_EXTERN_C()
|
||||||
|
|
||||||
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);
|
||||||
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);
|
||||||
|
|
||||||
static zend_always_inline void _zval_dtor(zval *zvalue ZEND_FILE_LINE_DC)
|
static zend_always_inline void _zval_dtor(zval *zvalue ZEND_FILE_LINE_DC)
|
||||||
{
|
{
|
||||||
if (!Z_REFCOUNTED_P(zvalue)) {
|
if (!Z_REFCOUNTED_P(zvalue)) {
|
||||||
return;
|
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);
|
ZEND_API void _zval_copy_ctor_func(zval *zvalue ZEND_FILE_LINE_DC);
|
||||||
|
|
|
@ -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);
|
zval *value = Z_OBJ_HT_P(z)->get(z TSRMLS_CC);
|
||||||
|
|
||||||
if (Z_REFCOUNT_P(z) == 0) {
|
if (Z_REFCOUNT_P(z) == 0) {
|
||||||
GC_REMOVE_ZVAL_FROM_BUFFER(z);
|
|
||||||
zval_dtor(z);
|
zval_dtor(z);
|
||||||
}
|
}
|
||||||
z = value;
|
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);
|
zval *value = Z_OBJ_HT_P(z)->get(z TSRMLS_CC);
|
||||||
|
|
||||||
if (Z_REFCOUNT_P(z) == 0) {
|
if (Z_REFCOUNT_P(z) == 0) {
|
||||||
GC_REMOVE_ZVAL_FROM_BUFFER(z);
|
|
||||||
zval_dtor(z);
|
zval_dtor(z);
|
||||||
}
|
}
|
||||||
z = value;
|
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);
|
zval *value = Z_OBJ_HT_P(z)->get(z TSRMLS_CC);
|
||||||
|
|
||||||
if (Z_REFCOUNT_P(z) == 0) {
|
if (Z_REFCOUNT_P(z) == 0) {
|
||||||
GC_REMOVE_ZVAL_FROM_BUFFER(z);
|
|
||||||
zval_dtor(z);
|
zval_dtor(z);
|
||||||
}
|
}
|
||||||
z = value;
|
z = value;
|
||||||
|
@ -4368,16 +4365,11 @@ ZEND_VM_HANDLER(77, ZEND_FE_RESET, CONST|TMP|VAR|CV, ANY)
|
||||||
//??? dereference
|
//??? dereference
|
||||||
if (Z_ISREF_P(array_ref)) {
|
if (Z_ISREF_P(array_ref)) {
|
||||||
if (Z_REFCOUNT_P(array_ref) == 1) {
|
if (Z_REFCOUNT_P(array_ref) == 1) {
|
||||||
zend_reference *ref = Z_REF_P(array_ref);
|
ZVAL_UNREF(array_ref);
|
||||||
ZVAL_COPY(array_ref, &ref->val);
|
|
||||||
efree(ref);
|
|
||||||
array_ptr = array_ref;
|
array_ptr = array_ref;
|
||||||
} else {
|
|
||||||
Z_ADDREF_P(array_ref);
|
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
Z_ADDREF_P(array_ref);
|
|
||||||
}
|
}
|
||||||
|
Z_ADDREF_P(array_ref);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -3079,16 +3079,11 @@ static int ZEND_FASTCALL ZEND_FE_RESET_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_A
|
||||||
//??? dereference
|
//??? dereference
|
||||||
if (Z_ISREF_P(array_ref)) {
|
if (Z_ISREF_P(array_ref)) {
|
||||||
if (Z_REFCOUNT_P(array_ref) == 1) {
|
if (Z_REFCOUNT_P(array_ref) == 1) {
|
||||||
zend_reference *ref = Z_REF_P(array_ref);
|
ZVAL_UNREF(array_ref);
|
||||||
ZVAL_COPY(array_ref, &ref->val);
|
|
||||||
efree(ref);
|
|
||||||
array_ptr = 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
|
//??? dereference
|
||||||
if (Z_ISREF_P(array_ref)) {
|
if (Z_ISREF_P(array_ref)) {
|
||||||
if (Z_REFCOUNT_P(array_ref) == 1) {
|
if (Z_REFCOUNT_P(array_ref) == 1) {
|
||||||
zend_reference *ref = Z_REF_P(array_ref);
|
ZVAL_UNREF(array_ref);
|
||||||
ZVAL_COPY(array_ref, &ref->val);
|
|
||||||
efree(ref);
|
|
||||||
array_ptr = 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
|
//??? dereference
|
||||||
if (Z_ISREF_P(array_ref)) {
|
if (Z_ISREF_P(array_ref)) {
|
||||||
if (Z_REFCOUNT_P(array_ref) == 1) {
|
if (Z_REFCOUNT_P(array_ref) == 1) {
|
||||||
zend_reference *ref = Z_REF_P(array_ref);
|
ZVAL_UNREF(array_ref);
|
||||||
ZVAL_COPY(array_ref, &ref->val);
|
|
||||||
efree(ref);
|
|
||||||
array_ptr = 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);
|
zval *value = Z_OBJ_HT_P(z)->get(z TSRMLS_CC);
|
||||||
|
|
||||||
if (Z_REFCOUNT_P(z) == 0) {
|
if (Z_REFCOUNT_P(z) == 0) {
|
||||||
GC_REMOVE_ZVAL_FROM_BUFFER(z);
|
|
||||||
zval_dtor(z);
|
zval_dtor(z);
|
||||||
}
|
}
|
||||||
z = value;
|
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);
|
zval *value = Z_OBJ_HT_P(z)->get(z TSRMLS_CC);
|
||||||
|
|
||||||
if (Z_REFCOUNT_P(z) == 0) {
|
if (Z_REFCOUNT_P(z) == 0) {
|
||||||
GC_REMOVE_ZVAL_FROM_BUFFER(z);
|
|
||||||
zval_dtor(z);
|
zval_dtor(z);
|
||||||
}
|
}
|
||||||
z = value;
|
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);
|
zval *value = Z_OBJ_HT_P(z)->get(z TSRMLS_CC);
|
||||||
|
|
||||||
if (Z_REFCOUNT_P(z) == 0) {
|
if (Z_REFCOUNT_P(z) == 0) {
|
||||||
GC_REMOVE_ZVAL_FROM_BUFFER(z);
|
|
||||||
zval_dtor(z);
|
zval_dtor(z);
|
||||||
}
|
}
|
||||||
z = value;
|
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);
|
zval *value = Z_OBJ_HT_P(z)->get(z TSRMLS_CC);
|
||||||
|
|
||||||
if (Z_REFCOUNT_P(z) == 0) {
|
if (Z_REFCOUNT_P(z) == 0) {
|
||||||
GC_REMOVE_ZVAL_FROM_BUFFER(z);
|
|
||||||
zval_dtor(z);
|
zval_dtor(z);
|
||||||
}
|
}
|
||||||
z = value;
|
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);
|
zval *value = Z_OBJ_HT_P(z)->get(z TSRMLS_CC);
|
||||||
|
|
||||||
if (Z_REFCOUNT_P(z) == 0) {
|
if (Z_REFCOUNT_P(z) == 0) {
|
||||||
GC_REMOVE_ZVAL_FROM_BUFFER(z);
|
|
||||||
zval_dtor(z);
|
zval_dtor(z);
|
||||||
}
|
}
|
||||||
z = value;
|
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);
|
zval *value = Z_OBJ_HT_P(z)->get(z TSRMLS_CC);
|
||||||
|
|
||||||
if (Z_REFCOUNT_P(z) == 0) {
|
if (Z_REFCOUNT_P(z) == 0) {
|
||||||
GC_REMOVE_ZVAL_FROM_BUFFER(z);
|
|
||||||
zval_dtor(z);
|
zval_dtor(z);
|
||||||
}
|
}
|
||||||
z = value;
|
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);
|
zval *value = Z_OBJ_HT_P(z)->get(z TSRMLS_CC);
|
||||||
|
|
||||||
if (Z_REFCOUNT_P(z) == 0) {
|
if (Z_REFCOUNT_P(z) == 0) {
|
||||||
GC_REMOVE_ZVAL_FROM_BUFFER(z);
|
|
||||||
zval_dtor(z);
|
zval_dtor(z);
|
||||||
}
|
}
|
||||||
z = value;
|
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);
|
zval *value = Z_OBJ_HT_P(z)->get(z TSRMLS_CC);
|
||||||
|
|
||||||
if (Z_REFCOUNT_P(z) == 0) {
|
if (Z_REFCOUNT_P(z) == 0) {
|
||||||
GC_REMOVE_ZVAL_FROM_BUFFER(z);
|
|
||||||
zval_dtor(z);
|
zval_dtor(z);
|
||||||
}
|
}
|
||||||
z = value;
|
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);
|
zval *value = Z_OBJ_HT_P(z)->get(z TSRMLS_CC);
|
||||||
|
|
||||||
if (Z_REFCOUNT_P(z) == 0) {
|
if (Z_REFCOUNT_P(z) == 0) {
|
||||||
GC_REMOVE_ZVAL_FROM_BUFFER(z);
|
|
||||||
zval_dtor(z);
|
zval_dtor(z);
|
||||||
}
|
}
|
||||||
z = value;
|
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);
|
zval *value = Z_OBJ_HT_P(z)->get(z TSRMLS_CC);
|
||||||
|
|
||||||
if (Z_REFCOUNT_P(z) == 0) {
|
if (Z_REFCOUNT_P(z) == 0) {
|
||||||
GC_REMOVE_ZVAL_FROM_BUFFER(z);
|
|
||||||
zval_dtor(z);
|
zval_dtor(z);
|
||||||
}
|
}
|
||||||
z = value;
|
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);
|
zval *value = Z_OBJ_HT_P(z)->get(z TSRMLS_CC);
|
||||||
|
|
||||||
if (Z_REFCOUNT_P(z) == 0) {
|
if (Z_REFCOUNT_P(z) == 0) {
|
||||||
GC_REMOVE_ZVAL_FROM_BUFFER(z);
|
|
||||||
zval_dtor(z);
|
zval_dtor(z);
|
||||||
}
|
}
|
||||||
z = value;
|
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);
|
zval *value = Z_OBJ_HT_P(z)->get(z TSRMLS_CC);
|
||||||
|
|
||||||
if (Z_REFCOUNT_P(z) == 0) {
|
if (Z_REFCOUNT_P(z) == 0) {
|
||||||
GC_REMOVE_ZVAL_FROM_BUFFER(z);
|
|
||||||
zval_dtor(z);
|
zval_dtor(z);
|
||||||
}
|
}
|
||||||
z = value;
|
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);
|
zval *value = Z_OBJ_HT_P(z)->get(z TSRMLS_CC);
|
||||||
|
|
||||||
if (Z_REFCOUNT_P(z) == 0) {
|
if (Z_REFCOUNT_P(z) == 0) {
|
||||||
GC_REMOVE_ZVAL_FROM_BUFFER(z);
|
|
||||||
zval_dtor(z);
|
zval_dtor(z);
|
||||||
}
|
}
|
||||||
z = value;
|
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);
|
zval *value = Z_OBJ_HT_P(z)->get(z TSRMLS_CC);
|
||||||
|
|
||||||
if (Z_REFCOUNT_P(z) == 0) {
|
if (Z_REFCOUNT_P(z) == 0) {
|
||||||
GC_REMOVE_ZVAL_FROM_BUFFER(z);
|
|
||||||
zval_dtor(z);
|
zval_dtor(z);
|
||||||
}
|
}
|
||||||
z = value;
|
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);
|
zval *value = Z_OBJ_HT_P(z)->get(z TSRMLS_CC);
|
||||||
|
|
||||||
if (Z_REFCOUNT_P(z) == 0) {
|
if (Z_REFCOUNT_P(z) == 0) {
|
||||||
GC_REMOVE_ZVAL_FROM_BUFFER(z);
|
|
||||||
zval_dtor(z);
|
zval_dtor(z);
|
||||||
}
|
}
|
||||||
z = value;
|
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);
|
zval *value = Z_OBJ_HT_P(z)->get(z TSRMLS_CC);
|
||||||
|
|
||||||
if (Z_REFCOUNT_P(z) == 0) {
|
if (Z_REFCOUNT_P(z) == 0) {
|
||||||
GC_REMOVE_ZVAL_FROM_BUFFER(z);
|
|
||||||
zval_dtor(z);
|
zval_dtor(z);
|
||||||
}
|
}
|
||||||
z = value;
|
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);
|
zval *value = Z_OBJ_HT_P(z)->get(z TSRMLS_CC);
|
||||||
|
|
||||||
if (Z_REFCOUNT_P(z) == 0) {
|
if (Z_REFCOUNT_P(z) == 0) {
|
||||||
GC_REMOVE_ZVAL_FROM_BUFFER(z);
|
|
||||||
zval_dtor(z);
|
zval_dtor(z);
|
||||||
}
|
}
|
||||||
z = value;
|
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);
|
zval *value = Z_OBJ_HT_P(z)->get(z TSRMLS_CC);
|
||||||
|
|
||||||
if (Z_REFCOUNT_P(z) == 0) {
|
if (Z_REFCOUNT_P(z) == 0) {
|
||||||
GC_REMOVE_ZVAL_FROM_BUFFER(z);
|
|
||||||
zval_dtor(z);
|
zval_dtor(z);
|
||||||
}
|
}
|
||||||
z = value;
|
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);
|
zval *value = Z_OBJ_HT_P(z)->get(z TSRMLS_CC);
|
||||||
|
|
||||||
if (Z_REFCOUNT_P(z) == 0) {
|
if (Z_REFCOUNT_P(z) == 0) {
|
||||||
GC_REMOVE_ZVAL_FROM_BUFFER(z);
|
|
||||||
zval_dtor(z);
|
zval_dtor(z);
|
||||||
}
|
}
|
||||||
z = value;
|
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);
|
zval *value = Z_OBJ_HT_P(z)->get(z TSRMLS_CC);
|
||||||
|
|
||||||
if (Z_REFCOUNT_P(z) == 0) {
|
if (Z_REFCOUNT_P(z) == 0) {
|
||||||
GC_REMOVE_ZVAL_FROM_BUFFER(z);
|
|
||||||
zval_dtor(z);
|
zval_dtor(z);
|
||||||
}
|
}
|
||||||
z = value;
|
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);
|
zval *value = Z_OBJ_HT_P(z)->get(z TSRMLS_CC);
|
||||||
|
|
||||||
if (Z_REFCOUNT_P(z) == 0) {
|
if (Z_REFCOUNT_P(z) == 0) {
|
||||||
GC_REMOVE_ZVAL_FROM_BUFFER(z);
|
|
||||||
zval_dtor(z);
|
zval_dtor(z);
|
||||||
}
|
}
|
||||||
z = value;
|
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);
|
zval *value = Z_OBJ_HT_P(z)->get(z TSRMLS_CC);
|
||||||
|
|
||||||
if (Z_REFCOUNT_P(z) == 0) {
|
if (Z_REFCOUNT_P(z) == 0) {
|
||||||
GC_REMOVE_ZVAL_FROM_BUFFER(z);
|
|
||||||
zval_dtor(z);
|
zval_dtor(z);
|
||||||
}
|
}
|
||||||
z = value;
|
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);
|
zval *value = Z_OBJ_HT_P(z)->get(z TSRMLS_CC);
|
||||||
|
|
||||||
if (Z_REFCOUNT_P(z) == 0) {
|
if (Z_REFCOUNT_P(z) == 0) {
|
||||||
GC_REMOVE_ZVAL_FROM_BUFFER(z);
|
|
||||||
zval_dtor(z);
|
zval_dtor(z);
|
||||||
}
|
}
|
||||||
z = value;
|
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);
|
zval *value = Z_OBJ_HT_P(z)->get(z TSRMLS_CC);
|
||||||
|
|
||||||
if (Z_REFCOUNT_P(z) == 0) {
|
if (Z_REFCOUNT_P(z) == 0) {
|
||||||
GC_REMOVE_ZVAL_FROM_BUFFER(z);
|
|
||||||
zval_dtor(z);
|
zval_dtor(z);
|
||||||
}
|
}
|
||||||
z = value;
|
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);
|
zval *value = Z_OBJ_HT_P(z)->get(z TSRMLS_CC);
|
||||||
|
|
||||||
if (Z_REFCOUNT_P(z) == 0) {
|
if (Z_REFCOUNT_P(z) == 0) {
|
||||||
GC_REMOVE_ZVAL_FROM_BUFFER(z);
|
|
||||||
zval_dtor(z);
|
zval_dtor(z);
|
||||||
}
|
}
|
||||||
z = value;
|
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);
|
zval *value = Z_OBJ_HT_P(z)->get(z TSRMLS_CC);
|
||||||
|
|
||||||
if (Z_REFCOUNT_P(z) == 0) {
|
if (Z_REFCOUNT_P(z) == 0) {
|
||||||
GC_REMOVE_ZVAL_FROM_BUFFER(z);
|
|
||||||
zval_dtor(z);
|
zval_dtor(z);
|
||||||
}
|
}
|
||||||
z = value;
|
z = value;
|
||||||
|
@ -30907,16 +30866,11 @@ static int ZEND_FASTCALL ZEND_FE_RESET_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS
|
||||||
//??? dereference
|
//??? dereference
|
||||||
if (Z_ISREF_P(array_ref)) {
|
if (Z_ISREF_P(array_ref)) {
|
||||||
if (Z_REFCOUNT_P(array_ref) == 1) {
|
if (Z_REFCOUNT_P(array_ref) == 1) {
|
||||||
zend_reference *ref = Z_REF_P(array_ref);
|
ZVAL_UNREF(array_ref);
|
||||||
ZVAL_COPY(array_ref, &ref->val);
|
|
||||||
efree(ref);
|
|
||||||
array_ptr = 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);
|
zval *value = Z_OBJ_HT_P(z)->get(z TSRMLS_CC);
|
||||||
|
|
||||||
if (Z_REFCOUNT_P(z) == 0) {
|
if (Z_REFCOUNT_P(z) == 0) {
|
||||||
GC_REMOVE_ZVAL_FROM_BUFFER(z);
|
|
||||||
zval_dtor(z);
|
zval_dtor(z);
|
||||||
}
|
}
|
||||||
z = value;
|
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);
|
zval *value = Z_OBJ_HT_P(z)->get(z TSRMLS_CC);
|
||||||
|
|
||||||
if (Z_REFCOUNT_P(z) == 0) {
|
if (Z_REFCOUNT_P(z) == 0) {
|
||||||
GC_REMOVE_ZVAL_FROM_BUFFER(z);
|
|
||||||
zval_dtor(z);
|
zval_dtor(z);
|
||||||
}
|
}
|
||||||
z = value;
|
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);
|
zval *value = Z_OBJ_HT_P(z)->get(z TSRMLS_CC);
|
||||||
|
|
||||||
if (Z_REFCOUNT_P(z) == 0) {
|
if (Z_REFCOUNT_P(z) == 0) {
|
||||||
GC_REMOVE_ZVAL_FROM_BUFFER(z);
|
|
||||||
zval_dtor(z);
|
zval_dtor(z);
|
||||||
}
|
}
|
||||||
z = value;
|
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);
|
zval *value = Z_OBJ_HT_P(z)->get(z TSRMLS_CC);
|
||||||
|
|
||||||
if (Z_REFCOUNT_P(z) == 0) {
|
if (Z_REFCOUNT_P(z) == 0) {
|
||||||
GC_REMOVE_ZVAL_FROM_BUFFER(z);
|
|
||||||
zval_dtor(z);
|
zval_dtor(z);
|
||||||
}
|
}
|
||||||
z = value;
|
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);
|
zval *value = Z_OBJ_HT_P(z)->get(z TSRMLS_CC);
|
||||||
|
|
||||||
if (Z_REFCOUNT_P(z) == 0) {
|
if (Z_REFCOUNT_P(z) == 0) {
|
||||||
GC_REMOVE_ZVAL_FROM_BUFFER(z);
|
|
||||||
zval_dtor(z);
|
zval_dtor(z);
|
||||||
}
|
}
|
||||||
z = value;
|
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);
|
zval *value = Z_OBJ_HT_P(z)->get(z TSRMLS_CC);
|
||||||
|
|
||||||
if (Z_REFCOUNT_P(z) == 0) {
|
if (Z_REFCOUNT_P(z) == 0) {
|
||||||
GC_REMOVE_ZVAL_FROM_BUFFER(z);
|
|
||||||
zval_dtor(z);
|
zval_dtor(z);
|
||||||
}
|
}
|
||||||
z = value;
|
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);
|
zval *value = Z_OBJ_HT_P(z)->get(z TSRMLS_CC);
|
||||||
|
|
||||||
if (Z_REFCOUNT_P(z) == 0) {
|
if (Z_REFCOUNT_P(z) == 0) {
|
||||||
GC_REMOVE_ZVAL_FROM_BUFFER(z);
|
|
||||||
zval_dtor(z);
|
zval_dtor(z);
|
||||||
}
|
}
|
||||||
z = value;
|
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);
|
zval *value = Z_OBJ_HT_P(z)->get(z TSRMLS_CC);
|
||||||
|
|
||||||
if (Z_REFCOUNT_P(z) == 0) {
|
if (Z_REFCOUNT_P(z) == 0) {
|
||||||
GC_REMOVE_ZVAL_FROM_BUFFER(z);
|
|
||||||
zval_dtor(z);
|
zval_dtor(z);
|
||||||
}
|
}
|
||||||
z = value;
|
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);
|
zval *value = Z_OBJ_HT_P(z)->get(z TSRMLS_CC);
|
||||||
|
|
||||||
if (Z_REFCOUNT_P(z) == 0) {
|
if (Z_REFCOUNT_P(z) == 0) {
|
||||||
GC_REMOVE_ZVAL_FROM_BUFFER(z);
|
|
||||||
zval_dtor(z);
|
zval_dtor(z);
|
||||||
}
|
}
|
||||||
z = value;
|
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);
|
zval *value = Z_OBJ_HT_P(z)->get(z TSRMLS_CC);
|
||||||
|
|
||||||
if (Z_REFCOUNT_P(z) == 0) {
|
if (Z_REFCOUNT_P(z) == 0) {
|
||||||
GC_REMOVE_ZVAL_FROM_BUFFER(z);
|
|
||||||
zval_dtor(z);
|
zval_dtor(z);
|
||||||
}
|
}
|
||||||
z = value;
|
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);
|
zval *value = Z_OBJ_HT_P(z)->get(z TSRMLS_CC);
|
||||||
|
|
||||||
if (Z_REFCOUNT_P(z) == 0) {
|
if (Z_REFCOUNT_P(z) == 0) {
|
||||||
GC_REMOVE_ZVAL_FROM_BUFFER(z);
|
|
||||||
zval_dtor(z);
|
zval_dtor(z);
|
||||||
}
|
}
|
||||||
z = value;
|
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);
|
zval *value = Z_OBJ_HT_P(z)->get(z TSRMLS_CC);
|
||||||
|
|
||||||
if (Z_REFCOUNT_P(z) == 0) {
|
if (Z_REFCOUNT_P(z) == 0) {
|
||||||
GC_REMOVE_ZVAL_FROM_BUFFER(z);
|
|
||||||
zval_dtor(z);
|
zval_dtor(z);
|
||||||
}
|
}
|
||||||
z = value;
|
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);
|
zval *value = Z_OBJ_HT_P(z)->get(z TSRMLS_CC);
|
||||||
|
|
||||||
if (Z_REFCOUNT_P(z) == 0) {
|
if (Z_REFCOUNT_P(z) == 0) {
|
||||||
GC_REMOVE_ZVAL_FROM_BUFFER(z);
|
|
||||||
zval_dtor(z);
|
zval_dtor(z);
|
||||||
}
|
}
|
||||||
z = value;
|
z = value;
|
||||||
|
|
|
@ -2440,6 +2440,7 @@ static void date_object_free_storage_date(zend_object *object TSRMLS_DC) /* {{{
|
||||||
}
|
}
|
||||||
|
|
||||||
zend_object_std_dtor(&intern->std TSRMLS_CC);
|
zend_object_std_dtor(&intern->std TSRMLS_CC);
|
||||||
|
GC_REMOVE_FROM_BUFFER(object);
|
||||||
efree(intern);
|
efree(intern);
|
||||||
} /* }}} */
|
} /* }}} */
|
||||||
|
|
||||||
|
@ -2451,6 +2452,7 @@ static void date_object_free_storage_timezone(zend_object *object TSRMLS_DC) /*
|
||||||
free(intern->tzi.z.abbr);
|
free(intern->tzi.z.abbr);
|
||||||
}
|
}
|
||||||
zend_object_std_dtor(&intern->std TSRMLS_CC);
|
zend_object_std_dtor(&intern->std TSRMLS_CC);
|
||||||
|
GC_REMOVE_FROM_BUFFER(object);
|
||||||
efree(intern);
|
efree(intern);
|
||||||
} /* }}} */
|
} /* }}} */
|
||||||
|
|
||||||
|
@ -2460,6 +2462,7 @@ static void date_object_free_storage_interval(zend_object *object TSRMLS_DC) /*
|
||||||
|
|
||||||
timelib_rel_time_dtor(intern->diff);
|
timelib_rel_time_dtor(intern->diff);
|
||||||
zend_object_std_dtor(&intern->std TSRMLS_CC);
|
zend_object_std_dtor(&intern->std TSRMLS_CC);
|
||||||
|
GC_REMOVE_FROM_BUFFER(object);
|
||||||
efree(intern);
|
efree(intern);
|
||||||
} /* }}} */
|
} /* }}} */
|
||||||
|
|
||||||
|
@ -2481,6 +2484,7 @@ static void date_object_free_storage_period(zend_object *object TSRMLS_DC) /* {{
|
||||||
|
|
||||||
timelib_rel_time_dtor(intern->interval);
|
timelib_rel_time_dtor(intern->interval);
|
||||||
zend_object_std_dtor(&intern->std TSRMLS_CC);
|
zend_object_std_dtor(&intern->std TSRMLS_CC);
|
||||||
|
GC_REMOVE_FROM_BUFFER(object);
|
||||||
efree(intern);
|
efree(intern);
|
||||||
} /* }}} */
|
} /* }}} */
|
||||||
|
|
||||||
|
|
|
@ -319,6 +319,7 @@ static void reflection_free_objects_storage(zend_object *object TSRMLS_DC) /* {{
|
||||||
intern->ptr = NULL;
|
intern->ptr = NULL;
|
||||||
zval_ptr_dtor(&intern->obj);
|
zval_ptr_dtor(&intern->obj);
|
||||||
zend_object_std_dtor(object TSRMLS_CC);
|
zend_object_std_dtor(object TSRMLS_CC);
|
||||||
|
GC_REMOVE_FROM_BUFFER(object);
|
||||||
efree(intern);
|
efree(intern);
|
||||||
}
|
}
|
||||||
/* }}} */
|
/* }}} */
|
||||||
|
|
|
@ -170,6 +170,7 @@ static void spl_array_object_free_storage(zend_object *object TSRMLS_DC)
|
||||||
efree(intern->debug_info);
|
efree(intern->debug_info);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
GC_REMOVE_FROM_BUFFER(object);
|
||||||
efree(intern);
|
efree(intern);
|
||||||
}
|
}
|
||||||
/* }}} */
|
/* }}} */
|
||||||
|
|
|
@ -127,6 +127,7 @@ static void spl_filesystem_object_free_storage(zend_object *object TSRMLS_DC) /*
|
||||||
//????zend_iterator_dtor(&intern->it->intern);
|
//????zend_iterator_dtor(&intern->it->intern);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
GC_REMOVE_FROM_BUFFER(object);
|
||||||
efree(intern);
|
efree(intern);
|
||||||
} /* }}} */
|
} /* }}} */
|
||||||
|
|
||||||
|
|
|
@ -367,6 +367,7 @@ static void spl_dllist_object_free_storage(zend_object *object TSRMLS_DC) /* {{{
|
||||||
efree(intern->debug_info);
|
efree(intern->debug_info);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
GC_REMOVE_FROM_BUFFER(object);
|
||||||
efree(intern);
|
efree(intern);
|
||||||
}
|
}
|
||||||
/* }}} */
|
/* }}} */
|
||||||
|
|
|
@ -210,6 +210,7 @@ static void spl_fixedarray_object_free_storage(zend_object *object TSRMLS_DC) /*
|
||||||
zend_object_std_dtor(&intern->std TSRMLS_CC);
|
zend_object_std_dtor(&intern->std TSRMLS_CC);
|
||||||
zval_ptr_dtor(&intern->retval);
|
zval_ptr_dtor(&intern->retval);
|
||||||
|
|
||||||
|
GC_REMOVE_FROM_BUFFER(object);
|
||||||
efree(intern);
|
efree(intern);
|
||||||
}
|
}
|
||||||
/* }}} */
|
/* }}} */
|
||||||
|
|
|
@ -378,6 +378,7 @@ static void spl_heap_object_free_storage(zend_object *object TSRMLS_DC) /* {{{ *
|
||||||
efree(intern->debug_info);
|
efree(intern->debug_info);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
GC_REMOVE_FROM_BUFFER(object);
|
||||||
efree(intern);
|
efree(intern);
|
||||||
}
|
}
|
||||||
/* }}} */
|
/* }}} */
|
||||||
|
|
|
@ -889,6 +889,7 @@ static void spl_RecursiveIteratorIterator_free_storage(zend_object *_object TSRM
|
||||||
|
|
||||||
smart_str_free(&object->postfix[0]);
|
smart_str_free(&object->postfix[0]);
|
||||||
|
|
||||||
|
GC_REMOVE_FROM_BUFFER(_object);
|
||||||
efree(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);
|
//zend_object_std_dtor(&object->std TSRMLS_CC);
|
||||||
|
|
||||||
|
GC_REMOVE_FROM_BUFFER(_object);
|
||||||
efree(object);
|
efree(object);
|
||||||
}
|
}
|
||||||
/* }}} */
|
/* }}} */
|
||||||
|
|
|
@ -114,6 +114,7 @@ void spl_SplObjectStorage_free_storage(zend_object *object TSRMLS_DC) /* {{{ */
|
||||||
efree(intern->debug_info);
|
efree(intern->debug_info);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
GC_REMOVE_FROM_BUFFER(object);
|
||||||
efree(intern);
|
efree(intern);
|
||||||
} /* }}} */
|
} /* }}} */
|
||||||
|
|
||||||
|
|
|
@ -2258,9 +2258,7 @@ PHPAPI int php_array_merge(HashTable *dest, HashTable *src, int recursive TSRMLS
|
||||||
|
|
||||||
if (Z_ISREF_P(dest_entry)) {
|
if (Z_ISREF_P(dest_entry)) {
|
||||||
if (Z_REFCOUNT_P(dest_entry) == 1) {
|
if (Z_REFCOUNT_P(dest_entry) == 1) {
|
||||||
zend_reference *ref = Z_REF_P(dest_entry);
|
ZVAL_UNREF(dest_entry);
|
||||||
ZVAL_COPY_VALUE(dest_entry, dest_zval);
|
|
||||||
efree(ref);
|
|
||||||
} else {
|
} else {
|
||||||
Z_DELREF_P(dest_entry);
|
Z_DELREF_P(dest_entry);
|
||||||
ZVAL_DUP(dest_entry, dest_zval);
|
ZVAL_DUP(dest_entry, dest_zval);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue