aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBad Diode <bd@badd10de.dev>2021-11-03 15:28:17 +0100
committerBad Diode <bd@badd10de.dev>2021-11-03 15:28:17 +0100
commit84c2bf292ddcb91543715951805ebc2335c46567 (patch)
treec84234202eade16c1f80cddfdc4ac64660cad7c8
parent9c8022b286993ea4123211005878681bd207fa0c (diff)
downloadbdl-84c2bf292ddcb91543715951805ebc2335c46567.tar.gz
bdl-84c2bf292ddcb91543715951805ebc2335c46567.zip
Add `if` compilation
-rw-r--r--src/compiler.h22
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
319void 319void
320compile_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
340void
320compile_object(Object *obj) { 341compile_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}