@ -1027,72 +1027,76 @@ let calc_typestate_after_call find_canonical_duplicate calls_this checks tenv id
let typecheck_sil_call_function find_canonical_duplicate checks tenv instr_ref typestate idenv
~ callee_pname ~ curr_pname curr_pdesc curr_annotated_signature calls_this ~ nullsafe_mode
ret_id_typ etl_ loc callee_pname_java cflags node =
let callee_attributes =
match PatternMatch . lookup_attributes tenv callee_pname with
| Some proc_attributes ->
proc_attributes
| None ->
let formals =
List . mapi
~ f : ( fun i ( _ , typ ) ->
let arg =
if Int . equal i 0 && not ( Procname . Java . is_static callee_pname_java ) then
Mangled . this
else Printf . sprintf " arg%d " i | > Mangled . from_string
in
( arg , typ ) )
etl_
in
let ret_type = Procname . Java . get_return_typ callee_pname_java in
let proc_attributes =
{ ( ProcAttributes . default ( SourceFile . invalid _ _ FILE__ ) callee_pname ) with
ProcAttributes . formals
; ret_type }
L . d_with_indent ~ name : " typecheck_sil_call_function " ( fun () ->
let callee_attributes =
match PatternMatch . lookup_attributes tenv callee_pname with
| Some proc_attributes ->
proc_attributes
| None ->
let formals =
List . mapi
~ f : ( fun i ( _ , typ ) ->
let arg =
if Int . equal i 0 && not ( Procname . Java . is_static callee_pname_java ) then
Mangled . this
else Printf . sprintf " arg%d " i | > Mangled . from_string
in
( arg , typ ) )
etl_
in
let ret_type = Procname . Java . get_return_typ callee_pname_java in
let proc_attributes =
{ ( ProcAttributes . default ( SourceFile . invalid _ _ FILE__ ) callee_pname ) with
ProcAttributes . formals
; ret_type }
in
proc_attributes
in
let etl = drop_unchecked_params calls_this curr_pname callee_attributes etl_ in
let call_params , typestate1 =
let handle_et ( e1 , t1 ) ( etl1 , typestate1 ) =
typecheck_expr_for_errors ~ nullsafe_mode find_canonical_duplicate curr_pdesc calls_this
checks tenv node instr_ref typestate e1 loc ;
let e2 =
convert_complex_exp_to_pvar tenv idenv curr_pname curr_annotated_signature
~ is_assignment : false ~ node ~ original_node : node e1 typestate1 loc
in
( ( ( e1 , e2 ) , t1 ) :: etl1 , typestate1 )
in
proc_attributes
in
let etl = drop_unchecked_params calls_this curr_pname callee_attributes etl_ in
let call_params , typestate1 =
let handle_et ( e1 , t1 ) ( etl1 , typestate1 ) =
typecheck_expr_for_errors ~ nullsafe_mode find_canonical_duplicate curr_pdesc calls_this checks
tenv node instr_ref typestate e1 loc ;
let e2 =
convert_complex_exp_to_pvar tenv idenv curr_pname curr_annotated_signature
~ is_assignment : false ~ node ~ original_node : node e1 typestate1 loc
List . fold_right ~ f : handle_et etl ~ init : ( [] , typestate )
in
( ( ( e1 , e2 ) , t1 ) :: etl1 , typestate1 )
in
List . fold_right ~ f : handle_et etl ~ init : ( [] , typestate )
in
let pname = callee_attributes . ProcAttributes . proc_name in
let is_trusted_callee =
let caller_nullsafe_mode = NullsafeMode . of_procname tenv curr_pname in
let callee_class = Procname . get_class_type_name pname in
Option . value_map callee_class
~ f : ( NullsafeMode . is_trusted_name caller_nullsafe_mode )
~ default : false
in
let callee_annotated_signature =
Models . get_modelled_annotated_signature ~ is_trusted_callee tenv callee_attributes
in
let signature_params =
drop_unchecked_signature_params callee_attributes callee_annotated_signature
in
let is_anonymous_inner_class_constructor =
Procname . Java . is_anonymous_inner_class_constructor_exn callee_pname_java
in
let do_return ( ret_ta , ret_typ ) typestate' =
let mk_return_range () = ( ret_typ , ret_ta ) in
let id = fst ret_id_typ in
TypeState . add_id id ( mk_return_range () ) typestate' ~ descr : " typecheck_sil_call_function "
in
let typestate_after_call , finally_resolved_ret =
calc_typestate_after_call find_canonical_duplicate calls_this checks tenv idenv instr_ref
signature_params cflags call_params ~ is_anonymous_inner_class_constructor
~ callee_annotated_signature ~ callee_attributes ~ callee_pname ~ callee_pname_java ~ curr_pname
~ curr_pdesc ~ curr_annotated_signature ~ nullsafe_mode ~ typestate ~ typestate1 loc node
in
do_return finally_resolved_ret typestate_after_call
let pname = callee_attributes . ProcAttributes . proc_name in
let is_trusted_callee =
let caller_nullsafe_mode = NullsafeMode . of_procname tenv curr_pname in
let callee_class = Procname . get_class_type_name pname in
Option . value_map callee_class
~ f : ( NullsafeMode . is_trusted_name caller_nullsafe_mode )
~ default : false
in
let callee_annotated_signature =
Models . get_modelled_annotated_signature ~ is_trusted_callee tenv callee_attributes
in
if Config . write_html then
L . d_printfln " Callee signature: %a " ( AnnotatedSignature . pp pname ) callee_annotated_signature ;
let signature_params =
drop_unchecked_signature_params callee_attributes callee_annotated_signature
in
let is_anonymous_inner_class_constructor =
Procname . Java . is_anonymous_inner_class_constructor_exn callee_pname_java
in
let do_return ( ret_ta , ret_typ ) typestate' =
let mk_return_range () = ( ret_typ , ret_ta ) in
let id = fst ret_id_typ in
TypeState . add_id id ( mk_return_range () ) typestate' ~ descr : " typecheck_sil_call_function "
in
let typestate_after_call , finally_resolved_ret =
calc_typestate_after_call find_canonical_duplicate calls_this checks tenv idenv instr_ref
signature_params cflags call_params ~ is_anonymous_inner_class_constructor
~ callee_annotated_signature ~ callee_attributes ~ callee_pname ~ callee_pname_java
~ curr_pname ~ curr_pdesc ~ curr_annotated_signature ~ nullsafe_mode ~ typestate ~ typestate1
loc node
in
do_return finally_resolved_ret typestate_after_call )
(* * Typecheck an instruction. *)