summaryrefslogtreecommitdiff
path: root/src/value.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/value.c')
-rw-r--r--src/value.c14
1 files changed, 9 insertions, 5 deletions
diff --git a/src/value.c b/src/value.c
index eacc21c..e240646 100644
--- a/src/value.c
+++ b/src/value.c
@@ -152,14 +152,18 @@ struct object *untag_ptr(struct value value) {
}
void bootstrap(void) {
+ // Register every builtin slot as a root.
+ for (size_t i = 0; i < BUILTINS_COUNT; i++)
+ gc_root_push(&builtins[i]);
+
// Since it is its own class, standard-class needs to be constructed
// manually.
{
- struct object *obj = gc_alloc(STANDARD_CLASS_SLOT_COUNT + 1, 0);
- builtins[BUILTIN_BUILTIN_CLASS_STANDARD_CLASS] = (struct value){
- .bits = (uintptr_t)obj | TAG_BUILTIN_OBJECT,
- };
- gc_write_value_slot(obj, 0, builtins[BUILTIN_BUILTIN_CLASS_STANDARD_CLASS]);
+ builtins[BUILTIN_BUILTIN_CLASS_STANDARD_CLASS] =
+ tag_ptr(gc_alloc(STANDARD_CLASS_SLOT_COUNT + 1, 0), TAG_BUILTIN_OBJECT);
+ builtin_object_write_value_slot(
+ builtins[BUILTIN_BUILTIN_CLASS_STANDARD_CLASS], 0,
+ builtins[BUILTIN_BUILTIN_CLASS_STANDARD_CLASS]);
// TODO
}