修复了关于 snprintf 的错误(不支持长度推导)
This commit is contained in:
@@ -129,6 +129,34 @@ class MatchHandle(BaseHandle):
|
||||
elif isinstance(pattern, ast.MatchSequence):
|
||||
HasDefault = True
|
||||
CaseBBs.append(DefaultBB)
|
||||
elif isinstance(pattern, ast.MatchClass):
|
||||
# 兜底处理:REnum 检测失败但 case 是 MatchClass(REnum 变体模式)
|
||||
# 尝试从变体名查找 tag 值,按整数值处理
|
||||
cls_node_mc: ast.expr = pattern.cls
|
||||
VariantName_mc: str | None = None
|
||||
QualifiedName_mc: str | None = None
|
||||
if isinstance(cls_node_mc, ast.Name):
|
||||
VariantName_mc = cls_node_mc.id
|
||||
elif isinstance(cls_node_mc, ast.Attribute):
|
||||
VariantName_mc = cls_node_mc.attr
|
||||
if isinstance(cls_node_mc.value, ast.Attribute):
|
||||
QualifiedName_mc = f"{cls_node_mc.value.attr}.{VariantName_mc}"
|
||||
elif isinstance(cls_node_mc.value, ast.Name):
|
||||
QualifiedName_mc = f"{cls_node_mc.value.id}.{VariantName_mc}"
|
||||
TagValue_mc: int | None = None
|
||||
SymInfo_mc: "SymbolTable.SymbolInfo" = None
|
||||
if QualifiedName_mc:
|
||||
SymInfo_mc = self.Trans.SymbolTable.lookup(QualifiedName_mc)
|
||||
if not (SymInfo_mc and SymInfo_mc.IsEnumMember):
|
||||
SymInfo_mc = self.Trans.SymbolTable.lookup(VariantName_mc)
|
||||
if SymInfo_mc and SymInfo_mc.IsEnumMember:
|
||||
TagValue_mc = SymInfo_mc.value
|
||||
if TagValue_mc is not None:
|
||||
CaseValues.append(ir.Constant(SwitchIntType, TagValue_mc))
|
||||
CaseBBs.append(Gen.func.append_basic_block(name=f"match.case_{VariantName_mc}"))
|
||||
else:
|
||||
# 变体名未找到,跳过此 case(fast-fail 已在外层处理)
|
||||
pass
|
||||
def _HasNoBreak(stmts: list[ast.stmt]) -> bool:
|
||||
for stmt in stmts:
|
||||
if isinstance(stmt, ast.Expr) and isinstance(stmt.value, ast.Call):
|
||||
@@ -187,6 +215,16 @@ class MatchHandle(BaseHandle):
|
||||
if not HasNoBreak[i]:
|
||||
Gen.builder.branch(AfterBB)
|
||||
CaseIdx += 1
|
||||
elif isinstance(pattern, ast.MatchClass):
|
||||
# 兜底处理:MatchClass 在非 REnum 路径的 case body 生成
|
||||
# case 收集阶段已创建 CaseBB,此处生成 body
|
||||
if CaseIdx < len(CaseBBs) and CaseBBs[CaseIdx] != DefaultBB:
|
||||
Gen.builder.position_at_start(CaseBBs[CaseIdx])
|
||||
self.HandleBodyLlvm(case.body)
|
||||
if not Gen.builder.block.is_terminated:
|
||||
if not HasNoBreak[i]:
|
||||
Gen.builder.branch(AfterBB)
|
||||
CaseIdx += 1
|
||||
if not HasDefault:
|
||||
Gen.builder.position_at_start(DefaultBB)
|
||||
Gen.builder.branch(AfterBB)
|
||||
|
||||
Reference in New Issue
Block a user