Fixed
This commit is contained in:
@@ -2,6 +2,7 @@ import t, c
|
||||
from stdint import *
|
||||
import memhub
|
||||
import string
|
||||
import stdlib
|
||||
import llvmlite
|
||||
import stdio
|
||||
import ast
|
||||
@@ -521,10 +522,28 @@ def lookup_field_by_class(class_name: str,
|
||||
# 回退: 无 SHA1 或 SHA1 匹配失败,按类名查找第一个
|
||||
entry = find_struct(class_name)
|
||||
if entry is None:
|
||||
# 诊断:遍历打印所有已注册结构体名,确认目标类是否在注册表中
|
||||
for diag_i in range(_struct_count):
|
||||
diag_entry: StructEntry | t.CPtr = _get_struct_entry(diag_i)
|
||||
# 诊断:目标类未注册
|
||||
fb_lfbc: t.CChar | t.CPtr = VLogger.fmt_buf()
|
||||
if fb_lfbc is not None:
|
||||
viperlib.snprintf(fb_lfbc, 1024,
|
||||
"lookup_field_by_class: 类 '%s' 未注册 (struct_count=%d)",
|
||||
class_name, _struct_count)
|
||||
VLogger.error(fb_lfbc, "STRUCT")
|
||||
return None
|
||||
# 诊断:找到结构体但字段未找到,打印字段表
|
||||
fb_fields: t.CChar | t.CPtr = VLogger.fmt_buf()
|
||||
if fb_fields is not None:
|
||||
viperlib.snprintf(fb_fields, 1024,
|
||||
"lookup_field_by_class: 类 '%s' 已注册 (FieldCount=%d) 但字段 '%s' 未找到",
|
||||
class_name, entry.FieldCount, field_name)
|
||||
VLogger.error(fb_fields, "STRUCT")
|
||||
for fi in range(entry.FieldCount):
|
||||
fe: FieldEntry | t.CPtr = _get_field_entry(entry, fi)
|
||||
if fe is not None and fe.Name is not None:
|
||||
fb_fn: t.CChar | t.CPtr = VLogger.fmt_buf()
|
||||
if fb_fn is not None:
|
||||
viperlib.snprintf(fb_fn, 1024, " 字段[%d]: %s", fi, fe.Name)
|
||||
VLogger.error(fb_fn, "STRUCT")
|
||||
for fi in range(entry.FieldCount):
|
||||
fe: FieldEntry | t.CPtr = _get_field_entry(entry, fi)
|
||||
if fe is not None and fe.Name is not None:
|
||||
@@ -534,45 +553,6 @@ def lookup_field_by_class(class_name: str,
|
||||
return None
|
||||
|
||||
|
||||
# ============================================================
|
||||
# find_subclass_with_field — 在基类的所有子类中搜索包含指定字段的结构体
|
||||
#
|
||||
# 用于处理 "注解类型是基类但实际值是派生类" 的场景:
|
||||
# node: AST | t.CPtr = If(...)
|
||||
# node.orelse = orelse ← orelse 在 If 上,不在 AST 上
|
||||
#
|
||||
# 遍历所有已注册结构体,通过 ParentName 链检查继承关系,
|
||||
# 返回第一个包含 field_name 的子类 StructEntry。
|
||||
# ============================================================
|
||||
def find_subclass_with_field(base_class_name: str,
|
||||
field_name: str) -> StructEntry | t.CPtr:
|
||||
"""在 base_class_name 的所有子类中搜索包含 field_name 的结构体
|
||||
|
||||
返回第一个找到的 StructEntry(包含正确的 Ty),None=未找到
|
||||
"""
|
||||
if base_class_name is None or field_name is None:
|
||||
return None
|
||||
sc_i: int
|
||||
for sc_i in range(_struct_count):
|
||||
sc_entry: StructEntry | t.CPtr = _get_struct_entry(sc_i)
|
||||
if sc_entry is None or sc_entry.Name is None:
|
||||
continue
|
||||
# 检查 sc_entry 是否是 base_class_name 的子类(传递性)
|
||||
cur_parent: str = get_parent_name(sc_entry.Name)
|
||||
while cur_parent is not None:
|
||||
if string.strcmp(cur_parent, base_class_name) == 0:
|
||||
# 是子类,检查是否有该字段
|
||||
sc_fi: int
|
||||
for sc_fi in range(sc_entry.FieldCount):
|
||||
sc_fe: FieldEntry | t.CPtr = _get_field_entry(sc_entry, sc_fi)
|
||||
if sc_fe is not None and sc_fe.Name is not None:
|
||||
if string.strcmp(sc_fe.Name, field_name) == 0:
|
||||
return sc_entry
|
||||
break
|
||||
cur_parent = get_parent_name(cur_parent)
|
||||
return None
|
||||
|
||||
|
||||
# ============================================================
|
||||
# get_struct_type — 按类名获取结构体的 LLVM 类型
|
||||
# ============================================================
|
||||
|
||||
Reference in New Issue
Block a user