diff options
author | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2007-02-02 09:47:55 +0000 |
---|---|---|
committer | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2007-02-02 09:47:55 +0000 |
commit | d99bcbe583eb9f95022f8bcc51674cbdecf40d3b (patch) | |
tree | 2d424c6f8326ed1c3197d67627e4b60752ae3d2e /vm.c | |
parent | e137ee9ac4019ca0002005ec6d3806c09797250d (diff) |
* 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
Diffstat (limited to 'vm.c')
-rw-r--r-- | vm.c | 17 |
1 files changed, 3 insertions, 14 deletions
@@ -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"); |