You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

97 lines
2.7 KiB

(*
* Copyright (c) 2009 - 2013 Monoidics ltd.
* Copyright (c) 2013 - present Facebook, Inc.
* All rights reserved.
*
* This source code is licensed under the BSD style license found in the
* LICENSE file in the root directory of this source tree. An additional grant
* of patent rights can be found in the PATENTS file in the same directory.
*)
open! Utils
(** This module handles buckets of memory leaks in Objective-C/C++ *)
let objc_arc_flag = "objc_arc"
let bucket_to_message bucket =
match bucket with
| `MLeak_cf -> "[CF]"
| `MLeak_arc -> "[ARC]"
| `MLeak_no_arc -> "[NO ARC]"
| `MLeak_cpp -> "[CPP]"
| `MLeak_unknown -> "[UNKNOWN ORIGIN]"
let compare_mleak_bucket =
[%compare: [ `MLeak_all | `MLeak_arc | `MLeak_cf | `MLeak_cpp | `MLeak_no_arc | `MLeak_unknown ]]
let mleak_bucket_eq b1 b2 =
compare_mleak_bucket b1 b2 = 0
let contains_all =
IList.mem mleak_bucket_eq `MLeak_all Config.ml_buckets
let contains_cf =
IList.mem mleak_bucket_eq `MLeak_cf Config.ml_buckets
let contains_arc =
IList.mem mleak_bucket_eq `MLeak_arc Config.ml_buckets
let contains_narc =
IList.mem mleak_bucket_eq `MLeak_no_arc Config.ml_buckets
let contains_cpp =
IList.mem mleak_bucket_eq `MLeak_cpp Config.ml_buckets
let contains_unknown_origin =
IList.mem mleak_bucket_eq `MLeak_unknown Config.ml_buckets
let should_raise_leak_cf typ =
if contains_cf then
Objc_models.is_core_lib_type typ
else false
let should_raise_leak_arc () =
if contains_arc then
!Config.arc_mode
else false
let should_raise_leak_no_arc () =
if contains_narc then
not (!Config.arc_mode)
else false
let should_raise_leak_unknown_origin =
contains_unknown_origin
let ml_bucket_unknown_origin =
bucket_to_message `MLeak_unknown
(* Returns whether a memory leak should be raised for a C++ object.*)
(* If ml_buckets contains cpp, then check leaks from C++ objects. *)
let should_raise_cpp_leak =
if contains_cpp then
Some (bucket_to_message `MLeak_cpp)
else None
(* Returns whether a memory leak should be raised. *)
(* If cf is passed, then check leaks from Core Foundation. *)
(* If arc is passed, check leaks from code that compiles with arc*)
(* If no arc is passed check the leaks from code that compiles without arc *)
let should_raise_objc_leak typ =
if Config.ml_buckets = [] || contains_all then Some ""
else if should_raise_leak_cf typ then Some (bucket_to_message `MLeak_cf)
else if should_raise_leak_arc () then Some (bucket_to_message `MLeak_arc)
else if should_raise_leak_no_arc () then Some (bucket_to_message `MLeak_no_arc)
else None
(*
let bucket_to_string bucket =
match bucket with
| MLeak_cf -> "Core Foundation"
| MLeak_arc -> "Arc"
| MLeak_no_arc -> "No arc"
| MLeak_cpp -> "Cpp"
| MLeak_unknown -> "Unknown origin"
*)