[macruby-changes] [1874] MacRuby/branches/experimental

source_changes at macosforge.org source_changes at macosforge.org
Wed Jun 17 23:58:13 PDT 2009


Revision: 1874
          http://trac.macosforge.org/projects/ruby/changeset/1874
Author:   lsansonetti at apple.com
Date:     2009-06-17 23:58:13 -0700 (Wed, 17 Jun 2009)
Log Message:
-----------
appropriately toggle the VM current class when #module_eval/#class_eval is called + fix metaclass outers

Modified Paths:
--------------
    MacRuby/branches/experimental/class.c
    MacRuby/branches/experimental/vm.cpp
    MacRuby/branches/experimental/vm.h
    MacRuby/branches/experimental/vm_eval.c

Modified: MacRuby/branches/experimental/class.c
===================================================================
--- MacRuby/branches/experimental/class.c	2009-06-18 04:47:33 UTC (rev 1873)
+++ MacRuby/branches/experimental/class.c	2009-06-18 06:58:13 UTC (rev 1874)
@@ -374,7 +374,7 @@
 	    RCLASS_SET_VERSION(klass, v);
 	}
 	RCLASS_SET_VERSION_FLAG(klass, RCLASS_IS_SINGLETON);
-	rb_vm_set_outer(klass, rb_cNSObject);
+	rb_vm_set_outer(klass, rb_vm_get_outer(super));
 
 	rb_singleton_class_attached(klass, obj);
 

Modified: MacRuby/branches/experimental/vm.cpp
===================================================================
--- MacRuby/branches/experimental/vm.cpp	2009-06-18 04:47:33 UTC (rev 1873)
+++ MacRuby/branches/experimental/vm.cpp	2009-06-18 06:58:13 UTC (rev 1874)
@@ -774,6 +774,14 @@
     GET_VM()->set_outer((Class)klass, (Class)under);
 }
 
+extern "C"
+VALUE
+rb_vm_get_outer(VALUE klass)
+{
+    rb_vm_outer_t *o = GET_VM()->get_outer((Class)klass);
+    return o == NULL ? Qundef : (VALUE)o->klass;
+}
+
 static inline void
 check_if_module(VALUE mod)
 {
@@ -1260,7 +1268,11 @@
 rb_vm_prepare_method(Class klass, SEL sel, Function *func, NODE *node)
 {
     if (GET_VM()->current_class != NULL) {
+	const bool meta = class_isMetaClass(klass);
 	klass = GET_VM()->current_class;
+	if (meta) {
+	    klass = *(Class *)klass;
+	}
     }
 
     const rb_vm_arity_t arity = rb_vm_node_arity(node);
@@ -3289,8 +3301,13 @@
 
     VALUE old_self = b->self;
     b->self = self;
-    //Class old_class = GET_VM()->current_class;
-    //GET_VM()->current_class = (Class)klass;
+    Class old_class = GET_VM()->current_class;
+    if (klass == self) {
+	// We only toggle the VM current klass in case #module_eval or
+	// #class_eval is used (where the given klass and self objects are 
+	// actually the same instances).
+	GET_VM()->current_class = (Class)klass;
+    }
 
     VALUE retval = Qnil;
     try {
@@ -3298,13 +3315,13 @@
     }
     catch (...) {
 	b->self = old_self;
-	//GET_VM()->current_class = old_class;
+	GET_VM()->current_class = old_class;
 	GET_VM()->add_current_block(b);
 	throw;
     }
 
     b->self = old_self;
-    //GET_VM()->current_class = old_class;
+    GET_VM()->current_class = old_class;
     GET_VM()->add_current_block(b);
 
     return retval;

Modified: MacRuby/branches/experimental/vm.h
===================================================================
--- MacRuby/branches/experimental/vm.h	2009-06-18 04:47:33 UTC (rev 1873)
+++ MacRuby/branches/experimental/vm.h	2009-06-18 06:58:13 UTC (rev 1874)
@@ -244,6 +244,7 @@
 	int (*filter) (VALUE, ID, VALUE));
 int rb_vm_find_class_ivar_slot(VALUE klass, ID name);
 void rb_vm_set_outer(VALUE klass, VALUE under);
+VALUE rb_vm_get_outer(VALUE klass);
 VALUE rb_vm_catch(VALUE tag);
 VALUE rb_vm_throw(VALUE tag, VALUE value);
 

Modified: MacRuby/branches/experimental/vm_eval.c
===================================================================
--- MacRuby/branches/experimental/vm_eval.c	2009-06-18 04:47:33 UTC (rev 1873)
+++ MacRuby/branches/experimental/vm_eval.c	2009-06-18 06:58:13 UTC (rev 1874)
@@ -498,7 +498,7 @@
     VALUE klass;
 
     if (SPECIAL_CONST_P(self)) {
-	klass = Qnil;
+	klass = 0;
     }
     else {
 	klass = CLASS_OF(self);
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/macruby-changes/attachments/20090617/658cf602/attachment.html>


More information about the macruby-changes mailing list