Skip to content

Commit c56928b

Browse files
committed
Add create_targets_and_rvals, use it in handle_assign to enable tuple assignment
1 parent dd3fc74 commit c56928b

File tree

2 files changed

+54
-52
lines changed

2 files changed

+54
-52
lines changed

pythonbpf/allocation_pass.py

Lines changed: 15 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -22,24 +22,27 @@ def __iter__(self):
2222
yield self.metadata
2323

2424

25-
def handle_assign_allocation(builder, stmt, local_sym_tab, structs_sym_tab):
26-
"""Handle memory allocation for assignment statements."""
27-
28-
logger.info(f"Handling assignment for allocation: {ast.dump(stmt)}")
29-
30-
# NOTE: Support multi-target assignments (e.g.: a, b = 1, 2)
25+
def create_targets_and_rvals(stmt):
26+
"""Create lists of targets and right-hand values from an assignment statement."""
3127
if isinstance(stmt.targets[0], ast.Tuple):
3228
if not isinstance(stmt.value, ast.Tuple):
3329
logger.warning("Mismatched multi-target assignment, skipping allocation")
3430
return
35-
targets = stmt.targets[0].elts
36-
rvals = stmt.value.elts
31+
targets, rvals = stmt.targets[0].elts, stmt.value.elts
3732
if len(targets) != len(rvals):
38-
logger.warning("Mismatched multi-target assignment, skipping allocation")
33+
logger.warning("length of LHS != length of RHS, skipping allocation")
3934
return
40-
else:
41-
targets = stmt.targets
42-
rvals = [stmt.value]
35+
return targets, rvals
36+
return stmt.targets, [stmt.value]
37+
38+
39+
def handle_assign_allocation(builder, stmt, local_sym_tab, structs_sym_tab):
40+
"""Handle memory allocation for assignment statements."""
41+
42+
logger.info(f"Handling assignment for allocation: {ast.dump(stmt)}")
43+
44+
# NOTE: Support multi-target assignments (e.g.: a, b = 1, 2)
45+
targets, rvals = create_targets_and_rvals(stmt)
4346

4447
for target, rval in zip(targets, rvals):
4548
# Skip non-name targets (e.g., struct field assignments)

pythonbpf/functions/functions_pass.py

Lines changed: 39 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,11 @@
1212
handle_variable_assignment,
1313
handle_struct_field_assignment,
1414
)
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+
)
1620

1721
from .return_utils import handle_none_return, handle_xdp_return, is_xdp_name
1822
from .function_metadata import get_probe_string, is_global_function, infer_return_type
@@ -140,48 +144,43 @@ def handle_assign(
140144
):
141145
"""Handle assignment statements in the function body."""
142146

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)
151149

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
168167

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
182181

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)}")
185184

186185

187186
def handle_cond(

0 commit comments

Comments
 (0)