Skip to content

Commit

Permalink
Squashed 'mruby_test/' changes from cd5133c..08a1dd2
Browse files Browse the repository at this point in the history
08a1dd2 Merge pull request #3207 from ksss/splat
d467022 Add testing for regression
d265c03 Fix SEGV when splat object

git-subtree-dir: mruby_test
git-subtree-split: 08a1dd2ac89333bd928a3300f712d1a7fb57e8ff
  • Loading branch information
MATSUMOTO Ryosuke committed Sep 9, 2016
1 parent 125a205 commit 65d0863
Show file tree
Hide file tree
Showing 2 changed files with 50 additions and 3 deletions.
23 changes: 20 additions & 3 deletions src/array.c
Expand Up @@ -891,15 +891,32 @@ mrb_ary_rindex_m(mrb_state *mrb, mrb_value self)
MRB_API mrb_value
mrb_ary_splat(mrb_state *mrb, mrb_value v)
{
mrb_value a, recv_class;

if (mrb_array_p(v)) {
return v;
}
if (mrb_respond_to(mrb, v, mrb_intern_lit(mrb, "to_a"))) {
return mrb_funcall(mrb, v, "to_a", 0);

if (!mrb_respond_to(mrb, v, mrb_intern_lit(mrb, "to_a"))) {
return mrb_ary_new_from_values(mrb, 1, &v);
}
else {

a = mrb_funcall(mrb, v, "to_a", 0);
if (mrb_array_p(a)) {
return a;
}
else if (mrb_nil_p(a)) {
return mrb_ary_new_from_values(mrb, 1, &v);
}
else {
recv_class = mrb_obj_value(mrb_obj_class(mrb, v));
mrb_raisef(mrb, E_TYPE_ERROR, "can't convert %S to Array (%S#to_a gives %S)",
recv_class,
recv_class,
mrb_obj_value(mrb_obj_class(mrb, a))
);
return mrb_undef_value();
}
}

static mrb_value
Expand Down
30 changes: 30 additions & 0 deletions test/t/syntax.rb
Expand Up @@ -307,6 +307,36 @@ def fb
assert_equal 1, when_value
end

assert('splat object in assignment') do
o = Object.new
def o.to_a
nil
end
assert_equal [o], (a = *o)

def o.to_a
1
end
assert_raise(TypeError) { a = *o }

def o.to_a
[2]
end
assert_equal [2], (a = *o)
end

assert('splat object in case statement') do
o = Object.new
def o.to_a
nil
end
a = case o
when *o
1
end
assert_equal 1, a
end

assert('splat in case statement') do
values = [3,5,1,7,8]
testa = [1,2,7]
Expand Down

0 comments on commit 65d0863

Please sign in to comment.