|
|
|
@ -96,33 +96,25 @@ module CFrontend_decl_funct (T : CModule_type.CTranslation) : CModule_type.CFron
|
|
|
|
|
| Some body ->
|
|
|
|
|
let procname = ms.CMethodSignature.name in
|
|
|
|
|
let return_param_typ_opt = ms.CMethodSignature.return_param_typ in
|
|
|
|
|
let ms', procname' =
|
|
|
|
|
if is_destructor then (
|
|
|
|
|
(* For a destructor we create two procedures: a destructor wrapper and an inner destructor *)
|
|
|
|
|
(* A destructor wrapper is called from the outside, i.e. for destructing local variables and fields *)
|
|
|
|
|
(* The destructor wrapper calls the inner destructor which has the actual body *)
|
|
|
|
|
if
|
|
|
|
|
CMethod_trans.create_local_procdesc ~set_objc_accessor_attr trans_unit_ctx cfg tenv
|
|
|
|
|
ms [body] []
|
|
|
|
|
then
|
|
|
|
|
add_method trans_unit_ctx tenv cfg curr_class procname body ms return_param_typ_opt
|
|
|
|
|
None extra_instrs ~is_destructor_wrapper:true ;
|
|
|
|
|
let new_method_name =
|
|
|
|
|
Config.clang_inner_destructor_prefix ^ Procname.get_method procname
|
|
|
|
|
in
|
|
|
|
|
let ms' =
|
|
|
|
|
{ms with name= Procname.objc_cpp_replace_method_name procname new_method_name}
|
|
|
|
|
in
|
|
|
|
|
let procname' = ms'.CMethodSignature.name in
|
|
|
|
|
(ms', procname') )
|
|
|
|
|
else (ms, procname)
|
|
|
|
|
let add_method_if_create_procdesc ms procname ~is_destructor_wrapper =
|
|
|
|
|
if
|
|
|
|
|
CMethod_trans.create_local_procdesc ~set_objc_accessor_attr trans_unit_ctx cfg tenv ms
|
|
|
|
|
[body] []
|
|
|
|
|
then
|
|
|
|
|
add_method trans_unit_ctx tenv cfg curr_class procname body ms return_param_typ_opt
|
|
|
|
|
None extra_instrs ~is_destructor_wrapper
|
|
|
|
|
in
|
|
|
|
|
if
|
|
|
|
|
CMethod_trans.create_local_procdesc ~set_objc_accessor_attr trans_unit_ctx cfg tenv ms'
|
|
|
|
|
[body] []
|
|
|
|
|
then
|
|
|
|
|
add_method trans_unit_ctx tenv cfg curr_class procname' body ms' return_param_typ_opt
|
|
|
|
|
None extra_instrs ~is_destructor_wrapper:false
|
|
|
|
|
ignore (add_method_if_create_procdesc ms procname ~is_destructor_wrapper:is_destructor) ;
|
|
|
|
|
if is_destructor then
|
|
|
|
|
(* For a destructor we create two procedures: a destructor wrapper and an inner destructor *)
|
|
|
|
|
(* A destructor wrapper is called from the outside, i.e. for destructing local variables and fields *)
|
|
|
|
|
(* The destructor wrapper calls the inner destructor which has the actual body *)
|
|
|
|
|
let new_method_name =
|
|
|
|
|
Config.clang_inner_destructor_prefix ^ Procname.get_method procname
|
|
|
|
|
in
|
|
|
|
|
let new_procname = Procname.objc_cpp_replace_method_name procname new_method_name in
|
|
|
|
|
let new_ms = {ms with name= new_procname} in
|
|
|
|
|
add_method_if_create_procdesc new_ms new_procname ~is_destructor_wrapper:false
|
|
|
|
|
| None ->
|
|
|
|
|
if set_objc_accessor_attr then
|
|
|
|
|
ignore
|
|
|
|
|