Lines Matching refs:ref

92 # define GC_TRACE_REF(ref, format, ...) \  argument
94 gc_trace_ref((zend_refcounted *) ref); \
97 # define GC_TRACE_SET_COLOR(ref, color) \ argument
98 GC_TRACE_REF(ref, "->%s", gc_color_name(color))
100 # define GC_TRACE_REF(ref, format, ...) argument
101 # define GC_TRACE_SET_COLOR(ref, new_color) argument
106 #define GC_REF_ADDRESS(ref) \ argument
107 (((GC_TYPE_INFO(ref)) & (GC_ADDRESS << GC_INFO_SHIFT)) >> GC_INFO_SHIFT)
109 #define GC_REF_COLOR(ref) \ argument
110 (((GC_TYPE_INFO(ref)) & (GC_COLOR << GC_INFO_SHIFT)) >> GC_INFO_SHIFT)
112 #define GC_REF_CHECK_COLOR(ref, color) \ argument
113 ((GC_TYPE_INFO(ref) & (GC_COLOR << GC_INFO_SHIFT)) == ((color) << GC_INFO_SHIFT))
115 #define GC_REF_SET_INFO(ref, info) do { \ argument
116 GC_TYPE_INFO(ref) = \
117 (GC_TYPE_INFO(ref) & (GC_TYPE_MASK | GC_FLAGS_MASK)) | \
121 #define GC_REF_SET_COLOR(ref, c) do { \ argument
122 GC_TRACE_SET_COLOR(ref, c); \
123 GC_TYPE_INFO(ref) = \
124 (GC_TYPE_INFO(ref) & ~(GC_COLOR << GC_INFO_SHIFT)) | \
128 #define GC_REF_SET_BLACK(ref) do { \ argument
129 GC_TRACE_SET_COLOR(ref, GC_BLACK); \
130 GC_TYPE_INFO(ref) &= ~(GC_COLOR << GC_INFO_SHIFT); \
133 #define GC_REF_SET_PURPLE(ref) do { \ argument
134 GC_TRACE_SET_COLOR(ref, GC_PURPLE); \
135 GC_TYPE_INFO(ref) |= (GC_COLOR << GC_INFO_SHIFT); \
206 zend_refcounted *ref; member
274 #define GC_STACK_PUSH(ref) \ argument
275 gc_stack_push(&_stack, &_top, ref);
291 static zend_always_inline void gc_stack_push(gc_stack **stack, size_t *top, zend_refcounted *ref) in gc_stack_push() argument
297 (*stack)->data[(*top)++] = ref; in gc_stack_push()
334 static zend_always_inline gc_root_buffer* gc_decompress(zend_refcounted *ref, uint32_t idx) in gc_decompress() argument
338 if (EXPECTED(GC_GET_PTR(root->ref) == ref)) { in gc_decompress()
346 if (GC_GET_PTR(root->ref) == ref) { in gc_decompress()
360 ZEND_ASSERT(GC_IS_UNUSED(root->ref)); in gc_fetch_unused()
361 GC_G(unused) = GC_LIST2IDX(root->ref); in gc_fetch_unused()
367 root->ref = GC_IDX2LIST(GC_G(unused)); in gc_link_unused()
391 static void gc_trace_ref(zend_refcounted *ref) { in gc_trace_ref() argument
392 if (GC_TYPE(ref) == IS_OBJECT) { in gc_trace_ref()
393 zend_object *obj = (zend_object *) ref; in gc_trace_ref()
395 ref, GC_REFCOUNT(ref), GC_REF_ADDRESS(ref), in gc_trace_ref()
396 gc_color_name(GC_REF_COLOR(ref)), in gc_trace_ref()
398 } else if (GC_TYPE(ref) == IS_ARRAY) { in gc_trace_ref()
399 zend_array *arr = (zend_array *) ref; in gc_trace_ref()
401 ref, GC_REFCOUNT(ref), GC_REF_ADDRESS(ref), in gc_trace_ref()
402 gc_color_name(GC_REF_COLOR(ref)), in gc_trace_ref()
406 ref, GC_REFCOUNT(ref), GC_REF_ADDRESS(ref), in gc_trace_ref()
407 gc_color_name(GC_REF_COLOR(ref)), in gc_trace_ref()
408 GC_TYPE(ref) == IS_REFERENCE in gc_trace_ref()
409 ? "reference" : zend_get_type_by_const(GC_TYPE(ref))); in gc_trace_ref()
502 GC_G(buf)[0].ref = NULL; in gc_enable()
582 static zend_never_inline void ZEND_FASTCALL gc_possible_root_when_full(zend_refcounted *ref) in gc_possible_root_when_full() argument
587 ZEND_ASSERT(GC_TYPE(ref) == IS_ARRAY || GC_TYPE(ref) == IS_OBJECT); in gc_possible_root_when_full()
588 ZEND_ASSERT(GC_INFO(ref) == 0); in gc_possible_root_when_full()
591 GC_ADDREF(ref); in gc_possible_root_when_full()
593 if (UNEXPECTED(GC_DELREF(ref)) == 0) { in gc_possible_root_when_full()
594 rc_dtor_func(ref); in gc_possible_root_when_full()
596 } else if (UNEXPECTED(GC_INFO(ref))) { in gc_possible_root_when_full()
614 newRoot->ref = ref; /* GC_ROOT tag is 0 */ in gc_possible_root_when_full()
615 GC_TRACE_SET_COLOR(ref, GC_PURPLE); in gc_possible_root_when_full()
618 GC_REF_SET_INFO(ref, idx | GC_PURPLE); in gc_possible_root_when_full()
626 ZEND_API void ZEND_FASTCALL gc_possible_root(zend_refcounted *ref) in gc_possible_root() argument
642 gc_possible_root_when_full(ref); in gc_possible_root()
646 ZEND_ASSERT(GC_TYPE(ref) == IS_ARRAY || GC_TYPE(ref) == IS_OBJECT); in gc_possible_root()
647 ZEND_ASSERT(GC_INFO(ref) == 0); in gc_possible_root()
650 newRoot->ref = ref; /* GC_ROOT tag is 0 */ in gc_possible_root()
651 GC_TRACE_SET_COLOR(ref, GC_PURPLE); in gc_possible_root()
654 GC_REF_SET_INFO(ref, idx | GC_PURPLE); in gc_possible_root()
662 static zend_never_inline void ZEND_FASTCALL gc_remove_compressed(zend_refcounted *ref, uint32_t idx) in gc_remove_compressed() argument
664 gc_root_buffer *root = gc_decompress(ref, idx); in gc_remove_compressed()
668 ZEND_API void ZEND_FASTCALL gc_remove_from_buffer(zend_refcounted *ref) in gc_remove_from_buffer() argument
671 uint32_t idx = GC_REF_ADDRESS(ref); in gc_remove_from_buffer()
675 if (!GC_REF_CHECK_COLOR(ref, GC_BLACK)) { in gc_remove_from_buffer()
676 GC_TRACE_SET_COLOR(ref, GC_BLACK); in gc_remove_from_buffer()
678 GC_REF_SET_INFO(ref, 0); in gc_remove_from_buffer()
682 gc_remove_compressed(ref, idx); in gc_remove_from_buffer()
691 static void gc_scan_black(zend_refcounted *ref, gc_stack *stack) in gc_scan_black() argument
699 if (GC_TYPE(ref) == IS_OBJECT) { in gc_scan_black()
700 zend_object *obj = (zend_object*)ref; in gc_scan_black()
702 if (EXPECTED(!(OBJ_FLAGS(ref) & IS_OBJ_FREE_CALLED))) { in gc_scan_black()
721 ref = Z_COUNTED_P(zv); in gc_scan_black()
722 GC_ADDREF(ref); in gc_scan_black()
723 if (!GC_REF_CHECK_COLOR(ref, GC_BLACK)) { in gc_scan_black()
724 GC_REF_SET_BLACK(ref); in gc_scan_black()
725 GC_STACK_PUSH(ref); in gc_scan_black()
731 ref = Z_COUNTED_P(zv); in gc_scan_black()
732 GC_ADDREF(ref); in gc_scan_black()
733 if (!GC_REF_CHECK_COLOR(ref, GC_BLACK)) { in gc_scan_black()
734 GC_REF_SET_BLACK(ref); in gc_scan_black()
742 } else if (GC_TYPE(ref) == IS_ARRAY) { in gc_scan_black()
743 if ((zend_array*)ref != &EG(symbol_table)) { in gc_scan_black()
744 ht = (zend_array*)ref; in gc_scan_black()
748 } else if (GC_TYPE(ref) == IS_REFERENCE) { in gc_scan_black()
749 if (Z_REFCOUNTED(((zend_reference*)ref)->val)) { in gc_scan_black()
750 ref = Z_COUNTED(((zend_reference*)ref)->val); in gc_scan_black()
751 GC_ADDREF(ref); in gc_scan_black()
752 if (!GC_REF_CHECK_COLOR(ref, GC_BLACK)) { in gc_scan_black()
753 GC_REF_SET_BLACK(ref); in gc_scan_black()
782 ref = Z_COUNTED_P(zv); in gc_scan_black()
783 GC_ADDREF(ref); in gc_scan_black()
784 if (!GC_REF_CHECK_COLOR(ref, GC_BLACK)) { in gc_scan_black()
785 GC_REF_SET_BLACK(ref); in gc_scan_black()
786 GC_STACK_PUSH(ref); in gc_scan_black()
795 ref = Z_COUNTED_P(zv); in gc_scan_black()
796 GC_ADDREF(ref); in gc_scan_black()
797 if (!GC_REF_CHECK_COLOR(ref, GC_BLACK)) { in gc_scan_black()
798 GC_REF_SET_BLACK(ref); in gc_scan_black()
803 ref = GC_STACK_POP(); in gc_scan_black()
804 if (ref) { in gc_scan_black()
809 static void gc_mark_grey(zend_refcounted *ref, gc_stack *stack) in gc_mark_grey() argument
819 if (GC_TYPE(ref) == IS_OBJECT) { in gc_mark_grey()
820 zend_object *obj = (zend_object*)ref; in gc_mark_grey()
822 if (EXPECTED(!(OBJ_FLAGS(ref) & IS_OBJ_FREE_CALLED))) { in gc_mark_grey()
841 ref = Z_COUNTED_P(zv); in gc_mark_grey()
842 GC_DELREF(ref); in gc_mark_grey()
843 if (!GC_REF_CHECK_COLOR(ref, GC_GREY)) { in gc_mark_grey()
844 GC_REF_SET_COLOR(ref, GC_GREY); in gc_mark_grey()
845 GC_STACK_PUSH(ref); in gc_mark_grey()
851 ref = Z_COUNTED_P(zv); in gc_mark_grey()
852 GC_DELREF(ref); in gc_mark_grey()
853 if (!GC_REF_CHECK_COLOR(ref, GC_GREY)) { in gc_mark_grey()
854 GC_REF_SET_COLOR(ref, GC_GREY); in gc_mark_grey()
862 } else if (GC_TYPE(ref) == IS_ARRAY) { in gc_mark_grey()
863 if (((zend_array*)ref) == &EG(symbol_table)) { in gc_mark_grey()
864 GC_REF_SET_BLACK(ref); in gc_mark_grey()
867 ht = (zend_array*)ref; in gc_mark_grey()
869 } else if (GC_TYPE(ref) == IS_REFERENCE) { in gc_mark_grey()
870 if (Z_REFCOUNTED(((zend_reference*)ref)->val)) { in gc_mark_grey()
871 ref = Z_COUNTED(((zend_reference*)ref)->val); in gc_mark_grey()
872 GC_DELREF(ref); in gc_mark_grey()
873 if (!GC_REF_CHECK_COLOR(ref, GC_GREY)) { in gc_mark_grey()
874 GC_REF_SET_COLOR(ref, GC_GREY); in gc_mark_grey()
903 ref = Z_COUNTED_P(zv); in gc_mark_grey()
904 GC_DELREF(ref); in gc_mark_grey()
905 if (!GC_REF_CHECK_COLOR(ref, GC_GREY)) { in gc_mark_grey()
906 GC_REF_SET_COLOR(ref, GC_GREY); in gc_mark_grey()
907 GC_STACK_PUSH(ref); in gc_mark_grey()
916 ref = Z_COUNTED_P(zv); in gc_mark_grey()
917 GC_DELREF(ref); in gc_mark_grey()
918 if (!GC_REF_CHECK_COLOR(ref, GC_GREY)) { in gc_mark_grey()
919 GC_REF_SET_COLOR(ref, GC_GREY); in gc_mark_grey()
924 ref = GC_STACK_POP(); in gc_mark_grey()
925 } while (ref); in gc_mark_grey()
940 while (!GC_IS_UNUSED(free->ref)) { in gc_compact()
943 while (GC_IS_UNUSED(scan->ref)) { in gc_compact()
947 p = scan->ref; in gc_compact()
948 free->ref = p; in gc_compact()
974 if (GC_IS_ROOT(current->ref)) { in gc_mark_roots()
975 if (GC_REF_CHECK_COLOR(current->ref, GC_PURPLE)) { in gc_mark_roots()
976 GC_REF_SET_COLOR(current->ref, GC_GREY); in gc_mark_roots()
977 gc_mark_grey(current->ref, stack); in gc_mark_roots()
984 static void gc_scan(zend_refcounted *ref, gc_stack *stack) in gc_scan() argument
992 if (GC_REF_CHECK_COLOR(ref, GC_WHITE)) { in gc_scan()
993 if (GC_REFCOUNT(ref) > 0) { in gc_scan()
994 if (!GC_REF_CHECK_COLOR(ref, GC_BLACK)) { in gc_scan()
995 GC_REF_SET_BLACK(ref); in gc_scan()
1001 gc_scan_black(ref, _stack->next); in gc_scan()
1005 if (GC_TYPE(ref) == IS_OBJECT) { in gc_scan()
1006 zend_object *obj = (zend_object*)ref; in gc_scan()
1008 if (EXPECTED(!(OBJ_FLAGS(ref) & IS_OBJ_FREE_CALLED))) { in gc_scan()
1027 ref = Z_COUNTED_P(zv); in gc_scan()
1028 if (GC_REF_CHECK_COLOR(ref, GC_GREY)) { in gc_scan()
1029 GC_REF_SET_COLOR(ref, GC_WHITE); in gc_scan()
1030 GC_STACK_PUSH(ref); in gc_scan()
1036 ref = Z_COUNTED_P(zv); in gc_scan()
1037 if (GC_REF_CHECK_COLOR(ref, GC_GREY)) { in gc_scan()
1038 GC_REF_SET_COLOR(ref, GC_WHITE); in gc_scan()
1046 } else if (GC_TYPE(ref) == IS_ARRAY) { in gc_scan()
1047 if ((zend_array*)ref == &EG(symbol_table)) { in gc_scan()
1048 GC_REF_SET_BLACK(ref); in gc_scan()
1051 ht = (zend_array*)ref; in gc_scan()
1053 } else if (GC_TYPE(ref) == IS_REFERENCE) { in gc_scan()
1054 if (Z_REFCOUNTED(((zend_reference*)ref)->val)) { in gc_scan()
1055 ref = Z_COUNTED(((zend_reference*)ref)->val); in gc_scan()
1056 if (GC_REF_CHECK_COLOR(ref, GC_GREY)) { in gc_scan()
1057 GC_REF_SET_COLOR(ref, GC_WHITE); in gc_scan()
1086 ref = Z_COUNTED_P(zv); in gc_scan()
1087 if (GC_REF_CHECK_COLOR(ref, GC_GREY)) { in gc_scan()
1088 GC_REF_SET_COLOR(ref, GC_WHITE); in gc_scan()
1089 GC_STACK_PUSH(ref); in gc_scan()
1098 ref = Z_COUNTED_P(zv); in gc_scan()
1099 if (GC_REF_CHECK_COLOR(ref, GC_GREY)) { in gc_scan()
1100 GC_REF_SET_COLOR(ref, GC_WHITE); in gc_scan()
1107 ref = GC_STACK_POP(); in gc_scan()
1108 if (ref) { in gc_scan()
1119 if (GC_IS_ROOT(current->ref)) { in gc_scan_roots()
1120 if (GC_REF_CHECK_COLOR(current->ref, GC_GREY)) { in gc_scan_roots()
1121 GC_REF_SET_COLOR(current->ref, GC_WHITE); in gc_scan_roots()
1122 gc_scan(current->ref, stack); in gc_scan_roots()
1129 static void gc_add_garbage(zend_refcounted *ref) in gc_add_garbage() argument
1147 buf->ref = GC_MAKE_GARBAGE(ref); in gc_add_garbage()
1150 GC_REF_SET_INFO(ref, idx | GC_BLACK); in gc_add_garbage()
1154 static int gc_collect_white(zend_refcounted *ref, uint32_t *flags, gc_stack *stack) in gc_collect_white() argument
1164 if (GC_TYPE(ref) != IS_REFERENCE) { in gc_collect_white()
1168 if (GC_TYPE(ref) == IS_OBJECT) { in gc_collect_white()
1169 zend_object *obj = (zend_object*)ref; in gc_collect_white()
1171 if (EXPECTED(!(OBJ_FLAGS(ref) & IS_OBJ_FREE_CALLED))) { in gc_collect_white()
1177 if (!GC_INFO(ref)) { in gc_collect_white()
1178 gc_add_garbage(ref); in gc_collect_white()
1199 ref = Z_COUNTED_P(zv); in gc_collect_white()
1200 GC_ADDREF(ref); in gc_collect_white()
1201 if (GC_REF_CHECK_COLOR(ref, GC_WHITE)) { in gc_collect_white()
1202 GC_REF_SET_BLACK(ref); in gc_collect_white()
1203 GC_STACK_PUSH(ref); in gc_collect_white()
1209 ref = Z_COUNTED_P(zv); in gc_collect_white()
1210 GC_ADDREF(ref); in gc_collect_white()
1211 if (GC_REF_CHECK_COLOR(ref, GC_WHITE)) { in gc_collect_white()
1212 GC_REF_SET_BLACK(ref); in gc_collect_white()
1220 } else if (GC_TYPE(ref) == IS_ARRAY) { in gc_collect_white()
1222 if (!GC_INFO(ref)) { in gc_collect_white()
1223 gc_add_garbage(ref); in gc_collect_white()
1225 ht = (zend_array*)ref; in gc_collect_white()
1226 } else if (GC_TYPE(ref) == IS_REFERENCE) { in gc_collect_white()
1227 if (Z_REFCOUNTED(((zend_reference*)ref)->val)) { in gc_collect_white()
1228 ref = Z_COUNTED(((zend_reference*)ref)->val); in gc_collect_white()
1229 GC_ADDREF(ref); in gc_collect_white()
1230 if (GC_REF_CHECK_COLOR(ref, GC_WHITE)) { in gc_collect_white()
1231 GC_REF_SET_BLACK(ref); in gc_collect_white()
1260 ref = Z_COUNTED_P(zv); in gc_collect_white()
1261 GC_ADDREF(ref); in gc_collect_white()
1262 if (GC_REF_CHECK_COLOR(ref, GC_WHITE)) { in gc_collect_white()
1263 GC_REF_SET_BLACK(ref); in gc_collect_white()
1264 GC_STACK_PUSH(ref); in gc_collect_white()
1273 ref = Z_COUNTED_P(zv); in gc_collect_white()
1274 GC_ADDREF(ref); in gc_collect_white()
1275 if (GC_REF_CHECK_COLOR(ref, GC_WHITE)) { in gc_collect_white()
1276 GC_REF_SET_BLACK(ref); in gc_collect_white()
1281 ref = GC_STACK_POP(); in gc_collect_white()
1282 } while (ref); in gc_collect_white()
1290 zend_refcounted *ref; in gc_collect_roots() local
1297 if (GC_IS_ROOT(current->ref)) { in gc_collect_roots()
1298 if (GC_REF_CHECK_COLOR(current->ref, GC_BLACK)) { in gc_collect_roots()
1299 GC_REF_SET_INFO(current->ref, 0); /* reset GC_ADDRESS() and keep GC_BLACK */ in gc_collect_roots()
1314 ref = current->ref; in gc_collect_roots()
1315 ZEND_ASSERT(GC_IS_ROOT(ref)); in gc_collect_roots()
1316 current->ref = GC_MAKE_GARBAGE(ref); in gc_collect_roots()
1317 if (GC_REF_CHECK_COLOR(ref, GC_WHITE)) { in gc_collect_roots()
1318 GC_REF_SET_BLACK(ref); in gc_collect_roots()
1319 count += gc_collect_white(ref, flags, stack); in gc_collect_roots()
1327 static int gc_remove_nested_data_from_buffer(zend_refcounted *ref, gc_root_buffer *root) in gc_remove_nested_data_from_buffer() argument
1339 } else if (GC_REF_ADDRESS(ref) != 0 in gc_remove_nested_data_from_buffer()
1340 && GC_REF_CHECK_COLOR(ref, GC_BLACK)) { in gc_remove_nested_data_from_buffer()
1341 GC_TRACE_REF(ref, "removing from buffer"); in gc_remove_nested_data_from_buffer()
1342 GC_REMOVE_FROM_BUFFER(ref); in gc_remove_nested_data_from_buffer()
1344 } else if (GC_TYPE(ref) == IS_REFERENCE) { in gc_remove_nested_data_from_buffer()
1345 if (Z_REFCOUNTED(((zend_reference*)ref)->val)) { in gc_remove_nested_data_from_buffer()
1346 ref = Z_COUNTED(((zend_reference*)ref)->val); in gc_remove_nested_data_from_buffer()
1354 if (GC_TYPE(ref) == IS_OBJECT) { in gc_remove_nested_data_from_buffer()
1355 zend_object *obj = (zend_object*)ref; in gc_remove_nested_data_from_buffer()
1357 if (EXPECTED(!(OBJ_FLAGS(ref) & IS_OBJ_FREE_CALLED))) { in gc_remove_nested_data_from_buffer()
1373 ref = Z_COUNTED_P(zv); in gc_remove_nested_data_from_buffer()
1374 count += gc_remove_nested_data_from_buffer(ref, NULL); in gc_remove_nested_data_from_buffer()
1379 ref = Z_COUNTED_P(zv); in gc_remove_nested_data_from_buffer()
1389 } else if (GC_TYPE(ref) == IS_ARRAY) { in gc_remove_nested_data_from_buffer()
1390 ht = (zend_array*)ref; in gc_remove_nested_data_from_buffer()
1415 ref = Z_COUNTED_P(zv); in gc_remove_nested_data_from_buffer()
1416 count += gc_remove_nested_data_from_buffer(ref, NULL); in gc_remove_nested_data_from_buffer()
1424 ref = Z_COUNTED_P(zv); in gc_remove_nested_data_from_buffer()
1487 if (GC_IS_GARBAGE(current->ref)) { in zend_gc_collect_cycles()
1488 p = GC_GET_PTR(current->ref); in zend_gc_collect_cycles()
1493 current->ref = GC_MAKE_DTOR_GARBAGE(obj); in zend_gc_collect_cycles()
1510 if (GC_IS_DTOR_GARBAGE(current->ref)) { in zend_gc_collect_cycles()
1511 p = GC_GET_PTR(current->ref); in zend_gc_collect_cycles()
1525 if (GC_IS_DTOR_GARBAGE(current->ref)) { in zend_gc_collect_cycles()
1526 p = GC_GET_PTR(current->ref); in zend_gc_collect_cycles()
1529 current->ref = p; in zend_gc_collect_cycles()
1555 if (GC_IS_GARBAGE(current->ref)) { in zend_gc_collect_cycles()
1556 p = GC_GET_PTR(current->ref); in zend_gc_collect_cycles()
1565 current->ref = GC_MAKE_GARBAGE(((char*)obj) - obj->handlers->offset); in zend_gc_collect_cycles()
1593 if (GC_IS_GARBAGE(current->ref)) { in zend_gc_collect_cycles()
1594 p = GC_GET_PTR(current->ref); in zend_gc_collect_cycles()