STATIC complex_descriptor * GC_make_sequence_descriptor(complex_descriptor *first, complex_descriptor *second) { struct SequenceDescriptor * result = (struct SequenceDescriptor *) GC_malloc(sizeof(struct SequenceDescriptor)); /* Can't result in overly conservative marking, since tags are */ /* very small integers. Probably faster than maintaining type */ /* info. */ if (result != 0) { result -> sd_tag = SEQUENCE_TAG; result -> sd_first = first; result -> sd_second = second; GC_dirty(result); REACHABLE_AFTER_DIRTY(first); REACHABLE_AFTER_DIRTY(second); } return((complex_descriptor *)result); }
GC_API void GC_CALL GC_debug_ptr_store_and_dirty(void *p, const void *q) { *(void **)GC_is_visible(p) = GC_is_valid_displacement((void *)q); GC_debug_end_stubborn_change(p); REACHABLE_AFTER_DIRTY(q); }