Skip to content

Commit 64e44d0

Browse files
committed
Use handle_struct_field_assignment in handle_assign
1 parent 3ad1b73 commit 64e44d0

File tree

1 file changed

+11
-40
lines changed

1 file changed

+11
-40
lines changed

pythonbpf/functions/functions_pass.py

Lines changed: 11 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,10 @@
1010
)
1111
from pythonbpf.type_deducer import ctypes_to_ir
1212
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+
)
1417

1518
from .return_utils import _handle_none_return, _handle_xdp_return, _is_xdp_name
1619

@@ -78,47 +81,15 @@ def handle_assign(
7881
logger.error(f"Failed to handle assignment to {var_name}")
7982
return
8083

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+
)
8489
return
85-
var_name = target.id if isinstance(target, ast.Name) else target.value.id
86-
rval = stmt.value
8790

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

12394

12495
def handle_cond(

0 commit comments

Comments
 (0)