"main" RUNNABLE cpu=3186391ms
at org.unlaxer.StringSource.<init>(StringSource.java:109)
at org.unlaxer.StringSource.peek(StringSource.java:290)
at org.unlaxer.parser.elementary.WordParser.getToken(WordParser.java:77)
... (Choice/Chain の深いバックトラック) ...
at org.unlaxer.tinyexpression.p4.P4PreferredAstMapper.parseViaMapperCompat(P4PreferredAstMapper.java:918)
at org.unlaxer.tinyexpression.p4.P4PreferredAstMapper.parseByAstSimpleName(P4PreferredAstMapper.java:101)
at org.unlaxer.tinyexpression.evaluator.ast.GeneratedAstRuntimeProbe.tryMapAstOnce(GeneratedAstRuntimeProbe.java:109)
at org.unlaxer.tinyexpression.evaluator.ast.AstEvaluatorCalculator.validateFormulaParseable(AstEvaluatorCalculator.java:801)
at org.unlaxer.tinyexpression.evaluator.ast.AstEvaluatorCalculator.<init>(AstEvaluatorCalculator.java:85)
at org.unlaxer.tinyexpression.evaluator.ast.AstEvaluatorCalculatorTest.preConstructedCalculator(AstEvaluatorCalculatorTest.java:18)
at org.unlaxer.tinyexpression.CalculatorImplTest.compileOnly(CalculatorImplTest.java:326)
症状
mvn test(フルスイート)がCalculatorImplTest.compileOnly→AstEvaluatorCalculatorTest(preConstructedCalculator)で CPU 100% のまま 50 分以上停止 する。テストの失敗ではなくパースが終わらないため、CI のFull verifyジョブはこのままでは永久に通らない。証拠 (2026-06-12 計測)
スレッドダンプ(53分経過時点、cpu=3,186秒 ≒ 経過時間と同じ = 完全 CPU バウンド):
切り分け結果
-Dtest=AstEvaluatorCalculatorTest単体で9分タイムアウト) → 3.0.3/3.0.4 リグレッションではない既存問題対処案
<forkedProcessTimeoutInSeconds>またはテスト側@Test(timeout=...)を設定し、ハング→明示的失敗に変える(CI が 6h 押し黙る事故の防止)parseViaMapperCompatに渡る式と grammar の組合せで指数的バックトラックが起きている。CalculatorImplTest.compileOnlyが流す式を特定し最小再現を作る(handoff: tinyexpression × unlaxer 3.0.2 再スタート — 状態整理と次ステップ #12 の推奨手順どおり)StringSource.peek→new StringSource(コードポイント配列の都度コピー)なのでメモ化/packrat があれば緩和される可能性。ただしまず文法側の左因子化で解決するか確認すべき関連