diff options
-rw-r--r-- | src/compiler.h | 22 |
1 files changed, 22 insertions, 0 deletions
diff --git a/src/compiler.h b/src/compiler.h index ff2c6e0..7323f4d 100644 --- a/src/compiler.h +++ b/src/compiler.h | |||
@@ -317,6 +317,27 @@ compile_proc_call(Object *obj) { | |||
317 | } | 317 | } |
318 | 318 | ||
319 | void | 319 | void |
320 | compile_if(Object *obj) { | ||
321 | char *lab_false = generate_label(); | ||
322 | compile_object(obj->condition); | ||
323 | printf(" pop rax\n"); | ||
324 | printf(" cmp rax, %d\n", FALSE_VAL); | ||
325 | printf(" je %s\n", lab_false); | ||
326 | compile_object(obj->expr_true); | ||
327 | if (obj->expr_false != NULL) { | ||
328 | char *lab_exit = generate_label(); | ||
329 | printf(" jmp %s\n", lab_exit); | ||
330 | printf("%s:\n", lab_false); | ||
331 | compile_object(obj->expr_false); | ||
332 | printf("%s:\n", lab_exit); | ||
333 | free(lab_exit); | ||
334 | } else { | ||
335 | printf("%s:\n", lab_false); | ||
336 | } | ||
337 | free(lab_false); | ||
338 | } | ||
339 | |||
340 | void | ||
320 | compile_object(Object *obj) { | 341 | compile_object(Object *obj) { |
321 | switch (obj->type) { | 342 | switch (obj->type) { |
322 | case OBJ_TYPE_NIL: { compile_nil(); } break; | 343 | case OBJ_TYPE_NIL: { compile_nil(); } break; |
@@ -324,6 +345,7 @@ compile_object(Object *obj) { | |||
324 | case OBJ_TYPE_FALSE: { compile_boolean(obj); } break; | 345 | case OBJ_TYPE_FALSE: { compile_boolean(obj); } break; |
325 | case OBJ_TYPE_FIXNUM: { compile_fixnum(obj); } break; | 346 | case OBJ_TYPE_FIXNUM: { compile_fixnum(obj); } break; |
326 | case OBJ_TYPE_PAIR: { compile_proc_call(obj); } break; | 347 | case OBJ_TYPE_PAIR: { compile_proc_call(obj); } break; |
348 | case OBJ_TYPE_IF: { compile_if(obj); } break; | ||
327 | default: break; | 349 | default: break; |
328 | } | 350 | } |
329 | } | 351 | } |