passes: implement control-flow pass (4 schemes + rotation)
FlowPass rebuilds one method per scheme picked from FlowConfig: state-spread (dense tableswitch dispatcher), computed-switch (sparse lookupswitch over a counter local), butterfly (branch inversion), exception-goto (dispatcher under try with a dead catch-all), plus opaque goto-splices inside every method and StackMapTable recomputation afterwards. Now in standard_pipeline (between constants and noise); --no-flow is an honest off-flag. Acceptance is real JVM, not shapes: per-scheme verify, rotation spread, calc-prints-45 execution, paranoid smoke on lorep-1.1.0 (131 methods rebuilt, no new failures over standard). Two verifier rules learned the hard way are now construction invariants: no inserted mark shares a bytecode offset with a foreign one (nop pads), and no frameless gap follows a terminal (dead blocks are opaque-entered and throw). Also fixes a latent frame-emitter bug the pass exposed: wide stack values were written as slot pairs ([Double, Top]) while javac writes one entry ([Double]); HotSpot rejects the pair. Stacks now collapse like locals (emit::stack_vars), with a regression test in classfile/tests/frames.rs.
This commit is contained in:
parent
39178420e4
commit
2172206e83
15 changed files with 1360 additions and 103 deletions
10
README.md
10
README.md
|
|
@ -29,7 +29,7 @@
|
|||
| пассы: rename, resources, strings, constants, noise, debug | ✅ |
|
||||
| верификация: red-паттерны, `java -Xverify:all`, метрики | ✅ |
|
||||
| CLI (`obfuscate` / `analyze` / `patterns`) | ✅ |
|
||||
| пасс flow (кадры готовы, схем флаттенинга пока нет) | 🚧 |
|
||||
| пасс flow (кадры готовы, 4 схемы: state-spread, computed-switch, butterfly, exception-goto) | ✅ |
|
||||
|
||||
Подробности в [`docs/architecture.md`](docs/architecture.md), план в [`todo.md`](todo.md).
|
||||
|
||||
|
|
@ -50,12 +50,8 @@ cargo run -p noxis -- patterns --input output.jar
|
|||
```
|
||||
|
||||
`obfuscate` по умолчанию включает все готовые пассы. Флаги `--no-rename`,
|
||||
`--no-strings`, `--no-constants`, `--no-noise`, `--no-resources`, `--no-debug-info`
|
||||
выключают их по отдельности. `--no-flow` честно падает с ошибкой: пасса пока нет.
|
||||
|
||||
Одно `cargo build` уже гоняет проверку структуры кода: `.rs`-файл длиннее
|
||||
250 строк или директория с больше чем 4 `.rs`-файлами ломают сборку.
|
||||
Документация (`docs/**`) под это правило не попадает. Правила в [`docs/README.md`](docs/README.md).
|
||||
`--no-strings`, `--no-constants`, `--no-noise`, `--no-resources`, `--no-debug-info`,
|
||||
`--no-flow` выключают их по отдельности.
|
||||
|
||||
## Структура
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue