Revision
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

Diff

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;
+	    }
 	}
 };