mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
* vm.c (eval_get_cvar_base): destination for class variable access
is now strictly innermost surrounding class or module. warned if accessed from toplevel. * variable.c (rb_cvar_get): new class variable look-up scheme: 1) look up in the class. 2) if the class is singleton attached to a class (i.e. metaclass) then start look up in the attached class and its ancestors. 3) otherwise, look-up in ancestors of the class. * eval.c (cvar_cbase): destination for class variable access is the class/module that holds the method, or cbase outside of methods. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@11613 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
e137ee9ac4
commit
d99bcbe583
3 changed files with 52 additions and 23 deletions
17
vm.c
17
vm.c
|
@ -1141,22 +1141,11 @@ eval_get_cvar_base(yarv_thread_t *th, yarv_iseq_t *iseq)
|
|||
NODE *cref = get_cref(iseq, th->cfp->lfp);
|
||||
VALUE klass = Qnil;
|
||||
|
||||
while (cref) {
|
||||
if (cref) {
|
||||
klass = cref->nd_clss;
|
||||
cref = cref->nd_next;
|
||||
|
||||
if (cref == 0) {
|
||||
continue;
|
||||
if (!cref->nd_next) {
|
||||
rb_warn("class variable access from toplevel");
|
||||
}
|
||||
|
||||
if (NIL_P(klass) || FL_TEST(klass, FL_SINGLETON)) {
|
||||
if (cref->nd_next == 0) {
|
||||
rb_warn
|
||||
("class variable access from toplevel singleton method");
|
||||
}
|
||||
continue;
|
||||
}
|
||||
break;
|
||||
}
|
||||
if (NIL_P(klass)) {
|
||||
rb_raise(rb_eTypeError, "no class variables available");
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue