1## 2# Copyright (c) 2023 Apple Inc. All rights reserved. 3# 4# @APPLE_OSREFERENCE_LICENSE_HEADER_START@ 5# 6# This file contains Original Code and/or Modifications of Original Code 7# as defined in and that are subject to the Apple Public Source License 8# Version 2.0 (the 'License'). You may not use this file except in 9# compliance with the License. The rights granted to you under the License 10# may not be used to create, or enable the creation or redistribution of, 11# unlawful or unlicensed copies of an Apple operating system, or to 12# circumvent, violate, or enable the circumvention or violation of, any 13# terms of an Apple operating system software license agreement. 14# 15# Please obtain a copy of the License at 16# http://www.opensource.apple.com/apsl/ and read it before using this file. 17# 18# The Original Code and all software distributed under the License are 19# distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER 20# EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, 21# INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, 22# FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. 23# Please see the License for the specific language governing rights and 24# limitations under the License. 25# 26# @APPLE_OSREFERENCE_LICENSE_HEADER_END@ 27## 28 29from abc import ABCMeta 30 31import lldb 32 33 34def visit_type(sbtype: lldb.SBType, offs = 0): 35 """ Recursively visit all members of a SBType instance. """ 36 37 # Yield simple types back 38 if sbtype.GetNumberOfFields() == 0: 39 yield (sbtype, 0) 40 41 for t in sbtype.get_members_array(): 42 if t.GetType().IsAnonymousType(): 43 yield from visit_type(t.GetType(), offs + t.GetOffsetInBytes()) 44 else: 45 yield (t, offs + t.GetOffsetInBytes()) 46 47# 48# For now this is a very simple type lookup which does not take into 49# account any complex scenarios (multiple different definitions or 50# symbol scope). 51# 52def lookup_type(sbtype): 53 """ Look up SBType by name. """ 54 55 # Pass through if we have type already. 56 if isinstance(sbtype, lldb.SBType): 57 return sbtype 58 59 # Lookup SBType by name. 60 rettype = lldb.debugger.GetSelectedTarget().FindFirstType(sbtype) 61 if not rettype.IsValid(): 62 raise AttributeError(f"No such type found ({sbtype})") 63 64 return rettype 65 66 67class Singleton(ABCMeta): 68 """ Meta class for creation of singleton instances. """ 69 70 _instances = {} 71 72 def __call__(cls, *args, **kwargs): 73 if cls not in cls._instances: 74 cls._instances[cls] = super(Singleton, cls).__call__(*args, **kwargs) 75 return cls._instances[cls] 76