MIRROR: javascript for ๐Ÿœ's, a tiny runtime with big ambitions
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

add hoth path to both sidecars

+54 -23
+30 -13
include/object.h
··· 88 88 uint8_t flags; 89 89 } ant_object_sidecar_t; 90 90 91 + _Static_assert( 92 + _Alignof(ant_object_sidecar_t) > ant_sidecar, 93 + "object sidecar pointer uses low-bit tag" 94 + ); 95 + 91 96 typedef struct ant_prop_ref { 92 97 ant_object_t *obj; 93 98 uint32_t slot; ··· 150 155 151 156 static inline ant_extra_slot_t *ant_object_extra_slots_ptr(const ant_object_t *obj) { 152 157 if (!obj) return NULL; 153 - ant_object_sidecar_t *sidecar = ant_object_sidecar(obj); 154 - return sidecar ? sidecar->extra_slots : obj->extra_slots; 158 + uintptr_t raw = (uintptr_t)obj->extra_slots; 159 + if ((raw & ant_sidecar) == 0) return obj->extra_slots; 160 + return ((ant_object_sidecar_t *)(raw & ~ant_sidecar))->extra_slots; 155 161 } 156 162 157 163 static inline uint8_t ant_object_extra_count(const ant_object_t *obj) { 158 164 if (!obj) return 0; 159 - ant_object_sidecar_t *sidecar = ant_object_sidecar(obj); 160 - return sidecar ? sidecar->extra_count : obj->extra_count; 165 + uintptr_t raw = (uintptr_t)obj->extra_slots; 166 + if ((raw & ant_sidecar) == 0) return obj->extra_count; 167 + return ((ant_object_sidecar_t *)(raw & ~ant_sidecar))->extra_count; 161 168 } 162 169 163 170 static inline ant_extra_slot_t *ant_object_extra_slots(const ant_object_t *obj, uint8_t *count) { ··· 165 172 if (count) *count = 0; 166 173 return NULL; 167 174 } 168 - 169 - ant_object_sidecar_t *sidecar = ant_object_sidecar(obj); 170 - if (sidecar) { 171 - if (count) *count = sidecar->extra_count; 172 - return sidecar->extra_slots; 175 + 176 + uintptr_t raw = (uintptr_t)obj->extra_slots; 177 + if ((raw & ant_sidecar) == 0) { 178 + if (count) *count = obj->extra_count; 179 + return obj->extra_slots; 173 180 } 174 181 175 - if (count) *count = obj->extra_count; 176 - return obj->extra_slots; 182 + ant_object_sidecar_t *sidecar = (ant_object_sidecar_t *)(raw & ~ant_sidecar); 183 + if (count) *count = sidecar->extra_count; 184 + return sidecar->extra_slots; 177 185 } 178 186 179 187 static inline ant_extra_slot_t *ant_object_extra_slot(const ant_object_t *obj, uint8_t slot) { 180 - uint8_t count = 0; 181 - ant_extra_slot_t *entries = ant_object_extra_slots(obj, &count); 188 + if (!obj) return NULL; 189 + 190 + uint8_t count = obj->extra_count; 191 + ant_extra_slot_t *entries = obj->extra_slots; 192 + 193 + uintptr_t raw = (uintptr_t)obj->extra_slots; 194 + if ((raw & ant_sidecar) != 0) { 195 + ant_object_sidecar_t *sidecar = (ant_object_sidecar_t *)(raw & ~ant_sidecar); 196 + count = sidecar->extra_count; 197 + entries = sidecar->extra_slots; 198 + } 182 199 183 200 for (uint8_t i = 0; i < count; i++) 184 201 if (entries[i].slot == slot) return &entries[i];
+17 -7
include/silver/engine.h
··· 131 131 uint8_t *type_feedback; 132 132 sv_ctor_prop_fb_t ctor_prop_fb; 133 133 } sv_func_sidecar_t; 134 + 135 + _Static_assert( 136 + _Alignof(sv_func_sidecar_t) > ant_sidecar, 137 + "function sidecar pointer uses low-bit tag" 138 + ); 139 + 134 140 #endif 135 141 136 142 struct sv_func { ··· 965 971 } 966 972 967 973 static inline sv_func_sidecar_t *sv_func_sidecar(const sv_func_t *func) { 968 - if (!sv_func_has_sidecar(func)) return NULL; 969 - return (sv_func_sidecar_t *)((uintptr_t)func->type_feedback & ~ant_sidecar); 974 + if (!func) return NULL; 975 + uintptr_t raw = (uintptr_t)func->type_feedback; 976 + if ((raw & ant_sidecar) == 0) return NULL; 977 + return (sv_func_sidecar_t *)(raw & ~ant_sidecar); 970 978 } 971 979 972 980 static inline uint8_t *sv_func_type_feedback(const sv_func_t *func) { 973 981 if (!func) return NULL; 974 - sv_func_sidecar_t *sidecar = sv_func_sidecar(func); 975 - return sidecar ? sidecar->type_feedback : func->type_feedback; 982 + uintptr_t raw = (uintptr_t)func->type_feedback; 983 + if ((raw & ant_sidecar) == 0) return func->type_feedback; 984 + return ((sv_func_sidecar_t *)(raw & ~ant_sidecar))->type_feedback; 976 985 } 977 986 978 987 static inline sv_func_sidecar_t *sv_func_ensure_sidecar(sv_func_t *func) { 979 988 if (!func) return NULL; 980 989 981 - sv_func_sidecar_t *sidecar = sv_func_sidecar(func); 982 - if (sidecar) return sidecar; 990 + uintptr_t raw = (uintptr_t)func->type_feedback; 991 + if ((raw & ant_sidecar) != 0) 992 + return (sv_func_sidecar_t *)(raw & ~ant_sidecar); 983 993 984 - sidecar = (sv_func_sidecar_t *)calloc(1, sizeof(*sidecar)); 994 + sv_func_sidecar_t *sidecar = (sv_func_sidecar_t *)calloc(1, sizeof(*sidecar)); 985 995 if (!sidecar) return NULL; 986 996 987 997 sidecar->type_feedback = func->type_feedback;
+7 -3
src/gc/objects.c
··· 323 323 gc_mark_value(js, entry->setter); 324 324 } 325 325 326 - gc_mark_abort_signal_object(js, js_obj_from_ptr(obj), gc_mark_value); 327 - gc_mark_eventemitter_object(js, js_obj_from_ptr(obj), gc_mark_value); 326 + if (obj->native.tag != 0 || ant_object_has_sidecar(obj)) { 327 + ant_value_t value = js_obj_from_ptr(obj); 328 + gc_mark_abort_signal_object(js, value, gc_mark_value); 329 + gc_mark_eventemitter_object(js, value, gc_mark_value); 330 + } 328 331 } 329 332 330 333 static void gc_drain_mark_stack(ant_t *js) { ··· 564 567 if (!obj) return; 565 568 if (obj->finalizer) obj->finalizer(js, obj); 566 569 567 - gc_finalize_events_object(js, js_obj_from_ptr(obj)); 570 + if (obj->native.tag != 0 || ant_object_has_sidecar(obj)) 571 + gc_finalize_events_object(js, js_obj_from_ptr(obj)); 568 572 obj->mark_epoch = ANT_GC_DEAD; 569 573 570 574 if (obj->shape) {