package org.erlide.debug.ui.tracing;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.debug.core.model.IDebugTarget;
import org.eclipse.debug.core.model.IStackFrame;
import org.eclipse.debug.core.model.IThread;
import org.erlide.backend.debug.model.ErlangProcess;
import org.erlide.backend.debug.model.ErlangStackFrame;
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 DebugTraceEvent {
private final OtpErlangPid pid;
private final OtpErlangTuple event;
public DebugTraceEvent(final OtpErlangPid pid, final OtpErlangTuple event) {
super();
this.pid = pid;
this.event = event;
}
public OtpErlangPid getPid() {
return pid;
}
// event: {what, {ieval, extra}, stack}
// ieval (record):
// level = 1, % Current call level
// line = -1, % Current source code line (of module)
// module, % MFA which called the currently
// function, % interpreted function
// arguments, %
// last_call = false % True if current expression is the VERY last to be
// evaluated (ie at all, not only in a clause)
// extra:
// {Val} % on return
// {_, _, OtpBindings} % otherwise
public OtpErlangTuple getTuple() {
return event;
}
public List<IStackFrame> getStackFrames(final IDebugTarget target,
final IThread process) {
// XXX JC copy paste
final OtpErlangTuple tuple = getTuple();
final OtpErlangList erlStackFrames = (OtpErlangList) tuple.elementAt(2);
final OtpErlangTuple t2 = (OtpErlangTuple) tuple.elementAt(1);
final OtpErlangTuple ieval = (OtpErlangTuple) t2.elementAt(0);
OtpErlangAtom m = (OtpErlangAtom) ieval.elementAt(3);
OtpErlangList bindings = (OtpErlangList) t2.elementAt(t2.arity() - 1);
OtpErlangLong l = (OtpErlangLong) ieval.elementAt(1);
final List<IStackFrame> stackFrames = new ArrayList<>(
erlStackFrames.arity() + 1);
for (final OtpErlangObject o : erlStackFrames) {
final OtpErlangTuple t = (OtpErlangTuple) o;
final OtpErlangTuple ml = (OtpErlangTuple) t.elementAt(1);
final OtpErlangObject ml0 = ml.elementAt(0);
int stackFrameNo;
final OtpErlangLong n = (OtpErlangLong) t.elementAt(3);
try {
stackFrameNo = n.intValue();
} catch (final OtpErlangRangeException e) {
stackFrameNo = -1;
}
final String module = m.atomValue();
int line;
try {
line = l.intValue();
} catch (final OtpErlangRangeException e) {
line = -1;
}
final IStackFrame sf = new ErlangStackFrame(module, (ErlangProcess) process,
target, line, null, bindings, stackFrameNo);
stackFrames.add(sf);
bindings = (OtpErlangList) t.elementAt(2);
m = (OtpErlangAtom) ml0;
l = (OtpErlangLong) ml.elementAt(1);
}
return stackFrames;
}
}