summaryrefslogtreecommitdiff
path: root/class.c
diff options
context:
space:
mode:
authormame <mame@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2010-10-26 17:27:32 +0000
committermame <mame@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2010-10-26 17:27:32 +0000
commita11576816197d75fa17d959e74cabb612ba8b8be (patch)
tree22614a970841b61b3ac1bac4dca118b5561e4ed2 /class.c
parente169ea0cacc981c506f75a2d3e093558e599d21d (diff)
* class.c, constant.h, gc.c, method.h, object.c, variable.c,
vm_insnhelper.c: use struct rb_constant_entry_t as entry of RCLASS_CONST_TBL. RCLASS_CONST_TBL has contained VALUE of constant directly. Now instead rb_const_entry_t is contained in RCLASS_CONST_TBL, rb_const_entry_t is managed by malloc, and have not only the value itself but also visibility flag. This is another preparation for private constant (see [ruby-dev:39685][ruby-core:32698]). git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@29602 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'class.c')
-rw-r--r--class.c18
1 files changed, 14 insertions, 4 deletions
diff --git a/class.c b/class.c
index a6634679d5..2cb3d2e3bb 100644
--- a/class.c
+++ b/class.c
@@ -26,6 +26,7 @@
#include "ruby/ruby.h"
#include "ruby/st.h"
#include "method.h"
+#include "constant.h"
#include "vm_core.h"
#include <ctype.h>
@@ -140,6 +141,14 @@ clone_method(ID mid, const rb_method_entry_t *me, struct clone_method_data *data
return ST_CONTINUE;
}
+static int
+clone_const(ID key, const rb_const_entry_t *ce, st_table *tbl)
+{
+ rb_const_entry_t *nce = ALLOC(rb_const_entry_t);
+ *nce = *ce;
+ st_insert(tbl, key, (st_data_t)nce);
+}
+
/* :nodoc: */
VALUE
rb_mod_init_copy(VALUE clone, VALUE orig)
@@ -164,15 +173,15 @@ rb_mod_init_copy(VALUE clone, VALUE orig)
}
if (RCLASS_CONST_TBL(orig)) {
if (RCLASS_CONST_TBL(clone)) {
- st_free_table(RCLASS_CONST_TBL(clone));
+ rb_free_const_table(RCLASS_CONST_TBL(clone));
}
- RCLASS_CONST_TBL(clone) = st_copy(RCLASS_CONST_TBL(orig));
+ RCLASS_CONST_TBL(clone) = st_init_numtable();
+ st_foreach(RCLASS_CONST_TBL(orig), clone_const, (st_data_t)RCLASS_CONST_TBL(clone));
}
if (RCLASS_M_TBL(orig)) {
struct clone_method_data data;
if (RCLASS_M_TBL(clone)) {
- extern void rb_free_m_table(st_table *tbl);
rb_free_m_table(RCLASS_M_TBL(clone));
}
data.tbl = RCLASS_M_TBL(clone) = st_init_numtable();
@@ -224,7 +233,8 @@ rb_singleton_class_clone(VALUE obj)
RCLASS_IV_TBL(clone) = st_copy(RCLASS_IV_TBL(klass));
}
if (RCLASS_CONST_TBL(klass)) {
- RCLASS_CONST_TBL(clone) = st_copy(RCLASS_CONST_TBL(klass));
+ RCLASS_CONST_TBL(clone) = st_init_numtable();
+ st_foreach(RCLASS_CONST_TBL(klass), clone_const, (st_data_t)RCLASS_CONST_TBL(clone));
}
RCLASS_M_TBL(clone) = st_init_numtable();
data.tbl = RCLASS_M_TBL(clone);