[macruby-changes] [4027] MacRuby/trunk

source_changes at macosforge.org source_changes at macosforge.org
Wed May 5 18:48:59 PDT 2010


Revision: 4027
          http://trac.macosforge.org/projects/ruby/changeset/4027
Author:   lsansonetti at apple.com
Date:     2010-05-05 18:48:58 -0700 (Wed, 05 May 2010)
Log Message:
-----------
avoid calling xmalloc() with a zero size (fixes several performance problems)

Modified Paths:
--------------
    MacRuby/trunk/dispatcher.cpp
    MacRuby/trunk/struct.c

Modified: MacRuby/trunk/dispatcher.cpp
===================================================================
--- MacRuby/trunk/dispatcher.cpp	2010-05-06 01:48:25 UTC (rev 4026)
+++ MacRuby/trunk/dispatcher.cpp	2010-05-06 01:48:58 UTC (rev 4027)
@@ -1507,21 +1507,27 @@
 	    rb_raise(rb_eArgError, "wrong number of arguments (%d for %d)",
 		    argc, limit);
 	}
+
 	VALUE *new_argv;
 	if (argc == 1 && TYPE(argv[0]) == T_ARRAY
-	    && (arity.min > 1 || (arity.min == 1 && arity.min != arity.max))) {
+		&& (arity.min > 1
+		    || (arity.min == 1 && arity.min != arity.max))) {
 	    // Expand the array.
-	    long ary_len = RARRAY_LEN(argv[0]);
-	    new_argv = (VALUE *)xmalloc_ptrs(sizeof(VALUE) * ary_len);
-	    for (int i = 0; i < ary_len; i++) {
-		new_argv[i] = RARRAY_AT(argv[0], i);
+	    const long ary_len = RARRAY_LEN(argv[0]);
+	    if (ary_len > 0) {
+		new_argv = (VALUE *)RARRAY_PTR(argv[0]);
 	    }
+	    else {
+		new_argv = NULL;
+	    }
 	    argv = new_argv;
 	    argc = ary_len;
-	    if (argc >= arity.min && (argc <= arity.max || b->arity.max == -1)) {
+	    if (argc >= arity.min
+		    && (argc <= arity.max || b->arity.max == -1)) {
 		goto block_call;
 	    }
 	}
+
 	int new_argc;
 	if (argc <= arity.min) {
 	    new_argc = arity.min;
@@ -1532,10 +1538,17 @@
 	else {
 	    new_argc = argc;
 	}
-	new_argv = (VALUE *)xmalloc_ptrs(sizeof(VALUE) * new_argc);
-	for (int i = 0; i < new_argc; i++) {
-	    new_argv[i] = i < argc ? argv[i] : Qnil;
+
+	if (new_argc > 0) {
+	    new_argv = (VALUE *)xmalloc_ptrs(sizeof(VALUE) * new_argc);
+	    for (int i = 0; i < new_argc; i++) {
+		new_argv[i] = i < argc ? argv[i] : Qnil;
+	    }
 	}
+	else {
+	    new_argv = NULL;
+	}
+
 	argc = new_argc;
 	argv = new_argv;
     }

Modified: MacRuby/trunk/struct.c
===================================================================
--- MacRuby/trunk/struct.c	2010-05-06 01:48:25 UTC (rev 4026)
+++ MacRuby/trunk/struct.c	2010-05-06 01:48:58 UTC (rev 4027)
@@ -402,8 +402,13 @@
 	rb_mem_clear(st->as.ary, n);
     }
     else {
-	GC_WB(&st->as.heap.ptr, ALLOC_N(VALUE, n));
-	rb_mem_clear(st->as.heap.ptr, n);
+	if (n > 0) {
+	    GC_WB(&st->as.heap.ptr, xmalloc_ptrs(sizeof(VALUE) * n));
+	    rb_mem_clear(st->as.heap.ptr, n);
+	}
+	else {
+	    st->as.heap.ptr = NULL;
+	}
 	st->as.heap.len = n;
     }
 
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/macruby-changes/attachments/20100505/d59d1741/attachment.html>


More information about the macruby-changes mailing list