diff options
author | mame <mame@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2010-10-26 17:27:32 +0000 |
---|---|---|
committer | mame <mame@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2010-10-26 17:27:32 +0000 |
commit | a11576816197d75fa17d959e74cabb612ba8b8be () | |
tree | 22614a970841b61b3ac1bac4dca118b5561e4ed2 | |
parent | e169ea0cacc981c506f75a2d3e093558e599d21d (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
-rw-r--r-- | ChangeLog | 11 | ||||
-rw-r--r-- | class.c | 18 | ||||
-rw-r--r-- | constant.h | 26 | ||||
-rw-r--r-- | gc.c | 37 | ||||
-rw-r--r-- | method.h | 1 | ||||
-rw-r--r-- | object.c | 3 | ||||
-rw-r--r-- | variable.c | 35 | ||||
-rw-r--r-- | vm_insnhelper.c | 3 |
8 files changed, 116 insertions, 18 deletions
@@ -1,3 +1,14 @@ Wed Oct 27 01:56:34 2010 Yusuke Endoh <[email protected]> * class.c, gc.c, object.c, variable.c, vm_insnhelper.c, @@ -26,6 +26,7 @@ #include "ruby/ruby.h" #include "ruby/st.h" #include "method.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; } /* :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)); } - RCLASS_CONST_TBL(clone) = st_copy(RCLASS_CONST_TBL(orig)); } 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_M_TBL(clone) = st_init_numtable(); data.tbl = RCLASS_M_TBL(clone); @@ -0,0 +1,26 @@ @@ -19,6 +19,7 @@ #include "eval_intern.h" #include "vm_core.h" #include "gc.h" #include <stdio.h> #include <setjmp.h> #include <sys/types.h> @@ -1504,6 +1505,38 @@ rb_free_m_table(st_table *tbl) st_free_table(tbl); } void rb_mark_tbl(st_table *tbl) { @@ -1718,7 +1751,7 @@ gc_mark_children(rb_objspace_t *objspace, VALUE ptr, int lev) case T_MODULE: mark_m_tbl(objspace, RCLASS_M_TBL(obj), lev); mark_tbl(objspace, RCLASS_IV_TBL(obj), lev); - mark_tbl(objspace, RCLASS_CONST_TBL(obj), lev); ptr = RCLASS_SUPER(obj); goto again; @@ -2181,7 +2214,7 @@ obj_free(rb_objspace_t *objspace, VALUE obj) st_free_table(RCLASS_IV_TBL(obj)); } if (RCLASS_CONST_TBL(obj)) { - st_free_table(RCLASS_CONST_TBL(obj)); } if (RCLASS_IV_INDEX_TBL(obj)) { st_free_table(RCLASS_IV_INDEX_TBL(obj)); @@ -99,5 +99,6 @@ int rb_method_entry_arity(const rb_method_entry_t *me); void rb_mark_method_entry(const rb_method_entry_t *me); void rb_free_method_entry(rb_method_entry_t *me); void rb_sweep_method_entry(void *vm); #endif /* METHOD_H */ @@ -19,6 +19,7 @@ #include <ctype.h> #include <math.h> #include <float.h> VALUE rb_cBasicObject; VALUE rb_mKernel; @@ -222,7 +223,7 @@ init_copy(VALUE dest, VALUE obj) RCLASS_IV_TBL(dest) = 0; } if (RCLASS_CONST_TBL(dest)) { - st_free_table(RCLASS_CONST_TBL(dest)); RCLASS_CONST_TBL(dest) = 0; } if (RCLASS_IV_TBL(obj)) { @@ -16,6 +16,7 @@ #include "ruby/util.h" #include "ruby/encoding.h" #include "node.h" void rb_vm_change_state(void); void rb_vm_inc_const_missing_count(void); @@ -71,8 +72,9 @@ fc_path(struct fc_result *fc, ID name) } static int -fc_i(ID key, VALUE value, struct fc_result *res) { if (!rb_is_const_id(key)) return ST_CONTINUE; if (value == res->klass) { @@ -1439,7 +1441,7 @@ rb_autoload(VALUE mod, ID id, const char *file) rb_raise(rb_eArgError, "empty file name"); } - if ((tbl = RCLASS_CONST_TBL(mod)) && st_lookup(tbl, (st_data_t)id, &av) && (VALUE)av != Qundef) return; rb_const_set(mod, id, Qundef); @@ -1463,8 +1465,11 @@ static NODE* autoload_delete(VALUE mod, ID id) { st_data_t val, load = 0, n = id; - st_delete(RCLASS_CONST_TBL(mod), &n, 0); if (st_lookup(RCLASS_IV_TBL(mod), (st_data_t)autoload, &val)) { struct st_table *tbl = check_autoload_table((VALUE)val); @@ -1473,6 +1478,8 @@ autoload_delete(VALUE mod, ID id) if (tbl->num_entries == 0) { n = autoload; st_delete(RCLASS_CONST_TBL(mod), &n, &val); } } @@ -1532,7 +1539,7 @@ autoload_node_id(VALUE mod, ID id) struct st_table *tbl = RCLASS_CONST_TBL(mod); st_data_t val; - if (!tbl || !st_lookup(tbl, (st_data_t)id, &val) || (VALUE)val != Qundef) { return 0; } return 1; @@ -1579,7 +1586,7 @@ rb_const_get_0(VALUE klass, ID id, int exclude, int recurse) VALUE am = 0; st_data_t data; while (RCLASS_CONST_TBL(tmp) && st_lookup(RCLASS_CONST_TBL(tmp), (st_data_t)id, &data)) { - value = (VALUE)data; if (value == Qundef) { if (am == tmp) break; am = tmp; @@ -1666,16 +1673,17 @@ rb_const_remove(VALUE mod, ID id) rb_vm_change_state(); - val = (VALUE)v; if (val == Qundef) { autoload_delete(mod, id); val = Qnil; } return val; } static int -sv_i(ID key, VALUE value, st_table *tbl) { if (rb_is_const_id(key)) { if (!st_lookup(tbl, (st_data_t)key, 0)) { @@ -1779,7 +1787,7 @@ rb_const_defined_0(VALUE klass, ID id, int exclude, int recurse) retry: while (tmp) { if (RCLASS_CONST_TBL(tmp) && st_lookup(RCLASS_CONST_TBL(tmp), (st_data_t)id, &value)) { - if ((VALUE)value == Qundef && !autoload_node((VALUE)klass, id, 0)) return (int)Qfalse; return (int)Qtrue; } @@ -1823,6 +1831,8 @@ check_before_mod_set(VALUE klass, ID id, VALUE val, const char *dest) void rb_const_set(VALUE klass, ID id, VALUE val) { if (NIL_P(klass)) { rb_raise(rb_eTypeError, "no class/module to define constant %s", rb_id2name(id)); @@ -1836,7 +1846,7 @@ rb_const_set(VALUE klass, ID id, VALUE val) st_data_t value; if (st_lookup(RCLASS_CONST_TBL(klass), (st_data_t)id, &value)) { - if ((VALUE)value == Qundef) autoload_delete(klass, id); else rb_warn("already initialized constant %s", rb_id2name(id)); @@ -1844,7 +1854,12 @@ rb_const_set(VALUE klass, ID id, VALUE val) } rb_vm_change_state(); - st_insert(RCLASS_CONST_TBL(klass), (st_data_t)id, (st_data_t)val); } void @@ -11,6 +11,7 @@ /* finish iseq array */ #include "insns.inc" #include <math.h> /* control stack frame */ @@ -1171,7 +1172,7 @@ vm_get_ev_const(rb_thread_t *th, const rb_iseq_t *iseq, search_continue: if (RCLASS_CONST_TBL(klass) && st_lookup(RCLASS_CONST_TBL(klass), id, &data)) { - val = (st_data_t)data; if (val == Qundef) { if (am == klass) break; am = klass; |