[macruby-changes] [2766] MacRuby/trunk/dispatcher.cpp

source_changes at macosforge.org source_changes at macosforge.org
Thu Oct 8 18:56:37 PDT 2009


Revision: 2766
          http://trac.macosforge.org/projects/ruby/changeset/2766
Author:   lsansonetti at apple.com
Date:     2009-10-08 18:56:36 -0700 (Thu, 08 Oct 2009)
Log Message:
-----------
added method__entry and method__return dtrace probes

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

Modified: MacRuby/trunk/dispatcher.cpp
===================================================================
--- MacRuby/trunk/dispatcher.cpp	2009-10-08 17:02:55 UTC (rev 2765)
+++ MacRuby/trunk/dispatcher.cpp	2009-10-09 01:56:36 UTC (rev 2766)
@@ -13,6 +13,7 @@
 #include "vm.h"
 #include "compiler.h"
 #include "objc.h"
+#include "dtrace.h"
 
 #include <execinfo.h>
 #include <dlfcn.h>
@@ -499,6 +500,20 @@
     return true;
 }
 
+static force_inline void
+symbolize(int delta, char *path, size_t pathlen, unsigned long *line)
+{
+    void *callstack[10];
+    const  int callstack_n = backtrace(callstack, 10);
+
+    if (callstack_n < delta
+	|| !GET_CORE()->symbolize_call_address(callstack[delta], NULL,
+	    path, pathlen, line, NULL, 0)) {
+	strncpy(path, "core", pathlen);
+	*line = 0;
+    }
+}
+
 static force_inline VALUE
 __rb_vm_dispatch(RoxorVM *vm, struct mcache *cache, VALUE self, Class klass,
 	SEL sel, rb_vm_block_t *block, unsigned char opt, int argc,
@@ -689,7 +704,30 @@
 	    }
 	} finalizer(block_already_current, current_klass, vm);
 
-	return __rb_vm_ruby_dispatch(self, sel, rcache.node, opt, argc, argv);
+	// DTrace probe: method__entry
+	if (MACRUBY_METHOD_ENTRY_ENABLED()) {
+	    char *class_name = (char *)rb_class2name((VALUE)klass);
+	    char *method_name = (char *)sel_getName(sel);
+	    char file[PATH_MAX];
+	    unsigned long line = 0;
+	    symbolize(1, file, sizeof file, &line);
+	    MACRUBY_METHOD_ENTRY(class_name, method_name, file, line);
+	}
+
+	VALUE v = __rb_vm_ruby_dispatch(self, sel, rcache.node, opt,
+		argc, argv);
+
+	// DTrace probe: method__return
+	if (MACRUBY_METHOD_RETURN_ENABLED()) {
+	    char *class_name = (char *)rb_class2name((VALUE)klass);
+	    char *method_name = (char *)sel_getName(sel);
+	    char file[PATH_MAX];
+	    unsigned long line = 0;
+	    symbolize(1, file, sizeof file, &line);
+	    MACRUBY_METHOD_RETURN(class_name, method_name, file, line);
+	}
+
+	return v;
     }
     else if (cache->flag == MCACHE_OCALL) {
 	if (ocache.klass != klass) {
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/macruby-changes/attachments/20091008/60743559/attachment.html>


More information about the macruby-changes mailing list