/* * header & license * Copyright (c) 2007 Martin Krauskopf * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ package org.jruby.debug; import java.util.LinkedList; import java.util.List; import org.jruby.RubyThread; import org.jruby.runtime.builtin.IRubyObject; final class DebugContext { static final String AT_BREAKPOINT = "at_breakpoint"; static final String AT_CATCHPOINT = "at_catchpoint"; static final String AT_LINE = "at_line"; static final String AT_TRACING = "at_tracing"; static final String LIST = "list"; private static int thnumMax = 0; enum StopReason { NONE, STEP, BREAKPOINT, CATCHPOINT } private final RubyThread thread; private IRubyObject breakpoint; private final List frames; private int lastLine; private String lastFile; private int destFrame; private int stopFrame; private int stopNext; private int stopLine; private int stackLen; private StopReason stopReason; private int thnum; private boolean dead; // flags private boolean suspended; private boolean wasRunning; private boolean ignored; private boolean skipped; private boolean enableBreakpoint; private boolean stepped; private boolean tracing; private boolean forceMove; DebugContext(final RubyThread thread) { thnum = ++thnumMax; lastFile = null; lastLine = 0; stopNext = -1; destFrame = -1; stopLine = -1; stopFrame = -1; stopReason = StopReason.NONE; frames = new LinkedList(); breakpoint = thread.getRuntime().getNil(); this.thread = thread; } void addFrame(final DebugFrame debugFrame) { frames.add(debugFrame); } RubyThread getThread() { return thread; } DebugFrame getTopFrame() { return frames.get(getStackSize() - 1); } DebugFrame getFrame(int index) { return frames.get(getStackSize() - index - 1); } DebugFrame popFrame() { return frames.remove(getStackSize() - 1); } void clearFrames() { frames.clear(); } IRubyObject getBreakpoint() { return breakpoint; } void setBreakpoint(IRubyObject breakpoint) { this.breakpoint = breakpoint; } int getDestFrame() { return destFrame; } void setDestFrame(int destFrame) { this.destFrame = destFrame; } boolean isEnableBreakpoint() { return enableBreakpoint; } void setEnableBreakpoint(boolean enableBreakpoint) { this.enableBreakpoint = enableBreakpoint; } boolean isForceMove() { return forceMove; } void setForceMove(boolean forceMove) { this.forceMove = forceMove; } boolean isIgnored() { return ignored; } void setIgnored(boolean ignored) { this.ignored = ignored; } String getLastFile() { return lastFile; } void setLastFile(String lastFile) { this.lastFile = lastFile; } int getLastLine() { return lastLine; } void setLastLine(int lastLine) { this.lastLine = lastLine; } boolean isSkipped() { return skipped; } void setSkipped(boolean skipped) { this.skipped = skipped; } int getStackLen() { return stackLen; } void setStackLen(int stackLen) { this.stackLen = stackLen; } int getStackSize() { return frames.size(); } boolean isStepped() { return stepped; } void setStepped(boolean stepped) { this.stepped = stepped; } int getStopFrame() { return stopFrame; } void setStopFrame(int stopFrame) { this.stopFrame = stopFrame; } int getStopLine() { return stopLine; } void setStopLine(int stopLine) { this.stopLine = stopLine; } int getStopNext() { return stopNext; } void setStopNext(int stopNext) { this.stopNext = stopNext; } StopReason getStopReason() { return stopReason; } void setStopReason(StopReason stopReason) { this.stopReason = stopReason; } boolean isSuspended() { return suspended; } void setSuspended(boolean suspended) { this.suspended = suspended; } int getThnum() { return thnum; } void setThnum(int thnum) { this.thnum = thnum; } boolean isTracing() { return tracing; } void setTracing(boolean tracing) { this.tracing = tracing; } boolean isWasRunning() { return wasRunning; } void setWasRunning(boolean wasRunning) { this.wasRunning = wasRunning; } boolean isDead() { return dead; } void setDead(boolean dead) { this.dead = dead; } /* "Step", "Next" and "Finish" do their work by saving information about where to stop next. resetSteppingStopPoints removes/resets this information. */ void resetSteppingStopPoints() { this.destFrame = -1; this.stopLine = -1; this.stopNext = -1; } }