Commit 38e3b675 authored by Beoran's avatar Beoran

Struct.new crashed if no arguments are given. Fixed.

parent 6b2e0b21
...@@ -368,30 +368,35 @@ mrb_struct_s_def(mrb_state *mrb, mrb_value klass) ...@@ -368,30 +368,35 @@ mrb_struct_s_def(mrb_state *mrb, mrb_value klass)
name = mrb_nil_value(); name = mrb_nil_value();
rest = mrb_nil_value(); rest = mrb_nil_value();
mrb_get_args(mrb, "*&", &argv, &argc, &b); mrb_get_args(mrb, "*&", &argv, &argc, &b);
if (argc > 0) name = argv[0]; if (argc == 0) { /* special case to avoid crash */
if (argc > 1) rest = argv[1]; rest = mrb_ary_new(mrb);
if (mrb_type(rest) == MRB_TT_ARRAY) { }
if (!mrb_nil_p(name) && SYMBOL_P(name)) { else {
/* 1stArgument:symbol -> name=nil rest=argv[0]-[n] */ if (argc > 0) name = argv[0];
mrb_ary_unshift(mrb, rest, name); if (argc > 1) rest = argv[1];
name = mrb_nil_value(); if (mrb_type(rest) == MRB_TT_ARRAY) {
if (!mrb_nil_p(name) && SYMBOL_P(name)) {
/* 1stArgument:symbol -> name=nil rest=argv[0]-[n] */
mrb_ary_unshift(mrb, rest, name);
name = mrb_nil_value();
}
} }
} else {
else { pargv = &argv[1];
pargv = &argv[1]; argcnt = argc-1;
argcnt = argc-1; if (!mrb_nil_p(name) && SYMBOL_P(name)) {
if (!mrb_nil_p(name) && SYMBOL_P(name)) { /* 1stArgument:symbol -> name=nil rest=argv[0]-[n] */
/* 1stArgument:symbol -> name=nil rest=argv[0]-[n] */ name = mrb_nil_value();
name = mrb_nil_value(); pargv = &argv[0];
pargv = &argv[0]; argcnt++;
argcnt++; }
rest = mrb_ary_new_from_values(mrb, argcnt, pargv);
} }
rest = mrb_ary_new_from_values(mrb, argcnt, pargv); for (i=0; i<RARRAY_LEN(rest); i++) {
} id = mrb_to_id(mrb, RARRAY_PTR(rest)[i]);
for (i=0; i<RARRAY_LEN(rest); i++) { RARRAY_PTR(rest)[i] = mrb_symbol_value(id);
id = mrb_to_id(mrb, RARRAY_PTR(rest)[i]); }
RARRAY_PTR(rest)[i] = mrb_symbol_value(id); }
}
st = make_struct(mrb, name, rest, struct_class(mrb)); st = make_struct(mrb, name, rest, struct_class(mrb));
if (!mrb_nil_p(b)) { if (!mrb_nil_p(b)) {
mrb_funcall(mrb, b, "call", 1, &st); mrb_funcall(mrb, b, "call", 1, &st);
......
...@@ -16,6 +16,12 @@ if Object.const_defined?(:Struct) ...@@ -16,6 +16,12 @@ if Object.const_defined?(:Struct)
c.members == [:m1,:m2] c.members == [:m1,:m2]
end end
# Crash bug withStruc.new and no params, should make empty struct?
# assert('Struct.new', '15.2.18.3.1') do
# c = Struct.new()
# c.superclass == Struct
# end
assert('Struct#==', '15.2.18.4.1') do assert('Struct#==', '15.2.18.4.1') do
c = Struct.new(:m1, :m2) c = Struct.new(:m1, :m2)
cc1 = c.new(1,2) cc1 = c.new(1,2)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment