diff options
| author | Matt Valentine-House <matt@eightbitraptor.com> | 2023-12-06 20:22:18 +0000 |
|---|---|---|
| committer | Matt Valentine-House <matt@eightbitraptor.com> | 2023-12-06 21:12:08 +0000 |
| commit | c8b60c8ac2c8bbd077150792b5b207e983ab3634 (patch) | |
| tree | 76d34c1eeab307f668c64a716273acdd82268aff | |
| parent | fe6ee5e92148755b75ffd00ab29611b59a416d5a (diff) | |
[PRISM] Correct depth offset for block local vars
Blocks should always look at their own local table first, even when
defined inside an ensure/rescue or something else that uses depth
offset. We can ignore the depth offset if we're doing local lookups
inside a block
| -rw-r--r-- | prism_compile.c | 1 | ||||
| -rw-r--r-- | test/ruby/test_compile_prism.rb | 26 |
2 files changed, 27 insertions, 0 deletions
diff --git a/prism_compile.c b/prism_compile.c index 7540a95ba7..a365946ba3 100644 --- a/prism_compile.c +++ b/prism_compile.c @@ -1377,6 +1377,7 @@ pm_scope_node_init(const pm_node_t *node, pm_scope_node_t *scope, pm_scope_node_ } scope->body = cast->body; scope->locals = cast->locals; + scope->local_depth_offset = 0; break; } case PM_CLASS_NODE: { diff --git a/test/ruby/test_compile_prism.rb b/test/ruby/test_compile_prism.rb index a707aa5a9c..339300a638 100644 --- a/test/ruby/test_compile_prism.rb +++ b/test/ruby/test_compile_prism.rb @@ -789,6 +789,23 @@ module Prism end end CODE + assert_prism_eval(<<~CODE) + def test + ensure + {}.each do |key, value| + {}[key] = value + end + end + CODE + assert_prism_eval(<<~CODE) + def test + a = 1 + ensure + {}.each do |key, value| + {}[key] = a + end + end + CODE end def test_NextNode @@ -924,6 +941,15 @@ module Prism a + b + c CODE assert_prism_eval("begin; rescue; end") + + assert_prism_eval(<<~CODE) + begin + rescue + args.each do |key, value| + tmp[key] = 1 + end + end + CODE end def test_RescueModiferNode |
