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

Commit db88d33

Browse files
committed
Handle case/when
1 parent f8ac122 commit db88d33

File tree

2 files changed

+49
-0
lines changed

2 files changed

+49
-0
lines changed

lib/syntax_tree/visitor/compiler.rb

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1324,6 +1324,49 @@ def visit_call(node)
13241324
builder.send(node.message.value.to_sym, argc, flag, block_iseq)
13251325
end
13261326

1327+
def visit_case(node)
1328+
visit(node.value) if node.value
1329+
1330+
clauses = []
1331+
else_clause = nil
1332+
1333+
current = node.consequent
1334+
1335+
while current
1336+
clauses << current
1337+
1338+
if (current = current.consequent).is_a?(Else)
1339+
else_clause = current
1340+
break
1341+
end
1342+
end
1343+
1344+
branches =
1345+
clauses.map do |clause|
1346+
visit(clause.arguments)
1347+
builder.topn(1)
1348+
builder.send(:===, 1, VM_CALL_FCALL | VM_CALL_ARGS_SIMPLE)
1349+
[clause, builder.branchif(:label_00)]
1350+
end
1351+
1352+
builder.pop
1353+
1354+
if else_clause
1355+
visit(else_clause)
1356+
else
1357+
builder.putnil
1358+
end
1359+
1360+
builder.leave
1361+
1362+
branches.each_with_index do |(clause, branchif), index|
1363+
builder.leave if index != 0
1364+
branchif[1] = builder.label
1365+
builder.pop
1366+
visit(clause)
1367+
end
1368+
end
1369+
13271370
def visit_class(node)
13281371
name = node.constant.constant.value.to_sym
13291372
class_iseq =
@@ -2148,6 +2191,10 @@ def visit_vcall(node)
21482191
builder.send(node.value.value.to_sym, 0, flag)
21492192
end
21502193

2194+
def visit_when(node)
2195+
visit(node.statements)
2196+
end
2197+
21512198
def visit_while(node)
21522199
jumps = []
21532200

test/compiler_test.rb

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -268,6 +268,8 @@ class CompilerTest < Minitest::Test
268268
"until foo do bar end",
269269
"for i in [1, 2, 3] do i end",
270270
"foo ? bar : baz",
271+
"case foo when bar then 1 end",
272+
"case foo when bar then 1 else 2 end",
271273
# Constructed values
272274
"foo..bar",
273275
"foo...bar",

0 commit comments

Comments
 (0)