198 lines
11 KiB
Plaintext
198 lines
11 KiB
Plaintext
import lib.core.Gen.GenTypes as GenTypes
|
||
import lib.core.Gen.CallGenLeafKit as CallGenLeafKit
|
||
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.Handles.HandlesExprCall as HandlesExprCall
|
||
|
||
# ============================================================
|
||
# ExprCallTable - HandlesExprCall 拆分(阶段 E):ExprCallTable
|
||
#
|
||
# 直接移动模式:委托函数迁至此模块,原 HandlesExprCall.vp 仅
|
||
# 保留 _g_gen/常量/类;调用方经本模块前缀访问。
|
||
# ============================================================
|
||
|
||
# ============================================================
|
||
# 初始化函数表
|
||
# ============================================================
|
||
def init_func_table(pool: memhub.MemBuddy | t.CPtr,
|
||
max_count: int) -> GenTypes.FuncEntry | t.CPtr:
|
||
"""分配并清零函数表数组(委托到 gen.init_func_table)"""
|
||
import lib.core.Gen.Generator as Generator
|
||
g: Generator.Generator | t.CPtr = (Generator.Generator | t.CPtr)(t.CVoid(HandlesExprCall._g_gen, t.CPtr))
|
||
if g is not None:
|
||
return g.CallGenLeafKit.init_func_table(pool, max_count)
|
||
return None
|
||
# ============================================================
|
||
# 查找函数
|
||
# ============================================================
|
||
def find_func_in_table(funcs: GenTypes.FuncEntry | t.CPtr,
|
||
func_count: int,
|
||
name: str) -> llvmlite.Function | t.CPtr:
|
||
"""在函数表中按名称查找,返回 Function 指针或 None(委托到 gen.find_func_in_table)"""
|
||
import lib.core.Gen.Generator as Generator
|
||
g: Generator.Generator | t.CPtr = (Generator.Generator | t.CPtr)(t.CVoid(HandlesExprCall._g_gen, t.CPtr))
|
||
if g is not None:
|
||
return g.CallGenLeafKit.find_func_in_table(funcs, func_count, name)
|
||
return None
|
||
# ============================================================
|
||
# 添加函数到函数表
|
||
# ============================================================
|
||
def add_func_to_table(funcs: GenTypes.FuncEntry | t.CPtr,
|
||
func_count: int,
|
||
name: str,
|
||
func: llvmlite.Function | t.CPtr,
|
||
max_count: int,
|
||
defaults: t.CVoid | t.CPtr = None,
|
||
default_count: int = 0,
|
||
param_count: int = 0,
|
||
pool: memhub.MemBuddy | t.CPtr = None) -> int:
|
||
"""添加函数到函数表,返回 0 成功(委托到 gen.add_func_to_table)"""
|
||
import lib.core.Gen.Generator as Generator
|
||
g: Generator.Generator | t.CPtr = (Generator.Generator | t.CPtr)(t.CVoid(HandlesExprCall._g_gen, t.CPtr))
|
||
if g is not None:
|
||
return g.CallGenLeafKit.add_func_to_table(funcs, func_count, name, func, max_count,
|
||
defaults, default_count, param_count, pool)
|
||
return 0
|
||
|
||
# ============================================================
|
||
# 全局函数注册表(跨模块函数查找)
|
||
#
|
||
# 所有模块翻译的函数都会注册到此表(通过 add_func_to_table 自动注册)。
|
||
# 主要用途: vtable 初始化时查找跨模块继承方法的 Function 对象,
|
||
# 以获取函数类型信息构造 bitcast 字符串。
|
||
# ============================================================
|
||
GLOBAL_FUNC_MAX: t.CDefine = 8192
|
||
def _init_global_func_table() -> int:
|
||
"""初始化全局函数表(用 stdlib.malloc 分配,生命周期=整个程序)(委托到 gen._init_global_func_table)"""
|
||
import lib.core.Gen.Generator as Generator
|
||
g: Generator.Generator | t.CPtr = (Generator.Generator | t.CPtr)(t.CVoid(HandlesExprCall._g_gen, t.CPtr))
|
||
if g is not None:
|
||
return g.CallGenLeafKit._init_global_func_table()
|
||
return 0
|
||
# _build_func_type_str — 从 Function 对象生成函数类型文本(stdlib 存储)
|
||
#
|
||
# 格式: ret_ty(param1_ty, param2_ty, ...),与 vtable bitcast 需要一致。
|
||
# 用 stdlib.malloc 分配返回,跨文件永久存活(1b reset 不回收)。
|
||
# 返回 None 表示失败。
|
||
def _build_func_type_str(pool: memhub.MemBuddy | t.CPtr,
|
||
func: llvmlite.Function | t.CPtr) -> str:
|
||
"""生成函数类型文本(stdlib 分配)(委托到 gen._build_func_type_str)"""
|
||
import lib.core.Gen.Generator as Generator
|
||
g: Generator.Generator | t.CPtr = (Generator.Generator | t.CPtr)(t.CVoid(HandlesExprCall._g_gen, t.CPtr))
|
||
if g is not None:
|
||
return g.CallGenLeafKit._build_func_type_str(pool, func)
|
||
return None
|
||
def _register_global_func(name: str, func: llvmlite.Function | t.CPtr,
|
||
pool: memhub.MemBuddy | t.CPtr = None) -> int:
|
||
"""注册函数到全局表(已存在则跳过),返回 0 成功(委托到 gen._register_global_func)"""
|
||
import lib.core.Gen.Generator as Generator
|
||
g: Generator.Generator | t.CPtr = (Generator.Generator | t.CPtr)(t.CVoid(HandlesExprCall._g_gen, t.CPtr))
|
||
if g is not None:
|
||
return g.CallGenLeafKit._register_global_func(name, func, pool)
|
||
return 0
|
||
def update_global_func_typestr(pool: memhub.MemBuddy | t.CPtr,
|
||
name: str,
|
||
func: llvmlite.Function | t.CPtr) -> int:
|
||
"""更新全局函数表的 TypeStr(在函数参数全部添加完成后调用)(委托到 gen.update_global_func_typestr)"""
|
||
import lib.core.Gen.Generator as Generator
|
||
g: Generator.Generator | t.CPtr = (Generator.Generator | t.CPtr)(t.CVoid(HandlesExprCall._g_gen, t.CPtr))
|
||
if g is not None:
|
||
return g.CallGenLeafKit.update_global_func_typestr(pool, name, func)
|
||
return 0
|
||
def find_func_global(name: str) -> llvmlite.Function | t.CPtr:
|
||
"""在全局函数表中按名称查找,返回 Function 指针或 None(委托到 gen.find_func_global)"""
|
||
import lib.core.Gen.Generator as Generator
|
||
g: Generator.Generator | t.CPtr = (Generator.Generator | t.CPtr)(t.CVoid(HandlesExprCall._g_gen, t.CPtr))
|
||
if g is not None:
|
||
return g.CallGenLeafKit.find_func_global(name)
|
||
return None
|
||
def find_func_entry_global(name: str) -> GenTypes.FuncEntry | t.CPtr:
|
||
"""在全局函数表中按名称查找,返回完整 GenTypes.FuncEntry(含 TypeStr)或 None(委托到 gen.find_func_entry_global)"""
|
||
import lib.core.Gen.Generator as Generator
|
||
g: Generator.Generator | t.CPtr = (Generator.Generator | t.CPtr)(t.CVoid(HandlesExprCall._g_gen, t.CPtr))
|
||
if g is not None:
|
||
return g.CallGenLeafKit.find_func_entry_global(name)
|
||
return None
|
||
|
||
|
||
# ============================================================
|
||
# 全局默认参数注册表(跨模块默认参数填充)
|
||
#
|
||
# 独立于 _global_funcs,因为 _register_global_func 可能在
|
||
# add_func_to_table 之前被调用(如 stub 注入),此时 defaults 还不可用。
|
||
# ============================================================
|
||
GLOBAL_DEFAULTS_MAX: t.CDefine = 4096
|
||
def _init_global_defaults_table() -> int:
|
||
"""初始化全局默认参数表(委托到 gen._init_global_defaults_table)"""
|
||
import lib.core.Gen.Generator as Generator
|
||
g: Generator.Generator | t.CPtr = (Generator.Generator | t.CPtr)(t.CVoid(HandlesExprCall._g_gen, t.CPtr))
|
||
if g is not None:
|
||
return g.CallGenLeafKit._init_global_defaults_table()
|
||
return 0
|
||
def _register_global_defaults(name: str,
|
||
defaults: t.CVoid | t.CPtr,
|
||
default_count: int,
|
||
param_count: int) -> int:
|
||
"""注册函数默认参数到全局表,返回 0 成功(委托到 gen._register_global_defaults)"""
|
||
import lib.core.Gen.Generator as Generator
|
||
g: Generator.Generator | t.CPtr = (Generator.Generator | t.CPtr)(t.CVoid(HandlesExprCall._g_gen, t.CPtr))
|
||
if g is not None:
|
||
return g.CallGenLeafKit._register_global_defaults(name, defaults, default_count, param_count)
|
||
return 0
|
||
def find_func_defaults(name: str) -> GenTypes.FuncDefaultsEntry | t.CPtr:
|
||
"""按函数名查找默认参数信息,返回 GenTypes.FuncDefaultsEntry 或 None(委托到 gen.find_func_defaults)"""
|
||
import lib.core.Gen.Generator as Generator
|
||
g: Generator.Generator | t.CPtr = (Generator.Generator | t.CPtr)(t.CVoid(HandlesExprCall._g_gen, t.CPtr))
|
||
if g is not None:
|
||
return g.CallGenLeafKit.find_func_defaults(name)
|
||
return None
|
||
# _build_const_from_snapshot — 从常量快照重建常量 IR 值
|
||
#
|
||
# 用于跨模块默认参数填充:gd_entry.Defaults(pool 内 AST)可能已被 reset 回收,
|
||
# 改用注册时提取的 stdlib 常量快照(ConstKinds/ConstInts/ConstStrs)重建常量 IR。
|
||
# 返回 llvmlite.Value*,失败返回 None。
|
||
def _build_const_from_snapshot(pool: memhub.MemBuddy | t.CPtr,
|
||
mod: llvmlite.LLVMModule | t.CPtr,
|
||
gd_entry: GenTypes.FuncDefaultsEntry | t.CPtr,
|
||
di: int,
|
||
trans: HT.Translator | t.CPtr,
|
||
builder: llvmlite.IRBuilder | t.CPtr) -> llvmlite.Value | t.CPtr:
|
||
"""从快照重建第 di 个默认值常量 IR(委托到 gen._build_const_from_snapshot)"""
|
||
import lib.core.Gen.Generator as Generator
|
||
g: Generator.Generator | t.CPtr = (Generator.Generator | t.CPtr)(t.CVoid(HandlesExprCall._g_gen, t.CPtr))
|
||
if g is not None:
|
||
return g.CallGenLeafKit._build_const_from_snapshot(pool, mod, gd_entry, di, trans, builder)
|
||
return None
|
||
def find_func_entry_in_table(funcs: GenTypes.FuncEntry | t.CPtr,
|
||
func_count: int,
|
||
name: str) -> GenTypes.FuncEntry | t.CPtr:
|
||
"""在函数表中按名称查找,返回完整 GenTypes.FuncEntry 或 None"""
|
||
if name is None or funcs is None:
|
||
return None
|
||
entry_size: t.CSizeT = GenTypes.FuncEntry.__sizeof__()
|
||
i: int = 0
|
||
while i < func_count:
|
||
entry_addr: t.CUInt64T = t.CUInt64T(funcs) + i * entry_size
|
||
entry: GenTypes.FuncEntry | t.CPtr = (GenTypes.FuncEntry | t.CPtr)(t.CVoid(entry_addr, t.CPtr))
|
||
if entry.Name is not None:
|
||
if string.strcmp(entry.Name, name) == 0:
|
||
return entry
|
||
i += 1
|
||
return None
|