java-topology/docs/tickets/diagrams/0003-module-topo-deque.dot
russell@unturf.com db29a08762 undefect. CWE-407 — 92 sites, 42 ecosystems
B&W print-friendly diagrams + tinkerpop-0001 + wave-3 proof sections.
Squash of 94 local commits onto remote master.
2026-03-26 19:48:18 -04:00

60 lines
2.9 KiB
Text

// Diagram: ModuleHashesBuilder$TopoSorter defect (ticket 0003)
// Shows the Deque.contains() pattern in java.base and its scope.
//
// Render: dot -Tsvg 0003-module-topo-deque.dot -o 0003-module-topo-deque.svg
digraph module_topo {
graph [
label="ModuleHashesBuilder$TopoSorter: Deque.contains() in java.base\n(Same pattern as 0001, different module, different layer)"
labelloc=t fontsize=13 fontname="monospace" bgcolor="#f8f8f8" pad=0.6
rankdir=TB
]
node [fontname="monospace" fontsize=10]
edge [fontname="monospace" fontsize=9]
// ── Call chain ────────────────────────────────────────────────────────────
jlink [
label="jlink\n(custom runtime image builder)"
shape=box style="filled,rounded" fillcolor="#dde8ff"
]
mhb [
label="ModuleHashesBuilder.computeHashes()\njava.base/jdk.internal.module"
shape=box style="filled,rounded" fillcolor="#dde8ff"
]
topo [
label="new TopoSorter(graph)\n→ sort() → visit()"
shape=box style="filled,rounded" fillcolor="#fff0cc"
]
// ── The defect ────────────────────────────────────────────────────────────
defect [
label="visit(node, visited, stack)\n\nDeque.contains(node) ← DEFECT\nbytecode instr 57:\ninvokeinterface Deque.contains:(Object)Z\n\nArrayDeque.contains() = O(N) linear scan"
shape=box style=filled fillcolor="#ffcccc" penwidth=3
]
fix [
label="FIX: HashSet<T> onStack\nonStack.contains(node) ← O(1)\nAdd on push, remove on pop"
shape=box style="filled,rounded" fillcolor="#ccffcc" penwidth=2
]
// ── Module scope ──────────────────────────────────────────────────────────
scope [
label="Scope: java.base\nPresent in every JDK + JRE\nLoaded by every JVM process"
shape=ellipse style=filled fillcolor="#ffeeaa" penwidth=2
]
// ── Comparison to 0001 ────────────────────────────────────────────────────
cmp [
label="0001: GraphUtils$Tarjan (jdk.compiler)\n stack.contains(n) → n.active\n\n0003: ModuleHashesBuilder$TopoSorter (java.base)\n stack.contains(n) → onStack.contains(n)\n\nSame pattern. Different modules. Independent fixes."
shape=note style=filled fillcolor="#fffff0"
]
jlink -> mhb
mhb -> topo
topo -> defect
defect -> fix [label="fix" style=dashed color="#006600"]
defect -> scope [style=dotted]
defect -> cmp [style=dotted]
}