124 lines
3.1 KiB
Plaintext
124 lines
3.1 KiB
Plaintext
from stdint import *
|
|
import t, c
|
|
from t import CInt, CExport
|
|
from stdio import printf
|
|
import memhub
|
|
import stdlib
|
|
import sys
|
|
import string
|
|
import ast
|
|
import w32.win32console
|
|
|
|
|
|
# MBuddy arena 大小:1MB
|
|
ARENA_SIZE: t.CDefine = 1048576
|
|
# mpool 内存大小:512KB
|
|
POOL_SIZE: t.CDefine = 524288
|
|
# dump 缓冲区大小:256KB
|
|
DUMP_SIZE: t.CDefine = 262144
|
|
|
|
|
|
def main() -> CInt | CExport:
|
|
w32.win32console.SetConsoleCP(65001)
|
|
w32.win32console.SetConsoleOutputCP(65001)
|
|
|
|
printf("AST Comprehensive Test Start\n")
|
|
|
|
# 初始化全局 MBuddy 内存分配器
|
|
arena: bytes = stdlib.malloc(ARENA_SIZE)
|
|
if arena == None:
|
|
printf("FAIL: arena alloc failed\n")
|
|
return 1
|
|
mbuddy_obj: memhub.MemBuddy | t.CPtr = memhub.MemBuddy(arena, ARENA_SIZE)
|
|
if mbuddy_obj == None:
|
|
printf("FAIL: mbuddy init failed\n")
|
|
return 1
|
|
|
|
sys._mbuddy = mbuddy_obj
|
|
ast._mbuddy = mbuddy_obj
|
|
|
|
# 为 ast 解析器创建 mpool
|
|
pool_mem: bytes = stdlib.malloc(POOL_SIZE)
|
|
if pool_mem == None:
|
|
printf("FAIL: malloc for pool failed\n")
|
|
return 1
|
|
pool: memhub.MemPool | t.CPtr = memhub.MemPool(pool_mem, POOL_SIZE)
|
|
if pool == None:
|
|
printf("FAIL: memhub.MemPool init failed\n")
|
|
return 1
|
|
|
|
# dump 缓冲区(独立分配)
|
|
dump_mem: bytes = stdlib.malloc(DUMP_SIZE)
|
|
if dump_mem == None:
|
|
printf("FAIL: malloc for dump failed\n")
|
|
return 1
|
|
dump_buf: t.CChar | t.CPtr = t.CChar(dump_mem, t.CPtr)
|
|
|
|
# 综合测试源码:覆盖 CPython 主要语法
|
|
src: str = """x = 1
|
|
y = 2
|
|
z = x + y
|
|
a = x - y
|
|
b = x * y
|
|
c = x / y
|
|
d = x == y
|
|
e = x < y
|
|
f = x > y
|
|
g = x and y
|
|
h = x or y
|
|
i = not x
|
|
def foo(a, b):
|
|
return a + b
|
|
result = foo(x, y)
|
|
if x > 0:
|
|
print(x)
|
|
else:
|
|
print(y)
|
|
for i in range(10):
|
|
print(i)
|
|
while x > 0:
|
|
x = x - 1
|
|
class Point:
|
|
pass
|
|
"""
|
|
|
|
printf("Parsing comprehensive source...\n")
|
|
|
|
# 解析(临时插桩:拆分 ast.parse 各阶段,定位崩溃点,定位后恢复)
|
|
ast._init_tables(pool)
|
|
printf("DBG1 init_tables done\n")
|
|
lx_dbg: t.CPtr = ast.new_lexer(pool)
|
|
if lx_dbg == None:
|
|
printf("FAIL: new_lexer returned None\n")
|
|
stdlib.free(pool_mem)
|
|
stdlib.free(dump_mem)
|
|
return 1
|
|
printf("DBG2 new_lexer done\n")
|
|
ast._lexer_init(lx_dbg, src, pool)
|
|
printf("DBG3 lexer_init done\n")
|
|
tokens_dbg: t.CPtr = ast.tokenize(lx_dbg)
|
|
if tokens_dbg == None:
|
|
printf("FAIL: tokenize returned None\n")
|
|
stdlib.free(pool_mem)
|
|
stdlib.free(dump_mem)
|
|
return 1
|
|
printf("DBG4 tokenize done\n")
|
|
tree: ast.AST | t.CPtr = ast.parse_tokens(pool, tokens_dbg)
|
|
if tree == None:
|
|
printf("FAIL: parse returned None\n")
|
|
stdlib.free(pool_mem)
|
|
stdlib.free(dump_mem)
|
|
return 1
|
|
|
|
printf("PASS: parse succeeded\n")
|
|
|
|
# dump AST
|
|
printf("Calling ast.dump...\n")
|
|
ast.dump(tree, dump_buf, DUMP_SIZE)
|
|
printf("ast.dump returned, now printing buffer...\n")
|
|
printf("=== AST DUMP ===\n%s\n=== END ===\n", dump_buf)
|
|
|
|
stdlib.free(pool_mem)
|
|
stdlib.free(dump_mem)
|
|
return 0
|