[macruby-changes] [645] MacRuby/trunk
source_changes at macosforge.org
source_changes at macosforge.org
Sun Oct 5 20:18:11 PDT 2008
Revision: 645
http://trac.macosforge.org/projects/ruby/changeset/645
Author: lsansonetti at apple.com
Date: 2008-10-05 20:18:10 -0700 (Sun, 05 Oct 2008)
Log Message:
-----------
adding initial dtrace support, improved the GC finalizers, let auto decide when collections must happen
Modified Paths:
--------------
MacRuby/trunk/Rakefile
MacRuby/trunk/array.c
MacRuby/trunk/compile.h
MacRuby/trunk/eval.c
MacRuby/trunk/gc.c
MacRuby/trunk/include/ruby/intern.h
MacRuby/trunk/insns.def
MacRuby/trunk/objc.m
MacRuby/trunk/regexec.c
MacRuby/trunk/string.c
MacRuby/trunk/test/ruby/test_array.rb
MacRuby/trunk/vm.h
MacRuby/trunk/vm_insnhelper.c
Added Paths:
-----------
MacRuby/trunk/dtrace.d
MacRuby/trunk/sample-macruby/DTrace/
MacRuby/trunk/sample-macruby/DTrace/gc.d
MacRuby/trunk/sample-macruby/DTrace/insns_count.d
MacRuby/trunk/sample-macruby/DTrace/methods_count.d
MacRuby/trunk/sample-macruby/DTrace/methods_duration.d
Modified: MacRuby/trunk/Rakefile
===================================================================
--- MacRuby/trunk/Rakefile 2008-10-01 04:03:14 UTC (rev 644)
+++ MacRuby/trunk/Rakefile 2008-10-06 03:18:10 UTC (rev 645)
@@ -234,8 +234,19 @@
end
end
+desc "Create dtrace.h"
+task :dtrace_h do
+ dtrace_h = 'dtrace.h'
+ if !File.exist?(dtrace_h) or File.mtime(dtrace_h) < File.mtime('dtrace.d')
+ sh "/usr/sbin/dtrace -h -s dtrace.d -o new_dtrace.h"
+ if !File.exist?(dtrace_h) or File.read(dtrace_h) != File.read('new_dtrace.h')
+ mv 'new_dtrace.h', dtrace_h
+ end
+ end
+end
+
desc "Build known objects"
-task :objects => :config_h do
+task :objects => [:config_h, :dtrace_h] do
sh "/usr/bin/ruby tool/compile_prelude.rb prelude.rb miniprelude.c.new"
if !File.exist?('miniprelude.c') or File.read('miniprelude.c') != File.read('miniprelude.c.new')
mv('miniprelude.c.new', 'miniprelude.c')
Modified: MacRuby/trunk/array.c
===================================================================
--- MacRuby/trunk/array.c 2008-10-01 04:03:14 UTC (rev 644)
+++ MacRuby/trunk/array.c 2008-10-06 03:18:10 UTC (rev 645)
@@ -110,7 +110,6 @@
*(Class *)ary = (Class)klass;
CFMakeCollectable(ary);
- rb_gc_malloc_increase(sizeof(void *));
return (VALUE)ary;
}
Modified: MacRuby/trunk/compile.h
===================================================================
--- MacRuby/trunk/compile.h 2008-10-01 04:03:14 UTC (rev 644)
+++ MacRuby/trunk/compile.h 2008-10-06 03:18:10 UTC (rev 645)
@@ -167,6 +167,9 @@
ADD_INSN1(seq, line, trace, INT2FIX(event)); \
}
+#define ADD_TRACE2(seq, line, event) \
+ ADD_INSN1(seq, line, trace, INT2FIX(event));
+
/* add label */
#define ADD_LABEL(seq, label) \
ADD_ELEM(seq, (LINK_ELEMENT *) label)
Added: MacRuby/trunk/dtrace.d
===================================================================
--- MacRuby/trunk/dtrace.d (rev 0)
+++ MacRuby/trunk/dtrace.d 2008-10-06 03:18:10 UTC (rev 645)
@@ -0,0 +1,8 @@
+provider macruby {
+ probe insn__entry(char *insnname, char *sourcefile, int sourceline);
+ probe insn__return(char *insnname, char *sourcefile, int sourceline);
+ probe method__entry(char *classname, char *methodname, char *sourcefile, int sourceline);
+ probe method__return(char *classname, char *methodname, char *sourcefile, int sourceline);
+ probe raise(char *classname, char *sourcefile, int sourceline);
+ probe rescue(char *sourcefile, int sourceline);
+};
Modified: MacRuby/trunk/eval.c
===================================================================
--- MacRuby/trunk/eval.c 2008-10-01 04:03:14 UTC (rev 644)
+++ MacRuby/trunk/eval.c 2008-10-06 03:18:10 UTC (rev 645)
@@ -12,6 +12,7 @@
**********************************************************************/
#include "eval_intern.h"
+#include "dtrace.h"
VALUE proc_invoke(VALUE, VALUE, VALUE, VALUE);
VALUE rb_binding_new(void);
@@ -444,6 +445,11 @@
rb_trap_restore_mask();
if (tag != TAG_FATAL) {
+ if (MACRUBY_RAISE_ENABLED()) {
+ MACRUBY_RAISE((char *)rb_obj_classname(mesg),
+ (char *)rb_sourcefile(),
+ rb_sourceline());
+ }
EXEC_EVENT_HOOK(th, RUBY_EVENT_RAISE, th->cfp->self,
0 /* TODO: id */, 0 /* TODO: klass */);
}
Modified: MacRuby/trunk/gc.c
===================================================================
--- MacRuby/trunk/gc.c 2008-10-01 04:03:14 UTC (rev 644)
+++ MacRuby/trunk/gc.c 2008-10-06 03:18:10 UTC (rev 645)
@@ -44,7 +44,11 @@
#define AUTO_COLLECT_RATIO_COLLECTION (0 << 0)
#define AUTO_COLLECT_GENERATIONAL_COLLECTION (1 << 0)
#define AUTO_COLLECT_FULL_COLLECTION (1 << 0)
+#define AUTO_COLLECT_EXHAUSTIVE_COLLECTION (3 << 0)
+#define AUTO_COLLECT_SYNCHRONOUS (1 << 2)
+#define AUTO_COLLECT_IF_NEEDED (1 << 3)
#define AUTO_LOG_COLLECTIONS (1 << 1)
+#define AUTO_LOG_COLLECT_DECISION (1 << 2)
#define AUTO_LOG_REGIONS (1 << 4)
#define AUTO_LOG_UNUSUAL (1 << 5)
#define AUTO_LOG_WEAK (1 << 6)
@@ -105,7 +109,6 @@
} auto_statistics_t;
#endif
static auto_zone_t *__auto_zone = NULL;
-static long xmalloc_count = 0;
int rb_io_fptr_finalize(struct rb_io_t*);
@@ -124,7 +127,6 @@
#undef GC_DEBUG
int ruby_gc_stress = 0;
-static long malloc_increase = 0;
bool dont_gc = false;
#define malloc_limit GC_MALLOC_LIMIT
VALUE *rb_gc_stack_start = 0;
@@ -187,14 +189,6 @@
static int garbage_collect(void);
-void
-rb_gc_malloc_increase(size_t size)
-{
- malloc_increase += size;
- if (!dont_gc && (ruby_gc_stress || malloc_increase > malloc_limit))
- garbage_collect();
-}
-
static void
rb_objc_no_gc_error(void)
{
@@ -214,13 +208,11 @@
rb_raise(rb_eNoMemError, "negative allocation size (or too big)");
}
if (size == 0) size = 1;
- rb_gc_malloc_increase(size);
if (__auto_zone == NULL)
rb_objc_no_gc_error();
mem = auto_zone_allocate_object(__auto_zone, size,
AUTO_MEMORY_SCANNED, 0, 0);
- xmalloc_count++;
if (!mem) {
rb_memerror();
}
@@ -264,9 +256,6 @@
if (size == 0)
size = 1;
- rb_gc_malloc_increase(size);
- if (ruby_gc_stress)
- garbage_collect();
mem = malloc_zone_realloc(__auto_zone, ptr, size);
if (mem == NULL)
rb_memerror();
@@ -417,43 +406,17 @@
static void *__nsobject = NULL;
-#define USE_OBJECTS_POOL 0
-
-#if USE_OBJECTS_POOL
-# define OBJECTS_POOL_SIZE 1000000
-static void **objects_pool = NULL;
-static unsigned objects_pool_i = 0;
-#endif
-
void *
rb_objc_newobj(size_t size)
{
void *obj;
- rb_gc_malloc_increase(size);
-#if USE_OBJECTS_POOL
- if (objects_pool == NULL)
- objects_pool = malloc(sizeof(void *) * OBJECTS_POOL_SIZE);
- if (objects_pool_i == 0) {
- unsigned i;
- //printf("repoll\n");
- for (i = 0; i < OBJECTS_POOL_SIZE; i++) {
- objects_pool[i] = auto_zone_allocate_object(__auto_zone, sizeof(RVALUE), AUTO_OBJECT_SCANNED, 1, 0);
- assert(objects_pool[i] != NULL);
- }
- objects_pool_i = OBJECTS_POOL_SIZE - 1;
- }
- //printf("get object %d from poll\n", objects_pool_i);
- obj = objects_pool[objects_pool_i--];
- auto_zone_release(__auto_zone, obj);
-#else
obj = auto_zone_allocate_object(__auto_zone, size, AUTO_OBJECT_SCANNED,
0, 0);
assert(obj != NULL);
-#endif
- if (__nsobject == NULL)
+ if (__nsobject == NULL) {
__nsobject = (void *)objc_getClass("NSObject");
+ }
RBASIC(obj)->klass = (VALUE)__nsobject;
- //DLOG("NEWOBJ", "size %ld -> %p", size, obj);
return obj;
}
@@ -469,12 +432,14 @@
auto_zone_unregister_thread(__auto_zone);
}
-void
+void native_mutex_lock(pthread_mutex_t *lock);
+void native_mutex_unlock(pthread_mutex_t *lock);
+
+static void
rb_objc_scan_external_callout(void *context, void (*scanner)(void *context, void *start, void *end))
{
rb_thread_t *th = GET_THREAD();
(*scanner)(context, th->stack, th->cfp->sp);
- //(*scanner)(context, th->stack, th->stack + th->stack_size);
}
NODE*
@@ -582,7 +547,6 @@
if (dont_gc)
return Qtrue;
auto_collect(__auto_zone, AUTO_COLLECT_GENERATIONAL_COLLECTION, NULL);
- malloc_increase = 0;
return Qtrue;
}
@@ -1274,33 +1238,23 @@
rb_obj_imp_finalize(void *obj, SEL sel)
{
const bool need_protection = GET_THREAD()->thread_id != pthread_self();
- void native_mutex_lock(pthread_mutex_t *lock);
- void native_mutex_unlock(pthread_mutex_t *lock);
+ bool call_finalize, free_ivar;
if (NATIVE((VALUE)obj)) {
long flag;
- if (need_protection) {
- native_mutex_lock(&GET_THREAD()->vm->global_interpreter_lock);
- }
flag = rb_objc_remove_flags(obj);
- if ((flag & FL_FINALIZE) == FL_FINALIZE) {
- rb_call_os_finalizer(obj);
- }
- if ((flag & FL_EXIVAR) == FL_EXIVAR) {
- rb_free_generic_ivar((VALUE)obj);
- }
- if (need_protection) {
- native_mutex_unlock(&GET_THREAD()->vm->global_interpreter_lock);
- }
+
+ call_finalize = (flag & FL_FINALIZE) == FL_FINALIZE;
+ free_ivar = (flag & FL_EXIVAR) == FL_EXIVAR;
}
else {
- bool call_finalize, free_ivar;
-
call_finalize = FL_TEST(obj, FL_FINALIZE);
free_ivar = FL_TEST(obj, FL_EXIVAR);
+ }
- if (need_protection && (call_finalize || free_ivar)) {
+ if (call_finalize || free_ivar) {
+ if (need_protection) {
native_mutex_lock(&GET_THREAD()->vm->global_interpreter_lock);
}
if (call_finalize) {
@@ -1309,7 +1263,7 @@
if (free_ivar) {
rb_free_generic_ivar((VALUE)obj);
}
- if (need_protection && (call_finalize || free_ivar)) {
+ if (need_protection) {
native_mutex_unlock(&GET_THREAD()->vm->global_interpreter_lock);
}
}
@@ -1330,17 +1284,20 @@
rb_objc_scan_external_callout;
if (getenv("GC_DEBUG"))
control->log = AUTO_LOG_COLLECTIONS | AUTO_LOG_REGIONS
- | AUTO_LOG_UNUSUAL;
+ | AUTO_LOG_UNUSUAL | AUTO_LOG_COLLECT_DECISION;
Method m = class_getInstanceMethod((Class)objc_getClass("NSObject"), sel_registerName("finalize"));
assert(m != NULL);
method_setImplementation(m, (IMP)rb_obj_imp_finalize);
+
+ auto_collector_disable(__auto_zone);
}
void
Init_PostGC(void)
{
objc_startCollectorThread();
+ auto_collector_reenable(__auto_zone);
}
void
Modified: MacRuby/trunk/include/ruby/intern.h
===================================================================
--- MacRuby/trunk/include/ruby/intern.h 2008-10-01 04:03:14 UTC (rev 644)
+++ MacRuby/trunk/include/ruby/intern.h 2008-10-06 03:18:10 UTC (rev 645)
@@ -347,7 +347,6 @@
void *rb_objc_get_associative_ref(void *, void *);
void rb_objc_retain(const void *);
void rb_objc_release(const void *);
-void rb_gc_malloc_increase(size_t);
# define rb_gc_mark_locations(x,y)
# define rb_mark_tbl(x)
# define rb_mark_set(x)
Modified: MacRuby/trunk/insns.def
===================================================================
--- MacRuby/trunk/insns.def 2008-10-01 04:03:14 UTC (rev 644)
+++ MacRuby/trunk/insns.def 2008-10-06 03:18:10 UTC (rev 645)
@@ -1153,6 +1153,16 @@
}
RUBY_VM_CHECK_INTS();
+
+ if (MACRUBY_METHOD_RETURN_ENABLED()) {
+ if (reg_cfp->iseq != NULL && reg_cfp->iseq->type == ISEQ_TYPE_METHOD) {
+ MACRUBY_METHOD_RETURN((char *)rb_class2name(reg_cfp->iseq->klass),
+ (char *)RSTRING_PTR(reg_cfp->iseq->name),
+ (char *)rb_sourcefile(),
+ rb_sourceline());
+ }
+ }
+
vm_pop_frame(th);
RESTORE_REGS();
}
Modified: MacRuby/trunk/objc.m
===================================================================
--- MacRuby/trunk/objc.m 2008-10-01 04:03:14 UTC (rev 644)
+++ MacRuby/trunk/objc.m 2008-10-06 03:18:10 UTC (rev 645)
@@ -2644,7 +2644,8 @@
for (j = 0; j < methods_count; j++) { \
if (methods[j].name == sel_ignored) \
continue; \
- st_insert(t, (st_data_t)methods[j].name, (st_data_t)methods[j].types); \
+ st_insert(t, (st_data_t)methods[j].name, \
+ (st_data_t)strdup(methods[j].types)); \
} \
free(methods); \
} \
@@ -2937,15 +2938,21 @@
return recv;
}
+#define FLAGS_AS_ASSOCIATIVE_REF 1
+
static CFMutableDictionaryRef __obj_flags;
long
rb_objc_flag_get_mask(const void *obj)
{
+#if FLAGS_AS_ASSOCIATIVE_REF
+ return (long)rb_objc_get_associative_ref((void *)obj, &__obj_flags);
+#else
if (__obj_flags == NULL)
return 0;
return (long)CFDictionaryGetValue(__obj_flags, obj);
+#endif
}
bool
@@ -2963,6 +2970,16 @@
void
rb_objc_flag_set(const void *obj, int flag, bool val)
{
+#if FLAGS_AS_ASSOCIATIVE_REF
+ long v = (long)rb_objc_get_associative_ref((void *)obj, &__obj_flags);
+ if (val) {
+ v |= flag;
+ }
+ else {
+ v ^= flag;
+ }
+ rb_objc_set_associative_ref((void *)obj, &__obj_flags, (void *)v);
+#else
long v;
if (__obj_flags == NULL) {
@@ -2976,11 +2993,17 @@
v ^= flag;
}
CFDictionarySetValue(__obj_flags, obj, (void *)v);
+#endif
}
long
rb_objc_remove_flags(const void *obj)
{
+#if FLAGS_AS_ASSOCIATIVE_REF
+ long flag = (long)rb_objc_get_associative_ref((void *)obj, &__obj_flags);
+ //rb_objc_set_associative_ref((void *)obj, &__obj_flags, (void *)0);
+ return flag;
+#else
long flag;
if (CFDictionaryGetValueIfPresent(__obj_flags, obj,
(const void **)&flag)) {
@@ -2988,6 +3011,7 @@
return flag;
}
return 0;
+#endif
}
static void
Modified: MacRuby/trunk/regexec.c
===================================================================
--- MacRuby/trunk/regexec.c 2008-10-01 04:03:14 UTC (rev 644)
+++ MacRuby/trunk/regexec.c 2008-10-06 03:18:10 UTC (rev 645)
@@ -104,14 +104,14 @@
if (IS_NULL(parent->childs)) {
n = HISTORY_TREE_INIT_ALLOC_SIZE;
- parent->childs =
- (OnigCaptureTreeNode** )xmalloc(sizeof(OnigCaptureTreeNode*) * n);
+ GC_WB(&parent->childs,
+ (OnigCaptureTreeNode** )xmalloc(sizeof(OnigCaptureTreeNode*) * n));
}
else {
n = parent->allocated * 2;
- parent->childs =
+ GC_WB(&parent->childs,
(OnigCaptureTreeNode** )xrealloc(parent->childs,
- sizeof(OnigCaptureTreeNode*) * n);
+ sizeof(OnigCaptureTreeNode*) * n));
}
CHECK_NULL_RETURN_MEMERR(parent->childs);
for (i = parent->allocated; i < n; i++) {
@@ -343,7 +343,7 @@
offset = ((offset) * (state_num)) >> 3;\
if (size > 0 && offset < size && size < STATE_CHECK_BUFF_MAX_SIZE) {\
if (size >= STATE_CHECK_BUFF_MALLOC_THRESHOLD_SIZE) {\
- (msa).state_check_buff = (void* )xmalloc(size);\
+ GC_WB(&(msa).state_check_buff, (void* )xmalloc(size));\
CHECK_NULL_RETURN_MEMERR((msa).state_check_buff);\
}\
else \
Added: MacRuby/trunk/sample-macruby/DTrace/gc.d
===================================================================
--- MacRuby/trunk/sample-macruby/DTrace/gc.d (rev 0)
+++ MacRuby/trunk/sample-macruby/DTrace/gc.d 2008-10-06 03:18:10 UTC (rev 645)
@@ -0,0 +1,22 @@
+#!/usr/sbin/dtrace -s
+
+#pragma D option quiet
+
+BEGIN
+{
+ printf("Target pid: %d\n\n", $target);
+ printf("%-10s %-10s %-10s %-10s\n", "OBJECTS", "BYTES", "DURATION", "TYPE");
+ printf("--------------------------------------------------------------------------------\n");
+}
+
+pid$target::auto_trace_collection_begin:entry
+{
+ self->starttime = walltimestamp / 1000;
+}
+
+pid$target::auto_trace_collection_end:entry
+{
+ printf("%-10d %-10d %-10d %-10s\n", arg2, arg3,
+ (walltimestamp / 1000) - self->starttime,
+ arg1 ? "generational" : "full");
+}
Added: MacRuby/trunk/sample-macruby/DTrace/insns_count.d
===================================================================
--- MacRuby/trunk/sample-macruby/DTrace/insns_count.d (rev 0)
+++ MacRuby/trunk/sample-macruby/DTrace/insns_count.d 2008-10-06 03:18:10 UTC (rev 645)
@@ -0,0 +1,21 @@
+#!/usr/sbin/dtrace -s
+
+#pragma D option quiet
+
+BEGIN
+{
+ printf("Target pid: %d\n\n", $target);
+}
+
+macruby$target:::insn-entry
+{
+ @[copyinstr(arg0)] = count();
+}
+
+END
+{
+ printf("\n");
+ printf("%30s %-30s\n", "INSN", "COUNT");
+ printf("--------------------------------------------------------------------------------\n");
+ printa("%30s %-30 at d\n", @);
+}
Added: MacRuby/trunk/sample-macruby/DTrace/methods_count.d
===================================================================
--- MacRuby/trunk/sample-macruby/DTrace/methods_count.d (rev 0)
+++ MacRuby/trunk/sample-macruby/DTrace/methods_count.d 2008-10-06 03:18:10 UTC (rev 645)
@@ -0,0 +1,23 @@
+#!/usr/sbin/dtrace -s
+
+#pragma D option quiet
+
+BEGIN
+{
+ printf("Target pid: %d\n\n", $target);
+}
+
+macruby$target:::method-entry
+{
+ printf("%30s:%-5d %s#%s\n", copyinstr(arg2), arg3,
+ copyinstr(arg0), copyinstr(arg1));
+ @methods_count[copyinstr(arg0), copyinstr(arg1)] = count();
+}
+
+END
+{
+ printf("\n");
+ printf("%30s %-30s %s\n", "CLASS", "METHOD", "COUNT");
+ printf("--------------------------------------------------------------------------------\n");
+ printa("%30s %-30s %@d\n", @methods_count);
+}
Added: MacRuby/trunk/sample-macruby/DTrace/methods_duration.d
===================================================================
--- MacRuby/trunk/sample-macruby/DTrace/methods_duration.d (rev 0)
+++ MacRuby/trunk/sample-macruby/DTrace/methods_duration.d 2008-10-06 03:18:10 UTC (rev 645)
@@ -0,0 +1,23 @@
+#!/usr/sbin/dtrace -s
+
+#pragma D option quiet
+
+BEGIN
+{
+ printf("Target pid: %d\n\n", $target);
+ printf("%20s %-5s %10s %-30s %10s\n", "FILE", "LINE", "CLASS", "METHOD",
+ "DURATION");
+ printf("--------------------------------------------------------------------------------\n");
+}
+
+macruby$target:::method-entry
+{
+ self->starttime = walltimestamp / 1000;
+}
+
+macruby$target:::method-return
+{
+ printf("%20s:%-5d %10s#%-30s %10d\n", copyinstr(arg2), arg3,
+ copyinstr(arg0), copyinstr(arg1),
+ (walltimestamp / 1000) - self->starttime);
+}
Modified: MacRuby/trunk/string.c
===================================================================
--- MacRuby/trunk/string.c 2008-10-01 04:03:14 UTC (rev 644)
+++ MacRuby/trunk/string.c 2008-10-06 03:18:10 UTC (rev 645)
@@ -75,7 +75,6 @@
return NULL;
mdata = CFDataCreateMutableCopy(NULL, 0, data);
len = CFDataGetLength(data);
- rb_gc_malloc_increase(len);
/* This is a hack to make sure a sentinel byte is created at the
* end of the buffer.
*/
@@ -125,7 +124,6 @@
kCFStringEncodingUTF8,
false,
kCFAllocatorNull);
- rb_gc_malloc_increase(datalen);
if (bytestr != NULL) {
if (CFStringGetLength(bytestr) == datalen) {
CFStringReplaceAll((CFMutableStringRef)str, (CFStringRef)bytestr);
@@ -198,7 +196,6 @@
data = CFDataCreateMutable(NULL, 0);
CFDataAppendBytes(data, (const UInt8 *)dataptr, datalen);
- rb_gc_malloc_increase(datalen);
rb_str_cfdata_set(str, data);
CFMakeCollectable(data);
}
@@ -232,8 +229,6 @@
substr = CFStringCreateWithBytes(NULL, (const UInt8 *)ptr,
len, kCFStringEncodingUTF8, false);
- rb_gc_malloc_increase(32 + (sizeof(UniChar) * len));
-
if (substr != NULL) {
CFStringAppend((CFMutableStringRef)str, substr);
CFRelease(substr);
@@ -247,7 +242,6 @@
}
}
}
- rb_gc_malloc_increase(32 + (sizeof(UniChar) * len));
if (need_padding)
CFStringPad((CFMutableStringRef)str, CFSTR(" "), len, 0);
@@ -415,8 +409,6 @@
CFMakeCollectable((CFTypeRef)dup);
- rb_gc_malloc_increase(32 + (sizeof(UniChar) * RSTRING_LEN(dup)));
-
return dup;
}
@@ -742,7 +734,6 @@
CFDataAppendBytes(subdata, bytes + beg, len);
rb_str_cfdata_set((VALUE)substr, subdata);
CFMakeCollectable(subdata);
- rb_gc_malloc_increase(sizeof(UInt8) * len);
RSTRING_SYNC(substr);
}
@@ -757,7 +748,6 @@
buffer);
CFStringAppendCharacters(substr, buffer, len);
}
- rb_gc_malloc_increase(sizeof(UniChar) * len);
}
CFMakeCollectable(substr);
return (VALUE)substr;
@@ -826,7 +816,6 @@
data = (CFMutableDataRef)rb_str_cfdata2(str);
if (data != NULL) {
CFDataAppendBytes(data, (const UInt8 *)ptr, len);
- rb_gc_malloc_increase(sizeof(UniChar) * len);
}
else {
long slen;
@@ -924,7 +913,6 @@
CFDataGetLength(data));
}
}
- rb_gc_malloc_increase(sizeof(UniChar) * str2len);
return str;
}
@@ -965,7 +953,6 @@
buf[1] = '\0';
CFStringAppendCString((CFMutableStringRef)str1, buf,
kCFStringEncodingUTF8);
- rb_gc_malloc_increase(sizeof(UniChar));
return str1;
}
return rb_str_append(str1, str2);
@@ -2246,12 +2233,10 @@
CFMutableDataRef mdata;
mdata = CFDataCreateMutableCopy(NULL, 0, data);
- rb_gc_malloc_increase(CFDataGetLength(data));
rb_str_cfdata_set(str, mdata);
CFMakeCollectable(mdata);
}
CFStringReplaceAll((CFMutableStringRef)str, (CFStringRef)str2);
- rb_gc_malloc_increase(CFStringGetLength((CFStringRef)str2) * sizeof(UniChar));
if (OBJ_TAINTED(str2))
OBJ_TAINT(str);
return str;
Modified: MacRuby/trunk/test/ruby/test_array.rb
===================================================================
--- MacRuby/trunk/test/ruby/test_array.rb 2008-10-01 04:03:14 UTC (rev 644)
+++ MacRuby/trunk/test/ruby/test_array.rb 2008-10-06 03:18:10 UTC (rev 645)
@@ -467,7 +467,7 @@
def test_collect
a = @cls[ 1, 'cat', 1..1 ]
- assert_equal([ Fixnum, NSCFString, Range], a.collect {|e| e.class} )
+ assert_equal([ Fixnum, String, Range], a.collect {|e| e.class} )
assert_equal([ 99, 99, 99], a.collect { 99 } )
assert_equal([], @cls[].collect { 99 })
@@ -481,8 +481,8 @@
# also update map!
def test_collect!
a = @cls[ 1, 'cat', 1..1 ]
- assert_equal([ Fixnum, NSCFString, Range], a.collect! {|e| e.class} )
- assert_equal([ Fixnum, NSCFString, Range], a)
+ assert_equal([ Fixnum, String, Range], a.collect! {|e| e.class} )
+ assert_equal([ Fixnum, String, Range], a)
a = @cls[ 1, 'cat', 1..1 ]
assert_equal([ 99, 99, 99], a.collect! { 99 } )
@@ -821,8 +821,8 @@
# also update collect!
def test_map!
a = @cls[ 1, 'cat', 1..1 ]
- assert_equal(@cls[ Fixnum, NSCFString, Range], a.map! {|e| e.class} )
- assert_equal(@cls[ Fixnum, NSCFString, Range], a)
+ assert_equal(@cls[ Fixnum, String, Range], a.map! {|e| e.class} )
+ assert_equal(@cls[ Fixnum, String, Range], a)
a = @cls[ 1, 'cat', 1..1 ]
assert_equal(@cls[ 99, 99, 99], a.map! { 99 } )
@@ -1454,7 +1454,7 @@
klass = Class.new(Array)
a = klass.new.to_a
assert_equal([], a)
- assert_equal(NSCFArray, a.class)
+ assert_equal(Array, a.class)
end
def test_values_at2
Modified: MacRuby/trunk/vm.h
===================================================================
--- MacRuby/trunk/vm.h 2008-10-01 04:03:14 UTC (rev 644)
+++ MacRuby/trunk/vm.h 2008-10-06 03:18:10 UTC (rev 645)
@@ -79,9 +79,11 @@
#else
+extern void rb_enter_insn_trace(rb_control_frame_t *);
+extern void rb_end_insn_trace(rb_control_frame_t *);
#define debugs
-#define DEBUG_ENTER_INSN(insn) //printf("enter insn %s\n", insn);
-#define DEBUG_END_INSN()
+#define DEBUG_ENTER_INSN(insn) rb_enter_insn_trace(GET_CFP())
+#define DEBUG_END_INSN() rb_end_insn_trace(GET_CFP());
#endif
#define throwdebug if(0)printf
Modified: MacRuby/trunk/vm_insnhelper.c
===================================================================
--- MacRuby/trunk/vm_insnhelper.c 2008-10-01 04:03:14 UTC (rev 644)
+++ MacRuby/trunk/vm_insnhelper.c 2008-10-06 03:18:10 UTC (rev 645)
@@ -15,6 +15,7 @@
#if WITH_OBJC
# include <dlfcn.h>
+# include "dtrace.h"
#endif
/* control stack frame */
@@ -724,6 +725,13 @@
DLOG("RCALL", "%c[<%s %p> %s] node=%p cached=%d", class_isMetaClass((Class)klass) ? '+' : '-', class_getName((Class)klass), (void *)recv, (char *)rb_id2name(id), mn, cached);
#endif
+ if (MACRUBY_METHOD_ENTRY_ENABLED()) {
+ MACRUBY_METHOD_ENTRY((char *)rb_class2name(klass),
+ (char *)rb_id2name(id),
+ (char *)rb_sourcefile(),
+ rb_sourceline());
+ }
+
start_method_dispatch:
if (mn != NULL) {
@@ -1844,3 +1852,45 @@
return val;
}
+
+#include "insns_info.inc"
+
+void
+rb_enter_insn_trace(rb_control_frame_t *cfp)
+{
+ if (MACRUBY_INSN_ENTRY_ENABLED()) {
+ /* just to get rid of compilation warnings... */
+ if (0) {
+ insn_op_types(0);
+ insn_op_type(0, 0);
+ }
+
+ rb_iseq_t *iseq = cfp->iseq;
+
+ if (iseq != NULL && VM_FRAME_TYPE(cfp) != FRAME_MAGIC_FINISH) {
+ VALUE *seq = iseq->iseq;
+ int pc = cfp->pc - iseq->iseq_encoded;
+
+ MACRUBY_INSN_ENTRY((char *)insn_name(seq[pc]),
+ (char *)rb_sourcefile(),
+ rb_sourceline());
+ }
+ }
+}
+
+void
+rb_end_insn_trace(rb_control_frame_t *cfp)
+{
+ if (MACRUBY_INSN_RETURN_ENABLED()) {
+ rb_iseq_t *iseq = cfp->iseq;
+
+ if (iseq != NULL && VM_FRAME_TYPE(cfp) != FRAME_MAGIC_FINISH) {
+ VALUE *seq = iseq->iseq;
+ int pc = cfp->pc - iseq->iseq_encoded;
+
+ MACRUBY_INSN_RETURN((char *)insn_name(seq[pc]),
+ (char *)rb_sourcefile(),
+ rb_sourceline());
+ }
+ }
+}
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.macosforge.org/pipermail/macruby-changes/attachments/20081005/54d00ac2/attachment-0001.html
More information about the macruby-changes
mailing list