diff options
| author | Yukihiro "Matz" Matsumoto <[email protected]> | 2017-10-29 00:25:45 +0900 |
|---|---|---|
| committer | Yukihiro "Matz" Matsumoto <[email protected]> | 2017-10-29 00:25:45 +0900 |
| commit | 77edafb04c4bc15e3c348acb0d1e7f873b7a66f0 (patch) | |
| tree | f52a8434f3ce6f7eb17ac702123984aedc2bf490 /mrbgems/mruby-struct | |
| parent | 59dc7d07636a37da3c38dd6293b40b019cc3cdc8 (diff) | |
| download | mruby-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.c | 22 | ||||
| -rw-r--r-- | mrbgems/mruby-struct/test/struct.rb | 9 |
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 |
