[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
This commit is contained in:
parent
fe6ee5e921
commit
c8b60c8ac2
@ -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->body = cast->body;
|
||||||
scope->locals = cast->locals;
|
scope->locals = cast->locals;
|
||||||
|
scope->local_depth_offset = 0;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case PM_CLASS_NODE: {
|
case PM_CLASS_NODE: {
|
||||||
|
@ -789,6 +789,23 @@ module Prism
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
CODE
|
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
|
end
|
||||||
|
|
||||||
def test_NextNode
|
def test_NextNode
|
||||||
@ -924,6 +941,15 @@ module Prism
|
|||||||
a + b + c
|
a + b + c
|
||||||
CODE
|
CODE
|
||||||
assert_prism_eval("begin; rescue; end")
|
assert_prism_eval("begin; rescue; end")
|
||||||
|
|
||||||
|
assert_prism_eval(<<~CODE)
|
||||||
|
begin
|
||||||
|
rescue
|
||||||
|
args.each do |key, value|
|
||||||
|
tmp[key] = 1
|
||||||
|
end
|
||||||
|
end
|
||||||
|
CODE
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_RescueModiferNode
|
def test_RescueModiferNode
|
||||||
|
Loading…
x
Reference in New Issue
Block a user