Skip to content

Commit b7938ab

Browse files
committed
Refactored GC (incomplete)
1 parent 2e3e96b commit b7938ab

27 files changed

+548
-760
lines changed

Diff for: Zend/zend.h

+11-3
Original file line numberDiff line numberDiff line change
@@ -681,6 +681,16 @@ END_EXTERN_C()
681681
zval_copy_ctor(__z1); \
682682
} while (0)
683683

684+
#define ZVAL_UNREF(z) do { \
685+
zval *_z = (z); \
686+
zend_reference *ref; \
687+
ZEND_ASSERT(Z_ISREF_P(_z)); \
688+
ref = Z_REF_P(_z); \
689+
ZVAL_COPY_VALUE(_z, &ref->val); \
690+
GC_REMOVE_FROM_BUFFER(ref); \
691+
efree(ref); \
692+
} while (0)
693+
684694
// TODO: invalud ???
685695
#define INIT_PZVAL_COPY(z, v) \
686696
do { \
@@ -720,9 +730,7 @@ END_EXTERN_C()
720730
zval *__zv = (zv); \
721731
if (Z_ISREF_P(__zv)) { \
722732
if (Z_REFCOUNT_P(__zv) == 1) { \
723-
zend_reference *ref = Z_REF_P(__zv); \
724-
ZVAL_COPY_VALUE(__zv, &ref->val); \
725-
efree(ref); \
733+
ZVAL_UNREF(__zv); \
726734
} else { \
727735
zval *ref = Z_REFVAL_P(__zv); \
728736
Z_DELREF_P(__zv); \

Diff for: Zend/zend_closures.c

+1
Original file line numberDiff line numberDiff line change
@@ -242,6 +242,7 @@ static void zend_closure_free_storage(zend_object *object TSRMLS_DC) /* {{{ */
242242
zval_ptr_dtor(&closure->this_ptr);
243243
}
244244

245+
GC_REMOVE_FROM_BUFFER(closure);
245246
efree(closure);
246247
}
247248
/* }}} */

Diff for: Zend/zend_execute.c

+9-17
Original file line numberDiff line numberDiff line change
@@ -96,9 +96,7 @@ static zend_always_inline void zend_pzval_unlock_free_func(zval *z TSRMLS_DC)
9696
if (Z_REFCOUNTED_P(z)) {
9797
if (!Z_DELREF_P(z)) {
9898
ZEND_ASSERT(z != &EG(uninitialized_zval));
99-
GC_REMOVE_ZVAL_FROM_BUFFER(z);
10099
zval_dtor(z);
101-
efree(z);
102100
}
103101
}
104102
}
@@ -911,11 +909,10 @@ static inline zval* zend_assign_tmp_to_variable(zval *variable_ptr, zval *value
911909
GC_ZVAL_CHECK_POSSIBLE_ROOT(variable_ptr);
912910
ZVAL_COPY_VALUE(variable_ptr, value);
913911
} else {
914-
zval garbage;
912+
zend_refcounted *garbage = Z_COUNTED_P(variable_ptr);
915913

916-
ZVAL_COPY_VALUE(&garbage, variable_ptr);
917914
ZVAL_COPY_VALUE(variable_ptr, value);
918-
_zval_dtor_func(&garbage ZEND_FILE_LINE_CC);
915+
_zval_dtor_func(garbage ZEND_FILE_LINE_CC);
919916
}
920917
return variable_ptr;
921918
}
@@ -946,21 +943,20 @@ static inline zval* zend_assign_const_to_variable(zval *variable_ptr, zval *valu
946943
zval_copy_ctor(variable_ptr);
947944
}
948945
} else {
949-
zval garbage;
946+
zend_refcounted *garbage = Z_COUNTED_P(variable_ptr);
950947

951-
ZVAL_COPY_VALUE(&garbage, variable_ptr);
952948
ZVAL_COPY_VALUE(variable_ptr, value);
953949
if (Z_REFCOUNTED_P(value)) {
954950
zval_copy_ctor(variable_ptr);
955951
}
956-
_zval_dtor_func(&garbage ZEND_FILE_LINE_CC);
952+
_zval_dtor_func(garbage ZEND_FILE_LINE_CC);
957953
}
958954
return variable_ptr;
959955
}
960956

