From 38e3b675ee2b5583b25f05b1ac9eff9389d30d99 Mon Sep 17 00:00:00 2001 From: Beoran Date: Thu, 9 Aug 2012 21:58:32 +0200 Subject: Struct.new crashed if no arguments are given. Fixed. --- build/.gitkeep | 0 src/struct.c | 49 +++++++++++++++++++++++++++---------------------- test/t/struct.rb | 6 ++++++ 3 files changed, 33 insertions(+), 22 deletions(-) delete mode 100644 build/.gitkeep diff --git a/build/.gitkeep b/build/.gitkeep deleted file mode 100644 index e69de29bb..000000000 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 Date: Thu, 9 Aug 2012 22:09:47 +0200 Subject: Also added test for charsh bug with Struct.new without parameters. --- build/.gitkeep | 0 test/t/struct.rb | 10 +++++----- 2 files changed, 5 insertions(+), 5 deletions(-) create mode 100644 build/.gitkeep diff --git a/build/.gitkeep b/build/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/test/t/struct.rb b/test/t/struct.rb index bbd3e4d70..d79b30c0e 100644 --- a/test/t/struct.rb +++ b/test/t/struct.rb @@ -16,11 +16,11 @@ if Object.const_defined?(:Struct) c.members == [:m1,:m2] end - # Crash bug withStruc.new and no params, should make empty struct? - # assert('Struct.new', '15.2.18.3.1') do - # c = Struct.new() - # c.superclass == Struct - # end + # Check crash bug with Struc.new and no params. + assert('Struct.new', '15.2.18.3.1') do + c = Struct.new() + c.superclass == Struct and c.members == [] + end assert('Struct#==', '15.2.18.4.1') do c = Struct.new(:m1, :m2) -- cgit v1.2.3