[macruby-changes] [3901] MacRuby/trunk
source_changes at macosforge.org
source_changes at macosforge.org
Thu Apr 1 15:10:02 PDT 2010
Revision: 3901
http://trac.macosforge.org/projects/ruby/changeset/3901
Author: lsansonetti at apple.com
Date: 2010-04-01 15:10:02 -0700 (Thu, 01 Apr 2010)
Log Message:
-----------
added xmalloc_ptrs() function and use it when it's necessary
Modified Paths:
--------------
MacRuby/trunk/array.c
MacRuby/trunk/array.h
MacRuby/trunk/compiler.cpp
MacRuby/trunk/dispatcher.cpp
MacRuby/trunk/gc.c
MacRuby/trunk/include/ruby/defines.h
MacRuby/trunk/vm.cpp
MacRuby/trunk/vm.h
Modified: MacRuby/trunk/array.c
===================================================================
--- MacRuby/trunk/array.c 2010-04-01 21:58:39 UTC (rev 3900)
+++ MacRuby/trunk/array.c 2010-04-01 22:10:02 UTC (rev 3901)
@@ -45,11 +45,16 @@
if (rary->cap > 0) {
newlen *= 2;
}
- VALUE *new_elements = xrealloc(rary->elements,
- sizeof(VALUE) * newlen);
- if (new_elements != rary->elements) {
- GC_WB(&rary->elements, new_elements);
+ if (rary->elements == NULL) {
+ GC_WB(&rary->elements, xmalloc_ptrs(sizeof(VALUE) * newlen));
}
+ else {
+ VALUE *new_elements = xrealloc(rary->elements,
+ sizeof(VALUE) * newlen);
+ if (new_elements != rary->elements) {
+ GC_WB(&rary->elements, new_elements);
+ }
+ }
rary->cap = newlen;
}
}
Modified: MacRuby/trunk/array.h
===================================================================
--- MacRuby/trunk/array.h 2010-04-01 21:58:39 UTC (rev 3900)
+++ MacRuby/trunk/array.h 2010-04-01 22:10:02 UTC (rev 3901)
@@ -1,5 +1,5 @@
/*
- * MacRuby Hash.
+ * MacRuby Array.
*
* This file is covered by the Ruby license. See COPYING for more details.
*
Modified: MacRuby/trunk/compiler.cpp
===================================================================
--- MacRuby/trunk/compiler.cpp 2010-04-01 21:58:39 UTC (rev 3900)
+++ MacRuby/trunk/compiler.cpp 2010-04-01 22:10:02 UTC (rev 3901)
@@ -6677,7 +6677,7 @@
va_list ar;
va_start(ar, argc);
- VALUE *data = (VALUE *)xmalloc(argc * sizeof(VALUE));
+ VALUE *data = (VALUE *)xmalloc_ptrs(argc * sizeof(VALUE));
for (int i = 0; i < argc; ++i) {
VALUE field = va_arg(ar, VALUE);
GC_WB(&data[i], field);
Modified: MacRuby/trunk/dispatcher.cpp
===================================================================
--- MacRuby/trunk/dispatcher.cpp 2010-04-01 21:58:39 UTC (rev 3900)
+++ MacRuby/trunk/dispatcher.cpp 2010-04-01 22:10:02 UTC (rev 3901)
@@ -78,7 +78,7 @@
IMP pimp, const rb_vm_arity_t &arity, int argc, const VALUE *argv)
{
if ((arity.real != argc) || (arity.max == -1)) {
- VALUE *new_argv = (VALUE *)xmalloc(sizeof(VALUE) * arity.real);
+ VALUE *new_argv = (VALUE *)xmalloc_ptrs(sizeof(VALUE) * arity.real);
__rb_vm_fix_args(argv, new_argv, arity, argc);
argv = new_argv;
argc = arity.real;
@@ -123,7 +123,7 @@
int argc, const VALUE *argv)
{
if ((arity.real != argc) || (arity.max == -1)) {
- VALUE *new_argv = (VALUE *)xmalloc(sizeof(VALUE) * arity.real);
+ VALUE *new_argv = (VALUE *)xmalloc_ptrs(sizeof(VALUE) * arity.real);
__rb_vm_fix_args(argv, new_argv, arity, argc);
argv = new_argv;
argc = arity.real;
@@ -350,7 +350,7 @@
GET_VM()->set_method_missing_reason(call_status);
- VALUE *new_argv = (VALUE *)xmalloc(sizeof(VALUE) * (argc + 1));
+ VALUE *new_argv = (VALUE *)xmalloc_ptrs(sizeof(VALUE) * (argc + 1));
char buf[100];
int n = snprintf(buf, sizeof buf, "%s", sel_getName(sel));
@@ -993,7 +993,7 @@
int count = RARRAY_LEN(ary);
if (real_argc + count >= argv_size) {
const size_t new_argv_size = real_argc + count + 100;
- VALUE *new_argv = (VALUE *)xmalloc(sizeof(VALUE)
+ VALUE *new_argv = (VALUE *)xmalloc_ptrs(sizeof(VALUE)
* new_argv_size);
memcpy(new_argv, argv, sizeof(VALUE) * argv_size);
argv = new_argv;
@@ -1007,7 +1007,7 @@
else {
if (real_argc >= argv_size) {
const size_t new_argv_size = real_argc + 100;
- VALUE *new_argv = (VALUE *)xmalloc(sizeof(VALUE)
+ VALUE *new_argv = (VALUE *)xmalloc_ptrs(sizeof(VALUE)
* new_argv_size);
memcpy(new_argv, argv, sizeof(VALUE) * argv_size);
argv = new_argv;
@@ -1513,7 +1513,7 @@
&& (arity.min > 1 || (arity.min == 1 && arity.min != arity.max))) {
// Expand the array.
long ary_len = RARRAY_LEN(argv[0]);
- new_argv = (VALUE *)xmalloc(sizeof(VALUE) * ary_len);
+ 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);
}
@@ -1533,7 +1533,7 @@
else {
new_argc = argc;
}
- new_argv = (VALUE *)xmalloc(sizeof(VALUE) * new_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;
}
Modified: MacRuby/trunk/gc.c
===================================================================
--- MacRuby/trunk/gc.c 2010-04-01 21:58:39 UTC (rev 3900)
+++ MacRuby/trunk/gc.c 2010-04-01 22:10:02 UTC (rev 3901)
@@ -109,11 +109,9 @@
exit(1);
}
-void *
-ruby_xmalloc(size_t size)
+static inline void *
+ruby_xmalloc_memory(size_t size, int type)
{
- void *mem;
-
if (size < 0) {
rb_raise(rb_eNoMemError, "negative allocation size (or too big)");
}
@@ -124,16 +122,32 @@
rb_objc_no_gc_error();
}
- mem = auto_zone_allocate_object(__auto_zone, size,
- AUTO_MEMORY_SCANNED, 0, 0);
+ void *mem = auto_zone_allocate_object(__auto_zone, size, type, 0, 0);
if (mem == NULL) {
rb_memerror();
}
-
return mem;
}
void *
+ruby_xmalloc(size_t size)
+{
+ return ruby_xmalloc_memory(size, AUTO_MEMORY_SCANNED);
+}
+
+void *
+ruby_xmalloc_ptrs(size_t size)
+{
+ int type;
+#if MAC_OS_X_VERSION_MAX_ALLOWED >= 1070
+ type = AUTO_MEMORY_ALL_POINTERS;
+#else
+ type = AUTO_MEMORY_SCANNED;
+#endif
+ return ruby_xmalloc_memory(size, type);
+}
+
+void *
ruby_xmalloc2(size_t n, size_t size)
{
size_t len = size * n;
@@ -146,20 +160,14 @@
void *
ruby_xcalloc(size_t n, size_t size)
{
- void *mem;
-
- mem = ruby_xmalloc2(n, size);
+ void *mem = ruby_xmalloc2(n, size);
memset(mem, 0, n * size);
-
return mem;
}
-
void *
ruby_xrealloc(void *ptr, size_t size)
{
- void *mem;
-
if (size < 0) {
rb_raise(rb_eArgError, "negative re-allocation size");
}
@@ -171,21 +179,18 @@
}
#if MAC_OS_X_VERSION_MAX_ALLOWED < 1060
- {
- size_t old_size = malloc_size(ptr);
- if (old_size >= size) {
- return ptr;
- }
- mem = ruby_xmalloc(size);
- if (mem == NULL) {
- rb_memerror();
- }
- auto_zone_write_barrier_memmove(__auto_zone, mem, ptr, old_size);
- xfree(ptr);
+ size_t old_size = malloc_size(ptr);
+ if (old_size >= size) {
+ return ptr;
}
+ void *mem = ruby_xmalloc(size);
+ if (mem == NULL) {
+ rb_memerror();
+ }
+ auto_zone_write_barrier_memmove(__auto_zone, mem, ptr, old_size);
+ xfree(ptr);
#else
- mem = malloc_zone_realloc(__auto_zone, ptr, size);
-
+ void *mem = malloc_zone_realloc(__auto_zone, ptr, size);
if (mem == NULL) {
rb_memerror();
}
@@ -213,7 +218,6 @@
}
}
-
/*
* call-seq:
* GC.enable => true or false
Modified: MacRuby/trunk/include/ruby/defines.h
===================================================================
--- MacRuby/trunk/include/ruby/defines.h 2010-04-01 21:58:39 UTC (rev 3900)
+++ MacRuby/trunk/include/ruby/defines.h 2010-04-01 22:10:02 UTC (rev 3901)
@@ -50,6 +50,7 @@
#endif
#define xmalloc ruby_xmalloc
+#define xmalloc_ptrs ruby_xmalloc_ptrs
#define xmalloc2 ruby_xmalloc2
#define xcalloc ruby_xcalloc
#define xrealloc ruby_xrealloc
@@ -57,6 +58,7 @@
#define xfree ruby_xfree
void *xmalloc(size_t);
+void *xmalloc_ptrs(size_t);
void *xmalloc2(size_t,size_t);
void *xcalloc(size_t,size_t);
void *xrealloc(void*,size_t);
Modified: MacRuby/trunk/vm.cpp
===================================================================
--- MacRuby/trunk/vm.cpp 2010-04-01 21:58:39 UTC (rev 3900)
+++ MacRuby/trunk/vm.cpp 2010-04-01 22:10:02 UTC (rev 3901)
@@ -4660,7 +4660,7 @@
if (argc > 0) {
t->argc = argc;
- GC_WB(&t->argv, xmalloc(sizeof(VALUE) * argc));
+ GC_WB(&t->argv, xmalloc_ptrs(sizeof(VALUE) * argc));
for (int i = 0; i < argc; i++) {
GC_WB(&t->argv[i], argv[i]);
}
Modified: MacRuby/trunk/vm.h
===================================================================
--- MacRuby/trunk/vm.h 2010-04-01 21:58:39 UTC (rev 3900)
+++ MacRuby/trunk/vm.h 2010-04-01 22:10:02 UTC (rev 3901)
@@ -329,11 +329,11 @@
rb_vm_regrow_robject_slots(struct RObject *obj, unsigned int new_num_slot)
{
unsigned int i;
- VALUE *new_slots = (VALUE *)xmalloc(sizeof(VALUE) * (new_num_slot + 1));
- for (i = 0; i < obj->num_slots; i++) {
- GC_WB(&new_slots[i], obj->slots[i]);
+ VALUE *new_slots = (VALUE *)xrealloc(obj->slots,
+ sizeof(VALUE) * (new_num_slot + 1));
+ if (new_slots != obj->slots) {
+ GC_WB(&obj->slots, new_slots);
}
- GC_WB(&obj->slots, new_slots);
for (i = obj->num_slots; i <= new_num_slot; i++) {
obj->slots[i] = Qundef;
}
@@ -436,7 +436,7 @@
int num_slots = 10;
obj = (struct RObject *)rb_objc_newobj(sizeof(struct RObject));
- GC_WB(&obj->slots, xmalloc(num_slots * sizeof(VALUE)));
+ GC_WB(&obj->slots, xmalloc_ptrs(num_slots * sizeof(VALUE)));
OBJSETUP(obj, klass, T_OBJECT);
@@ -447,7 +447,6 @@
for (i = 0; i < num_slots; i++) {
ROBJECT(obj)->slots[i] = Qundef;
}
-
return (VALUE)obj;
}
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/macruby-changes/attachments/20100401/2fdf3d5d/attachment-0001.html>
More information about the macruby-changes
mailing list