blob: 42d706ae927c63aa77ec2b0be3aafcf2b9c33f5d [file] [log] [blame]
package org.intellij.plugins.xsltDebugger.impl;
import com.intellij.xdebugger.frame.XExecutionStack;
import com.intellij.xdebugger.frame.XStackFrame;
import org.intellij.plugins.xsltDebugger.VMPausedException;
import org.intellij.plugins.xsltDebugger.XsltDebuggerSession;
import org.intellij.plugins.xsltDebugger.rt.engine.Debugger;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class XsltExecutionStack extends XExecutionStack {
private final XsltStackFrame myTopFrame;
private final XsltDebuggerSession myDebuggerSession;
public XsltExecutionStack(String name, Debugger.Frame topFrame, XsltDebuggerSession debuggerSession) {
super(name);
myDebuggerSession = debuggerSession;
myTopFrame = new XsltStackFrame(topFrame, myDebuggerSession);
}
@Override
public XStackFrame getTopFrame() {
return myTopFrame;
}
@Override
public void computeStackFrames(int firstFrameIndex, XStackFrameContainer container) {
try {
if (myDebuggerSession.getCurrentState() == Debugger.State.SUSPENDED) {
Debugger.Frame frame = myTopFrame.getFrame();
final List<XStackFrame> frames = new ArrayList<XStackFrame>();
frames.add(myTopFrame);
while (frame != null) {
frame = frame.getPrevious();
if (frame != null) {
frames.add(new XsltStackFrame(frame, myDebuggerSession));
}
}
if (firstFrameIndex <= frames.size()) {
container.addStackFrames(frames.subList(firstFrameIndex, frames.size()), true);
} else {
container.addStackFrames(Collections.<XStackFrame>emptyList(), true);
}
}
} catch (VMPausedException e) {
container.errorOccurred(VMPausedException.MESSAGE);
}
}
}