summaryrefslogtreecommitdiffhomepage
path: root/src/struct.c
diff options
context:
space:
mode:
authorYukihiro "Matz" Matsumoto <[email protected]>2012-08-09 13:28:09 -0700
committerYukihiro "Matz" Matsumoto <[email protected]>2012-08-09 13:28:09 -0700
commit04c0d93684a0c5cabe8485f94c4717c0bc8bdf34 (patch)
tree56037d310e24690d482cbd6318ef5df0fb4b7ada /src/struct.c
parent4debf651a3c7746fe360ec28838b67dae862245e (diff)
parent3f670f7f4455bf5dbdb39cfcfd15d392f12de588 (diff)
downloadmruby-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/struct.c')
-rw-r--r--src/struct.c49
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);