From 9a5fceac983db127de876c875a59307f8f2893ba Mon Sep 17 00:00:00 2001 From: Bad Diode Date: Sat, 16 Oct 2021 11:30:07 +0200 Subject: Tag all objects as roots during parsing --- src/bootstrap/parser.c | 23 ++++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-) (limited to 'src/bootstrap/parser.c') diff --git a/src/bootstrap/parser.c b/src/bootstrap/parser.c index 869678e..77ece9d 100644 --- a/src/bootstrap/parser.c +++ b/src/bootstrap/parser.c @@ -18,6 +18,8 @@ has_next_token(const Visitor *visitor) { return visitor->current < visitor->tokens.size; } +void push_root(Object*); + Object * parse_fixnum(Token tok) { ssize_t num = 0; @@ -30,7 +32,10 @@ parse_fixnum(Token tok) { } num = num * 10 + (c - '0'); } - return make_fixnum(num * sign); + + Object *obj = make_fixnum(num * sign); + push_root(obj); + return obj; } Object * parse_tree(Visitor *vs); @@ -41,11 +46,13 @@ parse_list(Visitor *vs) { if (tok.type == TOKEN_EOF) { return obj_err; } + Object *root = make_pair(obj_nil, obj_nil); + push_root(root); Object *next_obj = parse_tree(vs); if (next_obj == obj_err) { return obj_err; } - Object *root = make_pair(next_obj, obj_nil); + root->car = next_obj; Object *list = root; while (has_next_token(vs)) { Token tok = peek_token(vs); @@ -89,12 +96,15 @@ parse_tree(Visitor *vs) { return obj_err; } break; case TOKEN_QUOTE: { - Object *quote_sym = make_symbol((StringView){"quote", 5}); + Object *base = make_pair(obj_quote, obj_nil); + base->cdr = make_pair(obj_nil, obj_nil); + push_root(base); Object *next_obj = parse_tree(vs); if (next_obj == obj_err) { return obj_err; } - return make_pair(quote_sym, make_pair(next_obj, obj_nil)); + base->cdr->car = next_obj; + return base; } break; case TOKEN_LPAREN: { Object *obj = parse_list(vs); @@ -110,11 +120,14 @@ parse_tree(Visitor *vs) { } break; case TOKEN_STRING: { Object *obj = make_string(); + push_root(obj); append_string(obj, tok.value); return obj; } break; case TOKEN_SYMBOL: { - return make_symbol(tok.value); + Object *obj = make_symbol(tok.value); + push_root(obj); + return obj; } break; case TOKEN_NIL: { return obj_nil; -- cgit v1.2.1