[macruby-changes] [2814] MacRuby/trunk

source_changes at macosforge.org source_changes at macosforge.org
Thu Oct 15 14:14:31 PDT 2009


Revision: 2814
          http://trac.macosforge.org/projects/ruby/changeset/2814
Author:   lsansonetti at apple.com
Date:     2009-10-15 14:14:30 -0700 (Thu, 15 Oct 2009)
Log Message:
-----------
implement rb_exec_recursive()

Modified Paths:
--------------
    MacRuby/trunk/array.c
    MacRuby/trunk/vm.cpp
    MacRuby/trunk/vm.h

Modified: MacRuby/trunk/array.c
===================================================================
--- MacRuby/trunk/array.c	2009-10-15 20:10:33 UTC (rev 2813)
+++ MacRuby/trunk/array.c	2009-10-15 21:14:30 UTC (rev 2814)
@@ -1658,13 +1658,6 @@
 }
 
 VALUE
-rb_exec_recursive(VALUE (*func) (VALUE, VALUE, int), VALUE obj, VALUE arg)
-{
-    // TODO check!
-    return (*func) (obj, arg, Qfalse);
-}
-
-VALUE
 rb_ary_join(VALUE ary, VALUE sep)
 {
     long i, count;

Modified: MacRuby/trunk/vm.cpp
===================================================================
--- MacRuby/trunk/vm.cpp	2009-10-15 20:10:33 UTC (rev 2813)
+++ MacRuby/trunk/vm.cpp	2009-10-15 21:14:30 UTC (rev 2814)
@@ -3549,6 +3549,35 @@
 }
 
 extern "C"
+VALUE
+rb_exec_recursive(VALUE (*func) (VALUE, VALUE, int), VALUE obj, VALUE arg)
+{
+    return GET_VM()->exec_recursive(func, obj, arg);
+}
+
+VALUE
+RoxorVM::exec_recursive(VALUE (*func) (VALUE, VALUE, int), VALUE obj,
+	VALUE arg)
+{
+    std::vector<VALUE>::iterator iter =
+	std::find(recursive_objects.begin(), recursive_objects.end(), obj);
+    if (iter != recursive_objects.end()) {
+	// Object is already being iterated!
+	return (*func) (obj, arg, Qtrue);
+    }
+
+    recursive_objects.push_back(obj);
+    // XXX the function is not supposed to raise an exception.
+    VALUE ret = (*func) (obj, arg, Qfalse);
+
+    iter = std::find(recursive_objects.begin(), recursive_objects.end(), obj);
+    assert(iter != recursive_objects.end());
+    recursive_objects.erase(iter);
+
+    return ret;
+}
+
+extern "C"
 void *
 rb_vm_create_vm(void)
 {

Modified: MacRuby/trunk/vm.h
===================================================================
--- MacRuby/trunk/vm.h	2009-10-15 20:10:33 UTC (rev 2813)
+++ MacRuby/trunk/vm.h	2009-10-15 21:14:30 UTC (rev 2814)
@@ -808,6 +808,7 @@
 	std::vector<VALUE> current_exceptions;
 	std::vector<rb_vm_binding_t *> bindings;
 	std::map<VALUE, rb_vm_catch_t *> catch_jmp_bufs;
+	std::vector<VALUE> recursive_objects;
 
 	VALUE thread;
 	Class current_class;
@@ -932,6 +933,9 @@
 	VALUE ruby_throw(VALUE tag, VALUE value);
 
 	void setup_from_current_thread(void);
+
+	VALUE exec_recursive(VALUE (*func) (VALUE, VALUE, int), VALUE obj,
+		VALUE arg);
 };
 
 #define GET_VM() (RoxorVM::current())
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/macruby-changes/attachments/20091015/e74ecbd8/attachment.html>


More information about the macruby-changes mailing list