Skip to content

Commit 95d63d9

Browse files
committed
Add _handle_or_or in expr_pass
1 parent 1f96bab commit 95d63d9

File tree

1 file changed

+50
-1
lines changed

1 file changed

+50
-1
lines changed

pythonbpf/expr_pass.py

Lines changed: 50 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -369,7 +369,56 @@ def _handle_and_op(func, builder, expr, local_sym_tab, map_sym_tab, structs_sym_
369369

370370

371371
def _handle_or_op(func, builder, expr, local_sym_tab, map_sym_tab, structs_sym_tab):
372-
pass
372+
"""Handle `or` boolean operations."""
373+
374+
logger.debug(f"Handling 'or' operator with {len(expr.values)} operands")
375+
376+
merge_block = func.append_basic_block(name="or.merge")
377+
true_block = func.append_basic_block(name="or.true")
378+
379+
incoming_values = []
380+
381+
for i, value in enumerate(expr.values):
382+
is_last = i == len(expr.values) - 1
383+
384+
# Evaluate current operand
385+
operand_result = eval_expr(
386+
func, None, builder, value, local_sym_tab, map_sym_tab, structs_sym_tab
387+
)
388+
if operand_result is None:
389+
logger.error(f"Failed to evaluate operand {i} in 'or' expression")
390+
return None
391+
392+
operand_val, operand_type = operand_result
393+
394+
# Convert to boolean if needed
395+
operand_bool = convert_to_bool(builder, operand_val)
396+
current_block = builder.block
397+
398+
if is_last:
399+
# Last operand: result is this value
400+
builder.branch(merge_block)
401+
incoming_values.append((operand_bool, current_block))
402+
else:
403+
# Not last: check if false, continue or short-circuit
404+
next_check = func.append_basic_block(name=f"or.check_{i + 1}")
405+
builder.cbranch(operand_bool, true_block, next_check)
406+
builder.position_at_end(next_check)
407+
408+
# True block: short-circuit with true
409+
builder.position_at_end(true_block)
410+
builder.branch(merge_block)
411+
true_value = ir.Constant(ir.IntType(1), 1)
412+
incoming_values.append((true_value, true_block))
413+
414+
# Merge block: phi node
415+
builder.position_at_end(merge_block)
416+
phi = builder.phi(ir.IntType(1), name="or.result")
417+
for val, block in incoming_values:
418+
phi.add_incoming(val, block)
419+
420+
logger.debug(f"Generated 'or' with {len(incoming_values)} incoming values")
421+
return phi, ir.IntType(1)
373422

374423

375424
def _handle_boolean_op(

0 commit comments

Comments
 (0)