@@ -29,6 +29,30 @@ def _handle_constant_expr(expr: ast.Constant):
29
29
return None
30
30
31
31
32
+ def _handle_attribute_expr (
33
+ expr : ast .Attribute ,
34
+ local_sym_tab : Dict ,
35
+ structs_sym_tab : Dict ,
36
+ builder : ir .IRBuilder ,
37
+ ):
38
+ """Handle ast.Attribute expressions for struct field access."""
39
+ if isinstance (expr .value , ast .Name ):
40
+ var_name = expr .value .id
41
+ attr_name = expr .attr
42
+ if var_name in local_sym_tab :
43
+ var_ptr , var_type , var_metadata = local_sym_tab [var_name ]
44
+ logger .info (f"Loading attribute { attr_name } from variable { var_name } " )
45
+ logger .info (f"Variable type: { var_type } , Variable ptr: { var_ptr } " )
46
+
47
+ metadata = structs_sym_tab [var_metadata ]
48
+ if attr_name in metadata .fields :
49
+ gep = metadata .gep (builder , var_ptr , attr_name )
50
+ val = builder .load (gep )
51
+ field_type = metadata .field_type (attr_name )
52
+ return val , field_type
53
+ return None
54
+
55
+
32
56
def eval_expr (
33
57
func ,
34
58
module ,
@@ -117,19 +141,7 @@ def eval_expr(
117
141
structs_sym_tab ,
118
142
)
119
143
elif isinstance (expr , ast .Attribute ):
120
- if isinstance (expr .value , ast .Name ):
121
- var_name = expr .value .id
122
- attr_name = expr .attr
123
- if var_name in local_sym_tab :
124
- var_ptr , var_type , var_metadata = local_sym_tab [var_name ]
125
- logger .info (f"Loading attribute { attr_name } from variable { var_name } " )
126
- logger .info (f"Variable type: { var_type } , Variable ptr: { var_ptr } " )
127
- metadata = structs_sym_tab [var_metadata ]
128
- if attr_name in metadata .fields :
129
- gep = metadata .gep (builder , var_ptr , attr_name )
130
- val = builder .load (gep )
131
- field_type = metadata .field_type (attr_name )
132
- return val , field_type
144
+ return _handle_attribute_expr (expr , local_sym_tab , structs_sym_tab , builder )
133
145
logger .info ("Unsupported expression evaluation" )
134
146
return None
135
147
0 commit comments