1
0
Fork 0
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:
matz 2007-02-02 09:47:55 +00:00
parent e137ee9ac4
commit d99bcbe583
3 changed files with 52 additions and 23 deletions

17
vm.c
View file

@ -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");