22from functools import lru_cache
33import importlib
44
5- from .assignment_info import AssignmentInfo
5+ from .assignment_info import AssignmentInfo , AssignmentType
66from .dependency_handler import DependencyHandler
7- from .dependency_node import DependencyNode
7+ from .dependency_node import DependencyNode , Field
88import ctypes
99from typing import Optional , Any , Dict
1010
@@ -103,12 +103,21 @@ def process_vmlinux_post_ast(
103103 else :
104104 raise TypeError ("Could not get required class and definition" )
105105
106+ # Create a members dictionary for AssignmentInfo
107+ members_dict : Dict [str , tuple [str , Field ]] = {}
108+
106109 logger .debug (f"Extracted fields for { current_symbol_name } : { field_table } " )
107110 for elem in field_table .items ():
108111 elem_name , elem_temp_list = elem
109112 [elem_type , elem_bitfield_size ] = elem_temp_list
110113 local_module_name = getattr (elem_type , "__module__" , None )
111114 new_dep_node .add_field (elem_name , elem_type , ready = False )
115+
116+ # Store field reference for struct assignment info
117+ field_ref = new_dep_node .get_field (elem_name )
118+ if field_ref :
119+ members_dict [elem_name ] = (elem_name , field_ref )
120+
112121 if local_module_name == ctypes .__name__ :
113122 # TODO: need to process pointer to ctype and also CFUNCTYPES here recursively. Current processing is a single dereference
114123 new_dep_node .set_field_bitfield_size (elem_name , elem_bitfield_size )
@@ -220,6 +229,7 @@ def process_vmlinux_post_ast(
220229 containing_type ,
221230 llvm_handler ,
222231 handler ,
232+ assignments , # Pass assignments to recursive call
223233 processing_stack ,
224234 )
225235 new_dep_node .set_field_ready (elem_name , True )
@@ -237,18 +247,33 @@ def process_vmlinux_post_ast(
237247 else str (elem_type )
238248 )
239249 process_vmlinux_post_ast (
240- elem_type , llvm_handler , handler , processing_stack
250+ elem_type ,
251+ llvm_handler ,
252+ handler ,
253+ assignments ,
254+ processing_stack ,
241255 )
242256 new_dep_node .set_field_ready (elem_name , True )
243257 else :
244258 raise ValueError (
245259 f"{ elem_name } with type { elem_type } from module { module_name } not supported in recursive resolver"
246260 )
247261
262+ # Add struct to assignments dictionary
263+ assignments [current_symbol_name ] = AssignmentInfo (
264+ value_type = AssignmentType .STRUCT ,
265+ python_type = elem_type_class ,
266+ value = None ,
267+ pointer_level = None ,
268+ signature = None ,
269+ members = members_dict ,
270+ )
271+ logger .info (f"Added struct assignment info for { current_symbol_name } " )
272+
248273 else :
249274 raise ImportError ("UNSUPPORTED Module" )
250275
251- logging .info (
276+ logger .info (
252277 f"{ current_symbol_name } processed and handler readiness { handler .is_ready } "
253278 )
254279 return True
0 commit comments