summaryrefslogtreecommitdiffhomepage
path: root/mrbgems/mruby-struct
diff options
context:
space:
mode:
authorYukihiro "Matz" Matsumoto <[email protected]>2017-10-29 00:25:45 +0900
committerYukihiro "Matz" Matsumoto <[email protected]>2017-10-29 00:25:45 +0900
commit77edafb04c4bc15e3c348acb0d1e7f873b7a66f0 (patch)
treef52a8434f3ce6f7eb17ac702123984aedc2bf490 /mrbgems/mruby-struct
parent59dc7d07636a37da3c38dd6293b40b019cc3cdc8 (diff)
downloadmruby-77edafb04c4bc15e3c348acb0d1e7f873b7a66f0.tar.gz
mruby-77edafb04c4bc15e3c348acb0d1e7f873b7a66f0.zip
Need to check number of argument of `Struct#new`; fix #3823
Diffstat (limited to 'mrbgems/mruby-struct')
-rw-r--r--mrbgems/mruby-struct/src/struct.c22
-rw-r--r--mrbgems/mruby-struct/test/struct.rb9
2 files changed, 14 insertions, 17 deletions
diff --git a/mrbgems/mruby-struct/src/struct.c b/mrbgems/mruby-struct/src/struct.c
index fed9e8105..019f99f22 100644
--- a/mrbgems/mruby-struct/src/struct.c
+++ b/mrbgems/mruby-struct/src/struct.c
@@ -283,17 +283,21 @@ mrb_struct_s_def(mrb_state *mrb, mrb_value klass)
name = mrb_nil_value();
mrb_get_args(mrb, "*&", &argv, &argc, &b);
if (argc == 0) { /* special case to avoid crash */
- rest = mrb_ary_new(mrb);
+ mrb_raise(mrb, E_ARGUMENT_ERROR, "wrong number of arguments");
}
else {
- if (argc > 0) name = argv[0];
- pargv = &argv[1];
- argcnt = argc-1;
- if (!mrb_nil_p(name) && mrb_symbol_p(name)) {
- /* 1stArgument:symbol -> name=nil rest=argv[0]-[n] */
- name = mrb_nil_value();
- pargv = &argv[0];
- argcnt++;
+ pargv = argv;
+ argcnt = argc;
+ if (argc > 0) {
+ name = argv[0];
+ if (mrb_symbol_p(name)) {
+ /* 1stArgument:symbol -> name=nil rest=argv[0..n] */
+ name = mrb_nil_value();
+ }
+ else {
+ pargv++;
+ argcnt--;
+ }
}
rest = mrb_ary_new_from_values(mrb, argcnt, pargv);
for (i=0; i<RARRAY_LEN(rest); i++) {
diff --git a/mrbgems/mruby-struct/test/struct.rb b/mrbgems/mruby-struct/test/struct.rb
index 421fe4b5d..982e344e2 100644
--- a/mrbgems/mruby-struct/test/struct.rb
+++ b/mrbgems/mruby-struct/test/struct.rb
@@ -11,13 +11,6 @@ assert('Struct.new', '15.2.18.3.1') do
assert_equal [:m1, :m2], c.members
end
-# Check crash bug with Struc.new and no params.
-assert('Struct.new', '15.2.18.3.1') do
- c = Struct.new()
- assert_equal Struct, c.superclass
- assert_equal [], c.members
-end
-
assert('Struct#==', '15.2.18.4.1') do
c = Struct.new(:m1, :m2)
cc1 = c.new(1,2)
@@ -192,7 +185,7 @@ assert("Struct.new generates subclass of Struct") do
begin
original_struct = Struct
Struct = String
- assert_equal original_struct, original_struct.new.superclass
+ assert_equal original_struct, original_struct.new(:foo).superclass
ensure
Struct = original_struct
end