(* * 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! IStd (** This module handles C or Objective-C types for which there are special rules for memory management *) (** This module models special c struct types from the Apple's Core Foundation libraries for which there are particular rules for memory management. *) module Core_foundation_model = struct let core_foundation = [ "__CFArray"; "__CFAttributedString"; "__CFBag"; "__CFNull"; "__CFAllocator"; "__CFBinaryHeap"; "__CFBitVector"; "__CFBundle"; "__CFCalendar"; "__CFCharacterSet"; "__CFDate"; "__CFDateFormatter"; "__CFDictionary"; "__CFError"; "__CFFileDescriptor"; "__CFFileSecurity"; "__CFLocale"; "__CFMachPort"; "__CFMessagePort"; "__CFNotificationCenter"; "__CFBoolean"; "__CFNumber"; "__CFNumberFormatter"; "__CFPlugInInstance"; "__CFReadStream"; "__CFWriteStream"; "__CFRunLoop"; "__CFRunLoopSource"; "__CFRunLoopObserver"; "__CFRunLoopTimer"; "__CFSet"; "__CFStringTokenizer"; "__CFSocket"; "__CFReadStream"; "__CFWriteStream"; "__CFTimeZone"; "__CFTree"; "__CFURLEnumerator"; "__CFUUID" ] let cf_network = [ "_CFHTTPAuthentication"; "__CFHTTPMessage"; "__CFHost"; "__CFNetDiagnostic"; "__CFNetService"; "__CFNetServiceMonitor"; "__CFNetServiceBrowser" ] let core_media = [ "OpaqueCMBlockBuffer"; "opaqueCMBufferQueue"; "opaqueCMBufferQueueTriggerToken"; "opaqueCMFormatDescription"; "OpaqueCMMemoryPool"; "opaqueCMSampleBuffer"; "opaqueCMSimpleQueue"; "OpaqueCMClock"; "OpaqueCMTimebase" ] let core_text = [ "__CTFont"; "__CTFontCollection"; "__CTFontDescriptor"; "__CTFrame"; "__CTFramesetter"; "__CTGlyphInfo"; "__CTLine"; "__CTParagraphStyle"; "__CTRubyAnnotation"; "__CTRun"; "__CTRunDelegate"; "__CTTextTab"; "__CTTypesetter" ] let core_video = [ "__CVBuffer"; "__CVMetalTextureCache"; "__CVOpenGLESTextureCache"; "__CVPixelBufferPool" ] let image_io = [ "CGImageDestination"; "CGImageMetadata"; "CGImageMetadataTag"; "CGImageSource" ] let security = [ "__SecCertificate"; "__SecIdentity"; "__SecKey"; "__SecPolicy"; "__SecAccessControl"; "__SecRandom"; "__SecCode"; "__SecTrust"; "__SecRequirement" ] let system_configuration = [ "__SCDynamicStore"; "__SCNetworkInterface"; "__SCBondStatus"; "__SCNetworkProtocol"; "__SCNetworkService"; "__SCNetworkSet"; "__SCNetworkConnection"; "__SCNetworkReachability"; "__SCPreferences" ] let core_graphics_types = [ "CGAffineTransform"; "CGBase"; "CGBitmapContext"; "CGColor"; "CGColorSpace"; "CGContext"; "CGDataConsumer"; "CGDataProvider"; "CGError"; "CGFont"; "CGFunction"; "CGGeometry"; "CGGradient"; "CGImage"; "CGLayer"; "CGPath"; "CGPattern"; "CGPDFArray"; "CGPDFContentStream"; "CGPDFContext"; "CGPDFDictionary"; "CGPDFDocument"; "CGPDFObject"; "CGPDFOperatorTable"; "CGPDFPage"; "CGPDFScanner"; "CGPDFStream"; "CGPDFString"; "CGShading" ] let core_foundation_types = core_foundation @ cf_network @ core_media @ core_text @ core_video @ image_io @ security @ system_configuration let copy = "Copy" let create = "Create" let cf_retain = "CFRetain" let cf_release = "CFRelease" let upper_release = "Release" let ref = "Ref" let cf_type = "CFTypeRef" type core_lib = | Core_foundation | Core_graphics let core_lib_to_type_list lib = match lib with | Core_foundation -> core_foundation_types | Core_graphics -> core_graphics_types let is_objc_memory_model_controlled o = List.mem ~equal:String.equal core_foundation_types o || List.mem ~equal:String.equal core_graphics_types o let rec is_core_lib lib typ = match typ.Typ.desc with | Typ.Tptr (styp, _ ) -> is_core_lib lib styp | Typ.Tstruct name -> let core_lib_types = core_lib_to_type_list lib in List.mem ~equal:String.equal core_lib_types (Typ.Name.name name) | _ -> false let is_core_foundation_type typ = is_core_lib Core_foundation typ let is_core_graphics_type typ = is_core_lib Core_graphics typ let is_core_lib_type typ = is_core_foundation_type typ || is_core_graphics_type typ let is_core_lib_create typ funct = is_core_lib_type typ && ((String.is_substring ~substring:create funct) || (String.is_substring ~substring:copy funct )) let function_arg_is_cftype typ = (String.is_substring ~substring:cf_type typ) let is_core_lib_retain typ funct = function_arg_is_cftype typ && String.equal funct cf_retain let is_core_lib_release typ funct = function_arg_is_cftype typ && String.equal funct cf_release let is_core_graphics_release typ funct = let f lib = String.equal funct (lib ^ upper_release) && String.is_substring ~substring:(lib ^ ref) typ in List.exists ~f core_graphics_types (* let function_arg_is_core_pgraphics typ = let res = (String.is_substring ~substring:cf_type typ) in res *) end let is_core_lib_type typ = Core_foundation_model.is_core_lib_type typ