From 84c2bf292ddcb91543715951805ebc2335c46567 Mon Sep 17 00:00:00 2001 From: Bad Diode Date: Wed, 3 Nov 2021 15:28:17 +0100 Subject: Add `if` compilation --- src/compiler.h | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/src/compiler.h b/src/compiler.h index ff2c6e0..7323f4d 100644 --- a/src/compiler.h +++ b/src/compiler.h @@ -316,6 +316,27 @@ compile_proc_call(Object *obj) { } } +void +compile_if(Object *obj) { + char *lab_false = generate_label(); + compile_object(obj->condition); + printf(" pop rax\n"); + printf(" cmp rax, %d\n", FALSE_VAL); + printf(" je %s\n", lab_false); + compile_object(obj->expr_true); + if (obj->expr_false != NULL) { + char *lab_exit = generate_label(); + printf(" jmp %s\n", lab_exit); + printf("%s:\n", lab_false); + compile_object(obj->expr_false); + printf("%s:\n", lab_exit); + free(lab_exit); + } else { + printf("%s:\n", lab_false); + } + free(lab_false); +} + void compile_object(Object *obj) { switch (obj->type) { @@ -324,6 +345,7 @@ compile_object(Object *obj) { case OBJ_TYPE_FALSE: { compile_boolean(obj); } break; case OBJ_TYPE_FIXNUM: { compile_fixnum(obj); } break; case OBJ_TYPE_PAIR: { compile_proc_call(obj); } break; + case OBJ_TYPE_IF: { compile_if(obj); } break; default: break; } } -- cgit v1.2.1