Skip to content

Commit

Permalink
Tweaks to get more of TracePoint working.
Browse files Browse the repository at this point in the history
* Add a safeguard in binding creation for empty RubyClass stack
* Add b_call, b_return, thread_begin and thread_end events
* Wire up new events
* Mask out 2.0 events from non-2.0 tracing
  • Loading branch information
headius committed Mar 7, 2013
1 parent 1ca2dca commit bf37b5b
Show file tree
Hide file tree
Showing 5 changed files with 26 additions and 3 deletions.
9 changes: 7 additions & 2 deletions src/org/jruby/Ruby.java
Expand Up @@ -2799,9 +2799,14 @@ public JavaProxyClassFactory getJavaProxyClassFactory() {
return javaProxyClassFactory;
}


private static final EnumSet<RubyEvent> EVENTS2_0 = EnumSet.of(RubyEvent.B_CALL, RubyEvent.B_RETURN, RubyEvent.THREAD_BEGIN, RubyEvent.THREAD_END);
public class CallTraceFuncHook extends EventHook {
private RubyProc traceFunc;
// filter out 2.0 events on non 2.0
private EnumSet<RubyEvent> interest =
is2_0() ?
EnumSet.complementOf(EVENTS2_0) :
EnumSet.allOf(RubyEvent.class);

public void setTraceFunc(RubyProc traceFunc) {
this.traceFunc = traceFunc;
Expand Down Expand Up @@ -2831,7 +2836,7 @@ public void eventHandler(ThreadContext context, String eventName, String file, i
}

public boolean isInterestedInEvent(RubyEvent event) {
return true;
return interest.contains(event);
}
};

Expand Down
10 changes: 10 additions & 0 deletions src/org/jruby/evaluator/ASTInterpreter.java
Expand Up @@ -109,8 +109,10 @@ public static IRubyObject INTERPRET_CLASS(Ruby runtime, ThreadContext context, N
public static IRubyObject INTERPRET_BLOCK(Ruby runtime, ThreadContext context, String file, int line, Node node, String name, IRubyObject self, Block block) {
try {
ThreadContext.pushBacktrace(context, name, file, line);
blockPreTrace(runtime, context, name, self.getType());
return node.interpret(runtime, context, self, block);
} finally {
blockPostTrace(runtime, context, name, self.getType());
ThreadContext.popBacktrace(context);
}
}
Expand All @@ -131,6 +133,14 @@ private static void methodPostTrace(Ruby runtime, ThreadContext context, String
if (runtime.hasEventHooks()) context.trace(RubyEvent.RETURN, name, implClass);
}

private static void blockPreTrace(Ruby runtime, ThreadContext context, String name, RubyModule implClass) {
if (runtime.hasEventHooks()) context.trace(RubyEvent.B_CALL, name, implClass);
}

private static void blockPostTrace(Ruby runtime, ThreadContext context, String name, RubyModule implClass) {
if (runtime.hasEventHooks()) context.trace(RubyEvent.B_RETURN, name, implClass);
}

@Deprecated
public static IRubyObject evalWithBinding(ThreadContext context, IRubyObject src, Binding binding) {
return evalWithBinding(context, binding.getSelf(), src, binding);
Expand Down
4 changes: 4 additions & 0 deletions src/org/jruby/internal/runtime/RubyRunnable.java
Expand Up @@ -35,6 +35,7 @@
import org.jruby.exceptions.ThreadKill;
import org.jruby.runtime.Block;
import org.jruby.runtime.Frame;
import org.jruby.runtime.RubyEvent;
import org.jruby.runtime.ThreadContext;
import org.jruby.runtime.builtin.IRubyObject;
import org.jruby.util.log.Logger;
Expand Down Expand Up @@ -74,6 +75,7 @@ public Thread getJavaThread() {

public void run() {
javaThread = Thread.currentThread();
ThreadContext initContext = runtime.getCurrentContext();
ThreadContext context = runtime.getThreadService().registerNewThread(rubyThread);

// set thread context JRuby classloader here, for Ruby-owned thread
Expand All @@ -95,7 +97,9 @@ public void run() {
try {
// Call the thread's code
try {
if (runtime.hasEventHooks()) initContext.trace(RubyEvent.THREAD_BEGIN, null, initContext.getFrameKlazz());
IRubyObject result = proc.call(context, arguments);
if (runtime.hasEventHooks()) initContext.trace(RubyEvent.THREAD_END, null, initContext.getFrameKlazz());
rubyThread.cleanTerminate(result);
} catch (JumpException.ReturnJump rj) {
if (runtime.is1_9()) {
Expand Down
4 changes: 4 additions & 0 deletions src/org/jruby/runtime/RubyEvent.java
Expand Up @@ -14,6 +14,10 @@ public enum RubyEvent {
RETURN ("return", 1),
C_CALL ("c-call", 1),
C_RETURN ("c-return", 1),
B_CALL ("b-call", 1),
B_RETURN ("b-return", 1),
THREAD_BEGIN ("thread-begin", 1),
THREAD_END ("thread-end", 1),
RAISE ("raise", 1),
COVERAGE ("coverage", 1);

Expand Down
2 changes: 1 addition & 1 deletion src/org/jruby/runtime/ThreadContext.java
Expand Up @@ -1213,7 +1213,7 @@ public void setWithinTrace(boolean isWithinTrace) {
*/
public Binding currentBinding() {
Frame frame = getCurrentFrame();
return new Binding(frame, getRubyClass(), getCurrentScope(), backtrace[backtraceIndex].clone());
return new Binding(frame, parentIndex < 0 ? frame.getKlazz() : getRubyClass(), getCurrentScope(), backtrace[backtraceIndex].clone());
}

/**
Expand Down

0 comments on commit bf37b5b

Please sign in to comment.