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

source_changes at macosforge.org source_changes at macosforge.org
Fri Mar 20 18:51:29 PDT 2009


Revision: 1037
          http://trac.macosforge.org/projects/ruby/changeset/1037
Author:   lsansonetti at apple.com
Date:     2009-03-20 18:51:28 -0700 (Fri, 20 Mar 2009)
Log Message:
-----------
experimental implementation of instance_eval/instance_exec/module_eval/module_exec (works only with blocks and outer const lookup doesn't work yet)

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

Modified: MacRuby/branches/experimental/roxor.cpp
===================================================================
--- MacRuby/branches/experimental/roxor.cpp	2009-03-21 00:59:42 UTC (rev 1036)
+++ MacRuby/branches/experimental/roxor.cpp	2009-03-21 01:51:28 UTC (rev 1037)
@@ -5175,6 +5175,26 @@
 }
 
 extern "C"
+VALUE
+rb_vm_yield_under(VALUE klass, VALUE self, int argc, const VALUE *argv)
+{
+    rb_vm_block_t *b = GET_VM()->top_block();
+
+    GET_VM()->pop_block();
+    VALUE old_self = b->self;
+    b->self = self;
+
+    // TODO set klass as the default outer!
+
+    VALUE retval = rb_vm_block_eval0(b, argc, argv);
+
+    b->self = old_self;
+    GET_VM()->push_block(b);
+
+    return retval;
+}
+
+extern "C"
 VALUE 
 rb_vm_yield_args(int argc, ...)
 {

Modified: MacRuby/branches/experimental/roxor.h
===================================================================
--- MacRuby/branches/experimental/roxor.h	2009-03-21 00:59:42 UTC (rev 1036)
+++ MacRuby/branches/experimental/roxor.h	2009-03-21 01:51:28 UTC (rev 1037)
@@ -26,6 +26,7 @@
 VALUE rb_vm_call_with_cache2(void *cache, VALUE self, VALUE klass, SEL sel, int argc, const VALUE *argv);
 void *rb_vm_get_call_cache(SEL sel);
 VALUE rb_vm_yield(int argc, const VALUE *argv);
+VALUE rb_vm_yield_under(VALUE klass, VALUE self, int argc, const VALUE *argv);
 bool rb_vm_respond_to(VALUE obj, SEL sel, bool priv);
 VALUE rb_vm_method_missing(VALUE obj, int argc, const VALUE *argv);
 int rb_vm_find_class_ivar_slot(VALUE klass, ID name);

Modified: MacRuby/branches/experimental/vm_eval.c
===================================================================
--- MacRuby/branches/experimental/vm_eval.c	2009-03-21 00:59:42 UTC (rev 1036)
+++ MacRuby/branches/experimental/vm_eval.c	2009-03-21 01:51:28 UTC (rev 1037)
@@ -324,6 +324,21 @@
     return eval_string_with_cref(self, src, scope, 0, file, line);
 }
 
+static VALUE
+specific_eval(int argc, VALUE *argv, VALUE klass, VALUE self)
+{
+    if (rb_block_given_p()) {
+        if (argc > 0) {
+            rb_raise(rb_eArgError, "wrong number of arguments (%d for 0)", argc);
+        }
+        return rb_vm_yield_under(klass, self, 0, NULL);
+    }
+    else {
+	// TODO
+	abort();
+    }
+}
+
 /*
  *  call-seq:
  *     eval(string [, binding [, filename [,lineno]]])  => obj
@@ -435,11 +450,9 @@
 	klass = Qnil;
     }
     else {
-	klass = rb_singleton_class(self);
+	klass = CLASS_OF(self);
     }
-    // TODO
-    abort();
-    return Qnil;
+    return specific_eval(argc, argv, klass, self);
 }
 
 /*
@@ -471,9 +484,7 @@
     else {
 	klass = rb_singleton_class(self);
     }
-    // TODO
-    abort();
-    return Qnil;
+    return rb_vm_yield_under(klass, self, argc, argv);
 }
 
 /*
@@ -503,9 +514,7 @@
 VALUE
 rb_mod_module_eval(VALUE mod, SEL sel, int argc, VALUE *argv)
 {
-    // TODO
-    abort();
-    return Qnil;
+    return specific_eval(argc, argv, mod, mod);
 }
 
 /*
@@ -529,11 +538,9 @@
  */
 
 VALUE
-rb_mod_module_exec(VALUE recv, SEL sel, int argc, VALUE *argv)
+rb_mod_module_exec(VALUE mod, SEL sel, int argc, VALUE *argv)
 {
-    // TODO
-    abort();
-    return Qnil;
+    return rb_vm_yield_under(mod, mod, argc, argv);
 }
 
 /*
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/macruby-changes/attachments/20090320/c339c761/attachment-0001.html>


More information about the macruby-changes mailing list