summaryrefslogtreecommitdiffhomepage
path: root/src/struct.c
diff options
context:
space:
mode:
authorBeoran <[email protected]>2012-08-09 21:58:32 +0200
committerBeoran <[email protected]>2012-08-09 21:58:32 +0200
commit38e3b675ee2b5583b25f05b1ac9eff9389d30d99 (patch)
tree052df6184e1cc0a9257ee0e7262c30e96abf3655 /src/struct.c
parent6b2e0b210b752669a545120942c7e3b136d395c4 (diff)
downloadmruby-38e3b675ee2b5583b25f05b1ac9eff9389d30d99.tar.gz
mruby-38e3b675ee2b5583b25f05b1ac9eff9389d30d99.zip
Struct.new crashed if no arguments are given. Fixed.
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);