Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Skip to content

Commit 5bd3463

Browse files
committed
setblockparam
1 parent cc24d7f commit 5bd3463

File tree

3 files changed

+15
-4
lines changed

3 files changed

+15
-4
lines changed

lib/syntax_tree/compiler.rb

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -415,8 +415,13 @@ def visit_assign(node)
415415
when GVar
416416
iseq.setglobal(node.target.value.value.to_sym)
417417
when Ident
418-
local_variable = visit(node.target)
419-
iseq.setlocal(local_variable.index, local_variable.level)
418+
lookup = visit(node.target)
419+
420+
if lookup.local.is_a?(YARV::LocalTable::BlockLocal)
421+
iseq.setblockparam(lookup.index, lookup.level)
422+
else
423+
iseq.setlocal(lookup.index, lookup.level)
424+
end
420425
when IVar
421426
iseq.setinstancevariable(node.target.value.value.to_sym)
422427
end

lib/syntax_tree/yarv.rb

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -252,13 +252,13 @@ def to_a
252252
insn
253253
when Array
254254
case insn[0]
255-
when :setlocal_WC_0, :setlocal_WC_1, :setlocal
255+
when :setlocal_WC_0, :setlocal_WC_1, :setlocal, :setblockparam
256256
iseq = self
257257

258258
case insn[0]
259259
when :setlocal_WC_1
260260
iseq = iseq.parent_iseq
261-
when :setlocal
261+
when :setlocal, :setblockparam
262262
insn[2].times { iseq = iseq.parent_iseq }
263263
end
264264

@@ -704,6 +704,11 @@ def send(method_id, argc, flag = VM_CALL_ARGS_SIMPLE, block_iseq = nil)
704704
end
705705
end
706706

707+
def setblockparam(index, level)
708+
stack.change_by(-1)
709+
push([:setblockparam, index, level])
710+
end
711+
707712
def setclassvariable(name)
708713
stack.change_by(-1)
709714

test/compiler_test.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -361,6 +361,7 @@ class CompilerTest < Minitest::Test
361361
"def foo(bar, *baz, &qux); end",
362362
"def foo(&qux); qux; end",
363363
"def foo(&qux); qux.call; end",
364+
"def foo(&qux); qux = bar; end",
364365
"def foo(bar:); end",
365366
"def foo(bar:, baz:); end",
366367
"def foo(bar: 1); end",

0 commit comments

Comments
 (0)