[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