aboutsummaryrefslogtreecommitdiffstats
path: root/src/parser.c
diff options
context:
space:
mode:
authorBad Diode <bd@badd10de.dev>2021-10-31 11:15:16 +0100
committerBad Diode <bd@badd10de.dev>2021-10-31 11:15:16 +0100
commit3ed3aa338296f82046de2061e717b49328c8b057 (patch)
treeab7a90c367e54edc15f272618b4fafb0447446c0 /src/parser.c
parenta31eff3926b4355ab9a4d7a76b0007fae0dd68b2 (diff)
downloadbdl-3ed3aa338296f82046de2061e717b49328c8b057.tar.gz
bdl-3ed3aa338296f82046de2061e717b49328c8b057.zip
Ensure lambdas wrap their env tables
Diffstat (limited to 'src/parser.c')
-rw-r--r--src/parser.c6
1 files changed, 4 insertions, 2 deletions
diff --git a/src/parser.c b/src/parser.c
index d1a5e7a..59e8075 100644
--- a/src/parser.c
+++ b/src/parser.c
@@ -91,6 +91,7 @@ parse_lambda(Parser *parser, Errors *errors) {
91 Object *lambda = object_alloc(start, OBJ_TYPE_LAMBDA); 91 Object *lambda = object_alloc(start, OBJ_TYPE_LAMBDA);
92 array_init(lambda->params, 0); 92 array_init(lambda->params, 0);
93 array_init(lambda->body, 0); 93 array_init(lambda->body, 0);
94 lambda->env = NULL;
94 95
95 // Parse parameters. 96 // Parse parameters.
96 Token tok = next_token(parser); 97 Token tok = next_token(parser);
@@ -450,6 +451,7 @@ check_object_scope(Environment *env, Object *obj, Errors *errors) {
450 } break; 451 } break;
451 case OBJ_TYPE_LAMBDA: { 452 case OBJ_TYPE_LAMBDA: {
452 Environment *new_env = env_alloc(env); 453 Environment *new_env = env_alloc(env);
454 obj->env = new_env;
453 for (size_t i = 0; i < array_size(obj->body); i++) { 455 for (size_t i = 0; i < array_size(obj->body); i++) {
454 Object *expr = obj->body[i]; 456 Object *expr = obj->body[i];
455 check_object_scope(new_env, expr, errors); 457 check_object_scope(new_env, expr, errors);
@@ -488,7 +490,7 @@ remove_unused_expr(Object *obj) {
488 IS_STRING(expr) || 490 IS_STRING(expr) ||
489 IS_SYMBOL(expr) || 491 IS_SYMBOL(expr) ||
490 IS_LAMBDA(expr) || 492 IS_LAMBDA(expr) ||
491 IS_BOOL(expr) || 493 IS_BOOL(expr) ||
492 IS_NIL(expr)) { 494 IS_NIL(expr)) {
493 continue; 495 continue;
494 } 496 }
@@ -556,7 +558,7 @@ parse(Token *tokens, Errors *errors) {
556 IS_STRING(root) || 558 IS_STRING(root) ||
557 IS_SYMBOL(root) || 559 IS_SYMBOL(root) ||
558 IS_LAMBDA(root) || 560 IS_LAMBDA(root) ||
559 IS_BOOL(root) || 561 IS_BOOL(root) ||
560 IS_NIL(root)) { 562 IS_NIL(root)) {
561 continue; 563 continue;
562 } 564 }