Revision: 1244 http://trac.macosforge.org/projects/ruby/changeset/1244 Author: lsansonetti@apple.com Date: 2009-03-28 20:32:31 -0700 (Sat, 28 Mar 2009) Log Message: ----------- fixed const lookup from a metaclass Modified Paths: -------------- MacRuby/branches/experimental/class.c MacRuby/branches/experimental/roxor.cpp Modified: MacRuby/branches/experimental/class.c =================================================================== --- MacRuby/branches/experimental/class.c 2009-03-29 03:31:28 UTC (rev 1243) +++ MacRuby/branches/experimental/class.c 2009-03-29 03:32:31 UTC (rev 1244) @@ -351,8 +351,9 @@ { if (RCLASS_SINGLETON(klass)) { static ID attachedId = 0; - if (attachedId == 0) + if (attachedId == 0) { attachedId = rb_intern("__attached__"); + } rb_ivar_set(klass, attachedId, obj); } } @@ -1158,7 +1159,9 @@ case T_CLASS: case T_MODULE: klass = *(VALUE *)obj; + rb_vm_set_outer(klass, obj); break; + default: klass = rb_make_metaclass(obj, RBASIC(obj)->klass); break; Modified: MacRuby/branches/experimental/roxor.cpp =================================================================== --- MacRuby/branches/experimental/roxor.cpp 2009-03-29 03:31:28 UTC (rev 1243) +++ MacRuby/branches/experimental/roxor.cpp 2009-03-29 03:32:31 UTC (rev 1244) @@ -504,11 +504,17 @@ void set_outer(Class klass, Class mod) { struct rb_vm_outer *mod_outer = get_outer(mod); - struct rb_vm_outer *class_outer = (struct rb_vm_outer *) - malloc(sizeof(struct rb_vm_outer)); - class_outer->klass = klass; - class_outer->outer = mod_outer; - outers[klass] = class_outer; + struct rb_vm_outer *class_outer = get_outer(klass); + if (class_outer == NULL || class_outer->outer != mod_outer) { + if (class_outer != NULL) { + free(class_outer); + } + class_outer = (struct rb_vm_outer *) + malloc(sizeof(struct rb_vm_outer)); + class_outer->klass = klass; + class_outer->outer = mod_outer; + outers[klass] = class_outer; + } } };
participants (1)
-
source_changes@macosforge.org