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);
    }
}

}