Method dispatch axis: map id -> body via Runner::run switch
Recovers how a script method id maps to its implementation, the foundation for body-level normalisation. Each CMC_*_Runner::run is a switch(id) (vtable slot 17); every case is the method body — inline (MSVC6) or a tail-call to a separate show()/load() (MSVC8). The extractor parses the jump table at the disassembly level (Ghidra's decompiler jump-table recovery silently dropped the big runners), fingerprints each case by its ordered CALL anchors (Class::method / vtbl+0xNN), and expands thin wrappers one level so MSVC8 lines up with MSVC6. Validated on the golden pair: Animo SHOW..RESUME (id 1-4) yield identical leaves (getAnimo + vtbl+0xa0/0xa4/0x4c/0x50) across both compilers. Coverage 30/32 runners; Piklib 475 / BlooMoo 619 dispatch rows. - extract_engine_surface.py: extract_method_dispatch (schema_version -> 4) - snapshots regenerated with the method_dispatch axis - ams: Snapshot.method_dispatch; diff axis keyed (owner,id) on [impl,calls] with method-name join; render METHOD BODIES section; cli --only dispatch; owner filter - UI: "Ciała metod" diff axis + browse tab - tests: body-change unit + cross-compiler vtbl assertion -> 29/29 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
10
README.md
10
README.md
@@ -35,6 +35,7 @@ działa na MSVC6 (Piklib) i MSVC8 (BlooMoo) mimo różnego kodu wynikowego.
|
||||
| Eventy | `CMC_*::getBehavioursList`: lista literałów `CXString` | ✅ (lista per klasa, bez dziedziczenia) |
|
||||
| Pola (skryptowe) | ctory `CMC_*`: literały czytane przez `CMElement::getProperty<T>Value` → nazwa + typ pola (FPS, PRELOAD, VISIBLE…) | ✅ (+ `field_inheritance`) |
|
||||
| Layout C++ (bonus) | ctory `CMC_*`: store'y `this+offset` przez P-code (rozmyte, `is_vtable`) | ✅ pod `struct_layout` |
|
||||
| Ciała metod | `CMC_*_Runner::run`: `switch(id)` (vtable slot 17) → per case kotwice CALL (`Klasa::metoda` / `vtbl+0xNN`), rozwinięcie wrapperów | ✅ pod `method_dispatch` (id→`impl_addr`+`calls`) |
|
||||
|
||||
## Uruchomienie ekstraktora
|
||||
|
||||
@@ -101,10 +102,13 @@ czysty Python. Snapshot dostaje doklejony blok `binary.acquisition` (źródło,
|
||||
|
||||
```bash
|
||||
python -m ams OLD.snapshot.json NEW.snapshot.json [--owner CMC_Animo] \
|
||||
[--only types,methods,events,fields,layout] [--json]
|
||||
[--only types,methods,events,fields,layout,dispatch] [--json]
|
||||
```
|
||||
Porównuje dwa snapshoty po 4 osiach (added/removed/changed) + wykrywa metody przeniesione
|
||||
w hierarchii. Oś `struct_layout` jest sensowna tylko między wersjami tego samego kompilatora.
|
||||
Porównuje dwa snapshoty po osiach (added/removed/changed) + wykrywa metody przeniesione
|
||||
w hierarchii. Oś `dispatch` (ciała metod, klucz `owner`+`id`) diffuje fingerprint wywołań
|
||||
każdej metody — wykrywa **zmiany ciała** między wersjami; jak `struct_layout`, najczystsza
|
||||
między wersjami tego samego kompilatora (cross-compiler proste metody i tak się zgadzają,
|
||||
np. Animo `SHOW`→`vtbl+0xa0` na MSVC6 i MSVC8).
|
||||
|
||||
## Backend (FastAPI + katalog)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user