diff options
-rw-r--r-- | ChangeLog | 6 | ||||
-rw-r--r-- | class.c | 22 | ||||
-rw-r--r-- | test/ruby/test_module.rb | 19 | ||||
-rw-r--r-- | version.h | 2 |
4 files changed, 39 insertions, 10 deletions
@@ -1,3 +1,9 @@ +Mon Jun 23 18:51:43 2014 Nobuyoshi Nakada <nobu@ruby-lang.org> + + * class.c (rb_mod_init_copy): always clear instance variable, + constant and method tables first, regardless the source tables. + [ruby-dev:48182] [Bug #9813] + Mon Jun 23 18:50:13 2014 Nobuyoshi Nakada <nobu@ruby-lang.org> * thread.c (thread_start_func_2): stop if forked in a sub-thread, @@ -205,12 +205,21 @@ rb_mod_init_copy(VALUE clone, VALUE orig) } RCLASS_SUPER(clone) = RCLASS_SUPER(orig); RCLASS_EXT(clone)->allocator = RCLASS_EXT(orig)->allocator; + if (RCLASS_IV_TBL(clone)) { + st_free_table(RCLASS_IV_TBL(clone)); + RCLASS_IV_TBL(clone) = 0; + } + if (RCLASS_CONST_TBL(clone)) { + rb_free_const_table(RCLASS_CONST_TBL(clone)); + RCLASS_CONST_TBL(clone) = 0; + } + if (RCLASS_M_TBL(clone)) { + rb_free_m_table(RCLASS_M_TBL(clone)); + RCLASS_M_TBL(clone) = 0; + } if (RCLASS_IV_TBL(orig)) { st_data_t id; - if (RCLASS_IV_TBL(clone)) { - st_free_table(RCLASS_IV_TBL(clone)); - } RCLASS_IV_TBL(clone) = st_copy(RCLASS_IV_TBL(orig)); CONST_ID(id, "__tmp_classpath__"); st_delete(RCLASS_IV_TBL(clone), &id, 0); @@ -220,16 +229,11 @@ rb_mod_init_copy(VALUE clone, VALUE orig) st_delete(RCLASS_IV_TBL(clone), &id, 0); } if (RCLASS_CONST_TBL(orig)) { - if (RCLASS_CONST_TBL(clone)) { - rb_free_const_table(RCLASS_CONST_TBL(clone)); - } + RCLASS_CONST_TBL(clone) = st_init_numtable(); st_foreach(RCLASS_CONST_TBL(orig), clone_const_i, (st_data_t)RCLASS_CONST_TBL(clone)); } if (RCLASS_M_TBL(orig)) { - if (RCLASS_M_TBL(clone)) { - rb_free_m_table(RCLASS_M_TBL(clone)); - } RCLASS_M_TBL(clone) = st_init_numtable(); st_foreach(RCLASS_M_TBL(orig), clone_method_i, (st_data_t)clone); } diff --git a/test/ruby/test_module.rb b/test/ruby/test_module.rb index c6979d8393..c8e25bad0f 100644 --- a/test/ruby/test_module.rb +++ b/test/ruby/test_module.rb @@ -320,6 +320,25 @@ class TestModule < Test::Unit::TestCase assert_equal(:ok, Object.new.extend(m).foo, bug9535) end + def test_initialize_copy_empty + bug9813 = '[ruby-dev:48182] [Bug #9813]' + m = Module.new do + def x + end + const_set(:X, 1) + @x = 2 + end + assert_equal([:x], m.instance_methods) + assert_equal([:@x], m.instance_variables) + assert_equal([:X], m.constants) + m.module_eval do + initialize_copy(Module.new) + end + assert_empty(m.instance_methods, bug9813) + assert_empty(m.instance_variables, bug9813) + assert_empty(m.constants, bug9813) + end + def test_dup bug6454 = '[ruby-core:45132]' @@ -1,6 +1,6 @@ #define RUBY_VERSION "2.0.0" #define RUBY_RELEASE_DATE "2014-06-23" -#define RUBY_PATCHLEVEL 498 +#define RUBY_PATCHLEVEL 499 #define RUBY_RELEASE_YEAR 2014 #define RUBY_RELEASE_MONTH 6 |