[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