Skip to content

Commit 1510191

Browse files
committed
Add GC_DTOR/GC_DTOR_NO_REF macros
1 parent 9aa862f commit 1510191

File tree

5 files changed

+123
-528
lines changed

5 files changed

+123
-528
lines changed

Zend/zend_execute.c

Lines changed: 3 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -3284,11 +3284,7 @@ static zend_always_inline void zend_assign_to_property_reference(zval *container
32843284
ZVAL_COPY(EX_VAR(opline->result.var), variable_ptr);
32853285
}
32863286
if (garbage) {
3287-
if (GC_DELREF(garbage) == 0) {
3288-
rc_dtor_func(garbage);
3289-
} else {
3290-
gc_check_possible_root(garbage);
3291-
}
3287+
GC_DTOR(garbage);
32923288
}
32933289
}
32943290

@@ -3584,11 +3580,7 @@ static zend_always_inline void i_zval_ptr_dtor_noref(zval *zval_ptr) {
35843580
if (Z_REFCOUNTED_P(zval_ptr)) {
35853581
zend_refcounted *ref = Z_COUNTED_P(zval_ptr);
35863582
ZEND_ASSERT(Z_TYPE_P(zval_ptr) != IS_REFERENCE);
3587-
if (!GC_DELREF(ref)) {
3588-
rc_dtor_func(ref);
3589-
} else if (UNEXPECTED(GC_MAY_LEAK(ref))) {
3590-
gc_possible_root(ref);
3591-
}
3583+
GC_DTOR_NO_REF(ref);
35923584
}
35933585
}
35943586

@@ -3632,11 +3624,7 @@ ZEND_API zval* zend_assign_to_typed_ref(zval *variable_ptr, zval *orig_value, ui
36323624
zend_refcounted *garbage = NULL;
36333625
zval *result = zend_assign_to_typed_ref_ex(variable_ptr, orig_value, value_type, strict, &garbage);
36343626
if (garbage) {
3635-
if (GC_DELREF(garbage) == 0) {
3636-
rc_dtor_func(garbage);
3637-
} else {
3638-
gc_check_possible_root_no_ref(garbage);
3639-
}
3627+
GC_DTOR_NO_REF(garbage);
36403628
}
36413629
return result;
36423630
}

Zend/zend_execute.h

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -169,14 +169,7 @@ static zend_always_inline zval* zend_assign_to_variable(zval *variable_ptr, zval
169169
}
170170
garbage = Z_COUNTED_P(variable_ptr);
171171
zend_copy_to_variable(variable_ptr, value, value_type);
172-
if (GC_DELREF(garbage) == 0) {
173-
rc_dtor_func(garbage);
174-
} else { /* we need to split */
175-
/* optimized version of GC_ZVAL_CHECK_POSSIBLE_ROOT(variable_ptr) */
176-
if (UNEXPECTED(GC_MAY_LEAK(garbage))) {
177-
gc_possible_root(garbage);
178-
}
179-
}
172+
GC_DTOR_NO_REF(garbage);
180173
return variable_ptr;
181174
}
182175
} while (0);

Zend/zend_refcounted.h

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,24 @@
5656
#define GC_DELREF_EX(p, rc) zend_gc_delref_ex(&(p)->gc, rc)
5757
#define GC_TRY_ADDREF(p) zend_gc_try_addref(&(p)->gc)
5858
#define GC_TRY_DELREF(p) zend_gc_try_delref(&(p)->gc)
59+
#define GC_DTOR(p) \
60+
do { \
61+
zend_refcounted_h *_p = &(p)->gc; \
62+
if (zend_gc_delref(_p) == 0) { \
63+
rc_dtor_func((zend_refcounted *)_p); \
64+
} else { \
65+
gc_check_possible_root((zend_refcounted *)_p); \
66+
} \
67+
} while (0)
68+
#define GC_DTOR_NO_REF(p) \
69+
do { \
70+
zend_refcounted_h *_p = &(p)->gc; \
71+
if (zend_gc_delref(_p) == 0) { \
72+
rc_dtor_func((zend_refcounted *)_p); \
73+
} else { \
74+
gc_check_possible_root_no_ref((zend_refcounted *)_p); \
75+
} \
76+
} while (0)
5977

6078
#define GC_NULL (IS_NULL | (GC_NOT_COLLECTABLE << GC_FLAGS_SHIFT))
6179
#define GC_STRING (IS_STRING | (GC_NOT_COLLECTABLE << GC_FLAGS_SHIFT))

