阶段 2 完成

This commit is contained in:
2026-06-18 12:42:44 +08:00
parent 599335e93d
commit f99666420b
19 changed files with 874 additions and 641 deletions

View File

@@ -6,7 +6,6 @@ import re
import llvmlite.ir as ir
from lib.core.LlvmCodeGenerator import LlvmCodeGenerator
from lib.core.SymbolNode import SymbolNode
from lib.core.Handles.HandlesBase import CTypeInfo
from lib.includes import t
from lib.constants.config import mode as _config_mode
@@ -368,15 +367,13 @@ class LlvmGeneratorMixin:
if IsTypedef:
TypedefKey = TypedefName if TypedefName else ClassName
TypedefNode = SymbolNode.CreateClass(
name=TypedefKey,
TypeKind='typedef',
lineno=0
)
TypedefNode.set('OriginalType', f'struct {ClassName}')
TypedefNode = CTypeInfo()
TypedefNode.Name = TypedefKey
TypedefNode.IsTypedef = True
TypedefNode.OriginalType = f'struct {ClassName}'
TypedefNode.set('IsComplete', True)
TypedefNode.set('file', '<stdin>')
self.SymbolTable[TypedefKey] = TypedefNode.attributes
TypedefNode.file = '<stdin>'
self.SymbolTable[TypedefKey] = TypedefNode
for item in Node.body:
if isinstance(item, ast.AnnAssign) and isinstance(item.target, ast.Name):
@@ -412,27 +409,23 @@ class LlvmGeneratorMixin:
self.LogWarning(f"异常被忽略: {_e}")
if not IsTypedef:
StructNode = SymbolNode.CreateClass(
name=ClassName,
TypeKind='struct',
members=members,
lineno=0
)
StructNode.set('file', '<stdin>')
StructNode = CTypeInfo()
StructNode.Name = ClassName
StructNode.IsStruct = True
StructNode.Members = members or {}
StructNode.file = '<stdin>'
if ClassName in self.SymbolTable:
existing = self.SymbolTable[ClassName]
if hasattr(existing, 'IsCpythonObject') and existing.IsCpythonObject:
StructNode.set('IsCpythonObject', True)
self.SymbolTable[ClassName] = StructNode.attributes
StructNode.IsCpythonObject = True
self.SymbolTable[ClassName] = StructNode
elif isinstance(Node, ast.FunctionDef):
FuncName = Node.name
FuncNode = SymbolNode.CreateClass(
name=FuncName,
TypeKind='function',
lineno=0
)
FuncNode.set('file', '<stdin>')
self.SymbolTable[FuncName] = FuncNode.attributes
FuncNode = CTypeInfo()
FuncNode.Name = FuncName
FuncNode.IsFunction = True
FuncNode.file = '<stdin>'
self.SymbolTable[FuncName] = FuncNode
elif isinstance(Node, ast.AnnAssign):
if isinstance(Node.target, ast.Name):
VarName = Node.target.id
@@ -470,39 +463,33 @@ class LlvmGeneratorMixin:
else:
actual_type = 'struct'
if actual_type == 'enum':
TypedefNode = SymbolNode.CreateClass(
name=VarName,
TypeKind='typedef',
lineno=0
)
TypedefNode.set('OriginalType', f'enum {OriginalType}')
TypedefNode.set('file', '<stdin>')
self.SymbolTable[VarName] = TypedefNode.attributes
TypedefNode = CTypeInfo()
TypedefNode.Name = VarName
TypedefNode.IsTypedef = True
TypedefNode.OriginalType = f'enum {OriginalType}'
TypedefNode.file = '<stdin>'
self.SymbolTable[VarName] = TypedefNode
elif actual_type == 'typedef':
TypedefNode = SymbolNode.CreateClass(
name=VarName,
TypeKind='typedef',
lineno=0
)
TypedefNode = CTypeInfo()
TypedefNode.Name = VarName
TypedefNode.IsTypedef = True
if isinstance(OriginalInfo, dict):
TypedefNode.set('OriginalType', OriginalInfo.get('OriginalType', f'struct {OriginalType}'))
TypedefNode.OriginalType = OriginalInfo.get('OriginalType', f'struct {OriginalType}')
elif isinstance(OriginalInfo, CTypeInfo) and OriginalInfo.OriginalType:
TypedefNode.set('OriginalType', OriginalInfo.OriginalType)
TypedefNode.OriginalType = OriginalInfo.OriginalType
else:
TypedefNode.set('OriginalType', f'struct {OriginalType}')
TypedefNode.OriginalType = f'struct {OriginalType}'
TypedefNode.set('PendingTypedef', True)
TypedefNode.set('file', '<stdin>')
self.SymbolTable[VarName] = TypedefNode.attributes
TypedefNode.file = '<stdin>'
self.SymbolTable[VarName] = TypedefNode
else:
TypedefNode = SymbolNode.CreateClass(
name=VarName,
TypeKind='typedef',
lineno=0
)
TypedefNode.set('OriginalType', f'struct {OriginalType}')
TypedefNode = CTypeInfo()
TypedefNode.Name = VarName
TypedefNode.IsTypedef = True
TypedefNode.OriginalType = f'struct {OriginalType}'
TypedefNode.set('PendingTypedef', True)
TypedefNode.set('file', '<stdin>')
self.SymbolTable[VarName] = TypedefNode.attributes
TypedefNode.file = '<stdin>'
self.SymbolTable[VarName] = TypedefNode
self.GeneratedTypes.add(VarName)
continue
else:
@@ -522,48 +509,42 @@ class LlvmGeneratorMixin:
else:
actual_type = 'struct'
if actual_type == 'typedef':
TypedefNode = SymbolNode.CreateClass(
name=VarName,
TypeKind='typedef',
lineno=0
)
TypedefNode = CTypeInfo()
TypedefNode.Name = VarName
TypedefNode.IsTypedef = True
if isinstance(OriginalInfo, dict):
TypedefNode.set('OriginalType', OriginalInfo.get('OriginalType', f'struct {OriginalType}'))
TypedefNode.OriginalType = OriginalInfo.get('OriginalType', f'struct {OriginalType}')
elif isinstance(OriginalInfo, CTypeInfo) and OriginalInfo.OriginalType:
TypedefNode.set('OriginalType', OriginalInfo.OriginalType)
TypedefNode.OriginalType = OriginalInfo.OriginalType
else:
TypedefNode.set('OriginalType', f'struct {OriginalType}')
TypedefNode.OriginalType = f'struct {OriginalType}'
TypedefNode.set('PendingTypedef', True)
TypedefNode.set('file', '<stdin>')
self.SymbolTable[VarName] = TypedefNode.attributes
TypedefNode.file = '<stdin>'
self.SymbolTable[VarName] = TypedefNode
self.GeneratedTypes.add(VarName)
if isinstance(OriginalInfo, dict):
OriginalInfo['skip_generation'] = True
continue
elif actual_type == 'struct':
TypedefNode = SymbolNode.CreateClass(
name=VarName,
TypeKind='typedef',
lineno=0
)
TypedefNode.set('OriginalType', f'struct {OriginalType}')
TypedefNode = CTypeInfo()
TypedefNode.Name = VarName
TypedefNode.IsTypedef = True
TypedefNode.OriginalType = f'struct {OriginalType}'
TypedefNode.set('PendingTypedef', True)
TypedefNode.set('file', '<stdin>')
self.SymbolTable[VarName] = TypedefNode.attributes
TypedefNode.file = '<stdin>'
self.SymbolTable[VarName] = TypedefNode
self.GeneratedTypes.add(VarName)
if isinstance(OriginalInfo, dict):
OriginalInfo['skip_generation'] = True
continue
elif actual_type == 'enum':
TypedefNode = SymbolNode.CreateClass(
name=VarName,
TypeKind='typedef',
lineno=0
)
TypedefNode.set('OriginalType', f'enum {OriginalType}')
TypedefNode = CTypeInfo()
TypedefNode.Name = VarName
TypedefNode.IsTypedef = True
TypedefNode.OriginalType = f'enum {OriginalType}'
TypedefNode.set('PendingTypedef', True)
TypedefNode.set('file', '<stdin>')
self.SymbolTable[VarName] = TypedefNode.attributes
TypedefNode.file = '<stdin>'
self.SymbolTable[VarName] = TypedefNode
self.GeneratedTypes.add(VarName)
if isinstance(OriginalInfo, dict):
OriginalInfo['skip_generation'] = True
@@ -572,14 +553,12 @@ class LlvmGeneratorMixin:
from lib.core.Handles.HandlesBase import CTypeHelper
CName = CTypeHelper.GetCName(Node.value.attr)
if CName:
TypedefNode = SymbolNode.CreateClass(
name=VarName,
TypeKind='typedef',
lineno=0
)
TypedefNode.set('OriginalType', CName)
TypedefNode.set('file', '<stdin>')
self.SymbolTable[VarName] = TypedefNode.attributes
TypedefNode = CTypeInfo()
TypedefNode.Name = VarName
TypedefNode.IsTypedef = True
TypedefNode.OriginalType = CName
TypedefNode.file = '<stdin>'
self.SymbolTable[VarName] = TypedefNode
self.GeneratedTypes.add(VarName)
continue
@@ -590,14 +569,12 @@ class LlvmGeneratorMixin:
except Exception as _e:
if __import__('lib.constants.config', fromlist=['mode']).mode == "strict":
self.LogWarning(f"异常被忽略: {_e}")
var_node = SymbolNode.CreateClass(
name=VarName,
TypeKind='variable',
lineno=0
)
var_node.set('IsPtr', IsPtr)
var_node.set('file', '<stdin>')
self.SymbolTable[VarName] = var_node.attributes
var_node = CTypeInfo()
var_node.Name = VarName
var_node.IsVariable = True
var_node.PtrCount = 1 if IsPtr else 0
var_node.file = '<stdin>'
self.SymbolTable[VarName] = var_node
self.LlvmGen = LlvmCodeGenerator(
triple=getattr(self, 'triple', None),