diff options
Diffstat (limited to 'src/bootstrap')
-rw-r--r-- | src/bootstrap/objects.c | 56 | ||||
-rw-r--r-- | src/bootstrap/parser.c | 3 |
2 files changed, 8 insertions, 51 deletions
diff --git a/src/bootstrap/objects.c b/src/bootstrap/objects.c index b03a616..cf881a0 100644 --- a/src/bootstrap/objects.c +++ b/src/bootstrap/objects.c | |||
@@ -141,59 +141,19 @@ obj_duplicate(Object *obj) { | |||
141 | append_string(copy, (StringView){obj->string, obj->string_n}); | 141 | append_string(copy, (StringView){obj->string, obj->string_n}); |
142 | } break; | 142 | } break; |
143 | case OBJ_TYPE_PAIR: { | 143 | case OBJ_TYPE_PAIR: { |
144 | Object *root = make_pair(obj_duplicate(obj->car), obj_nil); | 144 | // Object *root = make_pair(obj_duplicate(obj->car), obj_nil); |
145 | copy = root; | 145 | // copy = root; |
146 | obj = obj->cdr; | 146 | // obj = obj->cdr; |
147 | while (obj != obj_nil) { | 147 | // while (obj != obj_nil) { |
148 | root->cdr = make_pair(obj_duplicate(obj->car), obj_nil); | 148 | // root->cdr = make_pair(obj_duplicate(obj->car), obj_nil); |
149 | root = root->cdr; | 149 | // root = root->cdr; |
150 | obj = obj->cdr; | 150 | // obj = obj->cdr; |
151 | } | 151 | // } |
152 | } break; | 152 | } break; |
153 | } | 153 | } |
154 | return copy; | 154 | return copy; |
155 | } | 155 | } |
156 | 156 | ||
157 | void | ||
158 | free_objects(Object *root) { | ||
159 | switch (root->type) { | ||
160 | case OBJ_TYPE_BOOL: break; | ||
161 | case OBJ_TYPE_NIL: break; | ||
162 | case OBJ_TYPE_ERR: break; | ||
163 | case OBJ_TYPE_PROCEDURE: | ||
164 | case OBJ_TYPE_FIXNUM: { | ||
165 | free(root); | ||
166 | } break; | ||
167 | case OBJ_TYPE_SYMBOL: { | ||
168 | if (root->symbol != NULL) { | ||
169 | free(root->symbol); | ||
170 | } | ||
171 | free(root); | ||
172 | } break; | ||
173 | case OBJ_TYPE_STRING: { | ||
174 | if (root->string != NULL) { | ||
175 | free(root->string); | ||
176 | } | ||
177 | free(root); | ||
178 | } break; | ||
179 | case OBJ_TYPE_PAIR: { | ||
180 | if (root->car != NULL) { | ||
181 | free_objects(root->car); | ||
182 | } | ||
183 | if (root->cdr != NULL) { | ||
184 | free_objects(root->cdr); | ||
185 | } | ||
186 | free(root); | ||
187 | } break; | ||
188 | case OBJ_TYPE_LAMBDA: { | ||
189 | free_objects(root->params); | ||
190 | free_objects(root->body); | ||
191 | // TODO: free_env(root->env); | ||
192 | free(root); | ||
193 | } break; | ||
194 | } | ||
195 | } | ||
196 | |||
197 | void display(Object *root); | 157 | void display(Object *root); |
198 | 158 | ||
199 | void | 159 | void |
diff --git a/src/bootstrap/parser.c b/src/bootstrap/parser.c index f047b8e..869678e 100644 --- a/src/bootstrap/parser.c +++ b/src/bootstrap/parser.c | |||
@@ -54,12 +54,10 @@ parse_list(Visitor *vs) { | |||
54 | break; | 54 | break; |
55 | } | 55 | } |
56 | if (tok.type == TOKEN_EOF) { | 56 | if (tok.type == TOKEN_EOF) { |
57 | free_objects(root); | ||
58 | return obj_err; | 57 | return obj_err; |
59 | } | 58 | } |
60 | next_obj = parse_tree(vs); | 59 | next_obj = parse_tree(vs); |
61 | if (next_obj == obj_err) { | 60 | if (next_obj == obj_err) { |
62 | free_objects(root); | ||
63 | return obj_err; | 61 | return obj_err; |
64 | } | 62 | } |
65 | list->cdr = make_pair(next_obj, obj_nil); | 63 | list->cdr = make_pair(next_obj, obj_nil); |
@@ -94,7 +92,6 @@ parse_tree(Visitor *vs) { | |||
94 | Object *quote_sym = make_symbol((StringView){"quote", 5}); | 92 | Object *quote_sym = make_symbol((StringView){"quote", 5}); |
95 | Object *next_obj = parse_tree(vs); | 93 | Object *next_obj = parse_tree(vs); |
96 | if (next_obj == obj_err) { | 94 | if (next_obj == obj_err) { |
97 | free_objects(quote_sym); | ||
98 | return obj_err; | 95 | return obj_err; |
99 | } | 96 | } |
100 | return make_pair(quote_sym, make_pair(next_obj, obj_nil)); | 97 | return make_pair(quote_sym, make_pair(next_obj, obj_nil)); |