修正了种子编译器的错误
This commit is contained in:
@@ -17,7 +17,6 @@ import lib.core.Handles.HandlesStruct as HandlesStruct
|
||||
import lib.core.Handles.HandlesImports as HandlesImports
|
||||
import lib.core.Handles.HandlesClassDef as HandlesClassDef
|
||||
|
||||
|
||||
# ============================================================
|
||||
# 全局模块 SHA1 映射(module_name → SHA1)
|
||||
#
|
||||
@@ -30,7 +29,6 @@ _g_sha1_arr: bytes = None
|
||||
_g_mod_arr: bytes = None
|
||||
_g_sha1_count: int = 0
|
||||
|
||||
|
||||
def set_module_sha1_map(sha1_arr: bytes, mod_arr: bytes, count: int) -> int:
|
||||
"""设置全局模块 SHA1 映射"""
|
||||
global _g_sha1_arr
|
||||
@@ -41,7 +39,6 @@ def set_module_sha1_map(sha1_arr: bytes, mod_arr: bytes, count: int) -> int:
|
||||
_g_sha1_count = count
|
||||
return 0
|
||||
|
||||
|
||||
def _lookup_module_sha1(mod_name: str) -> str:
|
||||
"""查找模块名对应的 SHA1,找不到返回 None"""
|
||||
if mod_name is None:
|
||||
@@ -57,7 +54,6 @@ def _lookup_module_sha1(mod_name: str) -> str:
|
||||
return _g_sha1_arr + sidx
|
||||
return None
|
||||
|
||||
|
||||
def _lookup_module_sha1_suffix(mod_suffix: str) -> str:
|
||||
"""后缀匹配查找模块 SHA1,如 mod_suffix="__types" 匹配 "llvmlite.__types"
|
||||
|
||||
@@ -93,7 +89,6 @@ def _lookup_module_sha1_suffix(mod_suffix: str) -> str:
|
||||
return _g_sha1_arr + sidx2
|
||||
return None
|
||||
|
||||
|
||||
# ============================================================
|
||||
# 全局 CExport 函数表(module_sha1 + func_name)
|
||||
#
|
||||
@@ -108,7 +103,6 @@ _g_cexport_func_arr: bytes = None
|
||||
_g_cexport_count: int = 0
|
||||
_CEXPORT_MAX: t.CDefine = 256
|
||||
|
||||
|
||||
def register_cexport_func(sha1: str, func_name: str) -> int:
|
||||
"""注册 CExport 函数到全局表(sha1+func_name 二元组)"""
|
||||
global _g_cexport_sha1_arr
|
||||
@@ -132,7 +126,6 @@ def register_cexport_func(sha1: str, func_name: str) -> int:
|
||||
return 1
|
||||
return 0
|
||||
|
||||
|
||||
def is_cexport_func(sha1: str, func_name: str) -> int:
|
||||
"""检查 (sha1, func_name) 是否是 CExport 函数"""
|
||||
if sha1 is None or func_name is None:
|
||||
@@ -147,7 +140,6 @@ def is_cexport_func(sha1: str, func_name: str) -> int:
|
||||
return 1
|
||||
return 0
|
||||
|
||||
|
||||
# ============================================================
|
||||
# _lookup_mod_sha1 - 从 from_imports 查找类所属模块的 SHA1
|
||||
#
|
||||
@@ -185,14 +177,12 @@ def _lookup_mod_sha1(pool: memhub.MemBuddy | t.CPtr,
|
||||
sha1 = _lookup_module_sha1_suffix(base_mod)
|
||||
return sha1
|
||||
|
||||
|
||||
# ============================================================
|
||||
# HandlesExprCall - 函数调用表达式处理(Mixin 继承模式)
|
||||
#
|
||||
# 工具函数和 FuncEntry 保留为模块级,ExprCallHandle 提供 trans 接口
|
||||
# ============================================================
|
||||
|
||||
|
||||
# ============================================================
|
||||
# 在模块函数链表中按名称查找函数
|
||||
# ============================================================
|
||||
@@ -239,7 +229,6 @@ def find_func_in_module(mod: llvmlite.LLVMModule | t.CPtr,
|
||||
cur = llvmlite.function_get_next(cur)
|
||||
return None
|
||||
|
||||
|
||||
# ============================================================
|
||||
# _infer_external_func_ret_ty - 根据函数名推断外部函数返回类型
|
||||
#
|
||||
@@ -341,7 +330,6 @@ def _infer_external_func_ret_ty(pool: memhub.MemBuddy | t.CPtr,
|
||||
# 默认 i32
|
||||
return llvmlite.Int32(pool)
|
||||
|
||||
|
||||
# ============================================================
|
||||
# _get_external_func_param_ty - 获取外部函数第 idx 个参数的期望类型
|
||||
#
|
||||
@@ -390,7 +378,6 @@ def _get_external_func_param_ty(pool: memhub.MemBuddy | t.CPtr,
|
||||
|
||||
return None
|
||||
|
||||
|
||||
# ============================================================
|
||||
# _emit_llvm_memcpy_intrinsic — 将 memcpy 调用映射到 @llvm.memcpy 内联函数
|
||||
#
|
||||
@@ -498,7 +485,6 @@ def _emit_llvm_memcpy_intrinsic(pool: memhub.MemBuddy | t.CPtr,
|
||||
# 返回 dst(匹配 C memcpy 语义: 返回 dest 指针)
|
||||
return dst_coerced
|
||||
|
||||
|
||||
# ============================================================
|
||||
# c.Deref(ptr) — 解引用指针,load i8(字符遍历用例)
|
||||
#
|
||||
@@ -525,7 +511,6 @@ def translate_c_deref(pool: memhub.MemBuddy | t.CPtr,
|
||||
i8_ty: llvmlite.LLVMType | t.CPtr = llvmlite.Int8(pool)
|
||||
return llvmlite.build_load(builder, i8_ty, ptr_val)
|
||||
|
||||
|
||||
# ============================================================
|
||||
# c.DerefAs(ptr, val) — 解引用写入,*ptr = val
|
||||
#
|
||||
@@ -559,7 +544,6 @@ def translate_c_derefas(pool: memhub.MemBuddy | t.CPtr,
|
||||
llvmlite.build_store(builder, val, casted_ptr)
|
||||
return val
|
||||
|
||||
|
||||
# ============================================================
|
||||
# c.Addr(var) — 取变量地址,返回 alloca 指针(不 load)
|
||||
#
|
||||
@@ -587,7 +571,6 @@ def translate_c_addr(pool: memhub.MemBuddy | t.CPtr,
|
||||
|
||||
return HandlesVar.lookup_var(trans.SymTab, nm.id)
|
||||
|
||||
|
||||
# ============================================================
|
||||
# c.Load(a, b) — 指针间复制: *a = *b
|
||||
#
|
||||
@@ -641,7 +624,6 @@ def translate_c_load(pool: memhub.MemBuddy | t.CPtr,
|
||||
llvmlite.build_store(builder, loaded, dst_cast)
|
||||
return loaded
|
||||
|
||||
|
||||
# ============================================================
|
||||
# c.Asm — 内联汇编支持
|
||||
#
|
||||
@@ -657,7 +639,6 @@ ASM_CONST_BUF_SIZE: t.CDefine = 512
|
||||
ASM_ARGS_BUF_SIZE: t.CDefine = 512
|
||||
ASM_LINE_BUF_SIZE: t.CDefine = 4096
|
||||
|
||||
|
||||
# ============================================================
|
||||
# AsmOperand - 内联汇编操作数条目
|
||||
# ============================================================
|
||||
@@ -668,7 +649,6 @@ class AsmOperand:
|
||||
Constraint: str # 约束字符串 (如 "r", "=r")
|
||||
IsOutput: int # 1=输出, 0=输入
|
||||
|
||||
|
||||
# ============================================================
|
||||
# _asm_append_cstr — 将 C 字符串 src 追加到 dst 末尾
|
||||
# ============================================================
|
||||
@@ -688,7 +668,6 @@ def _asm_append_cstr(dst: t.CChar | t.CPtr, dst_size: t.CSizeT,
|
||||
i += 1
|
||||
dst[dlen + i] = '\0'
|
||||
|
||||
|
||||
# ============================================================
|
||||
# _asm_escape_for_ir — 将汇编文本转义为 LLVM IR 字符串内容
|
||||
#
|
||||
@@ -732,7 +711,6 @@ def _asm_escape_for_ir(pool: memhub.MemBuddy | t.CPtr,
|
||||
buf[pos] = '\0'
|
||||
return buf
|
||||
|
||||
|
||||
# ============================================================
|
||||
# _resolve_register — 将 ASM_DESCR 属性名映射到约束字符串
|
||||
# ============================================================
|
||||
@@ -820,7 +798,6 @@ def _resolve_register(attr_name: str) -> str:
|
||||
|
||||
return ""
|
||||
|
||||
|
||||
# ============================================================
|
||||
# _resolve_asm_descr — 递归解析约束表达式
|
||||
#
|
||||
@@ -882,7 +859,6 @@ def _resolve_asm_descr(pool: memhub.MemBuddy | t.CPtr,
|
||||
|
||||
return ""
|
||||
|
||||
|
||||
# ============================================================
|
||||
# _asm_get_operand — 获取操作数数组中第 idx 个元素的指针
|
||||
# ============================================================
|
||||
@@ -893,7 +869,6 @@ def _asm_get_operand(base: AsmOperand | t.CPtr,
|
||||
entry_addr: t.CUInt64T = t.CUInt64T(base) + idx * entry_size
|
||||
return (AsmOperand | t.CPtr)(t.CVoid(entry_addr, t.CPtr))
|
||||
|
||||
|
||||
# ============================================================
|
||||
# _asm_is_c_call — 检查 Call 节点是否是 c.XXX 调用
|
||||
#
|
||||
@@ -913,7 +888,6 @@ def _asm_is_c_call(node: ast.Call | t.CPtr) -> str:
|
||||
return None
|
||||
return at.attr
|
||||
|
||||
|
||||
# ============================================================
|
||||
# _asm_add_operand — 添加操作数到数组
|
||||
#
|
||||
@@ -933,7 +907,6 @@ def _asm_add_operand(operands: AsmOperand | t.CPtr,
|
||||
op.IsOutput = is_output
|
||||
return count + 1
|
||||
|
||||
|
||||
# ============================================================
|
||||
# translate_c_asm — 翻译 c.Asm 内联汇编
|
||||
#
|
||||
@@ -1397,7 +1370,6 @@ def translate_c_asm(pool: memhub.MemBuddy | t.CPtr,
|
||||
|
||||
return None
|
||||
|
||||
|
||||
# ============================================================
|
||||
# c.LLVMIR — 内联 LLVM IR 支持
|
||||
#
|
||||
@@ -1419,7 +1391,6 @@ def translate_c_asm(pool: memhub.MemBuddy | t.CPtr,
|
||||
LLVMIR_MAX_OPS: t.CDefine = 16
|
||||
LLVMIR_TEMPLATE_BUF: t.CDefine = 512
|
||||
|
||||
|
||||
# ============================================================
|
||||
# _llvmir_get_op — 获取第 i 个 AsmOperand 槽位
|
||||
# ============================================================
|
||||
@@ -1429,7 +1400,6 @@ def _llvmir_get_op(buf: AsmOperand | t.CPtr, i: int) -> AsmOperand | t.CPtr:
|
||||
entry_addr: t.CUInt64T = t.CUInt64T(buf) + i * entry_size
|
||||
return (AsmOperand | t.CPtr)(t.CVoid(entry_addr, t.CPtr))
|
||||
|
||||
|
||||
# ============================================================
|
||||
# _llvmir_find_op_marker — 在字符串中查找 %__OP 并返回编号
|
||||
#
|
||||
@@ -1441,7 +1411,6 @@ def _llvmir_find_op_marker(s: t.CChar | t.CPtr) -> t.CPtr:
|
||||
return None
|
||||
return string.strstr(s, "%__OP")
|
||||
|
||||
|
||||
# ============================================================
|
||||
# _llvmir_parse_op_num — 从 %__OPN__ 中解析编号 N
|
||||
#
|
||||
@@ -1466,7 +1435,6 @@ def _llvmir_parse_op_num(marker: t.CChar | t.CPtr) -> int:
|
||||
ch = num_start[i]
|
||||
return num
|
||||
|
||||
|
||||
# ============================================================
|
||||
# _llvmir_match_icmp_pred — 将预测字符串转为 ICMP 常量
|
||||
# ============================================================
|
||||
@@ -1496,7 +1464,6 @@ def _llvmir_match_icmp_pred(pred: str) -> int:
|
||||
return 9
|
||||
return 0
|
||||
|
||||
|
||||
# ============================================================
|
||||
# _llvmir_match_fcmp_pred — 将预测字符串转为 FCMP 常量
|
||||
# ============================================================
|
||||
@@ -1534,7 +1501,6 @@ def _llvmir_match_fcmp_pred(pred: str) -> int:
|
||||
return 13
|
||||
return 0
|
||||
|
||||
|
||||
# ============================================================
|
||||
# _llvmir_extract_two_ops — 从模板中提取两个操作数编号
|
||||
#
|
||||
@@ -1567,7 +1533,6 @@ def _llvmir_extract_two_ops(template: t.CChar | t.CPtr,
|
||||
out_nums[1] = _llvmir_parse_op_num(m2)
|
||||
return 1
|
||||
|
||||
|
||||
# ============================================================
|
||||
# _llvmir_resolve_op — 根据编号解析操作数值
|
||||
# ============================================================
|
||||
@@ -1590,7 +1555,6 @@ def _llvmir_resolve_op(op_num: int,
|
||||
op2: AsmOperand | t.CPtr = _llvmir_get_op(output_targets, idx)
|
||||
return op2.Value
|
||||
|
||||
|
||||
# ============================================================
|
||||
# _llvmir_store_outputs — 将结果存储到输出变量
|
||||
# ============================================================
|
||||
@@ -1608,7 +1572,6 @@ def _llvmir_store_outputs(pool: memhub.MemBuddy | t.CPtr,
|
||||
llvmlite.build_store(builder, result, op.Value)
|
||||
return result
|
||||
|
||||
|
||||
# ============================================================
|
||||
# translate_c_llvmir — 翻译 c.LLVMIR 内联 LLVM IR
|
||||
# ============================================================
|
||||
@@ -1953,7 +1916,6 @@ def translate_c_llvmir(pool: memhub.MemBuddy | t.CPtr,
|
||||
stdio.printf("[LLVMIR] unsupported instruction: %s\n", instr_kw)
|
||||
return None
|
||||
|
||||
|
||||
# ============================================================
|
||||
# _apply_struct_defaults — 应用结构体字段的默认值
|
||||
#
|
||||
@@ -1989,7 +1951,6 @@ def _apply_struct_defaults(pool: memhub.MemBuddy | t.CPtr,
|
||||
default_val = HandlesExpr.coerce_to_type(builder, default_val, fe.Ty)
|
||||
llvmlite.build_store(builder, default_val, field_ptr)
|
||||
|
||||
|
||||
# ============================================================
|
||||
# _translate_struct_ctor — 结构体构造函数 Point(10, 20)
|
||||
#
|
||||
@@ -2147,7 +2108,6 @@ def _translate_struct_ctor(pool: memhub.MemBuddy | t.CPtr,
|
||||
# 返回指针(而非结构体值),赋值时由 coerce_to_type 按目标类型决定是否 load
|
||||
return tmp
|
||||
|
||||
|
||||
# ============================================================
|
||||
# _do_virtual_call — 通过虚表间接调用虚方法
|
||||
#
|
||||
@@ -2308,7 +2268,6 @@ def _do_virtual_call(pool: memhub.MemBuddy | t.CPtr,
|
||||
# 12. 间接调用
|
||||
return llvmlite.build_call_indirect(builder, func_ptr, args_head, args_count, ret_ty)
|
||||
|
||||
|
||||
# ============================================================
|
||||
# _call_method_on_ptr — 在结构体指针上调用方法
|
||||
#
|
||||
@@ -2384,6 +2343,11 @@ def _call_method_on_ptr(pool: memhub.MemBuddy | t.CPtr,
|
||||
frt: llvmlite.LLVMType | t.CPtr = llvmlite.function_get_ret_ty(found_func)
|
||||
if frt is not None:
|
||||
call_ret_ty = frt
|
||||
else:
|
||||
# found_func 为 None(跨模块调用 stub 未注入):根据方法名推断返回类型
|
||||
# __new__ 返回 Ptr(struct_ty),其他方法默认 void
|
||||
if string.strcmp(method_name, "__new__") == 0 and cmop_struct_ty is not None:
|
||||
call_ret_ty = llvmlite.Ptr(pool, cmop_struct_ty)
|
||||
|
||||
# 构建参数链表: self_ptr → extra_args...
|
||||
llvmlite.value_set_next(self_ptr, None)
|
||||
@@ -2446,7 +2410,6 @@ def _call_method_on_ptr(pool: memhub.MemBuddy | t.CPtr,
|
||||
|
||||
return llvmlite.build_call(builder, call_name, head, total_count, call_ret_ty, 0)
|
||||
|
||||
|
||||
# ============================================================
|
||||
# _infer_method_ret_ty - 根据方法名推断返回类型
|
||||
#
|
||||
@@ -2482,10 +2445,15 @@ def _infer_method_ret_ty(pool: memhub.MemBuddy | t.CPtr,
|
||||
# 返回 void 的方法
|
||||
if string.strcmp(method_name, "__before_init__") == 0:
|
||||
return llvmlite.Void(pool)
|
||||
if string.strcmp(method_name, "__init__") == 0:
|
||||
return llvmlite.Void(pool)
|
||||
if string.strcmp(method_name, "__exit__") == 0:
|
||||
return llvmlite.Void(pool)
|
||||
|
||||
# 默认 i32(free, reset, __init__, __exit__, _fl_push 等)
|
||||
return llvmlite.Int32(pool)
|
||||
|
||||
# 默认 i64(整数):既可安全截断为 i32(trunc),也可转换为指针(inttoptr)
|
||||
# 避免使用指针类型(i8*)导致 coerce_to_type 生成 load(解引用)造成崩溃
|
||||
# x86-64 ABI 中 i32 返回值在 rax 低 32 位,i64 读取后 trunc 取低 32 位是安全的
|
||||
return llvmlite.Int64(pool)
|
||||
|
||||
# ============================================================
|
||||
# _translate_method_call - 翻译方法调用 obj.method(args)
|
||||
@@ -2633,7 +2601,6 @@ def _translate_method_call(pool: memhub.MemBuddy | t.CPtr,
|
||||
|
||||
return llvmlite.build_call(builder, call_name, head, total_count, call_ret_ty, 0)
|
||||
|
||||
|
||||
# ============================================================
|
||||
# _kwarg_name_matches — 检查关键字参数名是否匹配函数参数名
|
||||
#
|
||||
@@ -2656,7 +2623,6 @@ def _kwarg_name_matches(kw_arg: str,
|
||||
return 0
|
||||
return 1
|
||||
|
||||
|
||||
# ============================================================
|
||||
# _translate_struct_ctor_kw — 结构体构造函数(关键字参数)
|
||||
#
|
||||
@@ -2747,7 +2713,6 @@ def _translate_struct_ctor_kw(pool: memhub.MemBuddy | t.CPtr,
|
||||
# 返回指针(而非结构体值),赋值时由 coerce_to_type 按目标类型决定是否 load
|
||||
return tmp
|
||||
|
||||
|
||||
# ============================================================
|
||||
# _translate_call_with_kwargs — 带关键字参数的函数调用
|
||||
#
|
||||
@@ -2850,7 +2815,6 @@ def _translate_call_with_kwargs(pool: memhub.MemBuddy | t.CPtr,
|
||||
return _emit_llvm_memcpy_intrinsic(pool, builder, mod, mc_dst1, mc_src1, mc_num1)
|
||||
return llvmlite.build_call(builder, call_name, head, actual_count, call_ret_ty, 0)
|
||||
|
||||
|
||||
# ============================================================
|
||||
# _translate_t_type_cast - 翻译 t.XXX(value) 类型转换
|
||||
#
|
||||
@@ -2892,14 +2856,12 @@ def _translate_t_type_cast(pool: memhub.MemBuddy | t.CPtr,
|
||||
# 指针 → 指针: bitcast
|
||||
return llvmlite.build_bitcast(builder, val, target_ty)
|
||||
|
||||
|
||||
# ============================================================
|
||||
# 泛型实例化辅助:从 Subscript slice 提取类型实参名
|
||||
# ============================================================
|
||||
# _get_type_name_from_annotation 已移至 HandlesType.py(支持 BinOp/Attribute)
|
||||
# HandlesExprCall 通过 HandlesType._get_type_name_from_annotation 调用
|
||||
|
||||
|
||||
def _extract_type_args_from_slice(pool: memhub.MemBuddy | t.CPtr,
|
||||
slice_node: ast.AST | t.CPtr) -> list[str] | t.CPtr:
|
||||
"""从 Subscript.slice 提取类型实参名列表
|
||||
@@ -2929,7 +2891,6 @@ def _extract_type_args_from_slice(pool: memhub.MemBuddy | t.CPtr,
|
||||
result.append(tn)
|
||||
return result
|
||||
|
||||
|
||||
# ============================================================
|
||||
# 翻译函数调用 Call(func, args) — 模块级版本
|
||||
# ============================================================
|
||||
@@ -3678,7 +3639,6 @@ def translate_call(pool: memhub.MemBuddy | t.CPtr,
|
||||
return _emit_llvm_memcpy_intrinsic(pool, builder, mod, mc_dst2, mc_src2, mc_num2)
|
||||
return llvmlite.build_call(builder, call_name, head, can, call_ret_ty, 0)
|
||||
|
||||
|
||||
# ============================================================
|
||||
# 翻译闭包调用 — 通过闭包指针间接调用
|
||||
#
|
||||
@@ -3738,7 +3698,6 @@ def translate_closure_call(pool: memhub.MemBuddy | t.CPtr,
|
||||
env_ptr.Next = None
|
||||
return llvmlite.build_call_indirect(builder, fn_typed, env_ptr, 1, i32_ty)
|
||||
|
||||
|
||||
# ============================================================
|
||||
# 翻译 printf 调用 — 模块级版本
|
||||
# ============================================================
|
||||
@@ -3802,7 +3761,6 @@ def translate_printf_call(pool: memhub.MemBuddy | t.CPtr,
|
||||
# 让 llc 识别为 variadic 调用,生成正确的 Win64 ABI 代码(浮点参数同时传 XMM 和整数寄存器)
|
||||
llvmlite.build_call(builder, "printf", fmt_ptr, can, i32_ty, 1)
|
||||
|
||||
|
||||
# ============================================================
|
||||
# FuncEntry 结构体(用于函数表)
|
||||
# ============================================================
|
||||
@@ -3812,7 +3770,6 @@ class FuncEntry:
|
||||
Name: str
|
||||
Func: llvmlite.Function | t.CPtr
|
||||
|
||||
|
||||
# ============================================================
|
||||
# 初始化函数表
|
||||
# ============================================================
|
||||
@@ -3825,7 +3782,6 @@ def init_func_table(pool: memhub.MemBuddy | t.CPtr,
|
||||
string.memset(funcs_ptr, 0, size)
|
||||
return funcs_ptr
|
||||
|
||||
|
||||
# ============================================================
|
||||
# 查找函数
|
||||
# ============================================================
|
||||
@@ -3844,7 +3800,6 @@ def find_func_in_table(funcs: FuncEntry | t.CPtr,
|
||||
return entry.Func
|
||||
return None
|
||||
|
||||
|
||||
# ============================================================
|
||||
# 添加函数到函数表
|
||||
# ============================================================
|
||||
@@ -3867,7 +3822,6 @@ def add_func_to_table(funcs: FuncEntry | t.CPtr,
|
||||
_register_global_func(name, func)
|
||||
return 0
|
||||
|
||||
|
||||
# ============================================================
|
||||
# 全局函数注册表(跨模块函数查找)
|
||||
#
|
||||
@@ -3879,7 +3833,6 @@ GLOBAL_FUNC_MAX: t.CDefine = 8192
|
||||
_global_funcs: FuncEntry | t.CPtr = None
|
||||
_global_func_count: int = 0
|
||||
|
||||
|
||||
def _init_global_func_table() -> int:
|
||||
"""初始化全局函数表(用 stdlib.malloc 分配,生命周期=整个程序)"""
|
||||
global _global_funcs
|
||||
@@ -3894,7 +3847,6 @@ def _init_global_func_table() -> int:
|
||||
_global_func_count = 0
|
||||
return 1
|
||||
|
||||
|
||||
def _register_global_func(name: str, func: llvmlite.Function | t.CPtr) -> int:
|
||||
"""注册函数到全局表(已存在则跳过),返回 0 成功
|
||||
|
||||
@@ -3919,14 +3871,12 @@ def _register_global_func(name: str, func: llvmlite.Function | t.CPtr) -> int:
|
||||
_global_func_count += 1
|
||||
return 0
|
||||
|
||||
|
||||
def find_func_global(name: str) -> llvmlite.Function | t.CPtr:
|
||||
"""在全局函数表中按名称查找,返回 Function 指针或 None"""
|
||||
if name is None or _global_funcs is None:
|
||||
return None
|
||||
return find_func_in_table(_global_funcs, _global_func_count, name)
|
||||
|
||||
|
||||
# ============================================================
|
||||
# ExprCallHandle - 函数调用处理器(Mixin 继承模式)
|
||||
#
|
||||
@@ -3958,7 +3908,6 @@ class ExprCallHandle(HandlesBase.Mixin):
|
||||
self.Trans.Pool, self.Trans._cur_builder, self.Trans.Module,
|
||||
cl, self.Trans)
|
||||
|
||||
|
||||
# ============================================================
|
||||
# NewExprCallHandle - 工厂函数
|
||||
# ============================================================
|
||||
|
||||
Reference in New Issue
Block a user