summaryrefslogtreecommitdiffhomepage
path: root/src/struct.c
diff options
context:
space:
mode:
authorPaolo Bosetti <[email protected]>2012-08-13 16:26:15 +0200
committerPaolo Bosetti <[email protected]>2012-08-13 16:26:15 +0200
commit4c56ce2744f4c8640de1b299c4ff4bd749a93345 (patch)
tree1286395880c71cd30e0938b020cd154c3317357c /src/struct.c
parent05127776cf0c528b549d723ba2e325332e49ced9 (diff)
parentcda1709a35ad7d495ec1a08793cd88b78e20c444 (diff)
downloadmruby-4c56ce2744f4c8640de1b299c4ff4bd749a93345.tar.gz
mruby-4c56ce2744f4c8640de1b299c4ff4bd749a93345.zip
Merge branch 'master' into XCode
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);