- Converter: def/return/global/nonlocal, class (inheritance, property, staticmethod, classmethod), lambda, *args/**kwargs and call-site unpacking. Unsupported dunder methods, generators and unknown decorators are still refused - Player: closures, super(), instances that survive save/load, isinstance, hasattr/getattr/setattr, map/filter/sorted(key=), recursion limit - audit_ir accepts calls to names, classes and methods the game defines itself; unknown renpy.* calls still block the import. Volume/pan/pause/replay calls are accepted as presentation-only no-ops; build.* settings are skipped - Tests: IR fixture compiled from tests/fixtures/classes.py (tests/make_ir.py) and run in the interpreter; converter tests updated Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
18 lines
502 B
Python
18 lines
502 B
Python
"""Compile a Python file to PGVN IR JSON: python -m tests.make_ir SOURCE.py OUT.json"""
|
|
import json
|
|
import sys
|
|
from pathlib import Path
|
|
|
|
from app import pgvn
|
|
from app.converter import pyexpr
|
|
|
|
|
|
def main(source: Path, out: Path) -> None:
|
|
code = pyexpr.parse_stmts(source.read_text(encoding="utf-8"))
|
|
pgvn.statements(code)
|
|
out.write_text(json.dumps(code, ensure_ascii=False, separators=(",", ":")), encoding="utf-8")
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main(Path(sys.argv[1]), Path(sys.argv[2]))
|