[macruby-changes] [1112] MacRuby/branches/experimental
source_changes at macosforge.org
source_changes at macosforge.org
Mon Mar 23 13:40:22 PDT 2009
Revision: 1112
http://trac.macosforge.org/projects/ruby/changeset/1112
Author: lsansonetti at apple.com
Date: 2009-03-23 13:40:22 -0700 (Mon, 23 Mar 2009)
Log Message:
-----------
implemented #instance_eval with a string + disabled the inline #eval optimization, since it brings more negative things than positive ones
Modified Paths:
--------------
MacRuby/branches/experimental/TODO
MacRuby/branches/experimental/eval.c
MacRuby/branches/experimental/load.c
MacRuby/branches/experimental/roxor.cpp
MacRuby/branches/experimental/roxor.h
MacRuby/branches/experimental/tool/compile_prelude.rb
MacRuby/branches/experimental/vm_eval.c
Modified: MacRuby/branches/experimental/TODO
===================================================================
--- MacRuby/branches/experimental/TODO 2009-03-23 19:06:25 UTC (rev 1111)
+++ MacRuby/branches/experimental/TODO 2009-03-23 20:40:22 UTC (rev 1112)
@@ -13,7 +13,6 @@
[X] constant caching
[X] fast ivar access
[X] zero-cost exceptions
-[X] fast eval (inlining)
[X] fast #send
[ ] fast regexp =~
[X] fast break
Modified: MacRuby/branches/experimental/eval.c
===================================================================
--- MacRuby/branches/experimental/eval.c 2009-03-23 19:06:25 UTC (rev 1111)
+++ MacRuby/branches/experimental/eval.c 2009-03-23 20:40:22 UTC (rev 1112)
@@ -195,7 +195,7 @@
return FIX2INT(n);
}
rb_vm_set_running(true);
- rb_vm_run_node(RSTRING_PTR(rb_progname), (NODE *)n);
+ rb_vm_run(RSTRING_PTR(rb_progname), (NODE *)n);
return ruby_cleanup(0);
}
Modified: MacRuby/branches/experimental/load.c
===================================================================
--- MacRuby/branches/experimental/load.c 2009-03-23 19:06:25 UTC (rev 1111)
+++ MacRuby/branches/experimental/load.c 2009-03-23 20:40:22 UTC (rev 1112)
@@ -270,7 +270,7 @@
if (node == NULL) {
rb_raise(rb_eSyntaxError, "compile error");
}
- rb_vm_run_node(fname_str, node);
+ rb_vm_run(fname_str, node);
}
void
Modified: MacRuby/branches/experimental/roxor.cpp
===================================================================
--- MacRuby/branches/experimental/roxor.cpp 2009-03-23 19:06:25 UTC (rev 1111)
+++ MacRuby/branches/experimental/roxor.cpp 2009-03-23 20:40:22 UTC (rev 1112)
@@ -1611,6 +1611,9 @@
return pn;
}
+#if 0
+ // XXX this optimization is disabled because it's buggy and not really
+ // interesting
// #eval
else if (sel == selEval) {
@@ -1667,6 +1670,7 @@
return pn;
}
+#endif
#if 0
// TODO: block inlining optimization
else if (current_block_func != NULL) {
@@ -5551,7 +5555,7 @@
extern "C"
IMP
-rb_vm_compile_imp(const char *fname, NODE *node)
+rb_vm_compile(const char *fname, NODE *node)
{
assert(node != NULL);
@@ -5594,9 +5598,9 @@
extern "C"
VALUE
-rb_vm_run_node(const char *fname, NODE *node)
+rb_vm_run(const char *fname, NODE *node)
{
- IMP imp = rb_vm_compile_imp(fname, node);
+ IMP imp = rb_vm_compile(fname, node);
try {
return ((VALUE(*)(VALUE, SEL))imp)(GET_VM()->current_top_object, 0);
@@ -5615,6 +5619,21 @@
extern "C"
VALUE
+rb_vm_run_under(VALUE klass, VALUE self, const char *fname, NODE *node)
+{
+ // TODO honor klass
+ VALUE old_top_object = GET_VM()->current_top_object;
+ GET_VM()->current_top_object = self;
+
+ VALUE val = rb_vm_run(fname, node);
+
+ GET_VM()->current_top_object = old_top_object;
+
+ return val;
+}
+
+extern "C"
+VALUE
rb_vm_top_self(void)
{
return GET_VM()->current_top_object;
Modified: MacRuby/branches/experimental/roxor.h
===================================================================
--- MacRuby/branches/experimental/roxor.h 2009-03-23 19:06:25 UTC (rev 1111)
+++ MacRuby/branches/experimental/roxor.h 2009-03-23 20:40:22 UTC (rev 1112)
@@ -5,8 +5,9 @@
extern "C" {
#endif
-VALUE rb_vm_run_node(const char *fname, NODE *node);
-IMP rb_vm_compile_imp(const char *fname, NODE *node);
+VALUE rb_vm_run(const char *fname, NODE *node);
+VALUE rb_vm_run_under(VALUE klass, VALUE self, const char *fname, NODE *node);
+IMP rb_vm_compile(const char *fname, NODE *node);
bool rb_vm_running(void);
void rb_vm_set_running(bool flag);
Modified: MacRuby/branches/experimental/tool/compile_prelude.rb
===================================================================
--- MacRuby/branches/experimental/tool/compile_prelude.rb 2009-03-23 19:06:25 UTC (rev 1111)
+++ MacRuby/branches/experimental/tool/compile_prelude.rb 2009-03-23 20:40:22 UTC (rev 1112)
@@ -77,7 +77,7 @@
Init_<%=init_name%>(void)
{
% lines_list.each_with_index {|(setup_lines, lines), i|
- rb_vm_run_node(prelude_name<%=i%>, rb_compile_string(
+ rb_vm_run(prelude_name<%=i%>, rb_compile_string(
prelude_name<%=i%>,
rb_str_new(prelude_code<%=i%>, sizeof(prelude_code<%=i%>) - 1),
1));
Modified: MacRuby/branches/experimental/vm_eval.c
===================================================================
--- MacRuby/branches/experimental/vm_eval.c 2009-03-23 19:06:25 UTC (rev 1111)
+++ MacRuby/branches/experimental/vm_eval.c 2009-03-23 20:40:22 UTC (rev 1112)
@@ -311,23 +311,17 @@
}
static VALUE
-eval_string_with_cref(VALUE self, VALUE src, VALUE scope, NODE *cref, const char *file, int line)
+eval_string(VALUE self, VALUE klass, VALUE src, VALUE scope, const char *file, int line)
{
// TODO honor scope
NODE *node = rb_compile_string(file, src, line);
if (node == NULL) {
rb_raise(rb_eSyntaxError, "compile error");
}
- return rb_vm_run_node(file, node);
+ return rb_vm_run_under(klass, self, file, node);
}
static VALUE
-eval_string(VALUE self, VALUE src, VALUE scope, const char *file, int line)
-{
- 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()) {
@@ -337,8 +331,31 @@
return rb_vm_yield_under(klass, self, 0, NULL);
}
else {
- // TODO
- abort();
+ const char *file = "(eval)";
+ int line = 1;
+
+ if (argc == 0) {
+ rb_raise(rb_eArgError, "block not supplied");
+ }
+ if (rb_safe_level() >= 4) {
+ StringValue(argv[0]);
+ }
+ else {
+ SafeStringValue(argv[0]);
+ }
+ if (argc > 3) {
+ const char *name = rb_id2name(rb_frame_callee());
+ rb_raise(rb_eArgError,
+ "wrong number of arguments: %s(src) or %s{..}",
+ name, name);
+ }
+ if (argc > 2) {
+ line = NUM2INT(argv[2]);
+ }
+ if (argc > 1) {
+ file = StringValuePtr(argv[1]);
+ }
+ return eval_string(self, klass, argv[0], Qnil, file, line);
}
}
@@ -385,17 +402,16 @@
if (argc >= 4) {
line = NUM2INT(vline);
}
-
if (!NIL_P(vfile)) {
file = RSTRING_PTR(vfile);
}
- return eval_string(self, src, scope, file, line);
+ return eval_string(0, self, src, scope, file, line);
}
VALUE
rb_eval_string(const char *str)
{
- return eval_string(rb_vm_top_self(), rb_str_new2(str), Qnil, "(eval)", 1);
+ return eval_string(0, rb_vm_top_self(), rb_str_new2(str), Qnil, "(eval)", 1);
}
VALUE
@@ -416,7 +432,7 @@
return val;
}
- val = eval_string(rb_vm_top_self(), cmd, Qnil, 0, 0);
+ val = eval_string(0, rb_vm_top_self(), cmd, Qnil, 0, 0);
rb_set_safe_level_force(safe);
return val;
}
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/macruby-changes/attachments/20090323/7556b2bf/attachment.html>
More information about the macruby-changes
mailing list