[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