package org.erlide.backend.debug.events; import org.eclipse.debug.core.DebugEvent; import org.erlide.backend.debug.model.ErlangDebugTarget; import org.erlide.backend.debug.model.ErlangProcess; import com.ericsson.otp.erlang.OtpErlangAtom; import com.ericsson.otp.erlang.OtpErlangList; import com.ericsson.otp.erlang.OtpErlangLong; import com.ericsson.otp.erlang.OtpErlangObject; import com.ericsson.otp.erlang.OtpErlangPid; import com.ericsson.otp.erlang.OtpErlangRangeException; import com.ericsson.otp.erlang.OtpErlangTuple; public class ExitAtEvent extends MetaEvent { private final String module; private final int line; @SuppressWarnings("unused") private final OtpErlangPid metaPid; private final OtpErlangPid pid; private final OtpErlangList bindings; private final OtpErlangList stackFrames; public ExitAtEvent(final OtpErlangPid metaPid, final OtpErlangObject otpErlangObject2, final OtpErlangObject otpErlangObject3, final OtpErlangObject otpErlangObject, final OtpErlangPid pid2) { this(metaPid, otpErlangObject2, otpErlangObject3, otpErlangObject, pid2, null, null); } public ExitAtEvent(final OtpErlangPid metaPid, final OtpErlangObject pos, final OtpErlangObject reason, final OtpErlangObject otpErlangObject, final OtpErlangPid pid2, final OtpErlangList stackFrames, final OtpErlangList bindings) { super(metaPid, null); if (pos instanceof OtpErlangTuple) { final OtpErlangTuple t = (OtpErlangTuple) pos; module = ((OtpErlangAtom) t.elementAt(0)).atomValue(); line = parseLine((OtpErlangLong) t.elementAt(1)); } else { module = null; line = -1; } this.metaPid = metaPid; pid = pid2; this.stackFrames = stackFrames; this.bindings = bindings; } private int parseLine(final OtpErlangLong elementAt) { try { return elementAt.intValue(); } catch (final OtpErlangRangeException e) { return -1; } } @Override public void execute(final ErlangDebugTarget debugTarget) { final ErlangProcess erlangProcess = debugTarget .getOrCreateErlangProcess(getPid(debugTarget)); if (module == null || line == -1) { erlangProcess.removeStackFrames(); erlangProcess.fireSuspendEvent(DebugEvent.TERMINATE); } if (stackFrames != null) { erlangProcess.setStackFrames(module, line, stackFrames, bindings); } erlangProcess.fireSuspendEvent(DebugEvent.TERMINATE); } @Override public OtpErlangPid getPid(final ErlangDebugTarget debugTarget) { return pid; } public String getModule() { return module; } public int getLine() { return line; } }