mirror of
https://github.com/mruby/mruby
synced 2026-06-08 16:11:16 +00:00
Merge pull request #419 from beoran/master
Struct.new crashed if no parameters given. This pull request fixes that.
This commit is contained in:
+27
-22
@@ -368,30 +368,35 @@ mrb_struct_s_def(mrb_state *mrb, mrb_value klass)
|
||||
name = mrb_nil_value();
|
||||
rest = mrb_nil_value();
|
||||
mrb_get_args(mrb, "*&", &argv, &argc, &b);
|
||||
if (argc > 0) name = argv[0];
|
||||
if (argc > 1) rest = argv[1];
|
||||
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();
|
||||
if (argc == 0) { /* special case to avoid crash */
|
||||
rest = mrb_ary_new(mrb);
|
||||
}
|
||||
else {
|
||||
if (argc > 0) name = argv[0];
|
||||
if (argc > 1) rest = argv[1];
|
||||
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 {
|
||||
pargv = &argv[1];
|
||||
argcnt = argc-1;
|
||||
if (!mrb_nil_p(name) && SYMBOL_P(name)) {
|
||||
/* 1stArgument:symbol -> name=nil rest=argv[0]-[n] */
|
||||
name = mrb_nil_value();
|
||||
pargv = &argv[0];
|
||||
argcnt++;
|
||||
else {
|
||||
pargv = &argv[1];
|
||||
argcnt = argc-1;
|
||||
if (!mrb_nil_p(name) && SYMBOL_P(name)) {
|
||||
/* 1stArgument:symbol -> name=nil rest=argv[0]-[n] */
|
||||
name = mrb_nil_value();
|
||||
pargv = &argv[0];
|
||||
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]);
|
||||
RARRAY_PTR(rest)[i] = mrb_symbol_value(id);
|
||||
}
|
||||
for (i=0; i<RARRAY_LEN(rest); i++) {
|
||||
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));
|
||||
if (!mrb_nil_p(b)) {
|
||||
mrb_funcall(mrb, b, "call", 1, &st);
|
||||
|
||||
@@ -16,6 +16,12 @@ if Object.const_defined?(:Struct)
|
||||
c.members == [:m1,:m2]
|
||||
end
|
||||
|
||||
# Check crash bug with Struc.new and no params.
|
||||
assert('Struct.new', '15.2.18.3.1') do
|
||||
c = Struct.new()
|
||||
c.superclass == Struct and c.members == []
|
||||
end
|
||||
|
||||
assert('Struct#==', '15.2.18.4.1') do
|
||||
c = Struct.new(:m1, :m2)
|
||||
cc1 = c.new(1,2)
|
||||
|
||||
Reference in New Issue
Block a user