Zend/zend_vm_def.h

Lines changed: 7 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -2500,11 +2500,7 @@ ZEND_VM_C_LABEL(free_and_exit_assign_obj):
25002500
FREE_OP_DATA();
25012501
ZEND_VM_C_LABEL(exit_assign_obj):
25022502
if (garbage) {
2503-
if (GC_DELREF(garbage) == 0) {
2504-
rc_dtor_func(garbage);
2505-
} else {
2506-
gc_check_possible_root_no_ref(garbage);
2507-
}
2503+
GC_DTOR_NO_REF(garbage);
25082504
}
25092505
FREE_OP2();
25102506
FREE_OP1();
@@ -2542,11 +2538,7 @@ ZEND_VM_HANDLER(25, ZEND_ASSIGN_STATIC_PROP, ANY, ANY, CACHE_SLOT, SPEC(OP_DATA=
25422538
}
25432539

25442540
if (garbage) {
2545-
if (GC_DELREF(garbage) == 0) {
2546-
rc_dtor_func(garbage);
2547-
} else {
2548-
gc_check_possible_root_no_ref(garbage);
2549-
}
2541+
GC_DTOR_NO_REF(garbage);
25502542
}
25512543

25522544
/* assign_static_prop has two opcodes! */
@@ -2622,11 +2614,7 @@ ZEND_VM_C_LABEL(try_assign_dim_array):
26222614
ZVAL_COPY(EX_VAR(opline->result.var), value);
26232615
}
26242616
if (garbage) {
2625-
if (GC_DELREF(garbage) == 0) {
2626-
rc_dtor_func(garbage);
2627-
} else {
2628-
gc_check_possible_root_no_ref(garbage);
2629-
}
2617+
GC_DTOR_NO_REF(garbage);
26302618
}
26312619
} else {
26322620
if (EXPECTED(Z_ISREF_P(object_ptr))) {
@@ -2728,11 +2716,7 @@ ZEND_VM_HANDLER(22, ZEND_ASSIGN, VAR|CV, CONST|TMP|VAR|CV, SPEC(RETVAL))
27282716
ZVAL_COPY(EX_VAR(opline->result.var), value);
27292717
}
27302718
if (garbage) {
2731-
if (GC_DELREF(garbage) == 0) {
2732-
rc_dtor_func(garbage);
2733-
} else {
2734-
gc_check_possible_root_no_ref(garbage);
2735-
}
2719+
GC_DTOR_NO_REF(garbage);
27362720
}
27372721
} else {
27382722
value = zend_assign_to_variable(variable_ptr, value, OP2_TYPE, EX_USES_STRICT_TYPES());
@@ -2774,11 +2758,7 @@ ZEND_VM_HANDLER(30, ZEND_ASSIGN_REF, VAR|CV, VAR|CV, SRC)
27742758
}
27752759

27762760
if (garbage) {
2777-
if (GC_DELREF(garbage) == 0) {
2778-
rc_dtor_func(garbage);
2779-
} else {
2780-
gc_check_possible_root(garbage);
2781-
}
2761+
GC_DTOR(garbage);
27822762
}
27832763

27842764
FREE_OP2();
@@ -2855,11 +2835,7 @@ ZEND_VM_HANDLER(33, ZEND_ASSIGN_STATIC_PROP_REF, ANY, ANY, CACHE_SLOT|SRC)
28552835
}
28562836

28572837
if (garbage) {
2858-
if (GC_DELREF(garbage) == 0) {
2859-
rc_dtor_func(garbage);
2860-
} else {
2861-
gc_check_possible_root(garbage);
2862-
}
2838+
GC_DTOR(garbage);
28632839
}
28642840

28652841
FREE_OP_DATA();
@@ -6475,11 +6451,7 @@ ZEND_VM_HANDLER(153, ZEND_UNSET_CV, CV, UNUSED)
64756451

64766452
ZVAL_UNDEF(var);
64776453
SAVE_OPLINE();
6478-
if (!GC_DELREF(garbage)) {
6479-
rc_dtor_func(garbage);
6480-
} else {
6481-
gc_check_possible_root(garbage);
6482-
}
6454+
GC_DTOR(garbage);
64836455
ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION();
64846456
} else {
64856457
ZVAL_UNDEF(var);

0 commit comments

Comments
 (0)