diff --git a/gradle.properties b/gradle.properties index 3f6c4bd..9fe9849 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,4 +1,4 @@ project_group = me.topchetoeu project_name = jscript -project_version = 0.9.25-beta +project_version = 0.9.26-beta main_class = me.topchetoeu.jscript.utils.JScriptRepl diff --git a/src/java/me/topchetoeu/jscript/common/mapping/FunctionMap.java b/src/java/me/topchetoeu/jscript/common/mapping/FunctionMap.java index cfcc875..b6b992a 100644 --- a/src/java/me/topchetoeu/jscript/common/mapping/FunctionMap.java +++ b/src/java/me/topchetoeu/jscript/common/mapping/FunctionMap.java @@ -104,7 +104,9 @@ public class FunctionMap { var res = new ArrayList(candidates.size()); for (var candidate : candidates.entrySet()) { - res.add(candidate.getValue().ceiling(new Location(line, column, candidate.getKey()))); + var val = correctBreakpoint(new Location(line, column, candidate.getKey())); + if (val == null) continue; + res.add(val); } return res; diff --git a/src/java/me/topchetoeu/jscript/utils/debug/SimpleDebugger.java b/src/java/me/topchetoeu/jscript/utils/debug/SimpleDebugger.java index 6989ad1..74647d9 100644 --- a/src/java/me/topchetoeu/jscript/utils/debug/SimpleDebugger.java +++ b/src/java/me/topchetoeu/jscript/utils/debug/SimpleDebugger.java @@ -86,7 +86,9 @@ public class SimpleDebugger implements Debugger { public final String condition; public final Pattern pattern; public final int line, start; - public final WeakHashMap> resolvedLocations = new WeakHashMap<>(); + public final long locNum; + public final HashMap resolvedLocations = new HashMap<>(); + public final HashMap resolvedDistances = new HashMap<>(); public Breakpoint(int id, Pattern pattern, int line, int start, String condition) { this.id = id; @@ -94,18 +96,28 @@ public class SimpleDebugger implements Debugger { this.pattern = pattern; this.line = line; this.start = start; + this.locNum = start | ((long)line << 32); if (condition != null && condition.trim().equals("")) condition = null; } // TODO: Figure out how to unload a breakpoint + // TODO: Do location resolution with function boundaries public void addFunc(FunctionBody body, FunctionMap map) { try { for (var loc : map.correctBreakpoint(pattern, line, start)) { - if (!resolvedLocations.containsKey(body)) resolvedLocations.put(body, new HashSet<>()); - var set = resolvedLocations.get(body); - set.add(loc); + var currNum = loc.start() + ((long)loc.line() << 32); + long currDist = 0; + if (currNum > locNum) currDist = currNum - locNum; + else currDist = locNum - currNum; + if ( currDist > resolvedDistances.getOrDefault(loc.filename(), Long.MAX_VALUE)) continue; + + resolvedLocations.put(loc.filename(), loc); + resolvedDistances.put(loc.filename(), currDist); + } + + for (var loc : resolvedLocations.values()) { ws.send(new V8Event("Debugger.breakpointResolved", new JSONMap() .set("breakpointId", id) .set("location", serializeLocation(loc)) @@ -207,7 +219,7 @@ public class SimpleDebugger implements Debugger { private WeakHashMap contexts = new WeakHashMap<>(); private WeakHashMap mappings = new WeakHashMap<>(); - private WeakHashMap> bpLocs = new WeakHashMap<>(); + private HashMap> bpLocs = new HashMap<>(); private HashMap idToBreakpoint = new HashMap<>(); @@ -297,13 +309,11 @@ public class SimpleDebugger implements Debugger { bpLocs.clear(); for (var bp : idToBreakpoint.values()) { - for (var el : bp.resolvedLocations.entrySet()) { - if (!bpLocs.containsKey(el.getKey())) bpLocs.put(el.getKey(), new HashMap<>()); - var map = bpLocs.get(el.getKey()); + for (var loc : bp.resolvedLocations.values()) { + bpLocs.putIfAbsent(loc, new HashSet<>()); + var set = bpLocs.get(loc); - for (var loc : el.getValue()) { - map.put(loc, bp); - } + set.add(bp); } } } @@ -720,16 +730,15 @@ public class SimpleDebugger implements Debugger { var bpt = new Breakpoint(nextId(), regex, line, col, cond); idToBreakpoint.put(bpt.id, bpt); - var locs = new JSONList(); for (var el : mappings.entrySet()) { bpt.addFunc(el.getKey(), el.getValue()); } - for (var el : bpt.resolvedLocations.values()) { - for (var loc : el) { - locs.add(serializeLocation(loc)); - } + var locs = new JSONList(); + + for (var loc : bpt.resolvedLocations.values()) { + locs.add(serializeLocation(loc)); } ws.send(msg.respond(new JSONMap() @@ -969,10 +978,11 @@ public class SimpleDebugger implements Debugger { ) { pauseDebug(ctx, null); } - else if (isBreakpointable && bpLocs.getOrDefault(cf.function.body, new HashMap<>()).containsKey(loc)) { - var bp = bpLocs.get(cf.function.body).get(loc); - var ok = bp.condition == null ? true : Values.toBoolean(run(currFrame, bp.condition).result); - if (ok) pauseDebug(ctx, bp); + else if (isBreakpointable && bpLocs.containsKey(loc)) { + for (var bp : bpLocs.get(loc)) { + var ok = bp.condition == null ? true : Values.toBoolean(run(currFrame, bp.condition).result); + if (ok) pauseDebug(ctx, bp); + } } // else if (isBreakpointable && tmpBreakpts.remove(loc)) pauseDebug(ctx, null); else if (isBreakpointable && pendingPause) {