fix(type): CDefine 编译期常量表达式补齐二元运算符
zdef.vp 中 ZDEFLATE_WINDOW_SIZE = (1 << ZDEFLATE_WINDOW_BITS) 是 LShift 表达式,extract_cdefine_int_value 的 BinOp 分支原先只支持 |/&/+/-,被 fail-fast 误杀。对齐 TPC ConstEvaluator 补齐 BitXor/LShift/RShift/Mult/FloorDiv/Mod
This commit is contained in:
1 parent
64195f183e
commit
a56fc6badc
1 file changed
+13
-1
@@ -88,7 +88,7 @@ class AssignGenMixin:
|
||||
HandlesType.fatal_error(val_node, "CDefine 值提取失败:无法从表达式解析编译期常量", "TypeError")
|
||||
return cn.int_val
|
||||
|
||||
# Case 2: BinOp — 如 FOREGROUND_RED | FOREGROUND_GREEN
|
||||
# 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)
|
||||
@@ -97,10 +97,22 @@ class AssignGenMixin:
|
||||
return left_val | right_val
|
||||
if bop.op == ast.OpKind.BitAnd:
|
||||
return left_val & right_val
|
||||
if bop.op == ast.OpKind.BitXor:
|
||||
return left_val ^ right_val
|
||||
if bop.op == ast.OpKind.LShift:
|
||||
return left_val << right_val
|
||||
if bop.op == ast.OpKind.RShift:
|
||||
return left_val >> right_val
|
||||
if bop.op == ast.OpKind.Add:
|
||||
return left_val + right_val
|
||||
if bop.op == ast.OpKind.Sub:
|
||||
return left_val - right_val
|
||||
if bop.op == ast.OpKind.Mult:
|
||||
return left_val * right_val
|
||||
if bop.op == ast.OpKind.FloorDiv:
|
||||
return left_val // right_val
|
||||
if bop.op == ast.OpKind.Mod:
|
||||
return left_val % right_val
|
||||
# 未知 BinOp 运算符:直接报错终止(fail-fast)
|
||||
HandlesType.fatal_error(val_node, "CDefine 值提取失败:无法从表达式解析编译期常量", "TypeError")
|
||||
|
||||
|
||||
Reference in new issue
Block a user