|
12 | 12 | handle_variable_assignment, |
13 | 13 | handle_struct_field_assignment, |
14 | 14 | ) |
15 | | -from pythonbpf.allocation_pass import handle_assign_allocation, allocate_temp_pool |
| 15 | +from pythonbpf.allocation_pass import ( |
| 16 | + handle_assign_allocation, |
| 17 | + allocate_temp_pool, |
| 18 | + create_targets_and_rvals, |
| 19 | +) |
16 | 20 |
|
17 | 21 | from .return_utils import handle_none_return, handle_xdp_return, is_xdp_name |
18 | 22 | from .function_metadata import get_probe_string, is_global_function, infer_return_type |
@@ -140,48 +144,43 @@ def handle_assign( |
140 | 144 | ): |
141 | 145 | """Handle assignment statements in the function body.""" |
142 | 146 |
|
143 | | - # TODO: Support this later |
144 | | - # GH #37 |
145 | | - if len(stmt.targets) != 1: |
146 | | - logger.error("Multi-target assignment is not supported for now") |
147 | | - return |
148 | | - |
149 | | - target = stmt.targets[0] |
150 | | - rval = stmt.value |
| 147 | + # NOTE: Support multi-target assignments (e.g.: a, b = 1, 2) |
| 148 | + targets, rvals = create_targets_and_rvals(stmt) |
151 | 149 |
|
152 | | - if isinstance(target, ast.Name): |
153 | | - # NOTE: Simple variable assignment case: x = 5 |
154 | | - var_name = target.id |
155 | | - result = handle_variable_assignment( |
156 | | - func, |
157 | | - module, |
158 | | - builder, |
159 | | - var_name, |
160 | | - rval, |
161 | | - local_sym_tab, |
162 | | - map_sym_tab, |
163 | | - structs_sym_tab, |
164 | | - ) |
165 | | - if not result: |
166 | | - logger.error(f"Failed to handle assignment to {var_name}") |
167 | | - return |
| 150 | + for target, rval in zip(targets, rvals): |
| 151 | + if isinstance(target, ast.Name): |
| 152 | + # NOTE: Simple variable assignment case: x = 5 |
| 153 | + var_name = target.id |
| 154 | + result = handle_variable_assignment( |
| 155 | + func, |
| 156 | + module, |
| 157 | + builder, |
| 158 | + var_name, |
| 159 | + rval, |
| 160 | + local_sym_tab, |
| 161 | + map_sym_tab, |
| 162 | + structs_sym_tab, |
| 163 | + ) |
| 164 | + if not result: |
| 165 | + logger.error(f"Failed to handle assignment to {var_name}") |
| 166 | + continue |
168 | 167 |
|
169 | | - if isinstance(target, ast.Attribute): |
170 | | - # NOTE: Struct field assignment case: pkt.field = value |
171 | | - handle_struct_field_assignment( |
172 | | - func, |
173 | | - module, |
174 | | - builder, |
175 | | - target, |
176 | | - rval, |
177 | | - local_sym_tab, |
178 | | - map_sym_tab, |
179 | | - structs_sym_tab, |
180 | | - ) |
181 | | - return |
| 168 | + if isinstance(target, ast.Attribute): |
| 169 | + # NOTE: Struct field assignment case: pkt.field = value |
| 170 | + handle_struct_field_assignment( |
| 171 | + func, |
| 172 | + module, |
| 173 | + builder, |
| 174 | + target, |
| 175 | + rval, |
| 176 | + local_sym_tab, |
| 177 | + map_sym_tab, |
| 178 | + structs_sym_tab, |
| 179 | + ) |
| 180 | + continue |
182 | 181 |
|
183 | | - # Unsupported target type |
184 | | - logger.error(f"Unsupported assignment target: {ast.dump(target)}") |
| 182 | + # Unsupported target type |
| 183 | + logger.error(f"Unsupported assignment target: {ast.dump(target)}") |
185 | 184 |
|
186 | 185 |
|
187 | 186 | def handle_cond( |
|
0 commit comments