import lib.core.Gen.GenApi as GenApi import t, c from stdint import * import ast import llvmlite import memhub import string import stdio import stdlib import sys import viperlib import w32.fileio as fileio import lib.core.VLogger as VLogger import lib.core.Handles.HandlesBase as HandlesBase import lib.core.Handles.HandlesTranslator as HT import lib.core.Handles.HandlesExpr as HandlesExpr import lib.Stub.StubMerger as StubMerger import lib.core.Gen.Generator as Generator # ============================================================ # 全局 gen 单例(模块级镜像,同 HandlesType/HandlesStruct 模式) # ============================================================ _g_gen: Generator.Generator | t.CPtr = None # ============================================================ # 本地常量(阶段 E 拆分时随函数块误删,补回;子模块经 HandlesExprCall.常量 引用) # ============================================================ _CEXPORT_MAX: t.CDefine = 256 ASM_MAX_OPERANDS: t.CDefine = 16 ASM_TEXT_BUF_SIZE: t.CDefine = 2048 ASM_CONST_BUF_SIZE: t.CDefine = 512 ASM_ARGS_BUF_SIZE: t.CDefine = 512 ASM_LINE_BUF_SIZE: t.CDefine = 4096 LLVMIR_MAX_OPS: t.CDefine = 16 LLVMIR_TEMPLATE_BUF: t.CDefine = 512 MAX_CLOSURE_NAMES: t.CDefine = 128 MAX_FUNC_PTR_SIGS: t.CDefine = 64 GLOBAL_FUNC_MAX: t.CDefine = 8192 GLOBAL_DEFAULTS_MAX: t.CDefine = 4096 # ============================================================ # AsmOperand - 内联汇编操作数条目 # ============================================================ @t.NoVTable class AsmOperand: """内联汇编操作数条目""" Value: llvmlite.Value | t.CPtr # 输入值或输出 alloca Constraint: str # 约束字符串 (如 "r", "=r") IsOutput: int # 1=输出, 0=输入 # ============================================================ # FuncEntry 结构体(用于函数表) # ============================================================ @t.NoVTable class FuncEntry: """函数表条目""" Name: str Func: llvmlite.Function | t.CPtr Defaults: t.CVoid | t.CPtr # defaults 列表节点指针 (list[AST | CPtr]),None=无默认值 DefaultCount: int # 默认值数量 ParamCount: int # 形参数量(不含 self) # TypeStr: 函数类型文本(stdlib 深拷贝,跨文件安全) # 1b 每文件 reset_to(mark1) 回收 pool 内 Function 对象后, # vtable 生成 find_func_global 读类型改用此文本,避免悬空。 TypeStr: str @t.NoVTable class FuncDefaultsEntry: """默认参数表条目""" Name: str Defaults: t.CVoid | t.CPtr # defaults 列表节点指针 (list[AST | CPtr])(pool 内,可能被 reset) DefaultCount: int ParamCount: int # 形参数量(不含 self) # 常量快照(stdlib 分配,跨文件永久存活): # 注册时提取每个默认值 Constant 的值,跨模块调用时优先用快照重建常量 IR, # 避免读取已被 1b reset_to(mark1) 回收的 pool 内 AST。 ConstKinds: t.CInt | t.CPtr # const_kind 数组(DefaultCount 个 i32) ConstInts: t.CInt64T | t.CPtr # int_val 数组(DefaultCount 个 i64) ConstStrs: t.CSizeT | t.CPtr # str_val 指针数组(DefaultCount 个 i8*) # ============================================================ # ExprCallHandle - 函数调用处理器(Mixin 继承模式) # # HandleCall / HandlePrintfCall 提供 trans 接口 # ============================================================ @t.NoVTable class ExprCallHandle(HandlesBase.Mixin): """函数调用处理器:继承 Mixin 获得 Trans 回指针""" def __init__(self, trans: HT.Translator | t.CPtr): self.Trans = trans # ============================================================ # HandleCall - 翻译函数调用,返回 call 结果 Value # ============================================================ def HandleCall(self, node: ast.AST | t.CPtr) -> llvmlite.Value | t.CPtr: """翻译函数调用,从 self.Trans 获取共享状态""" return GenApi.translate_call( self.Trans.Pool, self.Trans._cur_builder, self.Trans.Module, node, self.Trans._funcs, self.Trans._func_count, self.Trans) # ============================================================ # HandlePrintfCall - 翻译 printf 调用 # ============================================================ def HandlePrintfCall(self, cl: ast.Call | t.CPtr): """翻译 printf 调用,从 self.Trans 获取共享状态""" GenApi.translate_printf_call( self.Trans.Pool, self.Trans._cur_builder, self.Trans.Module, cl, self.Trans) # ============================================================ # HandlePrintCall - 翻译 print 调用 # ============================================================ def HandlePrintCall(self, cl: ast.Call | t.CPtr): """翻译 print 调用(类型感知格式化 + 默认换行)""" GenApi.translate_print_call( self.Trans.Pool, self.Trans._cur_builder, self.Trans.Module, cl, self.Trans)