feat: use mappings in stack traces
This commit is contained in:
parent
42f443572a
commit
76c3d377af
@ -69,6 +69,17 @@ public class Engine implements DebugController {
|
|||||||
private final HashMap<Filename, TreeSet<Location>> bpts = new HashMap<>();
|
private final HashMap<Filename, TreeSet<Location>> bpts = new HashMap<>();
|
||||||
private final HashMap<Filename, SourceMap> maps = new HashMap<>();
|
private final HashMap<Filename, SourceMap> maps = new HashMap<>();
|
||||||
|
|
||||||
|
public Location mapToCompiled(Location location) {
|
||||||
|
var map = maps.get(location.filename());
|
||||||
|
if (map == null) return location;
|
||||||
|
return map.toCompiled(location);
|
||||||
|
}
|
||||||
|
public Location mapToOriginal(Location location) {
|
||||||
|
var map = maps.get(location.filename());
|
||||||
|
if (map == null) return location;
|
||||||
|
return map.toOriginal(location);
|
||||||
|
}
|
||||||
|
|
||||||
private DebugController debugger;
|
private DebugController debugger;
|
||||||
private Thread thread;
|
private Thread thread;
|
||||||
private PriorityBlockingQueue<Task> tasks = new PriorityBlockingQueue<>();
|
private PriorityBlockingQueue<Task> tasks = new PriorityBlockingQueue<>();
|
||||||
|
@ -67,14 +67,12 @@ public class SimpleDebugger implements Debugger {
|
|||||||
public final Filename filename;
|
public final Filename filename;
|
||||||
public final String source;
|
public final String source;
|
||||||
public final TreeSet<Location> breakpoints;
|
public final TreeSet<Location> breakpoints;
|
||||||
public final SourceMap map;
|
|
||||||
|
|
||||||
public Source(int id, Filename filename, String source, TreeSet<Location> breakpoints, SourceMap map) {
|
public Source(int id, Filename filename, String source, TreeSet<Location> breakpoints) {
|
||||||
this.id = id;
|
this.id = id;
|
||||||
this.filename = filename;
|
this.filename = filename;
|
||||||
this.source = source;
|
this.source = source;
|
||||||
this.breakpoints = breakpoints;
|
this.breakpoints = breakpoints;
|
||||||
this.map = map;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
private static class Breakpoint {
|
private static class Breakpoint {
|
||||||
@ -234,21 +232,6 @@ public class SimpleDebugger implements Debugger {
|
|||||||
return nextId++;
|
return nextId++;
|
||||||
}
|
}
|
||||||
|
|
||||||
private Location toCompiled(Location location) {
|
|
||||||
var id = filenameToId.get(location.filename());
|
|
||||||
if (id == null) return location;
|
|
||||||
var map = idToSource.get(id).map;
|
|
||||||
if (map == null) return location;
|
|
||||||
return map.toCompiled(location);
|
|
||||||
}
|
|
||||||
private Location toOriginal(Location location) {
|
|
||||||
var id = filenameToId.get(location.filename());
|
|
||||||
if (id == null) return location;
|
|
||||||
var map = idToSource.get(id).map;
|
|
||||||
if (map == null) return location;
|
|
||||||
return map.toOriginal(location);
|
|
||||||
}
|
|
||||||
|
|
||||||
private synchronized void updateFrames(Context ctx) {
|
private synchronized void updateFrames(Context ctx) {
|
||||||
var frame = ctx.peekFrame();
|
var frame = ctx.peekFrame();
|
||||||
if (frame == null) return;
|
if (frame == null) return;
|
||||||
@ -858,7 +841,7 @@ public class SimpleDebugger implements Debugger {
|
|||||||
|
|
||||||
@Override public void onSource(Filename filename, String source, TreeSet<Location> locations, SourceMap map) {
|
@Override public void onSource(Filename filename, String source, TreeSet<Location> locations, SourceMap map) {
|
||||||
int id = nextId();
|
int id = nextId();
|
||||||
var src = new Source(id, filename, source, locations, map);
|
var src = new Source(id, filename, source, locations);
|
||||||
|
|
||||||
idToSource.put(id, src);
|
idToSource.put(id, src);
|
||||||
filenameToId.put(filename, id);
|
filenameToId.put(filename, id);
|
||||||
@ -887,7 +870,7 @@ public class SimpleDebugger implements Debugger {
|
|||||||
|
|
||||||
if (!frame.debugData) return false;
|
if (!frame.debugData) return false;
|
||||||
|
|
||||||
if (instruction.location != null) frame.updateLoc(toCompiled(instruction.location));
|
if (instruction.location != null) frame.updateLoc(ctx.engine.mapToCompiled(instruction.location));
|
||||||
loc = frame.location;
|
loc = frame.location;
|
||||||
isBreakpointable = loc != null && (instruction.breakpoint.shouldStepIn());
|
isBreakpointable = loc != null && (instruction.breakpoint.shouldStepIn());
|
||||||
|
|
||||||
|
@ -12,19 +12,44 @@ import me.topchetoeu.jscript.engine.values.Values;
|
|||||||
import me.topchetoeu.jscript.engine.values.ObjectValue.PlaceholderProto;
|
import me.topchetoeu.jscript.engine.values.ObjectValue.PlaceholderProto;
|
||||||
|
|
||||||
public class EngineException extends RuntimeException {
|
public class EngineException extends RuntimeException {
|
||||||
|
public static class StackElement {
|
||||||
|
public final Location location;
|
||||||
|
public final String function;
|
||||||
|
|
||||||
|
public String toString(Context ctx) {
|
||||||
|
var res = "";
|
||||||
|
var loc = location;
|
||||||
|
|
||||||
|
if (loc != null && ctx != null && ctx.engine != null) loc = ctx.engine.mapToCompiled(loc);
|
||||||
|
|
||||||
|
if (loc != null) res += "at " + loc.toString() + " ";
|
||||||
|
if (function != null && !function.equals("")) res += "in " + function + " ";
|
||||||
|
|
||||||
|
return res.trim();
|
||||||
|
}
|
||||||
|
@Override public String toString() {
|
||||||
|
return toString(null);
|
||||||
|
}
|
||||||
|
|
||||||
|
public StackElement(Location location, String function) {
|
||||||
|
if (function != null) function = function.trim();
|
||||||
|
if (function.equals("")) function = null;
|
||||||
|
|
||||||
|
this.location = location;
|
||||||
|
this.function = function;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public final Object value;
|
public final Object value;
|
||||||
public EngineException cause;
|
public EngineException cause;
|
||||||
public Environment env = null;
|
public Environment env = null;
|
||||||
public Engine engine = null;
|
public Engine engine = null;
|
||||||
public final List<String> stackTrace = new ArrayList<>();
|
public final List<StackElement> stackTrace = new ArrayList<>();
|
||||||
|
|
||||||
public EngineException add(String name, Location location) {
|
public EngineException add(String name, Location location) {
|
||||||
var res = "";
|
var el = new StackElement(location, name);
|
||||||
|
if (el.function == null && el.location == null) return this;
|
||||||
if (location != null) res += "at " + location.toString() + " ";
|
stackTrace.add(el);
|
||||||
if (name != null && !name.equals("")) res += "in " + name + " ";
|
|
||||||
|
|
||||||
this.stackTrace.add(res.trim());
|
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
public EngineException setCause(EngineException cause) {
|
public EngineException setCause(EngineException cause) {
|
||||||
@ -46,7 +71,7 @@ public class EngineException extends RuntimeException {
|
|||||||
ss.append("[Error while stringifying]\n");
|
ss.append("[Error while stringifying]\n");
|
||||||
}
|
}
|
||||||
for (var line : stackTrace) {
|
for (var line : stackTrace) {
|
||||||
ss.append(" ").append(line).append('\n');
|
ss.append(" ").append(line.toString(ctx)).append("\n");
|
||||||
}
|
}
|
||||||
if (cause != null) ss.append("Caused by ").append(cause.toString(ctx)).append('\n');
|
if (cause != null) ss.append("Caused by ").append(cause.toString(ctx)).append('\n');
|
||||||
ss.deleteCharAt(ss.length() - 1);
|
ss.deleteCharAt(ss.length() - 1);
|
||||||
|
Loading…
Reference in New Issue
Block a user