1
0
Fork 0
forked from fun/fun

Updated ./scripts/check_op_includes.py for debugging and some fixes. (0.15.4)

This commit is contained in:
Johannes Findeisen 2025-10-01 00:02:54 +02:00
commit 34a7968d18
4 changed files with 55 additions and 28 deletions

View file

@ -19,7 +19,7 @@ BYTECODE = ROOT / "src" / "bytecode.h"
VM_C = ROOT / "src" / "vm.c"
OP_RE = re.compile(r'\bOP_([A-Z0-9_]+)\b')
INCLUDE_RE = re.compile(r'#include\s+"vm_case_([a-z0-9_]+)\.inc"')
INCLUDE_RE = re.compile(r'#include\s+"vm/(?:[a-z0-9_]+/)?([a-z0-9_]+)\.c"')
def read_text(path: Path) -> str:
try:
@ -43,31 +43,55 @@ def parse_opcodes_from_bytecode(text: str) -> set[str]:
def parse_includes_from_vm(text: str) -> set[str]:
incs = set(m.group(1) for m in INCLUDE_RE.finditer(text))
# Convert include base names back to uppercase opcode tokens heuristically.
mapping = {
"nop":"NOP","halt":"HALT",
"load_const":"LOAD_CONST","load_local":"LOAD_LOCAL","store_local":"STORE_LOCAL",
"load_global":"LOAD_GLOBAL","store_global":"STORE_GLOBAL",
"pop":"POP","dup":"DUP","swap":"SWAP",
"call":"CALL","return":"RETURN","print":"PRINT","jump":"JUMP","jump_if_false":"JUMP_IF_FALSE",
"add":"ADD","sub":"SUB","mul":"MUL","div":"DIV",
"mod":"MOD","lt":"LT","lte":"LTE","gt":"GT","gte":"GTE",
"eq":"EQ","neq":"NEQ","and":"AND","or":"OR","not":"NOT",
"make_array":"MAKE_ARRAY","len":"LEN",
"index_get":"INDEX_GET","index_set":"INDEX_SET",
"arr_push":"ARR_PUSH","arr_pop":"ARR_POP","arr_set":"ARR_SET","arr_insert":"ARR_INSERT","arr_remove":"ARR_REMOVE",
"slice":"SLICE",
"to_number":"TO_NUMBER","to_string":"TO_STRING",
"split":"SPLIT","join":"JOIN","substr":"SUBSTR","find":"FIND",
"enumerate":"ENUMERATE","zip":"ZIP",
"min":"MIN","max":"MAX","clamp":"CLAMP","abs":"ABS","pow":"POW",
"random_seed":"RANDOM_SEED","random_int":"RANDOM_INT",
"make_map":"MAKE_MAP","keys":"KEYS","values":"VALUES","has_key":"HAS_KEY",
"read_file":"READ_FILE","write_file":"WRITE_FILE",
# Drop support includes that are not opcode handlers
support_includes = {"thread_common"}
incs = {name for name in incs if name not in support_includes}
# Map include base names to OP_* tokens.
overrides = {
# core
"nop": "NOP", "halt": "HALT",
"load_const": "LOAD_CONST", "load_local": "LOAD_LOCAL", "store_local": "STORE_LOCAL",
"load_global": "LOAD_GLOBAL", "store_global": "STORE_GLOBAL",
"pop": "POP", "dup": "DUP", "swap": "SWAP",
"call": "CALL", "return": "RETURN", "print": "PRINT",
"jump": "JUMP", "jump_if_false": "JUMP_IF_FALSE",
"line": "LINE",
# arithmetic/logic
"add": "ADD", "sub": "SUB", "mul": "MUL", "div": "DIV", "mod": "MOD",
"lt": "LT", "lte": "LTE", "gt": "GT", "gte": "GTE",
"eq": "EQ", "neq": "NEQ", "and": "AND", "or": "OR", "not": "NOT",
# arrays and slices
"make_array": "MAKE_ARRAY", "len": "LEN",
"index_get": "INDEX_GET", "index_set": "INDEX_SET",
"push": "PUSH", "apop": "APOP", "set": "SET", "insert": "INSERT", "remove": "REMOVE",
"slice": "SLICE",
# conversions and type/meta
"to_number": "TO_NUMBER", "to_string": "TO_STRING",
"cast": "CAST", "typeof": "TYPEOF", "uclamp": "UCLAMP", "sclamp": "SCLAMP",
# strings and iteration helpers
"split": "SPLIT", "join": "JOIN", "substr": "SUBSTR", "find": "FIND",
"enumerate": "ENUMERATE", "zip": "ZIP",
# maps and I/O
"make_map": "MAKE_MAP", "keys": "KEYS", "values": "VALUES", "has_key": "HAS_KEY",
"read_file": "READ_FILE", "write_file": "WRITE_FILE",
# os/env
"env": "ENV", "sleep_ms": "SLEEP_MS",
# math / RNG
"min": "MIN", "max": "MAX", "clamp": "CLAMP", "abs": "ABS", "pow": "POW",
"random_seed": "RANDOM_SEED", "random_int": "RANDOM_INT",
# bitwise and shifts/rotates
"band": "BAND", "bor": "BOR", "bxor": "BXOR", "bnot": "BNOT",
"shl": "SHL", "shr": "SHR",
"rol": "ROTL", "ror": "ROTR",
# threads
"thread_spawn": "THREAD_SPAWN", "thread_join": "THREAD_JOIN",
}
tokens = set()
for inc in incs:
tokens.add(mapping.get(inc, inc.upper()))
tokens.add(overrides.get(inc, inc.upper()))
return tokens
def main() -> int: