method private wrap_type_if_needed ty =
match ty with
| TPtr(_elemty,attr) ->
let elemty = pointed_type ty in
if is_wrapper_type elemty then
Some ty
else if isStructOrUnionType elemty then
None
else if is_array_reference_type ty then
let size = constant_expr (reference_size ty) in
assert (not (!flatten_multi_dim_array && is_reference_type elemty));
Some(mkTRefArray(self#new_wrapper_for_type elemty,size,[]))
else if is_reference_type ty then
Some(mkTRef(self#new_wrapper_for_type elemty))
else
Some(TPtr(self#new_wrapper_for_type elemty,attr))
| TArray _ -> None
| TFun _ -> None
| TNamed(typeinfo,_attr) ->
begin match self#wrap_type_if_needed typeinfo.ttype with
| Some newtyp ->
typeinfo.ttype <- newtyp;
Some ty
| None -> None
end
| TComp(compinfo,_,_) ->
let field fi =
match self#wrap_type_if_needed fi.ftype with
| Some newtyp ->
fi.ftype <- newtyp
| None -> ()
in
List.iter field compinfo.cfields;
None
| TVoid _ | TInt _ | TFloat _ | TEnum _ | TBuiltin_va_list _ -> None