From 584d6de3c29cb2cfef79ff17ac12f17ace000391 Mon Sep 17 00:00:00 2001 From: Kouhei Sutou Date: Tue, 24 Feb 2015 00:16:41 +0900 Subject: Fix a bug that if and no return value case can't return true clause value Here is a script that reproduce this problem: x = if true 1 else case 2 when 3 end 4 end p x # => nil # 1 is expected --- src/codegen.c | 9 +++++++-- test/t/syntax.rb | 14 ++++++++++++++ 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/src/codegen.c b/src/codegen.c index 46d457885..1fe26355f 100644 --- a/src/codegen.c +++ b/src/codegen.c @@ -1462,8 +1462,13 @@ codegen(codegen_scope *s, node *tree, int val) genop(s, MKOP_AB(OP_MOVE, cursp(), pos)); push(); } - else if (pos3) { - dispatch_linked(s, pos3); + else { + if (pos3) { + dispatch_linked(s, pos3); + } + if (head) { + pop(); + } } } break; diff --git a/test/t/syntax.rb b/test/t/syntax.rb index 7ec6272fe..2621e1b19 100644 --- a/test/t/syntax.rb +++ b/test/t/syntax.rb @@ -241,6 +241,20 @@ assert('Return values of case statements') do assert_equal 1, fb.call end +assert('Return values of if and case statements') do + true_clause_value = + if true + 1 + else + case 2 + when 3 + end + 4 + end + + assert_equal 1, true_clause_value +end + assert('splat in case statement') do values = [3,5,1,7,8] testa = [1,2,7] -- cgit v1.2.3