From a926335a9098a4ca42b447c012b038881c1e3559 Mon Sep 17 00:00:00 2001 From: Bad Diode Date: Mon, 3 Jan 2022 19:59:54 +0100 Subject: Add some comments for later --- src/ir.h | 10 ++++++++++ src/parser.c | 7 ++++++- 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/src/ir.h b/src/ir.h index cd2100c..f039882 100644 --- a/src/ir.h +++ b/src/ir.h @@ -362,6 +362,12 @@ compile_proc_call(ProgramIr *program, Procedure *proc, Object *obj) { if (IS_BUILTIN(obj->head)) { compile_builtin(program, proc, obj); } else if (IS_LAMBDA(obj->head)) { + // FIXME: Setup stack parameter order and call convention. + Object *tail = obj->tail; + while (tail != NULL) { + compile_object(program, proc, tail->head); + tail = tail->tail; + } compile_object(program, proc, obj->head); INST_SIMPLE(proc, OP_CALL, obj->line, obj->col); } else { @@ -399,6 +405,10 @@ compile_def(ProgramIr *program, Procedure *proc, Object *obj) { void compile_lambda(ProgramIr *program, Procedure *proc, Object *obj) { + // NOTE: As an optimization, instead of storing and comparing lambdas, we + // could calculate a checksum and only check equality in full if they + // differ. We can also calculate the equality of Procedure instead of + // lambdas. for (size_t i = 0; i < array_size(program->lambdas); ++i) { if (object_equal(program->lambdas[i], obj)) { INST_ARG(proc, OP_PUSH, obj, obj->line, obj->col); diff --git a/src/parser.c b/src/parser.c index bd52c49..f6f5f41 100644 --- a/src/parser.c +++ b/src/parser.c @@ -884,7 +884,12 @@ object_equal(Object *a, Object *b) { if (n_params_a != n_params_b || n_expr_a != n_expr_b) { return false; } - for (size_t i = 0; i < array_size(a->body); ++i) { + for (size_t i = 0; i < n_params_a; ++i) { + if (!object_equal(a->params[i], b->params[i])) { + return false; + } + } + for (size_t i = 0; i < n_expr_a; ++i) { if (!object_equal(a->body[i], b->body[i])) { return false; } -- cgit v1.2.1