Revision: 3158 http://trac.macosforge.org/projects/ruby/changeset/3158 Author: lsansonetti@apple.com Date: 2009-12-22 19:30:08 -0800 (Tue, 22 Dec 2009) Log Message: ----------- fixed some class variables bugs Modified Paths: -------------- MacRuby/trunk/variable.c Modified: MacRuby/trunk/variable.c =================================================================== --- MacRuby/trunk/variable.c 2009-12-23 02:09:33 UTC (rev 3157) +++ MacRuby/trunk/variable.c 2009-12-23 03:30:08 UTC (rev 3158) @@ -1914,31 +1914,53 @@ void rb_cvar_set(VALUE klass, ID id, VALUE val) { - if (RCLASS_META(klass)) { - klass = (VALUE)objc_getClass(class_getName((Class)klass)); + klass = unmeta_class(klass); + + // Locate the class where the cvar should be set by looking through the + // current class ancestry. + VALUE k = klass; + while (k != 0) { + if (ivar_get(k, id, false, true) != Qundef) { + klass = k; + break; + } + k = RCLASS_SUPER(k); } + rb_ivar_set(klass, id, val); } -VALUE -rb_cvar_get2(VALUE klass, ID id, bool check) +static VALUE +rb_cvar_get3(VALUE klass, ID id, bool check, bool defined) { VALUE orig = klass; klass = unmeta_class(klass); - VALUE value = ivar_get(klass, id, false, true); - if (value == Qundef) { - if (check) { - rb_name_error(id,"uninitialized class variable %s in %s", - rb_id2name(id), rb_class2name(orig)); + + // Locate the cvar by looking through the class ancestry. + while (klass != 0) { + VALUE value = ivar_get(klass, id, false, true); + if (value != Qundef) { + return defined ? Qtrue : value; } - else { - return Qnil; - } + klass = RCLASS_SUPER(klass); } - return value; + + if (check) { + rb_name_error(id,"uninitialized class variable %s in %s", + rb_id2name(id), rb_class2name(orig)); + } + else { + return defined ? Qfalse : Qnil; + } } VALUE +rb_cvar_get2(VALUE klass, ID id, bool check) +{ + return rb_cvar_get3(klass, id, check, false); +} + +VALUE rb_cvar_get(VALUE klass, ID id) { return rb_cvar_get2(klass, id, true); @@ -1947,8 +1969,7 @@ VALUE rb_cvar_defined(VALUE klass, ID id) { - klass = unmeta_class(klass); - return ivar_get(klass, id, false, true) == Qundef ? Qfalse : Qtrue; + return rb_cvar_get3(klass, id, false, true); } void