@@ -391,17 +391,31 @@ def process_stmt(
391391 isinstance (stmt .value , ast .Call )
392392 and isinstance (stmt .value .func , ast .Name )
393393 and len (stmt .value .args ) == 1
394- and isinstance (stmt .value .args [0 ], ast .Constant )
395- and isinstance (stmt .value .args [0 ].value , int )
396394 ):
397- call_type = stmt .value .func .id
398- if ctypes_to_ir (call_type ) != ret_type :
399- raise ValueError (
400- "Return type mismatch: expected"
401- f"{ ctypes_to_ir (call_type )} , got { call_type } "
395+ if isinstance (stmt .value .args [0 ], ast .Constant ) and isinstance (
396+ stmt .value .args [0 ].value , int
397+ ):
398+ call_type = stmt .value .func .id
399+ if ctypes_to_ir (call_type ) != ret_type :
400+ raise ValueError (
401+ "Return type mismatch: expected"
402+ f"{ ctypes_to_ir (call_type )} , got { call_type } "
403+ )
404+ else :
405+ builder .ret (ir .Constant (ret_type , stmt .value .args [0 ].value ))
406+ did_return = True
407+ elif isinstance (stmt .value .args [0 ], ast .BinOp ):
408+ # TODO: Should be routed through eval_expr
409+ val = handle_binary_op (
410+ stmt .value .args [0 ], module , builder , None , local_sym_tab
402411 )
403- else :
404- builder .ret (ir .Constant (ret_type , stmt .value .args [0 ].value ))
412+ if val is None :
413+ raise ValueError ("Failed to evaluate return expression" )
414+ if val [1 ] != ret_type :
415+ raise ValueError (
416+ "Return type mismatch: expected" f"{ ret_type } , got { val [1 ]} "
417+ )
418+ builder .ret (val [0 ])
405419 did_return = True
406420 elif isinstance (stmt .value , ast .Name ):
407421 if stmt .value .id == "XDP_PASS" :
0 commit comments