aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBad Diode <bd@badd10de.dev>2022-01-03 19:59:54 +0100
committerBad Diode <bd@badd10de.dev>2022-01-03 19:59:54 +0100
commita926335a9098a4ca42b447c012b038881c1e3559 (patch)
tree7445a8594a0986b1502423c707e34e92dff714fe
parent073105080457218e67d999d6d70610914c9effe7 (diff)
downloadbdl-a926335a9098a4ca42b447c012b038881c1e3559.tar.gz
bdl-a926335a9098a4ca42b447c012b038881c1e3559.zip
Add some comments for later
-rw-r--r--src/ir.h10
-rw-r--r--src/parser.c7
2 files changed, 16 insertions, 1 deletions
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) {
362 if (IS_BUILTIN(obj->head)) { 362 if (IS_BUILTIN(obj->head)) {
363 compile_builtin(program, proc, obj); 363 compile_builtin(program, proc, obj);
364 } else if (IS_LAMBDA(obj->head)) { 364 } else if (IS_LAMBDA(obj->head)) {
365 // FIXME: Setup stack parameter order and call convention.
366 Object *tail = obj->tail;
367 while (tail != NULL) {
368 compile_object(program, proc, tail->head);
369 tail = tail->tail;
370 }
365 compile_object(program, proc, obj->head); 371 compile_object(program, proc, obj->head);
366 INST_SIMPLE(proc, OP_CALL, obj->line, obj->col); 372 INST_SIMPLE(proc, OP_CALL, obj->line, obj->col);
367 } else { 373 } else {
@@ -399,6 +405,10 @@ compile_def(ProgramIr *program, Procedure *proc, Object *obj) {
399 405
400void 406void
401compile_lambda(ProgramIr *program, Procedure *proc, Object *obj) { 407compile_lambda(ProgramIr *program, Procedure *proc, Object *obj) {
408 // NOTE: As an optimization, instead of storing and comparing lambdas, we
409 // could calculate a checksum and only check equality in full if they
410 // differ. We can also calculate the equality of Procedure instead of
411 // lambdas.
402 for (size_t i = 0; i < array_size(program->lambdas); ++i) { 412 for (size_t i = 0; i < array_size(program->lambdas); ++i) {
403 if (object_equal(program->lambdas[i], obj)) { 413 if (object_equal(program->lambdas[i], obj)) {
404 INST_ARG(proc, OP_PUSH, obj, obj->line, obj->col); 414 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) {
884 if (n_params_a != n_params_b || n_expr_a != n_expr_b) { 884 if (n_params_a != n_params_b || n_expr_a != n_expr_b) {
885 return false; 885 return false;
886 } 886 }
887 for (size_t i = 0; i < array_size(a->body); ++i) { 887 for (size_t i = 0; i < n_params_a; ++i) {
888 if (!object_equal(a->params[i], b->params[i])) {
889 return false;
890 }
891 }
892 for (size_t i = 0; i < n_expr_a; ++i) {
888 if (!object_equal(a->body[i], b->body[i])) { 893 if (!object_equal(a->body[i], b->body[i])) {
889 return false; 894 return false;
890 } 895 }