// Copyright (c) Corporation for National Research Initiatives
package org.python.core;
/**
* A python traceback object.
*/
public class PyTraceback extends PyObject {
public PyObject tb_next;
public PyFrame tb_frame;
public int tb_lineno;
public PyTraceback(PyFrame frame) {
tb_frame = frame;
if (tb_frame != null)
tb_lineno = tb_frame.getline();
tb_next = Py.None;
}
public PyTraceback(PyTraceback next) {
tb_next = next;
if (next != null) {
tb_frame = next.tb_frame.f_back;
tb_lineno = tb_frame.getline();
}
}
// filename, lineno, function_name
// " File \"%.900s\", line %d, in %s\n"
private String line() {
if (tb_frame == null || tb_frame.f_code == null)
return " (no code object) at line " + tb_lineno + "\n";
return " File \"" + tb_frame.f_code.co_filename + "\", line " + tb_lineno + ", in " + tb_frame.f_code.co_name
+ "\n";
}
public void dumpStack(StringBuffer buf) {
buf.append(line());
if (tb_next != Py.None && tb_next != this)
((PyTraceback) tb_next).dumpStack(buf);
else if (tb_next == this) {
buf.append("circularity detected!" + this + tb_next);
}
}
public String dumpStack() {
StringBuffer buf = new StringBuffer();
buf.append("Traceback (innermost last):\n");
dumpStack(buf);
return buf.toString();
}
public String toString() {
return "<traceback object at " + " " + Py.idstr(this) + ">";
}
}