From fedab6bac08333ca31e69f21add7b66c575ec87c Mon Sep 17 00:00:00 2001 From: Bad Diode Date: Tue, 2 Nov 2021 14:07:46 +0100 Subject: Add compilation of `display` primitive --- src/compiler.h | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) (limited to 'src/compiler.h') diff --git a/src/compiler.h b/src/compiler.h index 76d6ccf..18e8a3e 100644 --- a/src/compiler.h +++ b/src/compiler.h @@ -139,6 +139,12 @@ compile_type_predicate(OpType op, Object* args) { printf(" ;; <-- compile_type_predicate\n"); } + +// TODO: Next -> numerical comparison operators =, <=, ... +// "=", "<", ">", "<=", ">=", +// "not", "and", "or", +// NOTE: Make sure to stop evaluating if the condition is not met. + void compile_arithmetic_list(OpType op, Object* args) { printf(" ;; --> compile_arithmetic_list\n"); @@ -183,6 +189,11 @@ compile_proc_call(Object *obj) { if (sv_equal(&obj->head->text, &STRING("bool?"))) { compile_type_predicate(OP_IS_BOOL, obj->tail); } + if (sv_equal(&obj->head->text, &STRING("display"))) { + compile_object(obj->tail->head); + printf(" pop rdi\n"); + printf(" call display\n"); + } } void @@ -199,6 +210,14 @@ compile_object(Object *obj) { void compile(Root *roots) { + printf("%%define NIL_VAL %d\n", NIL_VAL); + printf("%%define BOOL_MASK %d\n", BOOL_MASK); + printf("%%define BOOL_TAG %d\n", BOOL_TAG); + printf("%%define BOOL_SHIFT %d\n", BOOL_SHIFT); + printf("%%define FIXNUM_MASK %d\n", FIXNUM_MASK); + printf("%%define FIXNUM_TAG %d\n", FIXNUM_TAG); + printf("%%define FIXNUM_SHIFT %d\n", FIXNUM_SHIFT); + printf("\n"); emit_file(PRELUDE_FILE); for (size_t i = 0; i < array_size(roots); i++) { Object *root = roots[i]; -- cgit v1.2.1