[macruby-changes] [2379] MacRuby/trunk
source_changes at macosforge.org
source_changes at macosforge.org
Tue Aug 25 16:44:27 PDT 2009
Revision: 2379
http://trac.macosforge.org/projects/ruby/changeset/2379
Author: lsansonetti at apple.com
Date: 2009-08-25 16:44:25 -0700 (Tue, 25 Aug 2009)
Log Message:
-----------
implemented module_function as a scope + fixed a couple of eval-related bugs
Modified Paths:
--------------
MacRuby/trunk/vm.cpp
MacRuby/trunk/vm_eval.c
Modified: MacRuby/trunk/vm.cpp
===================================================================
--- MacRuby/trunk/vm.cpp 2009-08-25 21:12:40 UTC (rev 2378)
+++ MacRuby/trunk/vm.cpp 2009-08-25 23:44:25 UTC (rev 2379)
@@ -1531,6 +1531,7 @@
const char *sel_name = sel_getName(sel);
const bool genuine_selector = sel_name[strlen(sel_name) - 1] == ':';
bool redefined = false;
+ bool added_modfunc = false;
SEL orig_sel = sel;
Method m;
IMP imp = NULL;
@@ -1591,6 +1592,14 @@
}
}
}
+
+ if (!added_modfunc && (v & RCLASS_SCOPE_MOD_FUNC)) {
+ added_modfunc = true;
+ redefined = false;
+ klass = *(Class *)klass;
+ flags = 0;
+ goto prepare_method;
+ }
}
extern "C"
Modified: MacRuby/trunk/vm_eval.c
===================================================================
--- MacRuby/trunk/vm_eval.c 2009-08-25 21:12:40 UTC (rev 2378)
+++ MacRuby/trunk/vm_eval.c 2009-08-25 23:44:25 UTC (rev 2379)
@@ -355,11 +355,18 @@
static VALUE
specific_eval(int argc, VALUE *argv, VALUE klass, VALUE self)
{
+ VALUE retval;
+
+ // XXX: not exception-safe
+ const long old_version = RCLASS_VERSION(klass);
+
if (rb_block_given_p()) {
if (argc > 0) {
- rb_raise(rb_eArgError, "wrong number of arguments (%d for 0)", argc);
+ rb_raise(rb_eArgError, "wrong number of arguments (%d for 0)",
+ argc);
}
- return rb_vm_yield_under(klass, self, 0, NULL);
+ rb_vm_set_current_scope(klass, SCOPE_PUBLIC);
+ retval = rb_vm_yield_under(klass, self, 0, NULL);
}
else {
const char *file = "(eval)";
@@ -386,8 +393,13 @@
if (argc > 1) {
file = StringValuePtr(argv[1]);
}
- return eval_string(self, klass, argv[0], Qnil, file, line);
+ rb_vm_set_current_scope(klass, SCOPE_PUBLIC);
+ retval = eval_string(self, klass, argv[0], Qnil, file, line);
}
+
+ RCLASS_SET_VERSION(klass, old_version);
+
+ return retval;
}
/*
@@ -436,7 +448,17 @@
if (!NIL_P(vfile)) {
file = RSTRING_PTR(vfile);
}
- return eval_string(self, 0, src, scope, file, line);
+ VALUE klass;
+ switch (TYPE(self)) {
+ case T_CLASS:
+ case T_MODULE:
+ klass = self;
+ break;
+ default:
+ klass = 0;
+ break;
+ }
+ return eval_string(self, klass, src, scope, file, line);
}
VALUE
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/macruby-changes/attachments/20090825/20b7acf8/attachment.html>
More information about the macruby-changes
mailing list