961957
static inline zval* zend_assign_to_variable(zval *variable_ptr, zval *value TSRMLS_DC)
962958
{
963-
zval garbage;
959+
zend_refcounted *garbage;
964960
int is_ref = 0;
965961

966962
if (EXPECTED(!Z_REFCOUNTED_P(variable_ptr))) {
@@ -982,7 +978,7 @@ static inline zval* zend_assign_to_variable(zval *variable_ptr, zval *value TSRM
982978
Z_OBJ_HANDLER_P(variable_ptr, set)(variable_ptr, value TSRMLS_CC);
983979
} else if (EXPECTED(variable_ptr != value)) {
984980
if (Z_REFCOUNT_P(variable_ptr)==1) {
985-
ZVAL_COPY_VALUE(&garbage, variable_ptr);
981+
garbage = Z_COUNTED_P(variable_ptr);
986982
if (EXPECTED(!Z_ISREF_P(value))) {
987983
if (!is_ref) {
988984
ZVAL_COPY(variable_ptr, value);
@@ -992,15 +988,13 @@ static inline zval* zend_assign_to_variable(zval *variable_ptr, zval *value TSRM
992988
} else {
993989
if (Z_REFCOUNT_P(value) == 1) {
994990
//??? auto dereferencing
995-
zend_reference *ref = Z_REF_P(value);
996-
ZVAL_COPY_VALUE(value, Z_REFVAL_P(value));
991+
ZVAL_UNREF(value);
997992
ZVAL_COPY(variable_ptr, value);
998-
efree(ref);
999993
} else {
1000994
ZVAL_DUP(variable_ptr, Z_REFVAL_P(value));
1001995
}
1002996
}
1003-
_zval_dtor_func(&garbage ZEND_FILE_LINE_CC);
997+
_zval_dtor_func(garbage ZEND_FILE_LINE_CC);
1004998
} else { /* we need to split */
1005999
Z_DELREF_P(variable_ptr);
10061000
GC_ZVAL_CHECK_POSSIBLE_ROOT(variable_ptr);
@@ -1015,10 +1009,8 @@ static inline zval* zend_assign_to_variable(zval *variable_ptr, zval *value TSRM
10151009
assign_ref:
10161010
if (Z_REFCOUNT_P(value) == 1) {
10171011
//??? auto dereferencing
1018-
zend_reference *ref = Z_REF_P(value);
1019-
ZVAL_COPY_VALUE(value, Z_REFVAL_P(value));
1012+
ZVAL_UNREF(value);
10201013
ZVAL_COPY(variable_ptr, value);
1021-
efree(ref);
10221014
} else {
10231015
ZVAL_DUP(variable_ptr, Z_REFVAL_P(value));
10241016
}

Diff for: Zend/zend_execute.h

+2-4
Original file line numberDiff line numberDiff line change
@@ -79,8 +79,7 @@ static zend_always_inline void i_zval_ptr_dtor(zval *zval_ptr ZEND_FILE_LINE_DC
7979
(type != IS_STRING || !IS_INTERNED(Z_STR_P(zval_ptr)))) {
8080
if (!Z_DELREF_P(zval_ptr)) {
8181
ZEND_ASSERT(zval_ptr != &EG(uninitialized_zval));
82-
GC_REMOVE_ZVAL_FROM_BUFFER(zval_ptr);
83-
_zval_dtor_func_for_ptr(zval_ptr ZEND_FILE_LINE_CC);
82+
_zval_dtor_func_for_ptr(Z_COUNTED_P(zval_ptr) ZEND_FILE_LINE_CC);
8483
} else {
8584
if (Z_REFCOUNT_P(zval_ptr) == 1 && Z_TYPE_P(zval_ptr) == IS_REFERENCE) {
8685
/* 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
9897
if (Z_REFCOUNTED_P(zval_ptr)) {
9998
if (!Z_DELREF_P(zval_ptr)) {
10099
ZEND_ASSERT(zval_ptr != &EG(uninitialized_zval));
101-
GC_REMOVE_ZVAL_FROM_BUFFER(zval_ptr);
102-
_zval_dtor_func_for_ptr(zval_ptr ZEND_FILE_LINE_CC);
100+
_zval_dtor_func_for_ptr(Z_COUNTED_P(zval_ptr) ZEND_FILE_LINE_CC);
103101
} else {
104102
if (Z_REFCOUNT_P(zval_ptr) == 1 && Z_TYPE_P(zval_ptr) == IS_REFERENCE) {
105103
/* convert reference to regular value */

0 commit comments

Comments
 (0)