|
10 | 10 | ) |
11 | 11 | from pythonbpf.type_deducer import ctypes_to_ir |
12 | 12 | from pythonbpf.expr import eval_expr, handle_expr, convert_to_bool |
13 | | -from pythonbpf.assign_pass import handle_variable_assignment |
| 13 | +from pythonbpf.assign_pass import ( |
| 14 | + handle_variable_assignment, |
| 15 | + handle_struct_field_assignment, |
| 16 | +) |
14 | 17 |
|
15 | 18 | from .return_utils import _handle_none_return, _handle_xdp_return, _is_xdp_name |
16 | 19 |
|
@@ -78,47 +81,15 @@ def handle_assign( |
78 | 81 | logger.error(f"Failed to handle assignment to {var_name}") |
79 | 82 | return |
80 | 83 |
|
81 | | - logger.info(f"Handling assignment to {ast.dump(target)}") |
82 | | - if not isinstance(target, ast.Name) and not isinstance(target, ast.Attribute): |
83 | | - logger.info("Unsupported assignment target") |
| 84 | + if isinstance(target, ast.Attribute): |
| 85 | + # NOTE: Struct field assignment case: pkt.field = value |
| 86 | + handle_struct_field_assignment( |
| 87 | + func, module, builder, target, rval, local_sym_tab, structs_sym_tab |
| 88 | + ) |
84 | 89 | return |
85 | | - var_name = target.id if isinstance(target, ast.Name) else target.value.id |
86 | | - rval = stmt.value |
87 | 90 |
|
88 | | - # struct field assignment |
89 | | - field_name = target.attr |
90 | | - if var_name in local_sym_tab: |
91 | | - struct_type = local_sym_tab[var_name].metadata |
92 | | - struct_info = structs_sym_tab[struct_type] |
93 | | - if field_name in struct_info.fields: |
94 | | - field_ptr = struct_info.gep( |
95 | | - builder, local_sym_tab[var_name].var, field_name |
96 | | - ) |
97 | | - val = eval_expr( |
98 | | - func, |
99 | | - module, |
100 | | - builder, |
101 | | - rval, |
102 | | - local_sym_tab, |
103 | | - map_sym_tab, |
104 | | - structs_sym_tab, |
105 | | - ) |
106 | | - if isinstance(struct_info.field_type(field_name), ir.ArrayType) and val[ |
107 | | - 1 |
108 | | - ] == ir.PointerType(ir.IntType(8)): |
109 | | - # TODO: Figure it out, not a priority rn |
110 | | - # Special case for string assignment to char array |
111 | | - # str_len = struct_info["field_types"][field_idx].count |
112 | | - # assign_string_to_array(builder, field_ptr, val[0], str_len) |
113 | | - # print(f"Assigned to struct field {var_name}.{field_name}") |
114 | | - pass |
115 | | - if val is None: |
116 | | - logger.info("Failed to evaluate struct field assignment") |
117 | | - return |
118 | | - logger.info(field_ptr) |
119 | | - builder.store(val[0], field_ptr) |
120 | | - logger.info(f"Assigned to struct field {var_name}.{field_name}") |
121 | | - return |
| 91 | + # Unsupported target type |
| 92 | + logger.error(f"Unsupported assignment target: {ast.dump(target)}") |
122 | 93 |
|
123 | 94 |
|
124 | 95 | def handle_cond( |
|
0 commit comments