[macruby-changes] [644] MacRuby/trunk/ruby.c

source_changes at macosforge.org source_changes at macosforge.org
Tue Sep 30 21:03:14 PDT 2008


Revision: 644
          http://trac.macosforge.org/projects/ruby/changeset/644
Author:   lsansonetti at apple.com
Date:     2008-09-30 21:03:14 -0700 (Tue, 30 Sep 2008)
Log Message:
-----------
better implementation for the required features code path, to avoid GC crasher

Modified Paths:
--------------
    MacRuby/trunk/ruby.c

Modified: MacRuby/trunk/ruby.c
===================================================================
--- MacRuby/trunk/ruby.c	2008-09-30 19:29:23 UTC (rev 643)
+++ MacRuby/trunk/ruby.c	2008-10-01 04:03:14 UTC (rev 644)
@@ -425,6 +425,9 @@
     }
 }
 
+#if WITH_OBJC
+static CFMutableArrayRef req_list = NULL;
+#else
 struct req_list {
     char *name;
     struct req_list *next;
@@ -432,10 +435,20 @@
 static struct {
     struct req_list *last, head;
 } req_list = {&req_list.head,};
+#endif
 
 static void
 add_modules(const char *mod)
 {
+#if WITH_OBJC
+    CFStringRef mod_str;
+    if (req_list == NULL) {
+	req_list = CFArrayCreateMutable(NULL, 0, &kCFTypeArrayCallBacks);
+    }
+    mod_str = CFStringCreateWithFileSystemRepresentation(NULL, mod);
+    CFArrayAppendValue(req_list, mod_str);
+    CFRelease(mod_str);
+#else
     struct req_list *list;
 
     list = ALLOC(struct req_list);
@@ -444,6 +457,7 @@
     list->next = 0;
     req_list.last->next = list;
     req_list.last = list;
+#endif
 }
 
 extern void Init_ext(void);
@@ -452,6 +466,23 @@
 static void
 require_libraries(void)
 {
+#if WITH_OBJC
+    Init_ext();		/* should be called here for some reason :-( */
+
+    if (req_list != NULL) {
+	VALUE vm;
+	ID require;
+	int i, count;
+       
+	vm = rb_vm_top_self();
+	require	= rb_intern("require");
+	for (i = 0, count = CFArrayGetCount(req_list); i < count; i++) {
+	    const void *feature = CFArrayGetValueAtIndex(req_list, i);
+	    rb_funcall2(vm, require, 1, (VALUE *)&feature);
+	}
+	CFRelease(req_list);
+    }
+#else
     struct req_list *list = req_list.head.next;
     struct req_list *tmp;
     ID require = rb_intern("require");
@@ -467,6 +498,7 @@
 	rb_funcall2(rb_vm_top_self(), require, 1, &feature);
     }
     req_list.head.next = 0;
+#endif
 }
 
 static void
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.macosforge.org/pipermail/macruby-changes/attachments/20080930/8f51c8ec/attachment-0001.html 


More information about the macruby-changes mailing list