package com.gsamokovarov.skiptrace;

import org.jruby.runtime.ThreadContext; import org.jruby.runtime.DynamicScope; import org.jruby.runtime.Binding; import org.jruby.runtime.Frame; import org.jruby.runtime.DynamicScope; import org.jruby.runtime.backtrace.BacktraceElement; import java.util.Iterator; import java.util.NoSuchElementException;

class CurrentBindingsIterator implements Iterator<Binding> {

private Frame[] frameStack;
private int frameIndex;

private DynamicScope[] scopeStack;
private int scopeIndex;

private BacktraceElement[] backtrace;
private int backtraceIndex;

CurrentBindingsIterator(ThreadContext context) {
    ThreadContextInternals contextInternals = new ThreadContextInternals(context);

    this.frameStack = contextInternals.getFrameStack();
    this.frameIndex = contextInternals.getFrameIndex();

    this.scopeStack = contextInternals.getScopeStack();
    this.scopeIndex = contextInternals.getScopeIndex();

    this.backtrace = contextInternals.getBacktrace();
    this.backtraceIndex = contextInternals.getBacktraceIndex();
}

public boolean hasNext() {
    return frameIndex >= 0 && scopeIndex >= 0 && backtraceIndex >= 0;
}

public Binding next() {
    if (!hasNext()) {
        throw new NoSuchElementException();
    }

    Frame frame = frameStack[frameIndex--];
    DynamicScope scope = scopeStack[scopeIndex--];
    BacktraceElement element = backtrace[backtraceIndex--];

    return BindingBuilder.build(frame, scope, element);
}

public void remove() {
    throw new UnsupportedOperationException();
}

}