summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--build-aux/measurestack/analyze.py25
1 files changed, 16 insertions, 9 deletions
diff --git a/build-aux/measurestack/analyze.py b/build-aux/measurestack/analyze.py
index 2485970..3996b3b 100644
--- a/build-aux/measurestack/analyze.py
+++ b/build-aux/measurestack/analyze.py
@@ -9,6 +9,9 @@ import typing
from . import vcg
+# Whether to print "//dbg-nstatic:" lines that trace nstatic() execution
+dbg_nstatic = False
+
# pylint: disable=unused-variable
__all__ = [
"BaseName",
@@ -337,8 +340,6 @@ def analyze(
dynamic: set[QName] = set()
included_funcs: set[QName] = set()
- dbg = False
-
track_inclusion: bool = True
skipmodels = app.skipmodels()
@@ -351,16 +352,15 @@ def analyze(
_nstatic_cache: dict[QName, int] = {}
def _nstatic(chain: list[QName], funcname: QName) -> tuple[int, int]:
- nonlocal dbg
nonlocal track_inclusion
assert funcname in graphdata.graph
def putdbg(msg: str) -> None:
- print(f"//dbg: {'- '*len(chain)}{msg}")
+ print(f"//dbg-nstatic: {'- '*len(chain)}{msg}")
node = graphdata.graph[funcname]
- if dbg:
+ if dbg_nstatic:
putdbg(f"{funcname}\t{node.nstatic}")
if node.usage_kind == "dynamic" or node.ndynamic > 0:
dynamic.add(funcname)
@@ -383,12 +383,12 @@ def analyze(
if skipmodel:
skip, _ = skipmodel(chain, call_orig_qname)
if skip:
- if dbg:
+ if dbg_nstatic:
putdbg(f"{call_orig_qname}\tskip missing")
continue
if not call_missing_ok:
missing.add(call_orig_qname)
- if dbg:
+ if dbg_nstatic:
putdbg(f"{call_orig_qname}\tmissing")
continue
@@ -397,19 +397,26 @@ def analyze(
skip, skip_nchain = skipmodel(chain, call_qname)
max_call_nchain = max(max_call_nchain, skip_nchain)
if skip:
- if dbg:
+ if dbg_nstatic:
putdbg(f"{call_qname}\tskip")
continue
# 3. Call
if skip_nchain == 0 and call_qname in _nstatic_cache:
- max_call_nstatic = max(max_call_nstatic, _nstatic_cache[call_qname])
+ call_nstatic = _nstatic_cache[call_qname]
+ if dbg_nstatic:
+ putdbg(f"{call_qname}\ttotal={call_nstatic} (cache-read)")
+ max_call_nstatic = max(max_call_nstatic, call_nstatic)
else:
call_nstatic, call_nchain = _nstatic(chain, call_qname)
max_call_nstatic = max(max_call_nstatic, call_nstatic)
max_call_nchain = max(max_call_nchain, call_nchain)
if skip_nchain == 0 and call_nchain == 0:
+ if dbg_nstatic:
+ putdbg(f"{call_qname}\ttotal={call_nstatic} (cache-write)")
_nstatic_cache[call_qname] = call_nstatic
+ elif dbg_nstatic:
+ putdbg(f"{call_qname}\ttotal={call_nstatic} (do-not-cache)")
chain.pop()
return node.nstatic + max_call_nstatic, max(0, max_call_nchain - 1)