[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