diff options
| author | Yukihiro "Matz" Matsumoto <[email protected]> | 2012-08-09 13:28:09 -0700 |
|---|---|---|
| committer | Yukihiro "Matz" Matsumoto <[email protected]> | 2012-08-09 13:28:09 -0700 |
| commit | 04c0d93684a0c5cabe8485f94c4717c0bc8bdf34 (patch) | |
| tree | 56037d310e24690d482cbd6318ef5df0fb4b7ada /src | |
| parent | 4debf651a3c7746fe360ec28838b67dae862245e (diff) | |
| parent | 3f670f7f4455bf5dbdb39cfcfd15d392f12de588 (diff) | |
| download | mruby-04c0d93684a0c5cabe8485f94c4717c0bc8bdf34.tar.gz mruby-04c0d93684a0c5cabe8485f94c4717c0bc8bdf34.zip | |
Merge pull request #419 from beoran/master
Struct.new crashed if no parameters given. This pull request fixes that.
Diffstat (limited to 'src')
| -rw-r--r-- | src/struct.c | 49 |
1 files changed, 27 insertions, 22 deletions
diff --git a/src/struct.c b/src/struct.c index beb7c2f46..a5ffe6453 100644 --- a/src/struct.c +++ b/src/struct.c @@ -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); |
