package com.gsamokovarov.skiptrace;
import java.lang.reflect.Field; import org.jruby.runtime.ThreadContext; import org.jruby.runtime.DynamicScope; import org.jruby.runtime.Frame; import org.jruby.runtime.backtrace.BacktraceElement; import org.jruby.runtime.builtin.IRubyObject;
public class ThreadContextInternals {
private ThreadContext context;
public ThreadContextInternals(ThreadContext context) {
this.context = context;
}
public Frame[] getFrameStack() {
return (Frame[]) getPrivateField("frameStack");
}
public int getFrameIndex() {
return (Integer) getPrivateField("frameIndex");
}
public DynamicScope[] getScopeStack() {
return (DynamicScope[]) getPrivateField("scopeStack");
}
public int getScopeIndex() {
return (Integer) getPrivateField("scopeIndex");
}
public BacktraceElement[] getBacktrace() {
return (BacktraceElement[]) getPrivateField("backtrace");
}
public int getBacktraceIndex() {
return (Integer) getPrivateField("backtraceIndex");
}
private Object getPrivateField(String fieldName) {
try {
Field field = ThreadContext.class.getDeclaredField(fieldName);
field.setAccessible(true);
return field.get(context);
} catch (NoSuchFieldException exc) {
throw new ThreadContextInterfaceException(fieldName, exc);
} catch (IllegalAccessException exc) {
throw new ThreadContextInterfaceException(fieldName, exc);
}
}
}