@@ -3485,7 +3485,59 @@ function refine_partial_type(@nospecialize t)
3485
3485
return t
3486
3486
end
3487
3487
3488
+ abstract_eval_nonlinearized_foreigncall_name (interp:: AbstractInterpreter , e, sstate:: StatementState , sv:: IRInterpretationState ) = nothing
3489
+
3490
+ function abstract_eval_nonlinearized_foreigncall_name (interp:: AbstractInterpreter , e, sstate:: StatementState , sv:: AbsIntState )
3491
+ if isexpr (e, :call )
3492
+ n = length (e. args)
3493
+ argtypes = Vector {Any} (undef, n)
3494
+ callresult = Future {CallMeta} ()
3495
+ i:: Int = 1
3496
+ nextstate:: UInt8 = 0x0
3497
+ local ai, res
3498
+ function evalargs (interp, sv)
3499
+ if nextstate === 0x1
3500
+ @goto state1
3501
+ elseif nextstate === 0x2
3502
+ @goto state2
3503
+ end
3504
+ while i <= n
3505
+ ai = abstract_eval_nonlinearized_foreigncall_name (interp, e. args[i], sstate, sv)
3506
+ if ! isready (ai)
3507
+ nextstate = 0x1
3508
+ return false
3509
+ @label state1
3510
+ end
3511
+ argtypes[i] = ai[]. rt
3512
+ i += 1
3513
+ end
3514
+ res = abstract_call (interp, ArgInfo (e. args, argtypes), sstate, sv)
3515
+ if ! isready (res)
3516
+ nextstate = 0x2
3517
+ return false
3518
+ @label state2
3519
+ end
3520
+ callresult[] = res[]
3521
+ return true
3522
+ end
3523
+ evalargs (interp, sv) || push! (sv. tasks, evalargs)
3524
+ return callresult
3525
+ else
3526
+ return Future (abstract_eval_basic_statement (interp, e, sstate, sv))
3527
+ end
3528
+ end
3529
+
3488
3530
function abstract_eval_foreigncall (interp:: AbstractInterpreter , e:: Expr , sstate:: StatementState , sv:: AbsIntState )
3531
+ callee = e. args[1 ]
3532
+ if isexpr (callee, :call ) && length (callee. args) > 1 && callee. args[1 ] == GlobalRef (Core, :tuple )
3533
+ # NOTE these expressions are not properly linearized
3534
+ abstract_eval_nonlinearized_foreigncall_name (interp, callee. args[2 ], sstate, sv)
3535
+ if length (callee. args) > 2
3536
+ abstract_eval_nonlinearized_foreigncall_name (interp, callee. args[3 ], sstate, sv)
3537
+ end
3538
+ else
3539
+ abstract_eval_value (interp, callee, sstate, sv)
3540
+ end
3489
3541
mi = frame_instance (sv)
3490
3542
t = sp_type_rewrap (e. args[2 ], mi, true )
3491
3543
for i = 3 : length (e. args)
0 commit comments