From 82731d9ee0964b0131a9ae25e81dbec583d3af28 Mon Sep 17 00:00:00 2001 From: Clayton Smith Date: Wed, 16 Nov 2016 14:09:20 -0500 Subject: Remove constant when a struct is redefined. --- mrbgems/mruby-struct/test/struct.rb | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) (limited to 'mrbgems/mruby-struct/test') diff --git a/mrbgems/mruby-struct/test/struct.rb b/mrbgems/mruby-struct/test/struct.rb index 02ecf69e4..bbfe18cb2 100644 --- a/mrbgems/mruby-struct/test/struct.rb +++ b/mrbgems/mruby-struct/test/struct.rb @@ -158,3 +158,24 @@ assert("Struct#dig") do assert_equal 1, a.dig(:purple, :red) assert_equal 1, a.dig(1, 0) end + +assert("Struct.new removes existing constant") do + begin + assert_not_equal Struct.new("Test", :a), Struct.new("Test", :a, :b) + ensure + Struct.remove_const :Test + end +end + +assert("Struct#initialize_copy requires struct to be the same type") do + begin + Struct.new("Test", :a) + a = Struct::Test.new("a") + Struct.new("Test", :a, :b) + assert_raise(TypeError) do + a.initialize_copy(Struct::Test.new("a", "b")) + end + ensure + Struct.remove_const :Test + end +end -- cgit v1.2.3 From b60d6c42aaa10ac99a03a92a3a34da4bee066af1 Mon Sep 17 00:00:00 2001 From: Clayton Smith Date: Wed, 16 Nov 2016 09:00:00 -0500 Subject: Don't allow array parameter in Struct.new --- mrbgems/mruby-struct/src/struct.c | 26 ++++++++------------------ mrbgems/mruby-struct/test/struct.rb | 6 ++++++ 2 files changed, 14 insertions(+), 18 deletions(-) (limited to 'mrbgems/mruby-struct/test') diff --git a/mrbgems/mruby-struct/src/struct.c b/mrbgems/mruby-struct/src/struct.c index 0ccb7f4cb..39c54639f 100644 --- a/mrbgems/mruby-struct/src/struct.c +++ b/mrbgems/mruby-struct/src/struct.c @@ -273,25 +273,15 @@ mrb_struct_s_def(mrb_state *mrb, mrb_value klass) } else { if (argc > 0) name = argv[0]; - if (argc > 1) rest = argv[1]; - if (mrb_array_p(rest)) { - if (!mrb_nil_p(name) && mrb_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) && mrb_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); + pargv = &argv[1]; + argcnt = argc-1; + if (!mrb_nil_p(name) && mrb_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); for (i=0; i Date: Fri, 25 Nov 2016 09:44:22 +0900 Subject: stop warnings in the test; ref #3280 --- mrbgems/mruby-struct/test/struct.rb | 2 ++ 1 file changed, 2 insertions(+) (limited to 'mrbgems/mruby-struct/test') diff --git a/mrbgems/mruby-struct/test/struct.rb b/mrbgems/mruby-struct/test/struct.rb index 3e5d00d1f..2fe684960 100644 --- a/mrbgems/mruby-struct/test/struct.rb +++ b/mrbgems/mruby-struct/test/struct.rb @@ -160,6 +160,7 @@ assert("Struct#dig") do end assert("Struct.new removes existing constant") do + skip "redefining Struct with same name cause warnings" begin assert_not_equal Struct.new("Test", :a), Struct.new("Test", :a, :b) ensure @@ -171,6 +172,7 @@ assert("Struct#initialize_copy requires struct to be the same type") do begin Struct.new("Test", :a) a = Struct::Test.new("a") + Struct.remove_const :Test Struct.new("Test", :a, :b) assert_raise(TypeError) do a.initialize_copy(Struct::Test.new("a", "b")) -- cgit v1.2.3 From 5771c9778e917803adeb6e3f6ab7b0680d10aaa1 Mon Sep 17 00:00:00 2001 From: "Yukihiro \"Matz\" Matsumoto" Date: Wed, 30 Nov 2016 03:51:23 +0900 Subject: add a test for #3296 --- mrbgems/mruby-struct/test/struct.rb | 10 ++++++++++ 1 file changed, 10 insertions(+) (limited to 'mrbgems/mruby-struct/test') diff --git a/mrbgems/mruby-struct/test/struct.rb b/mrbgems/mruby-struct/test/struct.rb index 2fe684960..1c0939e7f 100644 --- a/mrbgems/mruby-struct/test/struct.rb +++ b/mrbgems/mruby-struct/test/struct.rb @@ -187,3 +187,13 @@ assert("Struct.new does not allow array") do Struct.new("Test", [:a]) end end + +assert("Struct.new generates subclass of Struct") do + begin + original_struct = Struct + Struct = String + assert_equal original_struct, original_struct.new.superclass + ensure + Struct = original_struct + end +end -- cgit v1.2.3