Resolve identifiers to direct indices during compilation instead of doing runtime wcsicmp string scans in lookup_identifier(). This adds new opcodes (OP_local, OP_assign_local, OP_set_local, OP_step_local, OP_incc_local, OP_local_prop, OP_assign_local_prop, OP_set_local_prop) that access local variables, function arguments, and class properties by index, eliminating the linear string comparison overhead for the most common cases. This mirrors jscript's OP_local / bind_local() optimization (dlls/jscript/compile.c) and addresses the FIXME in lookup_identifier() noting that class property access should be bound at compile time. Names that cannot be resolved at compile time (globals, dynamic vars, host objects) continue to use the existing string-based path. It's still 10x slower compared to windows but I have another related MR coming for that and it's related to the loop Windows ``` Local vars: 156.3 ms Arguments: 156.3 ms Class props: 390.6 ms Iterations: 1,000,000 ``` | Phase | Local vars | Arguments | Class props | |-------|-----------|-----------|-------------| | Before (baseline) | 10,200 ms | 6,700 ms | 6,710 ms | | `OP_local` | 5,130 ms | 2,035 ms | 5,920 ms | 2.0× / 3.3× | | `OP_assign_local` | 1,880 ms | 1,125 ms | 5,000 ms | 5.4× / 6.0× | | `OP_step_local`, `OP_incc_local` | 960 ms | 968 ms | 4,830 ms | **10.6× / 6.9× | | `OP_local_prop`, `OP_assign_local_prop` | 968 ms | 972 ms | 968 ms | **10.5× / 6.9× | -- v3: vbscript: Bind global-scope Dim variables at compile time. https://gitlab.winehq.org/wine/wine/-/merge_requests/10515