[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