Modified: MacRuby/branches/experimental/class.c (1243 => 1244)
--- 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 (1243 => 1244)
--- 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;
+ }
}
};