diff options
author | Bad Diode <bd@badd10de.dev> | 2021-10-31 11:15:16 +0100 |
---|---|---|
committer | Bad Diode <bd@badd10de.dev> | 2021-10-31 11:15:16 +0100 |
commit | 3ed3aa338296f82046de2061e717b49328c8b057 (patch) | |
tree | ab7a90c367e54edc15f272618b4fafb0447446c0 /src/parser.c | |
parent | a31eff3926b4355ab9a4d7a76b0007fae0dd68b2 (diff) | |
download | bdl-3ed3aa338296f82046de2061e717b49328c8b057.tar.gz bdl-3ed3aa338296f82046de2061e717b49328c8b057.zip |
Ensure lambdas wrap their env tables
Diffstat (limited to 'src/parser.c')
-rw-r--r-- | src/parser.c | 6 |
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 | } |