diff options
author | Enrico Granata <egranata@apple.com> | 2012-03-13 21:52:00 +0000 |
---|---|---|
committer | Enrico Granata <egranata@apple.com> | 2012-03-13 21:52:00 +0000 |
commit | 3f1052b7cf882ab564c30067dae8a28efced58e6 (patch) | |
tree | b0fb26b99d2b6295bbdd4904699bbfd2fd043ad1 | |
parent | 08441ba45e1dcc1732038bfff7e3f95eb80c0d54 (diff) | |
download | bcm5719-llvm-3f1052b7cf882ab564c30067dae8a28efced58e6.tar.gz bcm5719-llvm-3f1052b7cf882ab564c30067dae8a28efced58e6.zip |
The Cocoa formatters now provide error messages for many of the common things-went-wrong situations. Previously they would say nothing or log failures to the Python console
llvm-svn: 152673
22 files changed, 545 insertions, 448 deletions
diff --git a/lldb/examples/summaries/cocoa/CFArray.py b/lldb/examples/summaries/cocoa/CFArray.py index 608efea7fbb..e9aca9d651a 100644 --- a/lldb/examples/summaries/cocoa/CFArray.py +++ b/lldb/examples/summaries/cocoa/CFArray.py @@ -1,3 +1,10 @@ +""" +LLDB AppKit formatters + +part of The LLVM Compiler Infrastructure +This file is distributed under the University of Illinois Open Source +License. See LICENSE.TXT for details. +""" # synthetic children provider for NSArray import lldb import ctypes @@ -29,7 +36,9 @@ class NSArrayKVC_SynthProvider: stream = lldb.SBStream() self.valobj.GetExpressionPath(stream) num_children_vo = self.valobj.CreateValueFromExpression("count","(int)[" + stream.GetData() + " count]"); - return num_children_vo.GetValueAsUnsigned(0) + if num_children_vo.IsValid(): + return num_children_vo.GetValueAsUnsigned(0) + return "<variable is not NSArray>" # much less functional than the other two cases below # just runs code to get to the count and then returns @@ -107,7 +116,8 @@ class NSArray_SynthProvider: def __init__(self, valobj, dict): self.valobj = valobj; self.adjust_for_architecture() - self.wrapper = self.make_wrapper(valobj,dict) + self.error = False + self.wrapper = self.make_wrapper() self.invalid = (self.wrapper == None) def num_children(self): @@ -122,54 +132,50 @@ class NSArray_SynthProvider: # this code acts as our defense against NULL and unitialized # NSArray pointers, which makes it much longer than it would be otherwise - def make_wrapper(self,valobj,dict): - global statistics - class_data = objc_runtime.ObjCRuntime(valobj) - if class_data.is_valid() == False: - statistics.metric_hit('invalid_pointer',valobj) - wrapper = None - return - class_data = class_data.read_class_data() - if class_data.is_valid() == False: - statistics.metric_hit('invalid_isa',valobj) - wrapper = None - return - if class_data.is_kvo(): - class_data = class_data.get_superclass() - if class_data.is_valid() == False: - statistics.metric_hit('invalid_isa',valobj) - wrapper = None - return + def make_wrapper(self): + if self.valobj.GetValueAsUnsigned() == 0: + self.error = True + return objc_runtime.InvalidPointer_Description(True) + else: + global statistics + class_data,wrapper = objc_runtime.Utilities.prepare_class_detection(self.valobj,statistics) + if wrapper: + self.error = True + return wrapper name_string = class_data.class_name() if name_string == '__NSArrayI': - wrapper = NSArrayI_SynthProvider(valobj, dict, class_data.sys_params) - statistics.metric_hit('code_notrun',valobj) + wrapper = NSArrayI_SynthProvider(self.valobj, dict, class_data.sys_params) + statistics.metric_hit('code_notrun',self.valobj) elif name_string == '__NSArrayM': - wrapper = NSArrayM_SynthProvider(valobj, dict, class_data.sys_params) - statistics.metric_hit('code_notrun',valobj) + wrapper = NSArrayM_SynthProvider(self.valobj, dict, class_data.sys_params) + statistics.metric_hit('code_notrun',self.valobj) elif name_string == '__NSCFArray': - wrapper = NSArrayCF_SynthProvider(valobj, dict, class_data.sys_params) - statistics.metric_hit('code_notrun',valobj) + wrapper = NSArrayCF_SynthProvider(self.valobj, dict, class_data.sys_params) + statistics.metric_hit('code_notrun',self.valobj) else: - wrapper = NSArrayKVC_SynthProvider(valobj, dict, class_data.sys_params) - statistics.metric_hit('unknown_class',str(valobj) + " seen as " + name_string) + wrapper = NSArrayKVC_SynthProvider(self.valobj, dict, class_data.sys_params) + statistics.metric_hit('unknown_class',str(self.valobj) + " seen as " + name_string) return wrapper; def CFArray_SummaryProvider (valobj,dict): provider = NSArray_SynthProvider(valobj,dict); if provider.invalid == False: - try: - summary = int(provider.num_children()); - except: - summary = None - if summary == None: - summary = 'no valid array here' - else: - # we format it like it were a CFString to make it look the same as the summary from Xcode - summary = '@"' + str(summary) + (" objects" if summary > 1 else " object") + '"' - return summary - return '' + if provider.error == True: + return provider.wrapper.message() + try: + summary = int(provider.num_children()); + except: + summary = None + if summary == None: + summary = '<variable is not NSArray>' + elif isinstance(summary,basestring): + pass + else: + # we format it like it were a CFString to make it look the same as the summary from Xcode + summary = '@"' + str(summary) + (" objects" if summary != 1 else " object") + '"' + return summary + return 'Summary Unavailable' def __lldb_init_module(debugger,dict): debugger.HandleCommand("type summary add -F CFArray.CFArray_SummaryProvider NSArray CFArrayRef CFMutableArrayRef") diff --git a/lldb/examples/summaries/cocoa/CFBag.py b/lldb/examples/summaries/cocoa/CFBag.py index e0cfd3dece1..1ddb943a38a 100644 --- a/lldb/examples/summaries/cocoa/CFBag.py +++ b/lldb/examples/summaries/cocoa/CFBag.py @@ -1,3 +1,10 @@ +""" +LLDB AppKit formatters + +part of The LLVM Compiler Infrastructure +This file is distributed under the University of Illinois Open Source +License. See LICENSE.TXT for details. +""" # summary provider for CFBag import lldb import ctypes @@ -61,43 +68,33 @@ class CFBagUnknown_SummaryProvider: def length(self): stream = lldb.SBStream() self.valobj.GetExpressionPath(stream) - num_children_vo = self.valobj.CreateValueFromExpression("count","(int)CFBagGetCount(" + stream.GetData() + " )"); - return num_children_vo.GetValueAsUnsigned(0) + num_children_vo = self.valobj.CreateValueFromExpression("count","(int)CFBagGetCount(" + stream.GetData() + " )") + if num_children_vo.IsValid(): + return num_children_vo.GetValueAsUnsigned(0) + return "<variable is not CFBag>" def GetSummary_Impl(valobj): global statistics - class_data = objc_runtime.ObjCRuntime(valobj) - if class_data.is_valid() == False: - statistics.metric_hit('invalid_pointer',valobj) - wrapper = None - return - class_data = class_data.read_class_data() - if class_data.is_valid() == False: - statistics.metric_hit('invalid_isa',valobj) - wrapper = None - return - if class_data.is_kvo(): - class_data = class_data.get_superclass() - if class_data.is_valid() == False: - statistics.metric_hit('invalid_isa',valobj) - wrapper = None - return + class_data,wrapper = objc_runtime.Utilities.prepare_class_detection(valobj,statistics) + if wrapper: + return wrapper name_string = class_data.class_name() actual_name = name_string - if name_string == '__NSCFType': + if class_data.is_cftype(): # CFBag does not expose an actual NSWrapper type, so we have to check that this is # an NSCFType and then check we are a pointer-to __CFBag valobj_type = valobj.GetType() if valobj_type.IsValid() and valobj_type.IsPointerType(): - pointee_type = valobj_type.GetPointeeType() - actual_name = pointee_type.GetName() - if actual_name == '__CFBag' or \ - actual_name == 'const struct __CFBag': - wrapper = CFBagRef_SummaryProvider(valobj, class_data.sys_params) - statistics.metric_hit('code_notrun',valobj) - return wrapper + valobj_type = valobj_type.GetPointeeType() + if valobj_type.IsValid(): + actual_name = valobj_type.GetName() + if actual_name == '__CFBag' or \ + actual_name == 'const struct __CFBag': + wrapper = CFBagRef_SummaryProvider(valobj, class_data.sys_params) + statistics.metric_hit('code_notrun',valobj) + return wrapper wrapper = CFBagUnknown_SummaryProvider(valobj, class_data.sys_params) statistics.metric_hit('unknown_class',str(valobj) + " seen as " + actual_name) return wrapper; @@ -105,6 +102,8 @@ def GetSummary_Impl(valobj): def CFBag_SummaryProvider (valobj,dict): provider = GetSummary_Impl(valobj); if provider != None: + if isinstance(provider,objc_runtime.SpecialSituation_Description): + return provider.message() try: summary = provider.length(); except: @@ -115,7 +114,9 @@ def CFBag_SummaryProvider (valobj,dict): # (if counts start looking weird, then most probably # the mask needs to be changed) if summary == None: - summary = 'no valid set here' + summary = '<variable is not CFBag>' + elif isinstance(summary,basestring): + pass else: if provider.sys_params.is_64_bit: summary = summary & ~0x1fff000000000000 @@ -124,7 +125,7 @@ def CFBag_SummaryProvider (valobj,dict): else: summary = '@"' + str(summary) + ' values"' return summary - return '' + return 'Summary Unavailable' def __lldb_init_module(debugger,dict): debugger.HandleCommand("type summary add -F CFBag.CFBag_SummaryProvider CFBagRef CFMutableBagRef") diff --git a/lldb/examples/summaries/cocoa/CFBinaryHeap.py b/lldb/examples/summaries/cocoa/CFBinaryHeap.py index 60f42d3e368..eb21bbfa969 100644 --- a/lldb/examples/summaries/cocoa/CFBinaryHeap.py +++ b/lldb/examples/summaries/cocoa/CFBinaryHeap.py @@ -1,3 +1,10 @@ +""" +LLDB AppKit formatters + +part of The LLVM Compiler Infrastructure +This file is distributed under the University of Illinois Open Source +License. See LICENSE.TXT for details. +""" # summary provider for CFBinaryHeap import lldb import ctypes @@ -59,39 +66,31 @@ class CFBinaryHeapUnknown_SummaryProvider: stream = lldb.SBStream() self.valobj.GetExpressionPath(stream) num_children_vo = self.valobj.CreateValueFromExpression("count","(int)CFBinaryHeapGetCount(" + stream.GetData() + " )"); - return num_children_vo.GetValueAsUnsigned(0) + if num_children_vo.IsValid(): + return num_children_vo.GetValueAsUnsigned(0) + return '<variable is not CFBinaryHeap>' def GetSummary_Impl(valobj): global statistics - class_data = objc_runtime.ObjCRuntime(valobj) - if class_data.is_valid() == False: - statistics.metric_hit('invalid_pointer',valobj) - wrapper = None - return - class_data = class_data.read_class_data() - if class_data.is_valid() == False: - statistics.metric_hit('invalid_isa',valobj) - wrapper = None - return - if class_data.is_kvo(): - class_data = class_data.get_superclass() - if class_data.is_valid() == False: - statistics.metric_hit('invalid_isa',valobj) - wrapper = None - return + class_data,wrapper = objc_runtime.Utilities.prepare_class_detection(valobj,statistics) + if wrapper: + return wrapper name_string = class_data.class_name() - if name_string == '__NSCFType': + actual_name = class_data.class_name() + if class_data.is_cftype(): # CFBinaryHeap does not expose an actual NSWrapper type, so we have to check that this is # an NSCFType and then check we are a pointer-to CFBinaryHeap valobj_type = valobj.GetType() if valobj_type.IsValid() and valobj_type.IsPointerType(): - pointee_type = valobj_type.GetPointeeType() - if pointee_type.GetName() == '__CFBinaryHeap': - wrapper = CFBinaryHeapRef_SummaryProvider(valobj, class_data.sys_params) - statistics.metric_hit('code_notrun',valobj) - return wrapper + valobj_type = valobj_type.GetPointeeType() + if valobj_type.IsValid(): + actual_name = valobj_type.GetName() + if actual_name == '__CFBinaryHeap': + wrapper = CFBinaryHeapRef_SummaryProvider(valobj, class_data.sys_params) + statistics.metric_hit('code_notrun',valobj) + return wrapper wrapper = CFBinaryHeapUnknown_SummaryProvider(valobj, class_data.sys_params) statistics.metric_hit('unknown_class',str(valobj) + " seen as " + name_string) return wrapper; @@ -99,6 +98,8 @@ def GetSummary_Impl(valobj): def CFBinaryHeap_SummaryProvider (valobj,dict): provider = GetSummary_Impl(valobj); if provider != None: + if isinstance(provider,objc_runtime.SpecialSituation_Description): + return provider.message() try: summary = provider.length(); except: @@ -109,7 +110,9 @@ def CFBinaryHeap_SummaryProvider (valobj,dict): # (if counts start looking weird, then most probably # the mask needs to be changed) if summary == None: - summary = 'no valid set here' + summary = '<variable is not CFBinaryHeap>' + elif isinstance(summary,basestring): + pass else: if provider.sys_params.is_64_bit: summary = summary & ~0x1fff000000000000 @@ -118,7 +121,7 @@ def CFBinaryHeap_SummaryProvider (valobj,dict): else: summary = '@"' + str(summary) + ' items"' return summary - return '' + return 'Summary Unavailable' def __lldb_init_module(debugger,dict): debugger.HandleCommand("type summary add -F CFBinaryHeap.CFBinaryHeap_SummaryProvider CFBinaryHeapRef") diff --git a/lldb/examples/summaries/cocoa/CFBitVector.py b/lldb/examples/summaries/cocoa/CFBitVector.py index 7cd83fe6cb4..6035ca7b130 100644 --- a/lldb/examples/summaries/cocoa/CFBitVector.py +++ b/lldb/examples/summaries/cocoa/CFBitVector.py @@ -1,3 +1,10 @@ +""" +LLDB AppKit formatters + +part of The LLVM Compiler Infrastructure +This file is distributed under the University of Illinois Open Source +License. See LICENSE.TXT for details. +""" # summary provider for CF(Mutable)BitVector import lldb import ctypes @@ -101,41 +108,31 @@ class CFBitVectorUnknown_SummaryProvider: self.adjust_for_architecture(); def contents(self): - return '*** unknown class *** very bad thing *** find out my name ***' + return '<unable to summarize this CFBitVector>' def GetSummary_Impl(valobj): global statistics - class_data = objc_runtime.ObjCRuntime(valobj) - if class_data.is_valid() == False: - statistics.metric_hit('invalid_pointer',valobj) - wrapper = None - return - class_data = class_data.read_class_data() - if class_data.is_valid() == False: - statistics.metric_hit('invalid_isa',valobj) - wrapper = None - return - if class_data.is_kvo(): - class_data = class_data.get_superclass() - if class_data.is_valid() == False: - statistics.metric_hit('invalid_isa',valobj) - wrapper = None - return + class_data,wrapper = objc_runtime.Utilities.prepare_class_detection(valobj,statistics) + if wrapper: + return wrapper name_string = class_data.class_name() - if name_string == '__NSCFType': + actual_name = name_string + if class_data.is_cftype(): # CFBitVectorRef does not expose an actual NSWrapper type, so we have to check that this is # an NSCFType and then check we are a pointer-to CFBitVectorRef valobj_type = valobj.GetType() if valobj_type.IsValid() and valobj_type.IsPointerType(): - pointee_type = valobj_type.GetPointeeType() - if pointee_type.GetName() == '__CFBitVector' or pointee_type.GetName() == '__CFMutableBitVector': - wrapper = CFBitVectorKnown_SummaryProvider(valobj, class_data.sys_params) - statistics.metric_hit('code_notrun',valobj) - else: - wrapper = CFBitVectorUnknown_SummaryProvider(valobj) - print pointee_type.GetName() + valobj_type = valobj_type.GetPointeeType() + if valobj_type.IsValid(): + actual_name = valobj_type.GetName() + if actual_name == '__CFBitVector' or actual_name == '__CFMutableBitVector': + wrapper = CFBitVectorKnown_SummaryProvider(valobj, class_data.sys_params) + statistics.metric_hit('code_notrun',valobj) + else: + wrapper = CFBitVectorUnknown_SummaryProvider(valobj, class_data.sys_params) + print actual_name else: wrapper = CFBitVectorUnknown_SummaryProvider(valobj, class_data.sys_params) print name_string @@ -145,14 +142,16 @@ def GetSummary_Impl(valobj): def CFBitVector_SummaryProvider (valobj,dict): provider = GetSummary_Impl(valobj); if provider != None: - #try: - summary = provider.contents(); - #except: - # summary = None - if summary == None or summary == '': - summary = 'no valid bitvector here' - return summary - return '' + if isinstance(provider,objc_runtime.SpecialSituation_Description): + return provider.message() + try: + summary = provider.contents(); + except: + summary = None + if summary == None or summary == '': + summary = '<variable is not CFBitVector>' + return summary + return 'Summary Unavailable' def __lldb_init_module(debugger,dict): debugger.HandleCommand("type summary add -F CFBitVector.CFBitVector_SummaryProvider CFBitVectorRef CFMutableBitVectorRef") diff --git a/lldb/examples/summaries/cocoa/CFDictionary.py b/lldb/examples/summaries/cocoa/CFDictionary.py index 39b7ac85e79..400540385c4 100644 --- a/lldb/examples/summaries/cocoa/CFDictionary.py +++ b/lldb/examples/summaries/cocoa/CFDictionary.py @@ -1,3 +1,10 @@ +""" +LLDB AppKit formatters + +part of The LLVM Compiler Infrastructure +This file is distributed under the University of Illinois Open Source +License. See LICENSE.TXT for details. +""" # summary provider for NSDictionary import lldb import ctypes @@ -135,27 +142,16 @@ class NSDictionaryUnknown_SummaryProvider: stream = lldb.SBStream() self.valobj.GetExpressionPath(stream) num_children_vo = self.valobj.CreateValueFromExpression("count","(int)[" + stream.GetData() + " count]"); - return num_children_vo.GetValueAsUnsigned(0) + if num_children_vo.IsValid(): + return num_children_vo.GetValueAsUnsigned(0) + return '<variable is not NSDictionary>' def GetSummary_Impl(valobj): global statistics - class_data = objc_runtime.ObjCRuntime(valobj) - if class_data.is_valid() == False: - statistics.metric_hit('invalid_pointer',valobj) - wrapper = None - return - class_data = class_data.read_class_data() - if class_data.is_valid() == False: - statistics.metric_hit('invalid_isa',valobj) - wrapper = None - return - if class_data.is_kvo(): - class_data = class_data.get_superclass() - if class_data.is_valid() == False: - statistics.metric_hit('invalid_isa',valobj) - wrapper = None - return + class_data,wrapper = objc_runtime.Utilities.prepare_class_detection(valobj,statistics) + if wrapper: + return wrapper name_string = class_data.class_name() if name_string == '__NSCFDictionary': @@ -175,31 +171,39 @@ def GetSummary_Impl(valobj): def CFDictionary_SummaryProvider (valobj,dict): provider = GetSummary_Impl(valobj); if provider != None: - try: - summary = provider.num_children(); - except: - summary = None - if summary == None: - summary = 'no valid dictionary here' - return str(summary) + (" key/value pairs" if summary > 1 else " key/value pair") - return '' + if isinstance(provider,objc_runtime.SpecialSituation_Description): + return provider.message() + try: + summary = provider.num_children(); + except: + summary = None + if summary == None: + return '<variable is not NSDictionary>' + if isinstance(summary,basestring): + return summary + return str(summary) + (" key/value pairs" if summary != 1 else " key/value pair") + return 'Summary Unavailable' def CFDictionary_SummaryProvider2 (valobj,dict): provider = GetSummary_Impl(valobj); if provider != None: + if isinstance(provider,objc_runtime.SpecialSituation_Description): + return provider.message() try: summary = provider.num_children(); except: summary = None if summary == None: - summary = 'no valid dictionary here' + summary = '<variable is not CFDictionary>' + if isinstance(summary,basestring): + return summary else: # needed on OSX Mountain Lion if provider.sys_params.is_64_bit: summary = summary & ~0x0f1f000000000000 - summary = '@"' + str(summary) + (' entries"' if summary > 1 else ' entry"') + summary = '@"' + str(summary) + (' entries"' if summary != 1 else ' entry"') return summary - return '' + return 'Summary Unavailable' def __lldb_init_module(debugger,dict): debugger.HandleCommand("type summary add -F CFDictionary.CFDictionary_SummaryProvider NSDictionary") diff --git a/lldb/examples/summaries/cocoa/CFString.py b/lldb/examples/summaries/cocoa/CFString.py index ad2a1e4d6ba..f110d75c553 100644 --- a/lldb/examples/summaries/cocoa/CFString.py +++ b/lldb/examples/summaries/cocoa/CFString.py @@ -1,3 +1,10 @@ +""" +LLDB AppKit formatters + +part of The LLVM Compiler Infrastructure +This file is distributed under the University of Illinois Open Source +License. See LICENSE.TXT for details. +""" # synthetic children and summary provider for CFString # (and related NSString class) import lldb @@ -6,19 +13,19 @@ import objc_runtime def CFString_SummaryProvider (valobj,dict): provider = CFStringSynthProvider(valobj,dict); if provider.invalid == False: - try: - summary = provider.get_child_at_index(provider.get_child_index("content")).GetSummary(); - except: - summary = None - if summary == None: - summary = 'no valid string here' - return '@'+summary + try: + summary = provider.get_child_at_index(provider.get_child_index("content")).GetSummary(); + except: + summary = None + if summary == None: + summary = '<variable is not NSString>' + return '@'+summary return '' def CFAttributedString_SummaryProvider (valobj,dict): offset = valobj.GetTarget().GetProcess().GetAddressByteSize() pointee = valobj.GetValueAsUnsigned(0) - summary = 'no valid string here' + summary = '<variable is not NSAttributedString>' if pointee != None and pointee != 0: pointee = pointee + offset child_ptr = valobj.CreateValueFromAddress("string_ptr",pointee,valobj.GetType()) @@ -28,9 +35,9 @@ def CFAttributedString_SummaryProvider (valobj,dict): try: summary = provider.get_child_at_index(provider.get_child_index("content")).GetSummary(); except: - summary = 'no valid string here' + summary = '<variable is not NSAttributedString>' if summary == None: - summary = 'no valid string here' + summary = '<variable is not NSAttributedString>' return '@'+summary diff --git a/lldb/examples/summaries/cocoa/NSBundle.py b/lldb/examples/summaries/cocoa/NSBundle.py index b38b027a35a..bd6e3ff9f0f 100644 --- a/lldb/examples/summaries/cocoa/NSBundle.py +++ b/lldb/examples/summaries/cocoa/NSBundle.py @@ -1,3 +1,10 @@ +""" +LLDB AppKit formatters + +part of The LLVM Compiler Infrastructure +This file is distributed under the University of Illinois Open Source +License. See LICENSE.TXT for details. +""" # summary provider for NSBundle import lldb import ctypes @@ -65,27 +72,16 @@ class NSBundleUnknown_SummaryProvider: self.valobj.GetExpressionPath(stream) expr = "(NSString*)[" + stream.GetData() + " bundlePath]" url_text_vo = self.valobj.CreateValueFromExpression("path",expr); - return url_text_vo.GetSummary() + if url_text_vo.IsValid(): + return url_text_vo.GetSummary() + return '<variable is not NSBundle>' def GetSummary_Impl(valobj): global statistics - class_data = objc_runtime.ObjCRuntime(valobj) - if class_data.is_valid() == False: - statistics.metric_hit('invalid_pointer',valobj) - wrapper = None - return - class_data = class_data.read_class_data() - if class_data.is_valid() == False: - statistics.metric_hit('invalid_isa',valobj) - wrapper = None - return - if class_data.is_kvo(): - class_data = class_data.get_superclass() - if class_data.is_valid() == False: - statistics.metric_hit('invalid_isa',valobj) - wrapper = None - return + class_data,wrapper = objc_runtime.Utilities.prepare_class_detection(valobj,statistics) + if wrapper: + return wrapper name_string = class_data.class_name() if name_string == 'NSBundle': @@ -102,14 +98,16 @@ def GetSummary_Impl(valobj): def NSBundle_SummaryProvider (valobj,dict): provider = GetSummary_Impl(valobj); if provider != None: - try: - summary = provider.url_text(); - except: - summary = None - if summary == None or summary == '': - summary = 'no valid NSBundle here' - return summary - return '' + if isinstance(provider,objc_runtime.SpecialSituation_Description): + return provider.message() + try: + summary = provider.url_text(); + except: + summary = None + if summary == None or summary == '': + summary = '<variable is not NSBundle>' + return summary + return 'Summary Unavailable' def __lldb_init_module(debugger,dict): debugger.HandleCommand("type summary add -F NSBundle.NSBundle_SummaryProvider NSBundle") diff --git a/lldb/examples/summaries/cocoa/NSData.py b/lldb/examples/summaries/cocoa/NSData.py index d2d2515e48f..94da6057f5c 100644 --- a/lldb/examples/summaries/cocoa/NSData.py +++ b/lldb/examples/summaries/cocoa/NSData.py @@ -1,3 +1,10 @@ +""" +LLDB AppKit formatters + +part of The LLVM Compiler Infrastructure +This file is distributed under the University of Illinois Open Source +License. See LICENSE.TXT for details. +""" # summary provider for NSData import lldb import ctypes @@ -61,27 +68,16 @@ class NSDataUnknown_SummaryProvider: stream = lldb.SBStream() self.valobj.GetExpressionPath(stream) num_children_vo = self.valobj.CreateValueFromExpression("count","(int)[" + stream.GetData() + " length]"); - return num_children_vo.GetValueAsUnsigned(0) + if num_children_vo.IsValid(): + return num_children_vo.GetValueAsUnsigned(0) + return '<variable is not NSData>' def GetSummary_Impl(valobj): global statistics - class_data = objc_runtime.ObjCRuntime(valobj) - if class_data.is_valid() == False: - statistics.metric_hit('invalid_pointer',valobj) - wrapper = None - return - class_data = class_data.read_class_data() - if class_data.is_valid() == False: - statistics.metric_hit('invalid_isa',valobj) - wrapper = None - return - if class_data.is_kvo(): - class_data = class_data.get_superclass() - if class_data.is_valid() == False: - statistics.metric_hit('invalid_isa',valobj) - wrapper = None - return + class_data,wrapper = objc_runtime.Utilities.prepare_class_detection(valobj,statistics) + if wrapper: + return wrapper name_string = class_data.class_name() if name_string == 'NSConcreteData' or \ @@ -97,36 +93,42 @@ def GetSummary_Impl(valobj): def NSData_SummaryProvider (valobj,dict): provider = GetSummary_Impl(valobj); if provider != None: - try: - summary = provider.length(); - except: - summary = None - if summary == None: - summary = 'no valid data here' - else: - if summary == 1: - summary = '1 byte' - else: - summary = str(summary) + ' bytes' - return summary - return '' + try: + summary = provider.length(); + except: + summary = None + if summary == None: + summary = '<variable is not NSData>' + elif isinstance(summary,basestring): + pass + else: + if summary == 1: + summary = '1 byte' + else: + summary = str(summary) + ' bytes' + return summary + return 'Summary Unavailable' def NSData_SummaryProvider2 (valobj,dict): provider = GetSummary_Impl(valobj); if provider != None: - try: - summary = provider.length(); - except: - summary = None - if summary == None: - summary = 'no valid data here' - else: - if summary == 1: - summary = '@"1 byte"' - else: - summary = '@"' + str(summary) + ' bytes"' - return summary - return '' + if isinstance(provider,objc_runtime.SpecialSituation_Description): + return provider.message() + try: + summary = provider.length(); + except: + summary = None + if summary == None: + summary = '<variable is not CFData>' + elif isinstance(summary,basestring): + pass + else: + if summary == 1: + summary = '@"1 byte"' + else: + summary = '@"' + str(summary) + ' bytes"' + return summary + return 'Summary Unavailable' def __lldb_init_module(debugger,dict): debugger.HandleCommand("type summary add -F NSData.NSData_SummaryProvider NSData") diff --git a/lldb/examples/summaries/cocoa/NSDate.py b/lldb/examples/summaries/cocoa/NSDate.py index b3c3039466a..24dd3364ed2 100644 --- a/lldb/examples/summaries/cocoa/NSDate.py +++ b/lldb/examples/summaries/cocoa/NSDate.py @@ -1,3 +1,10 @@ +""" +LLDB AppKit formatters + +part of The LLVM Compiler Infrastructure +This file is distributed under the University of Illinois Open Source +License. See LICENSE.TXT for details. +""" # summary provider for NSDate import lldb import ctypes @@ -153,26 +160,15 @@ class NSUnknownDate_SummaryProvider: self.valobj.GetExpressionPath(stream) expr = "(NSString*)[" + stream.GetData() + " description]" num_children_vo = self.valobj.CreateValueFromExpression("str",expr); - return num_children_vo.GetSummary() + if num_children_vo.IsValid(): + return num_children_vo.GetSummary() + return '<variable is not NSDate>' def GetSummary_Impl(valobj): global statistics - class_data = objc_runtime.ObjCRuntime(valobj) - if class_data.is_valid() == False: - statistics.metric_hit('invalid_pointer',valobj) - wrapper = None - return - class_data = class_data.read_class_data() - if class_data.is_valid() == False: - statistics.metric_hit('invalid_isa',valobj) - wrapper = None - return - if class_data.is_kvo(): - class_data = class_data.get_superclass() - if class_data.is_valid() == False: - statistics.metric_hit('invalid_isa',valobj) - wrapper = None - return + class_data,wrapper = objc_runtime.Utilities.prepare_class_detection(valobj,statistics) + if wrapper: + return wrapper name_string = class_data.class_name() if name_string == 'NSDate' or name_string == '__NSDate' or name_string == '__NSTaggedDate': @@ -197,26 +193,30 @@ def GetSummary_Impl(valobj): def NSDate_SummaryProvider (valobj,dict): provider = GetSummary_Impl(valobj); if provider != None: - #try: - summary = provider.value(); - #except: - # summary = None - if summary == None: - summary = 'no valid date here' - return str(summary) - return '' + if isinstance(provider,objc_runtime.SpecialSituation_Description): + return provider.message() + try: + summary = provider.value(); + except: + summary = None + if summary == None: + summary = '<variable is not NSDate>' + return str(summary) + return 'Summary Unavailable' def NSTimeZone_SummaryProvider (valobj,dict): provider = GetSummary_Impl(valobj); if provider != None: - try: - summary = provider.timezone(); - except: - summary = None - if summary == None: - summary = 'no valid timezone here' - return str(summary) - return '' + if isinstance(provider,objc_runtime.SpecialSituation_Description): + return provider.message() + try: + summary = provider.timezone(); + except: + summary = None + if summary == None: + summary = '<variable is not NSTimeZone>' + return str(summary) + return 'Summary Unavailable' def CFAbsoluteTime_SummaryProvider (valobj,dict): @@ -224,7 +224,7 @@ def CFAbsoluteTime_SummaryProvider (valobj,dict): value_double = struct.unpack('d', struct.pack('Q', valobj.GetValueAsUnsigned(0)))[0] return xcode_format_count(osx_to_python_time(value_double)) except: - return 'unable to provide a summary' + return 'Summary Unavailable' def __lldb_init_module(debugger,dict): diff --git a/lldb/examples/summaries/cocoa/NSException.py b/lldb/examples/summaries/cocoa/NSException.py index 0d2d9a71f00..3789ac3308b 100644 --- a/lldb/examples/summaries/cocoa/NSException.py +++ b/lldb/examples/summaries/cocoa/NSException.py @@ -1,3 +1,10 @@ +""" +LLDB AppKit formatters + +part of The LLVM Compiler Infrastructure +This file is distributed under the University of Illinois Open Source +License. See LICENSE.TXT for details. +""" # summary provider for class NSException import objc_runtime import metrics @@ -55,27 +62,16 @@ class NSUnknownException_SummaryProvider: self.valobj.GetExpressionPath(stream) name_vo = self.valobj.CreateValueFromExpression("name","(NSString*)[" + stream.GetData() + " name]"); reason_vo = self.valobj.CreateValueFromExpression("reason","(NSString*)[" + stream.GetData() + " reason]"); - return CFString.CFString_SummaryProvider(name_vo,None) + ' ' + CFString.CFString_SummaryProvider(reason_vo,None) + if name_vo.IsValid() and reason_vo.IsValid(): + return CFString.CFString_SummaryProvider(name_vo,None) + ' ' + CFString.CFString_SummaryProvider(reason_vo,None) + return '<variable is not NSException>' def GetSummary_Impl(valobj): global statistics - class_data = objc_runtime.ObjCRuntime(valobj) - if class_data.is_valid() == False: - statistics.metric_hit('invalid_pointer',valobj) - wrapper = None - return - class_data = class_data.read_class_data() - if class_data.is_valid() == False: - statistics.metric_hit('invalid_isa',valobj) - wrapper = None - return - if class_data.is_kvo(): - class_data = class_data.get_superclass() - if class_data.is_valid() == False: - statistics.metric_hit('invalid_isa',valobj) - wrapper = None - return + class_data,wrapper = objc_runtime.Utilities.prepare_class_detection(valobj,statistics) + if wrapper: + return wrapper name_string = class_data.class_name() if name_string == 'NSException': @@ -89,14 +85,16 @@ def GetSummary_Impl(valobj): def NSException_SummaryProvider (valobj,dict): provider = GetSummary_Impl(valobj); if provider != None: - try: - summary = provider.description(); - except: - summary = None - if summary == None: - summary = 'no valid exception here' - return str(summary) - return '' + if isinstance(provider,objc_runtime.SpecialSituation_Description): + return provider.message() + try: + summary = provider.description(); + except: + summary = None + if summary == None: + summary = '<variable is not NSException>' + return str(summary) + return 'Summary Unavailable' def __lldb_init_module(debugger,dict): debugger.HandleCommand("type summary add -F NSException.NSException_SummaryProvider NSException") diff --git a/lldb/examples/summaries/cocoa/NSIndexSet.py b/lldb/examples/summaries/cocoa/NSIndexSet.py index 761ad2b1d51..18e683495e2 100644 --- a/lldb/examples/summaries/cocoa/NSIndexSet.py +++ b/lldb/examples/summaries/cocoa/NSIndexSet.py @@ -1,3 +1,10 @@ +""" +LLDB AppKit formatters + +part of The LLVM Compiler Infrastructure +This file is distributed under the University of Illinois Open Source +License. See LICENSE.TXT for details. +""" # summary provider for NS(Mutable)IndexSet import lldb import ctypes @@ -78,28 +85,17 @@ class NSIndexSetUnknown_SummaryProvider: stream = lldb.SBStream() self.valobj.GetExpressionPath(stream) expr = "(int)[" + stream.GetData() + " count]" - num_children_vo = self.valobj.CreateValueFromExpression("count",expr); - return num_children_vo.GetValueAsUnsigned(0) + num_children_vo = self.valobj.CreateValueFromExpression("count",expr) + if num_children_vo.IsValid(): + return num_children_vo.GetValueAsUnsigned(0) + return '<variable is not NSIndexSet>' def GetSummary_Impl(valobj): global statistics - class_data = objc_runtime.ObjCRuntime(valobj) - if class_data.is_valid() == False: - statistics.metric_hit('invalid_pointer',valobj) - wrapper = None - return - class_data = class_data.read_class_data() - if class_data.is_valid() == False: - statistics.metric_hit('invalid_isa',valobj) - wrapper = None - return - if class_data.is_kvo(): - class_data = class_data.get_superclass() - if class_data.is_valid() == False: - statistics.metric_hit('invalid_isa',valobj) - wrapper = None - return + class_data,wrapper = objc_runtime.Utilities.prepare_class_detection(valobj,statistics) + if wrapper: + return wrapper name_string = class_data.class_name() if name_string == 'NSIndexSet' or name_string == 'NSMutableIndexSet': @@ -114,16 +110,20 @@ def GetSummary_Impl(valobj): def NSIndexSet_SummaryProvider (valobj,dict): provider = GetSummary_Impl(valobj); if provider != None: + if isinstance(provider,objc_runtime.SpecialSituation_Description): + return provider.message() try: summary = provider.count(); except: summary = None if summary == None: - summary = 'no valid set here' + summary = '<variable is not NSIndexSet>' + if isinstance(summary, basestring): + return summary else: - summary = str(summary) + (' objects' if summary > 1 else ' object') + summary = str(summary) + (' objects' if summary != 1 else ' object') return summary - return '' + return 'Summary Unavailable' def __lldb_init_module(debugger,dict): diff --git a/lldb/examples/summaries/cocoa/NSMachPort.py b/lldb/examples/summaries/cocoa/NSMachPort.py index c7ffcc0c59b..08b6636dcac 100644 --- a/lldb/examples/summaries/cocoa/NSMachPort.py +++ b/lldb/examples/summaries/cocoa/NSMachPort.py @@ -1,3 +1,10 @@ +""" +LLDB AppKit formatters + +part of The LLVM Compiler Infrastructure +This file is distributed under the University of Illinois Open Source +License. See LICENSE.TXT for details. +""" # summary provider for NSData import lldb import ctypes @@ -61,28 +68,17 @@ class NSMachPortUnknown_SummaryProvider: def port(self): stream = lldb.SBStream() self.valobj.GetExpressionPath(stream) - num_children_vo = self.valobj.CreateValueFromExpression("port","(int)[" + stream.GetData() + " machPort]"); - return num_children_vo.GetValueAsUnsigned(0) + num_children_vo = self.valobj.CreateValueFromExpression("port","(int)[" + stream.GetData() + " machPort]") + if num_children_vo.IsValid(): + return num_children_vo.GetValueAsUnsigned(0) + return '<variable is not NSMachPort>' def GetSummary_Impl(valobj): global statistics - class_data = objc_runtime.ObjCRuntime(valobj) - if class_data.is_valid() == False: - statistics.metric_hit('invalid_pointer',valobj) - wrapper = None - return - class_data = class_data.read_class_data() - if class_data.is_valid() == False: - statistics.metric_hit('invalid_isa',valobj) - wrapper = None - return - if class_data.is_kvo(): - class_data = class_data.get_superclass() - if class_data.is_valid() == False: - statistics.metric_hit('invalid_isa',valobj) - wrapper = None - return + class_data,wrapper = objc_runtime.Utilities.prepare_class_detection(valobj,statistics) + if wrapper: + return wrapper name_string = class_data.class_name() if name_string == 'NSMachPort': @@ -96,14 +92,18 @@ def GetSummary_Impl(valobj): def NSMachPort_SummaryProvider (valobj,dict): provider = GetSummary_Impl(valobj); if provider != None: - try: - summary = provider.port(); - except: - summary = None - if summary == None: - summary = 'no valid mach port here' - return 'mach port: ' + str(summary) - return '' + if isinstance(provider,objc_runtime.SpecialSituation_Description): + return provider.message() + try: + summary = provider.port(); + except: + summary = None + if summary == None: + summary = '<variable is not NSMachPort>' + if isinstance(summary, basestring): + return summay + return 'mach port: ' + str(summary) + return 'Summary Unavailable' def __lldb_init_module(debugger,dict): debugger.HandleCommand("type summary add -F NSMachPort.NSMachPort_SummaryProvider NSMachPort") diff --git a/lldb/examples/summaries/cocoa/NSNotification.py b/lldb/examples/summaries/cocoa/NSNotification.py index c941cd20160..76bd698ac81 100644 --- a/lldb/examples/summaries/cocoa/NSNotification.py +++ b/lldb/examples/summaries/cocoa/NSNotification.py @@ -1,3 +1,10 @@ +""" +LLDB AppKit formatters + +part of The LLVM Compiler Infrastructure +This file is distributed under the University of Illinois Open Source +License. See LICENSE.TXT for details. +""" # summary provider for class NSNotification import objc_runtime import metrics @@ -50,28 +57,17 @@ class NSNotificationUnknown_SummaryProvider: def name(self): stream = lldb.SBStream() self.valobj.GetExpressionPath(stream) - name_vo = self.valobj.CreateValueFromExpression("name","(NSString*)[" + stream.GetData() + " name]"); - return CFString.CFString_SummaryProvider(name_vo,None) + name_vo = self.valobj.CreateValueFromExpression("name","(NSString*)[" + stream.GetData() + " name]") + if name_vo.IsValid(): + return CFString.CFString_SummaryProvider(name_vo,None) + return '<variable is not NSNotification>' def GetSummary_Impl(valobj): global statistics - class_data = objc_runtime.ObjCRuntime(valobj) - if class_data.is_valid() == False: - statistics.metric_hit('invalid_pointer',valobj) - wrapper = None - return - class_data = class_data.read_class_data() - if class_data.is_valid() == False: - statistics.metric_hit('invalid_isa',valobj) - wrapper = None - return - if class_data.is_kvo(): - class_data = class_data.get_superclass() - if class_data.is_valid() == False: - statistics.metric_hit('invalid_isa',valobj) - wrapper = None - return + class_data,wrapper = objc_runtime.Utilities.prepare_class_detection(valobj,statistics) + if wrapper: + return wrapper name_string = class_data.class_name() if name_string == 'NSConcreteNotification': @@ -85,14 +81,16 @@ def GetSummary_Impl(valobj): def NSNotification_SummaryProvider (valobj,dict): provider = GetSummary_Impl(valobj); if provider != None: - try: - summary = provider.name(); - except: - summary = None - if summary == None: - summary = 'no valid notification here' - return str(summary) - return '' + if isinstance(provider,objc_runtime.SpecialSituation_Description): + return provider.message() + try: + summary = provider.name(); + except: + summary = None + if summary == None: + summary = '<variable is not NSNotification>' + return str(summary) + return 'Summary Unavailable' def __lldb_init_module(debugger,dict): debugger.HandleCommand("type summary add -F NSNotification.NSNotification_SummaryProvider NSNotification") diff --git a/lldb/examples/summaries/cocoa/NSNumber.py b/lldb/examples/summaries/cocoa/NSNumber.py index 7eddcb44d31..23058928566 100644 --- a/lldb/examples/summaries/cocoa/NSNumber.py +++ b/lldb/examples/summaries/cocoa/NSNumber.py @@ -1,3 +1,10 @@ +""" +LLDB AppKit formatters + +part of The LLVM Compiler Infrastructure +This file is distributed under the University of Illinois Open Source +License. See LICENSE.TXT for details. +""" # summary provider for NSNumber import lldb import ctypes @@ -162,27 +169,16 @@ class NSUnknownNumber_SummaryProvider: stream = lldb.SBStream() self.valobj.GetExpressionPath(stream) expr = "(NSString*)[" + stream.GetData() + " stringValue]" - num_children_vo = self.valobj.CreateValueFromExpression("str",expr); - return num_children_vo.GetSummary() + num_children_vo = self.valobj.CreateValueFromExpression("str",expr) + if num_children_vo.IsValid(): + return num_children_vo.GetSummary() + return '<variable is not NSNumber>' def GetSummary_Impl(valobj): global statistics - class_data = objc_runtime.ObjCRuntime(valobj) - if class_data.is_valid() == False: - statistics.metric_hit('invalid_pointer',valobj) - wrapper = None - return - class_data = class_data.read_class_data() - if class_data.is_valid() == False: - statistics.metric_hit('invalid_isa',valobj) - wrapper = None - return - if class_data.is_kvo(): - class_data = class_data.get_superclass() - if class_data.is_valid() == False: - statistics.metric_hit('invalid_isa',valobj) - wrapper = None - return + class_data,wrapper = objc_runtime.Utilities.prepare_class_detection(valobj,statistics) + if wrapper: + return wrapper name_string = class_data.class_name() if name_string == 'NSNumber' or name_string == '__NSCFNumber': @@ -202,16 +198,20 @@ def GetSummary_Impl(valobj): def NSNumber_SummaryProvider (valobj,dict): provider = GetSummary_Impl(valobj); if provider != None: - #try: - summary = provider.value(); - #except: - # summary = None - if summary == None: - summary = 'no valid number here' - return str(summary) - return '' + if isinstance(provider,objc_runtime.SpecialSituation_Description): + return provider.message() + try: + summary = provider.value(); + except: + summary = None + if summary == None: + summary = '<variable is not NSNumber>' + return str(summary) + return 'Summary Unavailable' def __lldb_init_module(debugger,dict): debugger.HandleCommand("type summary add -F NSNumber.NSNumber_SummaryProvider NSNumber") + debugger.HandleCommand("type summary add -F NSNumber.NSNumber_SummaryProvider __NSCFBoolean") + debugger.HandleCommand("type summary add -F NSNumber.NSNumber_SummaryProvider __NSCFNumber") diff --git a/lldb/examples/summaries/cocoa/NSSet.py b/lldb/examples/summaries/cocoa/NSSet.py index ea410cf46f2..567e35e7431 100644 --- a/lldb/examples/summaries/cocoa/NSSet.py +++ b/lldb/examples/summaries/cocoa/NSSet.py @@ -1,3 +1,10 @@ +""" +LLDB AppKit formatters + +part of The LLVM Compiler Infrastructure +This file is distributed under the University of Illinois Open Source +License. See LICENSE.TXT for details. +""" # summary provider for NSSet import lldb import ctypes @@ -63,8 +70,10 @@ class NSSetUnknown_SummaryProvider: stream = lldb.SBStream() self.valobj.GetExpressionPath(stream) expr = "(int)[" + stream.GetData() + " count]" - num_children_vo = self.valobj.CreateValueFromExpression("count",expr); - return num_children_vo.GetValueAsUnsigned(0) + num_children_vo = self.valobj.CreateValueFromExpression("count",expr) + if num_children_vo.IsValid(): + return num_children_vo.GetValueAsUnsigned(0) + return '<variable is not NSSet>' class NSSetI_SummaryProvider: def adjust_for_architecture(self): @@ -158,22 +167,9 @@ class NSCountedSet_SummaryProvider: def GetSummary_Impl(valobj): global statistics - class_data = objc_runtime.ObjCRuntime(valobj) - if class_data.is_valid() == False: - statistics.metric_hit('invalid_pointer',valobj) - wrapper = None - return - class_data = class_data.read_class_data() - if class_data.is_valid() == False: - statistics.metric_hit('invalid_isa',valobj) - wrapper = None - return - if class_data.is_kvo(): - class_data = class_data.get_superclass() - if class_data.is_valid() == False: - statistics.metric_hit('invalid_isa',valobj) - wrapper = None - return + class_data,wrapper = objc_runtime.Utilities.prepare_class_detection(valobj,statistics) + if wrapper: + return wrapper name_string = class_data.class_name() if name_string == '__NSCFSet': @@ -197,20 +193,24 @@ def GetSummary_Impl(valobj): def NSSet_SummaryProvider (valobj,dict): provider = GetSummary_Impl(valobj); if provider != None: - #try: - summary = provider.count(); - #except: - # summary = None - if summary == None: - summary = 'no valid set here' - else: - summary = str(summary) + (' objects' if summary > 1 else ' object') - return summary - return '' + try: + summary = provider.count(); + except: + summary = None + if summary == None: + summary = '<variable is not NSSet>' + if isinstance(summary, basestring): + return summary + else: + summary = str(summary) + (' objects' if summary != 1 else ' object') + return summary + return 'Summary Unavailable' def NSSet_SummaryProvider2 (valobj,dict): provider = GetSummary_Impl(valobj); if provider != None: + if isinstance(provider,objc_runtime.SpecialSituation_Description): + return provider.message() try: summary = provider.count(); except: @@ -221,13 +221,15 @@ def NSSet_SummaryProvider2 (valobj,dict): # experimentation (if counts start looking weird, then most probably # the mask needs to be changed) if summary == None: - summary = 'no valid set here' + summary = '<variable is not CFSet>' + if isinstance(summary, basestring): + return summary else: if provider.sys_params.is_64_bit: summary = summary & ~0x1fff000000000000 - summary = '@"' + str(summary) + (' values"' if summary > 1 else ' value"') + summary = '@"' + str(summary) + (' values"' if summary != 1 else ' value"') return summary - return '' + return 'Summary Unavailable' def __lldb_init_module(debugger,dict): diff --git a/lldb/examples/summaries/cocoa/NSURL.py b/lldb/examples/summaries/cocoa/NSURL.py index d29bbc77507..ff1e95e61a1 100644 --- a/lldb/examples/summaries/cocoa/NSURL.py +++ b/lldb/examples/summaries/cocoa/NSURL.py @@ -1,3 +1,10 @@ +""" +LLDB AppKit formatters + +part of The LLVM Compiler Infrastructure +This file is distributed under the University of Illinois Open Source +License. See LICENSE.TXT for details. +""" # summary provider for NSURL import lldb import ctypes @@ -74,28 +81,17 @@ class NSURLUnknown_SummaryProvider: def url_text(self): stream = lldb.SBStream() self.valobj.GetExpressionPath(stream) - url_text_vo = self.valobj.CreateValueFromExpression("url","(NSString*)[" + stream.GetData() + " description]"); - return CFString.CFString_SummaryProvider(url_text_vo,None) + url_text_vo = self.valobj.CreateValueFromExpression("url","(NSString*)[" + stream.GetData() + " description]") + if url_text_vo.IsValid(): + return CFString.CFString_SummaryProvider(url_text_vo,None) + return '<variable is not NSURL>' def GetSummary_Impl(valobj): global statistics - class_data = objc_runtime.ObjCRuntime(valobj) - if class_data.is_valid() == False: - statistics.metric_hit('invalid_pointer',valobj) - wrapper = None - return - class_data = class_data.read_class_data() - if class_data.is_valid() == False: - statistics.metric_hit('invalid_isa',valobj) - wrapper = None - return - if class_data.is_kvo(): - class_data = class_data.get_superclass() - if class_data.is_valid() == False: - statistics.metric_hit('invalid_isa',valobj) - wrapper = None - return + class_data,wrapper = objc_runtime.Utilities.prepare_class_detection(valobj,statistics) + if wrapper: + return wrapper name_string = class_data.class_name() if name_string == 'NSURL': @@ -109,14 +105,16 @@ def GetSummary_Impl(valobj): def NSURL_SummaryProvider (valobj,dict): provider = GetSummary_Impl(valobj); if provider != None: - try: - summary = provider.url_text(); - except: - summary = None - if summary == None or summary == '': - summary = 'no valid NSURL here' - return summary - return '' + if isinstance(provider,objc_runtime.SpecialSituation_Description): + return provider.message() + try: + summary = provider.url_text(); + except: + summary = None + if summary == None or summary == '': + summary = '<variable is not NSURL>' + return summary + return 'Summary Unavailable' def __lldb_init_module(debugger,dict): debugger.HandleCommand("type summary add -F NSURL.NSURL_SummaryProvider NSURL CFURLRef") diff --git a/lldb/examples/summaries/cocoa/Selector.py b/lldb/examples/summaries/cocoa/Selector.py index 38576ab8c3d..d0505204bf2 100644 --- a/lldb/examples/summaries/cocoa/Selector.py +++ b/lldb/examples/summaries/cocoa/Selector.py @@ -1,3 +1,10 @@ +""" +LLDB AppKit formatters + +part of The LLVM Compiler Infrastructure +This file is distributed under the University of Illinois Open Source +License. See LICENSE.TXT for details. +""" import lldb def SEL_Summary(valobj,dict): diff --git a/lldb/examples/summaries/cocoa/attrib_fromdict.py b/lldb/examples/summaries/cocoa/attrib_fromdict.py index 8ecd9ed27be..86964d602b5 100644 --- a/lldb/examples/summaries/cocoa/attrib_fromdict.py +++ b/lldb/examples/summaries/cocoa/attrib_fromdict.py @@ -1,3 +1,10 @@ +""" +Objective-C runtime wrapper for use by LLDB Python formatters + +part of The LLVM Compiler Infrastructure +This file is distributed under the University of Illinois Open Source +License. See LICENSE.TXT for details. +""" class AttributesDictionary: def __init__(self, allow_reset = True): self.__dict__['_dictionary'] = {} # need to do it this way to prevent endless recursion diff --git a/lldb/examples/summaries/cocoa/cache.py b/lldb/examples/summaries/cocoa/cache.py index 01a79a45196..ea8df5946c8 100644 --- a/lldb/examples/summaries/cocoa/cache.py +++ b/lldb/examples/summaries/cocoa/cache.py @@ -1,3 +1,10 @@ +""" +Objective-C runtime wrapper for use by LLDB Python formatters + +part of The LLVM Compiler Infrastructure +This file is distributed under the University of Illinois Open Source +License. See LICENSE.TXT for details. +""" import metrics class Cache: diff --git a/lldb/examples/summaries/cocoa/metrics.py b/lldb/examples/summaries/cocoa/metrics.py index 99489e147e9..4e8b3287533 100644 --- a/lldb/examples/summaries/cocoa/metrics.py +++ b/lldb/examples/summaries/cocoa/metrics.py @@ -1,3 +1,10 @@ +""" +Objective-C runtime wrapper for use by LLDB Python formatters + +part of The LLVM Compiler Infrastructure +This file is distributed under the University of Illinois Open Source +License. See LICENSE.TXT for details. +""" import lldb class Counter: diff --git a/lldb/examples/summaries/cocoa/objc_runtime.py b/lldb/examples/summaries/cocoa/objc_runtime.py index ddad00a2230..beeec6dd115 100644 --- a/lldb/examples/summaries/cocoa/objc_runtime.py +++ b/lldb/examples/summaries/cocoa/objc_runtime.py @@ -74,6 +74,30 @@ class Utilities: return None return (ver[0] < 900) + # a utility method that factors out code common to almost all the formatters + # takes in an SBValue and a metrics object + # returns a class_data and a wrapper (or None, if the runtime alone can't decide on a wrapper) + @staticmethod + def prepare_class_detection(valobj,statistics): + class_data = ObjCRuntime(valobj) + if class_data.is_valid() == False: + statistics.metric_hit('invalid_pointer',valobj) + wrapper = InvalidPointer_Description(valobj.GetValueAsUnsigned(0) == 0) + return class_data,wrapper + class_data = class_data.read_class_data() + if class_data.is_valid() == False: + statistics.metric_hit('invalid_isa',valobj) + wrapper = InvalidISA_Description() + return class_data,wrapper + if class_data.is_kvo(): + class_data = class_data.get_superclass() + if class_data.is_valid() == False: + statistics.metric_hit('invalid_isa',valobj) + wrapper = InvalidISA_Description() + return class_data,wrapper + return class_data,None + + class RoT_Data: def __init__(self,rot_pointer,params): if (Utilities.is_valid_pointer(rot_pointer.GetValueAsUnsigned(),params.pointer_size, allow_tagged=False)): @@ -227,7 +251,7 @@ class Class_Data_V2: # just to be on the safe side) def is_cftype(self): if self.is_valid(): - return self.name == '__NSCFType' or self.name == 'NSCFType' + return self.class_name() == '__NSCFType' or self.class_name() == 'NSCFType' def get_superclass(self): if self.is_valid(): @@ -314,7 +338,7 @@ class Class_Data_V1: # just to be on the safe side) def is_cftype(self): if self.is_valid(): - return self.name == '__NSCFType' or self.name == 'NSCFType' + return self.class_name() == '__NSCFType' or self.class_name() == 'NSCFType' def get_superclass(self): if self.is_valid(): @@ -593,6 +617,9 @@ class ObjCRuntime: return False return Utilities.is_valid_pointer(self.unsigned_value,self.sys_params.pointer_size, allow_tagged=True) + def is_nil(self): + return self.unsigned_value == 0 + def read_isa(self): if self.isa_value != None: return self.isa_value @@ -639,3 +666,27 @@ class ObjCRuntime: self.sys_params.isa_cache.add_item(isa_value,data,ok_to_replace=True) return data +# these classes below can be used by the data formatters to provide a consistent message that describes a given runtime-generated situation +class SpecialSituation_Description: + def message(self): + return '' + +class InvalidPointer_Description(SpecialSituation_Description): + + def __init__(self,nil): + self.is_nil = nil + + def message(self): + if self.is_nil: + return '@"<nil>"' + else: + return '<invalid pointer>' + +class InvalidISA_Description(SpecialSituation_Description): + + def __init__(self): + pass + + def message(self): + return '<not an Objective-C object>' + diff --git a/lldb/source/Core/FormatManager.cpp b/lldb/source/Core/FormatManager.cpp index d09566b776e..1423936cf46 100644 --- a/lldb/source/Core/FormatManager.cpp +++ b/lldb/source/Core/FormatManager.cpp @@ -914,6 +914,8 @@ FormatManager::LoadObjCFormatters() AddScriptSummary(appkit_category_sp, "NSNotification.NSNotification_SummaryProvider", ConstString("NSNotification"), appkit_flags); AddScriptSummary(appkit_category_sp, "NSNumber.NSNumber_SummaryProvider", ConstString("NSNumber"), appkit_flags); + AddScriptSummary(appkit_category_sp, "NSNumber.NSNumber_SummaryProvider", ConstString("__NSCFBoolean"), appkit_flags); + AddScriptSummary(appkit_category_sp, "NSNumber.NSNumber_SummaryProvider", ConstString("__NSCFNumber"), appkit_flags); AddScriptSummary(appkit_category_sp, "NSSet.NSSet_SummaryProvider", ConstString("NSSet"), appkit_flags); AddScriptSummary(appkit_category_sp, "NSSet.NSSet_SummaryProvider2", ConstString("CFSetRef"), appkit_flags); |