mirror of
https://github.com/ruby/ruby.git
synced 2025-09-15 08:33:58 +02:00
* eval.c (ev_const_get): simplified using rb_const_get_fallback().
* eval.c (ev_const_defined): adopt to ev_const_get() using rb_const_defined_fallback(). * variable.c (rb_const_get_fallback): new function to implement constant search. * variable.c (rb_const_defined_fallback): new function to implement constant definition check. * variable.c (rb_const_get_0): adopt to new behavior. constants are looked up in the order of: current class, super classes (but Object), lexically external classes/modules, and Object. * variable.c (rb_const_defined_0): ditto. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@9949 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
d0a3c64fb4
commit
ccf99b9ce6
6 changed files with 84 additions and 69 deletions
36
eval.c
36
eval.c
|
@ -1776,45 +1776,13 @@ ruby_current_class_object()
|
|||
static VALUE
|
||||
ev_const_defined(ID id, VALUE self)
|
||||
{
|
||||
NODE *cbase = ruby_cref;
|
||||
VALUE result;
|
||||
|
||||
while (cbase && cbase->nd_next) {
|
||||
struct RClass *klass = RCLASS(cbase->nd_clss);
|
||||
|
||||
if (NIL_P(klass)) return rb_const_defined(CLASS_OF(self), id);
|
||||
if (klass->iv_tbl && st_lookup(klass->iv_tbl, id, &result)) {
|
||||
if (result == Qundef && NIL_P(rb_autoload_p((VALUE)klass, id))) {
|
||||
return Qfalse;
|
||||
}
|
||||
return Qtrue;
|
||||
}
|
||||
cbase = cbase->nd_next;
|
||||
}
|
||||
return rb_const_defined(ruby_cbase, id);
|
||||
return rb_const_defined_fallback(ruby_cbase, id, ruby_cref->nd_next);
|
||||
}
|
||||
|
||||
static VALUE
|
||||
ev_const_get(ID id, VALUE self)
|
||||
{
|
||||
NODE *cbase = ruby_cref;
|
||||
VALUE result;
|
||||
|
||||
while (cbase && cbase->nd_next) {
|
||||
VALUE klass = cbase->nd_clss;
|
||||
|
||||
if (NIL_P(klass)) return rb_const_get(CLASS_OF(self), id);
|
||||
while (RCLASS(klass)->iv_tbl &&
|
||||
st_lookup(RCLASS(klass)->iv_tbl, id, &result)) {
|
||||
if (result == Qundef) {
|
||||
if (!RTEST(rb_autoload_load(klass, id))) break;
|
||||
continue;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
cbase = cbase->nd_next;
|
||||
}
|
||||
return rb_const_get(ruby_cbase, id);
|
||||
return rb_const_get_fallback(ruby_cbase, id, ruby_cref->nd_next);
|
||||
}
|
||||
|
||||
static VALUE
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue