diff options
| author | KOBAYASHI Shuji <[email protected]> | 2019-06-16 20:43:23 +0900 |
|---|---|---|
| committer | KOBAYASHI Shuji <[email protected]> | 2019-06-16 20:43:23 +0900 |
| commit | 030dd6655e47dad4af4b48a74646712c00684698 (patch) | |
| tree | ae6871b0d93d36dc5cfd896cbd63f23db04e5297 /mrbgems/mruby-metaprog | |
| parent | ab5ffb308b65a365d5f68662f30b223ccbde3b03 (diff) | |
| download | mruby-030dd6655e47dad4af4b48a74646712c00684698.tar.gz mruby-030dd6655e47dad4af4b48a74646712c00684698.zip | |
Fix cvar, ivar, const and method can be removed to frozen object
Diffstat (limited to 'mrbgems/mruby-metaprog')
| -rw-r--r-- | mrbgems/mruby-metaprog/src/metaprog.c | 1 | ||||
| -rw-r--r-- | mrbgems/mruby-metaprog/test/metaprog.rb | 8 |
2 files changed, 7 insertions, 2 deletions
diff --git a/mrbgems/mruby-metaprog/src/metaprog.c b/mrbgems/mruby-metaprog/src/metaprog.c index 43d27f4dc..0d207ef41 100644 --- a/mrbgems/mruby-metaprog/src/metaprog.c +++ b/mrbgems/mruby-metaprog/src/metaprog.c @@ -641,6 +641,7 @@ mrb_mod_remove_method(mrb_state *mrb, mrb_value mod) mrb_value *argv; mrb_get_args(mrb, "*", &argv, &argc); + mrb_check_frozen(mrb, mrb_obj_ptr(mod)); while (argc--) { remove_method(mrb, mod, mrb_obj_to_sym(mrb, *argv)); argv++; diff --git a/mrbgems/mruby-metaprog/test/metaprog.rb b/mrbgems/mruby-metaprog/test/metaprog.rb index 685fdf196..46b98d0ed 100644 --- a/mrbgems/mruby-metaprog/test/metaprog.rb +++ b/mrbgems/mruby-metaprog/test/metaprog.rb @@ -298,6 +298,9 @@ assert('Module#remove_class_variable', '15.2.2.4.39') do assert_raise(NameError) do Test4RemoveClassVariable.remove_class_variable(:@v) end + assert_raise(FrozenError) do + Test4RemoveClassVariable.freeze.remove_class_variable(:@@cv) + end end assert('Module#remove_method', '15.2.2.4.41') do @@ -305,9 +308,9 @@ assert('Module#remove_method', '15.2.2.4.41') do class Parent def hello end - end + end - class Child < Parent + class Child < Parent def hello end end @@ -317,6 +320,7 @@ assert('Module#remove_method', '15.2.2.4.41') do assert_same klass, klass.class_eval{ remove_method :hello } assert_true klass.instance_methods.include? :hello assert_false klass.instance_methods(false).include? :hello + assert_raise(FrozenError) { klass.freeze.remove_method :m } end assert('Module.nesting', '15.2.2.2.2') do |
