StructGen: _get_struct_size/_get_align 去 opaque→8/ptr_size、未知→4 兜底并补 VectorType;LiteralStructType.fields→.elements(llvmlite 无 fields,必然 AttributeError) HandlesClassDef: union 载荷尺寸经不存在的 ir.DataLayout 静默退化成 8 字节;HandlesExprCall/ExprBuiltin: sizeof 各静默 0 分支改 fail-fast,数组元素 sizeof 统一走 _get_struct_size HandlesFor: nonlocal struct/array 堆分配不再退化成 malloc(8) vast/vast_c: 补一元 * / & 解析,装饰器后 extern/export 分派修复,C 侧报错带 token 与行号;StubGen.Converter: 宏展开丢尾随空行修 .pyi 缩进非法 其余为 rawptr 迁移 / fail-fast 口径等历史改动一并入库
92 lines
3.2 KiB
Python
92 lines
3.2 KiB
Python
"""符号表处理的数据结构:四阶段管线中传递的中间数据"""
|
|
from __future__ import annotations
|
|
from dataclasses import dataclass, field
|
|
from typing import Dict, List, Optional, Tuple, TYPE_CHECKING
|
|
import vast as ast
|
|
|
|
from lib.core.SymbolUtils import _ENUM_DEFAULT_INT_WIDTH
|
|
|
|
if TYPE_CHECKING:
|
|
from lib.core.Handles.HandlesBase import CTypeInfo
|
|
|
|
|
|
@dataclass
|
|
class ClassSymbolData:
|
|
"""从 AST 提取的类符号数据"""
|
|
name: str
|
|
type_kind: str # 'struct', 'union', 'enum', 'exception'
|
|
lineno: int
|
|
members: Dict[str, CTypeInfo]
|
|
is_cpython_object: bool = False
|
|
is_packed: bool = False
|
|
enum_members: List[Tuple[str, int, int]] = field(default_factory=list) # (name, value, lineno)
|
|
# 枚举存储宽度(bit):按"最宽成员类型"推导(SymbolUtils.EnumClassIntWidth)。
|
|
# 仅 type_kind == 'enum' 有意义;非枚举 / 无可解析整数成员 → 默认 32。
|
|
# 该属性随符号表条目序列化(_shared_sym.json pickle 的 _sm._extra)⇒ 跨模块同宽。
|
|
enum_width: int = _ENUM_DEFAULT_INT_WIDTH
|
|
|
|
|
|
@dataclass
|
|
class TypedefSymbolData:
|
|
"""Typedef 符号数据(含原始注解和解析结果)"""
|
|
name: str
|
|
lineno: int
|
|
# 原始注解数据(由 Extractor 设置,Resolver 使用)
|
|
annotation: ast.expr | None = None
|
|
value: ast.expr | int | str | float | None = None
|
|
has_cdefine: bool = False
|
|
has_postdef: bool = False
|
|
has_ctypedef: bool = False
|
|
# 解析结果(由 Resolver 设置,Inserter 使用)
|
|
original_type_kind: Optional[str] = None
|
|
original_class: type | None = None
|
|
members: Optional[Dict] = None
|
|
|
|
|
|
@dataclass
|
|
class FuncSymbolData:
|
|
"""函数符号数据(含原始注解和解析结果)"""
|
|
name: str
|
|
lineno: int
|
|
# 原始数据(由 Extractor 设置)
|
|
returns_node: ast.expr | None = None
|
|
params: List = field(default_factory=list) # [(name, annotation_node), ...]
|
|
is_variadic: bool = False
|
|
is_inline: bool = False
|
|
# 解析结果(由 Resolver 设置)
|
|
ret_type: str | None = None
|
|
param_types: List = field(default_factory=list) # [str, ...]
|
|
# 解析结果(CTypeInfo,保留符号性,由 Resolver 设置)
|
|
ret_ctype: Optional[CTypeInfo] = None
|
|
|
|
|
|
@dataclass
|
|
class DefineSymbolData:
|
|
"""Define 符号数据(含原始值和解析结果)"""
|
|
name: str
|
|
lineno: int
|
|
# 原始数据(由 Extractor 设置)
|
|
value_node: ast.expr | None = None
|
|
# 解析结果(由 Resolver 设置)
|
|
value: int | str | float | None = None
|
|
|
|
|
|
@dataclass
|
|
class AnonymousTypeData:
|
|
"""匿名类型数据"""
|
|
name: str
|
|
is_union: bool
|
|
members: Dict[str, CTypeInfo]
|
|
lineno: int
|
|
|
|
|
|
@dataclass
|
|
class ModuleSymbols:
|
|
"""从模块提取的完整符号数据,在四阶段管线中传递"""
|
|
file_path: str
|
|
classes: List[ClassSymbolData] = field(default_factory=list)
|
|
typedefs: List[TypedefSymbolData] = field(default_factory=list)
|
|
functions: List[FuncSymbolData] = field(default_factory=list)
|
|
defines: List[DefineSymbolData] = field(default_factory=list)
|
|
anonymous_types: Dict[str, AnonymousTypeData] = field(default_factory=dict)
|