diff options
author | Bad Diode <bd@badd10de.dev> | 2022-01-03 19:59:54 +0100 |
---|---|---|
committer | Bad Diode <bd@badd10de.dev> | 2022-01-03 19:59:54 +0100 |
commit | a926335a9098a4ca42b447c012b038881c1e3559 (patch) | |
tree | 7445a8594a0986b1502423c707e34e92dff714fe | |
parent | 073105080457218e67d999d6d70610914c9effe7 (diff) | |
download | bdl-a926335a9098a4ca42b447c012b038881c1e3559.tar.gz bdl-a926335a9098a4ca42b447c012b038881c1e3559.zip |
Add some comments for later
-rw-r--r-- | src/ir.h | 10 | ||||
-rw-r--r-- | src/parser.c | 7 |
2 files changed, 16 insertions, 1 deletions
@@ -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 | ||
400 | void | 406 | void |
401 | compile_lambda(ProgramIr *program, Procedure *proc, Object *obj) { | 407 | compile_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 | } |