Feature #10107 ยป rb_const_lookup.patch
| constant.h | ||
|---|---|---|
|
int rb_public_const_defined(VALUE klass, ID id);
|
||
|
int rb_public_const_defined_at(VALUE klass, ID id);
|
||
|
int rb_public_const_defined_from(VALUE klass, ID id);
|
||
|
rb_const_entry_t *rb_const_lookup(VALUE klass, ID id);
|
||
|
#endif /* CONSTANT_H */
|
||
| variable.c | ||
|---|---|---|
|
VALUE ad, fn;
|
||
|
struct st_table *tbl;
|
||
|
struct autoload_data_i *ele;
|
||
|
rb_const_entry_t *ce;
|
||
|
if (!rb_is_const_id(id)) {
|
||
|
rb_raise(rb_eNameError, "autoload must be constant name: %"PRIsVALUE"",
|
||
| ... | ... | |
|
rb_raise(rb_eArgError, "empty file name");
|
||
|
}
|
||
|
if ((tbl = RCLASS_CONST_TBL(mod)) && st_lookup(tbl, (st_data_t)id, &av) && ((rb_const_entry_t*)av)->value != Qundef)
|
||
|
ce = rb_const_lookup(mod, id);
|
||
|
if (ce && ce->value != Qundef) {
|
||
|
return;
|
||
|
}
|
||
|
rb_const_set(mod, id, Qundef);
|
||
|
tbl = RCLASS_IV_TBL(mod);
|
||
| ... | ... | |
|
static int
|
||
|
autoload_defined_p(VALUE mod, ID id)
|
||
|
{
|
||
|
struct st_table *tbl = RCLASS_CONST_TBL(mod);
|
||
|
st_data_t val;
|
||
|
rb_const_entry_t *ce = rb_const_lookup(mod, id);
|
||
|
if (!tbl || !st_lookup(tbl, (st_data_t)id, &val) || ((rb_const_entry_t*)val)->value != Qundef) {
|
||
|
if (!ce || ce->value != Qundef) {
|
||
|
return 0;
|
||
|
}
|
||
|
return !rb_autoloading_value(mod, id, NULL);
|
||
| ... | ... | |
|
retry:
|
||
|
while (RTEST(tmp)) {
|
||
|
VALUE am = 0;
|
||
|
st_data_t data;
|
||
|
while (RCLASS_CONST_TBL(tmp) && st_lookup(RCLASS_CONST_TBL(tmp), (st_data_t)id, &data)) {
|
||
|
rb_const_entry_t *ce = (rb_const_entry_t *)data;
|
||
|
rb_const_entry_t *ce;
|
||
|
while ((ce = rb_const_lookup(tmp, id))) {
|
||
|
if (visibility && ce->flag == CONST_PRIVATE) {
|
||
|
rb_name_error(id, "private constant %"PRIsVALUE"::%"PRIsVALUE" referenced",
|
||
|
rb_class_name(klass), QUOTE_ID(id));
|
||
| ... | ... | |
|
static int
|
||
|
rb_const_defined_0(VALUE klass, ID id, int exclude, int recurse, int visibility)
|
||
|
{
|
||
|
st_data_t value;
|
||
|
VALUE tmp;
|
||
|
int mod_retry = 0;
|
||
|
rb_const_entry_t *ce;
|
||
|
tmp = klass;
|
||
|
retry:
|
||
|
while (tmp) {
|
||
|
if (RCLASS_CONST_TBL(tmp) && st_lookup(RCLASS_CONST_TBL(tmp), (st_data_t)id, &value)) {
|
||
|
rb_const_entry_t *ce = (rb_const_entry_t *)value;
|
||
|
if ((ce = rb_const_lookup(tmp, id))) {
|
||
|
if (visibility && ce->flag == CONST_PRIVATE) {
|
||
|
return (int)Qfalse;
|
||
|
}
|
||
| ... | ... | |
|
RCLASS_CONST_TBL(klass) = st_init_numtable();
|
||
|
}
|
||
|
else {
|
||
|
st_data_t value;
|
||
|
if (st_lookup(RCLASS_CONST_TBL(klass), (st_data_t)id, &value)) {
|
||
|
rb_const_entry_t *ce = (rb_const_entry_t*)value;
|
||
|
ce = rb_const_lookup(klass, id);
|
||
|
if (ce) {
|
||
|
if (ce->value == Qundef) {
|
||
|
VALUE load;
|
||
|
struct autoload_data_i *ele;
|
||
| ... | ... | |
|
set_const_visibility(VALUE mod, int argc, const VALUE *argv, rb_const_flag_t flag)
|
||
|
{
|
||
|
int i;
|
||
|
st_data_t v;
|
||
|
rb_const_entry_t *ce;
|
||
|
ID id;
|
||
|
if (argc == 0) {
|
||
| ... | ... | |
|
rb_name_error_str(val, "constant %"PRIsVALUE"::%"PRIsVALUE" not defined",
|
||
|
rb_class_name(mod), QUOTE(val));
|
||
|
}
|
||
|
if (RCLASS_CONST_TBL(mod) &&
|
||
|
st_lookup(RCLASS_CONST_TBL(mod), (st_data_t)id, &v)) {
|
||
|
((rb_const_entry_t*)v)->flag = flag;
|
||
|
if ((ce = rb_const_lookup(mod, id))) {
|
||
|
ce->flag = flag;
|
||
|
}
|
||
|
else {
|
||
|
if (i > 0) {
|
||
| ... | ... | |
|
st_foreach(new_tbl, tbl_copy_i, (st_data_t)obj);
|
||
|
return new_tbl;
|
||
|
}
|
||
|
rb_const_entry_t *
|
||
|
rb_const_lookup(VALUE klass, ID id)
|
||
|
{
|
||
|
st_table *tbl = RCLASS_CONST_TBL(klass);
|
||
|
st_data_t val;
|
||
|
if (tbl && st_lookup(tbl, (st_data_t)id, &val)) {
|
||
|
return (rb_const_entry_t *)val;
|
||
|
}
|
||
|
return 0;
|
||
|
}
|
||
| vm_insnhelper.c | ||
|---|---|---|
|
if (!NIL_P(klass)) {
|
||
|
VALUE av, am = 0;
|
||
|
st_data_t data;
|
||
|
rb_const_entry_t *ce;
|
||
|
search_continue:
|
||
|
if (RCLASS_CONST_TBL(klass) &&
|
||
|
st_lookup(RCLASS_CONST_TBL(klass), id, &data)) {
|
||
|
val = ((rb_const_entry_t*)data)->value;
|
||
|
if ((ce = rb_const_lookup(klass, id))) {
|
||
|
val = ce->value;
|
||
|
if (val == Qundef) {
|
||
|
if (am == klass) break;
|
||
|
am = klass;
|
||
|
-
|
||