全部整理上传
This commit is contained in:
1 parent
f2b33f5e9b
commit
593332636f
28 files changed
+5828
-675
No files matched your search
@@ -74,8 +74,12 @@ class AssignGenMixin:
|
||||
# 4. Call — 如 t.CUnsignedLong(-11) → 取第一个参数
|
||||
# 5. UnaryOp(USub/UAdd/Invert) — 如 -11
|
||||
# ============================================================
|
||||
def extract_cdefine_int_value(self, val_node: ast.AST | t.CPtr) -> int:
|
||||
"""从值节点提取整数常量(支持 Constant/BinOp/Name/Call/UnaryOp)"""
|
||||
def extract_cdefine_int_value(self, val_node: ast.AST | t.CPtr) -> t.CInt64T:
|
||||
"""从值节点提取整数常量(支持 Constant/BinOp/Name/Call/UnaryOp)
|
||||
|
||||
64 位返回:大整数 CDefine(如 sys.maxsize=9223372036854775807)
|
||||
必须全精度提取,否则 int(32 位) 截断成 -1(SysLibTest maxsize FAIL 根因)。
|
||||
"""
|
||||
if val_node is None:
|
||||
return 0
|
||||
k: int = val_node.kind()
|
||||
@@ -83,6 +87,10 @@ class AssignGenMixin:
|
||||
# Case 1: Constant(INT) — 如 0x0002
|
||||
if k == ast.ASTKind.Constant:
|
||||
cn: ast.Constant | t.CPtr = (ast.Constant | t.CPtr)(val_node)
|
||||
# True/False 布尔常量 → 1/0(对齐 TPC:bool 在 CDefine 语境按整数处理,
|
||||
# 如 SHADOW_ENABLED: t.CDefine = False)
|
||||
if cn.const_kind == ast.CONST_BOOL:
|
||||
return 1 if cn.int_val != 0 else 0
|
||||
if cn.const_kind != ast.CONST_INT:
|
||||
# 非 INT 常量:直接报错终止(fail-fast)
|
||||
HandlesType.fatal_error(val_node, "CDefine 值提取失败:无法从表达式解析编译期常量", "TypeError")
|
||||
@@ -91,8 +99,8 @@ class AssignGenMixin:
|
||||
# Case 2: BinOp — 如 FOREGROUND_RED | FOREGROUND_GREEN、(1 << ZDEFLATE_WINDOW_BITS)
|
||||
if k == ast.ASTKind.BinOp:
|
||||
bop: ast.BinOp | t.CPtr = (ast.BinOp | t.CPtr)(val_node)
|
||||
left_val: int = self.extract_cdefine_int_value(bop.left)
|
||||
right_val: int = self.extract_cdefine_int_value(bop.right)
|
||||
left_val: t.CInt64T = self.extract_cdefine_int_value(bop.left)
|
||||
right_val: t.CInt64T = self.extract_cdefine_int_value(bop.right)
|
||||
if bop.op == ast.OpKind.BitOr:
|
||||
return left_val | right_val
|
||||
if bop.op == ast.OpKind.BitAnd:
|
||||
@@ -109,6 +117,9 @@ class AssignGenMixin:
|
||||
return left_val - right_val
|
||||
if bop.op == ast.OpKind.Mult:
|
||||
return left_val * right_val
|
||||
if bop.op == ast.OpKind.Div:
|
||||
# 整数常量除法:与 FloorDiv 一致(对齐 TPC ConstEvaluator L354-355)
|
||||
return left_val // right_val
|
||||
if bop.op == ast.OpKind.FloorDiv:
|
||||
return left_val // right_val
|
||||
if bop.op == ast.OpKind.Mod:
|
||||
@@ -116,11 +127,16 @@ class AssignGenMixin:
|
||||
# 未知 BinOp 运算符:直接报错终止(fail-fast)
|
||||
HandlesType.fatal_error(val_node, "CDefine 值提取失败:无法从表达式解析编译期常量", "TypeError")
|
||||
|
||||
# Case 3: Name — 引用已注册的 CDefine 常量
|
||||
# Case 3: Name — 引用已注册的 CDefine 常量,或 True/False 布尔字面量
|
||||
if k == ast.ASTKind.Name:
|
||||
nm: ast.Name | t.CPtr = (ast.Name | t.CPtr)(val_node)
|
||||
if nm.id is not None:
|
||||
looked_up: int = HandlesType.lookup_cdefine_constant(nm.id)
|
||||
# True/False 布尔字面量 → 1/0(对齐 TPC:bool 在 CDefine 语境按整数处理)
|
||||
if string.strcmp(nm.id, "True") == 0:
|
||||
return 1
|
||||
if string.strcmp(nm.id, "False") == 0:
|
||||
return 0
|
||||
looked_up: t.CInt64T = HandlesType.lookup_cdefine_constant(nm.id)
|
||||
if HandlesType.is_cdefine_found() != 0:
|
||||
return looked_up
|
||||
# 引用未注册:直接报错终止(fail-fast)
|
||||
@@ -134,7 +150,7 @@ class AssignGenMixin:
|
||||
cl_args_list: list[ast.AST | t.CPtr] | t.CPtr = cl.args
|
||||
if cl_args_list is not None and len(cl_args_list) > 0:
|
||||
first_arg: ast.AST | t.CPtr = cl_args_list.get(0)
|
||||
arg_val: int = self.extract_cdefine_int_value(first_arg)
|
||||
arg_val: t.CInt64T = self.extract_cdefine_int_value(first_arg)
|
||||
return arg_val
|
||||
# Call 无参数:直接报错终止(fail-fast)
|
||||
HandlesType.fatal_error(val_node, "CDefine 值提取失败:无法从表达式解析编译期常量", "TypeError")
|
||||
@@ -142,7 +158,7 @@ class AssignGenMixin:
|
||||
# Case 5: UnaryOp — 如 -11
|
||||
if k == ast.ASTKind.UnaryOp:
|
||||
uop: ast.UnaryOp | t.CPtr = (ast.UnaryOp | t.CPtr)(val_node)
|
||||
operand_val: int = self.extract_cdefine_int_value(uop.operand)
|
||||
operand_val: t.CInt64T = self.extract_cdefine_int_value(uop.operand)
|
||||
if uop.op == ast.OpKind.USub:
|
||||
return -operand_val
|
||||
if uop.op == ast.OpKind.UAdd:
|
||||
@@ -154,6 +170,9 @@ class AssignGenMixin:
|
||||
|
||||
# 未知节点类型:直接报错终止(fail-fast)
|
||||
HandlesType.fatal_error(val_node, "CDefine 值提取失败:无法从表达式解析编译期常量", "TypeError")
|
||||
# 追加89 块设计:fatal_error 调用后补显式 return(运行时不可达,
|
||||
# 保证函数末尾块被正确 terminated,不做 noreturn 函数名白名单)
|
||||
return 0
|
||||
|
||||
# ============================================================
|
||||
# _register_cdefine_from_value - 注册 CDefine 常量(浮点/整数自动识别)
|
||||
@@ -167,6 +186,17 @@ class AssignGenMixin:
|
||||
"""注册 CDefine 常量(浮点字面量 → register_cdefine_double,否则整数)"""
|
||||
if pool is None or name is None:
|
||||
return
|
||||
# Call 包装的常量:如 PI: t.CDefine = float(3.14159...) /
|
||||
# t.CFloat64T(2.5) / t.CDouble(1.0)。取第一个参数作为真实值节点,
|
||||
# 再按 Constant 分支处理(浮点 → register_cdefine_double)。
|
||||
if val_node is not None and val_node.kind() == ast.ASTKind.Call:
|
||||
cl_cd: ast.Call | t.CPtr = (ast.Call | t.CPtr)(val_node)
|
||||
if cl_cd is not None and cl_cd.args is not None:
|
||||
cl_args_cd: list[ast.AST | t.CPtr] | t.CPtr = cl_cd.args
|
||||
if cl_args_cd.__len__() > 0:
|
||||
first_arg_cd: ast.AST | t.CPtr = cl_args_cd.get(0)
|
||||
if first_arg_cd is not None and first_arg_cd.kind() == ast.ASTKind.Constant:
|
||||
val_node = first_arg_cd
|
||||
if val_node is not None and val_node.kind() == ast.ASTKind.Constant:
|
||||
cn_fp: ast.Constant | t.CPtr = (ast.Constant | t.CPtr)(val_node)
|
||||
if cn_fp.const_kind == ast.CONST_STR:
|
||||
@@ -191,7 +221,7 @@ class AssignGenMixin:
|
||||
# CDefine 声明缺少值节点:直接报错终止(fail-fast)
|
||||
HandlesType.fatal_error(None, f"CDefine 值提取失败:'{name}' 缺少初始值", "TypeError")
|
||||
return
|
||||
val_fp: int = self.extract_cdefine_int_value(val_node)
|
||||
val_fp: t.CInt64T = self.extract_cdefine_int_value(val_node)
|
||||
HandlesType.register_cdefine_constant(pool, name, val_fp)
|
||||
|
||||
# ============================================================
|
||||
|
||||
Reference in new issue
Block a user