[Lldb-commits] [lldb] r173728 - <rdar://problem/12978143>

Enrico Granata egranata at apple.com
Mon Jan 28 16:08:19 PST 2013


Warning for all interested parties. Apparently something in the way conflicts were solved before checking this in made the build unhappy.
I am building a clean ToT checkout to see what is going on and fix it.
Sorry for any disruption.

Enrico Granata
✉ egranata@.com
✆ (408) 972-7683

On Jan 28, 2013, at 3:47 PM, Enrico Granata <egranata at apple.com> wrote:

> Author: enrico
> Date: Mon Jan 28 17:47:25 2013
> New Revision: 173728
> 
> URL: http://llvm.org/viewvc/llvm-project?rev=173728&view=rev
> Log:
> <rdar://problem/12978143>
> 
> Data formatters now cache themselves.
> This commit provides a new formatter cache mechanism. Upon resolving a formatter (summary or synthetic), LLDB remembers the resolution for later faster retrieval.
> Also moved the data formatters subsystem from the core to its own group and folder for easier management, and done some code reorganization.
> The ObjC runtime v1 now returns a class name if asked for the dynamic type of an object. This is required for formatters caching to work with the v1 runtime.
> Lastly, this commit disposes of the old hack where ValueObjects had to remember whether they were queried for formatters with their static or dynamic type.
> Now the ValueObjectDynamicValue class works well enough that we can use its dynamic value setting for the same purpose.
> 
> 
> 
> Added:
>    lldb/trunk/include/lldb/DataFormatters/
>    lldb/trunk/include/lldb/DataFormatters/CXXFormatterFunctions.h
>      - copied, changed from r173281, lldb/trunk/include/lldb/Core/CXXFormatterFunctions.h
>    lldb/trunk/include/lldb/DataFormatters/DataVisualization.h
>      - copied, changed from r173281, lldb/trunk/include/lldb/Core/DataVisualization.h
>    lldb/trunk/include/lldb/DataFormatters/FormatCache.h
>    lldb/trunk/include/lldb/DataFormatters/FormatClasses.h
>      - copied, changed from r173281, lldb/trunk/include/lldb/Core/FormatClasses.h
>    lldb/trunk/include/lldb/DataFormatters/FormatManager.h
>      - copied, changed from r173281, lldb/trunk/include/lldb/Core/FormatManager.h
>    lldb/trunk/include/lldb/DataFormatters/FormatNavigator.h
>      - copied, changed from r173281, lldb/trunk/include/lldb/Core/FormatNavigator.h
>    lldb/trunk/include/lldb/DataFormatters/TypeCategory.h
>    lldb/trunk/include/lldb/DataFormatters/TypeCategoryMap.h
>    lldb/trunk/include/lldb/DataFormatters/TypeFormat.h
>    lldb/trunk/include/lldb/DataFormatters/TypeSummary.h
>    lldb/trunk/include/lldb/DataFormatters/TypeSynthetic.h
>    lldb/trunk/source/DataFormatters/
>    lldb/trunk/source/DataFormatters/CXXFormatterFunctions.cpp
>      - copied, changed from r173281, lldb/trunk/source/Core/CXXFormatterFunctions.cpp
>    lldb/trunk/source/DataFormatters/DataVisualization.cpp
>      - copied, changed from r173281, lldb/trunk/source/Core/DataVisualization.cpp
>    lldb/trunk/source/DataFormatters/FormatCache.cpp
>    lldb/trunk/source/DataFormatters/FormatClasses.cpp
>      - copied, changed from r173281, lldb/trunk/source/Core/FormatClasses.cpp
>    lldb/trunk/source/DataFormatters/FormatManager.cpp
>      - copied, changed from r173281, lldb/trunk/source/Core/FormatManager.cpp
>    lldb/trunk/source/DataFormatters/TypeCategory.cpp
>    lldb/trunk/source/DataFormatters/TypeCategoryMap.cpp
>    lldb/trunk/source/DataFormatters/TypeFormat.cpp
>    lldb/trunk/source/DataFormatters/TypeSummary.cpp
>    lldb/trunk/source/DataFormatters/TypeSynthetic.cpp
> Removed:
>    lldb/trunk/include/lldb/Core/CXXFormatterFunctions.h
>    lldb/trunk/include/lldb/Core/DataVisualization.h
>    lldb/trunk/include/lldb/Core/FormatClasses.h
>    lldb/trunk/include/lldb/Core/FormatManager.h
>    lldb/trunk/include/lldb/Core/FormatNavigator.h
>    lldb/trunk/source/Core/CXXFormatterFunctions.cpp
>    lldb/trunk/source/Core/DataVisualization.cpp
>    lldb/trunk/source/Core/FormatClasses.cpp
>    lldb/trunk/source/Core/FormatManager.cpp
> Modified:
>    lldb/trunk/include/lldb/API/SBTypeSynthetic.h
>    lldb/trunk/include/lldb/Core/Debugger.h
>    lldb/trunk/include/lldb/Core/ValueObject.h
>    lldb/trunk/include/lldb/Core/ValueObjectDynamicValue.h
>    lldb/trunk/include/lldb/Core/ValueObjectSyntheticFilter.h
>    lldb/trunk/include/lldb/lldb-forward.h
>    lldb/trunk/lldb.xcodeproj/project.pbxproj
>    lldb/trunk/source/API/SBDebugger.cpp
>    lldb/trunk/source/API/SBTypeCategory.cpp
>    lldb/trunk/source/API/SBTypeFilter.cpp
>    lldb/trunk/source/API/SBTypeFormat.cpp
>    lldb/trunk/source/API/SBTypeNameSpecifier.cpp
>    lldb/trunk/source/API/SBTypeSummary.cpp
>    lldb/trunk/source/API/SBTypeSynthetic.cpp
>    lldb/trunk/source/API/SBValue.cpp
>    lldb/trunk/source/Commands/CommandObjectFrame.cpp
>    lldb/trunk/source/Commands/CommandObjectType.cpp
>    lldb/trunk/source/Core/Debugger.cpp
>    lldb/trunk/source/Core/Timer.cpp
>    lldb/trunk/source/Core/ValueObject.cpp
>    lldb/trunk/source/Core/ValueObjectDynamicValue.cpp
>    lldb/trunk/source/Core/ValueObjectSyntheticFilter.cpp
>    lldb/trunk/source/Interpreter/Args.cpp
>    lldb/trunk/source/Interpreter/CommandObjectScript.cpp
>    lldb/trunk/source/Interpreter/OptionGroupVariable.cpp
>    lldb/trunk/source/Interpreter/OptionValueArch.cpp
>    lldb/trunk/source/Interpreter/OptionValueDictionary.cpp
>    lldb/trunk/source/Interpreter/OptionValueFileSpec.cpp
>    lldb/trunk/source/Interpreter/OptionValueFormat.cpp
>    lldb/trunk/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCRuntimeV1.cpp
>    lldb/trunk/test/functionalities/data-formatter/rdar-12437442/TestRdar12437442.py
> 
> Modified: lldb/trunk/include/lldb/API/SBTypeSynthetic.h
> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/API/SBTypeSynthetic.h?rev=173728&r1=173727&r2=173728&view=diff
> ==============================================================================
> --- lldb/trunk/include/lldb/API/SBTypeSynthetic.h (original)
> +++ lldb/trunk/include/lldb/API/SBTypeSynthetic.h Mon Jan 28 17:47:25 2013
> @@ -79,15 +79,15 @@ namespace lldb {
>         friend class SBTypeCategory;
>         friend class SBValue;
> 
> -        lldb::TypeSyntheticImplSP
> +        lldb::ScriptedSyntheticChildrenSP
>         GetSP ();
> 
>         void
> -        SetSP (const lldb::TypeSyntheticImplSP &typefilter_impl_sp);    
> +        SetSP (const lldb::ScriptedSyntheticChildrenSP &typefilter_impl_sp);    
> 
> -        lldb::TypeSyntheticImplSP m_opaque_sp;
> +        lldb::ScriptedSyntheticChildrenSP m_opaque_sp;
> 
> -        SBTypeSynthetic (const lldb::TypeSyntheticImplSP &);
> +        SBTypeSynthetic (const lldb::ScriptedSyntheticChildrenSP &);
> 
>         bool
>         CopyOnWrite_Impl();
> 
> Removed: lldb/trunk/include/lldb/Core/CXXFormatterFunctions.h
> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Core/CXXFormatterFunctions.h?rev=173727&view=auto
> ==============================================================================
> --- lldb/trunk/include/lldb/Core/CXXFormatterFunctions.h (original)
> +++ lldb/trunk/include/lldb/Core/CXXFormatterFunctions.h (removed)
> @@ -1,355 +0,0 @@
> -//===-- CXXFormatterFunctions.h------------------------------------*- C++ -*-===//
> -//
> -//                     The LLVM Compiler Infrastructure
> -//
> -// This file is distributed under the University of Illinois Open Source
> -// License. See LICENSE.TXT for details.
> -//
> -//===----------------------------------------------------------------------===//
> -
> -#ifndef liblldb_CXXFormatterFunctions_h_
> -#define liblldb_CXXFormatterFunctions_h_
> -
> -#include <stdint.h>
> -#include "lldb/lldb-forward.h"
> -
> -#include "lldb/Core/ConstString.h"
> -#include "lldb/Core/FormatClasses.h"
> -
> -#include "clang/AST/ASTContext.h"
> -
> -namespace lldb_private {
> -    namespace formatters
> -    {
> -        
> -        bool
> -        ExtractValueFromObjCExpression (ValueObject &valobj,
> -                                        const char* target_type,
> -                                        const char* selector,
> -                                        uint64_t &value);
> -        
> -        lldb::ValueObjectSP
> -        CallSelectorOnObject (ValueObject &valobj,
> -                              const char* return_type,
> -                              const char* selector,
> -                              uint64_t index);
> -        
> -        lldb::ValueObjectSP
> -        CallSelectorOnObject (ValueObject &valobj,
> -                              const char* return_type,
> -                              const char* selector,
> -                              const char* key);
> -        
> -        bool
> -        Char16StringSummaryProvider (ValueObject& valobj, Stream& stream); // char16_t* and unichar*
> -        
> -        bool
> -        Char32StringSummaryProvider (ValueObject& valobj, Stream& stream); // char32_t*
> -        
> -        bool
> -        WCharStringSummaryProvider (ValueObject& valobj, Stream& stream); // wchar_t*
> -        
> -        bool
> -        Char16SummaryProvider (ValueObject& valobj, Stream& stream); // char16_t and unichar
> -        
> -        bool
> -        Char32SummaryProvider (ValueObject& valobj, Stream& stream); // char32_t
> -        
> -        bool
> -        WCharSummaryProvider (ValueObject& valobj, Stream& stream); // wchar_t
> -        
> -        bool
> -        LibcxxStringSummaryProvider (ValueObject& valobj, Stream& stream); // libc++ std::string
> -
> -        bool
> -        LibcxxWStringSummaryProvider (ValueObject& valobj, Stream& stream); // libc++ std::wstring
> -        
> -        template<bool name_entries>
> -        bool
> -        NSDictionarySummaryProvider (ValueObject& valobj, Stream& stream);
> -        
> -        bool
> -        NSArraySummaryProvider (ValueObject& valobj, Stream& stream);
> -        
> -        template<bool needs_at>
> -        bool
> -        NSDataSummaryProvider (ValueObject& valobj, Stream& stream);
> -        
> -        bool
> -        NSNumberSummaryProvider (ValueObject& valobj, Stream& stream);
> -
> -        bool
> -        NSStringSummaryProvider (ValueObject& valobj, Stream& stream);
> -        
> -        bool
> -        ObjCBOOLSummaryProvider (ValueObject& valobj, Stream& stream);
> -        
> -        template <bool is_sel_ptr>
> -        bool
> -        ObjCSELSummaryProvider (ValueObject& valobj, Stream& stream);
> -        
> -        bool
> -        RuntimeSpecificDescriptionSummaryProvider (ValueObject& valobj, Stream& stream);
> -        
> -        extern template bool
> -        NSDictionarySummaryProvider<true> (ValueObject&, Stream&) ;
> -        
> -        extern template bool
> -        NSDictionarySummaryProvider<false> (ValueObject&, Stream&) ;
> -        
> -        extern template bool
> -        NSDataSummaryProvider<true> (ValueObject&, Stream&) ;
> -        
> -        extern template bool
> -        NSDataSummaryProvider<false> (ValueObject&, Stream&) ;
> -        
> -        extern template bool
> -        ObjCSELSummaryProvider<true> (ValueObject&, Stream&);
> -
> -        extern template bool
> -        ObjCSELSummaryProvider<false> (ValueObject&, Stream&);
> -        
> -        class NSArrayMSyntheticFrontEnd : public SyntheticChildrenFrontEnd
> -        {
> -        private:
> -            struct DataDescriptor_32
> -            {
> -                uint32_t _used;
> -                uint32_t _priv1 : 2 ;
> -                uint32_t _size : 30;
> -                uint32_t _priv2 : 2;
> -                uint32_t offset : 30;
> -                uint32_t _priv3;
> -                uint32_t _data;
> -            };
> -            struct DataDescriptor_64
> -            {
> -                uint64_t _used;
> -                uint64_t _priv1 : 2 ;
> -                uint64_t _size : 62;
> -                uint64_t _priv2 : 2;
> -                uint64_t offset : 62;
> -                uint32_t _priv3;
> -                uint64_t _data;
> -            };
> -        public:
> -            NSArrayMSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp);
> -            
> -            virtual size_t
> -            CalculateNumChildren ();
> -            
> -            virtual lldb::ValueObjectSP
> -            GetChildAtIndex (size_t idx);
> -            
> -            virtual bool
> -            Update();
> -            
> -            virtual bool
> -            MightHaveChildren ();
> -            
> -            virtual uint32_t
> -            GetIndexOfChildWithName (const ConstString &name);
> -            
> -            virtual
> -            ~NSArrayMSyntheticFrontEnd ();
> -        private:
> -            ExecutionContextRef m_exe_ctx_ref;
> -            uint8_t m_ptr_size;
> -            DataDescriptor_32 *m_data_32;
> -            DataDescriptor_64 *m_data_64;
> -            ClangASTType m_id_type;
> -            std::vector<lldb::ValueObjectSP> m_children;
> -        };
> -        
> -        class NSArrayISyntheticFrontEnd : public SyntheticChildrenFrontEnd
> -        {
> -        public:
> -            NSArrayISyntheticFrontEnd (lldb::ValueObjectSP valobj_sp);
> -            
> -            virtual size_t
> -            CalculateNumChildren ();
> -            
> -            virtual lldb::ValueObjectSP
> -            GetChildAtIndex (size_t idx);
> -            
> -            virtual bool
> -            Update();
> -            
> -            virtual bool
> -            MightHaveChildren ();
> -            
> -            virtual uint32_t
> -            GetIndexOfChildWithName (const ConstString &name);
> -            
> -            virtual
> -            ~NSArrayISyntheticFrontEnd ();
> -        private:
> -            ExecutionContextRef m_exe_ctx_ref;
> -            uint8_t m_ptr_size;
> -            size_t m_items;
> -            lldb::addr_t m_data_ptr;
> -            ClangASTType m_id_type;
> -            std::vector<lldb::ValueObjectSP> m_children;
> -        };
> -        
> -        class NSArrayCodeRunningSyntheticFrontEnd : public SyntheticChildrenFrontEnd
> -        {
> -        public:
> -            NSArrayCodeRunningSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp);
> -            
> -            virtual size_t
> -            CalculateNumChildren ();
> -            
> -            virtual lldb::ValueObjectSP
> -            GetChildAtIndex (size_t idx);
> -            
> -            virtual bool
> -            Update();
> -            
> -            virtual bool
> -            MightHaveChildren ();
> -            
> -            virtual uint32_t
> -            GetIndexOfChildWithName (const ConstString &name);
> -            
> -            virtual
> -            ~NSArrayCodeRunningSyntheticFrontEnd ();
> -        };
> -        
> -        SyntheticChildrenFrontEnd* NSArraySyntheticFrontEndCreator (CXXSyntheticChildren*, lldb::ValueObjectSP);
> -        
> -        class NSDictionaryISyntheticFrontEnd : public SyntheticChildrenFrontEnd
> -        {
> -        private:
> -            struct DataDescriptor_32
> -            {
> -                uint32_t _used : 26;
> -                uint32_t _szidx : 6;
> -            };
> -            struct DataDescriptor_64
> -            {
> -                uint64_t _used : 58;
> -                uint32_t _szidx : 6;
> -            };
> -            
> -            struct DictionaryItemDescriptor
> -            {
> -                lldb::addr_t key_ptr;
> -                lldb::addr_t val_ptr;
> -                lldb::ValueObjectSP valobj_sp;
> -            };
> -            
> -        public:
> -            NSDictionaryISyntheticFrontEnd (lldb::ValueObjectSP valobj_sp);
> -            
> -            virtual size_t
> -            CalculateNumChildren ();
> -            
> -            virtual lldb::ValueObjectSP
> -            GetChildAtIndex (size_t idx);
> -            
> -            virtual bool
> -            Update();
> -            
> -            virtual bool
> -            MightHaveChildren ();
> -            
> -            virtual uint32_t
> -            GetIndexOfChildWithName (const ConstString &name);
> -            
> -            virtual
> -            ~NSDictionaryISyntheticFrontEnd ();
> -        private:
> -            ExecutionContextRef m_exe_ctx_ref;
> -            uint8_t m_ptr_size;
> -            DataDescriptor_32 *m_data_32;
> -            DataDescriptor_64 *m_data_64;
> -            lldb::addr_t m_data_ptr;
> -            std::vector<DictionaryItemDescriptor> m_children;
> -        };
> -        
> -        class NSDictionaryMSyntheticFrontEnd : public SyntheticChildrenFrontEnd
> -        {
> -        private:
> -            struct DataDescriptor_32
> -            {
> -                uint32_t _used : 26;
> -                uint32_t _kvo : 1;
> -                uint32_t _size;
> -                uint32_t _mutations;
> -                uint32_t _objs_addr;
> -                uint32_t _keys_addr;
> -            };
> -            struct DataDescriptor_64
> -            {
> -                uint64_t _used : 58;
> -                uint32_t _kvo : 1;
> -                uint64_t _size;
> -                uint64_t _mutations;
> -                uint64_t _objs_addr;
> -                uint64_t _keys_addr;
> -            };
> -            struct DictionaryItemDescriptor
> -            {
> -                lldb::addr_t key_ptr;
> -                lldb::addr_t val_ptr;
> -                lldb::ValueObjectSP valobj_sp;
> -            };
> -        public:
> -            NSDictionaryMSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp);
> -            
> -            virtual size_t
> -            CalculateNumChildren ();
> -            
> -            virtual lldb::ValueObjectSP
> -            GetChildAtIndex (size_t idx);
> -            
> -            virtual bool
> -            Update();
> -            
> -            virtual bool
> -            MightHaveChildren ();
> -            
> -            virtual uint32_t
> -            GetIndexOfChildWithName (const ConstString &name);
> -            
> -            virtual
> -            ~NSDictionaryMSyntheticFrontEnd ();
> -        private:
> -            ExecutionContextRef m_exe_ctx_ref;
> -            uint8_t m_ptr_size;
> -            DataDescriptor_32 *m_data_32;
> -            DataDescriptor_64 *m_data_64;
> -            std::vector<DictionaryItemDescriptor> m_children;
> -        };
> -        
> -        class NSDictionaryCodeRunningSyntheticFrontEnd : public SyntheticChildrenFrontEnd
> -        {
> -        public:
> -            NSDictionaryCodeRunningSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp);
> -            
> -            virtual size_t
> -            CalculateNumChildren ();
> -            
> -            virtual lldb::ValueObjectSP
> -            GetChildAtIndex (size_t idx);
> -            
> -            virtual bool
> -            Update();
> -            
> -            virtual bool
> -            MightHaveChildren ();
> -            
> -            virtual uint32_t
> -            GetIndexOfChildWithName (const ConstString &name);
> -            
> -            virtual
> -            ~NSDictionaryCodeRunningSyntheticFrontEnd ();
> -        };
> -        
> -        SyntheticChildrenFrontEnd* NSDictionarySyntheticFrontEndCreator (CXXSyntheticChildren*, lldb::ValueObjectSP);
> -        
> -    }
> -}
> -
> -#endif
> 
> Removed: lldb/trunk/include/lldb/Core/DataVisualization.h
> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Core/DataVisualization.h?rev=173727&view=auto
> ==============================================================================
> --- lldb/trunk/include/lldb/Core/DataVisualization.h (original)
> +++ lldb/trunk/include/lldb/Core/DataVisualization.h (removed)
> @@ -1,174 +0,0 @@
> -//===-- DataVisualization.h ----------------------------------------*- C++ -*-===//
> -//
> -//                     The LLVM Compiler Infrastructure
> -//
> -// This file is distributed under the University of Illinois Open Source
> -// License. See LICENSE.TXT for details.
> -//
> -//===----------------------------------------------------------------------===//
> -
> -#ifndef lldb_DataVisualization_h_
> -#define lldb_DataVisualization_h_
> -
> -// C Includes
> -// C++ Includes
> -
> -// Other libraries and framework includes
> -// Project includes
> -#include "lldb/Core/ConstString.h"
> -#include "lldb/Core/FormatClasses.h"
> -#include "lldb/Core/FormatManager.h"
> -
> -namespace lldb_private {
> -
> -// this class is the high-level front-end of LLDB Data Visualization
> -// code in FormatManager.h/cpp is the low-level implementation of this feature
> -// clients should refer to this class as the entry-point into the data formatters
> -// unless they have a good reason to bypass this and go to the backend
> -class DataVisualization
> -{
> -public:
> -    
> -    // use this call to force the FM to consider itself updated even when there is no apparent reason for that
> -    static void
> -    ForceUpdate();
> -    
> -    static uint32_t
> -    GetCurrentRevision ();
> -    
> -    class ValueFormats
> -    {
> -    public:
> -        static lldb::TypeFormatImplSP
> -        GetFormat (ValueObject& valobj, lldb::DynamicValueType use_dynamic);
> -        
> -        static lldb::TypeFormatImplSP
> -        GetFormat (const ConstString &type);
> -        
> -        static void
> -        Add (const ConstString &type, const lldb::TypeFormatImplSP &entry);
> -        
> -        static bool
> -        Delete (const ConstString &type);
> -        
> -        static void
> -        Clear ();
> -        
> -        static void
> -        LoopThrough (TypeFormatImpl::ValueCallback callback, void* callback_baton);
> -        
> -        static uint32_t
> -        GetCount ();
> -        
> -        static lldb::TypeNameSpecifierImplSP
> -        GetTypeNameSpecifierForFormatAtIndex (uint32_t);
> -        
> -        static lldb::TypeFormatImplSP
> -        GetFormatAtIndex (uint32_t);
> -    };
> -    
> -    static lldb::TypeSummaryImplSP
> -    GetSummaryFormat(ValueObject& valobj,
> -                     lldb::DynamicValueType use_dynamic);
> -
> -    static lldb::TypeSummaryImplSP
> -    GetSummaryForType (lldb::TypeNameSpecifierImplSP type_sp);
> -    
> -#ifndef LLDB_DISABLE_PYTHON
> -    static lldb::SyntheticChildrenSP
> -    GetSyntheticChildrenForType (lldb::TypeNameSpecifierImplSP type_sp);
> -#endif
> -    
> -    static lldb::TypeFilterImplSP
> -    GetFilterForType (lldb::TypeNameSpecifierImplSP type_sp);
> -
> -#ifndef LLDB_DISABLE_PYTHON
> -    static lldb::TypeSyntheticImplSP
> -    GetSyntheticForType (lldb::TypeNameSpecifierImplSP type_sp);
> -#endif
> -    
> -#ifndef LLDB_DISABLE_PYTHON
> -    static lldb::SyntheticChildrenSP
> -    GetSyntheticChildren(ValueObject& valobj,
> -                         lldb::DynamicValueType use_dynamic);
> -#endif
> -    
> -    static bool
> -    AnyMatches(ConstString type_name,
> -               TypeCategoryImpl::FormatCategoryItems items = TypeCategoryImpl::ALL_ITEM_TYPES,
> -               bool only_enabled = true,
> -               const char** matching_category = NULL,
> -               TypeCategoryImpl::FormatCategoryItems* matching_type = NULL);
> -    
> -    class NamedSummaryFormats
> -    {
> -    public:
> -        static bool
> -        GetSummaryFormat (const ConstString &type, lldb::TypeSummaryImplSP &entry);
> -        
> -        static void
> -        Add (const ConstString &type, const lldb::TypeSummaryImplSP &entry);
> -        
> -        static bool
> -        Delete (const ConstString &type);
> -        
> -        static void
> -        Clear ();
> -        
> -        static void
> -        LoopThrough (TypeSummaryImpl::SummaryCallback callback, void* callback_baton);
> -        
> -        static uint32_t
> -        GetCount ();
> -    };
> -    
> -    class Categories
> -    {
> -    public:
> -        
> -        static bool
> -        GetCategory (const ConstString &category,
> -                     lldb::TypeCategoryImplSP &entry,
> -                     bool allow_create = true);
> -
> -        static void
> -        Add (const ConstString &category);
> -        
> -        static bool
> -        Delete (const ConstString &category);
> -        
> -        static void
> -        Clear ();
> -        
> -        static void
> -        Clear (const ConstString &category);
> -        
> -        static void
> -        Enable (const ConstString& category,
> -                CategoryMap::Position = CategoryMap::Default);
> -        
> -        static void
> -        Disable (const ConstString& category);
> -
> -        static void
> -        Enable (const lldb::TypeCategoryImplSP& category,
> -                CategoryMap::Position = CategoryMap::Default);
> -        
> -        static void
> -        Disable (const lldb::TypeCategoryImplSP& category);
> -        
> -        static void
> -        LoopThrough (FormatManager::CategoryCallback callback, void* callback_baton);
> -        
> -        static uint32_t
> -        GetCount ();
> -        
> -        static lldb::TypeCategoryImplSP
> -        GetCategoryAtIndex (uint32_t);
> -    };
> -};
> -
> -    
> -} // namespace lldb_private
> -
> -#endif	// lldb_DataVisualization_h_
> 
> Modified: lldb/trunk/include/lldb/Core/Debugger.h
> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Core/Debugger.h?rev=173728&r1=173727&r2=173728&view=diff
> ==============================================================================
> --- lldb/trunk/include/lldb/Core/Debugger.h (original)
> +++ lldb/trunk/include/lldb/Core/Debugger.h Mon Jan 28 17:47:25 2013
> @@ -23,13 +23,13 @@
> 
> #include "lldb/Core/Broadcaster.h"
> #include "lldb/Core/Communication.h"
> -#include "lldb/Core/FormatManager.h"
> #include "lldb/Core/InputReaderStack.h"
> #include "lldb/Core/Listener.h"
> #include "lldb/Core/StreamFile.h"
> #include "lldb/Core/SourceManager.h"
> #include "lldb/Core/UserID.h"
> #include "lldb/Core/UserSettingsController.h"
> +#include "lldb/DataFormatters/FormatManager.h"
> #include "lldb/Host/Terminal.h"
> #include "lldb/Interpreter/OptionValueProperties.h"
> #include "lldb/Target/ExecutionContext.h"
> 
> Removed: lldb/trunk/include/lldb/Core/FormatClasses.h
> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Core/FormatClasses.h?rev=173727&view=auto
> ==============================================================================
> --- lldb/trunk/include/lldb/Core/FormatClasses.h (original)
> +++ lldb/trunk/include/lldb/Core/FormatClasses.h (removed)
> @@ -1,1598 +0,0 @@
> -//===-- FormatClasses.h -----------------------------------------*- C++ -*-===//
> -//
> -//                     The LLVM Compiler Infrastructure
> -//
> -// This file is distributed under the University of Illinois Open Source
> -// License. See LICENSE.TXT for details.
> -//
> -//===----------------------------------------------------------------------===//
> -
> -#ifndef lldb_FormatClasses_h_
> -#define lldb_FormatClasses_h_
> -
> -// C Includes
> -#include <stdint.h>
> -#include <unistd.h>
> -
> -// C++ Includes
> -#include <string>
> -#include <vector>
> -
> -// Other libraries and framework includes
> -
> -// Project includes
> -#include "lldb/lldb-public.h"
> -#include "lldb/lldb-enumerations.h"
> -
> -#include "lldb/Core/ValueObject.h"
> -#include "lldb/Interpreter/ScriptInterpreterPython.h"
> -#include "lldb/Symbol/Type.h"
> -
> -namespace lldb_private {
> -
> -class TypeFormatImpl
> -{
> -public:
> -    class Flags
> -    {
> -    public:
> -        
> -        Flags () :
> -        m_flags (lldb::eTypeOptionCascade)
> -        {}
> -        
> -        Flags (const Flags& other) :
> -        m_flags (other.m_flags)
> -        {}
> -        
> -        Flags (uint32_t value) :
> -        m_flags (value)
> -        {}
> -        
> -        Flags&
> -        operator = (const Flags& rhs)
> -        {
> -            if (&rhs != this)
> -                m_flags = rhs.m_flags;
> -            
> -            return *this;
> -        }
> -        
> -        Flags&
> -        operator = (const uint32_t& rhs)
> -        {
> -            m_flags = rhs;
> -            return *this;
> -        }
> -        
> -        Flags&
> -        Clear()
> -        {
> -            m_flags = 0;
> -            return *this;
> -        }
> -        
> -        bool
> -        GetCascades () const
> -        {
> -            return (m_flags & lldb::eTypeOptionCascade) == lldb::eTypeOptionCascade;
> -        }
> -        
> -        Flags&
> -        SetCascades (bool value = true)
> -        {
> -            if (value)
> -                m_flags |= lldb::eTypeOptionCascade;
> -            else
> -                m_flags &= ~lldb::eTypeOptionCascade;
> -            return *this;
> -        }
> -        
> -        bool
> -        GetSkipPointers () const
> -        {
> -            return (m_flags & lldb::eTypeOptionSkipPointers) == lldb::eTypeOptionSkipPointers;
> -        }
> -        
> -        Flags&
> -        SetSkipPointers (bool value = true)
> -        {
> -            if (value)
> -                m_flags |= lldb::eTypeOptionSkipPointers;
> -            else
> -                m_flags &= ~lldb::eTypeOptionSkipPointers;
> -            return *this;
> -        }
> -        
> -        bool
> -        GetSkipReferences () const
> -        {
> -            return (m_flags & lldb::eTypeOptionSkipReferences) == lldb::eTypeOptionSkipReferences;
> -        }
> -        
> -        Flags&
> -        SetSkipReferences (bool value = true)
> -        {
> -            if (value)
> -                m_flags |= lldb::eTypeOptionSkipReferences;
> -            else
> -                m_flags &= ~lldb::eTypeOptionSkipReferences;
> -            return *this;
> -        }
> -        
> -        uint32_t
> -        GetValue ()
> -        {
> -            return m_flags;
> -        }
> -        
> -        void
> -        SetValue (uint32_t value)
> -        {
> -            m_flags = value;
> -        }
> -
> -    private:
> -        uint32_t m_flags;
> -    };
> -    
> -    TypeFormatImpl (lldb::Format f = lldb::eFormatInvalid,
> -                 const Flags& flags = Flags());
> -    
> -    typedef STD_SHARED_PTR(TypeFormatImpl) SharedPointer;
> -    typedef bool(*ValueCallback)(void*, ConstString, const lldb::TypeFormatImplSP&);
> -    
> -    ~TypeFormatImpl ()
> -    {
> -    }
> -    
> -    bool
> -    Cascades () const
> -    {
> -        return m_flags.GetCascades();
> -    }
> -    bool
> -    SkipsPointers () const
> -    {
> -        return m_flags.GetSkipPointers();
> -    }
> -    bool
> -    SkipsReferences () const
> -    {
> -        return m_flags.GetSkipReferences();
> -    }
> -    
> -    void
> -    SetCascades (bool value)
> -    {
> -        m_flags.SetCascades(value);
> -    }
> -    
> -    void
> -    SetSkipsPointers (bool value)
> -    {
> -        m_flags.SetSkipPointers(value);
> -    }
> -    
> -    void
> -    SetSkipsReferences (bool value)
> -    {
> -        m_flags.SetSkipReferences(value);
> -    }
> -    
> -    lldb::Format
> -    GetFormat () const
> -    {
> -        return m_format;
> -    }
> -    
> -    void
> -    SetFormat (lldb::Format fmt)
> -    {
> -        m_format = fmt;
> -    }
> -    
> -    uint32_t
> -    GetOptions ()
> -    {
> -        return m_flags.GetValue();
> -    }
> -    
> -    void
> -    SetOptions (uint32_t value)
> -    {
> -        m_flags.SetValue(value);
> -    }
> -    
> -    uint32_t&
> -    GetRevision ()
> -    {
> -        return m_my_revision;
> -    }
> -    
> -    std::string
> -    GetDescription();
> -    
> -protected:
> -    Flags m_flags;
> -    lldb::Format m_format;
> -    uint32_t m_my_revision;
> -    
> -private:
> -    DISALLOW_COPY_AND_ASSIGN(TypeFormatImpl);
> -};
> -
> -class SyntheticChildrenFrontEnd
> -{
> -protected:
> -    ValueObject &m_backend;
> -public:
> -    
> -    SyntheticChildrenFrontEnd (ValueObject &backend) :
> -        m_backend(backend)
> -    {}
> -    
> -    virtual
> -    ~SyntheticChildrenFrontEnd ()
> -    {
> -    }
> -    
> -    virtual size_t
> -    CalculateNumChildren () = 0;
> -    
> -    virtual lldb::ValueObjectSP
> -    GetChildAtIndex (size_t idx) = 0;
> -    
> -    virtual uint32_t
> -    GetIndexOfChildWithName (const ConstString &name) = 0;
> -    
> -    // this function is assumed to always succeed and it if fails, the front-end should know to deal
> -    // with it in the correct way (most probably, by refusing to return any children)
> -    // the return value of Update() should actually be interpreted as "ValueObjectSyntheticFilter cache is good/bad"
> -    // if =true, ValueObjectSyntheticFilter is allowed to use the children it fetched previously and cached
> -    // if =false, ValueObjectSyntheticFilter must throw away its cache, and query again for children
> -    virtual bool
> -    Update () = 0;
> -    
> -    // if this function returns false, then CalculateNumChildren() MUST return 0 since UI frontends
> -    // might validly decide not to inquire for children given a false return value from this call
> -    // if it returns true, then CalculateNumChildren() can return any number >= 0 (0 being valid)
> -    // it should if at all possible be more efficient than CalculateNumChildren()
> -    virtual bool
> -    MightHaveChildren () = 0;
> -    
> -    typedef STD_SHARED_PTR(SyntheticChildrenFrontEnd) SharedPointer;
> -    typedef std::auto_ptr<SyntheticChildrenFrontEnd> AutoPointer;
> -    
> -private:
> -    DISALLOW_COPY_AND_ASSIGN(SyntheticChildrenFrontEnd);
> -};
> -
> -class SyntheticChildren
> -{
> -public:
> -    
> -    class Flags
> -    {
> -    public:
> -        
> -        Flags () :
> -        m_flags (lldb::eTypeOptionCascade)
> -        {}
> -        
> -        Flags (const Flags& other) :
> -        m_flags (other.m_flags)
> -        {}
> -        
> -        Flags (uint32_t value) :
> -        m_flags (value)
> -        {}
> -        
> -        Flags&
> -        operator = (const Flags& rhs)
> -        {
> -            if (&rhs != this)
> -                m_flags = rhs.m_flags;
> -            
> -            return *this;
> -        }
> -        
> -        Flags&
> -        operator = (const uint32_t& rhs)
> -        {
> -            m_flags = rhs;
> -            return *this;
> -        }
> -        
> -        Flags&
> -        Clear()
> -        {
> -            m_flags = 0;
> -            return *this;
> -        }
> -        
> -        bool
> -        GetCascades () const
> -        {
> -            return (m_flags & lldb::eTypeOptionCascade) == lldb::eTypeOptionCascade;
> -        }
> -        
> -        Flags&
> -        SetCascades (bool value = true)
> -        {
> -            if (value)
> -                m_flags |= lldb::eTypeOptionCascade;
> -            else
> -                m_flags &= ~lldb::eTypeOptionCascade;
> -            return *this;
> -        }
> -        
> -        bool
> -        GetSkipPointers () const
> -        {
> -            return (m_flags & lldb::eTypeOptionSkipPointers) == lldb::eTypeOptionSkipPointers;
> -        }
> -        
> -        Flags&
> -        SetSkipPointers (bool value = true)
> -        {
> -            if (value)
> -                m_flags |= lldb::eTypeOptionSkipPointers;
> -            else
> -                m_flags &= ~lldb::eTypeOptionSkipPointers;
> -            return *this;
> -        }
> -        
> -        bool
> -        GetSkipReferences () const
> -        {
> -            return (m_flags & lldb::eTypeOptionSkipReferences) == lldb::eTypeOptionSkipReferences;
> -        }
> -        
> -        Flags&
> -        SetSkipReferences (bool value = true)
> -        {
> -            if (value)
> -                m_flags |= lldb::eTypeOptionSkipReferences;
> -            else
> -                m_flags &= ~lldb::eTypeOptionSkipReferences;
> -            return *this;
> -        }
> -        
> -        uint32_t
> -        GetValue ()
> -        {
> -            return m_flags;
> -        }
> -        
> -        void
> -        SetValue (uint32_t value)
> -        {
> -            m_flags = value;
> -        }
> -        
> -    private:
> -        uint32_t m_flags;
> -    };
> -    
> -    SyntheticChildren (const Flags& flags) :
> -        m_flags(flags)
> -    {
> -    }
> -    
> -    virtual
> -    ~SyntheticChildren ()
> -    {
> -    }
> -    
> -    bool
> -    Cascades () const
> -    {
> -        return m_flags.GetCascades();
> -    }
> -    bool
> -    SkipsPointers () const
> -    {
> -        return m_flags.GetSkipPointers();
> -    }
> -    bool
> -    SkipsReferences () const
> -    {
> -        return m_flags.GetSkipReferences();
> -    }
> -    
> -    void
> -    SetCascades (bool value)
> -    {
> -        m_flags.SetCascades(value);
> -    }
> -    
> -    void
> -    SetSkipsPointers (bool value)
> -    {
> -        m_flags.SetSkipPointers(value);
> -    }
> -    
> -    void
> -    SetSkipsReferences (bool value)
> -    {
> -        m_flags.SetSkipReferences(value);
> -    }
> -    
> -    uint32_t
> -    GetOptions ()
> -    {
> -        return m_flags.GetValue();
> -    }
> -    
> -    void
> -    SetOptions (uint32_t value)
> -    {
> -        m_flags.SetValue(value);
> -    }
> -    
> -    virtual bool
> -    IsScripted () = 0;
> -    
> -    virtual std::string
> -    GetDescription () = 0;
> -    
> -    virtual SyntheticChildrenFrontEnd::AutoPointer
> -    GetFrontEnd (ValueObject &backend) = 0;
> -    
> -    typedef STD_SHARED_PTR(SyntheticChildren) SharedPointer;
> -    typedef bool(*SyntheticChildrenCallback)(void*, ConstString, const SyntheticChildren::SharedPointer&);
> -    
> -    uint32_t&
> -    GetRevision ()
> -    {
> -        return m_my_revision;
> -    }
> -    
> -protected:
> -    uint32_t m_my_revision;
> -    Flags m_flags;
> -    
> -private:
> -    DISALLOW_COPY_AND_ASSIGN(SyntheticChildren);
> -};
> -
> -class TypeFilterImpl : public SyntheticChildren
> -{
> -    std::vector<std::string> m_expression_paths;
> -public:
> -    TypeFilterImpl(const SyntheticChildren::Flags& flags) :
> -        SyntheticChildren(flags),
> -        m_expression_paths()
> -    {
> -    }
> -    
> -    void
> -    AddExpressionPath (const char* path)
> -    {
> -        AddExpressionPath(std::string(path));
> -    }
> -        
> -    void
> -    Clear()
> -    {
> -        m_expression_paths.clear();
> -    }
> -    
> -    size_t
> -    GetCount() const
> -    {
> -        return m_expression_paths.size();
> -    }
> -    
> -    const char*
> -    GetExpressionPathAtIndex(size_t i) const
> -    {
> -        return m_expression_paths[i].c_str();
> -    }
> -    
> -    bool
> -    SetExpressionPathAtIndex (int i, const char* path)
> -    {
> -        return SetExpressionPathAtIndex(i, std::string(path));
> -    }
> -    
> -    void
> -    AddExpressionPath (std::string path)
> -    {
> -        bool need_add_dot = true;
> -        if (path[0] == '.' ||
> -            (path[0] == '-' && path[1] == '>') ||
> -            path[0] == '[')
> -            need_add_dot = false;
> -        // add a '.' symbol to help forgetful users
> -        if(!need_add_dot)
> -            m_expression_paths.push_back(path);
> -        else
> -            m_expression_paths.push_back(std::string(".") + path);
> -    }
> -    
> -    bool
> -    SetExpressionPathAtIndex (int i, std::string path)
> -    {
> -        if (i >= GetCount())
> -            return false;
> -        bool need_add_dot = true;
> -        if (path[0] == '.' ||
> -            (path[0] == '-' && path[1] == '>') ||
> -            path[0] == '[')
> -            need_add_dot = false;
> -        // add a '.' symbol to help forgetful users
> -        if(!need_add_dot)
> -            m_expression_paths[i] = path;
> -        else
> -            m_expression_paths[i] = std::string(".") + path;
> -        return true;
> -    }
> -    
> -    bool
> -    IsScripted()
> -    {
> -        return false;
> -    }
> -    
> -    std::string
> -    GetDescription();
> -    
> -    class FrontEnd : public SyntheticChildrenFrontEnd
> -    {
> -    private:
> -        TypeFilterImpl* filter;
> -    public:
> -        
> -        FrontEnd(TypeFilterImpl* flt,
> -                 ValueObject &backend) :
> -        SyntheticChildrenFrontEnd(backend),
> -        filter(flt)
> -        {}
> -        
> -        virtual
> -        ~FrontEnd()
> -        {
> -        }
> -        
> -        virtual size_t
> -        CalculateNumChildren()
> -        {
> -            return filter->GetCount();
> -        }
> -        
> -        virtual lldb::ValueObjectSP
> -        GetChildAtIndex (size_t idx)
> -        {
> -            if (idx >= filter->GetCount())
> -                return lldb::ValueObjectSP();
> -            return m_backend.GetSyntheticExpressionPathChild(filter->GetExpressionPathAtIndex(idx), true);
> -        }
> -        
> -        virtual bool
> -        Update() { return false; }
> -        
> -        virtual bool
> -        MightHaveChildren ()
> -        {
> -            return filter->GetCount() > 0;
> -        }
> -        
> -        virtual uint32_t
> -        GetIndexOfChildWithName (const ConstString &name)
> -        {
> -            const char* name_cstr = name.GetCString();
> -            for (int i = 0; i < filter->GetCount(); i++)
> -            {
> -                const char* expr_cstr = filter->GetExpressionPathAtIndex(i);
> -                if (expr_cstr)
> -                {
> -                    if (*expr_cstr == '.')
> -                        expr_cstr++;
> -                    else if (*expr_cstr == '-' && *(expr_cstr+1) == '>')
> -                        expr_cstr += 2;
> -                }
> -                if (!::strcmp(name_cstr, expr_cstr))
> -                    return i;
> -            }
> -            return UINT32_MAX;
> -        }
> -        
> -        typedef STD_SHARED_PTR(SyntheticChildrenFrontEnd) SharedPointer;
> -        
> -    private:
> -        DISALLOW_COPY_AND_ASSIGN(FrontEnd);
> -    };
> -    
> -    virtual SyntheticChildrenFrontEnd::AutoPointer
> -    GetFrontEnd(ValueObject &backend)
> -    {
> -        return SyntheticChildrenFrontEnd::AutoPointer(new FrontEnd(this, backend));
> -    }
> -    
> -private:
> -    DISALLOW_COPY_AND_ASSIGN(TypeFilterImpl);
> -};
> -
> -    class CXXSyntheticChildren : public SyntheticChildren
> -    {
> -    public:
> -        typedef SyntheticChildrenFrontEnd* (*CreateFrontEndCallback) (CXXSyntheticChildren*, lldb::ValueObjectSP);
> -    protected:
> -        CreateFrontEndCallback m_create_callback;
> -        std::string m_description;
> -    public:
> -        CXXSyntheticChildren(const SyntheticChildren::Flags& flags,
> -                             const char* description,
> -                             CreateFrontEndCallback callback) :
> -        SyntheticChildren(flags),
> -        m_create_callback(callback),
> -        m_description(description ? description : "")
> -        {
> -        }
> -        
> -        bool
> -        IsScripted()
> -        {
> -            return false;
> -        }
> -        
> -        std::string
> -        GetDescription();
> -                
> -        virtual SyntheticChildrenFrontEnd::AutoPointer
> -        GetFrontEnd(ValueObject &backend)
> -        {
> -            return SyntheticChildrenFrontEnd::AutoPointer(m_create_callback(this, backend.GetSP()));
> -        }
> -        
> -    private:
> -        DISALLOW_COPY_AND_ASSIGN(CXXSyntheticChildren);
> -    };
> -
> -#ifndef LLDB_DISABLE_PYTHON
> -
> -class TypeSyntheticImpl : public SyntheticChildren
> -{
> -    std::string m_python_class;
> -    std::string m_python_code;
> -public:
> -    
> -    TypeSyntheticImpl(const SyntheticChildren::Flags& flags,
> -                      const char* pclass,
> -                      const char* pcode = NULL) :
> -        SyntheticChildren(flags),
> -        m_python_class(),
> -        m_python_code()
> -    {
> -        if (pclass)
> -                m_python_class = pclass;
> -        if (pcode)
> -                m_python_code = pcode;
> -    }
> -
> -    const char*
> -    GetPythonClassName()
> -    {
> -        return m_python_class.c_str();
> -    }
> -
> -    const char*
> -    GetPythonCode()
> -    {
> -        return m_python_code.c_str();
> -    }
> -    
> -    void
> -    SetPythonClassName (const char* fname)
> -    {
> -        m_python_class.assign(fname);
> -        m_python_code.clear();
> -    }
> -    
> -    void
> -    SetPythonCode (const char* script)
> -    {
> -        m_python_code.assign(script);
> -    }
> -    
> -    std::string
> -    GetDescription();
> -    
> -    bool
> -    IsScripted()
> -    {
> -        return true;
> -    }
> -
> -    class FrontEnd : public SyntheticChildrenFrontEnd
> -    {
> -    private:
> -        std::string m_python_class;
> -        lldb::ScriptInterpreterObjectSP m_wrapper_sp;
> -        ScriptInterpreter *m_interpreter;
> -    public:
> -        
> -        FrontEnd(std::string pclass,
> -                 ValueObject &backend);
> -        
> -        virtual
> -        ~FrontEnd();
> -        
> -        virtual size_t
> -        CalculateNumChildren()
> -        {
> -            if (!m_wrapper_sp || m_interpreter == NULL)
> -                return 0;
> -            return m_interpreter->CalculateNumChildren(m_wrapper_sp);
> -        }
> -        
> -        virtual lldb::ValueObjectSP
> -        GetChildAtIndex (size_t idx);
> -        
> -        virtual bool
> -        Update()
> -        {
> -            if (!m_wrapper_sp || m_interpreter == NULL)
> -                return false;
> -            
> -            return m_interpreter->UpdateSynthProviderInstance(m_wrapper_sp);
> -        }
> -        
> -        virtual bool
> -        MightHaveChildren()
> -        {
> -            if (!m_wrapper_sp || m_interpreter == NULL)
> -                return false;
> -            
> -            return m_interpreter->MightHaveChildrenSynthProviderInstance(m_wrapper_sp);
> -        }
> -        
> -        virtual uint32_t
> -        GetIndexOfChildWithName (const ConstString &name)
> -        {
> -            if (!m_wrapper_sp || m_interpreter == NULL)
> -                return UINT32_MAX;
> -            return m_interpreter->GetIndexOfChildWithName(m_wrapper_sp, name.GetCString());
> -        }
> -        
> -        typedef STD_SHARED_PTR(SyntheticChildrenFrontEnd) SharedPointer;
> -
> -    private:
> -        DISALLOW_COPY_AND_ASSIGN(FrontEnd);
> -    };
> -    
> -    virtual SyntheticChildrenFrontEnd::AutoPointer
> -    GetFrontEnd(ValueObject &backend)
> -    {
> -        return SyntheticChildrenFrontEnd::AutoPointer(new FrontEnd(m_python_class, backend));
> -    }    
> -    
> -private:
> -    DISALLOW_COPY_AND_ASSIGN(TypeSyntheticImpl);
> -};
> -
> -#endif // #ifndef LLDB_DISABLE_PYTHON
> -class SyntheticArrayView : public SyntheticChildren
> -{
> -public:
> -    
> -    struct SyntheticArrayRange
> -    {
> -    private:
> -        int m_low;
> -        int m_high;
> -        SyntheticArrayRange* m_next;
> -        
> -    public:
> -        
> -        SyntheticArrayRange () : 
> -        m_low(-1),
> -        m_high(-2),
> -        m_next(NULL)
> -        {}
> -        
> -        SyntheticArrayRange (int L) : 
> -        m_low(L),
> -        m_high(L),
> -        m_next(NULL)
> -        {}
> -        
> -        SyntheticArrayRange (int L, int H) : 
> -        m_low(L),
> -        m_high(H),
> -        m_next(NULL)
> -        {}
> -        
> -        SyntheticArrayRange (int L, int H, SyntheticArrayRange* N) : 
> -        m_low(L),
> -        m_high(H),
> -        m_next(N)
> -        {}
> -        
> -        inline int
> -        GetLow ()
> -        {
> -            return m_low;
> -        }
> -        
> -        inline int
> -        GetHigh ()
> -        {
> -            return m_high;
> -        }
> -        
> -        inline void
> -        SetLow (int L)
> -        {
> -            m_low = L;
> -        }
> -        
> -        inline void
> -        SetHigh (int H)
> -        {
> -            m_high = H;
> -        }
> -        
> -        inline  int
> -        GetSelfCount()
> -        {
> -            return GetHigh() - GetLow() + 1;
> -        }
> -        
> -        int
> -        GetCount()
> -        {
> -            int count = GetSelfCount();
> -            if (m_next)
> -                count += m_next->GetCount();
> -            return count;
> -        }
> -        
> -        inline SyntheticArrayRange*
> -        GetNext()
> -        {
> -            return m_next;
> -        }
> -        
> -        void
> -        SetNext(SyntheticArrayRange* N)
> -        {
> -            if (m_next)
> -                delete m_next;
> -            m_next = N;
> -        }
> -        
> -        void
> -        SetNext(int L, int H)
> -        {
> -            if (m_next)
> -                delete m_next;
> -            m_next = new SyntheticArrayRange(L, H);
> -        }
> -        
> -        void
> -        SetNext(int L)
> -        {
> -            if (m_next)
> -                delete m_next;
> -            m_next = new SyntheticArrayRange(L);
> -        }
> -        
> -        ~SyntheticArrayRange()
> -        {
> -            delete m_next;
> -            m_next = NULL;
> -        }
> -        
> -    };
> -    
> -    SyntheticArrayView(const SyntheticChildren::Flags& flags) :
> -        SyntheticChildren(flags),
> -        m_head(),
> -        m_tail(&m_head)
> -    {
> -    }
> -    
> -    void
> -    AddRange(int L, int H)
> -    {
> -        m_tail->SetLow(L);
> -        m_tail->SetHigh(H);
> -        m_tail->SetNext(new SyntheticArrayRange());
> -        m_tail = m_tail->GetNext();
> -    }
> -    
> -    int
> -    GetCount()
> -    {
> -        return m_head.GetCount();
> -    }
> -    
> -    int
> -    GetRealIndexForIndex(size_t i);
> -    
> -    bool
> -    IsScripted()
> -    {
> -        return false;
> -    }
> -    
> -    std::string
> -    GetDescription();
> -    
> -    class FrontEnd : public SyntheticChildrenFrontEnd
> -    {
> -    private:
> -        SyntheticArrayView* filter;
> -    public:
> -        
> -        FrontEnd(SyntheticArrayView* flt,
> -                 ValueObject &backend) :
> -        SyntheticChildrenFrontEnd(backend),
> -        filter(flt)
> -        {}
> -        
> -        virtual
> -        ~FrontEnd()
> -        {
> -        }
> -        
> -        virtual size_t
> -        CalculateNumChildren()
> -        {
> -            return filter->GetCount();
> -        }
> -        
> -        virtual bool
> -        MightHaveChildren ()
> -        {
> -            return filter->GetCount() > 0;
> -        }
> -        
> -        virtual lldb::ValueObjectSP
> -        GetChildAtIndex (size_t idx)
> -        {
> -            if (idx >= filter->GetCount())
> -                return lldb::ValueObjectSP();
> -            return m_backend.GetSyntheticArrayMember(filter->GetRealIndexForIndex(idx), true);
> -        }
> -        
> -        virtual bool
> -        Update() { return false; }
> -        
> -        virtual uint32_t
> -        GetIndexOfChildWithName (const ConstString &name_cs);
> -        
> -        typedef STD_SHARED_PTR(SyntheticChildrenFrontEnd) SharedPointer;
> -    
> -    private:
> -        DISALLOW_COPY_AND_ASSIGN(FrontEnd);
> -    };
> -    
> -    virtual SyntheticChildrenFrontEnd::AutoPointer
> -    GetFrontEnd(ValueObject &backend)
> -    {
> -        return SyntheticChildrenFrontEnd::AutoPointer(new FrontEnd(this, backend));
> -    }
> -private:
> -    SyntheticArrayRange m_head;
> -    SyntheticArrayRange *m_tail;
> -
> -private:
> -    DISALLOW_COPY_AND_ASSIGN(SyntheticArrayView);
> -};
> -
> -
> -class TypeSummaryImpl
> -{
> -public:
> -    class Flags
> -    {
> -    public:
> -        
> -        Flags () :
> -            m_flags (lldb::eTypeOptionCascade)
> -        {}
> -        
> -        Flags (const Flags& other) :
> -            m_flags (other.m_flags)
> -        {}
> -        
> -        Flags (uint32_t value) :
> -            m_flags (value)
> -        {}
> -        
> -        Flags&
> -        operator = (const Flags& rhs)
> -        {
> -            if (&rhs != this)
> -                m_flags = rhs.m_flags;
> -            
> -            return *this;
> -        }
> -        
> -        Flags&
> -        operator = (const uint32_t& rhs)
> -        {
> -            m_flags = rhs;
> -            return *this;
> -        }
> -        
> -        Flags&
> -        Clear()
> -        {
> -            m_flags = 0;
> -            return *this;
> -        }
> -        
> -        bool
> -        GetCascades () const
> -        {
> -            return (m_flags & lldb::eTypeOptionCascade) == lldb::eTypeOptionCascade;
> -        }
> -        
> -        Flags&
> -        SetCascades (bool value = true)
> -        {
> -            if (value)
> -                m_flags |= lldb::eTypeOptionCascade;
> -            else
> -                m_flags &= ~lldb::eTypeOptionCascade;
> -            return *this;
> -        }
> -
> -        bool
> -        GetSkipPointers () const
> -        {
> -            return (m_flags & lldb::eTypeOptionSkipPointers) == lldb::eTypeOptionSkipPointers;
> -        }
> -
> -        Flags&
> -        SetSkipPointers (bool value = true)
> -        {
> -            if (value)
> -                m_flags |= lldb::eTypeOptionSkipPointers;
> -            else
> -                m_flags &= ~lldb::eTypeOptionSkipPointers;
> -            return *this;
> -        }
> -        
> -        bool
> -        GetSkipReferences () const
> -        {
> -            return (m_flags & lldb::eTypeOptionSkipReferences) == lldb::eTypeOptionSkipReferences;
> -        }
> -        
> -        Flags&
> -        SetSkipReferences (bool value = true)
> -        {
> -            if (value)
> -                m_flags |= lldb::eTypeOptionSkipReferences;
> -            else
> -                m_flags &= ~lldb::eTypeOptionSkipReferences;
> -            return *this;
> -        }
> -        
> -        bool
> -        GetDontShowChildren () const
> -        {
> -            return (m_flags & lldb::eTypeOptionHideChildren) == lldb::eTypeOptionHideChildren;
> -        }
> -        
> -        Flags&
> -        SetDontShowChildren (bool value = true)
> -        {
> -            if (value)
> -                m_flags |= lldb::eTypeOptionHideChildren;
> -            else
> -                m_flags &= ~lldb::eTypeOptionHideChildren;
> -            return *this;
> -        }
> -        
> -        bool
> -        GetDontShowValue () const
> -        {
> -            return (m_flags & lldb::eTypeOptionHideValue) == lldb::eTypeOptionHideValue;
> -        }
> -        
> -        Flags&
> -        SetDontShowValue (bool value = true)
> -        {
> -            if (value)
> -                m_flags |= lldb::eTypeOptionHideValue;
> -            else
> -                m_flags &= ~lldb::eTypeOptionHideValue;
> -            return *this;
> -        }
> -        
> -        bool
> -        GetShowMembersOneLiner () const
> -        {
> -            return (m_flags & lldb::eTypeOptionShowOneLiner) == lldb::eTypeOptionShowOneLiner;
> -        }
> -        
> -        Flags&
> -        SetShowMembersOneLiner (bool value = true)
> -        {
> -            if (value)
> -                m_flags |= lldb::eTypeOptionShowOneLiner;
> -            else
> -                m_flags &= ~lldb::eTypeOptionShowOneLiner;
> -            return *this;
> -        }
> -        
> -        bool
> -        GetHideItemNames () const
> -        {
> -            return (m_flags & lldb::eTypeOptionHideNames) == lldb::eTypeOptionHideNames;
> -        }
> -        
> -        Flags&
> -        SetHideItemNames (bool value = true)
> -        {
> -            if (value)
> -                m_flags |= lldb::eTypeOptionHideNames;
> -            else
> -                m_flags &= ~lldb::eTypeOptionHideNames;
> -            return *this;
> -        }
> -        
> -        uint32_t
> -        GetValue ()
> -        {
> -            return m_flags;
> -        }
> -        
> -        void
> -        SetValue (uint32_t value)
> -        {
> -            m_flags = value;
> -        }
> -                
> -    private:
> -        uint32_t m_flags;
> -    };
> -    
> -    typedef enum Type
> -    {
> -        eTypeUnknown,
> -        eTypeString,
> -        eTypeScript,
> -        eTypeCallback
> -    } Type;
> -    
> -    TypeSummaryImpl (const TypeSummaryImpl::Flags& flags);
> -    
> -    bool
> -    Cascades () const
> -    {
> -        return m_flags.GetCascades();
> -    }
> -    bool
> -    SkipsPointers () const
> -    {
> -        return m_flags.GetSkipPointers();
> -    }
> -    bool
> -    SkipsReferences () const
> -    {
> -        return m_flags.GetSkipReferences();
> -    }
> -    
> -    bool
> -    DoesPrintChildren () const
> -    {
> -        return !m_flags.GetDontShowChildren();
> -    }
> -    
> -    bool
> -    DoesPrintValue () const
> -    {
> -        return !m_flags.GetDontShowValue();
> -    }
> -    
> -    bool
> -    IsOneliner () const
> -    {
> -        return m_flags.GetShowMembersOneLiner();
> -    }
> -    
> -    bool
> -    HideNames () const
> -    {
> -        return m_flags.GetHideItemNames();
> -    }
> -    
> -    void
> -    SetCascades (bool value)
> -    {
> -        m_flags.SetCascades(value);
> -    }
> -    
> -    void
> -    SetSkipsPointers (bool value)
> -    {
> -        m_flags.SetSkipPointers(value);
> -    }
> -    
> -    void
> -    SetSkipsReferences (bool value)
> -    {
> -        m_flags.SetSkipReferences(value);
> -    }
> -    
> -    void
> -    SetDoesPrintChildren (bool value)
> -    {
> -        m_flags.SetDontShowChildren(!value);
> -    }
> -    
> -    void
> -    SetDoesPrintValue (bool value)
> -    {
> -        m_flags.SetDontShowValue(!value);
> -    }
> -    
> -    void
> -    SetIsOneliner (bool value)
> -    {
> -        m_flags.SetShowMembersOneLiner(value);
> -    }
> -    
> -    void
> -    SetHideNames (bool value)
> -    {
> -        m_flags.SetHideItemNames(value);
> -    }
> -    
> -    uint32_t
> -    GetOptions ()
> -    {
> -        return m_flags.GetValue();
> -    }
> -    
> -    void
> -    SetOptions (uint32_t value)
> -    {
> -        m_flags.SetValue(value);
> -    }
> -    
> -    virtual
> -    ~TypeSummaryImpl ()
> -    {
> -    }
> -    
> -    // we are using a ValueObject* instead of a ValueObjectSP because we do not need to hold on to this for
> -    // extended periods of time and we trust the ValueObject to stay around for as long as it is required
> -    // for us to generate its summary
> -    virtual bool
> -    FormatObject (ValueObject *valobj,
> -                  std::string& dest) = 0;
> -    
> -    virtual std::string
> -    GetDescription () = 0;
> -    
> -    virtual bool
> -    IsScripted() = 0;
> -    
> -    virtual Type
> -    GetType () = 0;
> -    
> -    uint32_t&
> -    GetRevision ()
> -    {
> -        return m_my_revision;
> -    }
> -    
> -    typedef STD_SHARED_PTR(TypeSummaryImpl) SharedPointer;
> -    typedef bool(*SummaryCallback)(void*, ConstString, const lldb::TypeSummaryImplSP&);
> -    typedef bool(*RegexSummaryCallback)(void*, lldb::RegularExpressionSP, const lldb::TypeSummaryImplSP&);
> -
> -protected:
> -    uint32_t m_my_revision;
> -    Flags m_flags;
> -    
> -private:
> -    DISALLOW_COPY_AND_ASSIGN(TypeSummaryImpl);
> -};
> -
> -// simple string-based summaries, using ${var to show data
> -struct StringSummaryFormat : public TypeSummaryImpl
> -{
> -    std::string m_format;
> -    
> -    StringSummaryFormat(const TypeSummaryImpl::Flags& flags,
> -                        const char* f);
> -    
> -    const char*
> -    GetSummaryString () const
> -    {
> -        return m_format.c_str();
> -    }
> -    
> -    void
> -    SetSummaryString (const char* data)
> -    {
> -        if (data)
> -                m_format.assign(data);
> -        else
> -                m_format.clear();
> -    }
> -    
> -    virtual
> -    ~StringSummaryFormat()
> -    {
> -    }
> -    
> -    virtual bool
> -    FormatObject(ValueObject *valobj,
> -                 std::string& dest);
> -    
> -    virtual std::string
> -    GetDescription();
> -    
> -    virtual bool
> -    IsScripted()
> -    {
> -        return false;
> -    }
> -
> -    
> -    virtual Type
> -    GetType ()
> -    {
> -        return TypeSummaryImpl::eTypeString;
> -    }
> -    
> -private:
> -    DISALLOW_COPY_AND_ASSIGN(StringSummaryFormat);
> -};
> -
> -// summaries implemented via a C++ function
> -struct CXXFunctionSummaryFormat : public TypeSummaryImpl
> -{
> -    
> -    // we should convert these to SBValue and SBStream if we ever cross
> -    // the boundary towards the external world
> -    typedef bool (*Callback)(ValueObject& valobj,
> -                             Stream& dest);
> -    
> -    
> -    Callback m_impl;
> -    std::string m_description;
> -    
> -    CXXFunctionSummaryFormat(const TypeSummaryImpl::Flags& flags,
> -                             Callback impl,
> -                             const char* description);
> -    
> -    Callback
> -    GetBackendFunction () const
> -    {
> -        return m_impl;
> -    }
> -    
> -    const char*
> -    GetTextualInfo () const
> -    {
> -        return m_description.c_str();
> -    }
> -    
> -    void
> -    SetBackendFunction (Callback cb_func)
> -    {
> -        m_impl = cb_func;
> -    }
> -    
> -    void
> -    SetTextualInfo (const char* descr)
> -    {
> -        if (descr)
> -            m_description.assign(descr);
> -        else
> -            m_description.clear();
> -    }
> -    
> -    virtual
> -    ~CXXFunctionSummaryFormat()
> -    {
> -    }
> -    
> -    virtual bool
> -    FormatObject(ValueObject *valobj,
> -                 std::string& dest);
> -    
> -    virtual std::string
> -    GetDescription();
> -    
> -    virtual bool
> -    IsScripted()
> -    {
> -        return false;
> -    }
> -    
> -    virtual Type
> -    GetType ()
> -    {
> -        return TypeSummaryImpl::eTypeCallback;
> -    }
> -    
> -    typedef STD_SHARED_PTR(CXXFunctionSummaryFormat) SharedPointer;
> -
> -private:
> -    DISALLOW_COPY_AND_ASSIGN(CXXFunctionSummaryFormat);
> -};
> -    
> -#ifndef LLDB_DISABLE_PYTHON
> -
> -// Python-based summaries, running script code to show data
> -struct ScriptSummaryFormat : public TypeSummaryImpl
> -{
> -    std::string m_function_name;
> -    std::string m_python_script;
> -    lldb::ScriptInterpreterObjectSP m_script_function_sp;
> -    
> -    ScriptSummaryFormat(const TypeSummaryImpl::Flags& flags,
> -                        const char *function_name,
> -                        const char* python_script = NULL);
> -    
> -    const char*
> -    GetFunctionName () const
> -    {
> -        return m_function_name.c_str();
> -    }
> -    
> -    const char*
> -    GetPythonScript () const
> -    {
> -        return m_python_script.c_str();
> -    }
> -    
> -    void
> -    SetFunctionName (const char* function_name)
> -    {
> -        if (function_name)
> -                m_function_name.assign(function_name);
> -        else
> -                m_function_name.clear();
> -        m_python_script.clear();
> -    }
> -    
> -    void
> -    SetPythonScript (const char* script)
> -    {
> -        if (script)
> -                m_python_script.assign(script);
> -        else
> -                m_python_script.clear();
> -    }
> -    
> -    virtual
> -    ~ScriptSummaryFormat()
> -    {
> -    }
> -    
> -    virtual bool
> -    FormatObject(ValueObject *valobj,
> -                 std::string& dest);
> -    
> -    virtual std::string
> -    GetDescription();
> -    
> -    virtual bool
> -    IsScripted()
> -    {
> -        return true;
> -    }
> -    
> -    virtual Type
> -    GetType ()
> -    {
> -        return TypeSummaryImpl::eTypeScript;
> -    }
> -    
> -    typedef STD_SHARED_PTR(ScriptSummaryFormat) SharedPointer;
> -
> -    
> -private:
> -    DISALLOW_COPY_AND_ASSIGN(ScriptSummaryFormat);
> -};
> -
> -#endif // #ifndef LLDB_DISABLE_PYTHON
> -
> -// TODO: at the moment, this class is only used as a backing store for SBTypeNameSpecifier in the public API
> -// In the future, this might be used as the basic unit for typename-to-formatter matching, replacing
> -// the current plain/regexp distinction in FormatNavigator<>
> -class TypeNameSpecifierImpl
> -{
> -public:
> -    
> -    TypeNameSpecifierImpl() :
> -    m_is_regex(false),
> -    m_type()
> -    {
> -    }
> -    
> -    TypeNameSpecifierImpl (const char* name, bool is_regex) :
> -    m_is_regex(is_regex),
> -    m_type()
> -    {
> -        if (name)
> -            m_type.m_type_name.assign(name);
> -    }
> -    
> -    // if constructing with a given type, is_regex cannot be true since we are
> -    // giving an exact type to match
> -    TypeNameSpecifierImpl (lldb::TypeSP type) :
> -    m_is_regex(false),
> -    m_type()
> -    {
> -        if (type)
> -        {
> -            m_type.m_type_name.assign(type->GetName().GetCString());
> -            m_type.m_typeimpl_sp = lldb::TypeImplSP(new TypeImpl(type));
> -        }
> -    }
> -
> -    TypeNameSpecifierImpl (ClangASTType type) :
> -    m_is_regex(false),
> -    m_type()
> -    {
> -        if (type.IsValid())
> -        {
> -            m_type.m_type_name.assign(type.GetConstTypeName().GetCString());
> -            m_type.m_typeimpl_sp = lldb::TypeImplSP(new TypeImpl(type));
> -        }
> -    }
> -    
> -    const char*
> -    GetName()
> -    {
> -        if (m_type.m_type_name.size())
> -            return m_type.m_type_name.c_str();
> -        return NULL;
> -    }
> -    
> -    lldb::TypeSP
> -    GetTypeSP ()
> -    {
> -        if (m_type.m_typeimpl_sp && m_type.m_typeimpl_sp->IsValid())
> -            return m_type.m_typeimpl_sp->GetTypeSP();
> -        return lldb::TypeSP();
> -    }
> -    
> -    ClangASTType
> -    GetClangASTType ()
> -    {
> -        if (m_type.m_typeimpl_sp && m_type.m_typeimpl_sp->IsValid())
> -            return m_type.m_typeimpl_sp->GetClangASTType();
> -        return ClangASTType();
> -    }
> -    
> -    bool
> -    IsRegex()
> -    {
> -        return m_is_regex;
> -    }
> -    
> -private:
> -    bool m_is_regex;
> -    // this works better than TypeAndOrName because the latter only wraps a TypeSP
> -    // whereas TypeImplSP can also be backed by a ClangASTType which is more commonly
> -    // used in LLDB. moreover, TypeImplSP is also what is currently backing SBType
> -    struct TypeOrName
> -    {
> -        std::string m_type_name;
> -        lldb::TypeImplSP m_typeimpl_sp;
> -    };
> -    TypeOrName m_type;
> -    
> -    
> -private:
> -    DISALLOW_COPY_AND_ASSIGN(TypeNameSpecifierImpl);
> -};
> -    
> -} // namespace lldb_private
> -
> -#endif	// lldb_FormatClasses_h_
> 
> Removed: lldb/trunk/include/lldb/Core/FormatManager.h
> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Core/FormatManager.h?rev=173727&view=auto
> ==============================================================================
> --- lldb/trunk/include/lldb/Core/FormatManager.h (original)
> +++ lldb/trunk/include/lldb/Core/FormatManager.h (removed)
> @@ -1,776 +0,0 @@
> -//===-- FormatManager.h -------------------------------------------*- C++ -*-===//
> -//
> -//                     The LLVM Compiler Infrastructure
> -//
> -// This file is distributed under the University of Illinois Open Source
> -// License. See LICENSE.TXT for details.
> -//
> -//===----------------------------------------------------------------------===//
> -
> -#ifndef lldb_FormatManager_h_
> -#define lldb_FormatManager_h_
> -
> -// C Includes
> -// C++ Includes
> -
> -// Other libraries and framework includes
> -// Project includes
> -#include "lldb/lldb-public.h"
> -#include "lldb/lldb-enumerations.h"
> -
> -#include "lldb/Core/FormatNavigator.h"
> -#include "lldb/Interpreter/ScriptInterpreterPython.h"
> -#include "lldb/Target/ExecutionContext.h"
> -#include "lldb/Target/Platform.h"
> -
> -using lldb::LogSP;
> -
> -namespace lldb_private {
> -    
> -// this file (and its. cpp) contain the low-level implementation of LLDB Data Visualization
> -// class DataVisualization is the high-level front-end of this feature
> -// clients should refer to that class as the entry-point into the data formatters
> -// unless they have a good reason to bypass it and prefer to use this file's objects directly
> -    
> -class CategoryMap;
> -    
> -class TypeCategoryImpl
> -{
> -private:
> -    
> -    typedef FormatNavigator<ConstString, TypeSummaryImpl> SummaryNavigator;
> -    typedef FormatNavigator<lldb::RegularExpressionSP, TypeSummaryImpl> RegexSummaryNavigator;
> -    
> -    typedef FormatNavigator<ConstString, TypeFilterImpl> FilterNavigator;
> -    typedef FormatNavigator<lldb::RegularExpressionSP, TypeFilterImpl> RegexFilterNavigator;
> -    
> -#ifndef LLDB_DISABLE_PYTHON
> -    typedef FormatNavigator<ConstString, TypeSyntheticImpl> SynthNavigator;
> -    typedef FormatNavigator<lldb::RegularExpressionSP, TypeSyntheticImpl> RegexSynthNavigator;
> -#endif // #ifndef LLDB_DISABLE_PYTHON
> -
> -    typedef SummaryNavigator::MapType SummaryMap;
> -    typedef RegexSummaryNavigator::MapType RegexSummaryMap;
> -    typedef FilterNavigator::MapType FilterMap;
> -    typedef RegexFilterNavigator::MapType RegexFilterMap;
> -#ifndef LLDB_DISABLE_PYTHON
> -    typedef SynthNavigator::MapType SynthMap;
> -    typedef RegexSynthNavigator::MapType RegexSynthMap;
> -#endif // #ifndef LLDB_DISABLE_PYTHON
> -
> -public:
> -        
> -    typedef uint16_t FormatCategoryItems;
> -    static const uint16_t ALL_ITEM_TYPES = UINT16_MAX;
> -    
> -    typedef SummaryNavigator::SharedPointer SummaryNavigatorSP;
> -    typedef RegexSummaryNavigator::SharedPointer RegexSummaryNavigatorSP;
> -    typedef FilterNavigator::SharedPointer FilterNavigatorSP;
> -    typedef RegexFilterNavigator::SharedPointer RegexFilterNavigatorSP;
> -#ifndef LLDB_DISABLE_PYTHON
> -    typedef SynthNavigator::SharedPointer SynthNavigatorSP;
> -    typedef RegexSynthNavigator::SharedPointer RegexSynthNavigatorSP;
> -#endif // #ifndef LLDB_DISABLE_PYTHON
> -
> -    TypeCategoryImpl (IFormatChangeListener* clist,
> -                      ConstString name);
> -    
> -    SummaryNavigatorSP
> -    GetSummaryNavigator ()
> -    {
> -        return SummaryNavigatorSP(m_summary_nav);
> -    }
> -    
> -    RegexSummaryNavigatorSP
> -    GetRegexSummaryNavigator ()
> -    {
> -        return RegexSummaryNavigatorSP(m_regex_summary_nav);
> -    }
> -    
> -    FilterNavigatorSP
> -    GetFilterNavigator ()
> -    {
> -        return FilterNavigatorSP(m_filter_nav);
> -    }
> -    
> -    RegexFilterNavigatorSP
> -    GetRegexFilterNavigator ()
> -    {
> -        return RegexFilterNavigatorSP(m_regex_filter_nav);
> -    }
> -    
> -    SummaryNavigator::MapValueType
> -    GetSummaryForType (lldb::TypeNameSpecifierImplSP type_sp)
> -    {
> -        SummaryNavigator::MapValueType retval;
> -        
> -        if (type_sp)
> -        {
> -            if (type_sp->IsRegex())
> -                m_regex_summary_nav->GetExact(ConstString(type_sp->GetName()),retval);
> -            else
> -                m_summary_nav->GetExact(ConstString(type_sp->GetName()),retval);
> -        }
> -
> -        return retval;
> -    }
> -    
> -    FilterNavigator::MapValueType
> -    GetFilterForType (lldb::TypeNameSpecifierImplSP type_sp)
> -    {
> -        FilterNavigator::MapValueType retval;
> -        
> -        if (type_sp)
> -        {
> -            if (type_sp->IsRegex())
> -                m_regex_filter_nav->GetExact(ConstString(type_sp->GetName()),retval);
> -            else
> -                m_filter_nav->GetExact(ConstString(type_sp->GetName()),retval);
> -        }
> -        
> -        return retval;
> -    }
> -    
> -#ifndef LLDB_DISABLE_PYTHON
> -    SynthNavigator::MapValueType
> -    GetSyntheticForType (lldb::TypeNameSpecifierImplSP type_sp)
> -    {
> -        SynthNavigator::MapValueType retval;
> -        
> -        if (type_sp)
> -        {
> -            if (type_sp->IsRegex())
> -                m_regex_synth_nav->GetExact(ConstString(type_sp->GetName()),retval);
> -            else
> -                m_synth_nav->GetExact(ConstString(type_sp->GetName()),retval);
> -        }
> -        
> -        return retval;
> -    }
> -#endif
> -    
> -    lldb::TypeNameSpecifierImplSP
> -    GetTypeNameSpecifierForSummaryAtIndex (size_t index)
> -    {
> -        if (index < m_summary_nav->GetCount())
> -            return m_summary_nav->GetTypeNameSpecifierAtIndex(index);
> -        else
> -            return m_regex_summary_nav->GetTypeNameSpecifierAtIndex(index-m_summary_nav->GetCount());
> -    }
> -    
> -    SummaryNavigator::MapValueType
> -    GetSummaryAtIndex (size_t index)
> -    {
> -        if (index < m_summary_nav->GetCount())
> -            return m_summary_nav->GetAtIndex(index);
> -        else
> -            return m_regex_summary_nav->GetAtIndex(index-m_summary_nav->GetCount());
> -    }
> -
> -    FilterNavigator::MapValueType
> -    GetFilterAtIndex (size_t index)
> -    {
> -        if (index < m_filter_nav->GetCount())
> -            return m_filter_nav->GetAtIndex(index);
> -        else
> -            return m_regex_filter_nav->GetAtIndex(index-m_filter_nav->GetCount());
> -    }
> -    
> -    lldb::TypeNameSpecifierImplSP
> -    GetTypeNameSpecifierForFilterAtIndex (size_t index)
> -    {
> -        if (index < m_filter_nav->GetCount())
> -            return m_filter_nav->GetTypeNameSpecifierAtIndex(index);
> -        else
> -            return m_regex_filter_nav->GetTypeNameSpecifierAtIndex(index-m_filter_nav->GetCount());
> -    }
> -
> -#ifndef LLDB_DISABLE_PYTHON
> -    SynthNavigatorSP
> -    GetSyntheticNavigator ()
> -    {
> -        return SynthNavigatorSP(m_synth_nav);
> -    }
> -    
> -    RegexSynthNavigatorSP
> -    GetRegexSyntheticNavigator ()
> -    {
> -        return RegexSynthNavigatorSP(m_regex_synth_nav);
> -    }
> -    
> -    SynthNavigator::MapValueType
> -    GetSyntheticAtIndex (size_t index)
> -    {
> -        if (index < m_synth_nav->GetCount())
> -            return m_synth_nav->GetAtIndex(index);
> -        else
> -            return m_regex_synth_nav->GetAtIndex(index-m_synth_nav->GetCount());
> -    }
> -    
> -    lldb::TypeNameSpecifierImplSP
> -    GetTypeNameSpecifierForSyntheticAtIndex (size_t index)
> -    {
> -        if (index < m_synth_nav->GetCount())
> -            return m_synth_nav->GetTypeNameSpecifierAtIndex(index);
> -        else
> -            return m_regex_synth_nav->GetTypeNameSpecifierAtIndex(index - m_synth_nav->GetCount());
> -    }
> -    
> -#endif // #ifndef LLDB_DISABLE_PYTHON
> -
> -    bool
> -    IsEnabled () const
> -    {
> -        return m_enabled;
> -    }
> -    
> -    uint32_t
> -    GetEnabledPosition()
> -    {
> -        if (m_enabled == false)
> -            return UINT32_MAX;
> -        else
> -            return m_enabled_position;
> -    }
> -    
> -    bool
> -    Get (ValueObject& valobj,
> -         lldb::TypeSummaryImplSP& entry,
> -         lldb::DynamicValueType use_dynamic,
> -         uint32_t* reason = NULL);
> -    
> -    bool
> -    Get (ValueObject& valobj,
> -         lldb::SyntheticChildrenSP& entry,
> -         lldb::DynamicValueType use_dynamic,
> -         uint32_t* reason = NULL);
> -        
> -    void
> -    Clear (FormatCategoryItems items = ALL_ITEM_TYPES);
> -    
> -    bool
> -    Delete (ConstString name,
> -            FormatCategoryItems items = ALL_ITEM_TYPES);
> -    
> -    uint32_t
> -    GetCount (FormatCategoryItems items = ALL_ITEM_TYPES);
> -    
> -    const char*
> -    GetName ()
> -    {
> -        return m_name.GetCString();
> -    }
> -    
> -    bool
> -    AnyMatches (ConstString type_name,
> -                FormatCategoryItems items = ALL_ITEM_TYPES,
> -                bool only_enabled = true,
> -                const char** matching_category = NULL,
> -                FormatCategoryItems* matching_type = NULL);
> -    
> -    typedef STD_SHARED_PTR(TypeCategoryImpl) SharedPointer;
> -    
> -private:
> -    SummaryNavigator::SharedPointer m_summary_nav;
> -    RegexSummaryNavigator::SharedPointer m_regex_summary_nav;
> -    FilterNavigator::SharedPointer m_filter_nav;
> -    RegexFilterNavigator::SharedPointer m_regex_filter_nav;
> -#ifndef LLDB_DISABLE_PYTHON
> -    SynthNavigator::SharedPointer m_synth_nav;
> -    RegexSynthNavigator::SharedPointer m_regex_synth_nav;
> -#endif // #ifndef LLDB_DISABLE_PYTHON
> -    
> -    bool m_enabled;
> -    
> -    IFormatChangeListener* m_change_listener;
> -    
> -    Mutex m_mutex;
> -    
> -    ConstString m_name;
> -    
> -    uint32_t m_enabled_position;
> -    
> -    void
> -    Enable (bool value,
> -            uint32_t position)
> -    {
> -        Mutex::Locker locker(m_mutex);
> -        m_enabled = value;
> -        m_enabled_position = position;
> -        if (m_change_listener)
> -            m_change_listener->Changed();
> -    }
> -    
> -    void
> -    Disable ()
> -    {
> -        Enable(false, UINT32_MAX);
> -    }
> -    
> -    friend class CategoryMap;
> -    
> -    friend class FormatNavigator<ConstString, TypeSummaryImpl>;
> -    friend class FormatNavigator<lldb::RegularExpressionSP, TypeSummaryImpl>;
> -    
> -    friend class FormatNavigator<ConstString, TypeFilterImpl>;
> -    friend class FormatNavigator<lldb::RegularExpressionSP, TypeFilterImpl>;
> -    
> -#ifndef LLDB_DISABLE_PYTHON
> -    friend class FormatNavigator<ConstString, TypeSyntheticImpl>;
> -    friend class FormatNavigator<lldb::RegularExpressionSP, TypeSyntheticImpl>;
> -#endif // #ifndef LLDB_DISABLE_PYTHON
> -    
> -
> -};
> -
> -class CategoryMap
> -{
> -private:
> -    typedef ConstString KeyType;
> -    typedef TypeCategoryImpl ValueType;
> -    typedef ValueType::SharedPointer ValueSP;
> -    typedef std::list<lldb::TypeCategoryImplSP> ActiveCategoriesList;
> -    typedef ActiveCategoriesList::iterator ActiveCategoriesIterator;
> -        
> -public:
> -    typedef std::map<KeyType, ValueSP> MapType;
> -    typedef MapType::iterator MapIterator;
> -    typedef bool(*CallbackType)(void*, const ValueSP&);
> -    typedef uint32_t Position;
> -    
> -    static const Position First = 0;
> -    static const Position Default = 1;
> -    static const Position Last = UINT32_MAX;
> -    
> -    CategoryMap (IFormatChangeListener* lst) :
> -        m_map_mutex(Mutex::eMutexTypeRecursive),
> -        listener(lst),
> -        m_map(),
> -        m_active_categories()
> -    {
> -        ConstString default_cs("default");
> -        lldb::TypeCategoryImplSP default_sp = lldb::TypeCategoryImplSP(new TypeCategoryImpl(listener, default_cs));
> -        Add(default_cs,default_sp);
> -        Enable(default_cs,First);
> -    }
> -    
> -    void
> -    Add (KeyType name,
> -         const ValueSP& entry)
> -    {
> -        Mutex::Locker locker(m_map_mutex);
> -        m_map[name] = entry;
> -        if (listener)
> -            listener->Changed();
> -    }
> -    
> -    bool
> -    Delete (KeyType name)
> -    {
> -        Mutex::Locker locker(m_map_mutex);
> -        MapIterator iter = m_map.find(name);
> -        if (iter == m_map.end())
> -            return false;
> -        m_map.erase(name);
> -        Disable(name);
> -        if (listener)
> -            listener->Changed();
> -        return true;
> -    }
> -    
> -    bool
> -    Enable (KeyType category_name,
> -            Position pos = Default)
> -    {
> -        Mutex::Locker locker(m_map_mutex);
> -        ValueSP category;
> -        if (!Get(category_name,category))
> -            return false;
> -        return Enable(category, pos);
> -    }
> -    
> -    bool
> -    Disable (KeyType category_name)
> -    {
> -        Mutex::Locker locker(m_map_mutex);
> -        ValueSP category;
> -        if (!Get(category_name,category))
> -            return false;
> -        return Disable(category);
> -    }
> -    
> -    bool
> -    Enable (ValueSP category,
> -            Position pos = Default)
> -    {
> -        Mutex::Locker locker(m_map_mutex);
> -        if (category.get())
> -        {
> -            Position pos_w = pos;
> -            if (pos == First || m_active_categories.size() == 0)
> -                m_active_categories.push_front(category);
> -            else if (pos == Last || pos == m_active_categories.size())
> -                m_active_categories.push_back(category);
> -            else if (pos < m_active_categories.size())
> -            {
> -                ActiveCategoriesList::iterator iter = m_active_categories.begin();
> -                while (pos_w)
> -                {
> -                    pos_w--,iter++;
> -                }
> -                m_active_categories.insert(iter,category);
> -            }
> -            else
> -                return false;
> -            category->Enable(true,
> -                             pos);
> -            return true;
> -        }
> -        return false;
> -    }
> -    
> -    bool
> -    Disable (ValueSP category)
> -    {
> -        Mutex::Locker locker(m_map_mutex);
> -        if (category.get())
> -        {
> -            m_active_categories.remove_if(delete_matching_categories(category));
> -            category->Disable();
> -            return true;
> -        }
> -        return false;
> -    }
> -    
> -    void
> -    Clear ()
> -    {
> -        Mutex::Locker locker(m_map_mutex);
> -        m_map.clear();
> -        m_active_categories.clear();
> -        if (listener)
> -            listener->Changed();
> -    }
> -    
> -    bool
> -    Get (KeyType name,
> -         ValueSP& entry)
> -    {
> -        Mutex::Locker locker(m_map_mutex);
> -        MapIterator iter = m_map.find(name);
> -        if (iter == m_map.end())
> -            return false;
> -        entry = iter->second;
> -        return true;
> -    }
> -    
> -    bool
> -    Get (uint32_t pos,
> -         ValueSP& entry)
> -    {
> -        Mutex::Locker locker(m_map_mutex);
> -        MapIterator iter = m_map.begin();
> -        MapIterator end = m_map.end();
> -        while (pos > 0)
> -        {
> -            iter++;
> -            pos--;
> -            if (iter == end)
> -                return false;
> -        }
> -        entry = iter->second;
> -        return false;
> -    }
> -    
> -    void
> -    LoopThrough (CallbackType callback, void* param);
> -    
> -    lldb::TypeCategoryImplSP
> -    GetAtIndex (size_t index);
> -    
> -    bool
> -    AnyMatches (ConstString type_name,
> -                TypeCategoryImpl::FormatCategoryItems items = TypeCategoryImpl::ALL_ITEM_TYPES,
> -                bool only_enabled = true,
> -                const char** matching_category = NULL,
> -                TypeCategoryImpl::FormatCategoryItems* matching_type = NULL);
> -    
> -    size_t
> -    GetCount ()
> -    {
> -        return m_map.size();
> -    }
> -    
> -    lldb::TypeSummaryImplSP
> -    GetSummaryFormat (ValueObject& valobj,
> -         lldb::DynamicValueType use_dynamic);
> -    
> -#ifndef LLDB_DISABLE_PYTHON
> -    lldb::SyntheticChildrenSP
> -    GetSyntheticChildren (ValueObject& valobj,
> -                          lldb::DynamicValueType use_dynamic);
> -#endif
> -    
> -private:
> -    
> -    class delete_matching_categories
> -    {
> -        lldb::TypeCategoryImplSP ptr;
> -    public:
> -        delete_matching_categories(lldb::TypeCategoryImplSP p) : ptr(p)
> -        {}
> -        
> -        bool operator()(const lldb::TypeCategoryImplSP& other)
> -        {
> -            return ptr.get() == other.get();
> -        }
> -    };
> -    
> -    Mutex m_map_mutex;
> -    IFormatChangeListener* listener;
> -    
> -    MapType m_map;
> -    ActiveCategoriesList m_active_categories;
> -    
> -    MapType& map ()
> -    {
> -        return m_map;
> -    }
> -    
> -    ActiveCategoriesList& active_list ()
> -    {
> -        return m_active_categories;
> -    }
> -    
> -    Mutex& mutex ()
> -    {
> -        return m_map_mutex;
> -    }
> -    
> -    friend class FormatNavigator<KeyType, ValueType>;
> -    friend class FormatManager;
> -};
> -
> -class FormatManager : public IFormatChangeListener
> -{
> -    typedef FormatNavigator<ConstString, TypeFormatImpl> ValueNavigator;
> -    typedef ValueNavigator::MapType ValueMap;
> -    typedef FormatMap<ConstString, TypeSummaryImpl> NamedSummariesMap;
> -    typedef CategoryMap::MapType::iterator CategoryMapIterator;
> -public:
> -    
> -    typedef CategoryMap::CallbackType CategoryCallback;
> -    
> -    FormatManager ();
> -    
> -    ValueNavigator&
> -    GetValueNavigator ()
> -    {
> -        return m_value_nav;
> -    }
> -    
> -    NamedSummariesMap&
> -    GetNamedSummaryNavigator ()
> -    {
> -        return m_named_summaries_map;
> -    }
> -    
> -    void
> -    EnableCategory (const ConstString& category_name,
> -                    CategoryMap::Position pos = CategoryMap::Default)
> -    {
> -        m_categories_map.Enable(category_name,
> -                                pos);
> -    }
> -    
> -    void
> -    DisableCategory (const ConstString& category_name)
> -    {
> -        m_categories_map.Disable(category_name);
> -    }
> -    
> -    void
> -    EnableCategory (const lldb::TypeCategoryImplSP& category,
> -                    CategoryMap::Position pos = CategoryMap::Default)
> -    {
> -        m_categories_map.Enable(category,
> -                                pos);
> -    }
> -    
> -    void
> -    DisableCategory (const lldb::TypeCategoryImplSP& category)
> -    {
> -        m_categories_map.Disable(category);
> -    }
> -    
> -    bool
> -    DeleteCategory (const ConstString& category_name)
> -    {
> -        return m_categories_map.Delete(category_name);
> -    }
> -    
> -    void
> -    ClearCategories ()
> -    {
> -        return m_categories_map.Clear();
> -    }
> -    
> -    size_t
> -    GetCategoriesCount ()
> -    {
> -        return m_categories_map.GetCount();
> -    }
> -    
> -    lldb::TypeCategoryImplSP
> -    GetCategoryAtIndex (size_t index)
> -    {
> -        return m_categories_map.GetAtIndex(index);
> -    }
> -    
> -    void
> -    LoopThroughCategories (CategoryCallback callback, void* param)
> -    {
> -        m_categories_map.LoopThrough(callback, param);
> -    }
> -    
> -    lldb::TypeCategoryImplSP
> -    GetCategory (const char* category_name = NULL,
> -                 bool can_create = true)
> -    {
> -        if (!category_name)
> -            return GetCategory(m_default_category_name);
> -        return GetCategory(ConstString(category_name));
> -    }
> -    
> -    lldb::TypeCategoryImplSP
> -    GetCategory (const ConstString& category_name,
> -                 bool can_create = true);
> -    
> -    lldb::TypeSummaryImplSP
> -    GetSummaryFormat (ValueObject& valobj,
> -                      lldb::DynamicValueType use_dynamic)
> -    {
> -        return m_categories_map.GetSummaryFormat(valobj, use_dynamic);
> -    }
> -    
> -    lldb::TypeSummaryImplSP
> -    GetSummaryForType (lldb::TypeNameSpecifierImplSP type_sp);
> -
> -    lldb::TypeFilterImplSP
> -    GetFilterForType (lldb::TypeNameSpecifierImplSP type_sp);
> -
> -#ifndef LLDB_DISABLE_PYTHON
> -    lldb::TypeSyntheticImplSP
> -    GetSyntheticForType (lldb::TypeNameSpecifierImplSP type_sp);
> -#endif
> -    
> -#ifndef LLDB_DISABLE_PYTHON
> -    lldb::SyntheticChildrenSP
> -    GetSyntheticChildrenForType (lldb::TypeNameSpecifierImplSP type_sp);
> -#endif
> -    
> -#ifndef LLDB_DISABLE_PYTHON
> -    lldb::SyntheticChildrenSP
> -    GetSyntheticChildren (ValueObject& valobj,
> -                          lldb::DynamicValueType use_dynamic)
> -    {
> -        return m_categories_map.GetSyntheticChildren(valobj, use_dynamic);
> -    }
> -#endif
> -    
> -    bool
> -    AnyMatches (ConstString type_name,
> -                TypeCategoryImpl::FormatCategoryItems items = TypeCategoryImpl::ALL_ITEM_TYPES,
> -                bool only_enabled = true,
> -                const char** matching_category = NULL,
> -                TypeCategoryImpl::FormatCategoryItems* matching_type = NULL)
> -    {
> -        return m_categories_map.AnyMatches(type_name,
> -                                           items,
> -                                           only_enabled,
> -                                           matching_category,
> -                                           matching_type);
> -    }
> -
> -    static bool
> -    GetFormatFromCString (const char *format_cstr,
> -                          bool partial_match_ok,
> -                          lldb::Format &format);
> -
> -    static char
> -    GetFormatAsFormatChar (lldb::Format format);
> -
> -    static const char *
> -    GetFormatAsCString (lldb::Format format);
> -    
> -    // if the user tries to add formatters for, say, "struct Foo"
> -    // those will not match any type because of the way we strip qualifiers from typenames
> -    // this method looks for the case where the user is adding a "class","struct","enum" or "union" Foo
> -    // and strips the unnecessary qualifier
> -    static ConstString
> -    GetValidTypeName (const ConstString& type);
> -    
> -    // when DataExtractor dumps a vectorOfT, it uses a predefined format for each item
> -    // this method returns it, or eFormatInvalid if vector_format is not a vectorOf
> -    static lldb::Format
> -    GetSingleItemFormat (lldb::Format vector_format);
> -    
> -    void
> -    Changed ()
> -    {
> -        __sync_add_and_fetch(&m_last_revision, +1);
> -    }
> -    
> -    uint32_t
> -    GetCurrentRevision ()
> -    {
> -        return m_last_revision;
> -    }
> -    
> -    ~FormatManager ()
> -    {
> -    }
> -    
> -private:    
> -    ValueNavigator m_value_nav;
> -    NamedSummariesMap m_named_summaries_map;
> -    uint32_t m_last_revision;
> -    CategoryMap m_categories_map;
> -    
> -    ConstString m_default_category_name;
> -    ConstString m_system_category_name;
> -    ConstString m_gnu_cpp_category_name;
> -    ConstString m_libcxx_category_name;
> -    ConstString m_objc_category_name;
> -    ConstString m_corefoundation_category_name;
> -    ConstString m_coregraphics_category_name;
> -    ConstString m_coreservices_category_name;
> -    ConstString m_vectortypes_category_name;
> -    ConstString m_appkit_category_name;
> -    
> -    CategoryMap&
> -    GetCategories ()
> -    {
> -        return m_categories_map;
> -    }
> -    
> -    // WARNING: these are temporary functions that setup formatters
> -    // while a few of these actually should be globally available and setup by LLDB itself
> -    // most would actually belong to the users' lldbinit file or to some other form of configurable
> -    // storage
> -    void
> -    LoadLibStdcppFormatters ();
> -    
> -    void
> -    LoadLibcxxFormatters ();
> -    
> -    void
> -    LoadSystemFormatters ();
> -    
> -    void
> -    LoadObjCFormatters ();
> -};
> -    
> -} // namespace lldb_private
> -
> -#endif	// lldb_FormatManager_h_
> 
> Removed: lldb/trunk/include/lldb/Core/FormatNavigator.h
> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Core/FormatNavigator.h?rev=173727&view=auto
> ==============================================================================
> --- lldb/trunk/include/lldb/Core/FormatNavigator.h (original)
> +++ lldb/trunk/include/lldb/Core/FormatNavigator.h (removed)
> @@ -1,663 +0,0 @@
> -//===-- FormatNavigator.h ----------------------------------------*- C++ -*-===//
> -//
> -//                     The LLVM Compiler Infrastructure
> -//
> -// This file is distributed under the University of Illinois Open Source
> -// License. See LICENSE.TXT for details.
> -//
> -//===----------------------------------------------------------------------===//
> -
> -#ifndef lldb_FormatNavigator_h_
> -#define lldb_FormatNavigator_h_
> -
> -// C Includes
> -// C++ Includes
> -
> -// Other libraries and framework includes
> -#include "clang/AST/DeclCXX.h"
> -#include "clang/AST/Type.h"
> -#include "clang/AST/DeclObjC.h"
> -
> -// Project includes
> -#include "lldb/lldb-public.h"
> -
> -#include "lldb/Core/FormatClasses.h"
> -#include "lldb/Core/Log.h"
> -#include "lldb/Core/RegularExpression.h"
> -#include "lldb/Core/ValueObject.h"
> -
> -#include "lldb/Symbol/ClangASTContext.h"
> -
> -#include "lldb/Target/ObjCLanguageRuntime.h"
> -#include "lldb/Target/Process.h"
> -#include "lldb/Target/StackFrame.h"
> -#include "lldb/Target/TargetList.h"
> -
> -using lldb::LogSP;
> -
> -namespace lldb_private {
> -    
> -// this file (and its. cpp) contain the low-level implementation of LLDB Data Visualization
> -// class DataVisualization is the high-level front-end of this feature
> -// clients should refer to that class as the entry-point into the data formatters
> -// unless they have a good reason to bypass it and prefer to use this file's objects directly
> -class IFormatChangeListener
> -{
> -public:
> -    virtual void
> -    Changed () = 0;
> -    
> -    virtual
> -    ~IFormatChangeListener () {}
> -    
> -    virtual uint32_t
> -    GetCurrentRevision () = 0;
> -    
> -};
> -    
> -static inline bool
> -IsWhitespace (char c)
> -{
> -    return ( (c == ' ') || (c == '\t') || (c == '\v') || (c == '\f') );
> -}
> -
> -static inline bool
> -HasPrefix (const char* str1, const char* str2)
> -{
> -    return ( ::strstr(str1, str2) == str1 );
> -}
> -    
> -// if the user tries to add formatters for, say, "struct Foo"
> -// those will not match any type because of the way we strip qualifiers from typenames
> -// this method looks for the case where the user is adding a "class","struct","enum" or "union" Foo
> -// and strips the unnecessary qualifier
> -static ConstString
> -GetValidTypeName_Impl (const ConstString& type)
> -{
> -    int strip_len = 0;
> -    
> -    if (type == false)
> -        return type;
> -    
> -    const char* type_cstr = type.AsCString();
> -    
> -    if ( HasPrefix(type_cstr, "class ") )
> -        strip_len = 6;
> -    else if ( HasPrefix(type_cstr, "enum ") )
> -        strip_len = 5;
> -    else if ( HasPrefix(type_cstr, "struct ") )
> -        strip_len = 7;
> -    else if ( HasPrefix(type_cstr, "union ") )
> -        strip_len = 6;
> -    
> -    if (strip_len == 0)
> -        return type;
> -    
> -    type_cstr += strip_len;
> -    while (IsWhitespace(*type_cstr) && ++type_cstr)
> -        ;
> -    
> -    return ConstString(type_cstr);
> -}
> -    
> -template<typename KeyType, typename ValueType>
> -class FormatNavigator;
> -
> -template<typename KeyType, typename ValueType>
> -class FormatMap
> -{
> -public:
> -
> -    typedef typename ValueType::SharedPointer ValueSP;
> -    typedef std::map<KeyType, ValueSP> MapType;
> -    typedef typename MapType::iterator MapIterator;
> -    typedef bool(*CallbackType)(void*, KeyType, const ValueSP&);
> -    
> -    FormatMap(IFormatChangeListener* lst) :
> -    m_map(),
> -    m_map_mutex(Mutex::eMutexTypeRecursive),
> -    listener(lst)
> -    {
> -    }
> -    
> -    void
> -    Add(KeyType name,
> -        const ValueSP& entry)
> -    {
> -        if (listener)
> -            entry->GetRevision() = listener->GetCurrentRevision();
> -        else
> -            entry->GetRevision() = 0;
> -
> -        Mutex::Locker locker(m_map_mutex);
> -        m_map[name] = entry;
> -        if (listener)
> -            listener->Changed();
> -    }
> -    
> -    bool
> -    Delete (KeyType name)
> -    {
> -        Mutex::Locker locker(m_map_mutex);
> -        MapIterator iter = m_map.find(name);
> -        if (iter == m_map.end())
> -            return false;
> -        m_map.erase(name);
> -        if (listener)
> -            listener->Changed();
> -        return true;
> -    }
> -    
> -    void
> -    Clear ()
> -    {
> -        Mutex::Locker locker(m_map_mutex);
> -        m_map.clear();
> -        if (listener)
> -            listener->Changed();
> -    }
> -    
> -    bool
> -    Get(KeyType name,
> -        ValueSP& entry)
> -    {
> -        Mutex::Locker locker(m_map_mutex);
> -        MapIterator iter = m_map.find(name);
> -        if (iter == m_map.end())
> -            return false;
> -        entry = iter->second;
> -        return true;
> -    }
> -    
> -    void
> -    LoopThrough (CallbackType callback, void* param)
> -    {
> -        if (callback)
> -        {
> -            Mutex::Locker locker(m_map_mutex);
> -            MapIterator pos, end = m_map.end();
> -            for (pos = m_map.begin(); pos != end; pos++)
> -            {
> -                KeyType type = pos->first;
> -                if (!callback(param, type, pos->second))
> -                    break;
> -            }
> -        }
> -    }
> -    
> -    size_t
> -    GetCount ()
> -    {
> -        return m_map.size();
> -    }
> -    
> -    ValueSP
> -    GetValueAtIndex (size_t index)
> -    {
> -        Mutex::Locker locker(m_map_mutex);
> -        MapIterator iter = m_map.begin();
> -        MapIterator end = m_map.end();
> -        while (index > 0)
> -        {
> -            iter++;
> -            index--;
> -            if (end == iter)
> -                return ValueSP();
> -        }
> -        return iter->second;
> -    }
> -    
> -    KeyType
> -    GetKeyAtIndex (size_t index)
> -    {
> -        Mutex::Locker locker(m_map_mutex);
> -        MapIterator iter = m_map.begin();
> -        MapIterator end = m_map.end();
> -        while (index > 0)
> -        {
> -            iter++;
> -            index--;
> -            if (end == iter)
> -                return KeyType();
> -        }
> -        return iter->first;
> -    }
> -    
> -protected:
> -    MapType m_map;    
> -    Mutex m_map_mutex;
> -    IFormatChangeListener* listener;
> -    
> -    MapType&
> -    map ()
> -    {
> -        return m_map;
> -    }
> -    
> -    Mutex&
> -    mutex ()
> -    {
> -        return m_map_mutex;
> -    }
> -    
> -    friend class FormatNavigator<KeyType, ValueType>;
> -    friend class FormatManager;
> -    
> -};
> -    
> -template<typename KeyType, typename ValueType>
> -class FormatNavigator
> -{
> -protected:
> -    typedef FormatMap<KeyType,ValueType> BackEndType;
> -    
> -public:
> -    typedef typename BackEndType::MapType MapType;
> -    typedef typename MapType::iterator MapIterator;
> -    typedef typename MapType::key_type MapKeyType;
> -    typedef typename MapType::mapped_type MapValueType;
> -    typedef typename BackEndType::CallbackType CallbackType;
> -#ifdef _LIBCPP_VERSION
> -    typedef typename std::shared_ptr<FormatNavigator<KeyType, ValueType> > SharedPointer;
> -#else
> -    typedef typename std::tr1::shared_ptr<FormatNavigator<KeyType, ValueType> > SharedPointer;
> -#endif
> -    
> -    friend class TypeCategoryImpl;
> -
> -    FormatNavigator(std::string name,
> -                    IFormatChangeListener* lst) :
> -    m_format_map(lst),
> -    m_name(name),
> -    m_id_cs(ConstString("id"))
> -    {
> -    }
> -    
> -    void
> -    Add (const MapKeyType &type, const MapValueType& entry)
> -    {
> -        Add_Impl(type, entry, (KeyType*)NULL);
> -    }
> -    
> -    bool
> -    Delete (ConstString type)
> -    {
> -        return Delete_Impl(type, (KeyType*)NULL);
> -    }
> -        
> -    bool
> -    Get(ValueObject& valobj,
> -        MapValueType& entry,
> -        lldb::DynamicValueType use_dynamic,
> -        uint32_t* why = NULL)
> -    {
> -        uint32_t value = lldb_private::eFormatterChoiceCriterionDirectChoice;
> -        clang::QualType type = clang::QualType::getFromOpaquePtr(valobj.GetClangType());
> -        bool ret = Get(valobj, type, entry, use_dynamic, value);
> -        if (ret)
> -            entry = MapValueType(entry);
> -        else
> -            entry = MapValueType();        
> -        if (why)
> -            *why = value;
> -        return ret;
> -    }
> -    
> -    bool
> -    Get (ConstString type, MapValueType& entry)
> -    {
> -        return Get_Impl(type, entry, (KeyType*)NULL);
> -    }
> -    
> -    bool
> -    GetExact (ConstString type, MapValueType& entry)
> -    {
> -        return GetExact_Impl(type, entry, (KeyType*)NULL);
> -    }
> -    
> -    MapValueType
> -    GetAtIndex (size_t index)
> -    {
> -        return m_format_map.GetValueAtIndex(index);
> -    }
> -    
> -    lldb::TypeNameSpecifierImplSP
> -    GetTypeNameSpecifierAtIndex (size_t index)
> -    {
> -        return GetTypeNameSpecifierAtIndex_Impl(index, (KeyType*)NULL);
> -    }
> -    
> -    void
> -    Clear ()
> -    {
> -        m_format_map.Clear();
> -    }
> -    
> -    void
> -    LoopThrough (CallbackType callback, void* param)
> -    {
> -        m_format_map.LoopThrough(callback,param);
> -    }
> -    
> -    size_t
> -    GetCount ()
> -    {
> -        return m_format_map.GetCount();
> -    }
> -    
> -protected:
> -        
> -    BackEndType m_format_map;
> -    
> -    std::string m_name;
> -    
> -    DISALLOW_COPY_AND_ASSIGN(FormatNavigator);
> -    
> -    ConstString m_id_cs;
> -                           
> -    void
> -    Add_Impl (const MapKeyType &type, const MapValueType& entry, lldb::RegularExpressionSP *dummy)
> -    {
> -       m_format_map.Add(type,entry);
> -    }
> -
> -    void Add_Impl (const ConstString &type, const MapValueType& entry, ConstString *dummy)
> -    {
> -       m_format_map.Add(GetValidTypeName_Impl(type), entry);
> -    }
> -
> -    bool
> -    Delete_Impl (ConstString type, ConstString *dummy)
> -    {
> -       return m_format_map.Delete(type);
> -    }
> -
> -    bool
> -    Delete_Impl (ConstString type, lldb::RegularExpressionSP *dummy)
> -    {
> -       Mutex& x_mutex = m_format_map.mutex();
> -        lldb_private::Mutex::Locker locker(x_mutex);
> -       MapIterator pos, end = m_format_map.map().end();
> -       for (pos = m_format_map.map().begin(); pos != end; pos++)
> -       {
> -           lldb::RegularExpressionSP regex = pos->first;
> -           if ( ::strcmp(type.AsCString(),regex->GetText()) == 0)
> -           {
> -               m_format_map.map().erase(pos);
> -               if (m_format_map.listener)
> -                   m_format_map.listener->Changed();
> -               return true;
> -           }
> -       }
> -       return false;
> -    }    
> -
> -    bool
> -    Get_Impl (ConstString type, MapValueType& entry, ConstString *dummy)
> -    {
> -       return m_format_map.Get(type, entry);
> -    }
> -
> -    bool
> -    GetExact_Impl (ConstString type, MapValueType& entry, ConstString *dummy)
> -    {
> -        return Get_Impl(type,entry, (KeyType*)0);
> -    }
> -    
> -    lldb::TypeNameSpecifierImplSP
> -    GetTypeNameSpecifierAtIndex_Impl (size_t index, ConstString *dummy)
> -    {
> -        ConstString key = m_format_map.GetKeyAtIndex(index);
> -        if (key)
> -            return lldb::TypeNameSpecifierImplSP(new TypeNameSpecifierImpl(key.AsCString(),
> -                                                                           false));
> -        else
> -            return lldb::TypeNameSpecifierImplSP();
> -    }
> -    
> -    lldb::TypeNameSpecifierImplSP
> -    GetTypeNameSpecifierAtIndex_Impl (size_t index, lldb::RegularExpressionSP *dummy)
> -    {
> -        lldb::RegularExpressionSP regex = m_format_map.GetKeyAtIndex(index);
> -        if (regex.get() == NULL)
> -            return lldb::TypeNameSpecifierImplSP();
> -        return lldb::TypeNameSpecifierImplSP(new TypeNameSpecifierImpl(regex->GetText(),
> -                                                                       true));
> -    }
> -
> -    bool
> -    Get_Impl (ConstString key, MapValueType& value, lldb::RegularExpressionSP *dummy)
> -    {
> -       const char* key_cstr = key.AsCString();
> -       if (!key_cstr)
> -           return false;
> -       Mutex& x_mutex = m_format_map.mutex();
> -       lldb_private::Mutex::Locker locker(x_mutex);
> -       MapIterator pos, end = m_format_map.map().end();
> -       for (pos = m_format_map.map().begin(); pos != end; pos++)
> -       {
> -           lldb::RegularExpressionSP regex = pos->first;
> -           if (regex->Execute(key_cstr))
> -           {
> -               value = pos->second;
> -               return true;
> -           }
> -       }
> -       return false;
> -    }
> -    
> -    bool
> -    GetExact_Impl (ConstString key, MapValueType& value, lldb::RegularExpressionSP *dummy)
> -    {
> -        Mutex& x_mutex = m_format_map.mutex();
> -        lldb_private::Mutex::Locker locker(x_mutex);
> -        MapIterator pos, end = m_format_map.map().end();
> -        for (pos = m_format_map.map().begin(); pos != end; pos++)
> -        {
> -            lldb::RegularExpressionSP regex = pos->first;
> -            if (strcmp(regex->GetText(),key.AsCString()) == 0)
> -            {
> -                value = pos->second;
> -                return true;
> -            }
> -        }
> -        return false;
> -    }
> -    
> -    bool
> -    Get_BitfieldMatch (ValueObject& valobj,
> -                       ConstString typeName,
> -                       MapValueType& entry,
> -                       uint32_t& reason)
> -    {
> -        LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_TYPES));
> -        // for bitfields, append size to the typename so one can custom format them
> -        StreamString sstring;
> -        sstring.Printf("%s:%d",typeName.AsCString(),valobj.GetBitfieldBitSize());
> -        ConstString bitfieldname = ConstString(sstring.GetData());
> -        if (log)
> -            log->Printf("[Get_BitfieldMatch] appended bitfield info, final result is %s", bitfieldname.GetCString());
> -        if (Get(bitfieldname, entry))
> -        {
> -            if (log)
> -                log->Printf("[Get_BitfieldMatch] bitfield direct match found, returning");
> -            return true;
> -        }
> -        else
> -        {
> -            reason |= lldb_private::eFormatterChoiceCriterionStrippedBitField;
> -            if (log)
> -                log->Printf("[Get_BitfieldMatch] no bitfield direct match");
> -            return false;
> -        }
> -    }
> -    
> -    bool Get_ObjC (ValueObject& valobj,
> -                   MapValueType& entry)
> -    {
> -        LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_TYPES));
> -        lldb::ProcessSP process_sp = valobj.GetProcessSP();
> -        ObjCLanguageRuntime* runtime = process_sp->GetObjCLanguageRuntime();
> -        if (runtime == NULL)
> -        {
> -            if (log)
> -                log->Printf("[Get_ObjC] no valid ObjC runtime, skipping dynamic");
> -            return false;
> -        }
> -        ObjCLanguageRuntime::ClassDescriptorSP objc_class_sp (runtime->GetClassDescriptor(valobj));
> -        if (!objc_class_sp)
> -        {
> -            if (log)
> -                log->Printf("[Get_ObjC] invalid ISA, skipping dynamic");
> -            return false;
> -        }
> -        ConstString name (objc_class_sp->GetClassName());
> -        if (log)
> -            log->Printf("[Get_ObjC] dynamic type inferred is %s - looking for direct dynamic match", name.GetCString());
> -        if (Get(name, entry))
> -        {
> -            if (log)
> -                log->Printf("[Get_ObjC] direct dynamic match found, returning");
> -            return true;
> -        }
> -        if (log)
> -            log->Printf("[Get_ObjC] no dynamic match");
> -        return false;
> -    }
> -    
> -    // we are separately passing in valobj and type because the valobj is fixed (and is used for ObjC discovery and bitfield size)
> -    // but the type can change (e.g. stripping pointers, ...)
> -    bool Get (ValueObject& valobj,
> -              clang::QualType type,
> -              MapValueType& entry,
> -              lldb::DynamicValueType use_dynamic,
> -              uint32_t& reason)
> -    {
> -        LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_TYPES));
> -        if (type.isNull())
> -        {
> -            if (log)
> -                log->Printf("[Get] type is NULL, returning");
> -            return false;
> -        }
> -
> -        type.removeLocalConst(); type.removeLocalVolatile(); type.removeLocalRestrict();
> -        const clang::Type* typePtr = type.getTypePtrOrNull();
> -        if (!typePtr)
> -        {
> -            if (log)
> -                log->Printf("[Get] type is NULL, returning");
> -            return false;
> -        }
> -        ConstString typeName(ClangASTType::GetTypeNameForQualType(valobj.GetClangAST(), type).c_str());
> -        
> -        if (valobj.GetBitfieldBitSize() > 0)
> -        {
> -            if (Get_BitfieldMatch(valobj, typeName, entry, reason))
> -                return true;
> -        }
> -        
> -        if (log)
> -            log->Printf("[Get] trying to get %s for VO name %s of type %s",
> -                        m_name.c_str(),
> -                        valobj.GetName().AsCString(),
> -                        typeName.AsCString());
> -        
> -        if (Get(typeName, entry))
> -        {
> -            if (log)
> -                log->Printf("[Get] direct match found, returning");
> -            return true;
> -        }
> -        if (log)
> -            log->Printf("[Get] no direct match");
> -
> -        // strip pointers and references and see if that helps
> -        if (typePtr->isReferenceType())
> -        {
> -            if (log)
> -                log->Printf("[Get] stripping reference");
> -            if (Get(valobj,type.getNonReferenceType(),entry, use_dynamic, reason) && !entry->SkipsReferences())
> -            {
> -                reason |= lldb_private::eFormatterChoiceCriterionStrippedPointerReference;
> -                return true;
> -            }
> -        }
> -        else if (typePtr->isPointerType())
> -        {
> -            if (log)
> -                log->Printf("[Get] stripping pointer");
> -            clang::QualType pointee = typePtr->getPointeeType();
> -            if (Get(valobj, pointee, entry, use_dynamic, reason) && !entry->SkipsPointers())
> -            {
> -                reason |= lldb_private::eFormatterChoiceCriterionStrippedPointerReference;
> -                return true;
> -            }
> -        }
> -
> -        bool canBeObjCDynamic = ClangASTContext::IsPossibleDynamicType (valobj.GetClangAST(),
> -                                                                        type.getAsOpaquePtr(),
> -                                                                        NULL,
> -                                                                        false, // no C++
> -                                                                        true); // yes ObjC
> -        
> -        if (canBeObjCDynamic)
> -        {
> -            if (use_dynamic != lldb::eNoDynamicValues)
> -            {
> -                if (log)
> -                    log->Printf("[Get] allowed to figure out dynamic ObjC type");
> -                if (Get_ObjC(valobj,entry))
> -                {
> -                    reason |= lldb_private::eFormatterChoiceCriterionDynamicObjCDiscovery;
> -                    return true;
> -                }
> -            }
> -            if (log)
> -                log->Printf("[Get] dynamic disabled or failed - stripping ObjC pointer");
> -            clang::QualType pointee = typePtr->getPointeeType();
> -            if (Get(valobj, pointee, entry, use_dynamic, reason) && !entry->SkipsPointers())
> -            {
> -                reason |= lldb_private::eFormatterChoiceCriterionStrippedPointerReference;
> -                return true;
> -            }
> -        }
> -    
> -        // try to strip typedef chains
> -        const clang::TypedefType* type_tdef = type->getAs<clang::TypedefType>();
> -        if (type_tdef)
> -        {
> -            if (log)
> -                log->Printf("[Get] stripping typedef");
> -            if ((Get(valobj, type_tdef->getDecl()->getUnderlyingType(), entry, use_dynamic, reason)) && entry->Cascades())
> -            {
> -                reason |= lldb_private::eFormatterChoiceCriterionNavigatedTypedefs;
> -                return true;
> -            }
> -        }
> -        
> -        // if all else fails, go to static type
> -        if (valobj.IsDynamic())
> -        {
> -            if (log)
> -                log->Printf("[Get] going to static value");
> -            lldb::ValueObjectSP static_value_sp(valobj.GetStaticValue());
> -            if (static_value_sp)
> -            {
> -                if (log)
> -                    log->Printf("[Get] has a static value - actually use it");
> -                if (Get(*static_value_sp.get(), clang::QualType::getFromOpaquePtr(static_value_sp->GetClangType()) , entry, use_dynamic, reason))
> -                {
> -                    reason |= lldb_private::eFormatterChoiceCriterionWentToStaticValue;
> -                    return true;
> -                }
> -            }
> -        }
> -        
> -        return false;
> -    }
> -};
> -
> -} // namespace lldb_private
> -
> -#endif	// lldb_FormatNavigator_h_
> 
> Modified: lldb/trunk/include/lldb/Core/ValueObject.h
> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Core/ValueObject.h?rev=173728&r1=173727&r2=173728&view=diff
> ==============================================================================
> --- lldb/trunk/include/lldb/Core/ValueObject.h (original)
> +++ lldb/trunk/include/lldb/Core/ValueObject.h Mon Jan 28 17:47:25 2013
> @@ -808,10 +808,7 @@ public:
>     UpdateValueIfNeeded (bool update_format = true);
> 
>     bool
> -    UpdateValueIfNeeded (lldb::DynamicValueType use_dynamic, bool update_format = true);
> -    
> -    bool
> -    UpdateFormatsIfNeeded(lldb::DynamicValueType use_dynamic = lldb::eNoDynamicValues);
> +    UpdateFormatsIfNeeded();
> 
>     lldb::ValueObjectSP
>     GetSP ()
> @@ -843,10 +840,7 @@ public:
> 
>     lldb::ValueObjectSP
>     GetSyntheticBitFieldChild (uint32_t from, uint32_t to, bool can_create);
> -    
> -    lldb::ValueObjectSP
> -    GetSyntheticArrayRangeChild (uint32_t from, uint32_t to, bool can_create);
> -    
> +
>     lldb::ValueObjectSP
>     GetSyntheticExpressionPathChild(const char* expression, bool can_create);
> 
> @@ -856,6 +850,15 @@ public:
>     virtual lldb::ValueObjectSP
>     GetDynamicValue (lldb::DynamicValueType valueType);
> 
> +    virtual lldb::DynamicValueType
> +    GetDynamicValueType ()
> +    {
> +        if (m_parent)
> +            return m_parent->GetDynamicValueType ();
> +        else
> +            return lldb::eNoDynamicValues;
> +    }
> +    
>     virtual lldb::ValueObjectSP
>     GetStaticValue ();
> 
> @@ -1009,7 +1012,7 @@ public:
>     lldb::TypeSummaryImplSP
>     GetSummaryFormat()
>     {
> -        UpdateFormatsIfNeeded(m_last_format_mgr_dynamic);
> +        UpdateFormatsIfNeeded();
>         return m_type_summary_sp;
>     }
> 
> @@ -1030,7 +1033,7 @@ public:
>     lldb::TypeFormatImplSP
>     GetValueFormat()
>     {
> -        UpdateFormatsIfNeeded(m_last_format_mgr_dynamic);
> +        UpdateFormatsIfNeeded();
>         return m_type_format_sp;
>     }
> 
> @@ -1046,7 +1049,7 @@ public:
>     lldb::SyntheticChildrenSP
>     GetSyntheticChildren()
>     {
> -        UpdateFormatsIfNeeded(m_last_format_mgr_dynamic);
> +        UpdateFormatsIfNeeded();
>         return m_synthetic_children_sp;
>     }
> 
> @@ -1218,7 +1221,6 @@ protected:
> 
>     lldb::Format                m_format;
>     uint32_t                    m_last_format_mgr_revision;
> -    lldb::DynamicValueType      m_last_format_mgr_dynamic;
>     lldb::TypeSummaryImplSP     m_type_summary_sp;
>     lldb::TypeFormatImplSP      m_type_format_sp;
>     lldb::SyntheticChildrenSP   m_synthetic_children_sp;
> 
> Modified: lldb/trunk/include/lldb/Core/ValueObjectDynamicValue.h
> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Core/ValueObjectDynamicValue.h?rev=173728&r1=173727&r2=173728&view=diff
> ==============================================================================
> --- lldb/trunk/include/lldb/Core/ValueObjectDynamicValue.h (original)
> +++ lldb/trunk/include/lldb/Core/ValueObjectDynamicValue.h Mon Jan 28 17:47:25 2013
> @@ -90,6 +90,12 @@ public:
>     virtual bool
>     SetValueFromCString (const char *value_str, Error& error);
> 
> +    virtual lldb::DynamicValueType
> +    GetDynamicValueType ()
> +    {
> +        return m_use_dynamic;
> +    }
> +    
> protected:
>     virtual bool
>     UpdateValue ();
> 
> Modified: lldb/trunk/include/lldb/Core/ValueObjectSyntheticFilter.h
> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Core/ValueObjectSyntheticFilter.h?rev=173728&r1=173727&r2=173728&view=diff
> ==============================================================================
> --- lldb/trunk/include/lldb/Core/ValueObjectSyntheticFilter.h (original)
> +++ lldb/trunk/include/lldb/Core/ValueObjectSyntheticFilter.h Mon Jan 28 17:47:25 2013
> @@ -38,6 +38,9 @@ public:
> 
>     virtual ConstString
>     GetTypeName();
> +    
> +    virtual ConstString
> +    GetQualifiedTypeName();
> 
>     virtual bool
>     MightHaveChildren();
> @@ -57,6 +60,9 @@ public:
>     virtual size_t
>     GetIndexOfChildWithName (const ConstString &name);
> 
> +    virtual lldb::ValueObjectSP
> +    GetDynamicValue (lldb::DynamicValueType valueType);
> +    
>     virtual bool
>     IsInScope ();
> 
> 
> Copied: lldb/trunk/include/lldb/DataFormatters/CXXFormatterFunctions.h (from r173281, lldb/trunk/include/lldb/Core/CXXFormatterFunctions.h)
> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/DataFormatters/CXXFormatterFunctions.h?p2=lldb/trunk/include/lldb/DataFormatters/CXXFormatterFunctions.h&p1=lldb/trunk/include/lldb/Core/CXXFormatterFunctions.h&r1=173281&r2=173728&rev=173728&view=diff
> ==============================================================================
> --- lldb/trunk/include/lldb/Core/CXXFormatterFunctions.h (original)
> +++ lldb/trunk/include/lldb/DataFormatters/CXXFormatterFunctions.h Mon Jan 28 17:47:25 2013
> @@ -14,14 +14,13 @@
> #include "lldb/lldb-forward.h"
> 
> #include "lldb/Core/ConstString.h"
> -#include "lldb/Core/FormatClasses.h"
> +#include "lldb/DataFormatters/FormatClasses.h"
> 
> #include "clang/AST/ASTContext.h"
> 
> namespace lldb_private {
>     namespace formatters
>     {
> -        
>         bool
>         ExtractValueFromObjCExpression (ValueObject &valobj,
>                                         const char* target_type,
> @@ -135,11 +134,11 @@ namespace lldb_private {
>         public:
>             NSArrayMSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp);
> 
> -            virtual uint32_t
> +            virtual size_t
>             CalculateNumChildren ();
> 
>             virtual lldb::ValueObjectSP
> -            GetChildAtIndex (uint32_t idx);
> +            GetChildAtIndex (size_t idx);
> 
>             virtual bool
>             Update();
> @@ -147,7 +146,7 @@ namespace lldb_private {
>             virtual bool
>             MightHaveChildren ();
> 
> -            virtual uint32_t
> +            virtual size_t
>             GetIndexOfChildWithName (const ConstString &name);
> 
>             virtual
> @@ -166,11 +165,11 @@ namespace lldb_private {
>         public:
>             NSArrayISyntheticFrontEnd (lldb::ValueObjectSP valobj_sp);
> 
> -            virtual uint32_t
> +            virtual size_t
>             CalculateNumChildren ();
> 
>             virtual lldb::ValueObjectSP
> -            GetChildAtIndex (uint32_t idx);
> +            GetChildAtIndex (size_t idx);
> 
>             virtual bool
>             Update();
> @@ -178,7 +177,7 @@ namespace lldb_private {
>             virtual bool
>             MightHaveChildren ();
> 
> -            virtual uint32_t
> +            virtual size_t
>             GetIndexOfChildWithName (const ConstString &name);
> 
>             virtual
> @@ -197,11 +196,11 @@ namespace lldb_private {
>         public:
>             NSArrayCodeRunningSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp);
> 
> -            virtual uint32_t
> +            virtual size_t
>             CalculateNumChildren ();
> 
>             virtual lldb::ValueObjectSP
> -            GetChildAtIndex (uint32_t idx);
> +            GetChildAtIndex (size_t idx);
> 
>             virtual bool
>             Update();
> @@ -209,7 +208,7 @@ namespace lldb_private {
>             virtual bool
>             MightHaveChildren ();
> 
> -            virtual uint32_t
> +            virtual size_t
>             GetIndexOfChildWithName (const ConstString &name);
> 
>             virtual
> @@ -242,11 +241,11 @@ namespace lldb_private {
>         public:
>             NSDictionaryISyntheticFrontEnd (lldb::ValueObjectSP valobj_sp);
> 
> -            virtual uint32_t
> +            virtual size_t
>             CalculateNumChildren ();
> 
>             virtual lldb::ValueObjectSP
> -            GetChildAtIndex (uint32_t idx);
> +            GetChildAtIndex (size_t idx);
> 
>             virtual bool
>             Update();
> @@ -254,7 +253,7 @@ namespace lldb_private {
>             virtual bool
>             MightHaveChildren ();
> 
> -            virtual uint32_t
> +            virtual size_t
>             GetIndexOfChildWithName (const ConstString &name);
> 
>             virtual
> @@ -298,11 +297,11 @@ namespace lldb_private {
>         public:
>             NSDictionaryMSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp);
> 
> -            virtual uint32_t
> +            virtual size_t
>             CalculateNumChildren ();
> 
>             virtual lldb::ValueObjectSP
> -            GetChildAtIndex (uint32_t idx);
> +            GetChildAtIndex (size_t idx);
> 
>             virtual bool
>             Update();
> @@ -310,7 +309,7 @@ namespace lldb_private {
>             virtual bool
>             MightHaveChildren ();
> 
> -            virtual uint32_t
> +            virtual size_t
>             GetIndexOfChildWithName (const ConstString &name);
> 
>             virtual
> @@ -328,11 +327,11 @@ namespace lldb_private {
>         public:
>             NSDictionaryCodeRunningSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp);
> 
> -            virtual uint32_t
> +            virtual size_t
>             CalculateNumChildren ();
> 
>             virtual lldb::ValueObjectSP
> -            GetChildAtIndex (uint32_t idx);
> +            GetChildAtIndex (size_t idx);
> 
>             virtual bool
>             Update();
> @@ -340,7 +339,7 @@ namespace lldb_private {
>             virtual bool
>             MightHaveChildren ();
> 
> -            virtual uint32_t
> +            virtual size_t
>             GetIndexOfChildWithName (const ConstString &name);
> 
>             virtual
> 
> Copied: lldb/trunk/include/lldb/DataFormatters/DataVisualization.h (from r173281, lldb/trunk/include/lldb/Core/DataVisualization.h)
> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/DataFormatters/DataVisualization.h?p2=lldb/trunk/include/lldb/DataFormatters/DataVisualization.h&p1=lldb/trunk/include/lldb/Core/DataVisualization.h&r1=173281&r2=173728&rev=173728&view=diff
> ==============================================================================
> --- lldb/trunk/include/lldb/Core/DataVisualization.h (original)
> +++ lldb/trunk/include/lldb/DataFormatters/DataVisualization.h Mon Jan 28 17:47:25 2013
> @@ -16,8 +16,8 @@
> // Other libraries and framework includes
> // Project includes
> #include "lldb/Core/ConstString.h"
> -#include "lldb/Core/FormatClasses.h"
> -#include "lldb/Core/FormatManager.h"
> +#include "lldb/DataFormatters/FormatClasses.h"
> +#include "lldb/DataFormatters/FormatManager.h"
> 
> namespace lldb_private {
> 
> @@ -57,14 +57,14 @@ public:
>         static void
>         LoopThrough (TypeFormatImpl::ValueCallback callback, void* callback_baton);
> 
> -        static uint32_t
> +        static size_t
>         GetCount ();
> 
>         static lldb::TypeNameSpecifierImplSP
> -        GetTypeNameSpecifierForFormatAtIndex (uint32_t);
> +        GetTypeNameSpecifierForFormatAtIndex (size_t);
> 
>         static lldb::TypeFormatImplSP
> -        GetFormatAtIndex (uint32_t);
> +        GetFormatAtIndex (size_t);
>     };
> 
>     static lldb::TypeSummaryImplSP
> @@ -83,7 +83,7 @@ public:
>     GetFilterForType (lldb::TypeNameSpecifierImplSP type_sp);
> 
> #ifndef LLDB_DISABLE_PYTHON
> -    static lldb::TypeSyntheticImplSP
> +    static lldb::ScriptedSyntheticChildrenSP
>     GetSyntheticForType (lldb::TypeNameSpecifierImplSP type_sp);
> #endif
> 
> @@ -145,14 +145,14 @@ public:
> 
>         static void
>         Enable (const ConstString& category,
> -                CategoryMap::Position = CategoryMap::Default);
> +                TypeCategoryMap::Position = TypeCategoryMap::Default);
> 
>         static void
>         Disable (const ConstString& category);
> 
>         static void
>         Enable (const lldb::TypeCategoryImplSP& category,
> -                CategoryMap::Position = CategoryMap::Default);
> +                TypeCategoryMap::Position = TypeCategoryMap::Default);
> 
>         static void
>         Disable (const lldb::TypeCategoryImplSP& category);
> @@ -164,7 +164,7 @@ public:
>         GetCount ();
> 
>         static lldb::TypeCategoryImplSP
> -        GetCategoryAtIndex (uint32_t);
> +        GetCategoryAtIndex (size_t);
>     };
> };
> 
> 
> Added: lldb/trunk/include/lldb/DataFormatters/FormatCache.h
> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/DataFormatters/FormatCache.h?rev=173728&view=auto
> ==============================================================================
> --- lldb/trunk/include/lldb/DataFormatters/FormatCache.h (added)
> +++ lldb/trunk/include/lldb/DataFormatters/FormatCache.h Mon Jan 28 17:47:25 2013
> @@ -0,0 +1,105 @@
> +//===-- FormatCache.h ---------------------------------------------*- C++ -*-===//
> +//
> +//                     The LLVM Compiler Infrastructure
> +//
> +// This file is distributed under the University of Illinois Open Source
> +// License. See LICENSE.TXT for details.
> +//
> +//===----------------------------------------------------------------------===//
> +
> +#ifndef lldb_FormatCache_h_
> +#define lldb_FormatCache_h_
> +
> +// C Includes
> +// C++ Includes
> +#include <map>
> +
> +// Other libraries and framework includes
> +// Project includes
> +#include "lldb/lldb-public.h"
> +#include "lldb/Core/ConstString.h"
> +#include "lldb/DataFormatters/FormatClasses.h"
> +
> +namespace lldb_private {
> +class FormatCache
> +{
> +private:
> +    struct Entry
> +    {
> +    private:
> +        bool m_summary_cached : 1;
> +        bool m_synthetic_cached : 1;
> +        
> +        lldb::TypeSummaryImplSP m_summary_sp;
> +        lldb::SyntheticChildrenSP m_synthetic_sp;
> +    public:
> +        Entry ();
> +        Entry (lldb::TypeSummaryImplSP);
> +        Entry (lldb::SyntheticChildrenSP);
> +        Entry (lldb::TypeSummaryImplSP,lldb::SyntheticChildrenSP);
> +
> +        bool
> +        IsSummaryCached ();
> +        
> +        bool
> +        IsSyntheticCached ();
> +        
> +        lldb::TypeSummaryImplSP
> +        GetSummary ();
> +        
> +        lldb::SyntheticChildrenSP
> +        GetSynthetic ();
> +        
> +        void
> +        SetSummary (lldb::TypeSummaryImplSP);
> +        
> +        void
> +        SetSynthetic (lldb::SyntheticChildrenSP);
> +    };
> +    typedef std::map<ConstString,Entry> CacheMap;
> +    CacheMap m_map;
> +    Mutex m_mutex;
> +    
> +#ifdef LLDB_CONFIGURATION_DEBUG
> +    uint64_t m_cache_hits;
> +    uint64_t m_cache_misses;
> +#endif
> +    
> +    Entry&
> +    GetEntry (const ConstString& type);
> +    
> +public:
> +    FormatCache ();
> +    
> +    bool
> +    GetSummary (const ConstString& type,lldb::TypeSummaryImplSP& summary_sp);
> +
> +    bool
> +    GetSynthetic (const ConstString& type,lldb::SyntheticChildrenSP& synthetic_sp);
> +    
> +    void
> +    SetSummary (const ConstString& type,lldb::TypeSummaryImplSP& summary_sp);
> +    
> +    void
> +    SetSynthetic (const ConstString& type,lldb::SyntheticChildrenSP& synthetic_sp);
> +    
> +    void
> +    Clear ();
> +    
> +#ifdef LLDB_CONFIGURATION_DEBUG
> +    uint64_t
> +    GetCacheHits ()
> +    {
> +        return m_cache_hits;
> +    }
> +    
> +    uint64_t
> +    GetCacheMisses ()
> +    {
> +        return m_cache_misses;
> +    }
> +#endif
> +};
> +} // namespace lldb_private
> +
> +#endif	// lldb_FormatCache_h_
> 
> Copied: lldb/trunk/include/lldb/DataFormatters/FormatClasses.h (from r173281, lldb/trunk/include/lldb/Core/FormatClasses.h)
> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/DataFormatters/FormatClasses.h?p2=lldb/trunk/include/lldb/DataFormatters/FormatClasses.h&p1=lldb/trunk/include/lldb/Core/FormatClasses.h&r1=173281&r2=173728&rev=173728&view=diff
> ==============================================================================
> --- lldb/trunk/include/lldb/Core/FormatClasses.h (original)
> +++ lldb/trunk/include/lldb/DataFormatters/FormatClasses.h Mon Jan 28 17:47:25 2013
> @@ -26,1488 +26,18 @@
> 
> #include "lldb/Core/ValueObject.h"
> #include "lldb/Interpreter/ScriptInterpreterPython.h"
> +#include "lldb/Symbol/ClangASTType.h"
> #include "lldb/Symbol/Type.h"
> 
> -namespace lldb_private {
> -
> -class TypeFormatImpl
> -{
> -public:
> -    class Flags
> -    {
> -    public:
> -        
> -        Flags () :
> -        m_flags (lldb::eTypeOptionCascade)
> -        {}
> -        
> -        Flags (const Flags& other) :
> -        m_flags (other.m_flags)
> -        {}
> -        
> -        Flags (uint32_t value) :
> -        m_flags (value)
> -        {}
> -        
> -        Flags&
> -        operator = (const Flags& rhs)
> -        {
> -            if (&rhs != this)
> -                m_flags = rhs.m_flags;
> -            
> -            return *this;
> -        }
> -        
> -        Flags&
> -        operator = (const uint32_t& rhs)
> -        {
> -            m_flags = rhs;
> -            return *this;
> -        }
> -        
> -        Flags&
> -        Clear()
> -        {
> -            m_flags = 0;
> -            return *this;
> -        }
> -        
> -        bool
> -        GetCascades () const
> -        {
> -            return (m_flags & lldb::eTypeOptionCascade) == lldb::eTypeOptionCascade;
> -        }
> -        
> -        Flags&
> -        SetCascades (bool value = true)
> -        {
> -            if (value)
> -                m_flags |= lldb::eTypeOptionCascade;
> -            else
> -                m_flags &= ~lldb::eTypeOptionCascade;
> -            return *this;
> -        }
> -        
> -        bool
> -        GetSkipPointers () const
> -        {
> -            return (m_flags & lldb::eTypeOptionSkipPointers) == lldb::eTypeOptionSkipPointers;
> -        }
> -        
> -        Flags&
> -        SetSkipPointers (bool value = true)
> -        {
> -            if (value)
> -                m_flags |= lldb::eTypeOptionSkipPointers;
> -            else
> -                m_flags &= ~lldb::eTypeOptionSkipPointers;
> -            return *this;
> -        }
> -        
> -        bool
> -        GetSkipReferences () const
> -        {
> -            return (m_flags & lldb::eTypeOptionSkipReferences) == lldb::eTypeOptionSkipReferences;
> -        }
> -        
> -        Flags&
> -        SetSkipReferences (bool value = true)
> -        {
> -            if (value)
> -                m_flags |= lldb::eTypeOptionSkipReferences;
> -            else
> -                m_flags &= ~lldb::eTypeOptionSkipReferences;
> -            return *this;
> -        }
> -        
> -        uint32_t
> -        GetValue ()
> -        {
> -            return m_flags;
> -        }
> -        
> -        void
> -        SetValue (uint32_t value)
> -        {
> -            m_flags = value;
> -        }
> -
> -    private:
> -        uint32_t m_flags;
> -    };
> -    
> -    TypeFormatImpl (lldb::Format f = lldb::eFormatInvalid,
> -                 const Flags& flags = Flags());
> -    
> -    typedef STD_SHARED_PTR(TypeFormatImpl) SharedPointer;
> -    typedef bool(*ValueCallback)(void*, ConstString, const lldb::TypeFormatImplSP&);
> -    
> -    ~TypeFormatImpl ()
> -    {
> -    }
> -    
> -    bool
> -    Cascades () const
> -    {
> -        return m_flags.GetCascades();
> -    }
> -    bool
> -    SkipsPointers () const
> -    {
> -        return m_flags.GetSkipPointers();
> -    }
> -    bool
> -    SkipsReferences () const
> -    {
> -        return m_flags.GetSkipReferences();
> -    }
> -    
> -    void
> -    SetCascades (bool value)
> -    {
> -        m_flags.SetCascades(value);
> -    }
> -    
> -    void
> -    SetSkipsPointers (bool value)
> -    {
> -        m_flags.SetSkipPointers(value);
> -    }
> -    
> -    void
> -    SetSkipsReferences (bool value)
> -    {
> -        m_flags.SetSkipReferences(value);
> -    }
> -    
> -    lldb::Format
> -    GetFormat () const
> -    {
> -        return m_format;
> -    }
> -    
> -    void
> -    SetFormat (lldb::Format fmt)
> -    {
> -        m_format = fmt;
> -    }
> -    
> -    uint32_t
> -    GetOptions ()
> -    {
> -        return m_flags.GetValue();
> -    }
> -    
> -    void
> -    SetOptions (uint32_t value)
> -    {
> -        m_flags.SetValue(value);
> -    }
> -    
> -    uint32_t&
> -    GetRevision ()
> -    {
> -        return m_my_revision;
> -    }
> -    
> -    std::string
> -    GetDescription();
> -    
> -protected:
> -    Flags m_flags;
> -    lldb::Format m_format;
> -    uint32_t m_my_revision;
> -    
> -private:
> -    DISALLOW_COPY_AND_ASSIGN(TypeFormatImpl);
> -};
> -
> -class SyntheticChildrenFrontEnd
> -{
> -protected:
> -    ValueObject &m_backend;
> -public:
> -    
> -    SyntheticChildrenFrontEnd (ValueObject &backend) :
> -        m_backend(backend)
> -    {}
> -    
> -    virtual
> -    ~SyntheticChildrenFrontEnd ()
> -    {
> -    }
> -    
> -    virtual uint32_t
> -    CalculateNumChildren () = 0;
> -    
> -    virtual lldb::ValueObjectSP
> -    GetChildAtIndex (uint32_t idx) = 0;
> -    
> -    virtual uint32_t
> -    GetIndexOfChildWithName (const ConstString &name) = 0;
> -    
> -    // this function is assumed to always succeed and it if fails, the front-end should know to deal
> -    // with it in the correct way (most probably, by refusing to return any children)
> -    // the return value of Update() should actually be interpreted as "ValueObjectSyntheticFilter cache is good/bad"
> -    // if =true, ValueObjectSyntheticFilter is allowed to use the children it fetched previously and cached
> -    // if =false, ValueObjectSyntheticFilter must throw away its cache, and query again for children
> -    virtual bool
> -    Update () = 0;
> -    
> -    // if this function returns false, then CalculateNumChildren() MUST return 0 since UI frontends
> -    // might validly decide not to inquire for children given a false return value from this call
> -    // if it returns true, then CalculateNumChildren() can return any number >= 0 (0 being valid)
> -    // it should if at all possible be more efficient than CalculateNumChildren()
> -    virtual bool
> -    MightHaveChildren () = 0;
> -    
> -    typedef STD_SHARED_PTR(SyntheticChildrenFrontEnd) SharedPointer;
> -    typedef std::auto_ptr<SyntheticChildrenFrontEnd> AutoPointer;
> -    
> -private:
> -    DISALLOW_COPY_AND_ASSIGN(SyntheticChildrenFrontEnd);
> -};
> -
> -class SyntheticChildren
> -{
> -public:
> -    
> -    class Flags
> -    {
> -    public:
> -        
> -        Flags () :
> -        m_flags (lldb::eTypeOptionCascade)
> -        {}
> -        
> -        Flags (const Flags& other) :
> -        m_flags (other.m_flags)
> -        {}
> -        
> -        Flags (uint32_t value) :
> -        m_flags (value)
> -        {}
> -        
> -        Flags&
> -        operator = (const Flags& rhs)
> -        {
> -            if (&rhs != this)
> -                m_flags = rhs.m_flags;
> -            
> -            return *this;
> -        }
> -        
> -        Flags&
> -        operator = (const uint32_t& rhs)
> -        {
> -            m_flags = rhs;
> -            return *this;
> -        }
> -        
> -        Flags&
> -        Clear()
> -        {
> -            m_flags = 0;
> -            return *this;
> -        }
> -        
> -        bool
> -        GetCascades () const
> -        {
> -            return (m_flags & lldb::eTypeOptionCascade) == lldb::eTypeOptionCascade;
> -        }
> -        
> -        Flags&
> -        SetCascades (bool value = true)
> -        {
> -            if (value)
> -                m_flags |= lldb::eTypeOptionCascade;
> -            else
> -                m_flags &= ~lldb::eTypeOptionCascade;
> -            return *this;
> -        }
> -        
> -        bool
> -        GetSkipPointers () const
> -        {
> -            return (m_flags & lldb::eTypeOptionSkipPointers) == lldb::eTypeOptionSkipPointers;
> -        }
> -        
> -        Flags&
> -        SetSkipPointers (bool value = true)
> -        {
> -            if (value)
> -                m_flags |= lldb::eTypeOptionSkipPointers;
> -            else
> -                m_flags &= ~lldb::eTypeOptionSkipPointers;
> -            return *this;
> -        }
> -        
> -        bool
> -        GetSkipReferences () const
> -        {
> -            return (m_flags & lldb::eTypeOptionSkipReferences) == lldb::eTypeOptionSkipReferences;
> -        }
> -        
> -        Flags&
> -        SetSkipReferences (bool value = true)
> -        {
> -            if (value)
> -                m_flags |= lldb::eTypeOptionSkipReferences;
> -            else
> -                m_flags &= ~lldb::eTypeOptionSkipReferences;
> -            return *this;
> -        }
> -        
> -        uint32_t
> -        GetValue ()
> -        {
> -            return m_flags;
> -        }
> -        
> -        void
> -        SetValue (uint32_t value)
> -        {
> -            m_flags = value;
> -        }
> -        
> -    private:
> -        uint32_t m_flags;
> -    };
> -    
> -    SyntheticChildren (const Flags& flags) :
> -        m_flags(flags)
> -    {
> -    }
> -    
> -    virtual
> -    ~SyntheticChildren ()
> -    {
> -    }
> -    
> -    bool
> -    Cascades () const
> -    {
> -        return m_flags.GetCascades();
> -    }
> -    bool
> -    SkipsPointers () const
> -    {
> -        return m_flags.GetSkipPointers();
> -    }
> -    bool
> -    SkipsReferences () const
> -    {
> -        return m_flags.GetSkipReferences();
> -    }
> -    
> -    void
> -    SetCascades (bool value)
> -    {
> -        m_flags.SetCascades(value);
> -    }
> -    
> -    void
> -    SetSkipsPointers (bool value)
> -    {
> -        m_flags.SetSkipPointers(value);
> -    }
> -    
> -    void
> -    SetSkipsReferences (bool value)
> -    {
> -        m_flags.SetSkipReferences(value);
> -    }
> -    
> -    uint32_t
> -    GetOptions ()
> -    {
> -        return m_flags.GetValue();
> -    }
> -    
> -    void
> -    SetOptions (uint32_t value)
> -    {
> -        m_flags.SetValue(value);
> -    }
> -    
> -    virtual bool
> -    IsScripted () = 0;
> -    
> -    virtual std::string
> -    GetDescription () = 0;
> -    
> -    virtual SyntheticChildrenFrontEnd::AutoPointer
> -    GetFrontEnd (ValueObject &backend) = 0;
> -    
> -    typedef STD_SHARED_PTR(SyntheticChildren) SharedPointer;
> -    typedef bool(*SyntheticChildrenCallback)(void*, ConstString, const SyntheticChildren::SharedPointer&);
> -    
> -    uint32_t&
> -    GetRevision ()
> -    {
> -        return m_my_revision;
> -    }
> -    
> -protected:
> -    uint32_t m_my_revision;
> -    Flags m_flags;
> -    
> -private:
> -    DISALLOW_COPY_AND_ASSIGN(SyntheticChildren);
> -};
> -
> -class TypeFilterImpl : public SyntheticChildren
> -{
> -    std::vector<std::string> m_expression_paths;
> -public:
> -    TypeFilterImpl(const SyntheticChildren::Flags& flags) :
> -        SyntheticChildren(flags),
> -        m_expression_paths()
> -    {
> -    }
> -    
> -    void
> -    AddExpressionPath (const char* path)
> -    {
> -        AddExpressionPath(std::string(path));
> -    }
> -        
> -    void
> -    Clear()
> -    {
> -        m_expression_paths.clear();
> -    }
> -    
> -    int
> -    GetCount() const
> -    {
> -        return m_expression_paths.size();
> -    }
> -    
> -    const char*
> -    GetExpressionPathAtIndex(int i) const
> -    {
> -        return m_expression_paths[i].c_str();
> -    }
> -    
> -    bool
> -    SetExpressionPathAtIndex (int i, const char* path)
> -    {
> -        return SetExpressionPathAtIndex(i, std::string(path));
> -    }
> -    
> -    void
> -    AddExpressionPath (std::string path)
> -    {
> -        bool need_add_dot = true;
> -        if (path[0] == '.' ||
> -            (path[0] == '-' && path[1] == '>') ||
> -            path[0] == '[')
> -            need_add_dot = false;
> -        // add a '.' symbol to help forgetful users
> -        if(!need_add_dot)
> -            m_expression_paths.push_back(path);
> -        else
> -            m_expression_paths.push_back(std::string(".") + path);
> -    }
> -    
> -    bool
> -    SetExpressionPathAtIndex (int i, std::string path)
> -    {
> -        if (i >= GetCount())
> -            return false;
> -        bool need_add_dot = true;
> -        if (path[0] == '.' ||
> -            (path[0] == '-' && path[1] == '>') ||
> -            path[0] == '[')
> -            need_add_dot = false;
> -        // add a '.' symbol to help forgetful users
> -        if(!need_add_dot)
> -            m_expression_paths[i] = path;
> -        else
> -            m_expression_paths[i] = std::string(".") + path;
> -        return true;
> -    }
> -    
> -    bool
> -    IsScripted()
> -    {
> -        return false;
> -    }
> -    
> -    std::string
> -    GetDescription();
> -    
> -    class FrontEnd : public SyntheticChildrenFrontEnd
> -    {
> -    private:
> -        TypeFilterImpl* filter;
> -    public:
> -        
> -        FrontEnd(TypeFilterImpl* flt,
> -                 ValueObject &backend) :
> -        SyntheticChildrenFrontEnd(backend),
> -        filter(flt)
> -        {}
> -        
> -        virtual
> -        ~FrontEnd()
> -        {
> -        }
> -        
> -        virtual uint32_t
> -        CalculateNumChildren()
> -        {
> -            return filter->GetCount();
> -        }
> -        
> -        virtual lldb::ValueObjectSP
> -        GetChildAtIndex (uint32_t idx)
> -        {
> -            if (idx >= filter->GetCount())
> -                return lldb::ValueObjectSP();
> -            return m_backend.GetSyntheticExpressionPathChild(filter->GetExpressionPathAtIndex(idx), true);
> -        }
> -        
> -        virtual bool
> -        Update() { return false; }
> -        
> -        virtual bool
> -        MightHaveChildren ()
> -        {
> -            return filter->GetCount() > 0;
> -        }
> -        
> -        virtual uint32_t
> -        GetIndexOfChildWithName (const ConstString &name)
> -        {
> -            const char* name_cstr = name.GetCString();
> -            for (int i = 0; i < filter->GetCount(); i++)
> -            {
> -                const char* expr_cstr = filter->GetExpressionPathAtIndex(i);
> -                if (expr_cstr)
> -                {
> -                    if (*expr_cstr == '.')
> -                        expr_cstr++;
> -                    else if (*expr_cstr == '-' && *(expr_cstr+1) == '>')
> -                        expr_cstr += 2;
> -                }
> -                if (!::strcmp(name_cstr, expr_cstr))
> -                    return i;
> -            }
> -            return UINT32_MAX;
> -        }
> -        
> -        typedef STD_SHARED_PTR(SyntheticChildrenFrontEnd) SharedPointer;
> -        
> -    private:
> -        DISALLOW_COPY_AND_ASSIGN(FrontEnd);
> -    };
> -    
> -    virtual SyntheticChildrenFrontEnd::AutoPointer
> -    GetFrontEnd(ValueObject &backend)
> -    {
> -        return SyntheticChildrenFrontEnd::AutoPointer(new FrontEnd(this, backend));
> -    }
> -    
> -private:
> -    DISALLOW_COPY_AND_ASSIGN(TypeFilterImpl);
> -};
> -
> -    class CXXSyntheticChildren : public SyntheticChildren
> -    {
> -    public:
> -        typedef SyntheticChildrenFrontEnd* (*CreateFrontEndCallback) (CXXSyntheticChildren*, lldb::ValueObjectSP);
> -    protected:
> -        CreateFrontEndCallback m_create_callback;
> -        std::string m_description;
> -    public:
> -        CXXSyntheticChildren(const SyntheticChildren::Flags& flags,
> -                             const char* description,
> -                             CreateFrontEndCallback callback) :
> -        SyntheticChildren(flags),
> -        m_create_callback(callback),
> -        m_description(description ? description : "")
> -        {
> -        }
> -        
> -        bool
> -        IsScripted()
> -        {
> -            return false;
> -        }
> -        
> -        std::string
> -        GetDescription();
> -                
> -        virtual SyntheticChildrenFrontEnd::AutoPointer
> -        GetFrontEnd(ValueObject &backend)
> -        {
> -            return SyntheticChildrenFrontEnd::AutoPointer(m_create_callback(this, backend.GetSP()));
> -        }
> -        
> -    private:
> -        DISALLOW_COPY_AND_ASSIGN(CXXSyntheticChildren);
> -    };
> -
> -#ifndef LLDB_DISABLE_PYTHON
> -
> -class TypeSyntheticImpl : public SyntheticChildren
> -{
> -    std::string m_python_class;
> -    std::string m_python_code;
> -public:
> -    
> -    TypeSyntheticImpl(const SyntheticChildren::Flags& flags,
> -                      const char* pclass,
> -                      const char* pcode = NULL) :
> -        SyntheticChildren(flags),
> -        m_python_class(),
> -        m_python_code()
> -    {
> -        if (pclass)
> -                m_python_class = pclass;
> -        if (pcode)
> -                m_python_code = pcode;
> -    }
> -
> -    const char*
> -    GetPythonClassName()
> -    {
> -        return m_python_class.c_str();
> -    }
> -
> -    const char*
> -    GetPythonCode()
> -    {
> -        return m_python_code.c_str();
> -    }
> -    
> -    void
> -    SetPythonClassName (const char* fname)
> -    {
> -        m_python_class.assign(fname);
> -        m_python_code.clear();
> -    }
> -    
> -    void
> -    SetPythonCode (const char* script)
> -    {
> -        m_python_code.assign(script);
> -    }
> -    
> -    std::string
> -    GetDescription();
> -    
> -    bool
> -    IsScripted()
> -    {
> -        return true;
> -    }
> -
> -    class FrontEnd : public SyntheticChildrenFrontEnd
> -    {
> -    private:
> -        std::string m_python_class;
> -        lldb::ScriptInterpreterObjectSP m_wrapper_sp;
> -        ScriptInterpreter *m_interpreter;
> -    public:
> -        
> -        FrontEnd(std::string pclass,
> -                 ValueObject &backend);
> -        
> -        virtual
> -        ~FrontEnd();
> -        
> -        virtual uint32_t
> -        CalculateNumChildren()
> -        {
> -            if (!m_wrapper_sp || m_interpreter == NULL)
> -                return 0;
> -            return m_interpreter->CalculateNumChildren(m_wrapper_sp);
> -        }
> -        
> -        virtual lldb::ValueObjectSP
> -        GetChildAtIndex (uint32_t idx);
> -        
> -        virtual bool
> -        Update()
> -        {
> -            if (!m_wrapper_sp || m_interpreter == NULL)
> -                return false;
> -            
> -            return m_interpreter->UpdateSynthProviderInstance(m_wrapper_sp);
> -        }
> -        
> -        virtual bool
> -        MightHaveChildren()
> -        {
> -            if (!m_wrapper_sp || m_interpreter == NULL)
> -                return false;
> -            
> -            return m_interpreter->MightHaveChildrenSynthProviderInstance(m_wrapper_sp);
> -        }
> -        
> -        virtual uint32_t
> -        GetIndexOfChildWithName (const ConstString &name)
> -        {
> -            if (!m_wrapper_sp || m_interpreter == NULL)
> -                return UINT32_MAX;
> -            return m_interpreter->GetIndexOfChildWithName(m_wrapper_sp, name.GetCString());
> -        }
> -        
> -        typedef STD_SHARED_PTR(SyntheticChildrenFrontEnd) SharedPointer;
> -
> -    private:
> -        DISALLOW_COPY_AND_ASSIGN(FrontEnd);
> -    };
> -    
> -    virtual SyntheticChildrenFrontEnd::AutoPointer
> -    GetFrontEnd(ValueObject &backend)
> -    {
> -        return SyntheticChildrenFrontEnd::AutoPointer(new FrontEnd(m_python_class, backend));
> -    }    
> -    
> -private:
> -    DISALLOW_COPY_AND_ASSIGN(TypeSyntheticImpl);
> -};
> -
> -#endif // #ifndef LLDB_DISABLE_PYTHON
> -class SyntheticArrayView : public SyntheticChildren
> -{
> -public:
> -    
> -    struct SyntheticArrayRange
> -    {
> -    private:
> -        int m_low;
> -        int m_high;
> -        SyntheticArrayRange* m_next;
> -        
> -    public:
> -        
> -        SyntheticArrayRange () : 
> -        m_low(-1),
> -        m_high(-2),
> -        m_next(NULL)
> -        {}
> -        
> -        SyntheticArrayRange (int L) : 
> -        m_low(L),
> -        m_high(L),
> -        m_next(NULL)
> -        {}
> -        
> -        SyntheticArrayRange (int L, int H) : 
> -        m_low(L),
> -        m_high(H),
> -        m_next(NULL)
> -        {}
> -        
> -        SyntheticArrayRange (int L, int H, SyntheticArrayRange* N) : 
> -        m_low(L),
> -        m_high(H),
> -        m_next(N)
> -        {}
> -        
> -        inline int
> -        GetLow ()
> -        {
> -            return m_low;
> -        }
> -        
> -        inline int
> -        GetHigh ()
> -        {
> -            return m_high;
> -        }
> -        
> -        inline void
> -        SetLow (int L)
> -        {
> -            m_low = L;
> -        }
> -        
> -        inline void
> -        SetHigh (int H)
> -        {
> -            m_high = H;
> -        }
> -        
> -        inline  int
> -        GetSelfCount()
> -        {
> -            return GetHigh() - GetLow() + 1;
> -        }
> -        
> -        int
> -        GetCount()
> -        {
> -            int count = GetSelfCount();
> -            if (m_next)
> -                count += m_next->GetCount();
> -            return count;
> -        }
> -        
> -        inline SyntheticArrayRange*
> -        GetNext()
> -        {
> -            return m_next;
> -        }
> -        
> -        void
> -        SetNext(SyntheticArrayRange* N)
> -        {
> -            if (m_next)
> -                delete m_next;
> -            m_next = N;
> -        }
> -        
> -        void
> -        SetNext(int L, int H)
> -        {
> -            if (m_next)
> -                delete m_next;
> -            m_next = new SyntheticArrayRange(L, H);
> -        }
> -        
> -        void
> -        SetNext(int L)
> -        {
> -            if (m_next)
> -                delete m_next;
> -            m_next = new SyntheticArrayRange(L);
> -        }
> -        
> -        ~SyntheticArrayRange()
> -        {
> -            delete m_next;
> -            m_next = NULL;
> -        }
> -        
> -    };
> -    
> -    SyntheticArrayView(const SyntheticChildren::Flags& flags) :
> -        SyntheticChildren(flags),
> -        m_head(),
> -        m_tail(&m_head)
> -    {
> -    }
> -    
> -    void
> -    AddRange(int L, int H)
> -    {
> -        m_tail->SetLow(L);
> -        m_tail->SetHigh(H);
> -        m_tail->SetNext(new SyntheticArrayRange());
> -        m_tail = m_tail->GetNext();
> -    }
> -    
> -    int
> -    GetCount()
> -    {
> -        return m_head.GetCount();
> -    }
> -    
> -    int
> -    GetRealIndexForIndex(int i);
> -    
> -    bool
> -    IsScripted()
> -    {
> -        return false;
> -    }
> -    
> -    std::string
> -    GetDescription();
> -    
> -    class FrontEnd : public SyntheticChildrenFrontEnd
> -    {
> -    private:
> -        SyntheticArrayView* filter;
> -    public:
> -        
> -        FrontEnd(SyntheticArrayView* flt,
> -                 ValueObject &backend) :
> -        SyntheticChildrenFrontEnd(backend),
> -        filter(flt)
> -        {}
> -        
> -        virtual
> -        ~FrontEnd()
> -        {
> -        }
> -        
> -        virtual uint32_t
> -        CalculateNumChildren()
> -        {
> -            return filter->GetCount();
> -        }
> -        
> -        virtual bool
> -        MightHaveChildren ()
> -        {
> -            return filter->GetCount() > 0;
> -        }
> -        
> -        virtual lldb::ValueObjectSP
> -        GetChildAtIndex (uint32_t idx)
> -        {
> -            if (idx >= filter->GetCount())
> -                return lldb::ValueObjectSP();
> -            return m_backend.GetSyntheticArrayMember(filter->GetRealIndexForIndex(idx), true);
> -        }
> -        
> -        virtual bool
> -        Update() { return false; }
> -        
> -        virtual uint32_t
> -        GetIndexOfChildWithName (const ConstString &name_cs);
> -        
> -        typedef STD_SHARED_PTR(SyntheticChildrenFrontEnd) SharedPointer;
> -    
> -    private:
> -        DISALLOW_COPY_AND_ASSIGN(FrontEnd);
> -    };
> -    
> -    virtual SyntheticChildrenFrontEnd::AutoPointer
> -    GetFrontEnd(ValueObject &backend)
> -    {
> -        return SyntheticChildrenFrontEnd::AutoPointer(new FrontEnd(this, backend));
> -    }
> -private:
> -    SyntheticArrayRange m_head;
> -    SyntheticArrayRange *m_tail;
> -
> -private:
> -    DISALLOW_COPY_AND_ASSIGN(SyntheticArrayView);
> -};
> -
> -
> -class TypeSummaryImpl
> -{
> -public:
> -    class Flags
> -    {
> -    public:
> -        
> -        Flags () :
> -            m_flags (lldb::eTypeOptionCascade)
> -        {}
> -        
> -        Flags (const Flags& other) :
> -            m_flags (other.m_flags)
> -        {}
> -        
> -        Flags (uint32_t value) :
> -            m_flags (value)
> -        {}
> -        
> -        Flags&
> -        operator = (const Flags& rhs)
> -        {
> -            if (&rhs != this)
> -                m_flags = rhs.m_flags;
> -            
> -            return *this;
> -        }
> -        
> -        Flags&
> -        operator = (const uint32_t& rhs)
> -        {
> -            m_flags = rhs;
> -            return *this;
> -        }
> -        
> -        Flags&
> -        Clear()
> -        {
> -            m_flags = 0;
> -            return *this;
> -        }
> -        
> -        bool
> -        GetCascades () const
> -        {
> -            return (m_flags & lldb::eTypeOptionCascade) == lldb::eTypeOptionCascade;
> -        }
> -        
> -        Flags&
> -        SetCascades (bool value = true)
> -        {
> -            if (value)
> -                m_flags |= lldb::eTypeOptionCascade;
> -            else
> -                m_flags &= ~lldb::eTypeOptionCascade;
> -            return *this;
> -        }
> -
> -        bool
> -        GetSkipPointers () const
> -        {
> -            return (m_flags & lldb::eTypeOptionSkipPointers) == lldb::eTypeOptionSkipPointers;
> -        }
> -
> -        Flags&
> -        SetSkipPointers (bool value = true)
> -        {
> -            if (value)
> -                m_flags |= lldb::eTypeOptionSkipPointers;
> -            else
> -                m_flags &= ~lldb::eTypeOptionSkipPointers;
> -            return *this;
> -        }
> -        
> -        bool
> -        GetSkipReferences () const
> -        {
> -            return (m_flags & lldb::eTypeOptionSkipReferences) == lldb::eTypeOptionSkipReferences;
> -        }
> -        
> -        Flags&
> -        SetSkipReferences (bool value = true)
> -        {
> -            if (value)
> -                m_flags |= lldb::eTypeOptionSkipReferences;
> -            else
> -                m_flags &= ~lldb::eTypeOptionSkipReferences;
> -            return *this;
> -        }
> -        
> -        bool
> -        GetDontShowChildren () const
> -        {
> -            return (m_flags & lldb::eTypeOptionHideChildren) == lldb::eTypeOptionHideChildren;
> -        }
> -        
> -        Flags&
> -        SetDontShowChildren (bool value = true)
> -        {
> -            if (value)
> -                m_flags |= lldb::eTypeOptionHideChildren;
> -            else
> -                m_flags &= ~lldb::eTypeOptionHideChildren;
> -            return *this;
> -        }
> -        
> -        bool
> -        GetDontShowValue () const
> -        {
> -            return (m_flags & lldb::eTypeOptionHideValue) == lldb::eTypeOptionHideValue;
> -        }
> -        
> -        Flags&
> -        SetDontShowValue (bool value = true)
> -        {
> -            if (value)
> -                m_flags |= lldb::eTypeOptionHideValue;
> -            else
> -                m_flags &= ~lldb::eTypeOptionHideValue;
> -            return *this;
> -        }
> -        
> -        bool
> -        GetShowMembersOneLiner () const
> -        {
> -            return (m_flags & lldb::eTypeOptionShowOneLiner) == lldb::eTypeOptionShowOneLiner;
> -        }
> -        
> -        Flags&
> -        SetShowMembersOneLiner (bool value = true)
> -        {
> -            if (value)
> -                m_flags |= lldb::eTypeOptionShowOneLiner;
> -            else
> -                m_flags &= ~lldb::eTypeOptionShowOneLiner;
> -            return *this;
> -        }
> -        
> -        bool
> -        GetHideItemNames () const
> -        {
> -            return (m_flags & lldb::eTypeOptionHideNames) == lldb::eTypeOptionHideNames;
> -        }
> -        
> -        Flags&
> -        SetHideItemNames (bool value = true)
> -        {
> -            if (value)
> -                m_flags |= lldb::eTypeOptionHideNames;
> -            else
> -                m_flags &= ~lldb::eTypeOptionHideNames;
> -            return *this;
> -        }
> -        
> -        uint32_t
> -        GetValue ()
> -        {
> -            return m_flags;
> -        }
> -        
> -        void
> -        SetValue (uint32_t value)
> -        {
> -            m_flags = value;
> -        }
> -                
> -    private:
> -        uint32_t m_flags;
> -    };
> -    
> -    typedef enum Type
> -    {
> -        eTypeUnknown,
> -        eTypeString,
> -        eTypeScript,
> -        eTypeCallback
> -    } Type;
> -    
> -    TypeSummaryImpl (const TypeSummaryImpl::Flags& flags);
> -    
> -    bool
> -    Cascades () const
> -    {
> -        return m_flags.GetCascades();
> -    }
> -    bool
> -    SkipsPointers () const
> -    {
> -        return m_flags.GetSkipPointers();
> -    }
> -    bool
> -    SkipsReferences () const
> -    {
> -        return m_flags.GetSkipReferences();
> -    }
> -    
> -    bool
> -    DoesPrintChildren () const
> -    {
> -        return !m_flags.GetDontShowChildren();
> -    }
> -    
> -    bool
> -    DoesPrintValue () const
> -    {
> -        return !m_flags.GetDontShowValue();
> -    }
> -    
> -    bool
> -    IsOneliner () const
> -    {
> -        return m_flags.GetShowMembersOneLiner();
> -    }
> -    
> -    bool
> -    HideNames () const
> -    {
> -        return m_flags.GetHideItemNames();
> -    }
> -    
> -    void
> -    SetCascades (bool value)
> -    {
> -        m_flags.SetCascades(value);
> -    }
> -    
> -    void
> -    SetSkipsPointers (bool value)
> -    {
> -        m_flags.SetSkipPointers(value);
> -    }
> -    
> -    void
> -    SetSkipsReferences (bool value)
> -    {
> -        m_flags.SetSkipReferences(value);
> -    }
> -    
> -    void
> -    SetDoesPrintChildren (bool value)
> -    {
> -        m_flags.SetDontShowChildren(!value);
> -    }
> -    
> -    void
> -    SetDoesPrintValue (bool value)
> -    {
> -        m_flags.SetDontShowValue(!value);
> -    }
> -    
> -    void
> -    SetIsOneliner (bool value)
> -    {
> -        m_flags.SetShowMembersOneLiner(value);
> -    }
> -    
> -    void
> -    SetHideNames (bool value)
> -    {
> -        m_flags.SetHideItemNames(value);
> -    }
> -    
> -    uint32_t
> -    GetOptions ()
> -    {
> -        return m_flags.GetValue();
> -    }
> -    
> -    void
> -    SetOptions (uint32_t value)
> -    {
> -        m_flags.SetValue(value);
> -    }
> -    
> -    virtual
> -    ~TypeSummaryImpl ()
> -    {
> -    }
> -    
> -    // we are using a ValueObject* instead of a ValueObjectSP because we do not need to hold on to this for
> -    // extended periods of time and we trust the ValueObject to stay around for as long as it is required
> -    // for us to generate its summary
> -    virtual bool
> -    FormatObject (ValueObject *valobj,
> -                  std::string& dest) = 0;
> -    
> -    virtual std::string
> -    GetDescription () = 0;
> -    
> -    virtual bool
> -    IsScripted() = 0;
> -    
> -    virtual Type
> -    GetType () = 0;
> -    
> -    uint32_t&
> -    GetRevision ()
> -    {
> -        return m_my_revision;
> -    }
> -    
> -    typedef STD_SHARED_PTR(TypeSummaryImpl) SharedPointer;
> -    typedef bool(*SummaryCallback)(void*, ConstString, const lldb::TypeSummaryImplSP&);
> -    typedef bool(*RegexSummaryCallback)(void*, lldb::RegularExpressionSP, const lldb::TypeSummaryImplSP&);
> -
> -protected:
> -    uint32_t m_my_revision;
> -    Flags m_flags;
> -    
> -private:
> -    DISALLOW_COPY_AND_ASSIGN(TypeSummaryImpl);
> -};
> -
> -// simple string-based summaries, using ${var to show data
> -struct StringSummaryFormat : public TypeSummaryImpl
> -{
> -    std::string m_format;
> -    
> -    StringSummaryFormat(const TypeSummaryImpl::Flags& flags,
> -                        const char* f);
> -    
> -    const char*
> -    GetSummaryString () const
> -    {
> -        return m_format.c_str();
> -    }
> -    
> -    void
> -    SetSummaryString (const char* data)
> -    {
> -        if (data)
> -                m_format.assign(data);
> -        else
> -                m_format.clear();
> -    }
> -    
> -    virtual
> -    ~StringSummaryFormat()
> -    {
> -    }
> -    
> -    virtual bool
> -    FormatObject(ValueObject *valobj,
> -                 std::string& dest);
> -    
> -    virtual std::string
> -    GetDescription();
> -    
> -    virtual bool
> -    IsScripted()
> -    {
> -        return false;
> -    }
> -
> -    
> -    virtual Type
> -    GetType ()
> -    {
> -        return TypeSummaryImpl::eTypeString;
> -    }
> -    
> -private:
> -    DISALLOW_COPY_AND_ASSIGN(StringSummaryFormat);
> -};
> -
> -// summaries implemented via a C++ function
> -struct CXXFunctionSummaryFormat : public TypeSummaryImpl
> -{
> -    
> -    // we should convert these to SBValue and SBStream if we ever cross
> -    // the boundary towards the external world
> -    typedef bool (*Callback)(ValueObject& valobj,
> -                             Stream& dest);
> -    
> -    
> -    Callback m_impl;
> -    std::string m_description;
> -    
> -    CXXFunctionSummaryFormat(const TypeSummaryImpl::Flags& flags,
> -                             Callback impl,
> -                             const char* description);
> -    
> -    Callback
> -    GetBackendFunction () const
> -    {
> -        return m_impl;
> -    }
> -    
> -    const char*
> -    GetTextualInfo () const
> -    {
> -        return m_description.c_str();
> -    }
> -    
> -    void
> -    SetBackendFunction (Callback cb_func)
> -    {
> -        m_impl = cb_func;
> -    }
> -    
> -    void
> -    SetTextualInfo (const char* descr)
> -    {
> -        if (descr)
> -            m_description.assign(descr);
> -        else
> -            m_description.clear();
> -    }
> -    
> -    virtual
> -    ~CXXFunctionSummaryFormat()
> -    {
> -    }
> -    
> -    virtual bool
> -    FormatObject(ValueObject *valobj,
> -                 std::string& dest);
> -    
> -    virtual std::string
> -    GetDescription();
> -    
> -    virtual bool
> -    IsScripted()
> -    {
> -        return false;
> -    }
> -    
> -    virtual Type
> -    GetType ()
> -    {
> -        return TypeSummaryImpl::eTypeCallback;
> -    }
> -    
> -    typedef STD_SHARED_PTR(CXXFunctionSummaryFormat) SharedPointer;
> -
> -private:
> -    DISALLOW_COPY_AND_ASSIGN(CXXFunctionSummaryFormat);
> -};
> -    
> -#ifndef LLDB_DISABLE_PYTHON
> -
> -// Python-based summaries, running script code to show data
> -struct ScriptSummaryFormat : public TypeSummaryImpl
> -{
> -    std::string m_function_name;
> -    std::string m_python_script;
> -    lldb::ScriptInterpreterObjectSP m_script_function_sp;
> -    
> -    ScriptSummaryFormat(const TypeSummaryImpl::Flags& flags,
> -                        const char *function_name,
> -                        const char* python_script = NULL);
> -    
> -    const char*
> -    GetFunctionName () const
> -    {
> -        return m_function_name.c_str();
> -    }
> -    
> -    const char*
> -    GetPythonScript () const
> -    {
> -        return m_python_script.c_str();
> -    }
> -    
> -    void
> -    SetFunctionName (const char* function_name)
> -    {
> -        if (function_name)
> -                m_function_name.assign(function_name);
> -        else
> -                m_function_name.clear();
> -        m_python_script.clear();
> -    }
> -    
> -    void
> -    SetPythonScript (const char* script)
> -    {
> -        if (script)
> -                m_python_script.assign(script);
> -        else
> -                m_python_script.clear();
> -    }
> -    
> -    virtual
> -    ~ScriptSummaryFormat()
> -    {
> -    }
> -    
> -    virtual bool
> -    FormatObject(ValueObject *valobj,
> -                 std::string& dest);
> -    
> -    virtual std::string
> -    GetDescription();
> -    
> -    virtual bool
> -    IsScripted()
> -    {
> -        return true;
> -    }
> -    
> -    virtual Type
> -    GetType ()
> -    {
> -        return TypeSummaryImpl::eTypeScript;
> -    }
> -    
> -    typedef STD_SHARED_PTR(ScriptSummaryFormat) SharedPointer;
> -
> -    
> -private:
> -    DISALLOW_COPY_AND_ASSIGN(ScriptSummaryFormat);
> -};
> +#include "lldb/DataFormatters/TypeFormat.h"
> +#include "lldb/DataFormatters/TypeSummary.h"
> +#include "lldb/DataFormatters/TypeSynthetic.h"
> 
> -#endif // #ifndef LLDB_DISABLE_PYTHON
> +namespace lldb_private {
> 
> -// TODO: at the moment, this class is only used as a backing store for SBTypeNameSpecifier in the public API
> -// In the future, this might be used as the basic unit for typename-to-formatter matching, replacing
> -// the current plain/regexp distinction in FormatNavigator<>
> class TypeNameSpecifierImpl
> {
> public:
> -    
>     TypeNameSpecifierImpl() :
>     m_is_regex(false),
>     m_type()
> 
> Copied: lldb/trunk/include/lldb/DataFormatters/FormatManager.h (from r173281, lldb/trunk/include/lldb/Core/FormatManager.h)
> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/DataFormatters/FormatManager.h?p2=lldb/trunk/include/lldb/DataFormatters/FormatManager.h&p1=lldb/trunk/include/lldb/Core/FormatManager.h&r1=173281&r2=173728&rev=173728&view=diff
> ==============================================================================
> --- lldb/trunk/include/lldb/Core/FormatManager.h (original)
> +++ lldb/trunk/include/lldb/DataFormatters/FormatManager.h Mon Jan 28 17:47:25 2013
> @@ -18,12 +18,10 @@
> #include "lldb/lldb-public.h"
> #include "lldb/lldb-enumerations.h"
> 
> -#include "lldb/Core/FormatNavigator.h"
> -#include "lldb/Interpreter/ScriptInterpreterPython.h"
> -#include "lldb/Target/ExecutionContext.h"
> -#include "lldb/Target/Platform.h"
> -
> -using lldb::LogSP;
> +#include "lldb/DataFormatters/FormatCache.h"
> +#include "lldb/DataFormatters/FormatNavigator.h"
> +#include "lldb/DataFormatters/TypeCategory.h"
> +#include "lldb/DataFormatters/TypeCategoryMap.h"
> 
> namespace lldb_private {
> 
> @@ -31,535 +29,16 @@ namespace lldb_private {
> // class DataVisualization is the high-level front-end of this feature
> // clients should refer to that class as the entry-point into the data formatters
> // unless they have a good reason to bypass it and prefer to use this file's objects directly
> -    
> -class CategoryMap;
> -    
> -class TypeCategoryImpl
> -{
> -private:
> -    
> -    typedef FormatNavigator<ConstString, TypeSummaryImpl> SummaryNavigator;
> -    typedef FormatNavigator<lldb::RegularExpressionSP, TypeSummaryImpl> RegexSummaryNavigator;
> -    
> -    typedef FormatNavigator<ConstString, TypeFilterImpl> FilterNavigator;
> -    typedef FormatNavigator<lldb::RegularExpressionSP, TypeFilterImpl> RegexFilterNavigator;
> -    
> -#ifndef LLDB_DISABLE_PYTHON
> -    typedef FormatNavigator<ConstString, TypeSyntheticImpl> SynthNavigator;
> -    typedef FormatNavigator<lldb::RegularExpressionSP, TypeSyntheticImpl> RegexSynthNavigator;
> -#endif // #ifndef LLDB_DISABLE_PYTHON
> -
> -    typedef SummaryNavigator::MapType SummaryMap;
> -    typedef RegexSummaryNavigator::MapType RegexSummaryMap;
> -    typedef FilterNavigator::MapType FilterMap;
> -    typedef RegexFilterNavigator::MapType RegexFilterMap;
> -#ifndef LLDB_DISABLE_PYTHON
> -    typedef SynthNavigator::MapType SynthMap;
> -    typedef RegexSynthNavigator::MapType RegexSynthMap;
> -#endif // #ifndef LLDB_DISABLE_PYTHON
> -
> -public:
> -        
> -    typedef uint16_t FormatCategoryItems;
> -    static const uint16_t ALL_ITEM_TYPES = UINT16_MAX;
> -    
> -    typedef SummaryNavigator::SharedPointer SummaryNavigatorSP;
> -    typedef RegexSummaryNavigator::SharedPointer RegexSummaryNavigatorSP;
> -    typedef FilterNavigator::SharedPointer FilterNavigatorSP;
> -    typedef RegexFilterNavigator::SharedPointer RegexFilterNavigatorSP;
> -#ifndef LLDB_DISABLE_PYTHON
> -    typedef SynthNavigator::SharedPointer SynthNavigatorSP;
> -    typedef RegexSynthNavigator::SharedPointer RegexSynthNavigatorSP;
> -#endif // #ifndef LLDB_DISABLE_PYTHON
> -
> -    TypeCategoryImpl (IFormatChangeListener* clist,
> -                      ConstString name);
> -    
> -    SummaryNavigatorSP
> -    GetSummaryNavigator ()
> -    {
> -        return SummaryNavigatorSP(m_summary_nav);
> -    }
> -    
> -    RegexSummaryNavigatorSP
> -    GetRegexSummaryNavigator ()
> -    {
> -        return RegexSummaryNavigatorSP(m_regex_summary_nav);
> -    }
> -    
> -    FilterNavigatorSP
> -    GetFilterNavigator ()
> -    {
> -        return FilterNavigatorSP(m_filter_nav);
> -    }
> -    
> -    RegexFilterNavigatorSP
> -    GetRegexFilterNavigator ()
> -    {
> -        return RegexFilterNavigatorSP(m_regex_filter_nav);
> -    }
> -    
> -    SummaryNavigator::MapValueType
> -    GetSummaryForType (lldb::TypeNameSpecifierImplSP type_sp)
> -    {
> -        SummaryNavigator::MapValueType retval;
> -        
> -        if (type_sp)
> -        {
> -            if (type_sp->IsRegex())
> -                m_regex_summary_nav->GetExact(ConstString(type_sp->GetName()),retval);
> -            else
> -                m_summary_nav->GetExact(ConstString(type_sp->GetName()),retval);
> -        }
> -
> -        return retval;
> -    }
> -    
> -    FilterNavigator::MapValueType
> -    GetFilterForType (lldb::TypeNameSpecifierImplSP type_sp)
> -    {
> -        FilterNavigator::MapValueType retval;
> -        
> -        if (type_sp)
> -        {
> -            if (type_sp->IsRegex())
> -                m_regex_filter_nav->GetExact(ConstString(type_sp->GetName()),retval);
> -            else
> -                m_filter_nav->GetExact(ConstString(type_sp->GetName()),retval);
> -        }
> -        
> -        return retval;
> -    }
> -    
> -#ifndef LLDB_DISABLE_PYTHON
> -    SynthNavigator::MapValueType
> -    GetSyntheticForType (lldb::TypeNameSpecifierImplSP type_sp)
> -    {
> -        SynthNavigator::MapValueType retval;
> -        
> -        if (type_sp)
> -        {
> -            if (type_sp->IsRegex())
> -                m_regex_synth_nav->GetExact(ConstString(type_sp->GetName()),retval);
> -            else
> -                m_synth_nav->GetExact(ConstString(type_sp->GetName()),retval);
> -        }
> -        
> -        return retval;
> -    }
> -#endif
> -    
> -    lldb::TypeNameSpecifierImplSP
> -    GetTypeNameSpecifierForSummaryAtIndex (uint32_t index)
> -    {
> -        if (index < m_summary_nav->GetCount())
> -            return m_summary_nav->GetTypeNameSpecifierAtIndex(index);
> -        else
> -            return m_regex_summary_nav->GetTypeNameSpecifierAtIndex(index-m_summary_nav->GetCount());
> -    }
> -    
> -    SummaryNavigator::MapValueType
> -    GetSummaryAtIndex (uint32_t index)
> -    {
> -        if (index < m_summary_nav->GetCount())
> -            return m_summary_nav->GetAtIndex(index);
> -        else
> -            return m_regex_summary_nav->GetAtIndex(index-m_summary_nav->GetCount());
> -    }
> -
> -    FilterNavigator::MapValueType
> -    GetFilterAtIndex (uint32_t index)
> -    {
> -        if (index < m_filter_nav->GetCount())
> -            return m_filter_nav->GetAtIndex(index);
> -        else
> -            return m_regex_filter_nav->GetAtIndex(index-m_filter_nav->GetCount());
> -    }
> -    
> -    lldb::TypeNameSpecifierImplSP
> -    GetTypeNameSpecifierForFilterAtIndex (uint32_t index)
> -    {
> -        if (index < m_filter_nav->GetCount())
> -            return m_filter_nav->GetTypeNameSpecifierAtIndex(index);
> -        else
> -            return m_regex_filter_nav->GetTypeNameSpecifierAtIndex(index-m_filter_nav->GetCount());
> -    }
> -
> -#ifndef LLDB_DISABLE_PYTHON
> -    SynthNavigatorSP
> -    GetSyntheticNavigator ()
> -    {
> -        return SynthNavigatorSP(m_synth_nav);
> -    }
> -    
> -    RegexSynthNavigatorSP
> -    GetRegexSyntheticNavigator ()
> -    {
> -        return RegexSynthNavigatorSP(m_regex_synth_nav);
> -    }
> -    
> -    SynthNavigator::MapValueType
> -    GetSyntheticAtIndex (uint32_t index)
> -    {
> -        if (index < m_synth_nav->GetCount())
> -            return m_synth_nav->GetAtIndex(index);
> -        else
> -            return m_regex_synth_nav->GetAtIndex(index-m_synth_nav->GetCount());
> -    }
> -    
> -    lldb::TypeNameSpecifierImplSP
> -    GetTypeNameSpecifierForSyntheticAtIndex (uint32_t index)
> -    {
> -        if (index < m_synth_nav->GetCount())
> -            return m_synth_nav->GetTypeNameSpecifierAtIndex(index);
> -        else
> -            return m_regex_synth_nav->GetTypeNameSpecifierAtIndex(index - m_synth_nav->GetCount());
> -    }
> -    
> -#endif // #ifndef LLDB_DISABLE_PYTHON
> -
> -    bool
> -    IsEnabled () const
> -    {
> -        return m_enabled;
> -    }
> -    
> -    uint32_t
> -    GetEnabledPosition()
> -    {
> -        if (m_enabled == false)
> -            return UINT32_MAX;
> -        else
> -            return m_enabled_position;
> -    }
> -    
> -    bool
> -    Get (ValueObject& valobj,
> -         lldb::TypeSummaryImplSP& entry,
> -         lldb::DynamicValueType use_dynamic,
> -         uint32_t* reason = NULL);
> -    
> -    bool
> -    Get (ValueObject& valobj,
> -         lldb::SyntheticChildrenSP& entry,
> -         lldb::DynamicValueType use_dynamic,
> -         uint32_t* reason = NULL);
> -        
> -    void
> -    Clear (FormatCategoryItems items = ALL_ITEM_TYPES);
> -    
> -    bool
> -    Delete (ConstString name,
> -            FormatCategoryItems items = ALL_ITEM_TYPES);
> -    
> -    uint32_t
> -    GetCount (FormatCategoryItems items = ALL_ITEM_TYPES);
> -    
> -    const char*
> -    GetName ()
> -    {
> -        return m_name.GetCString();
> -    }
> -    
> -    bool
> -    AnyMatches (ConstString type_name,
> -                FormatCategoryItems items = ALL_ITEM_TYPES,
> -                bool only_enabled = true,
> -                const char** matching_category = NULL,
> -                FormatCategoryItems* matching_type = NULL);
> -    
> -    typedef STD_SHARED_PTR(TypeCategoryImpl) SharedPointer;
> -    
> -private:
> -    SummaryNavigator::SharedPointer m_summary_nav;
> -    RegexSummaryNavigator::SharedPointer m_regex_summary_nav;
> -    FilterNavigator::SharedPointer m_filter_nav;
> -    RegexFilterNavigator::SharedPointer m_regex_filter_nav;
> -#ifndef LLDB_DISABLE_PYTHON
> -    SynthNavigator::SharedPointer m_synth_nav;
> -    RegexSynthNavigator::SharedPointer m_regex_synth_nav;
> -#endif // #ifndef LLDB_DISABLE_PYTHON
> -    
> -    bool m_enabled;
> -    
> -    IFormatChangeListener* m_change_listener;
> -    
> -    Mutex m_mutex;
> -    
> -    ConstString m_name;
> -    
> -    uint32_t m_enabled_position;
> -    
> -    void
> -    Enable (bool value,
> -            uint32_t position)
> -    {
> -        Mutex::Locker locker(m_mutex);
> -        m_enabled = value;
> -        m_enabled_position = position;
> -        if (m_change_listener)
> -            m_change_listener->Changed();
> -    }
> -    
> -    void
> -    Disable ()
> -    {
> -        Enable(false, UINT32_MAX);
> -    }
> -    
> -    friend class CategoryMap;
> -    
> -    friend class FormatNavigator<ConstString, TypeSummaryImpl>;
> -    friend class FormatNavigator<lldb::RegularExpressionSP, TypeSummaryImpl>;
> -    
> -    friend class FormatNavigator<ConstString, TypeFilterImpl>;
> -    friend class FormatNavigator<lldb::RegularExpressionSP, TypeFilterImpl>;
> -    
> -#ifndef LLDB_DISABLE_PYTHON
> -    friend class FormatNavigator<ConstString, TypeSyntheticImpl>;
> -    friend class FormatNavigator<lldb::RegularExpressionSP, TypeSyntheticImpl>;
> -#endif // #ifndef LLDB_DISABLE_PYTHON
> -    
> -
> -};
> -
> -class CategoryMap
> -{
> -private:
> -    typedef ConstString KeyType;
> -    typedef TypeCategoryImpl ValueType;
> -    typedef ValueType::SharedPointer ValueSP;
> -    typedef std::list<lldb::TypeCategoryImplSP> ActiveCategoriesList;
> -    typedef ActiveCategoriesList::iterator ActiveCategoriesIterator;
> -        
> -public:
> -    typedef std::map<KeyType, ValueSP> MapType;
> -    typedef MapType::iterator MapIterator;
> -    typedef bool(*CallbackType)(void*, const ValueSP&);
> -    typedef uint32_t Position;
> -    
> -    static const Position First = 0;
> -    static const Position Default = 1;
> -    static const Position Last = UINT32_MAX;
> -    
> -    CategoryMap (IFormatChangeListener* lst) :
> -        m_map_mutex(Mutex::eMutexTypeRecursive),
> -        listener(lst),
> -        m_map(),
> -        m_active_categories()
> -    {
> -        ConstString default_cs("default");
> -        lldb::TypeCategoryImplSP default_sp = lldb::TypeCategoryImplSP(new TypeCategoryImpl(listener, default_cs));
> -        Add(default_cs,default_sp);
> -        Enable(default_cs,First);
> -    }
> -    
> -    void
> -    Add (KeyType name,
> -         const ValueSP& entry)
> -    {
> -        Mutex::Locker locker(m_map_mutex);
> -        m_map[name] = entry;
> -        if (listener)
> -            listener->Changed();
> -    }
> -    
> -    bool
> -    Delete (KeyType name)
> -    {
> -        Mutex::Locker locker(m_map_mutex);
> -        MapIterator iter = m_map.find(name);
> -        if (iter == m_map.end())
> -            return false;
> -        m_map.erase(name);
> -        Disable(name);
> -        if (listener)
> -            listener->Changed();
> -        return true;
> -    }
> -    
> -    bool
> -    Enable (KeyType category_name,
> -            Position pos = Default)
> -    {
> -        Mutex::Locker locker(m_map_mutex);
> -        ValueSP category;
> -        if (!Get(category_name,category))
> -            return false;
> -        return Enable(category, pos);
> -    }
> -    
> -    bool
> -    Disable (KeyType category_name)
> -    {
> -        Mutex::Locker locker(m_map_mutex);
> -        ValueSP category;
> -        if (!Get(category_name,category))
> -            return false;
> -        return Disable(category);
> -    }
> -    
> -    bool
> -    Enable (ValueSP category,
> -            Position pos = Default)
> -    {
> -        Mutex::Locker locker(m_map_mutex);
> -        if (category.get())
> -        {
> -            Position pos_w = pos;
> -            if (pos == First || m_active_categories.size() == 0)
> -                m_active_categories.push_front(category);
> -            else if (pos == Last || pos == m_active_categories.size())
> -                m_active_categories.push_back(category);
> -            else if (pos < m_active_categories.size())
> -            {
> -                ActiveCategoriesList::iterator iter = m_active_categories.begin();
> -                while (pos_w)
> -                {
> -                    pos_w--,iter++;
> -                }
> -                m_active_categories.insert(iter,category);
> -            }
> -            else
> -                return false;
> -            category->Enable(true,
> -                             pos);
> -            return true;
> -        }
> -        return false;
> -    }
> -    
> -    bool
> -    Disable (ValueSP category)
> -    {
> -        Mutex::Locker locker(m_map_mutex);
> -        if (category.get())
> -        {
> -            m_active_categories.remove_if(delete_matching_categories(category));
> -            category->Disable();
> -            return true;
> -        }
> -        return false;
> -    }
> -    
> -    void
> -    Clear ()
> -    {
> -        Mutex::Locker locker(m_map_mutex);
> -        m_map.clear();
> -        m_active_categories.clear();
> -        if (listener)
> -            listener->Changed();
> -    }
> -    
> -    bool
> -    Get (KeyType name,
> -         ValueSP& entry)
> -    {
> -        Mutex::Locker locker(m_map_mutex);
> -        MapIterator iter = m_map.find(name);
> -        if (iter == m_map.end())
> -            return false;
> -        entry = iter->second;
> -        return true;
> -    }
> -    
> -    bool
> -    Get (uint32_t pos,
> -         ValueSP& entry)
> -    {
> -        Mutex::Locker locker(m_map_mutex);
> -        MapIterator iter = m_map.begin();
> -        MapIterator end = m_map.end();
> -        while (pos > 0)
> -        {
> -            iter++;
> -            pos--;
> -            if (iter == end)
> -                return false;
> -        }
> -        entry = iter->second;
> -        return false;
> -    }
> -    
> -    void
> -    LoopThrough (CallbackType callback, void* param);
> -    
> -    lldb::TypeCategoryImplSP
> -    GetAtIndex (uint32_t);
> -    
> -    bool
> -    AnyMatches (ConstString type_name,
> -                TypeCategoryImpl::FormatCategoryItems items = TypeCategoryImpl::ALL_ITEM_TYPES,
> -                bool only_enabled = true,
> -                const char** matching_category = NULL,
> -                TypeCategoryImpl::FormatCategoryItems* matching_type = NULL);
> -    
> -    uint32_t
> -    GetCount ()
> -    {
> -        return m_map.size();
> -    }
> -    
> -    lldb::TypeSummaryImplSP
> -    GetSummaryFormat (ValueObject& valobj,
> -         lldb::DynamicValueType use_dynamic);
> -    
> -#ifndef LLDB_DISABLE_PYTHON
> -    lldb::SyntheticChildrenSP
> -    GetSyntheticChildren (ValueObject& valobj,
> -                          lldb::DynamicValueType use_dynamic);
> -#endif
> -    
> -private:
> -    
> -    class delete_matching_categories
> -    {
> -        lldb::TypeCategoryImplSP ptr;
> -    public:
> -        delete_matching_categories(lldb::TypeCategoryImplSP p) : ptr(p)
> -        {}
> -        
> -        bool operator()(const lldb::TypeCategoryImplSP& other)
> -        {
> -            return ptr.get() == other.get();
> -        }
> -    };
> -    
> -    Mutex m_map_mutex;
> -    IFormatChangeListener* listener;
> -    
> -    MapType m_map;
> -    ActiveCategoriesList m_active_categories;
> -    
> -    MapType& map ()
> -    {
> -        return m_map;
> -    }
> -    
> -    ActiveCategoriesList& active_list ()
> -    {
> -        return m_active_categories;
> -    }
> -    
> -    Mutex& mutex ()
> -    {
> -        return m_map_mutex;
> -    }
> -    
> -    friend class FormatNavigator<KeyType, ValueType>;
> -    friend class FormatManager;
> -};
> 
> class FormatManager : public IFormatChangeListener
> {
>     typedef FormatNavigator<ConstString, TypeFormatImpl> ValueNavigator;
>     typedef ValueNavigator::MapType ValueMap;
>     typedef FormatMap<ConstString, TypeSummaryImpl> NamedSummariesMap;
> -    typedef CategoryMap::MapType::iterator CategoryMapIterator;
> +    typedef TypeCategoryMap::MapType::iterator CategoryMapIterator;
> public:
> 
> -    typedef CategoryMap::CallbackType CategoryCallback;
> +    typedef TypeCategoryMap::CallbackType CategoryCallback;
> 
>     FormatManager ();
> 
> @@ -577,7 +56,7 @@ public:
> 
>     void
>     EnableCategory (const ConstString& category_name,
> -                    CategoryMap::Position pos = CategoryMap::Default)
> +                    TypeCategoryMap::Position pos = TypeCategoryMap::Default)
>     {
>         m_categories_map.Enable(category_name,
>                                 pos);
> @@ -591,7 +70,7 @@ public:
> 
>     void
>     EnableCategory (const lldb::TypeCategoryImplSP& category,
> -                    CategoryMap::Position pos = CategoryMap::Default)
> +                    TypeCategoryMap::Position pos = TypeCategoryMap::Default)
>     {
>         m_categories_map.Enable(category,
>                                 pos);
> @@ -622,7 +101,7 @@ public:
>     }
> 
>     lldb::TypeCategoryImplSP
> -    GetCategoryAtIndex (uint32_t index)
> +    GetCategoryAtIndex (size_t index)
>     {
>         return m_categories_map.GetAtIndex(index);
>     }
> @@ -647,20 +126,13 @@ public:
>                  bool can_create = true);
> 
>     lldb::TypeSummaryImplSP
> -    GetSummaryFormat (ValueObject& valobj,
> -                      lldb::DynamicValueType use_dynamic)
> -    {
> -        return m_categories_map.GetSummaryFormat(valobj, use_dynamic);
> -    }
> -    
> -    lldb::TypeSummaryImplSP
>     GetSummaryForType (lldb::TypeNameSpecifierImplSP type_sp);
> 
>     lldb::TypeFilterImplSP
>     GetFilterForType (lldb::TypeNameSpecifierImplSP type_sp);
> 
> #ifndef LLDB_DISABLE_PYTHON
> -    lldb::TypeSyntheticImplSP
> +    lldb::ScriptedSyntheticChildrenSP
>     GetSyntheticForType (lldb::TypeNameSpecifierImplSP type_sp);
> #endif
> 
> @@ -669,13 +141,14 @@ public:
>     GetSyntheticChildrenForType (lldb::TypeNameSpecifierImplSP type_sp);
> #endif
> 
> +    lldb::TypeSummaryImplSP
> +    GetSummaryFormat (ValueObject& valobj,
> +                      lldb::DynamicValueType use_dynamic);
> +
> #ifndef LLDB_DISABLE_PYTHON
>     lldb::SyntheticChildrenSP
>     GetSyntheticChildren (ValueObject& valobj,
> -                          lldb::DynamicValueType use_dynamic)
> -    {
> -        return m_categories_map.GetSyntheticChildren(valobj, use_dynamic);
> -    }
> +                          lldb::DynamicValueType use_dynamic);
> #endif
> 
>     bool
> @@ -719,6 +192,7 @@ public:
>     Changed ()
>     {
>         __sync_add_and_fetch(&m_last_revision, +1);
> +        m_format_cache.Clear ();
>     }
> 
>     uint32_t
> @@ -731,11 +205,12 @@ public:
>     {
>     }
> 
> -private:    
> +private:
> +    FormatCache m_format_cache;
>     ValueNavigator m_value_nav;
>     NamedSummariesMap m_named_summaries_map;
>     uint32_t m_last_revision;
> -    CategoryMap m_categories_map;
> +    TypeCategoryMap m_categories_map;
> 
>     ConstString m_default_category_name;
>     ConstString m_system_category_name;
> @@ -748,7 +223,7 @@ private:    
>     ConstString m_vectortypes_category_name;
>     ConstString m_appkit_category_name;
> 
> -    CategoryMap&
> +    TypeCategoryMap&
>     GetCategories ()
>     {
>         return m_categories_map;
> 
> Copied: lldb/trunk/include/lldb/DataFormatters/FormatNavigator.h (from r173281, lldb/trunk/include/lldb/Core/FormatNavigator.h)
> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/DataFormatters/FormatNavigator.h?p2=lldb/trunk/include/lldb/DataFormatters/FormatNavigator.h&p1=lldb/trunk/include/lldb/Core/FormatNavigator.h&r1=173281&r2=173728&rev=173728&view=diff
> ==============================================================================
> --- lldb/trunk/include/lldb/Core/FormatNavigator.h (original)
> +++ lldb/trunk/include/lldb/DataFormatters/FormatNavigator.h Mon Jan 28 17:47:25 2013
> @@ -21,11 +21,12 @@
> // Project includes
> #include "lldb/lldb-public.h"
> 
> -#include "lldb/Core/FormatClasses.h"
> #include "lldb/Core/Log.h"
> #include "lldb/Core/RegularExpression.h"
> #include "lldb/Core/ValueObject.h"
> 
> +#include "lldb/DataFormatters/FormatClasses.h"
> +
> #include "lldb/Symbol/ClangASTContext.h"
> 
> #include "lldb/Target/ObjCLanguageRuntime.h"
> @@ -192,7 +193,7 @@ public:
>     }
> 
>     ValueSP
> -    GetValueAtIndex (uint32_t index)
> +    GetValueAtIndex (size_t index)
>     {
>         Mutex::Locker locker(m_map_mutex);
>         MapIterator iter = m_map.begin();
> @@ -208,7 +209,7 @@ public:
>     }
> 
>     KeyType
> -    GetKeyAtIndex (uint32_t index)
> +    GetKeyAtIndex (size_t index)
>     {
>         Mutex::Locker locker(m_map_mutex);
>         MapIterator iter = m_map.begin();
> @@ -316,13 +317,13 @@ public:
>     }
> 
>     MapValueType
> -    GetAtIndex (uint32_t index)
> +    GetAtIndex (size_t index)
>     {
>         return m_format_map.GetValueAtIndex(index);
>     }
> 
>     lldb::TypeNameSpecifierImplSP
> -    GetTypeNameSpecifierAtIndex (uint32_t index)
> +    GetTypeNameSpecifierAtIndex (size_t index)
>     {
>         return GetTypeNameSpecifierAtIndex_Impl(index, (KeyType*)NULL);
>     }
> @@ -405,7 +406,7 @@ protected:
>     }
> 
>     lldb::TypeNameSpecifierImplSP
> -    GetTypeNameSpecifierAtIndex_Impl (uint32_t index, ConstString *dummy)
> +    GetTypeNameSpecifierAtIndex_Impl (size_t index, ConstString *dummy)
>     {
>         ConstString key = m_format_map.GetKeyAtIndex(index);
>         if (key)
> @@ -416,7 +417,7 @@ protected:
>     }
> 
>     lldb::TypeNameSpecifierImplSP
> -    GetTypeNameSpecifierAtIndex_Impl (uint32_t index, lldb::RegularExpressionSP *dummy)
> +    GetTypeNameSpecifierAtIndex_Impl (size_t index, lldb::RegularExpressionSP *dummy)
>     {
>         lldb::RegularExpressionSP regex = m_format_map.GetKeyAtIndex(index);
>         if (regex.get() == NULL)
> @@ -525,28 +526,28 @@ protected:
>         return false;
>     }
> 
> -    // we are separately passing in valobj and type because the valobj is fixed (and is used for ObjC discovery and bitfield size)
> -    // but the type can change (e.g. stripping pointers, ...)
> -    bool Get (ValueObject& valobj,
> +    bool
> +    Get_Impl (ValueObject& valobj,
>               clang::QualType type,
>               MapValueType& entry,
>               lldb::DynamicValueType use_dynamic,
>               uint32_t& reason)
>     {
>         LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_TYPES));
> +
>         if (type.isNull())
>         {
>             if (log)
> -                log->Printf("[Get] type is NULL, returning");
> +                log->Printf("[Get_Impl] type is NULL, returning");
>             return false;
>         }
> -
> +        
>         type.removeLocalConst(); type.removeLocalVolatile(); type.removeLocalRestrict();
>         const clang::Type* typePtr = type.getTypePtrOrNull();
>         if (!typePtr)
>         {
>             if (log)
> -                log->Printf("[Get] type is NULL, returning");
> +                log->Printf("[Get_Impl] type is NULL, returning");
>             return false;
>         }
>         ConstString typeName(ClangASTType::GetTypeNameForQualType(valobj.GetClangAST(), type).c_str());
> @@ -558,7 +559,7 @@ protected:
>         }
> 
>         if (log)
> -            log->Printf("[Get] trying to get %s for VO name %s of type %s",
> +            log->Printf("[Get_Impl] trying to get %s for VO name %s of type %s",
>                         m_name.c_str(),
>                         valobj.GetName().AsCString(),
>                         typeName.AsCString());
> @@ -570,14 +571,14 @@ protected:
>             return true;
>         }
>         if (log)
> -            log->Printf("[Get] no direct match");
> -
> +            log->Printf("[Get_Impl] no direct match");
> +        
>         // strip pointers and references and see if that helps
>         if (typePtr->isReferenceType())
>         {
>             if (log)
> -                log->Printf("[Get] stripping reference");
> -            if (Get(valobj,type.getNonReferenceType(),entry, use_dynamic, reason) && !entry->SkipsReferences())
> +                log->Printf("[Get_Impl] stripping reference");
> +            if (Get_Impl(valobj,type.getNonReferenceType(),entry, use_dynamic, reason) && !entry->SkipsReferences())
>             {
>                 reason |= lldb_private::eFormatterChoiceCriterionStrippedPointerReference;
>                 return true;
> @@ -586,15 +587,15 @@ protected:
>         else if (typePtr->isPointerType())
>         {
>             if (log)
> -                log->Printf("[Get] stripping pointer");
> +                log->Printf("[Get_Impl] stripping pointer");
>             clang::QualType pointee = typePtr->getPointeeType();
> -            if (Get(valobj, pointee, entry, use_dynamic, reason) && !entry->SkipsPointers())
> +            if (Get_Impl(valobj, pointee, entry, use_dynamic, reason) && !entry->SkipsPointers())
>             {
>                 reason |= lldb_private::eFormatterChoiceCriterionStrippedPointerReference;
>                 return true;
>             }
>         }
> -
> +        
>         bool canBeObjCDynamic = ClangASTContext::IsPossibleDynamicType (valobj.GetClangAST(),
>                                                                         type.getAsOpaquePtr(),
>                                                                         NULL,
> @@ -606,7 +607,7 @@ protected:
>             if (use_dynamic != lldb::eNoDynamicValues)
>             {
>                 if (log)
> -                    log->Printf("[Get] allowed to figure out dynamic ObjC type");
> +                    log->Printf("[Get_Impl] allowed to figure out dynamic ObjC type");
>                 if (Get_ObjC(valobj,entry))
>                 {
>                     reason |= lldb_private::eFormatterChoiceCriterionDynamicObjCDiscovery;
> @@ -614,28 +615,45 @@ protected:
>                 }
>             }
>             if (log)
> -                log->Printf("[Get] dynamic disabled or failed - stripping ObjC pointer");
> +                log->Printf("[Get_Impl] dynamic disabled or failed - stripping ObjC pointer");
>             clang::QualType pointee = typePtr->getPointeeType();
> -            if (Get(valobj, pointee, entry, use_dynamic, reason) && !entry->SkipsPointers())
> +            if (Get_Impl(valobj, pointee, entry, use_dynamic, reason) && !entry->SkipsPointers())
>             {
>                 reason |= lldb_private::eFormatterChoiceCriterionStrippedPointerReference;
>                 return true;
>             }
>         }
> -    
> +        
>         // try to strip typedef chains
>         const clang::TypedefType* type_tdef = type->getAs<clang::TypedefType>();
>         if (type_tdef)
>         {
>             if (log)
> -                log->Printf("[Get] stripping typedef");
> -            if ((Get(valobj, type_tdef->getDecl()->getUnderlyingType(), entry, use_dynamic, reason)) && entry->Cascades())
> +                log->Printf("[Get_Impl] stripping typedef");
> +            if ((Get_Impl(valobj, type_tdef->getDecl()->getUnderlyingType(), entry, use_dynamic, reason)) && entry->Cascades())
>             {
>                 reason |= lldb_private::eFormatterChoiceCriterionNavigatedTypedefs;
>                 return true;
>             }
>         }
> 
> +        // out of luck here
> +        return false;
> +    }
> +    
> +    // we are separately passing in valobj and type because the valobj is fixed (and is used for ObjC discovery and bitfield size)
> +    // but the type can change (e.g. stripping pointers, ...)
> +    bool Get (ValueObject& valobj,
> +              clang::QualType type,
> +              MapValueType& entry,
> +              lldb::DynamicValueType use_dynamic,
> +              uint32_t& reason)
> +    {
> +        LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_TYPES));
> +        
> +        if (Get_Impl (valobj,type,entry,use_dynamic,reason))
> +            return true;
> +        
>         // if all else fails, go to static type
>         if (valobj.IsDynamic())
>         {
> 
> Added: lldb/trunk/include/lldb/DataFormatters/TypeCategory.h
> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/DataFormatters/TypeCategory.h?rev=173728&view=auto
> ==============================================================================
> --- lldb/trunk/include/lldb/DataFormatters/TypeCategory.h (added)
> +++ lldb/trunk/include/lldb/DataFormatters/TypeCategory.h Mon Jan 28 17:47:25 2013
> @@ -0,0 +1,230 @@
> +//===-- TypeCategory.h -------------------------------------------*- C++ -*-===//
> +//
> +//                     The LLVM Compiler Infrastructure
> +//
> +// This file is distributed under the University of Illinois Open Source
> +// License. See LICENSE.TXT for details.
> +//
> +//===----------------------------------------------------------------------===//
> +
> +#ifndef lldb_TypeCategory_h_
> +#define lldb_TypeCategory_h_
> +
> +// C Includes
> +// C++ Includes
> +
> +// Other libraries and framework includes
> +// Project includes
> +#include "lldb/lldb-public.h"
> +#include "lldb/lldb-enumerations.h"
> +
> +#include "lldb/DataFormatters/FormatNavigator.h"
> +
> +namespace lldb_private {    
> +    class TypeCategoryImpl
> +    {
> +    private:
> +        
> +        typedef FormatNavigator<ConstString, TypeSummaryImpl> SummaryNavigator;
> +        typedef FormatNavigator<lldb::RegularExpressionSP, TypeSummaryImpl> RegexSummaryNavigator;
> +        
> +        typedef FormatNavigator<ConstString, TypeFilterImpl> FilterNavigator;
> +        typedef FormatNavigator<lldb::RegularExpressionSP, TypeFilterImpl> RegexFilterNavigator;
> +        
> +#ifndef LLDB_DISABLE_PYTHON
> +        typedef FormatNavigator<ConstString, ScriptedSyntheticChildren> SynthNavigator;
> +        typedef FormatNavigator<lldb::RegularExpressionSP, ScriptedSyntheticChildren> RegexSynthNavigator;
> +#endif // #ifndef LLDB_DISABLE_PYTHON
> +        
> +        typedef SummaryNavigator::MapType SummaryMap;
> +        typedef RegexSummaryNavigator::MapType RegexSummaryMap;
> +        typedef FilterNavigator::MapType FilterMap;
> +        typedef RegexFilterNavigator::MapType RegexFilterMap;
> +#ifndef LLDB_DISABLE_PYTHON
> +        typedef SynthNavigator::MapType SynthMap;
> +        typedef RegexSynthNavigator::MapType RegexSynthMap;
> +#endif // #ifndef LLDB_DISABLE_PYTHON
> +        
> +    public:
> +        
> +        typedef uint16_t FormatCategoryItems;
> +        static const uint16_t ALL_ITEM_TYPES = UINT16_MAX;
> +        
> +        typedef SummaryNavigator::SharedPointer SummaryNavigatorSP;
> +        typedef RegexSummaryNavigator::SharedPointer RegexSummaryNavigatorSP;
> +        typedef FilterNavigator::SharedPointer FilterNavigatorSP;
> +        typedef RegexFilterNavigator::SharedPointer RegexFilterNavigatorSP;
> +#ifndef LLDB_DISABLE_PYTHON
> +        typedef SynthNavigator::SharedPointer SynthNavigatorSP;
> +        typedef RegexSynthNavigator::SharedPointer RegexSynthNavigatorSP;
> +#endif // #ifndef LLDB_DISABLE_PYTHON
> +        
> +        TypeCategoryImpl (IFormatChangeListener* clist,
> +                          ConstString name);
> +        
> +        SummaryNavigatorSP
> +        GetSummaryNavigator ()
> +        {
> +            return SummaryNavigatorSP(m_summary_nav);
> +        }
> +        
> +        RegexSummaryNavigatorSP
> +        GetRegexSummaryNavigator ()
> +        {
> +            return RegexSummaryNavigatorSP(m_regex_summary_nav);
> +        }
> +        
> +        FilterNavigatorSP
> +        GetFilterNavigator ()
> +        {
> +            return FilterNavigatorSP(m_filter_nav);
> +        }
> +        
> +        RegexFilterNavigatorSP
> +        GetRegexFilterNavigator ()
> +        {
> +            return RegexFilterNavigatorSP(m_regex_filter_nav);
> +        }
> +        
> +        SummaryNavigator::MapValueType
> +        GetSummaryForType (lldb::TypeNameSpecifierImplSP type_sp);
> +        
> +        FilterNavigator::MapValueType
> +        GetFilterForType (lldb::TypeNameSpecifierImplSP type_sp);
> +        
> +#ifndef LLDB_DISABLE_PYTHON
> +        SynthNavigator::MapValueType
> +        GetSyntheticForType (lldb::TypeNameSpecifierImplSP type_sp);
> +#endif
> +        
> +        lldb::TypeNameSpecifierImplSP
> +        GetTypeNameSpecifierForSummaryAtIndex (size_t index);
> +        
> +        SummaryNavigator::MapValueType
> +        GetSummaryAtIndex (size_t index);
> +        
> +        FilterNavigator::MapValueType
> +        GetFilterAtIndex (size_t index);
> +        
> +        lldb::TypeNameSpecifierImplSP
> +        GetTypeNameSpecifierForFilterAtIndex (size_t index);
> +        
> +#ifndef LLDB_DISABLE_PYTHON
> +        SynthNavigatorSP
> +        GetSyntheticNavigator ()
> +        {
> +            return SynthNavigatorSP(m_synth_nav);
> +        }
> +        
> +        RegexSynthNavigatorSP
> +        GetRegexSyntheticNavigator ()
> +        {
> +            return RegexSynthNavigatorSP(m_regex_synth_nav);
> +        }
> +        
> +        SynthNavigator::MapValueType
> +        GetSyntheticAtIndex (size_t index);
> +        
> +        lldb::TypeNameSpecifierImplSP
> +        GetTypeNameSpecifierForSyntheticAtIndex (size_t index);
> +        
> +#endif // #ifndef LLDB_DISABLE_PYTHON
> +        
> +        bool
> +        IsEnabled () const
> +        {
> +            return m_enabled;
> +        }
> +        
> +        uint32_t
> +        GetEnabledPosition()
> +        {
> +            if (m_enabled == false)
> +                return UINT32_MAX;
> +            else
> +                return m_enabled_position;
> +        }
> +        
> +        bool
> +        Get (ValueObject& valobj,
> +             lldb::TypeSummaryImplSP& entry,
> +             lldb::DynamicValueType use_dynamic,
> +             uint32_t* reason = NULL);
> +        
> +        bool
> +        Get (ValueObject& valobj,
> +             lldb::SyntheticChildrenSP& entry,
> +             lldb::DynamicValueType use_dynamic,
> +             uint32_t* reason = NULL);
> +        
> +        void
> +        Clear (FormatCategoryItems items = ALL_ITEM_TYPES);
> +        
> +        bool
> +        Delete (ConstString name,
> +                FormatCategoryItems items = ALL_ITEM_TYPES);
> +        
> +        uint32_t
> +        GetCount (FormatCategoryItems items = ALL_ITEM_TYPES);
> +        
> +        const char*
> +        GetName ()
> +        {
> +            return m_name.GetCString();
> +        }
> +        
> +        bool
> +        AnyMatches (ConstString type_name,
> +                    FormatCategoryItems items = ALL_ITEM_TYPES,
> +                    bool only_enabled = true,
> +                    const char** matching_category = NULL,
> +                    FormatCategoryItems* matching_type = NULL);
> +        
> +        typedef STD_SHARED_PTR(TypeCategoryImpl) SharedPointer;
> +        
> +    private:
> +        SummaryNavigator::SharedPointer m_summary_nav;
> +        RegexSummaryNavigator::SharedPointer m_regex_summary_nav;
> +        FilterNavigator::SharedPointer m_filter_nav;
> +        RegexFilterNavigator::SharedPointer m_regex_filter_nav;
> +#ifndef LLDB_DISABLE_PYTHON
> +        SynthNavigator::SharedPointer m_synth_nav;
> +        RegexSynthNavigator::SharedPointer m_regex_synth_nav;
> +#endif // #ifndef LLDB_DISABLE_PYTHON
> +        
> +        bool m_enabled;
> +        
> +        IFormatChangeListener* m_change_listener;
> +        
> +        Mutex m_mutex;
> +        
> +        ConstString m_name;
> +        
> +        uint32_t m_enabled_position;
> +        
> +        void
> +        Enable (bool value, uint32_t position);
> +        
> +        void
> +        Disable ()
> +        {
> +            Enable(false, UINT32_MAX);
> +        }
> +        
> +        friend class TypeCategoryMap;
> +        
> +        friend class FormatNavigator<ConstString, TypeSummaryImpl>;
> +        friend class FormatNavigator<lldb::RegularExpressionSP, TypeSummaryImpl>;
> +        
> +        friend class FormatNavigator<ConstString, TypeFilterImpl>;
> +        friend class FormatNavigator<lldb::RegularExpressionSP, TypeFilterImpl>;
> +        
> +#ifndef LLDB_DISABLE_PYTHON
> +        friend class FormatNavigator<ConstString, ScriptedSyntheticChildren>;
> +        friend class FormatNavigator<lldb::RegularExpressionSP, ScriptedSyntheticChildren>;
> +#endif // #ifndef LLDB_DISABLE_PYTHON
> +    };
> +    
> +} // namespace lldb_private
> +
> +#endif	// lldb_TypeCategory_h_
> 
> Added: lldb/trunk/include/lldb/DataFormatters/TypeCategoryMap.h
> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/DataFormatters/TypeCategoryMap.h?rev=173728&view=auto
> ==============================================================================
> --- lldb/trunk/include/lldb/DataFormatters/TypeCategoryMap.h (added)
> +++ lldb/trunk/include/lldb/DataFormatters/TypeCategoryMap.h Mon Jan 28 17:47:25 2013
> @@ -0,0 +1,148 @@
> +//===-- TypeCategoryMap.h ----------------------------------------*- C++ -*-===//
> +//
> +//                     The LLVM Compiler Infrastructure
> +//
> +// This file is distributed under the University of Illinois Open Source
> +// License. See LICENSE.TXT for details.
> +//
> +//===----------------------------------------------------------------------===//
> +
> +#ifndef lldb_TypeCategoryMap_h_
> +#define lldb_TypeCategoryMap_h_
> +
> +// C Includes
> +// C++ Includes
> +
> +// Other libraries and framework includes
> +// Project includes
> +#include "lldb/lldb-public.h"
> +#include "lldb/lldb-enumerations.h"
> +
> +#include "lldb/DataFormatters/FormatNavigator.h"
> +#include "lldb/DataFormatters/TypeCategory.h"
> +
> +namespace lldb_private {
> +    class TypeCategoryMap
> +    {
> +    private:
> +        typedef ConstString KeyType;
> +        typedef TypeCategoryImpl ValueType;
> +        typedef ValueType::SharedPointer ValueSP;
> +        typedef std::list<lldb::TypeCategoryImplSP> ActiveCategoriesList;
> +        typedef ActiveCategoriesList::iterator ActiveCategoriesIterator;
> +        
> +    public:
> +        typedef std::map<KeyType, ValueSP> MapType;
> +        typedef MapType::iterator MapIterator;
> +        typedef bool(*CallbackType)(void*, const ValueSP&);
> +        typedef uint32_t Position;
> +        
> +        static const Position First = 0;
> +        static const Position Default = 1;
> +        static const Position Last = UINT32_MAX;
> +        
> +        TypeCategoryMap (IFormatChangeListener* lst);
> +        
> +        void
> +        Add (KeyType name,
> +             const ValueSP& entry);
> +        
> +        bool
> +        Delete (KeyType name);
> +        
> +        bool
> +        Enable (KeyType category_name,
> +                Position pos = Default);
> +        
> +        bool
> +        Disable (KeyType category_name);
> +        
> +        bool
> +        Enable (ValueSP category,
> +                Position pos = Default);
> +        
> +        bool
> +        Disable (ValueSP category);
> +        
> +        void
> +        Clear ();
> +        
> +        bool
> +        Get (KeyType name,
> +             ValueSP& entry);
> +        
> +        bool
> +        Get (uint32_t pos,
> +             ValueSP& entry);
> +        
> +        void
> +        LoopThrough (CallbackType callback, void* param);
> +        
> +        lldb::TypeCategoryImplSP
> +        GetAtIndex (uint32_t);
> +        
> +        bool
> +        AnyMatches (ConstString type_name,
> +                    TypeCategoryImpl::FormatCategoryItems items = TypeCategoryImpl::ALL_ITEM_TYPES,
> +                    bool only_enabled = true,
> +                    const char** matching_category = NULL,
> +                    TypeCategoryImpl::FormatCategoryItems* matching_type = NULL);
> +        
> +        uint32_t
> +        GetCount ()
> +        {
> +            return m_map.size();
> +        }
> +        
> +        lldb::TypeSummaryImplSP
> +        GetSummaryFormat (ValueObject& valobj,
> +                          lldb::DynamicValueType use_dynamic);
> +        
> +#ifndef LLDB_DISABLE_PYTHON
> +        lldb::SyntheticChildrenSP
> +        GetSyntheticChildren (ValueObject& valobj,
> +                              lldb::DynamicValueType use_dynamic);
> +#endif
> +        
> +    private:
> +        
> +        class delete_matching_categories
> +        {
> +            lldb::TypeCategoryImplSP ptr;
> +        public:
> +            delete_matching_categories(lldb::TypeCategoryImplSP p) : ptr(p)
> +            {}
> +            
> +            bool operator()(const lldb::TypeCategoryImplSP& other)
> +            {
> +                return ptr.get() == other.get();
> +            }
> +        };
> +        
> +        Mutex m_map_mutex;
> +        IFormatChangeListener* listener;
> +        
> +        MapType m_map;
> +        ActiveCategoriesList m_active_categories;
> +        
> +        MapType& map ()
> +        {
> +            return m_map;
> +        }
> +        
> +        ActiveCategoriesList& active_list ()
> +        {
> +            return m_active_categories;
> +        }
> +        
> +        Mutex& mutex ()
> +        {
> +            return m_map_mutex;
> +        }
> +        
> +        friend class FormatNavigator<KeyType, ValueType>;
> +        friend class FormatManager;
> +    };
> +} // namespace lldb_private
> +
> +#endif	// lldb_TypeCategoryMap_h_
> 
> Added: lldb/trunk/include/lldb/DataFormatters/TypeFormat.h
> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/DataFormatters/TypeFormat.h?rev=173728&view=auto
> ==============================================================================
> --- lldb/trunk/include/lldb/DataFormatters/TypeFormat.h (added)
> +++ lldb/trunk/include/lldb/DataFormatters/TypeFormat.h Mon Jan 28 17:47:25 2013
> @@ -0,0 +1,220 @@
> +//===-- TypeFormat.h ----------------------------------------------*- C++ -*-===//
> +//
> +//                     The LLVM Compiler Infrastructure
> +//
> +// This file is distributed under the University of Illinois Open Source
> +// License. See LICENSE.TXT for details.
> +//
> +//===----------------------------------------------------------------------===//
> +
> +#ifndef lldb_TypeFormat_h_
> +#define lldb_TypeFormat_h_
> +
> +// C Includes
> +
> +// C++ Includes
> +#include <string>
> +
> +// Other libraries and framework includes
> +
> +// Project includes
> +#include "lldb/lldb-public.h"
> +#include "lldb/lldb-enumerations.h"
> +
> +#include "lldb/Core/ValueObject.h"
> +
> +namespace lldb_private {
> +    class TypeFormatImpl
> +    {
> +    public:
> +        class Flags
> +        {
> +        public:
> +            
> +            Flags () :
> +            m_flags (lldb::eTypeOptionCascade)
> +            {}
> +            
> +            Flags (const Flags& other) :
> +            m_flags (other.m_flags)
> +            {}
> +            
> +            Flags (uint32_t value) :
> +            m_flags (value)
> +            {}
> +            
> +            Flags&
> +            operator = (const Flags& rhs)
> +            {
> +                if (&rhs != this)
> +                    m_flags = rhs.m_flags;
> +                
> +                return *this;
> +            }
> +            
> +            Flags&
> +            operator = (const uint32_t& rhs)
> +            {
> +                m_flags = rhs;
> +                return *this;
> +            }
> +            
> +            Flags&
> +            Clear()
> +            {
> +                m_flags = 0;
> +                return *this;
> +            }
> +            
> +            bool
> +            GetCascades () const
> +            {
> +                return (m_flags & lldb::eTypeOptionCascade) == lldb::eTypeOptionCascade;
> +            }
> +            
> +            Flags&
> +            SetCascades (bool value = true)
> +            {
> +                if (value)
> +                    m_flags |= lldb::eTypeOptionCascade;
> +                else
> +                    m_flags &= ~lldb::eTypeOptionCascade;
> +                return *this;
> +            }
> +            
> +            bool
> +            GetSkipPointers () const
> +            {
> +                return (m_flags & lldb::eTypeOptionSkipPointers) == lldb::eTypeOptionSkipPointers;
> +            }
> +            
> +            Flags&
> +            SetSkipPointers (bool value = true)
> +            {
> +                if (value)
> +                    m_flags |= lldb::eTypeOptionSkipPointers;
> +                else
> +                    m_flags &= ~lldb::eTypeOptionSkipPointers;
> +                return *this;
> +            }
> +            
> +            bool
> +            GetSkipReferences () const
> +            {
> +                return (m_flags & lldb::eTypeOptionSkipReferences) == lldb::eTypeOptionSkipReferences;
> +            }
> +            
> +            Flags&
> +            SetSkipReferences (bool value = true)
> +            {
> +                if (value)
> +                    m_flags |= lldb::eTypeOptionSkipReferences;
> +                else
> +                    m_flags &= ~lldb::eTypeOptionSkipReferences;
> +                return *this;
> +            }
> +            
> +            uint32_t
> +            GetValue ()
> +            {
> +                return m_flags;
> +            }
> +            
> +            void
> +            SetValue (uint32_t value)
> +            {
> +                m_flags = value;
> +            }
> +            
> +        private:
> +            uint32_t m_flags;
> +        };
> +        
> +        TypeFormatImpl (lldb::Format f = lldb::eFormatInvalid,
> +                        const Flags& flags = Flags());
> +        
> +        typedef STD_SHARED_PTR(TypeFormatImpl) SharedPointer;
> +        typedef bool(*ValueCallback)(void*, ConstString, const lldb::TypeFormatImplSP&);
> +        
> +        ~TypeFormatImpl ()
> +        {
> +        }
> +        
> +        bool
> +        Cascades () const
> +        {
> +            return m_flags.GetCascades();
> +        }
> +        bool
> +        SkipsPointers () const
> +        {
> +            return m_flags.GetSkipPointers();
> +        }
> +        bool
> +        SkipsReferences () const
> +        {
> +            return m_flags.GetSkipReferences();
> +        }
> +        
> +        void
> +        SetCascades (bool value)
> +        {
> +            m_flags.SetCascades(value);
> +        }
> +        
> +        void
> +        SetSkipsPointers (bool value)
> +        {
> +            m_flags.SetSkipPointers(value);
> +        }
> +        
> +        void
> +        SetSkipsReferences (bool value)
> +        {
> +            m_flags.SetSkipReferences(value);
> +        }
> +        
> +        lldb::Format
> +        GetFormat () const
> +        {
> +            return m_format;
> +        }
> +        
> +        void
> +        SetFormat (lldb::Format fmt)
> +        {
> +            m_format = fmt;
> +        }
> +        
> +        uint32_t
> +        GetOptions ()
> +        {
> +            return m_flags.GetValue();
> +        }
> +        
> +        void
> +        SetOptions (uint32_t value)
> +        {
> +            m_flags.SetValue(value);
> +        }
> +        
> +        uint32_t&
> +        GetRevision ()
> +        {
> +            return m_my_revision;
> +        }
> +        
> +        std::string
> +        GetDescription();
> +        
> +    protected:
> +        Flags m_flags;
> +        lldb::Format m_format;
> +        uint32_t m_my_revision;
> +        
> +    private:
> +        DISALLOW_COPY_AND_ASSIGN(TypeFormatImpl);
> +    };    
> +} // namespace lldb_private
> +
> +#endif	// lldb_TypeFormat_h_
> 
> Added: lldb/trunk/include/lldb/DataFormatters/TypeSummary.h
> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/DataFormatters/TypeSummary.h?rev=173728&view=auto
> ==============================================================================
> --- lldb/trunk/include/lldb/DataFormatters/TypeSummary.h (added)
> +++ lldb/trunk/include/lldb/DataFormatters/TypeSummary.h Mon Jan 28 17:47:25 2013
> @@ -0,0 +1,547 @@
> +//===-- TypeSummary.h --------------------------------------------*- C++ -*-===//
> +//
> +//                     The LLVM Compiler Infrastructure
> +//
> +// This file is distributed under the University of Illinois Open Source
> +// License. See LICENSE.TXT for details.
> +//
> +//===----------------------------------------------------------------------===//
> +
> +#ifndef lldb_TypeSummary_h_
> +#define lldb_TypeSummary_h_
> +
> +// C Includes
> +#include <stdint.h>
> +#include <unistd.h>
> +
> +// C++ Includes
> +#include <string>
> +#include <vector>
> +
> +// Other libraries and framework includes
> +
> +// Project includes
> +#include "lldb/lldb-public.h"
> +#include "lldb/lldb-enumerations.h"
> +
> +#include "lldb/Core/ValueObject.h"
> +#include "lldb/Interpreter/ScriptInterpreterPython.h"
> +#include "lldb/Symbol/Type.h"
> +
> +namespace lldb_private {
> +    
> +    class TypeSummaryImpl
> +    {
> +    public:
> +        class Flags
> +        {
> +        public:
> +            
> +            Flags () :
> +            m_flags (lldb::eTypeOptionCascade)
> +            {}
> +            
> +            Flags (const Flags& other) :
> +            m_flags (other.m_flags)
> +            {}
> +            
> +            Flags (uint32_t value) :
> +            m_flags (value)
> +            {}
> +            
> +            Flags&
> +            operator = (const Flags& rhs)
> +            {
> +                if (&rhs != this)
> +                    m_flags = rhs.m_flags;
> +                
> +                return *this;
> +            }
> +            
> +            Flags&
> +            operator = (const uint32_t& rhs)
> +            {
> +                m_flags = rhs;
> +                return *this;
> +            }
> +            
> +            Flags&
> +            Clear()
> +            {
> +                m_flags = 0;
> +                return *this;
> +            }
> +            
> +            bool
> +            GetCascades () const
> +            {
> +                return (m_flags & lldb::eTypeOptionCascade) == lldb::eTypeOptionCascade;
> +            }
> +            
> +            Flags&
> +            SetCascades (bool value = true)
> +            {
> +                if (value)
> +                    m_flags |= lldb::eTypeOptionCascade;
> +                else
> +                    m_flags &= ~lldb::eTypeOptionCascade;
> +                return *this;
> +            }
> +            
> +            bool
> +            GetSkipPointers () const
> +            {
> +                return (m_flags & lldb::eTypeOptionSkipPointers) == lldb::eTypeOptionSkipPointers;
> +            }
> +            
> +            Flags&
> +            SetSkipPointers (bool value = true)
> +            {
> +                if (value)
> +                    m_flags |= lldb::eTypeOptionSkipPointers;
> +                else
> +                    m_flags &= ~lldb::eTypeOptionSkipPointers;
> +                return *this;
> +            }
> +            
> +            bool
> +            GetSkipReferences () const
> +            {
> +                return (m_flags & lldb::eTypeOptionSkipReferences) == lldb::eTypeOptionSkipReferences;
> +            }
> +            
> +            Flags&
> +            SetSkipReferences (bool value = true)
> +            {
> +                if (value)
> +                    m_flags |= lldb::eTypeOptionSkipReferences;
> +                else
> +                    m_flags &= ~lldb::eTypeOptionSkipReferences;
> +                return *this;
> +            }
> +            
> +            bool
> +            GetDontShowChildren () const
> +            {
> +                return (m_flags & lldb::eTypeOptionHideChildren) == lldb::eTypeOptionHideChildren;
> +            }
> +            
> +            Flags&
> +            SetDontShowChildren (bool value = true)
> +            {
> +                if (value)
> +                    m_flags |= lldb::eTypeOptionHideChildren;
> +                else
> +                    m_flags &= ~lldb::eTypeOptionHideChildren;
> +                return *this;
> +            }
> +            
> +            bool
> +            GetDontShowValue () const
> +            {
> +                return (m_flags & lldb::eTypeOptionHideValue) == lldb::eTypeOptionHideValue;
> +            }
> +            
> +            Flags&
> +            SetDontShowValue (bool value = true)
> +            {
> +                if (value)
> +                    m_flags |= lldb::eTypeOptionHideValue;
> +                else
> +                    m_flags &= ~lldb::eTypeOptionHideValue;
> +                return *this;
> +            }
> +            
> +            bool
> +            GetShowMembersOneLiner () const
> +            {
> +                return (m_flags & lldb::eTypeOptionShowOneLiner) == lldb::eTypeOptionShowOneLiner;
> +            }
> +            
> +            Flags&
> +            SetShowMembersOneLiner (bool value = true)
> +            {
> +                if (value)
> +                    m_flags |= lldb::eTypeOptionShowOneLiner;
> +                else
> +                    m_flags &= ~lldb::eTypeOptionShowOneLiner;
> +                return *this;
> +            }
> +            
> +            bool
> +            GetHideItemNames () const
> +            {
> +                return (m_flags & lldb::eTypeOptionHideNames) == lldb::eTypeOptionHideNames;
> +            }
> +            
> +            Flags&
> +            SetHideItemNames (bool value = true)
> +            {
> +                if (value)
> +                    m_flags |= lldb::eTypeOptionHideNames;
> +                else
> +                    m_flags &= ~lldb::eTypeOptionHideNames;
> +                return *this;
> +            }
> +            
> +            uint32_t
> +            GetValue ()
> +            {
> +                return m_flags;
> +            }
> +            
> +            void
> +            SetValue (uint32_t value)
> +            {
> +                m_flags = value;
> +            }
> +            
> +        private:
> +            uint32_t m_flags;
> +        };
> +        
> +        typedef enum Type
> +        {
> +            eTypeUnknown,
> +            eTypeString,
> +            eTypeScript,
> +            eTypeCallback
> +        } Type;
> +        
> +        TypeSummaryImpl (const TypeSummaryImpl::Flags& flags);
> +        
> +        bool
> +        Cascades () const
> +        {
> +            return m_flags.GetCascades();
> +        }
> +        bool
> +        SkipsPointers () const
> +        {
> +            return m_flags.GetSkipPointers();
> +        }
> +        bool
> +        SkipsReferences () const
> +        {
> +            return m_flags.GetSkipReferences();
> +        }
> +        
> +        bool
> +        DoesPrintChildren () const
> +        {
> +            return !m_flags.GetDontShowChildren();
> +        }
> +        
> +        bool
> +        DoesPrintValue () const
> +        {
> +            return !m_flags.GetDontShowValue();
> +        }
> +        
> +        bool
> +        IsOneliner () const
> +        {
> +            return m_flags.GetShowMembersOneLiner();
> +        }
> +        
> +        bool
> +        HideNames () const
> +        {
> +            return m_flags.GetHideItemNames();
> +        }
> +        
> +        void
> +        SetCascades (bool value)
> +        {
> +            m_flags.SetCascades(value);
> +        }
> +        
> +        void
> +        SetSkipsPointers (bool value)
> +        {
> +            m_flags.SetSkipPointers(value);
> +        }
> +        
> +        void
> +        SetSkipsReferences (bool value)
> +        {
> +            m_flags.SetSkipReferences(value);
> +        }
> +        
> +        void
> +        SetDoesPrintChildren (bool value)
> +        {
> +            m_flags.SetDontShowChildren(!value);
> +        }
> +        
> +        void
> +        SetDoesPrintValue (bool value)
> +        {
> +            m_flags.SetDontShowValue(!value);
> +        }
> +        
> +        void
> +        SetIsOneliner (bool value)
> +        {
> +            m_flags.SetShowMembersOneLiner(value);
> +        }
> +        
> +        void
> +        SetHideNames (bool value)
> +        {
> +            m_flags.SetHideItemNames(value);
> +        }
> +        
> +        uint32_t
> +        GetOptions ()
> +        {
> +            return m_flags.GetValue();
> +        }
> +        
> +        void
> +        SetOptions (uint32_t value)
> +        {
> +            m_flags.SetValue(value);
> +        }
> +        
> +        virtual
> +        ~TypeSummaryImpl ()
> +        {
> +        }
> +        
> +        // we are using a ValueObject* instead of a ValueObjectSP because we do not need to hold on to this for
> +        // extended periods of time and we trust the ValueObject to stay around for as long as it is required
> +        // for us to generate its summary
> +        virtual bool
> +        FormatObject (ValueObject *valobj,
> +                      std::string& dest) = 0;
> +        
> +        virtual std::string
> +        GetDescription () = 0;
> +        
> +        virtual bool
> +        IsScripted () = 0;
> +        
> +        virtual Type
> +        GetType () = 0;
> +        
> +        uint32_t&
> +        GetRevision ()
> +        {
> +            return m_my_revision;
> +        }
> +        
> +        typedef STD_SHARED_PTR(TypeSummaryImpl) SharedPointer;
> +        typedef bool(*SummaryCallback)(void*, ConstString, const lldb::TypeSummaryImplSP&);
> +        typedef bool(*RegexSummaryCallback)(void*, lldb::RegularExpressionSP, const lldb::TypeSummaryImplSP&);
> +        
> +    protected:
> +        uint32_t m_my_revision;
> +        Flags m_flags;
> +        
> +    private:
> +        DISALLOW_COPY_AND_ASSIGN(TypeSummaryImpl);
> +    };
> +    
> +    // simple string-based summaries, using ${var to show data
> +    struct StringSummaryFormat : public TypeSummaryImpl
> +    {
> +        std::string m_format;
> +        
> +        StringSummaryFormat(const TypeSummaryImpl::Flags& flags,
> +                            const char* f);
> +        
> +        const char*
> +        GetSummaryString () const
> +        {
> +            return m_format.c_str();
> +        }
> +        
> +        void
> +        SetSummaryString (const char* data)
> +        {
> +            if (data)
> +                m_format.assign(data);
> +            else
> +                m_format.clear();
> +        }
> +        
> +        virtual
> +        ~StringSummaryFormat()
> +        {
> +        }
> +        
> +        virtual bool
> +        FormatObject(ValueObject *valobj,
> +                     std::string& dest);
> +        
> +        virtual std::string
> +        GetDescription();
> +        
> +        virtual bool
> +        IsScripted ()
> +        {
> +            return false;
> +        }
> +        
> +        
> +        virtual Type
> +        GetType ()
> +        {
> +            return TypeSummaryImpl::eTypeString;
> +        }
> +        
> +    private:
> +        DISALLOW_COPY_AND_ASSIGN(StringSummaryFormat);
> +    };
> +    
> +    // summaries implemented via a C++ function
> +    struct CXXFunctionSummaryFormat : public TypeSummaryImpl
> +    {
> +        
> +        // we should convert these to SBValue and SBStream if we ever cross
> +        // the boundary towards the external world
> +        typedef bool (*Callback)(ValueObject& valobj, Stream& dest);
> +        
> +        Callback m_impl;
> +        std::string m_description;
> +        
> +        CXXFunctionSummaryFormat (const TypeSummaryImpl::Flags& flags,
> +                                  Callback impl,
> +                                  const char* description);
> +        
> +        Callback
> +        GetBackendFunction () const
> +        {
> +            return m_impl;
> +        }
> +        
> +        const char*
> +        GetTextualInfo () const
> +        {
> +            return m_description.c_str();
> +        }
> +        
> +        void
> +        SetBackendFunction (Callback cb_func)
> +        {
> +            m_impl = cb_func;
> +        }
> +        
> +        void
> +        SetTextualInfo (const char* descr)
> +        {
> +            if (descr)
> +                m_description.assign(descr);
> +            else
> +                m_description.clear();
> +        }
> +        
> +        virtual
> +        ~CXXFunctionSummaryFormat ()
> +        {
> +        }
> +        
> +        virtual bool
> +        FormatObject (ValueObject *valobj,
> +                      std::string& dest);
> +        
> +        virtual std::string
> +        GetDescription ();
> +        
> +        virtual bool
> +        IsScripted ()
> +        {
> +            return false;
> +        }
> +        
> +        virtual Type
> +        GetType ()
> +        {
> +            return TypeSummaryImpl::eTypeCallback;
> +        }
> +        
> +        typedef STD_SHARED_PTR(CXXFunctionSummaryFormat) SharedPointer;
> +        
> +    private:
> +        DISALLOW_COPY_AND_ASSIGN(CXXFunctionSummaryFormat);
> +    };
> +    
> +#ifndef LLDB_DISABLE_PYTHON
> +    
> +    // Python-based summaries, running script code to show data
> +    struct ScriptSummaryFormat : public TypeSummaryImpl
> +    {
> +        std::string m_function_name;
> +        std::string m_python_script;
> +        lldb::ScriptInterpreterObjectSP m_script_function_sp;
> +        
> +        ScriptSummaryFormat(const TypeSummaryImpl::Flags& flags,
> +                            const char *function_name,
> +                            const char* python_script = NULL);
> +        
> +        const char*
> +        GetFunctionName () const
> +        {
> +            return m_function_name.c_str();
> +        }
> +        
> +        const char*
> +        GetPythonScript () const
> +        {
> +            return m_python_script.c_str();
> +        }
> +        
> +        void
> +        SetFunctionName (const char* function_name)
> +        {
> +            if (function_name)
> +                m_function_name.assign(function_name);
> +            else
> +                m_function_name.clear();
> +            m_python_script.clear();
> +        }
> +        
> +        void
> +        SetPythonScript (const char* script)
> +        {
> +            if (script)
> +                m_python_script.assign(script);
> +            else
> +                m_python_script.clear();
> +        }
> +        
> +        virtual
> +        ~ScriptSummaryFormat ()
> +        {
> +        }
> +        
> +        virtual bool
> +        FormatObject (ValueObject *valobj,
> +                      std::string& dest);
> +        
> +        virtual std::string
> +        GetDescription ();
> +        
> +        virtual bool
> +        IsScripted ()
> +        {
> +            return true;
> +        }
> +        
> +        virtual Type
> +        GetType ()
> +        {
> +            return TypeSummaryImpl::eTypeScript;
> +        }
> +        
> +        typedef STD_SHARED_PTR(ScriptSummaryFormat) SharedPointer;
> +        
> +        
> +    private:
> +        DISALLOW_COPY_AND_ASSIGN(ScriptSummaryFormat);
> +    };
> +#endif
> +} // namespace lldb_private
> +
> +#endif	// lldb_TypeSummary_h_
> 
> Added: lldb/trunk/include/lldb/DataFormatters/TypeSynthetic.h
> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/DataFormatters/TypeSynthetic.h?rev=173728&view=auto
> ==============================================================================
> --- lldb/trunk/include/lldb/DataFormatters/TypeSynthetic.h (added)
> +++ lldb/trunk/include/lldb/DataFormatters/TypeSynthetic.h Mon Jan 28 17:47:25 2013
> @@ -0,0 +1,585 @@
> +//===-- TypeSynthetic.h -------------------------------------------*- C++ -*-===//
> +//
> +//                     The LLVM Compiler Infrastructure
> +//
> +// This file is distributed under the University of Illinois Open Source
> +// License. See LICENSE.TXT for details.
> +//
> +//===----------------------------------------------------------------------===//
> +
> +#ifndef lldb_TypeSynthetic_h_
> +#define lldb_TypeSynthetic_h_
> +
> +// C Includes
> +#include <stdint.h>
> +#include <unistd.h>
> +
> +// C++ Includes
> +#include <string>
> +#include <vector>
> +
> +// Other libraries and framework includes
> +
> +// Project includes
> +#include "lldb/lldb-public.h"
> +#include "lldb/lldb-enumerations.h"
> +
> +#include "lldb/Core/ValueObject.h"
> +#include "lldb/Interpreter/ScriptInterpreterPython.h"
> +#include "lldb/Symbol/Type.h"
> +
> +namespace lldb_private {
> +    class SyntheticChildrenFrontEnd
> +    {
> +    protected:
> +        ValueObject &m_backend;
> +    public:
> +        
> +        SyntheticChildrenFrontEnd (ValueObject &backend) :
> +        m_backend(backend)
> +        {}
> +        
> +        virtual
> +        ~SyntheticChildrenFrontEnd ()
> +        {
> +        }
> +        
> +        virtual size_t
> +        CalculateNumChildren () = 0;
> +        
> +        virtual lldb::ValueObjectSP
> +        GetChildAtIndex (size_t idx) = 0;
> +        
> +        virtual size_t
> +        GetIndexOfChildWithName (const ConstString &name) = 0;
> +        
> +        // this function is assumed to always succeed and it if fails, the front-end should know to deal
> +        // with it in the correct way (most probably, by refusing to return any children)
> +        // the return value of Update() should actually be interpreted as "ValueObjectSyntheticFilter cache is good/bad"
> +        // if =true, ValueObjectSyntheticFilter is allowed to use the children it fetched previously and cached
> +        // if =false, ValueObjectSyntheticFilter must throw away its cache, and query again for children
> +        virtual bool
> +        Update () = 0;
> +        
> +        // if this function returns false, then CalculateNumChildren() MUST return 0 since UI frontends
> +        // might validly decide not to inquire for children given a false return value from this call
> +        // if it returns true, then CalculateNumChildren() can return any number >= 0 (0 being valid)
> +        // it should if at all possible be more efficient than CalculateNumChildren()
> +        virtual bool
> +        MightHaveChildren () = 0;
> +        
> +        typedef STD_SHARED_PTR(SyntheticChildrenFrontEnd) SharedPointer;
> +        typedef std::auto_ptr<SyntheticChildrenFrontEnd> AutoPointer;
> +        
> +    private:
> +        DISALLOW_COPY_AND_ASSIGN(SyntheticChildrenFrontEnd);
> +    };
> +    
> +    class SyntheticChildren
> +    {
> +    public:
> +        
> +        class Flags
> +        {
> +        public:
> +            
> +            Flags () :
> +            m_flags (lldb::eTypeOptionCascade)
> +            {}
> +            
> +            Flags (const Flags& other) :
> +            m_flags (other.m_flags)
> +            {}
> +            
> +            Flags (uint32_t value) :
> +            m_flags (value)
> +            {}
> +            
> +            Flags&
> +            operator = (const Flags& rhs)
> +            {
> +                if (&rhs != this)
> +                    m_flags = rhs.m_flags;
> +                
> +                return *this;
> +            }
> +            
> +            Flags&
> +            operator = (const uint32_t& rhs)
> +            {
> +                m_flags = rhs;
> +                return *this;
> +            }
> +            
> +            Flags&
> +            Clear()
> +            {
> +                m_flags = 0;
> +                return *this;
> +            }
> +            
> +            bool
> +            GetCascades () const
> +            {
> +                return (m_flags & lldb::eTypeOptionCascade) == lldb::eTypeOptionCascade;
> +            }
> +            
> +            Flags&
> +            SetCascades (bool value = true)
> +            {
> +                if (value)
> +                    m_flags |= lldb::eTypeOptionCascade;
> +                else
> +                    m_flags &= ~lldb::eTypeOptionCascade;
> +                return *this;
> +            }
> +            
> +            bool
> +            GetSkipPointers () const
> +            {
> +                return (m_flags & lldb::eTypeOptionSkipPointers) == lldb::eTypeOptionSkipPointers;
> +            }
> +            
> +            Flags&
> +            SetSkipPointers (bool value = true)
> +            {
> +                if (value)
> +                    m_flags |= lldb::eTypeOptionSkipPointers;
> +                else
> +                    m_flags &= ~lldb::eTypeOptionSkipPointers;
> +                return *this;
> +            }
> +            
> +            bool
> +            GetSkipReferences () const
> +            {
> +                return (m_flags & lldb::eTypeOptionSkipReferences) == lldb::eTypeOptionSkipReferences;
> +            }
> +            
> +            Flags&
> +            SetSkipReferences (bool value = true)
> +            {
> +                if (value)
> +                    m_flags |= lldb::eTypeOptionSkipReferences;
> +                else
> +                    m_flags &= ~lldb::eTypeOptionSkipReferences;
> +                return *this;
> +            }
> +            
> +            uint32_t
> +            GetValue ()
> +            {
> +                return m_flags;
> +            }
> +            
> +            void
> +            SetValue (uint32_t value)
> +            {
> +                m_flags = value;
> +            }
> +            
> +        private:
> +            uint32_t m_flags;
> +        };
> +        
> +        SyntheticChildren (const Flags& flags) :
> +        m_flags(flags)
> +        {
> +        }
> +        
> +        virtual
> +        ~SyntheticChildren ()
> +        {
> +        }
> +        
> +        bool
> +        Cascades () const
> +        {
> +            return m_flags.GetCascades();
> +        }
> +        bool
> +        SkipsPointers () const
> +        {
> +            return m_flags.GetSkipPointers();
> +        }
> +        bool
> +        SkipsReferences () const
> +        {
> +            return m_flags.GetSkipReferences();
> +        }
> +        
> +        void
> +        SetCascades (bool value)
> +        {
> +            m_flags.SetCascades(value);
> +        }
> +        
> +        void
> +        SetSkipsPointers (bool value)
> +        {
> +            m_flags.SetSkipPointers(value);
> +        }
> +        
> +        void
> +        SetSkipsReferences (bool value)
> +        {
> +            m_flags.SetSkipReferences(value);
> +        }
> +        
> +        uint32_t
> +        GetOptions ()
> +        {
> +            return m_flags.GetValue();
> +        }
> +        
> +        void
> +        SetOptions (uint32_t value)
> +        {
> +            m_flags.SetValue(value);
> +        }
> +        
> +        virtual bool
> +        IsScripted () = 0;
> +        
> +        virtual std::string
> +        GetDescription () = 0;
> +        
> +        virtual SyntheticChildrenFrontEnd::AutoPointer
> +        GetFrontEnd (ValueObject &backend) = 0;
> +        
> +        typedef STD_SHARED_PTR(SyntheticChildren) SharedPointer;
> +        typedef bool(*SyntheticChildrenCallback)(void*, ConstString, const SyntheticChildren::SharedPointer&);
> +        
> +        uint32_t&
> +        GetRevision ()
> +        {
> +            return m_my_revision;
> +        }
> +        
> +    protected:
> +        uint32_t m_my_revision;
> +        Flags m_flags;
> +        
> +    private:
> +        DISALLOW_COPY_AND_ASSIGN(SyntheticChildren);
> +    };
> +    
> +    class TypeFilterImpl : public SyntheticChildren
> +    {
> +        std::vector<std::string> m_expression_paths;
> +    public:
> +        TypeFilterImpl(const SyntheticChildren::Flags& flags) :
> +        SyntheticChildren(flags),
> +        m_expression_paths()
> +        {
> +        }
> +        
> +        void
> +        AddExpressionPath (const char* path)
> +        {
> +            AddExpressionPath(std::string(path));
> +        }
> +        
> +        void
> +        Clear()
> +        {
> +            m_expression_paths.clear();
> +        }
> +        
> +        int
> +        GetCount() const
> +        {
> +            return m_expression_paths.size();
> +        }
> +        
> +        const char*
> +        GetExpressionPathAtIndex(int i) const
> +        {
> +            return m_expression_paths[i].c_str();
> +        }
> +        
> +        bool
> +        SetExpressionPathAtIndex (int i, const char* path)
> +        {
> +            return SetExpressionPathAtIndex(i, std::string(path));
> +        }
> +        
> +        void
> +        AddExpressionPath (std::string path)
> +        {
> +            bool need_add_dot = true;
> +            if (path[0] == '.' ||
> +                (path[0] == '-' && path[1] == '>') ||
> +                path[0] == '[')
> +                need_add_dot = false;
> +            // add a '.' symbol to help forgetful users
> +            if(!need_add_dot)
> +                m_expression_paths.push_back(path);
> +            else
> +                m_expression_paths.push_back(std::string(".") + path);
> +        }
> +        
> +        bool
> +        SetExpressionPathAtIndex (int i, std::string path)
> +        {
> +            if (i >= GetCount())
> +                return false;
> +            bool need_add_dot = true;
> +            if (path[0] == '.' ||
> +                (path[0] == '-' && path[1] == '>') ||
> +                path[0] == '[')
> +                need_add_dot = false;
> +            // add a '.' symbol to help forgetful users
> +            if(!need_add_dot)
> +                m_expression_paths[i] = path;
> +            else
> +                m_expression_paths[i] = std::string(".") + path;
> +            return true;
> +        }
> +        
> +        bool
> +        IsScripted ()
> +        {
> +            return false;
> +        }
> +        
> +        std::string
> +        GetDescription ();
> +        
> +        class FrontEnd : public SyntheticChildrenFrontEnd
> +        {
> +        private:
> +            TypeFilterImpl* filter;
> +        public:
> +            
> +            FrontEnd(TypeFilterImpl* flt,
> +                     ValueObject &backend) :
> +            SyntheticChildrenFrontEnd(backend),
> +            filter(flt)
> +            {}
> +            
> +            virtual
> +            ~FrontEnd ()
> +            {
> +            }
> +            
> +            virtual size_t
> +            CalculateNumChildren ()
> +            {
> +                return filter->GetCount();
> +            }
> +            
> +            virtual lldb::ValueObjectSP
> +            GetChildAtIndex (size_t idx)
> +            {
> +                if (idx >= filter->GetCount())
> +                    return lldb::ValueObjectSP();
> +                return m_backend.GetSyntheticExpressionPathChild(filter->GetExpressionPathAtIndex(idx), true);
> +            }
> +            
> +            virtual bool
> +            Update() { return false; }
> +            
> +            virtual bool
> +            MightHaveChildren ()
> +            {
> +                return filter->GetCount() > 0;
> +            }
> +            
> +            virtual size_t
> +            GetIndexOfChildWithName (const ConstString &name)
> +            {
> +                const char* name_cstr = name.GetCString();
> +                for (int i = 0; i < filter->GetCount(); i++)
> +                {
> +                    const char* expr_cstr = filter->GetExpressionPathAtIndex(i);
> +                    if (expr_cstr)
> +                    {
> +                        if (*expr_cstr == '.')
> +                            expr_cstr++;
> +                        else if (*expr_cstr == '-' && *(expr_cstr+1) == '>')
> +                            expr_cstr += 2;
> +                    }
> +                    if (!::strcmp(name_cstr, expr_cstr))
> +                        return i;
> +                }
> +                return UINT32_MAX;
> +            }
> +            
> +            typedef STD_SHARED_PTR(SyntheticChildrenFrontEnd) SharedPointer;
> +            
> +        private:
> +            DISALLOW_COPY_AND_ASSIGN(FrontEnd);
> +        };
> +        
> +        virtual SyntheticChildrenFrontEnd::AutoPointer
> +        GetFrontEnd(ValueObject &backend)
> +        {
> +            return SyntheticChildrenFrontEnd::AutoPointer(new FrontEnd(this, backend));
> +        }
> +        
> +    private:
> +        DISALLOW_COPY_AND_ASSIGN(TypeFilterImpl);
> +    };
> +    
> +    class CXXSyntheticChildren : public SyntheticChildren
> +    {
> +    public:
> +        typedef SyntheticChildrenFrontEnd* (*CreateFrontEndCallback) (CXXSyntheticChildren*, lldb::ValueObjectSP);
> +    protected:
> +        CreateFrontEndCallback m_create_callback;
> +        std::string m_description;
> +    public:
> +        CXXSyntheticChildren (const SyntheticChildren::Flags& flags,
> +                              const char* description,
> +                              CreateFrontEndCallback callback) :
> +        SyntheticChildren(flags),
> +        m_create_callback(callback),
> +        m_description(description ? description : "")
> +        {
> +        }
> +        
> +        bool
> +        IsScripted ()
> +        {
> +            return false;
> +        }
> +        
> +        std::string
> +        GetDescription ();
> +        
> +        virtual SyntheticChildrenFrontEnd::AutoPointer
> +        GetFrontEnd (ValueObject &backend)
> +        {
> +            return SyntheticChildrenFrontEnd::AutoPointer(m_create_callback(this, backend.GetSP()));
> +        }
> +        
> +    private:
> +        DISALLOW_COPY_AND_ASSIGN(CXXSyntheticChildren);
> +    };
> +    
> +#ifndef LLDB_DISABLE_PYTHON
> +    
> +    class ScriptedSyntheticChildren : public SyntheticChildren
> +    {
> +        std::string m_python_class;
> +        std::string m_python_code;
> +    public:
> +        
> +        ScriptedSyntheticChildren (const SyntheticChildren::Flags& flags,
> +                                   const char* pclass,
> +                                   const char* pcode = NULL) :
> +        SyntheticChildren(flags),
> +        m_python_class(),
> +        m_python_code()
> +        {
> +            if (pclass)
> +                m_python_class = pclass;
> +            if (pcode)
> +                m_python_code = pcode;
> +        }
> +        
> +        const char*
> +        GetPythonClassName ()
> +        {
> +            return m_python_class.c_str();
> +        }
> +        
> +        const char*
> +        GetPythonCode ()
> +        {
> +            return m_python_code.c_str();
> +        }
> +        
> +        void
> +        SetPythonClassName (const char* fname)
> +        {
> +            m_python_class.assign(fname);
> +            m_python_code.clear();
> +        }
> +        
> +        void
> +        SetPythonCode (const char* script)
> +        {
> +            m_python_code.assign(script);
> +        }
> +        
> +        std::string
> +        GetDescription ();
> +        
> +        bool
> +        IsScripted ()
> +        {
> +            return true;
> +        }
> +        
> +        class FrontEnd : public SyntheticChildrenFrontEnd
> +        {
> +        private:
> +            std::string m_python_class;
> +            lldb::ScriptInterpreterObjectSP m_wrapper_sp;
> +            ScriptInterpreter *m_interpreter;
> +        public:
> +            
> +            FrontEnd (std::string pclass,
> +                      ValueObject &backend);
> +            
> +            virtual
> +            ~FrontEnd ();
> +            
> +            virtual size_t
> +            CalculateNumChildren ()
> +            {
> +                if (!m_wrapper_sp || m_interpreter == NULL)
> +                    return 0;
> +                return m_interpreter->CalculateNumChildren(m_wrapper_sp);
> +            }
> +            
> +            virtual lldb::ValueObjectSP
> +            GetChildAtIndex (size_t idx);
> +            
> +            virtual bool
> +            Update ()
> +            {
> +                if (!m_wrapper_sp || m_interpreter == NULL)
> +                    return false;
> +                
> +                return m_interpreter->UpdateSynthProviderInstance(m_wrapper_sp);
> +            }
> +            
> +            virtual bool
> +            MightHaveChildren ()
> +            {
> +                if (!m_wrapper_sp || m_interpreter == NULL)
> +                    return false;
> +                
> +                return m_interpreter->MightHaveChildrenSynthProviderInstance(m_wrapper_sp);
> +            }
> +            
> +            virtual size_t
> +            GetIndexOfChildWithName (const ConstString &name)
> +            {
> +                if (!m_wrapper_sp || m_interpreter == NULL)
> +                    return UINT32_MAX;
> +                return m_interpreter->GetIndexOfChildWithName(m_wrapper_sp, name.GetCString());
> +            }
> +            
> +            typedef STD_SHARED_PTR(SyntheticChildrenFrontEnd) SharedPointer;
> +            
> +        private:
> +            DISALLOW_COPY_AND_ASSIGN(FrontEnd);
> +        };
> +        
> +        virtual SyntheticChildrenFrontEnd::AutoPointer
> +        GetFrontEnd(ValueObject &backend)
> +        {
> +            return SyntheticChildrenFrontEnd::AutoPointer(new FrontEnd(m_python_class, backend));
> +        }    
> +        
> +    private:
> +        DISALLOW_COPY_AND_ASSIGN(ScriptedSyntheticChildren);
> +    };
> +#endif
> +} // namespace lldb_private
> +
> +#endif	// lldb_TypeSynthetic_h_
> 
> Modified: lldb/trunk/include/lldb/lldb-forward.h
> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/lldb-forward.h?rev=173728&r1=173727&r2=173728&view=diff
> ==============================================================================
> --- lldb/trunk/include/lldb/lldb-forward.h (original)
> +++ lldb/trunk/include/lldb/lldb-forward.h Mon Jan 28 17:47:25 2013
> @@ -218,7 +218,7 @@ class   SyntheticChildren;
> class   SyntheticChildrenFrontEnd;
> class   TypeFilterImpl;
> #ifndef LLDB_DISABLE_PYTHON
> -class   TypeSyntheticImpl;
> +class   ScriptedSyntheticChildren;
> #endif
> class   Target;
> class   TargetList;
> @@ -236,6 +236,7 @@ class   ThreadPlanTracer;
> class   ThreadSpec;
> class   TimeValue;
> class   Type;
> +class   TypeCategoryMap;
> class   TypeImpl;
> class   TypeAndOrName;
> class   TypeList;
> @@ -373,7 +374,7 @@ namespace lldb {
>     typedef STD_SHARED_PTR(lldb_private::TypeNameSpecifierImpl) TypeNameSpecifierImplSP;
>     typedef STD_SHARED_PTR(lldb_private::TypeSummaryImpl) TypeSummaryImplSP;
> #ifndef LLDB_DISABLE_PYTHON
> -    typedef STD_SHARED_PTR(lldb_private::TypeSyntheticImpl) TypeSyntheticImplSP;
> +    typedef STD_SHARED_PTR(lldb_private::ScriptedSyntheticChildren) ScriptedSyntheticChildrenSP;
> #endif
>     typedef STD_SHARED_PTR(lldb_private::UnwindPlan) UnwindPlanSP;
>     typedef lldb_private::SharingPtr<lldb_private::ValueObject> ValueObjectSP;
> 
> Modified: lldb/trunk/lldb.xcodeproj/project.pbxproj
> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/lldb.xcodeproj/project.pbxproj?rev=173728&r1=173727&r2=173728&view=diff
> ==============================================================================
> --- lldb/trunk/lldb.xcodeproj/project.pbxproj (original)
> +++ lldb/trunk/lldb.xcodeproj/project.pbxproj Mon Jan 28 17:47:25 2013
> @@ -514,7 +514,6 @@
> 		4CF52AF8142829390051E832 /* SBFileSpecList.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4CF52AF7142829390051E832 /* SBFileSpecList.cpp */; };
> 		94031A9E13CF486700DCFF3C /* InputReaderEZ.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 94031A9D13CF486600DCFF3C /* InputReaderEZ.cpp */; };
> 		94094C6B163B6F840083A547 /* ValueObjectCast.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 94094C69163B6CD90083A547 /* ValueObjectCast.cpp */; };
> -		9415F61813B2C0EF00A52B36 /* FormatManager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9415F61713B2C0EF00A52B36 /* FormatManager.cpp */; };
> 		941BCC7F14E48C4000BB969C /* SBTypeFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 9461568614E355F2003A195C /* SBTypeFilter.h */; settings = {ATTRIBUTES = (Public, ); }; };
> 		941BCC8014E48C4000BB969C /* SBTypeFormat.h in Headers */ = {isa = PBXBuildFile; fileRef = 9461568714E355F2003A195C /* SBTypeFormat.h */; settings = {ATTRIBUTES = (Public, ); }; };
> 		941BCC8114E48C4000BB969C /* SBTypeSummary.h in Headers */ = {isa = PBXBuildFile; fileRef = 9461568814E355F2003A195C /* SBTypeSummary.h */; settings = {ATTRIBUTES = (Public, ); }; };
> @@ -530,7 +529,6 @@
> 		9461569D14E358A6003A195C /* SBTypeSynthetic.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9461568D14E35621003A195C /* SBTypeSynthetic.cpp */; };
> 		9463D4CD13B1798800C230D4 /* CommandObjectType.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9463D4CC13B1798800C230D4 /* CommandObjectType.cpp */; };
> 		9467E65213C3D97600B3B6F3 /* TypeHierarchyNavigator.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9467E65113C3D97600B3B6F3 /* TypeHierarchyNavigator.cpp */; };
> -		9470A8F01402DFFB0056FF61 /* DataVisualization.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9470A8EF1402DFFB0056FF61 /* DataVisualization.cpp */; };
> 		9475C18814E5E9FA001BFC6D /* SBTypeCategory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9475C18714E5E9FA001BFC6D /* SBTypeCategory.cpp */; };
> 		9475C18914E5EA08001BFC6D /* SBTypeCategory.h in Headers */ = {isa = PBXBuildFile; fileRef = 9475C18514E5E9C5001BFC6D /* SBTypeCategory.h */; settings = {ATTRIBUTES = (Public, ); }; };
> 		9475C18E14E5F834001BFC6D /* SBTypeNameSpecifier.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9475C18D14E5F834001BFC6D /* SBTypeNameSpecifier.cpp */; };
> @@ -539,7 +537,16 @@
> 		947A1D651616476B0017C8D1 /* CommandObjectPlugin.h in Headers */ = {isa = PBXBuildFile; fileRef = 947A1D631616476A0017C8D1 /* CommandObjectPlugin.h */; };
> 		949ADF031406F648004833E1 /* ValueObjectConstResultImpl.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 949ADF021406F648004833E1 /* ValueObjectConstResultImpl.cpp */; };
> 		94B6E76213D88365005F417F /* ValueObjectSyntheticFilter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 94B6E76113D88362005F417F /* ValueObjectSyntheticFilter.cpp */; };
> -		94CDEB9D15F0258500DD2A7A /* CXXFormatterFunctions.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 94CDEB9C15F0258400DD2A7A /* CXXFormatterFunctions.cpp */; };
> +		94CB255B16B069770059775D /* CXXFormatterFunctions.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 94CB255716B069770059775D /* CXXFormatterFunctions.cpp */; };
> +		94CB255C16B069770059775D /* DataVisualization.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 94CB255816B069770059775D /* DataVisualization.cpp */; };
> +		94CB255D16B069770059775D /* FormatClasses.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 94CB255916B069770059775D /* FormatClasses.cpp */; };
> +		94CB255E16B069770059775D /* FormatManager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 94CB255A16B069770059775D /* FormatManager.cpp */; };
> +		94CB256616B096F10059775D /* TypeCategory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 94CB256416B096F10059775D /* TypeCategory.cpp */; };
> +		94CB256716B096F10059775D /* TypeCategoryMap.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 94CB256516B096F10059775D /* TypeCategoryMap.cpp */; };
> +		94CB257016B0A4270059775D /* TypeFormat.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 94CB256D16B0A4260059775D /* TypeFormat.cpp */; };
> +		94CB257116B0A4270059775D /* TypeSummary.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 94CB256E16B0A4260059775D /* TypeSummary.cpp */; };
> +		94CB257216B0A4270059775D /* TypeSynthetic.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 94CB256F16B0A4270059775D /* TypeSynthetic.cpp */; };
> +		94CB257416B1D3880059775D /* FormatCache.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 94CB257316B1D3870059775D /* FormatCache.cpp */; };
> 		94EA1D5C15E6C9B400D4171A /* PythonDataObjects.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 94EA1D5B15E6C9B400D4171A /* PythonDataObjects.cpp */; };
> 		94FA3DE01405D50400833217 /* ValueObjectConstResultChild.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 94FA3DDF1405D50300833217 /* ValueObjectConstResultChild.cpp */; };
> 		9A19A6AF1163BBB200E0D453 /* SBValue.h in Headers */ = {isa = PBXBuildFile; fileRef = 9A19A6A51163BB7E00E0D453 /* SBValue.h */; settings = {ATTRIBUTES = (Public, ); }; };
> @@ -568,7 +575,6 @@
> 		B207C4931429607D00F36E4E /* CommandObjectWatchpoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B207C4921429607D00F36E4E /* CommandObjectWatchpoint.cpp */; };
> 		B21EB71515CC99F100E60059 /* cxa_demangle.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B21EB71415CC99F100E60059 /* cxa_demangle.cpp */; settings = {COMPILER_FLAGS = "-frtti"; }; };
> 		B2462247141AD37D00F3D409 /* OptionGroupWatchpoint.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B2462246141AD37D00F3D409 /* OptionGroupWatchpoint.cpp */; };
> -		B271B11413D6139300C3FEDB /* FormatClasses.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 94A9112D13D5DF210046D8A6 /* FormatClasses.cpp */; };
> 		B27318421416AC12006039C8 /* WatchpointList.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B27318411416AC12006039C8 /* WatchpointList.cpp */; };
> 		B28058A1139988B0002D96D0 /* InferiorCallPOSIX.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B28058A0139988B0002D96D0 /* InferiorCallPOSIX.cpp */; };
> 		B299580B14F2FA1400050A04 /* DisassemblerLLVMC.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B299580A14F2FA1400050A04 /* DisassemblerLLVMC.cpp */; };
> @@ -1519,8 +1525,6 @@
> 		94031A9F13CF5B3D00DCFF3C /* PriorityPointerPair.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = PriorityPointerPair.h; path = include/lldb/Utility/PriorityPointerPair.h; sourceTree = "<group>"; };
> 		94094C68163B6CCC0083A547 /* ValueObjectCast.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = ValueObjectCast.h; path = include/lldb/Core/ValueObjectCast.h; sourceTree = "<group>"; };
> 		94094C69163B6CD90083A547 /* ValueObjectCast.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = ValueObjectCast.cpp; path = source/Core/ValueObjectCast.cpp; sourceTree = "<group>"; };
> -		9415F61613B2C0DC00A52B36 /* FormatManager.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; lineEnding = 0; name = FormatManager.h; path = include/lldb/Core/FormatManager.h; sourceTree = "<group>"; xcLanguageSpecificationIdentifier = xcode.lang.objcpp; };
> -		9415F61713B2C0EF00A52B36 /* FormatManager.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; lineEnding = 0; name = FormatManager.cpp; path = source/Core/FormatManager.cpp; sourceTree = "<group>"; xcLanguageSpecificationIdentifier = xcode.lang.cpp; };
> 		9443B120140C18A90013457C /* SBData.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = SBData.h; path = include/lldb/API/SBData.h; sourceTree = "<group>"; };
> 		9443B121140C18C10013457C /* SBData.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = SBData.cpp; path = source/API/SBData.cpp; sourceTree = "<group>"; };
> 		9452573616262CD000325455 /* SBDeclaration.i */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c.preprocessed; path = SBDeclaration.i; sourceTree = "<group>"; };
> @@ -1546,8 +1550,6 @@
> 		9463D4CE13B179A500C230D4 /* CommandObjectType.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = CommandObjectType.h; path = source/Commands/CommandObjectType.h; sourceTree = "<group>"; };
> 		9467E65113C3D97600B3B6F3 /* TypeHierarchyNavigator.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = TypeHierarchyNavigator.cpp; path = source/Symbol/TypeHierarchyNavigator.cpp; sourceTree = "<group>"; };
> 		9467E65413C3D98900B3B6F3 /* TypeHierarchyNavigator.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = TypeHierarchyNavigator.h; path = include/lldb/Symbol/TypeHierarchyNavigator.h; sourceTree = "<group>"; };
> -		9470A8EE1402DF940056FF61 /* DataVisualization.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; lineEnding = 0; name = DataVisualization.h; path = include/lldb/Core/DataVisualization.h; sourceTree = "<group>"; xcLanguageSpecificationIdentifier = xcode.lang.objcpp; };
> -		9470A8EF1402DFFB0056FF61 /* DataVisualization.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; lineEnding = 0; name = DataVisualization.cpp; path = source/Core/DataVisualization.cpp; sourceTree = "<group>"; xcLanguageSpecificationIdentifier = xcode.lang.cpp; };
> 		9475C18514E5E9C5001BFC6D /* SBTypeCategory.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = SBTypeCategory.h; path = include/lldb/API/SBTypeCategory.h; sourceTree = "<group>"; };
> 		9475C18714E5E9FA001BFC6D /* SBTypeCategory.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = SBTypeCategory.cpp; path = source/API/SBTypeCategory.cpp; sourceTree = "<group>"; };
> 		9475C18A14E5EA1C001BFC6D /* SBTypeCategory.i */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c.preprocessed; path = SBTypeCategory.i; sourceTree = "<group>"; };
> @@ -1558,13 +1560,29 @@
> 		947A1D631616476A0017C8D1 /* CommandObjectPlugin.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CommandObjectPlugin.h; path = source/Commands/CommandObjectPlugin.h; sourceTree = "<group>"; };
> 		949ADF001406F62E004833E1 /* ValueObjectConstResultImpl.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = ValueObjectConstResultImpl.h; path = include/lldb/Core/ValueObjectConstResultImpl.h; sourceTree = "<group>"; };
> 		949ADF021406F648004833E1 /* ValueObjectConstResultImpl.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = ValueObjectConstResultImpl.cpp; path = source/Core/ValueObjectConstResultImpl.cpp; sourceTree = "<group>"; };
> -		94A8287514031D05006C37A8 /* FormatNavigator.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = FormatNavigator.h; path = include/lldb/Core/FormatNavigator.h; sourceTree = "<group>"; };
> -		94A9112B13D5DEF80046D8A6 /* FormatClasses.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = FormatClasses.h; path = include/lldb/Core/FormatClasses.h; sourceTree = "<group>"; };
> -		94A9112D13D5DF210046D8A6 /* FormatClasses.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = FormatClasses.cpp; path = source/Core/FormatClasses.cpp; sourceTree = "<group>"; };
> 		94B6E76013D8833C005F417F /* ValueObjectSyntheticFilter.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = ValueObjectSyntheticFilter.h; path = include/lldb/Core/ValueObjectSyntheticFilter.h; sourceTree = "<group>"; };
> 		94B6E76113D88362005F417F /* ValueObjectSyntheticFilter.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = ValueObjectSyntheticFilter.cpp; path = source/Core/ValueObjectSyntheticFilter.cpp; sourceTree = "<group>"; };
> -		94CDEB9A15F0226900DD2A7A /* CXXFormatterFunctions.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = CXXFormatterFunctions.h; path = include/lldb/Core/CXXFormatterFunctions.h; sourceTree = "<group>"; };
> -		94CDEB9C15F0258400DD2A7A /* CXXFormatterFunctions.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = CXXFormatterFunctions.cpp; path = source/Core/CXXFormatterFunctions.cpp; sourceTree = "<group>"; };
> +		94CB255716B069770059775D /* CXXFormatterFunctions.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = CXXFormatterFunctions.cpp; path = source/DataFormatters/CXXFormatterFunctions.cpp; sourceTree = "<group>"; };
> +		94CB255816B069770059775D /* DataVisualization.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = DataVisualization.cpp; path = source/DataFormatters/DataVisualization.cpp; sourceTree = "<group>"; };
> +		94CB255916B069770059775D /* FormatClasses.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = FormatClasses.cpp; path = source/DataFormatters/FormatClasses.cpp; sourceTree = "<group>"; };
> +		94CB255A16B069770059775D /* FormatManager.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = FormatManager.cpp; path = source/DataFormatters/FormatManager.cpp; sourceTree = "<group>"; };
> +		94CB255F16B069800059775D /* CXXFormatterFunctions.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = CXXFormatterFunctions.h; path = include/lldb/DataFormatters/CXXFormatterFunctions.h; sourceTree = "<group>"; };
> +		94CB256016B069800059775D /* DataVisualization.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = DataVisualization.h; path = include/lldb/DataFormatters/DataVisualization.h; sourceTree = "<group>"; };
> +		94CB256116B069800059775D /* FormatClasses.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = FormatClasses.h; path = include/lldb/DataFormatters/FormatClasses.h; sourceTree = "<group>"; };
> +		94CB256216B069800059775D /* FormatManager.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = FormatManager.h; path = include/lldb/DataFormatters/FormatManager.h; sourceTree = "<group>"; };
> +		94CB256316B069800059775D /* FormatNavigator.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = FormatNavigator.h; path = include/lldb/DataFormatters/FormatNavigator.h; sourceTree = "<group>"; };
> +		94CB256416B096F10059775D /* TypeCategory.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = TypeCategory.cpp; path = source/DataFormatters/TypeCategory.cpp; sourceTree = "<group>"; };
> +		94CB256516B096F10059775D /* TypeCategoryMap.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = TypeCategoryMap.cpp; path = source/DataFormatters/TypeCategoryMap.cpp; sourceTree = "<group>"; };
> +		94CB256816B096F90059775D /* TypeCategory.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = TypeCategory.h; path = include/lldb/DataFormatters/TypeCategory.h; sourceTree = "<group>"; };
> +		94CB256916B096FA0059775D /* TypeCategoryMap.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = TypeCategoryMap.h; path = include/lldb/DataFormatters/TypeCategoryMap.h; sourceTree = "<group>"; };
> +		94CB256A16B0A4030059775D /* TypeFormat.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = TypeFormat.h; path = include/lldb/DataFormatters/TypeFormat.h; sourceTree = "<group>"; };
> +		94CB256B16B0A4030059775D /* TypeSummary.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = TypeSummary.h; path = include/lldb/DataFormatters/TypeSummary.h; sourceTree = "<group>"; };
> +		94CB256C16B0A4040059775D /* TypeSynthetic.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = TypeSynthetic.h; path = include/lldb/DataFormatters/TypeSynthetic.h; sourceTree = "<group>"; };
> +		94CB256D16B0A4260059775D /* TypeFormat.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = TypeFormat.cpp; path = source/DataFormatters/TypeFormat.cpp; sourceTree = "<group>"; };
> +		94CB256E16B0A4260059775D /* TypeSummary.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = TypeSummary.cpp; path = source/DataFormatters/TypeSummary.cpp; sourceTree = "<group>"; };
> +		94CB256F16B0A4270059775D /* TypeSynthetic.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = TypeSynthetic.cpp; path = source/DataFormatters/TypeSynthetic.cpp; sourceTree = "<group>"; };
> +		94CB257316B1D3870059775D /* FormatCache.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = FormatCache.cpp; path = source/DataFormatters/FormatCache.cpp; sourceTree = "<group>"; };
> +		94CB257516B1D3910059775D /* FormatCache.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = FormatCache.h; path = include/lldb/DataFormatters/FormatCache.h; sourceTree = "<group>"; };
> 		94E367CC140C4EC4001C7A5A /* modify-python-lldb.py */ = {isa = PBXFileReference; lastKnownFileType = text.script.python; path = "modify-python-lldb.py"; sourceTree = "<group>"; };
> 		94E367CE140C4EEA001C7A5A /* python-typemaps.swig */ = {isa = PBXFileReference; lastKnownFileType = text; path = "python-typemaps.swig"; sourceTree = "<group>"; };
> 		94EA1D5A15E6C99B00D4171A /* PythonDataObjects.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = PythonDataObjects.h; path = include/lldb/Interpreter/PythonDataObjects.h; sourceTree = "<group>"; };
> @@ -1785,6 +1803,7 @@
> 				26BC7CEB10F1B70800F91463 /* Breakpoint */,
> 				26BC7D0D10F1B71D00F91463 /* Commands */,
> 				26BC7C1010F1B34800F91463 /* Core */,
> +				94CB255616B0683B0059775D /* DataFormatters */,
> 				26BC7DBE10F1B78200F91463 /* Expression */,
> 				26BC7DD010F1B7C100F91463 /* Host */,
> 				26BC7DDF10F1B7E200F91463 /* Interpreter */,
> @@ -2492,8 +2511,6 @@
> 				266603C91345B5A8004DA8B6 /* ConnectionSharedMemory.cpp */,
> 				26BC7D7C10F1B77400F91463 /* ConstString.h */,
> 				26BC7E9410F1B85900F91463 /* ConstString.cpp */,
> -				94CDEB9A15F0226900DD2A7A /* CXXFormatterFunctions.h */,
> -				94CDEB9C15F0258400DD2A7A /* CXXFormatterFunctions.cpp */,
> 				26BC7D5910F1B77400F91463 /* DataBuffer.h */,
> 				26BC7D5B10F1B77400F91463 /* DataBufferHeap.h */,
> 				26BC7E7210F1B85900F91463 /* DataBufferHeap.cpp */,
> @@ -2503,8 +2520,6 @@
> 				268ED0A4140FF54200DE830F /* DataEncoder.cpp */,
> 				26BC7D5A10F1B77400F91463 /* DataExtractor.h */,
> 				26BC7E7110F1B85900F91463 /* DataExtractor.cpp */,
> -				9470A8EE1402DF940056FF61 /* DataVisualization.h */,
> -				9470A8EF1402DFFB0056FF61 /* DataVisualization.cpp */,
> 				263664941140A4C10075843B /* Debugger.h */,
> 				263664921140A4930075843B /* Debugger.cpp */,
> 				26BC7D5E10F1B77400F91463 /* Disassembler.h */,
> @@ -2521,11 +2536,6 @@
> 				26BC7D6310F1B77400F91463 /* FileSpecList.h */,
> 				26BC7E7B10F1B85900F91463 /* FileSpecList.cpp */,
> 				26BC7D6410F1B77400F91463 /* Flags.h */,
> -				94A9112B13D5DEF80046D8A6 /* FormatClasses.h */,
> -				94A9112D13D5DF210046D8A6 /* FormatClasses.cpp */,
> -				9415F61613B2C0DC00A52B36 /* FormatManager.h */,
> -				9415F61713B2C0EF00A52B36 /* FormatManager.cpp */,
> -				94A8287514031D05006C37A8 /* FormatNavigator.h */,
> 				26F7305F139D8FC900FD51C7 /* History.h */,
> 				26F73061139D8FDB00FD51C7 /* History.cpp */,
> 				9AA69DBB118A029E00D753A0 /* InputReader.h */,
> @@ -3328,6 +3338,34 @@
> 			path = source/Host/common;
> 			sourceTree = "<group>";
> 		};
> +		94CB255616B0683B0059775D /* DataFormatters */ = {
> +			isa = PBXGroup;
> +			children = (
> +				94CB255F16B069800059775D /* CXXFormatterFunctions.h */,
> +				94CB255716B069770059775D /* CXXFormatterFunctions.cpp */,
> +				94CB256016B069800059775D /* DataVisualization.h */,
> +				94CB255816B069770059775D /* DataVisualization.cpp */,
> +				94CB257516B1D3910059775D /* FormatCache.h */,
> +				94CB257316B1D3870059775D /* FormatCache.cpp */,
> +				94CB256116B069800059775D /* FormatClasses.h */,
> +				94CB255916B069770059775D /* FormatClasses.cpp */,
> +				94CB256216B069800059775D /* FormatManager.h */,
> +				94CB255A16B069770059775D /* FormatManager.cpp */,
> +				94CB256316B069800059775D /* FormatNavigator.h */,
> +				94CB256816B096F90059775D /* TypeCategory.h */,
> +				94CB256416B096F10059775D /* TypeCategory.cpp */,
> +				94CB256916B096FA0059775D /* TypeCategoryMap.h */,
> +				94CB256516B096F10059775D /* TypeCategoryMap.cpp */,
> +				94CB256A16B0A4030059775D /* TypeFormat.h */,
> +				94CB256D16B0A4260059775D /* TypeFormat.cpp */,
> +				94CB256B16B0A4030059775D /* TypeSummary.h */,
> +				94CB256E16B0A4260059775D /* TypeSummary.cpp */,
> +				94CB256C16B0A4040059775D /* TypeSynthetic.h */,
> +				94CB256F16B0A4270059775D /* TypeSynthetic.cpp */,
> +			);
> +			name = DataFormatters;
> +			sourceTree = "<group>";
> +		};
> 		EDC6D49114E5C15C001B75F8 /* launcherXPCService */ = {
> 			isa = PBXGroup;
> 			children = (
> @@ -4094,7 +4132,6 @@
> 				4CCA645613B40B82003BDF98 /* AppleObjCTrampolineHandler.cpp in Sources */,
> 				4CCA645813B40B82003BDF98 /* AppleThreadPlanStepThroughObjCTrampoline.cpp in Sources */,
> 				9463D4CD13B1798800C230D4 /* CommandObjectType.cpp in Sources */,
> -				9415F61813B2C0EF00A52B36 /* FormatManager.cpp in Sources */,
> 				49D8FB3913B5598F00411094 /* ClangASTImporter.cpp in Sources */,
> 				9467E65213C3D97600B3B6F3 /* TypeHierarchyNavigator.cpp in Sources */,
> 				26ED3D6D13C563810017D45E /* OptionGroupVariable.cpp in Sources */,
> @@ -4111,13 +4148,11 @@
> 				265205AC13D3E3F700132FE2 /* RegisterContextKDP_x86_64.cpp in Sources */,
> 				2628A4D513D4977900F5487A /* ThreadKDP.cpp in Sources */,
> 				26D7E45D13D5E30A007FD12B /* SocketAddress.cpp in Sources */,
> -				B271B11413D6139300C3FEDB /* FormatClasses.cpp in Sources */,
> 				94B6E76213D88365005F417F /* ValueObjectSyntheticFilter.cpp in Sources */,
> 				262D24E613FB8710002D1960 /* RegisterContextMemory.cpp in Sources */,
> 				26F4A21C13FBA31A0064B613 /* ThreadMemory.cpp in Sources */,
> 				266DFE9713FD656E00D0C574 /* OperatingSystem.cpp in Sources */,
> 				26954EBE1401EE8B00294D09 /* DynamicRegisterInfo.cpp in Sources */,
> -				9470A8F01402DFFB0056FF61 /* DataVisualization.cpp in Sources */,
> 				26274FA214030EEF006BA130 /* OperatingSystemDarwinKernel.cpp in Sources */,
> 				26274FA714030F79006BA130 /* DynamicLoaderDarwinKernel.cpp in Sources */,
> 				94FA3DE01405D50400833217 /* ValueObjectConstResultChild.cpp in Sources */,
> @@ -4165,10 +4200,19 @@
> 				2697A39315E404B1003E682C /* OptionValueArch.cpp in Sources */,
> 				94EA1D5C15E6C9B400D4171A /* PythonDataObjects.cpp in Sources */,
> 				2698699B15E6CBD0002415FF /* OperatingSystemPython.cpp in Sources */,
> -				94CDEB9D15F0258500DD2A7A /* CXXFormatterFunctions.cpp in Sources */,
> 				947A1D641616476B0017C8D1 /* CommandObjectPlugin.cpp in Sources */,
> 				262ED0081631FA3A00879631 /* OptionGroupString.cpp in Sources */,
> 				94094C6B163B6F840083A547 /* ValueObjectCast.cpp in Sources */,
> +				94CB255B16B069770059775D /* CXXFormatterFunctions.cpp in Sources */,
> +				94CB255C16B069770059775D /* DataVisualization.cpp in Sources */,
> +				94CB255D16B069770059775D /* FormatClasses.cpp in Sources */,
> +				94CB255E16B069770059775D /* FormatManager.cpp in Sources */,
> +				94CB256616B096F10059775D /* TypeCategory.cpp in Sources */,
> +				94CB256716B096F10059775D /* TypeCategoryMap.cpp in Sources */,
> +				94CB257016B0A4270059775D /* TypeFormat.cpp in Sources */,
> +				94CB257116B0A4270059775D /* TypeSummary.cpp in Sources */,
> +				94CB257216B0A4270059775D /* TypeSynthetic.cpp in Sources */,
> +				94CB257416B1D3880059775D /* FormatCache.cpp in Sources */,
> 			);
> 			runOnlyForDeploymentPostprocessing = 0;
> 		};
> 
> Modified: lldb/trunk/source/API/SBDebugger.cpp
> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/API/SBDebugger.cpp?rev=173728&r1=173727&r2=173728&view=diff
> ==============================================================================
> --- lldb/trunk/source/API/SBDebugger.cpp (original)
> +++ lldb/trunk/source/API/SBDebugger.cpp Mon Jan 28 17:47:25 2013
> @@ -35,9 +35,9 @@
> #include "lldb/API/SBTypeSynthetic.h"
> 
> 
> -#include "lldb/Core/DataVisualization.h"
> #include "lldb/Core/Debugger.h"
> #include "lldb/Core/State.h"
> +#include "lldb/DataFormatters/DataVisualization.h"
> #include "lldb/Interpreter/Args.h"
> #include "lldb/Interpreter/CommandInterpreter.h"
> #include "lldb/Interpreter/OptionGroupPlatform.h"
> 
> Modified: lldb/trunk/source/API/SBTypeCategory.cpp
> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/API/SBTypeCategory.cpp?rev=173728&r1=173727&r2=173728&view=diff
> ==============================================================================
> --- lldb/trunk/source/API/SBTypeCategory.cpp (original)
> +++ lldb/trunk/source/API/SBTypeCategory.cpp Mon Jan 28 17:47:25 2013
> @@ -18,8 +18,8 @@
> #include "lldb/API/SBTypeNameSpecifier.h"
> #include "lldb/API/SBStream.h"
> 
> -#include "lldb/Core/DataVisualization.h"
> #include "lldb/Core/Debugger.h"
> +#include "lldb/DataFormatters/DataVisualization.h"
> #include "lldb/Interpreter/CommandInterpreter.h"
> #include "lldb/Interpreter/ScriptInterpreter.h"
> 
> @@ -233,7 +233,7 @@ SBTypeCategory::GetSyntheticForType (SBT
>     if (!children_sp)
>         return lldb::SBTypeSynthetic();
> 
> -    TypeSyntheticImplSP synth_sp = STD_STATIC_POINTER_CAST(TypeSyntheticImpl,children_sp);
> +    ScriptedSyntheticChildrenSP synth_sp = STD_STATIC_POINTER_CAST(ScriptedSyntheticChildren,children_sp);
> 
>     return lldb::SBTypeSynthetic(synth_sp);
> }
> @@ -285,7 +285,7 @@ SBTypeCategory::GetSyntheticAtIndex (uin
>     if (!children_sp.get())
>         return lldb::SBTypeSynthetic();
> 
> -    TypeSyntheticImplSP synth_sp = STD_STATIC_POINTER_CAST(TypeSyntheticImpl,children_sp);
> +    ScriptedSyntheticChildrenSP synth_sp = STD_STATIC_POINTER_CAST(ScriptedSyntheticChildren,children_sp);
> 
>     return lldb::SBTypeSynthetic(synth_sp);
> }
> 
> Modified: lldb/trunk/source/API/SBTypeFilter.cpp
> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/API/SBTypeFilter.cpp?rev=173728&r1=173727&r2=173728&view=diff
> ==============================================================================
> --- lldb/trunk/source/API/SBTypeFilter.cpp (original)
> +++ lldb/trunk/source/API/SBTypeFilter.cpp Mon Jan 28 17:47:25 2013
> @@ -13,7 +13,7 @@
> 
> #include "lldb/API/SBStream.h"
> 
> -#include "lldb/Core/DataVisualization.h"
> +#include "lldb/DataFormatters/DataVisualization.h"
> 
> using namespace lldb;
> using namespace lldb_private;
> 
> Modified: lldb/trunk/source/API/SBTypeFormat.cpp
> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/API/SBTypeFormat.cpp?rev=173728&r1=173727&r2=173728&view=diff
> ==============================================================================
> --- lldb/trunk/source/API/SBTypeFormat.cpp (original)
> +++ lldb/trunk/source/API/SBTypeFormat.cpp Mon Jan 28 17:47:25 2013
> @@ -13,7 +13,7 @@
> 
> #include "lldb/API/SBStream.h"
> 
> -#include "lldb/Core/DataVisualization.h"
> +#include "lldb/DataFormatters/DataVisualization.h"
> 
> using namespace lldb;
> using namespace lldb_private;
> 
> Modified: lldb/trunk/source/API/SBTypeNameSpecifier.cpp
> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/API/SBTypeNameSpecifier.cpp?rev=173728&r1=173727&r2=173728&view=diff
> ==============================================================================
> --- lldb/trunk/source/API/SBTypeNameSpecifier.cpp (original)
> +++ lldb/trunk/source/API/SBTypeNameSpecifier.cpp Mon Jan 28 17:47:25 2013
> @@ -14,7 +14,7 @@
> #include "lldb/API/SBStream.h"
> #include "lldb/API/SBType.h"
> 
> -#include "lldb/Core/DataVisualization.h"
> +#include "lldb/DataFormatters/DataVisualization.h"
> 
> using namespace lldb;
> using namespace lldb_private;
> 
> Modified: lldb/trunk/source/API/SBTypeSummary.cpp
> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/API/SBTypeSummary.cpp?rev=173728&r1=173727&r2=173728&view=diff
> ==============================================================================
> --- lldb/trunk/source/API/SBTypeSummary.cpp (original)
> +++ lldb/trunk/source/API/SBTypeSummary.cpp Mon Jan 28 17:47:25 2013
> @@ -13,7 +13,7 @@
> 
> #include "lldb/API/SBStream.h"
> 
> -#include "lldb/Core/DataVisualization.h"
> +#include "lldb/DataFormatters/DataVisualization.h"
> 
> using namespace lldb;
> using namespace lldb_private;
> 
> Modified: lldb/trunk/source/API/SBTypeSynthetic.cpp
> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/API/SBTypeSynthetic.cpp?rev=173728&r1=173727&r2=173728&view=diff
> ==============================================================================
> --- lldb/trunk/source/API/SBTypeSynthetic.cpp (original)
> +++ lldb/trunk/source/API/SBTypeSynthetic.cpp Mon Jan 28 17:47:25 2013
> @@ -13,7 +13,7 @@
> 
> #include "lldb/API/SBStream.h"
> 
> -#include "lldb/Core/DataVisualization.h"
> +#include "lldb/DataFormatters/DataVisualization.h"
> 
> using namespace lldb;
> using namespace lldb_private;
> @@ -30,7 +30,7 @@ SBTypeSynthetic::CreateWithClassName (co
> {
>     if (!data || data[0] == 0)
>         return SBTypeSynthetic();
> -    return SBTypeSynthetic(TypeSyntheticImplSP(new TypeSyntheticImpl(options, data, "")));
> +    return SBTypeSynthetic(ScriptedSyntheticChildrenSP(new ScriptedSyntheticChildren(options, data, "")));
> }
> 
> SBTypeSynthetic
> @@ -38,7 +38,7 @@ SBTypeSynthetic::CreateWithScriptCode (c
> {
>     if (!data || data[0] == 0)
>         return SBTypeSynthetic();
> -    return SBTypeSynthetic(TypeSyntheticImplSP(new TypeSyntheticImpl(options, "", data)));
> +    return SBTypeSynthetic(ScriptedSyntheticChildrenSP(new ScriptedSyntheticChildren(options, "", data)));
> }
> 
> SBTypeSynthetic::SBTypeSynthetic (const lldb::SBTypeSynthetic &rhs) :
> @@ -172,19 +172,19 @@ SBTypeSynthetic::operator != (lldb::SBTy
>     return m_opaque_sp != rhs.m_opaque_sp;
> }
> 
> -lldb::TypeSyntheticImplSP
> +lldb::ScriptedSyntheticChildrenSP
> SBTypeSynthetic::GetSP ()
> {
>     return m_opaque_sp;
> }
> 
> void
> -SBTypeSynthetic::SetSP (const lldb::TypeSyntheticImplSP &TypeSynthetic_impl_sp)
> +SBTypeSynthetic::SetSP (const lldb::ScriptedSyntheticChildrenSP &TypeSynthetic_impl_sp)
> {
>     m_opaque_sp = TypeSynthetic_impl_sp;
> }
> 
> -SBTypeSynthetic::SBTypeSynthetic (const lldb::TypeSyntheticImplSP &TypeSynthetic_impl_sp) :
> +SBTypeSynthetic::SBTypeSynthetic (const lldb::ScriptedSyntheticChildrenSP &TypeSynthetic_impl_sp) :
> m_opaque_sp(TypeSynthetic_impl_sp)
> {
> }
> @@ -197,7 +197,7 @@ SBTypeSynthetic::CopyOnWrite_Impl()
>     if (m_opaque_sp.unique())
>         return true;
> 
> -    TypeSyntheticImplSP new_sp(new TypeSyntheticImpl(m_opaque_sp->GetOptions(),
> +    ScriptedSyntheticChildrenSP new_sp(new ScriptedSyntheticChildren(m_opaque_sp->GetOptions(),
>                                                      m_opaque_sp->GetPythonClassName(),
>                                                      m_opaque_sp->GetPythonCode()));
> 
> 
> Modified: lldb/trunk/source/API/SBValue.cpp
> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/API/SBValue.cpp?rev=173728&r1=173727&r2=173728&view=diff
> ==============================================================================
> --- lldb/trunk/source/API/SBValue.cpp (original)
> +++ lldb/trunk/source/API/SBValue.cpp Mon Jan 28 17:47:25 2013
> @@ -20,7 +20,6 @@
> 
> #include "lldb/Breakpoint/Watchpoint.h"
> #include "lldb/Core/DataExtractor.h"
> -#include "lldb/Core/DataVisualization.h"
> #include "lldb/Core/Log.h"
> #include "lldb/Core/Module.h"
> #include "lldb/Core/Scalar.h"
> @@ -30,6 +29,7 @@
> #include "lldb/Core/Value.h"
> #include "lldb/Core/ValueObject.h"
> #include "lldb/Core/ValueObjectConstResult.h"
> +#include "lldb/DataFormatters/DataVisualization.h"
> #include "lldb/Symbol/Block.h"
> #include "lldb/Symbol/Declaration.h"
> #include "lldb/Symbol/ObjectFile.h"
> @@ -740,7 +740,7 @@ SBValue::GetTypeSynthetic ()
> 
>                     if (children_sp && children_sp->IsScripted())
>                     {
> -                        TypeSyntheticImplSP synth_sp = STD_STATIC_POINTER_CAST(TypeSyntheticImpl,children_sp);
> +                        ScriptedSyntheticChildrenSP synth_sp = STD_STATIC_POINTER_CAST(ScriptedSyntheticChildren,children_sp);
>                         synthetic.SetSP(synth_sp);
>                     }
>                 }
> 
> Modified: lldb/trunk/source/Commands/CommandObjectFrame.cpp
> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Commands/CommandObjectFrame.cpp?rev=173728&r1=173727&r2=173728&view=diff
> ==============================================================================
> --- lldb/trunk/source/Commands/CommandObjectFrame.cpp (original)
> +++ lldb/trunk/source/Commands/CommandObjectFrame.cpp Mon Jan 28 17:47:25 2013
> @@ -16,7 +16,6 @@
> #include <string>
> // Other libraries and framework includes
> // Project includes
> -#include "lldb/Core/DataVisualization.h"
> #include "lldb/Core/Debugger.h"
> #include "lldb/Core/Module.h"
> #include "lldb/Core/StreamFile.h"
> @@ -25,6 +24,7 @@
> #include "lldb/Core/Value.h"
> #include "lldb/Core/ValueObject.h"
> #include "lldb/Core/ValueObjectVariable.h"
> +#include "lldb/DataFormatters/DataVisualization.h"
> #include "lldb/Host/Host.h"
> #include "lldb/Interpreter/Args.h"
> #include "lldb/Interpreter/CommandInterpreter.h"
> 
> Modified: lldb/trunk/source/Commands/CommandObjectType.cpp
> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Commands/CommandObjectType.cpp?rev=173728&r1=173727&r2=173728&view=diff
> ==============================================================================
> --- lldb/trunk/source/Commands/CommandObjectType.cpp (original)
> +++ lldb/trunk/source/Commands/CommandObjectType.cpp Mon Jan 28 17:47:25 2013
> @@ -17,13 +17,13 @@
> 
> // C++ Includes
> 
> -#include "lldb/Core/DataVisualization.h"
> #include "lldb/Core/ConstString.h"
> #include "lldb/Core/Debugger.h"
> #include "lldb/Core/InputReaderEZ.h"
> #include "lldb/Core/RegularExpression.h"
> #include "lldb/Core/State.h"
> #include "lldb/Core/StringList.h"
> +#include "lldb/DataFormatters/DataVisualization.h"
> #include "lldb/Interpreter/CommandInterpreter.h"
> #include "lldb/Interpreter/CommandObject.h"
> #include "lldb/Interpreter/CommandReturnObject.h"
> @@ -1961,7 +1961,7 @@ protected:
>         if (argc == 1 && strcmp(command.GetArgumentAtIndex(0),"*") == 0)
>         {
>             // we want to make sure to enable "system" last and "default" first
> -            DataVisualization::Categories::Enable(ConstString("default"), CategoryMap::First);
> +            DataVisualization::Categories::Enable(ConstString("default"), TypeCategoryMap::First);
>             uint32_t num_categories = DataVisualization::Categories::GetCount();
>             for (uint32_t i = 0; i < num_categories; i++)
>             {
> @@ -1972,10 +1972,10 @@ protected:
>                          ::strcmp(category_sp->GetName(), "default") == 0 )
>                         continue;
>                     else
> -                        DataVisualization::Categories::Enable(category_sp, CategoryMap::Default);
> +                        DataVisualization::Categories::Enable(category_sp, TypeCategoryMap::Default);
>                 }
>             }
> -            DataVisualization::Categories::Enable(ConstString("system"), CategoryMap::Last);
> +            DataVisualization::Categories::Enable(ConstString("system"), TypeCategoryMap::Last);
>         }
>         else
>         {
> @@ -3385,10 +3385,10 @@ public:
>         // everything should be fine now, let's add the synth provider class
> 
>         SyntheticChildrenSP synth_provider;
> -        synth_provider.reset(new TypeSyntheticImpl(SyntheticChildren::Flags().SetCascades(options->m_cascade).
> -                                                         SetSkipPointers(options->m_skip_pointers).
> -                                                         SetSkipReferences(options->m_skip_references),
> -                                                         class_name_str.c_str()));
> +        synth_provider.reset(new ScriptedSyntheticChildren(SyntheticChildren::Flags().SetCascades(options->m_cascade).
> +                                                           SetSkipPointers(options->m_skip_pointers).
> +                                                           SetSkipReferences(options->m_skip_references),
> +                                                           class_name_str.c_str()));
> 
> 
>         lldb::TypeCategoryImplSP category;
> @@ -3504,11 +3504,11 @@ CommandObjectTypeSynthAdd::Execute_Pytho
> 
>     SyntheticChildrenSP entry;
> 
> -    TypeSyntheticImpl* impl = new TypeSyntheticImpl(SyntheticChildren::Flags().
> -                                                    SetCascades(m_options.m_cascade).
> -                                                    SetSkipPointers(m_options.m_skip_pointers).
> -                                                    SetSkipReferences(m_options.m_skip_references),
> -                                                    m_options.m_class_name.c_str());
> +    ScriptedSyntheticChildren* impl = new ScriptedSyntheticChildren(SyntheticChildren::Flags().
> +                                                                    SetCascades(m_options.m_cascade).
> +                                                                    SetSkipPointers(m_options.m_skip_pointers).
> +                                                                    SetSkipReferences(m_options.m_skip_references),
> +                                                                    m_options.m_class_name.c_str());
> 
>     entry.reset(impl);
> 
> 
> Removed: lldb/trunk/source/Core/CXXFormatterFunctions.cpp
> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Core/CXXFormatterFunctions.cpp?rev=173727&view=auto
> ==============================================================================
> --- lldb/trunk/source/Core/CXXFormatterFunctions.cpp (original)
> +++ lldb/trunk/source/Core/CXXFormatterFunctions.cpp (removed)
> @@ -1,1808 +0,0 @@
> -//===-- CXXFormatterFunctions.cpp---------------------------------*- C++ -*-===//
> -//
> -//                     The LLVM Compiler Infrastructure
> -//
> -// This file is distributed under the University of Illinois Open Source
> -// License. See LICENSE.TXT for details.
> -//
> -//===----------------------------------------------------------------------===//
> -
> -#include "lldb/lldb-python.h"
> -
> -#include "lldb/Core/CXXFormatterFunctions.h"
> -
> -// needed to get ConvertUTF16/32ToUTF8
> -#define CLANG_NEEDS_THESE_ONE_DAY
> -#include "clang/Basic/ConvertUTF.h"
> -
> -#include "lldb/Core/DataBufferHeap.h"
> -#include "lldb/Core/Error.h"
> -#include "lldb/Core/Stream.h"
> -#include "lldb/Core/ValueObject.h"
> -#include "lldb/Core/ValueObjectConstResult.h"
> -#include "lldb/Host/Endian.h"
> -#include "lldb/Symbol/ClangASTContext.h"
> -#include "lldb/Target/ObjCLanguageRuntime.h"
> -#include "lldb/Target/Target.h"
> -
> -using namespace lldb;
> -using namespace lldb_private;
> -using namespace lldb_private::formatters;
> -
> -bool
> -lldb_private::formatters::ExtractValueFromObjCExpression (ValueObject &valobj,
> -                                                          const char* target_type,
> -                                                          const char* selector,
> -                                                          uint64_t &value)
> -{
> -    if (!target_type || !*target_type)
> -        return false;
> -    if (!selector || !*selector)
> -        return false;
> -    StreamString expr;
> -    expr.Printf("(%s)[(id)0x%" PRIx64 " %s]",target_type,valobj.GetPointerValue(),selector);
> -    ExecutionContext exe_ctx (valobj.GetExecutionContextRef());
> -    lldb::ValueObjectSP result_sp;
> -    Target* target = exe_ctx.GetTargetPtr();
> -    StackFrame* stack_frame = exe_ctx.GetFramePtr();
> -    if (!target || !stack_frame)
> -        return false;
> -    
> -    EvaluateExpressionOptions options;
> -    options.SetCoerceToId(false)
> -    .SetUnwindOnError(true)
> -    .SetKeepInMemory(true);
> -    
> -    target->EvaluateExpression(expr.GetData(),
> -                               stack_frame,
> -                               result_sp,
> -                               options);
> -    if (!result_sp)
> -        return false;
> -    value = result_sp->GetValueAsUnsigned(0);
> -    return true;
> -}
> -
> -lldb::ValueObjectSP
> -lldb_private::formatters::CallSelectorOnObject (ValueObject &valobj,
> -                                                const char* return_type,
> -                                                const char* selector,
> -                                                uint64_t index)
> -{
> -    lldb::ValueObjectSP valobj_sp;
> -    if (!return_type || !*return_type)
> -        return valobj_sp;
> -    if (!selector || !*selector)
> -        return valobj_sp;
> -    StreamString expr_path_stream;
> -    valobj.GetExpressionPath(expr_path_stream, false);
> -    StreamString expr;
> -    expr.Printf("(%s)[%s %s:%" PRId64 "]",return_type,expr_path_stream.GetData(),selector,index);
> -    ExecutionContext exe_ctx (valobj.GetExecutionContextRef());
> -    lldb::ValueObjectSP result_sp;
> -    Target* target = exe_ctx.GetTargetPtr();
> -    StackFrame* stack_frame = exe_ctx.GetFramePtr();
> -    if (!target || !stack_frame)
> -        return valobj_sp;
> -    
> -    EvaluateExpressionOptions options;
> -    options.SetCoerceToId(false)
> -    .SetUnwindOnError(true)
> -    .SetKeepInMemory(true)
> -    .SetUseDynamic(lldb::eDynamicCanRunTarget);
> -    
> -    target->EvaluateExpression(expr.GetData(),
> -                               stack_frame,
> -                               valobj_sp,
> -                               options);
> -    return valobj_sp;
> -}
> -
> -lldb::ValueObjectSP
> -lldb_private::formatters::CallSelectorOnObject (ValueObject &valobj,
> -                                                const char* return_type,
> -                                                const char* selector,
> -                                                const char* key)
> -{
> -    lldb::ValueObjectSP valobj_sp;
> -    if (!return_type || !*return_type)
> -        return valobj_sp;
> -    if (!selector || !*selector)
> -        return valobj_sp;
> -    if (!key || !*key)
> -        return valobj_sp;
> -    StreamString expr_path_stream;
> -    valobj.GetExpressionPath(expr_path_stream, false);
> -    StreamString expr;
> -    expr.Printf("(%s)[%s %s:%s]",return_type,expr_path_stream.GetData(),selector,key);
> -    ExecutionContext exe_ctx (valobj.GetExecutionContextRef());
> -    lldb::ValueObjectSP result_sp;
> -    Target* target = exe_ctx.GetTargetPtr();
> -    StackFrame* stack_frame = exe_ctx.GetFramePtr();
> -    if (!target || !stack_frame)
> -        return valobj_sp;
> -    
> -    EvaluateExpressionOptions options;
> -    options.SetCoerceToId(false)
> -    .SetUnwindOnError(true)
> -    .SetKeepInMemory(true)
> -    .SetUseDynamic(lldb::eDynamicCanRunTarget);
> -    
> -    target->EvaluateExpression(expr.GetData(),
> -                               stack_frame,
> -                               valobj_sp,
> -                               options);
> -    return valobj_sp;
> -}
> -
> -// use this call if you already have an LLDB-side buffer for the data
> -template<typename SourceDataType>
> -static bool
> -DumpUTFBufferToStream (ConversionResult (*ConvertFunction) (const SourceDataType**,
> -                                                            const SourceDataType*,
> -                                                            UTF8**,
> -                                                            UTF8*,
> -                                                            ConversionFlags),
> -                       DataExtractor& data,
> -                       Stream& stream,
> -                       char prefix_token = '@',
> -                       char quote = '"',
> -                       int sourceSize = 0)
> -{
> -    if (prefix_token != 0)
> -        stream.Printf("%c",prefix_token);
> -    if (quote != 0)
> -        stream.Printf("%c",quote);
> -    if (data.GetByteSize() && data.GetDataStart() && data.GetDataEnd())
> -    {
> -        const int bufferSPSize = data.GetByteSize();
> -        if (sourceSize == 0)
> -        {
> -            const int origin_encoding = 8*sizeof(SourceDataType);
> -            sourceSize = bufferSPSize/(origin_encoding >> 2);
> -        }
> -        
> -        SourceDataType *data_ptr = (SourceDataType*)data.GetDataStart();
> -        SourceDataType *data_end_ptr = data_ptr + sourceSize;
> -        
> -        while (data_ptr < data_end_ptr)
> -        {
> -            if (!*data_ptr)
> -            {
> -                data_end_ptr = data_ptr;
> -                break;
> -            }
> -            data_ptr++;
> -        }
> -        
> -        *data_ptr = 0;
> -        data_ptr = (SourceDataType*)data.GetDataStart();
> -        
> -        lldb::DataBufferSP utf8_data_buffer_sp;
> -        UTF8* utf8_data_ptr = nullptr;
> -        UTF8* utf8_data_end_ptr = nullptr;
> -        
> -        if (ConvertFunction)
> -        {
> -            utf8_data_buffer_sp.reset(new DataBufferHeap(bufferSPSize,0));
> -            utf8_data_ptr = (UTF8*)utf8_data_buffer_sp->GetBytes();
> -            utf8_data_end_ptr = utf8_data_ptr + bufferSPSize;
> -            ConvertFunction ( (const SourceDataType**)&data_ptr, data_end_ptr, &utf8_data_ptr, utf8_data_end_ptr, lenientConversion );
> -            utf8_data_ptr = (UTF8*)utf8_data_buffer_sp->GetBytes(); // needed because the ConvertFunction will change the value of the data_ptr
> -        }
> -        else
> -        {
> -            // just copy the pointers - the cast is necessary to make the compiler happy
> -            // but this should only happen if we are reading UTF8 data
> -            utf8_data_ptr = (UTF8*)data_ptr;
> -            utf8_data_end_ptr = (UTF8*)data_end_ptr;
> -        }
> -        
> -        // since we tend to accept partial data (and even partially malformed data)
> -        // we might end up with no NULL terminator before the end_ptr
> -        // hence we need to take a slower route and ensure we stay within boundaries
> -        for (;utf8_data_ptr != utf8_data_end_ptr; utf8_data_ptr++)
> -        {
> -            if (!*utf8_data_ptr)
> -                break;
> -            stream.Printf("%c",*utf8_data_ptr);
> -        }
> -    }
> -    if (quote != 0)
> -        stream.Printf("%c",quote);
> -    return true;
> -}
> -
> -template<typename SourceDataType>
> -static bool
> -ReadUTFBufferAndDumpToStream (ConversionResult (*ConvertFunction) (const SourceDataType**,
> -                                                                   const SourceDataType*,
> -                                                                   UTF8**,
> -                                                                   UTF8*,
> -                                                                   ConversionFlags),
> -                              uint64_t location,
> -                              const ProcessSP& process_sp,
> -                              Stream& stream,
> -                              char prefix_token = '@',
> -                              char quote = '"',
> -                              int sourceSize = 0)
> -{
> -    if (location == 0 || location == LLDB_INVALID_ADDRESS)
> -        return false;
> -    if (!process_sp)
> -        return false;
> -
> -    const int origin_encoding = 8*sizeof(SourceDataType);
> -    if (origin_encoding != 8 && origin_encoding != 16 && origin_encoding != 32)
> -        return false;
> -    // if not UTF8, I need a conversion function to return proper UTF8
> -    if (origin_encoding != 8 && !ConvertFunction)
> -        return false;
> -
> -    if (sourceSize == 0)
> -        sourceSize = process_sp->GetTarget().GetMaximumSizeOfStringSummary();
> -    const int bufferSPSize = sourceSize * (origin_encoding >> 2);
> -
> -    Error error;
> -    lldb::DataBufferSP buffer_sp(new DataBufferHeap(bufferSPSize,0));
> -    
> -    if (!buffer_sp->GetBytes())
> -        return false;
> -    
> -    size_t data_read = process_sp->ReadMemoryFromInferior(location, (char*)buffer_sp->GetBytes(), bufferSPSize, error);
> -    if (error.Fail() || data_read == 0)
> -    {
> -        stream.Printf("unable to read data");
> -        return true;
> -    }
> -    
> -    DataExtractor data(buffer_sp, process_sp->GetByteOrder(), process_sp->GetAddressByteSize());
> -    
> -    return DumpUTFBufferToStream(ConvertFunction, data, stream, prefix_token, quote, sourceSize);
> -}
> -
> -bool
> -lldb_private::formatters::Char16StringSummaryProvider (ValueObject& valobj, Stream& stream)
> -{
> -    ProcessSP process_sp = valobj.GetProcessSP();
> -    if (!process_sp)
> -        return false;
> -    
> -    lldb::addr_t valobj_addr = valobj.GetValueAsUnsigned(0);
> -    
> -    if (!valobj_addr)
> -        return false;
> -    
> -    if (!ReadUTFBufferAndDumpToStream<UTF16>(ConvertUTF16toUTF8,valobj_addr,
> -                                                                 process_sp,
> -                                                                 stream,
> -                                                                 'u'))
> -    {
> -        stream.Printf("Summary Unavailable");
> -        return true;
> -    }
> -
> -    return true;
> -}
> -
> -bool
> -lldb_private::formatters::Char32StringSummaryProvider (ValueObject& valobj, Stream& stream)
> -{
> -    ProcessSP process_sp = valobj.GetProcessSP();
> -    if (!process_sp)
> -        return false;
> -    
> -    lldb::addr_t valobj_addr = valobj.GetValueAsUnsigned(0);
> -    
> -    if (!valobj_addr)
> -        return false;
> -    
> -    if (!ReadUTFBufferAndDumpToStream<UTF32>(ConvertUTF32toUTF8,valobj_addr,
> -                                                                 process_sp,
> -                                                                 stream,
> -                                                                 'U'))
> -    {
> -        stream.Printf("Summary Unavailable");
> -        return true;
> -    }
> -    
> -    return true;
> -}
> -
> -bool
> -lldb_private::formatters::WCharStringSummaryProvider (ValueObject& valobj, Stream& stream)
> -{
> -    ProcessSP process_sp = valobj.GetProcessSP();
> -    if (!process_sp)
> -        return false;
> -
> -    lldb::addr_t data_addr = 0;
> -    
> -    if (valobj.IsPointerType())
> -        data_addr = valobj.GetValueAsUnsigned(0);
> -    else if (valobj.IsArrayType())
> -        data_addr = valobj.GetAddressOf();
> -
> -    if (data_addr == 0 || data_addr == LLDB_INVALID_ADDRESS)
> -        return false;
> -
> -    clang::ASTContext* ast = valobj.GetClangAST();
> -
> -    if (!ast)
> -        return false;
> -
> -    uint32_t wchar_size = ClangASTType::GetClangTypeBitWidth(ast, ClangASTType::GetBasicType(ast, lldb::eBasicTypeWChar).GetOpaqueQualType());
> -
> -    switch (wchar_size)
> -    {
> -        case 8:
> -            // utf 8
> -            return ReadUTFBufferAndDumpToStream<UTF8>(nullptr, data_addr,
> -                                                               process_sp,
> -                                                               stream,
> -                                                               'L');
> -        case 16:
> -            // utf 16
> -            return ReadUTFBufferAndDumpToStream<UTF16>(ConvertUTF16toUTF8, data_addr,
> -                                                                           process_sp,
> -                                                                           stream,
> -                                                                           'L');
> -        case 32:
> -            // utf 32
> -            return ReadUTFBufferAndDumpToStream<UTF32>(ConvertUTF32toUTF8, data_addr,
> -                                                                           process_sp,
> -                                                                           stream,
> -                                                                           'L');
> -        default:
> -            stream.Printf("size for wchar_t is not valid");
> -            return true;
> -    }
> -    return true;
> -}
> -
> -bool
> -lldb_private::formatters::Char16SummaryProvider (ValueObject& valobj, Stream& stream)
> -{
> -    DataExtractor data;
> -    valobj.GetData(data);
> -    
> -    std::string value;
> -    valobj.GetValueAsCString(lldb::eFormatUnicode16, value);
> -    if (!value.empty())
> -        stream.Printf("%s ", value.c_str());
> -
> -    return DumpUTFBufferToStream<UTF16>(ConvertUTF16toUTF8,data,stream, 'u','\'',1);
> -}
> -
> -bool
> -lldb_private::formatters::Char32SummaryProvider (ValueObject& valobj, Stream& stream)
> -{
> -    DataExtractor data;
> -    valobj.GetData(data);
> -    
> -    std::string value;
> -    valobj.GetValueAsCString(lldb::eFormatUnicode32, value);
> -    if (!value.empty())
> -        stream.Printf("%s ", value.c_str());
> -    
> -    return DumpUTFBufferToStream<UTF32>(ConvertUTF32toUTF8,data,stream, 'U','\'',1);
> -}
> -
> -bool
> -lldb_private::formatters::WCharSummaryProvider (ValueObject& valobj, Stream& stream)
> -{
> -    DataExtractor data;
> -    valobj.GetData(data);
> -    
> -    clang::ASTContext* ast = valobj.GetClangAST();
> -    
> -    if (!ast)
> -        return false;
> -    
> -    std::string value;
> -    
> -    uint32_t wchar_size = ClangASTType::GetClangTypeBitWidth(ast, ClangASTType::GetBasicType(ast, lldb::eBasicTypeWChar).GetOpaqueQualType());
> -    
> -    switch (wchar_size)
> -    {
> -        case 8:
> -            // utf 8
> -            valobj.GetValueAsCString(lldb::eFormatChar, value);
> -            if (!value.empty())
> -                stream.Printf("%s ", value.c_str());
> -            return DumpUTFBufferToStream<UTF8>(nullptr,
> -                                               data,
> -                                               stream,
> -                                               'L',
> -                                               '\'',
> -                                               1);
> -        case 16:
> -            // utf 16
> -            valobj.GetValueAsCString(lldb::eFormatUnicode16, value);
> -            if (!value.empty())
> -                stream.Printf("%s ", value.c_str());
> -            return DumpUTFBufferToStream<UTF16>(ConvertUTF16toUTF8,
> -                                                data,
> -                                                stream,
> -                                                'L',
> -                                                '\'',
> -                                                1);
> -        case 32:
> -            // utf 32
> -            valobj.GetValueAsCString(lldb::eFormatUnicode32, value);
> -            if (!value.empty())
> -                stream.Printf("%s ", value.c_str());
> -            return DumpUTFBufferToStream<UTF32>(ConvertUTF32toUTF8,
> -                                                data,
> -                                                stream,
> -                                                'L',
> -                                                '\'',
> -                                                1);
> -        default:
> -            stream.Printf("size for wchar_t is not valid");
> -            return true;
> -    }
> -    return true;
> -}
> -
> -// this function extracts information from a libcxx std::basic_string<>
> -// irregardless of template arguments. it reports the size (in item count not bytes)
> -// and the location in memory where the string data can be found
> -static bool
> -ExtractLibcxxStringInfo (ValueObject& valobj,
> -                         ValueObjectSP &location_sp,
> -                         uint64_t& size)
> -{
> -    ValueObjectSP D(valobj.GetChildAtIndexPath({0,0,0,0}));
> -    if (!D)
> -        return false;
> -    
> -    ValueObjectSP size_mode(D->GetChildAtIndexPath({1,0,0}));
> -    if (!size_mode)
> -        return false;
> -    
> -    uint64_t size_mode_value(size_mode->GetValueAsUnsigned(0));
> -    
> -    if ((size_mode_value & 1) == 0) // this means the string is in short-mode and the data is stored inline
> -    {
> -        ValueObjectSP s(D->GetChildAtIndex(1, true));
> -        if (!s)
> -            return false;
> -        size = ((size_mode_value >> 1) % 256);
> -        location_sp = s->GetChildAtIndex(1, true);
> -        return (location_sp.get() != nullptr);
> -    }
> -    else
> -    {
> -        ValueObjectSP l(D->GetChildAtIndex(0, true));
> -        if (!l)
> -            return false;
> -        location_sp = l->GetChildAtIndex(2, true);
> -        ValueObjectSP size_vo(l->GetChildAtIndex(1, true));
> -        if (!size_vo || !location_sp)
> -            return false;
> -        size = size_vo->GetValueAsUnsigned(0);
> -        return true;
> -    }
> -}
> -
> -bool
> -lldb_private::formatters::LibcxxWStringSummaryProvider (ValueObject& valobj, Stream& stream)
> -{
> -    uint64_t size = 0;
> -    ValueObjectSP location_sp((ValueObject*)nullptr);
> -    if (!ExtractLibcxxStringInfo(valobj, location_sp, size))
> -        return false;
> -    if (size == 0)
> -    {
> -        stream.Printf("L\"\"");
> -        return true;
> -    }
> -    if (!location_sp)
> -        return false;
> -    return WCharStringSummaryProvider(*location_sp.get(), stream);
> -}
> -
> -bool
> -lldb_private::formatters::LibcxxStringSummaryProvider (ValueObject& valobj, Stream& stream)
> -{
> -    uint64_t size = 0;
> -    ValueObjectSP location_sp((ValueObject*)nullptr);
> -    if (!ExtractLibcxxStringInfo(valobj, location_sp, size))
> -        return false;
> -    if (size == 0)
> -    {
> -        stream.Printf("\"\"");
> -        return true;
> -    }
> -    if (!location_sp)
> -        return false;
> -    Error error;
> -    location_sp->ReadPointedString(stream,
> -                                   error,
> -                                   0, // max length is decided by the settings
> -                                   false); // do not honor array (terminates on first 0 byte even for a char[])
> -    return error.Success();
> -}
> -
> -template<bool name_entries>
> -bool
> -lldb_private::formatters::NSDictionarySummaryProvider (ValueObject& valobj, Stream& stream)
> -{
> -    ProcessSP process_sp = valobj.GetProcessSP();
> -    if (!process_sp)
> -        return false;
> -    
> -    ObjCLanguageRuntime* runtime = (ObjCLanguageRuntime*)process_sp->GetLanguageRuntime(lldb::eLanguageTypeObjC);
> -    
> -    if (!runtime)
> -        return false;
> -
> -    ObjCLanguageRuntime::ClassDescriptorSP descriptor(runtime->GetClassDescriptor(valobj));
> -    
> -    if (!descriptor.get() || !descriptor->IsValid())
> -        return false;
> -    
> -    uint32_t ptr_size = process_sp->GetAddressByteSize();
> -    bool is_64bit = (ptr_size == 8);
> -    
> -    lldb::addr_t valobj_addr = valobj.GetValueAsUnsigned(0);
> -    
> -    if (!valobj_addr)
> -        return false;
> -    
> -    uint64_t value = 0;
> -    
> -    const char* class_name = descriptor->GetClassName().GetCString();
> -    
> -    if (!class_name || !*class_name)
> -        return false;
> -    
> -    if (!strcmp(class_name,"__NSDictionaryI"))
> -    {
> -        Error error;
> -        value = process_sp->ReadUnsignedIntegerFromMemory(valobj_addr + ptr_size, ptr_size, 0, error);
> -        if (error.Fail())
> -            return false;
> -        value &= (is_64bit ? ~0xFC00000000000000UL : ~0xFC000000U);
> -    }
> -    else if (!strcmp(class_name,"__NSDictionaryM"))
> -    {
> -        Error error;
> -        value = process_sp->ReadUnsignedIntegerFromMemory(valobj_addr + ptr_size, ptr_size, 0, error);
> -        if (error.Fail())
> -            return false;
> -        value &= (is_64bit ? ~0xFC00000000000000UL : ~0xFC000000U);
> -    }
> -    else if (!strcmp(class_name,"__NSCFDictionary"))
> -    {
> -        Error error;
> -        value = process_sp->ReadUnsignedIntegerFromMemory(valobj_addr + (is_64bit ? 20 : 12), ptr_size, 0, error);
> -        if (error.Fail())
> -            return false;
> -        if (is_64bit)
> -            value &= ~0x0f1f000000000000UL;
> -    }
> -    else
> -    {
> -        if (!ExtractValueFromObjCExpression(valobj, "int", "count", value))
> -            return false;
> -    }
> -    
> -    stream.Printf("%s%" PRIu64 " %s%s",
> -                  (name_entries ? "@\"" : ""),
> -                  value,
> -                  (name_entries ? (value == 1 ? "entry" : "entries") : (value == 1 ? "key/value pair" : "key/value pairs")),
> -                  (name_entries ? "\"" : ""));
> -    return true;
> -}
> -
> -bool
> -lldb_private::formatters::NSArraySummaryProvider (ValueObject& valobj, Stream& stream)
> -{
> -    ProcessSP process_sp = valobj.GetProcessSP();
> -    if (!process_sp)
> -        return false;
> -    
> -    ObjCLanguageRuntime* runtime = (ObjCLanguageRuntime*)process_sp->GetLanguageRuntime(lldb::eLanguageTypeObjC);
> -    
> -    if (!runtime)
> -        return false;
> -    
> -    ObjCLanguageRuntime::ClassDescriptorSP descriptor(runtime->GetClassDescriptor(valobj));
> -    
> -    if (!descriptor.get() || !descriptor->IsValid())
> -        return false;
> -    
> -    uint32_t ptr_size = process_sp->GetAddressByteSize();
> -    
> -    lldb::addr_t valobj_addr = valobj.GetValueAsUnsigned(0);
> -    
> -    if (!valobj_addr)
> -        return false;
> -    
> -    uint64_t value = 0;
> -    
> -    const char* class_name = descriptor->GetClassName().GetCString();
> -    
> -    if (!class_name || !*class_name)
> -        return false;
> -    
> -    if (!strcmp(class_name,"__NSArrayI"))
> -    {
> -        Error error;
> -        value = process_sp->ReadUnsignedIntegerFromMemory(valobj_addr + ptr_size, ptr_size, 0, error);
> -        if (error.Fail())
> -            return false;
> -    }
> -    else if (!strcmp(class_name,"__NSArrayM"))
> -    {
> -        Error error;
> -        value = process_sp->ReadUnsignedIntegerFromMemory(valobj_addr + ptr_size, ptr_size, 0, error);
> -        if (error.Fail())
> -            return false;
> -    }
> -    else if (!strcmp(class_name,"__NSCFArray"))
> -    {
> -        Error error;
> -        value = process_sp->ReadUnsignedIntegerFromMemory(valobj_addr + 2 * ptr_size, ptr_size, 0, error);
> -        if (error.Fail())
> -            return false;
> -    }
> -    else
> -    {
> -        if (!ExtractValueFromObjCExpression(valobj, "int", "count", value))
> -            return false;
> -    }
> -    
> -    stream.Printf("@\"%" PRIu64 " object%s\"",
> -                  value,
> -                  value == 1 ? "" : "s");
> -    return true;
> -}
> -
> -template<bool needs_at>
> -bool
> -lldb_private::formatters::NSDataSummaryProvider (ValueObject& valobj, Stream& stream)
> -{
> -    ProcessSP process_sp = valobj.GetProcessSP();
> -    if (!process_sp)
> -        return false;
> -    
> -    ObjCLanguageRuntime* runtime = (ObjCLanguageRuntime*)process_sp->GetLanguageRuntime(lldb::eLanguageTypeObjC);
> -    
> -    if (!runtime)
> -        return false;
> -    
> -    ObjCLanguageRuntime::ClassDescriptorSP descriptor(runtime->GetClassDescriptor(valobj));
> -    
> -    if (!descriptor.get() || !descriptor->IsValid())
> -        return false;
> -    
> -    bool is_64bit = (process_sp->GetAddressByteSize() == 8);
> -    lldb::addr_t valobj_addr = valobj.GetValueAsUnsigned(0);
> -    
> -    if (!valobj_addr)
> -        return false;
> -    
> -    uint64_t value = 0;
> -    
> -    const char* class_name = descriptor->GetClassName().GetCString();
> -    
> -    if (!class_name || !*class_name)
> -        return false;
> -    
> -    if (!strcmp(class_name,"NSConcreteData") ||
> -        !strcmp(class_name,"NSConcreteMutableData") ||
> -        !strcmp(class_name,"__NSCFData"))
> -    {
> -        uint32_t offset = (is_64bit ? 16 : 8);
> -        Error error;
> -        value = process_sp->ReadUnsignedIntegerFromMemory(valobj_addr + offset, is_64bit ? 8 : 4, 0, error);
> -        if (error.Fail())
> -            return false;
> -    }
> -    else
> -    {
> -        if (!ExtractValueFromObjCExpression(valobj, "int", "length", value))
> -            return false;
> -    }
> -    
> -    stream.Printf("%s%" PRIu64 " byte%s%s",
> -                  (needs_at ? "@\"" : ""),
> -                  value,
> -                  (value > 1 ? "s" : ""),
> -                  (needs_at ? "\"" : ""));
> -    
> -    return true;
> -}
> -
> -bool
> -lldb_private::formatters::NSNumberSummaryProvider (ValueObject& valobj, Stream& stream)
> -{
> -    ProcessSP process_sp = valobj.GetProcessSP();
> -    if (!process_sp)
> -        return false;
> -    
> -    ObjCLanguageRuntime* runtime = (ObjCLanguageRuntime*)process_sp->GetLanguageRuntime(lldb::eLanguageTypeObjC);
> -    
> -    if (!runtime)
> -        return false;
> -    
> -    ObjCLanguageRuntime::ClassDescriptorSP descriptor(runtime->GetClassDescriptor(valobj));
> -    
> -    if (!descriptor.get() || !descriptor->IsValid())
> -        return false;
> -    
> -    uint32_t ptr_size = process_sp->GetAddressByteSize();
> -    
> -    lldb::addr_t valobj_addr = valobj.GetValueAsUnsigned(0);
> -    
> -    if (!valobj_addr)
> -        return false;
> -    
> -    const char* class_name = descriptor->GetClassName().GetCString();
> -    
> -    if (!class_name || !*class_name)
> -        return false;
> -    
> -    if (!strcmp(class_name,"NSNumber") || !strcmp(class_name,"__NSCFNumber"))
> -    {
> -        if (descriptor->IsTagged())
> -        {
> -            // we have a call to get info and value bits in the tagged descriptor. but we prefer not to cast and replicate them
> -            int64_t value = (valobj_addr & ~0x0000000000000000FFL) >> 8;
> -            uint64_t i_bits = (valobj_addr & 0xF0) >> 4;
> -            
> -            switch (i_bits)
> -            {
> -                case 0:
> -                    stream.Printf("(char)%hhd",(char)value);
> -                    break;
> -                case 4:
> -                    stream.Printf("(short)%hd",(short)value);
> -                    break;
> -                case 8:
> -                    stream.Printf("(int)%d",(int)value);
> -                    break;
> -                case 12:
> -                    stream.Printf("(long)%" PRId64,value);
> -                    break;
> -                default:
> -                    stream.Printf("unexpected value:(info=%" PRIu64 ", value=%" PRIu64,i_bits,value);
> -                    break;
> -            }
> -            return true;
> -        }
> -        else
> -        {
> -            Error error;
> -            uint8_t data_type = (process_sp->ReadUnsignedIntegerFromMemory(valobj_addr + ptr_size, 1, 0, error) & 0x1F);
> -            uint64_t data_location = valobj_addr + 2*ptr_size;
> -            uint64_t value = 0;
> -            if (error.Fail())
> -                return false;
> -            switch (data_type)
> -            {
> -                case 1: // 0B00001
> -                    value = process_sp->ReadUnsignedIntegerFromMemory(data_location, 1, 0, error);
> -                    if (error.Fail())
> -                        return false;
> -                    stream.Printf("(char)%hhd",(char)value);
> -                    break;
> -                case 2: // 0B0010
> -                    value = process_sp->ReadUnsignedIntegerFromMemory(data_location, 2, 0, error);
> -                    if (error.Fail())
> -                        return false;
> -                    stream.Printf("(short)%hd",(short)value);
> -                    break;
> -                case 3: // 0B0011
> -                    value = process_sp->ReadUnsignedIntegerFromMemory(data_location, 4, 0, error);
> -                    if (error.Fail())
> -                        return false;
> -                    stream.Printf("(int)%d",(int)value);
> -                    break;
> -                case 17: // 0B10001
> -                    data_location += 8;
> -                case 4: // 0B0100
> -                    value = process_sp->ReadUnsignedIntegerFromMemory(data_location, 8, 0, error);
> -                    if (error.Fail())
> -                        return false;
> -                    stream.Printf("(long)%" PRId64,value);
> -                    break;
> -                case 5: // 0B0101
> -                {
> -                    uint32_t flt_as_int = process_sp->ReadUnsignedIntegerFromMemory(data_location, 4, 0, error);
> -                    if (error.Fail())
> -                        return false;
> -                    float flt_value = *((float*)&flt_as_int);
> -                    stream.Printf("(float)%f",flt_value);
> -                    break;
> -                }
> -                case 6: // 0B0110
> -                {
> -                    uint64_t dbl_as_lng = process_sp->ReadUnsignedIntegerFromMemory(data_location, 8, 0, error);
> -                    if (error.Fail())
> -                        return false;
> -                    double dbl_value = *((double*)&dbl_as_lng);
> -                    stream.Printf("(double)%g",dbl_value);
> -                    break;
> -                }
> -                default:
> -                    stream.Printf("absurd: dt=%d",data_type);
> -                    break;
> -            }
> -            return true;
> -        }
> -    }
> -    else
> -    {
> -        // similar to ExtractValueFromObjCExpression but uses summary instead of value
> -        StreamString expr_path_stream;
> -        valobj.GetExpressionPath(expr_path_stream, false);
> -        StreamString expr;
> -        expr.Printf("(NSString*)[%s stringValue]",expr_path_stream.GetData());
> -        ExecutionContext exe_ctx (valobj.GetExecutionContextRef());
> -        lldb::ValueObjectSP result_sp;
> -        Target* target = exe_ctx.GetTargetPtr();
> -        StackFrame* stack_frame = exe_ctx.GetFramePtr();
> -        if (!target || !stack_frame)
> -            return false;
> -        
> -        EvaluateExpressionOptions options;
> -        options.SetCoerceToId(false)
> -        .SetUnwindOnError(true)
> -        .SetKeepInMemory(true)
> -        .SetUseDynamic(lldb::eDynamicCanRunTarget);
> -        
> -        target->EvaluateExpression(expr.GetData(),
> -                                   stack_frame,
> -                                   result_sp,
> -                                   options);
> -        if (!result_sp)
> -            return false;
> -        stream.Printf("%s",result_sp->GetSummaryAsCString());
> -        return true;
> -    }
> -}
> -
> -bool
> -lldb_private::formatters::NSStringSummaryProvider (ValueObject& valobj, Stream& stream)
> -{
> -    ProcessSP process_sp = valobj.GetProcessSP();
> -    if (!process_sp)
> -        return false;
> -    
> -    ObjCLanguageRuntime* runtime = (ObjCLanguageRuntime*)process_sp->GetLanguageRuntime(lldb::eLanguageTypeObjC);
> -    
> -    if (!runtime)
> -        return false;
> -    
> -    ObjCLanguageRuntime::ClassDescriptorSP descriptor(runtime->GetClassDescriptor(valobj));
> -    
> -    if (!descriptor.get() || !descriptor->IsValid())
> -        return false;
> -    
> -    uint32_t ptr_size = process_sp->GetAddressByteSize();
> -    
> -    lldb::addr_t valobj_addr = valobj.GetValueAsUnsigned(0);
> -    
> -    if (!valobj_addr)
> -        return false;
> -    
> -    const char* class_name = descriptor->GetClassName().GetCString();
> -    
> -    if (!class_name || !*class_name)
> -        return false;
> -    
> -    uint64_t info_bits_location = valobj_addr + ptr_size;
> -    if (process_sp->GetByteOrder() != lldb::eByteOrderLittle)
> -        info_bits_location += 3;
> -        
> -        Error error;
> -    
> -    uint8_t info_bits = process_sp->ReadUnsignedIntegerFromMemory(info_bits_location, 1, 0, error);
> -    if (error.Fail())
> -        return false;
> -    
> -    bool is_mutable = (info_bits & 1) == 1;
> -    bool is_inline = (info_bits & 0x60) == 0;
> -    bool has_explicit_length = (info_bits & (1 | 4)) != 4;
> -    bool is_unicode = (info_bits & 0x10) == 0x10;
> -    bool is_special = strcmp(class_name,"NSPathStore2") == 0;
> -    
> -    if (strcmp(class_name,"NSString") &&
> -        strcmp(class_name,"CFStringRef") &&
> -        strcmp(class_name,"CFMutableStringRef") &&
> -        strcmp(class_name,"__NSCFConstantString") &&
> -        strcmp(class_name,"__NSCFString") &&
> -        strcmp(class_name,"NSCFConstantString") &&
> -        strcmp(class_name,"NSCFString") &&
> -        strcmp(class_name,"NSPathStore2"))
> -    {
> -        // probably not one of us - bail out
> -        return false;
> -    }
> -    
> -    if (is_mutable)
> -    {
> -        uint64_t location = 2 * ptr_size + valobj_addr;
> -        location = process_sp->ReadPointerFromMemory(location, error);
> -        if (error.Fail())
> -            return false;
> -        if (has_explicit_length and is_unicode)
> -            return ReadUTFBufferAndDumpToStream<UTF16> (ConvertUTF16toUTF8,location, process_sp, stream, '@');
> -        else
> -        {
> -            location++;
> -            lldb::DataBufferSP buffer_sp(new DataBufferHeap(1024,0));
> -            size_t data_read = process_sp->ReadCStringFromMemory(location, (char*)buffer_sp->GetBytes(), 1024, error);
> -            if (error.Fail())
> -                return false;
> -            if (data_read)
> -                stream.Printf("@\"%s\"",(char*)buffer_sp->GetBytes());
> -                return true;
> -        }
> -    }
> -    else if (is_inline && has_explicit_length && !is_unicode && !is_special && !is_mutable)
> -    {
> -        uint64_t location = 3 * ptr_size + valobj_addr;
> -        lldb::DataBufferSP buffer_sp(new DataBufferHeap(1024,0));
> -        size_t data_read = process_sp->ReadCStringFromMemory(location, (char*)buffer_sp->GetBytes(), 1024, error);
> -        if (error.Fail())
> -            return false;
> -        if (data_read)
> -            stream.Printf("@\"%s\"",(char*)buffer_sp->GetBytes());
> -            return true;
> -    }
> -    else if (is_unicode)
> -    {
> -        uint64_t location = valobj_addr + ptr_size + 4 + (ptr_size == 8 ? 4 : 0);
> -        if (is_inline)
> -        {
> -            if (!has_explicit_length)
> -            {
> -                stream.Printf("found new combo");
> -                return true;
> -            }
> -            else
> -                location += ptr_size;
> -                }
> -        else
> -        {
> -            location = process_sp->ReadPointerFromMemory(location, error);
> -            if (error.Fail())
> -                return false;
> -        }
> -        return ReadUTFBufferAndDumpToStream<UTF16> (ConvertUTF16toUTF8, location, process_sp, stream, '@');
> -    }
> -    else if (is_special)
> -    {
> -        uint64_t location = valobj_addr + (ptr_size == 8 ? 12 : 8);
> -        return ReadUTFBufferAndDumpToStream<UTF16> (ConvertUTF16toUTF8, location, process_sp, stream, '@');
> -    }
> -    else if (is_inline)
> -    {
> -        uint64_t location = valobj_addr + ptr_size + 4 + (ptr_size == 8 ? 4 : 0);
> -        if (!has_explicit_length)
> -            location++;
> -        lldb::DataBufferSP buffer_sp(new DataBufferHeap(1024,0));
> -        size_t data_read = process_sp->ReadCStringFromMemory(location, (char*)buffer_sp->GetBytes(), 1024, error);
> -        if (error.Fail())
> -            return false;
> -        if (data_read)
> -            stream.Printf("@\"%s\"",(char*)buffer_sp->GetBytes());
> -            return true;
> -    }
> -    else
> -    {
> -        uint64_t location = valobj_addr + ptr_size + 4 + (ptr_size == 8 ? 4 : 0);
> -        location = process_sp->ReadPointerFromMemory(location, error);
> -        if (error.Fail())
> -            return false;
> -        lldb::DataBufferSP buffer_sp(new DataBufferHeap(1024,0));
> -        size_t data_read = process_sp->ReadCStringFromMemory(location, (char*)buffer_sp->GetBytes(), 1024, error);
> -        if (error.Fail())
> -            return false;
> -        if (data_read)
> -            stream.Printf("@\"%s\"",(char*)buffer_sp->GetBytes());
> -            return true;
> -    }
> -    
> -    stream.Printf("class name = %s",class_name);
> -    return true;
> -    
> -}
> -
> -bool
> -lldb_private::formatters::RuntimeSpecificDescriptionSummaryProvider (ValueObject& valobj, Stream& stream)
> -{
> -    stream.Printf("%s",valobj.GetObjectDescription());
> -    return true;
> -}
> -
> -bool
> -lldb_private::formatters::ObjCBOOLSummaryProvider (ValueObject& valobj, Stream& stream)
> -{
> -    const uint32_t type_info = ClangASTContext::GetTypeInfo(valobj.GetClangType(),
> -                                                            valobj.GetClangAST(),
> -                                                            NULL);
> -    
> -    ValueObjectSP real_guy_sp = valobj.GetSP();
> -    
> -    if (type_info & ClangASTContext::eTypeIsPointer)
> -    {
> -        Error err;
> -        real_guy_sp = valobj.Dereference(err);
> -        if (err.Fail() || !real_guy_sp)
> -            return false;
> -    }
> -    else if (type_info & ClangASTContext::eTypeIsReference)
> -    {
> -        real_guy_sp =  valobj.GetChildAtIndex(0, true);
> -        if (!real_guy_sp)
> -            return false;
> -    }
> -    uint64_t value = real_guy_sp->GetValueAsUnsigned(0);
> -    if (value == 0)
> -    {
> -        stream.Printf("NO");
> -        return true;
> -    }
> -    stream.Printf("YES");
> -    return true;
> -}
> -
> -template <bool is_sel_ptr>
> -bool
> -lldb_private::formatters::ObjCSELSummaryProvider (ValueObject& valobj, Stream& stream)
> -{
> -    lldb::addr_t data_address = LLDB_INVALID_ADDRESS;
> -    
> -    if (is_sel_ptr)
> -        data_address = valobj.GetValueAsUnsigned(LLDB_INVALID_ADDRESS);
> -    else
> -        data_address = valobj.GetAddressOf();
> -
> -    if (data_address == LLDB_INVALID_ADDRESS)
> -        return false;
> -    
> -    ExecutionContext exe_ctx(valobj.GetExecutionContextRef());
> -    
> -    void* char_opaque_type = valobj.GetClangAST()->CharTy.getAsOpaquePtr();
> -    ClangASTType charstar(valobj.GetClangAST(),ClangASTType::GetPointerType(valobj.GetClangAST(), char_opaque_type));
> -    
> -    ValueObjectSP valobj_sp(ValueObject::CreateValueObjectFromAddress("text", data_address, exe_ctx, charstar));
> -    
> -    stream.Printf("%s",valobj_sp->GetSummaryAsCString());
> -    return true;
> -}
> -
> -lldb_private::formatters::NSArrayMSyntheticFrontEnd::NSArrayMSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp) :
> -SyntheticChildrenFrontEnd(*valobj_sp.get()),
> -m_exe_ctx_ref(),
> -m_ptr_size(8),
> -m_data_32(NULL),
> -m_data_64(NULL)
> -{
> -    if (valobj_sp)
> -    {
> -        m_id_type = ClangASTType(valobj_sp->GetClangAST(),valobj_sp->GetClangAST()->ObjCBuiltinIdTy.getAsOpaquePtr());
> -        Update();
> -    }
> -}
> -
> -size_t
> -lldb_private::formatters::NSArrayMSyntheticFrontEnd::CalculateNumChildren ()
> -{
> -    if (m_data_32)
> -        return m_data_32->_used;
> -    if (m_data_64)
> -        return m_data_64->_used;
> -    return 0;
> -}
> -
> -lldb::ValueObjectSP
> -lldb_private::formatters::NSArrayMSyntheticFrontEnd::GetChildAtIndex (size_t idx)
> -{
> -    if (!m_data_32 && !m_data_64)
> -        return lldb::ValueObjectSP();
> -    if (idx >= CalculateNumChildren())
> -        return lldb::ValueObjectSP();
> -    lldb::addr_t object_at_idx = (m_data_32 ? m_data_32->_data : m_data_64->_data);
> -    object_at_idx += (idx * m_ptr_size);
> -    StreamString idx_name;
> -    idx_name.Printf("[%zu]",idx);
> -    lldb::ValueObjectSP retval_sp = ValueObject::CreateValueObjectFromAddress(idx_name.GetData(),
> -                                                                              object_at_idx,
> -                                                                              m_exe_ctx_ref,
> -                                                                              m_id_type);
> -    m_children.push_back(retval_sp);
> -    return retval_sp;
> -}
> -
> -bool
> -lldb_private::formatters::NSArrayMSyntheticFrontEnd::Update()
> -{
> -    m_children.clear();
> -    ValueObjectSP valobj_sp = m_backend.GetSP();
> -    m_ptr_size = 0;
> -    delete m_data_32;
> -    m_data_32 = NULL;
> -    delete m_data_64;
> -    m_data_64 = NULL;
> -    if (valobj_sp->IsDynamic())
> -        valobj_sp = valobj_sp->GetStaticValue();
> -    if (!valobj_sp)
> -        return false;
> -    m_exe_ctx_ref = valobj_sp->GetExecutionContextRef();
> -    Error error;
> -    if (valobj_sp->IsPointerType())
> -    {
> -        valobj_sp = valobj_sp->Dereference(error);
> -        if (error.Fail() || !valobj_sp)
> -            return false;
> -    }
> -    error.Clear();
> -    lldb::ProcessSP process_sp(valobj_sp->GetProcessSP());
> -    if (!process_sp)
> -        return false;
> -    m_ptr_size = process_sp->GetAddressByteSize();
> -    uint64_t data_location = valobj_sp->GetAddressOf() + m_ptr_size;
> -    if (m_ptr_size == 4)
> -    {
> -        m_data_32 = new DataDescriptor_32();
> -        process_sp->ReadMemory (data_location, m_data_32, sizeof(DataDescriptor_32), error);
> -    }
> -    else
> -    {
> -        m_data_64 = new DataDescriptor_64();
> -        process_sp->ReadMemory (data_location, m_data_64, sizeof(DataDescriptor_64), error);
> -    }
> -    if (error.Fail())
> -        return false;
> -    return false;
> -}
> -
> -bool
> -lldb_private::formatters::NSArrayMSyntheticFrontEnd::MightHaveChildren ()
> -{
> -    return true;
> -}
> -
> -static uint32_t
> -ExtractIndexFromString (const char* item_name)
> -{
> -    if (!item_name || !*item_name)
> -        return UINT32_MAX;
> -    if (*item_name != '[')
> -        return UINT32_MAX;
> -    item_name++;
> -    uint32_t idx = 0;
> -    while(*item_name)
> -    {
> -        char x = *item_name;
> -        if (x == ']')
> -            break;
> -        if (x < '0' || x > '9')
> -            return UINT32_MAX;
> -        idx = 10*idx + (x-'0');
> -        item_name++;
> -    }
> -    return idx;
> -}
> -
> -uint32_t
> -lldb_private::formatters::NSArrayMSyntheticFrontEnd::GetIndexOfChildWithName (const ConstString &name)
> -{
> -    if (!m_data_32 && !m_data_64)
> -        return UINT32_MAX;
> -    const char* item_name = name.GetCString();
> -    uint32_t idx = ExtractIndexFromString(item_name);
> -    if (idx < UINT32_MAX && idx >= CalculateNumChildren())
> -        return UINT32_MAX;
> -    return idx;
> -}
> -
> -lldb_private::formatters::NSArrayMSyntheticFrontEnd::~NSArrayMSyntheticFrontEnd ()
> -{
> -    delete m_data_32;
> -    m_data_32 = NULL;
> -    delete m_data_64;
> -    m_data_64 = NULL;
> -}
> -
> -lldb_private::formatters::NSArrayISyntheticFrontEnd::NSArrayISyntheticFrontEnd (lldb::ValueObjectSP valobj_sp) :
> -SyntheticChildrenFrontEnd(*valobj_sp.get()),
> -m_exe_ctx_ref(),
> -m_ptr_size(8),
> -m_items(0),
> -m_data_ptr(0)
> -{
> -    if (valobj_sp)
> -    {
> -        m_id_type = ClangASTType(valobj_sp->GetClangAST(),valobj_sp->GetClangAST()->ObjCBuiltinIdTy.getAsOpaquePtr());
> -        Update();
> -    }
> -}
> -
> -lldb_private::formatters::NSArrayISyntheticFrontEnd::~NSArrayISyntheticFrontEnd ()
> -{
> -}
> -
> -uint32_t
> -lldb_private::formatters::NSArrayISyntheticFrontEnd::GetIndexOfChildWithName (const ConstString &name)
> -{
> -    const char* item_name = name.GetCString();
> -    uint32_t idx = ExtractIndexFromString(item_name);
> -    if (idx < UINT32_MAX && idx >= CalculateNumChildren())
> -        return UINT32_MAX;
> -    return idx;
> -}
> -
> -size_t
> -lldb_private::formatters::NSArrayISyntheticFrontEnd::CalculateNumChildren ()
> -{
> -    return m_items;
> -}
> -
> -bool
> -lldb_private::formatters::NSArrayISyntheticFrontEnd::Update()
> -{
> -    m_ptr_size = 0;
> -    m_items = 0;
> -    m_data_ptr = 0;
> -    m_children.clear();
> -    ValueObjectSP valobj_sp = m_backend.GetSP();
> -    if (valobj_sp->IsDynamic())
> -        valobj_sp = valobj_sp->GetStaticValue();
> -    if (!valobj_sp)
> -        return false;
> -    m_exe_ctx_ref = valobj_sp->GetExecutionContextRef();
> -    Error error;
> -    if (valobj_sp->IsPointerType())
> -    {
> -        valobj_sp = valobj_sp->Dereference(error);
> -        if (error.Fail() || !valobj_sp)
> -            return false;
> -    }
> -    error.Clear();
> -    lldb::ProcessSP process_sp(valobj_sp->GetProcessSP());
> -    if (!process_sp)
> -        return false;
> -    m_ptr_size = process_sp->GetAddressByteSize();
> -    uint64_t data_location = valobj_sp->GetAddressOf() + m_ptr_size;
> -    m_items = process_sp->ReadPointerFromMemory(data_location, error);
> -    if (error.Fail())
> -        return false;
> -    m_data_ptr = data_location+m_ptr_size;
> -    return false;
> -}
> -
> -bool
> -lldb_private::formatters::NSArrayISyntheticFrontEnd::MightHaveChildren ()
> -{
> -    return true;
> -}
> -
> -lldb::ValueObjectSP
> -lldb_private::formatters::NSArrayISyntheticFrontEnd::GetChildAtIndex (size_t idx)
> -{
> -    if (idx >= CalculateNumChildren())
> -        return lldb::ValueObjectSP();
> -    lldb::addr_t object_at_idx = m_data_ptr;
> -    object_at_idx += (idx * m_ptr_size);
> -    ProcessSP process_sp = m_exe_ctx_ref.GetProcessSP();
> -    if (!process_sp)
> -        return lldb::ValueObjectSP();
> -    Error error;
> -    object_at_idx = process_sp->ReadPointerFromMemory(object_at_idx, error);
> -    if (error.Fail())
> -        return lldb::ValueObjectSP();
> -    StreamString expr;
> -    expr.Printf("(id)%" PRIu64,object_at_idx);
> -    StreamString idx_name;
> -    idx_name.Printf("[%zu]",idx);
> -    lldb::ValueObjectSP retval_sp = ValueObject::CreateValueObjectFromExpression(idx_name.GetData(), expr.GetData(), m_exe_ctx_ref);
> -    m_children.push_back(retval_sp);
> -    return retval_sp;
> -}
> -
> -SyntheticChildrenFrontEnd* lldb_private::formatters::NSArraySyntheticFrontEndCreator (CXXSyntheticChildren*, lldb::ValueObjectSP valobj_sp)
> -{
> -    lldb::ProcessSP process_sp (valobj_sp->GetProcessSP());
> -    if (!process_sp)
> -        return NULL;
> -    ObjCLanguageRuntime *runtime = (ObjCLanguageRuntime*)process_sp->GetLanguageRuntime(lldb::eLanguageTypeObjC);
> -    if (!runtime)
> -        return NULL;
> -    
> -    if (!valobj_sp->IsPointerType())
> -    {
> -        Error error;
> -        valobj_sp = valobj_sp->AddressOf(error);
> -        if (error.Fail() || !valobj_sp)
> -            return NULL;
> -    }
> -    
> -    ObjCLanguageRuntime::ClassDescriptorSP descriptor(runtime->GetClassDescriptor(*valobj_sp.get()));
> -    
> -    if (!descriptor.get() || !descriptor->IsValid())
> -        return NULL;
> -    
> -    const char* class_name = descriptor->GetClassName().GetCString();
> -    
> -    if (!class_name || !*class_name)
> -        return NULL;
> -    
> -    if (!strcmp(class_name,"__NSArrayI"))
> -    {
> -        return (new NSArrayISyntheticFrontEnd(valobj_sp));
> -    }
> -    else if (!strcmp(class_name,"__NSArrayM"))
> -    {
> -        return (new NSArrayMSyntheticFrontEnd(valobj_sp));
> -    }
> -    else
> -    {
> -        return (new NSArrayCodeRunningSyntheticFrontEnd(valobj_sp));
> -    }
> -}
> -
> -lldb_private::formatters::NSArrayCodeRunningSyntheticFrontEnd::NSArrayCodeRunningSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp) :
> -SyntheticChildrenFrontEnd(*valobj_sp.get())
> -{}
> -
> -size_t
> -lldb_private::formatters::NSArrayCodeRunningSyntheticFrontEnd::CalculateNumChildren ()
> -{
> -    uint64_t count = 0;
> -    if (ExtractValueFromObjCExpression(m_backend, "int", "count", count))
> -        return count;
> -    return 0;
> -}
> -
> -lldb::ValueObjectSP
> -lldb_private::formatters::NSArrayCodeRunningSyntheticFrontEnd::GetChildAtIndex (size_t idx)
> -{
> -    StreamString idx_name;
> -    idx_name.Printf("[%zu]",idx);
> -    lldb::ValueObjectSP valobj_sp = CallSelectorOnObject(m_backend,"id","objectAtIndex:",idx);
> -    if (valobj_sp)
> -        valobj_sp->SetName(ConstString(idx_name.GetData()));
> -    return valobj_sp;
> -}
> -
> -bool
> -lldb_private::formatters::NSArrayCodeRunningSyntheticFrontEnd::Update()
> -{
> -    return false;
> -}
> -
> -bool
> -lldb_private::formatters::NSArrayCodeRunningSyntheticFrontEnd::MightHaveChildren ()
> -{
> -    return true;
> -}
> -
> -uint32_t
> -lldb_private::formatters::NSArrayCodeRunningSyntheticFrontEnd::GetIndexOfChildWithName (const ConstString &name)
> -{
> -    return 0;
> -}
> -
> -lldb_private::formatters::NSArrayCodeRunningSyntheticFrontEnd::~NSArrayCodeRunningSyntheticFrontEnd ()
> -{}
> -
> -SyntheticChildrenFrontEnd* lldb_private::formatters::NSDictionarySyntheticFrontEndCreator (CXXSyntheticChildren*, lldb::ValueObjectSP valobj_sp)
> -{
> -    
> -    lldb::ProcessSP process_sp (valobj_sp->GetProcessSP());
> -    if (!process_sp)
> -        return NULL;
> -    ObjCLanguageRuntime *runtime = (ObjCLanguageRuntime*)process_sp->GetLanguageRuntime(lldb::eLanguageTypeObjC);
> -    if (!runtime)
> -        return NULL;
> -
> -    if (!valobj_sp->IsPointerType())
> -    {
> -        Error error;
> -        valobj_sp = valobj_sp->AddressOf(error);
> -        if (error.Fail() || !valobj_sp)
> -            return NULL;
> -    }
> -    
> -    ObjCLanguageRuntime::ClassDescriptorSP descriptor(runtime->GetClassDescriptor(*valobj_sp.get()));
> -    
> -    if (!descriptor.get() || !descriptor->IsValid())
> -        return NULL;
> -    
> -    const char* class_name = descriptor->GetClassName().GetCString();
> -    
> -    if (!class_name || !*class_name)
> -        return NULL;
> -    
> -    if (!strcmp(class_name,"__NSDictionaryI"))
> -    {
> -        return (new NSDictionaryISyntheticFrontEnd(valobj_sp));
> -    }
> -    else if (!strcmp(class_name,"__NSDictionaryM"))
> -    {
> -        return (new NSDictionaryMSyntheticFrontEnd(valobj_sp));
> -    }
> -    else
> -    {
> -        return (new NSDictionaryCodeRunningSyntheticFrontEnd(valobj_sp));
> -    }
> -}
> -
> -lldb_private::formatters::NSDictionaryCodeRunningSyntheticFrontEnd::NSDictionaryCodeRunningSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp) :
> -SyntheticChildrenFrontEnd(*valobj_sp.get())
> -{}
> -
> -size_t
> -lldb_private::formatters::NSDictionaryCodeRunningSyntheticFrontEnd::CalculateNumChildren ()
> -{
> -    uint64_t count = 0;
> -    if (ExtractValueFromObjCExpression(m_backend, "int", "count", count))
> -        return count;
> -    return 0;
> -}
> -
> -lldb::ValueObjectSP
> -lldb_private::formatters::NSDictionaryCodeRunningSyntheticFrontEnd::GetChildAtIndex (size_t idx)
> -{
> -    StreamString idx_name;
> -    idx_name.Printf("[%zu]",idx);
> -    StreamString valobj_expr_path;
> -    m_backend.GetExpressionPath(valobj_expr_path, false);
> -    StreamString key_fetcher_expr;
> -    key_fetcher_expr.Printf("(id)[(NSArray*)[%s allKeys] objectAtIndex:%zu]",valobj_expr_path.GetData(),idx);
> -    StreamString value_fetcher_expr;
> -    value_fetcher_expr.Printf("(id)[%s objectForKey:%s]",valobj_expr_path.GetData(),key_fetcher_expr.GetData());
> -    StreamString object_fetcher_expr;
> -    object_fetcher_expr.Printf("struct __lldb_autogen_nspair { id key; id value; } _lldb_valgen_item; _lldb_valgen_item.key = %s; _lldb_valgen_item.value = %s; _lldb_valgen_item;",key_fetcher_expr.GetData(),value_fetcher_expr.GetData());
> -    lldb::ValueObjectSP child_sp;
> -    m_backend.GetTargetSP()->EvaluateExpression(object_fetcher_expr.GetData(), m_backend.GetFrameSP().get(), child_sp,
> -                                                EvaluateExpressionOptions().SetKeepInMemory(true));
> -    if (child_sp)
> -        child_sp->SetName(ConstString(idx_name.GetData()));
> -    return child_sp;
> -}
> -
> -bool
> -lldb_private::formatters::NSDictionaryCodeRunningSyntheticFrontEnd::Update()
> -{
> -    return false;
> -}
> -
> -bool
> -lldb_private::formatters::NSDictionaryCodeRunningSyntheticFrontEnd::MightHaveChildren ()
> -{
> -    return true;
> -}
> -
> -uint32_t
> -lldb_private::formatters::NSDictionaryCodeRunningSyntheticFrontEnd::GetIndexOfChildWithName (const ConstString &name)
> -{
> -    return 0;
> -}
> -
> -lldb_private::formatters::NSDictionaryCodeRunningSyntheticFrontEnd::~NSDictionaryCodeRunningSyntheticFrontEnd ()
> -{}
> -
> -lldb_private::formatters::NSDictionaryISyntheticFrontEnd::NSDictionaryISyntheticFrontEnd (lldb::ValueObjectSP valobj_sp) :
> -    SyntheticChildrenFrontEnd(*valobj_sp.get()),
> -    m_exe_ctx_ref(),
> -    m_ptr_size(8),
> -    m_data_32(NULL),
> -    m_data_64(NULL)
> -{
> -    if (valobj_sp)
> -        Update();
> -}
> -
> -lldb_private::formatters::NSDictionaryISyntheticFrontEnd::~NSDictionaryISyntheticFrontEnd ()
> -{
> -    delete m_data_32;
> -    m_data_32 = NULL;
> -    delete m_data_64;
> -    m_data_64 = NULL;
> -}
> -
> -uint32_t
> -lldb_private::formatters::NSDictionaryISyntheticFrontEnd::GetIndexOfChildWithName (const ConstString &name)
> -{
> -    const char* item_name = name.GetCString();
> -    uint32_t idx = ExtractIndexFromString(item_name);
> -    if (idx < UINT32_MAX && idx >= CalculateNumChildren())
> -        return UINT32_MAX;
> -    return idx;
> -}
> -
> -size_t
> -lldb_private::formatters::NSDictionaryISyntheticFrontEnd::CalculateNumChildren ()
> -{
> -    if (!m_data_32 && !m_data_64)
> -        return 0;
> -    return (m_data_32 ? m_data_32->_used : m_data_64->_used);
> -}
> -
> -bool
> -lldb_private::formatters::NSDictionaryISyntheticFrontEnd::Update()
> -{
> -    m_children.clear();
> -    delete m_data_32;
> -    m_data_32 = NULL;
> -    delete m_data_64;
> -    m_data_64 = NULL;
> -    m_ptr_size = 0;
> -    ValueObjectSP valobj_sp = m_backend.GetSP();
> -    if (!valobj_sp)
> -        return false;
> -    if (valobj_sp->IsDynamic())
> -        valobj_sp = valobj_sp->GetStaticValue();
> -    if (!valobj_sp)
> -        return false;
> -    m_exe_ctx_ref = valobj_sp->GetExecutionContextRef();
> -    Error error;
> -    if (valobj_sp->IsPointerType())
> -    {
> -        valobj_sp = valobj_sp->Dereference(error);
> -        if (error.Fail() || !valobj_sp)
> -            return false;
> -    }
> -    error.Clear();
> -    lldb::ProcessSP process_sp(valobj_sp->GetProcessSP());
> -    if (!process_sp)
> -        return false;
> -    m_ptr_size = process_sp->GetAddressByteSize();
> -    uint64_t data_location = valobj_sp->GetAddressOf() + m_ptr_size;
> -    if (m_ptr_size == 4)
> -    {
> -        m_data_32 = new DataDescriptor_32();
> -        process_sp->ReadMemory (data_location, m_data_32, sizeof(DataDescriptor_32), error);
> -    }
> -    else
> -    {
> -        m_data_64 = new DataDescriptor_64();
> -        process_sp->ReadMemory (data_location, m_data_64, sizeof(DataDescriptor_64), error);
> -    }
> -    if (error.Fail())
> -        return false;
> -    m_data_ptr = data_location + m_ptr_size;
> -    return false;
> -}
> -
> -bool
> -lldb_private::formatters::NSDictionaryISyntheticFrontEnd::MightHaveChildren ()
> -{
> -    return true;
> -}
> -
> -lldb::ValueObjectSP
> -lldb_private::formatters::NSDictionaryISyntheticFrontEnd::GetChildAtIndex (size_t idx)
> -{
> -    uint32_t num_children = CalculateNumChildren();
> -    
> -    if (idx >= num_children)
> -        return lldb::ValueObjectSP();
> -    
> -    if (m_children.empty())
> -    {
> -        // do the scan phase
> -        lldb::addr_t key_at_idx = 0, val_at_idx = 0;
> -        
> -        uint32_t tries = 0;
> -        uint32_t test_idx = 0;
> -        
> -        while(tries < num_children)
> -        {
> -            key_at_idx = m_data_ptr + (2*test_idx * m_ptr_size);
> -            val_at_idx = key_at_idx + m_ptr_size;
> -            ProcessSP process_sp = m_exe_ctx_ref.GetProcessSP();
> -            if (!process_sp)
> -                return lldb::ValueObjectSP();
> -            Error error;
> -            key_at_idx = process_sp->ReadPointerFromMemory(key_at_idx, error);
> -            if (error.Fail())
> -                return lldb::ValueObjectSP();
> -            val_at_idx = process_sp->ReadPointerFromMemory(val_at_idx, error);
> -            if (error.Fail())
> -                return lldb::ValueObjectSP();
> -
> -            test_idx++;
> -            
> -            if (!key_at_idx || !val_at_idx)
> -                continue;
> -            tries++;
> -            
> -            DictionaryItemDescriptor descriptor = {key_at_idx,val_at_idx,lldb::ValueObjectSP()};
> -            
> -            m_children.push_back(descriptor);
> -        }
> -    }
> -    
> -    if (idx >= m_children.size()) // should never happen
> -        return lldb::ValueObjectSP();
> -    
> -    DictionaryItemDescriptor &dict_item = m_children[idx];
> -    if (!dict_item.valobj_sp)
> -    {
> -        // make the new ValueObject
> -        StreamString expr;
> -        expr.Printf("struct __lldb_autogen_nspair { id key; id value; } _lldb_valgen_item; _lldb_valgen_item.key = (id)%" PRIu64 " ; _lldb_valgen_item.value = (id)%" PRIu64 "; _lldb_valgen_item;",dict_item.key_ptr,dict_item.val_ptr);
> -        StreamString idx_name;
> -        idx_name.Printf("[%zu]",idx);
> -        dict_item.valobj_sp = ValueObject::CreateValueObjectFromExpression(idx_name.GetData(), expr.GetData(), m_exe_ctx_ref);
> -    }
> -    return dict_item.valobj_sp;
> -}
> -
> -lldb_private::formatters::NSDictionaryMSyntheticFrontEnd::NSDictionaryMSyntheticFrontEnd (lldb::ValueObjectSP valobj_sp) :
> -    SyntheticChildrenFrontEnd(*valobj_sp.get()),
> -    m_exe_ctx_ref(),
> -    m_ptr_size(8),
> -    m_data_32(NULL),
> -    m_data_64(NULL)
> -{
> -    if (valobj_sp)
> -        Update ();
> -}
> -
> -lldb_private::formatters::NSDictionaryMSyntheticFrontEnd::~NSDictionaryMSyntheticFrontEnd ()
> -{
> -    delete m_data_32;
> -    m_data_32 = NULL;
> -    delete m_data_64;
> -    m_data_64 = NULL;
> -}
> -
> -uint32_t
> -lldb_private::formatters::NSDictionaryMSyntheticFrontEnd::GetIndexOfChildWithName (const ConstString &name)
> -{
> -    const char* item_name = name.GetCString();
> -    uint32_t idx = ExtractIndexFromString(item_name);
> -    if (idx < UINT32_MAX && idx >= CalculateNumChildren())
> -        return UINT32_MAX;
> -    return idx;
> -}
> -
> -size_t
> -lldb_private::formatters::NSDictionaryMSyntheticFrontEnd::CalculateNumChildren ()
> -{
> -    if (!m_data_32 && !m_data_64)
> -        return 0;
> -    return (m_data_32 ? m_data_32->_used : m_data_64->_used);
> -}
> -
> -bool
> -lldb_private::formatters::NSDictionaryMSyntheticFrontEnd::Update()
> -{
> -    m_children.clear();
> -    ValueObjectSP valobj_sp = m_backend.GetSP();
> -    m_ptr_size = 0;
> -    delete m_data_32;
> -    m_data_32 = NULL;
> -    delete m_data_64;
> -    m_data_64 = NULL;
> -    if (!valobj_sp)
> -        return false;
> -    if (valobj_sp->IsDynamic())
> -        valobj_sp = valobj_sp->GetStaticValue();
> -    if (!valobj_sp)
> -        return false;
> -    m_exe_ctx_ref = valobj_sp->GetExecutionContextRef();
> -    Error error;
> -    if (valobj_sp->IsPointerType())
> -    {
> -        valobj_sp = valobj_sp->Dereference(error);
> -        if (error.Fail() || !valobj_sp)
> -            return false;
> -    }
> -    error.Clear();
> -    lldb::ProcessSP process_sp(valobj_sp->GetProcessSP());
> -    if (!process_sp)
> -        return false;
> -    m_ptr_size = process_sp->GetAddressByteSize();
> -    uint64_t data_location = valobj_sp->GetAddressOf() + m_ptr_size;
> -    if (m_ptr_size == 4)
> -    {
> -        m_data_32 = new DataDescriptor_32();
> -        process_sp->ReadMemory (data_location, m_data_32, sizeof(DataDescriptor_32), error);
> -    }
> -    else
> -    {
> -        m_data_64 = new DataDescriptor_64();
> -        process_sp->ReadMemory (data_location, m_data_64, sizeof(DataDescriptor_64), error);
> -    }
> -    if (error.Fail())
> -        return false;
> -    return false;
> -}
> -
> -bool
> -lldb_private::formatters::NSDictionaryMSyntheticFrontEnd::MightHaveChildren ()
> -{
> -    return true;
> -}
> -
> -lldb::ValueObjectSP
> -lldb_private::formatters::NSDictionaryMSyntheticFrontEnd::GetChildAtIndex (size_t idx)
> -{
> -    lldb::addr_t m_keys_ptr = (m_data_32 ? m_data_32->_keys_addr : m_data_64->_keys_addr);
> -    lldb::addr_t m_values_ptr = (m_data_32 ? m_data_32->_objs_addr : m_data_64->_objs_addr);
> -    
> -    uint32_t num_children = CalculateNumChildren();
> -    
> -    if (idx >= num_children)
> -        return lldb::ValueObjectSP();
> -    
> -    if (m_children.empty())
> -    {
> -        // do the scan phase
> -        lldb::addr_t key_at_idx = 0, val_at_idx = 0;
> -        
> -        uint32_t tries = 0;
> -        uint32_t test_idx = 0;
> -        
> -        while(tries < num_children)
> -        {
> -            key_at_idx = m_keys_ptr + (test_idx * m_ptr_size);
> -            val_at_idx = m_values_ptr + (test_idx * m_ptr_size);;
> -            ProcessSP process_sp = m_exe_ctx_ref.GetProcessSP();
> -            if (!process_sp)
> -                return lldb::ValueObjectSP();
> -            Error error;
> -            key_at_idx = process_sp->ReadPointerFromMemory(key_at_idx, error);
> -            if (error.Fail())
> -                return lldb::ValueObjectSP();
> -            val_at_idx = process_sp->ReadPointerFromMemory(val_at_idx, error);
> -            if (error.Fail())
> -                return lldb::ValueObjectSP();
> -            
> -            test_idx++;
> -            
> -            if (!key_at_idx || !val_at_idx)
> -                continue;
> -            tries++;
> -            
> -            DictionaryItemDescriptor descriptor = {key_at_idx,val_at_idx,lldb::ValueObjectSP()};
> -            
> -            m_children.push_back(descriptor);
> -        }
> -    }
> -    
> -    if (idx >= m_children.size()) // should never happen
> -        return lldb::ValueObjectSP();
> -    
> -    DictionaryItemDescriptor &dict_item = m_children[idx];
> -    if (!dict_item.valobj_sp)
> -    {
> -        // make the new ValueObject
> -        StreamString expr;
> -        expr.Printf("struct __lldb_autogen_nspair { id key; id value; } _lldb_valgen_item; _lldb_valgen_item.key = (id)%" PRIu64 " ; _lldb_valgen_item.value = (id)%" PRIu64 "; _lldb_valgen_item;",dict_item.key_ptr,dict_item.val_ptr);
> -        StreamString idx_name;
> -        idx_name.Printf("[%zu]",idx);
> -        dict_item.valobj_sp = ValueObject::CreateValueObjectFromExpression(idx_name.GetData(), expr.GetData(), m_exe_ctx_ref);
> -    }
> -    return dict_item.valobj_sp;
> -}
> -
> -template bool
> -lldb_private::formatters::NSDictionarySummaryProvider<true> (ValueObject&, Stream&) ;
> -
> -template bool
> -lldb_private::formatters::NSDictionarySummaryProvider<false> (ValueObject&, Stream&) ;
> -
> -template bool
> -lldb_private::formatters::NSDataSummaryProvider<true> (ValueObject&, Stream&) ;
> -
> -template bool
> -lldb_private::formatters::NSDataSummaryProvider<false> (ValueObject&, Stream&) ;
> -
> -template bool
> -lldb_private::formatters::ObjCSELSummaryProvider<true> (ValueObject&, Stream&) ;
> -
> -template bool
> -lldb_private::formatters::ObjCSELSummaryProvider<false> (ValueObject&, Stream&) ;
> 
> Removed: lldb/trunk/source/Core/DataVisualization.cpp
> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Core/DataVisualization.cpp?rev=173727&view=auto
> ==============================================================================
> --- lldb/trunk/source/Core/DataVisualization.cpp (original)
> +++ lldb/trunk/source/Core/DataVisualization.cpp (removed)
> @@ -1,279 +0,0 @@
> -//===-- DataVisualization.cpp ---------------------------------------*- C++ -*-===//
> -//
> -//                     The LLVM Compiler Infrastructure
> -//
> -// This file is distributed under the University of Illinois Open Source
> -// License. See LICENSE.TXT for details.
> -//
> -//===----------------------------------------------------------------------===//
> -
> -#include "lldb/lldb-python.h"
> -
> -#include "lldb/Core/DataVisualization.h"
> -
> -// C Includes
> -// C++ Includes
> -// Other libraries and framework includes
> -// Project includes
> -
> -#include "lldb/Core/Debugger.h"
> -
> -using namespace lldb;
> -using namespace lldb_private;
> -
> -static FormatManager&
> -GetFormatManager()
> -{
> -    static FormatManager g_format_manager;
> -    return g_format_manager;
> -}
> -
> -void
> -DataVisualization::ForceUpdate ()
> -{
> -    GetFormatManager().Changed();
> -}
> -
> -uint32_t
> -DataVisualization::GetCurrentRevision ()
> -{
> -    return GetFormatManager().GetCurrentRevision();
> -}
> -
> -lldb::TypeFormatImplSP
> -DataVisualization::ValueFormats::GetFormat (ValueObject& valobj, lldb::DynamicValueType use_dynamic)
> -{
> -    lldb::TypeFormatImplSP entry;
> -    GetFormatManager().GetValueNavigator().Get(valobj, entry, use_dynamic);
> -    return entry;
> -}
> -
> -lldb::TypeFormatImplSP
> -DataVisualization::ValueFormats::GetFormat (const ConstString &type)
> -{
> -    lldb::TypeFormatImplSP entry;
> -    GetFormatManager().GetValueNavigator().Get(type, entry);
> -    return entry;
> -}
> -
> -void
> -DataVisualization::ValueFormats::Add (const ConstString &type, const lldb::TypeFormatImplSP &entry)
> -{
> -    GetFormatManager().GetValueNavigator().Add(FormatManager::GetValidTypeName(type),entry);
> -}
> -
> -bool
> -DataVisualization::ValueFormats::Delete (const ConstString &type)
> -{
> -    return GetFormatManager().GetValueNavigator().Delete(type);
> -}
> -
> -void
> -DataVisualization::ValueFormats::Clear ()
> -{
> -    GetFormatManager().GetValueNavigator().Clear();
> -}
> -
> -void
> -DataVisualization::ValueFormats::LoopThrough (TypeFormatImpl::ValueCallback callback, void* callback_baton)
> -{
> -    GetFormatManager().GetValueNavigator().LoopThrough(callback, callback_baton);
> -}
> -
> -uint32_t
> -DataVisualization::ValueFormats::GetCount ()
> -{
> -    return GetFormatManager().GetValueNavigator().GetCount();
> -}
> -
> -lldb::TypeNameSpecifierImplSP
> -DataVisualization::ValueFormats::GetTypeNameSpecifierForFormatAtIndex (uint32_t index)
> -{
> -    return GetFormatManager().GetValueNavigator().GetTypeNameSpecifierAtIndex(index);
> -}
> -
> -lldb::TypeFormatImplSP
> -DataVisualization::ValueFormats::GetFormatAtIndex (uint32_t index)
> -{
> -    return GetFormatManager().GetValueNavigator().GetAtIndex(index);
> -}
> -
> -lldb::TypeSummaryImplSP
> -DataVisualization::GetSummaryFormat (ValueObject& valobj,
> -                                     lldb::DynamicValueType use_dynamic)
> -{
> -    return GetFormatManager().GetSummaryFormat(valobj, use_dynamic);
> -}
> -
> -lldb::TypeSummaryImplSP
> -DataVisualization::GetSummaryForType (lldb::TypeNameSpecifierImplSP type_sp)
> -{
> -    return GetFormatManager().GetSummaryForType(type_sp);
> -}
> -
> -#ifndef LLDB_DISABLE_PYTHON
> -lldb::SyntheticChildrenSP
> -DataVisualization::GetSyntheticChildren (ValueObject& valobj,
> -                                         lldb::DynamicValueType use_dynamic)
> -{
> -    return GetFormatManager().GetSyntheticChildren(valobj, use_dynamic);
> -}
> -#endif
> -
> -#ifndef LLDB_DISABLE_PYTHON
> -lldb::SyntheticChildrenSP
> -DataVisualization::GetSyntheticChildrenForType (lldb::TypeNameSpecifierImplSP type_sp)
> -{
> -    return GetFormatManager().GetSyntheticChildrenForType(type_sp);
> -}
> -#endif
> -
> -lldb::TypeFilterImplSP
> -DataVisualization::GetFilterForType (lldb::TypeNameSpecifierImplSP type_sp)
> -{
> -    return GetFormatManager().GetFilterForType(type_sp);
> -}
> -
> -#ifndef LLDB_DISABLE_PYTHON
> -lldb::TypeSyntheticImplSP
> -DataVisualization::GetSyntheticForType (lldb::TypeNameSpecifierImplSP type_sp)
> -{
> -    return GetFormatManager().GetSyntheticForType(type_sp);
> -}
> -#endif
> -
> -bool
> -DataVisualization::AnyMatches (ConstString type_name,
> -                               TypeCategoryImpl::FormatCategoryItems items,
> -                               bool only_enabled,
> -                               const char** matching_category,
> -                               TypeCategoryImpl::FormatCategoryItems* matching_type)
> -{
> -    return GetFormatManager().AnyMatches(type_name,
> -                                         items,
> -                                         only_enabled,
> -                                         matching_category,
> -                                         matching_type);
> -}
> -
> -bool
> -DataVisualization::Categories::GetCategory (const ConstString &category, lldb::TypeCategoryImplSP &entry,
> -                                            bool allow_create)
> -{
> -    entry = GetFormatManager().GetCategory(category, allow_create);
> -    return (entry.get() != NULL);
> -}
> -
> -void
> -DataVisualization::Categories::Add (const ConstString &category)
> -{
> -    GetFormatManager().GetCategory(category);
> -}
> -
> -bool
> -DataVisualization::Categories::Delete (const ConstString &category)
> -{
> -    GetFormatManager().DisableCategory(category);
> -    return GetFormatManager().DeleteCategory(category);
> -}
> -
> -void
> -DataVisualization::Categories::Clear ()
> -{
> -    GetFormatManager().ClearCategories();
> -}
> -
> -void
> -DataVisualization::Categories::Clear (const ConstString &category)
> -{
> -    GetFormatManager().GetCategory(category)->Clear(eFormatCategoryItemSummary | eFormatCategoryItemRegexSummary);
> -}
> -
> -void
> -DataVisualization::Categories::Enable (const ConstString& category,
> -                                       CategoryMap::Position pos)
> -{
> -    if (GetFormatManager().GetCategory(category)->IsEnabled())
> -        GetFormatManager().DisableCategory(category);
> -    GetFormatManager().EnableCategory(category, pos);
> -}
> -
> -void
> -DataVisualization::Categories::Disable (const ConstString& category)
> -{
> -    if (GetFormatManager().GetCategory(category)->IsEnabled() == true)
> -        GetFormatManager().DisableCategory(category);
> -}
> -
> -void
> -DataVisualization::Categories::Enable (const lldb::TypeCategoryImplSP& category,
> -                                       CategoryMap::Position pos)
> -{
> -    if (category.get())
> -    {
> -        if (category->IsEnabled())
> -            GetFormatManager().DisableCategory(category);
> -        GetFormatManager().EnableCategory(category, pos);
> -    }
> -}
> -
> -void
> -DataVisualization::Categories::Disable (const lldb::TypeCategoryImplSP& category)
> -{
> -    if (category.get() && category->IsEnabled() == true)
> -        GetFormatManager().DisableCategory(category);
> -}
> -
> -void
> -DataVisualization::Categories::LoopThrough (FormatManager::CategoryCallback callback, void* callback_baton)
> -{
> -    GetFormatManager().LoopThroughCategories(callback, callback_baton);
> -}
> -
> -uint32_t
> -DataVisualization::Categories::GetCount ()
> -{
> -    return GetFormatManager().GetCategoriesCount();
> -}
> -
> -lldb::TypeCategoryImplSP
> -DataVisualization::Categories::GetCategoryAtIndex (uint32_t index)
> -{
> -    return GetFormatManager().GetCategoryAtIndex(index);
> -}
> -
> -bool
> -DataVisualization::NamedSummaryFormats::GetSummaryFormat (const ConstString &type, lldb::TypeSummaryImplSP &entry)
> -{
> -    return GetFormatManager().GetNamedSummaryNavigator().Get(type,entry);
> -}
> -
> -void
> -DataVisualization::NamedSummaryFormats::Add (const ConstString &type, const lldb::TypeSummaryImplSP &entry)
> -{
> -    GetFormatManager().GetNamedSummaryNavigator().Add(FormatManager::GetValidTypeName(type),entry);
> -}
> -
> -bool
> -DataVisualization::NamedSummaryFormats::Delete (const ConstString &type)
> -{
> -    return GetFormatManager().GetNamedSummaryNavigator().Delete(type);
> -}
> -
> -void
> -DataVisualization::NamedSummaryFormats::Clear ()
> -{
> -    GetFormatManager().GetNamedSummaryNavigator().Clear();
> -}
> -
> -void
> -DataVisualization::NamedSummaryFormats::LoopThrough (TypeSummaryImpl::SummaryCallback callback, void* callback_baton)
> -{
> -    GetFormatManager().GetNamedSummaryNavigator().LoopThrough(callback, callback_baton);
> -}
> -
> -uint32_t
> -DataVisualization::NamedSummaryFormats::GetCount ()
> -{
> -    return GetFormatManager().GetNamedSummaryNavigator().GetCount();
> -}
> 
> Modified: lldb/trunk/source/Core/Debugger.cpp
> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Core/Debugger.cpp?rev=173728&r1=173727&r2=173728&view=diff
> ==============================================================================
> --- lldb/trunk/source/Core/Debugger.cpp (original)
> +++ lldb/trunk/source/Core/Debugger.cpp Mon Jan 28 17:47:25 2013
> @@ -20,8 +20,6 @@
> 
> #include "lldb/lldb-private.h"
> #include "lldb/Core/ConnectionFileDescriptor.h"
> -#include "lldb/Core/DataVisualization.h"
> -#include "lldb/Core/FormatManager.h"
> #include "lldb/Core/InputReader.h"
> #include "lldb/Core/Module.h"
> #include "lldb/Core/PluginManager.h"
> @@ -33,6 +31,8 @@
> #include "lldb/Core/Timer.h"
> #include "lldb/Core/ValueObject.h"
> #include "lldb/Core/ValueObjectVariable.h"
> +#include "lldb/DataFormatters/DataVisualization.h"
> +#include "lldb/DataFormatters/FormatManager.h"
> #include "lldb/Host/DynamicLibrary.h"
> #include "lldb/Host/Terminal.h"
> #include "lldb/Interpreter/CommandInterpreter.h"
> 
> Removed: lldb/trunk/source/Core/FormatClasses.cpp
> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Core/FormatClasses.cpp?rev=173727&view=auto
> ==============================================================================
> --- lldb/trunk/source/Core/FormatClasses.cpp (original)
> +++ lldb/trunk/source/Core/FormatClasses.cpp (removed)
> @@ -1,409 +0,0 @@
> -//===-- FormatClasses.cpp ----------------------------------------*- C++ -*-===//
> -//
> -//                     The LLVM Compiler Infrastructure
> -//
> -// This file is distributed under the University of Illinois Open Source
> -// License. See LICENSE.TXT for details.
> -//
> -//===----------------------------------------------------------------------===//
> -
> -#include "lldb/lldb-python.h"
> -
> -// C Includes
> -
> -// C++ Includes
> -
> -// Other libraries and framework includes
> -
> -// Project includes
> -#include "lldb/lldb-public.h"
> -#include "lldb/lldb-enumerations.h"
> -
> -#include "lldb/Core/Debugger.h"
> -#include "lldb/Core/FormatClasses.h"
> -#include "lldb/Core/StreamString.h"
> -#include "lldb/Core/Timer.h"
> -#include "lldb/Interpreter/CommandInterpreter.h"
> -#include "lldb/Symbol/ClangASTType.h"
> -#include "lldb/Target/StackFrame.h"
> -#include "lldb/Target/Target.h"
> -
> -using namespace lldb;
> -using namespace lldb_private;
> -
> -TypeFormatImpl::TypeFormatImpl (lldb::Format f,
> -                          const Flags& flags) : 
> -    m_flags(flags),
> -    m_format (f)
> -{
> -}
> -
> -std::string
> -TypeFormatImpl::GetDescription()
> -{
> -    StreamString sstr;
> -    sstr.Printf ("%s%s%s%s\n", 
> -                 FormatManager::GetFormatAsCString (GetFormat()),
> -                 Cascades() ? "" : " (not cascading)",
> -                 SkipsPointers() ? " (skip pointers)" : "",
> -                 SkipsReferences() ? " (skip references)" : "");
> -    return sstr.GetString();
> -}
> -
> -TypeSummaryImpl::TypeSummaryImpl(const TypeSummaryImpl::Flags& flags) :
> -    m_flags(flags)
> -{
> -}
> -
> -
> -StringSummaryFormat::StringSummaryFormat(const TypeSummaryImpl::Flags& flags,
> -                                         const char *format_cstr) :
> -    TypeSummaryImpl(flags),
> -    m_format()
> -{
> -  if (format_cstr)
> -    m_format.assign(format_cstr);
> -}
> -
> -bool
> -StringSummaryFormat::FormatObject(ValueObject *valobj,
> -                                  std::string& retval)
> -{
> -    if (!valobj)
> -    {
> -        retval.assign("NULL ValueObject");
> -        return false;
> -    }
> -    
> -    StreamString s;
> -    ExecutionContext exe_ctx (valobj->GetExecutionContextRef());
> -    SymbolContext sc;
> -    StackFrame *frame = exe_ctx.GetFramePtr();
> -    if (frame)
> -        sc = frame->GetSymbolContext(lldb::eSymbolContextEverything);
> -    
> -    if (IsOneliner())
> -    {
> -        ValueObject* object;
> -        
> -        ValueObjectSP synth_valobj = valobj->GetSyntheticValue();
> -        if (synth_valobj)
> -            object = synth_valobj.get();
> -        else
> -            object = valobj;
> -        
> -        const uint32_t num_children = object->GetNumChildren();
> -        if (num_children)
> -        {
> -            s.PutChar('(');
> -            
> -            for (uint32_t idx=0; idx<num_children; ++idx)
> -            {
> -                lldb::ValueObjectSP child_sp(object->GetChildAtIndex(idx, true));
> -                if (child_sp.get())
> -                {
> -                    if (idx)
> -                        s.PutCString(", ");
> -                    if (!HideNames())
> -                    {
> -                        s.PutCString(child_sp.get()->GetName().AsCString());
> -                        s.PutCString(" = ");
> -                    }
> -                    child_sp.get()->DumpPrintableRepresentation(s,
> -                                                                ValueObject::eValueObjectRepresentationStyleSummary,
> -                                                                lldb::eFormatInvalid,
> -                                                                ValueObject::ePrintableRepresentationSpecialCasesDisable);
> -                }
> -            }
> -            
> -            s.PutChar(')');
> -            
> -            retval.assign(s.GetString());
> -            return true;
> -        }
> -        else
> -        {
> -            retval.assign("error: oneliner for no children");
> -            return false;
> -        }
> -        
> -    }
> -    else
> -    {
> -        if (Debugger::FormatPrompt(m_format.c_str(), &sc, &exe_ctx, &sc.line_entry.range.GetBaseAddress(), s, NULL, valobj))
> -        {
> -            retval.assign(s.GetString());
> -            return true;
> -        }
> -        else
> -        {
> -            retval.assign("error: summary string parsing error");
> -            return false;
> -        }
> -    }
> -}
> -
> -std::string
> -StringSummaryFormat::GetDescription()
> -{
> -    StreamString sstr;
> -    
> -    sstr.Printf ("`%s`%s%s%s%s%s%s%s",      m_format.c_str(),
> -                 Cascades() ? "" : " (not cascading)",
> -                 !DoesPrintChildren() ? "" : " (show children)",
> -                 !DoesPrintValue() ? " (hide value)" : "",
> -                 IsOneliner() ? " (one-line printout)" : "",
> -                 SkipsPointers() ? " (skip pointers)" : "",
> -                 SkipsReferences() ? " (skip references)" : "",
> -                 HideNames() ? " (hide member names)" : "");
> -    return sstr.GetString();
> -}
> -
> -CXXFunctionSummaryFormat::CXXFunctionSummaryFormat (const TypeSummaryImpl::Flags& flags,
> -                                                    Callback impl,
> -                                                    const char* description) :
> -                                                    TypeSummaryImpl(flags),
> -                                                    m_impl(impl),
> -                                                    m_description(description ? description : "")
> -{
> -}
> -    
> -bool
> -CXXFunctionSummaryFormat::FormatObject(ValueObject *valobj,
> -                                       std::string& dest)
> -{
> -    dest.clear();
> -    StreamString stream;
> -    if (!m_impl || m_impl(*valobj,stream) == false)
> -        return false;
> -    dest.assign(stream.GetData());
> -    return true;
> -}
> -
> -std::string
> -CXXFunctionSummaryFormat::GetDescription()
> -{
> -    StreamString sstr;
> -    sstr.Printf ("`%s (%p) `%s%s%s%s%s%s%s",      m_description.c_str(),m_impl,
> -                 Cascades() ? "" : " (not cascading)",
> -                 !DoesPrintChildren() ? "" : " (show children)",
> -                 !DoesPrintValue() ? " (hide value)" : "",
> -                 IsOneliner() ? " (one-line printout)" : "",
> -                 SkipsPointers() ? " (skip pointers)" : "",
> -                 SkipsReferences() ? " (skip references)" : "",
> -                 HideNames() ? " (hide member names)" : "");
> -    return sstr.GetString();
> -}
> -
> -#ifndef LLDB_DISABLE_PYTHON
> -
> -
> -ScriptSummaryFormat::ScriptSummaryFormat(const TypeSummaryImpl::Flags& flags,
> -                                         const char * function_name,
> -                                         const char * python_script) :
> -    TypeSummaryImpl(flags),
> -    m_function_name(),
> -    m_python_script(),
> -    m_script_function_sp()
> -{
> -   if (function_name)
> -     m_function_name.assign(function_name);
> -   if (python_script)
> -     m_python_script.assign(python_script);
> -}
> -
> -bool
> -ScriptSummaryFormat::FormatObject(ValueObject *valobj,
> -                                  std::string& retval)
> -{
> -    Timer scoped_timer (__PRETTY_FUNCTION__, __PRETTY_FUNCTION__);
> -
> -    TargetSP target_sp(valobj->GetTargetSP());
> -
> -    if (!target_sp)
> -    {
> -        retval.assign("error: no target");
> -        return false;
> -    }
> -
> -    ScriptInterpreter *script_interpreter = target_sp->GetDebugger().GetCommandInterpreter().GetScriptInterpreter();
> -
> -    if (!script_interpreter)
> -    {
> -        retval.assign("error: no ScriptInterpreter");
> -        return false;
> -    }
> -        
> -    return script_interpreter->GetScriptedSummary(m_function_name.c_str(),
> -                                                  valobj->GetSP(),
> -                                                  m_script_function_sp,
> -                                                  retval);
> -
> -}
> -
> -std::string
> -ScriptSummaryFormat::GetDescription()
> -{
> -    StreamString sstr;
> -    sstr.Printf ("%s%s%s%s%s%s%s\n%s",       Cascades() ? "" : " (not cascading)",
> -                 !DoesPrintChildren() ? "" : " (show children)",
> -                 !DoesPrintValue() ? " (hide value)" : "",
> -                 IsOneliner() ? " (one-line printout)" : "",
> -                 SkipsPointers() ? " (skip pointers)" : "",
> -                 SkipsReferences() ? " (skip references)" : "",
> -                 HideNames() ? " (hide member names)" : "",
> -                 m_python_script.c_str());
> -    return sstr.GetString();
> -    
> -}
> -
> -#endif // #ifndef LLDB_DISABLE_PYTHON
> -
> -std::string
> -TypeFilterImpl::GetDescription()
> -{
> -    StreamString sstr;
> -    sstr.Printf("%s%s%s {\n",
> -                Cascades() ? "" : " (not cascading)",
> -                SkipsPointers() ? " (skip pointers)" : "",
> -                SkipsReferences() ? " (skip references)" : "");
> -    
> -    for (int i = 0; i < GetCount(); i++)
> -    {
> -        sstr.Printf("    %s\n",
> -                    GetExpressionPathAtIndex(i));
> -    }
> -                    
> -    sstr.Printf("}");
> -    return sstr.GetString();
> -}
> -
> -std::string
> -CXXSyntheticChildren::GetDescription()
> -{
> -    StreamString sstr;
> -    sstr.Printf("%s%s%s Generator at %p - %s\n",
> -                Cascades() ? "" : " (not cascading)",
> -                SkipsPointers() ? " (skip pointers)" : "",
> -                SkipsReferences() ? " (skip references)" : "",
> -                m_create_callback,
> -                m_description.c_str());
> -    
> -    return sstr.GetString();
> -}
> -
> -std::string
> -SyntheticArrayView::GetDescription()
> -{
> -    StreamString sstr;
> -    sstr.Printf("%s%s%s {\n",
> -                Cascades() ? "" : " (not cascading)",
> -                SkipsPointers() ? " (skip pointers)" : "",
> -                SkipsReferences() ? " (skip references)" : "");
> -    
> -    SyntheticArrayRange* ptr = &m_head;
> -    while (ptr && ptr != m_tail)
> -    {
> -        if (ptr->GetLow() == ptr->GetHigh())
> -            sstr.Printf("    [%d]\n",
> -                        ptr->GetLow());
> -        else
> -            sstr.Printf("    [%d-%d]\n",
> -                        ptr->GetLow(),
> -                        ptr->GetHigh());
> -        ptr = ptr->GetNext();
> -    }
> -    
> -    sstr.Printf("}");
> -    return sstr.GetString();
> -}
> -
> -#ifndef LLDB_DISABLE_PYTHON
> -
> -TypeSyntheticImpl::FrontEnd::FrontEnd(std::string pclass, ValueObject &backend) :
> -    SyntheticChildrenFrontEnd(backend),
> -    m_python_class(pclass),
> -    m_wrapper_sp(),
> -    m_interpreter(NULL)
> -{
> -    if (backend == LLDB_INVALID_UID)
> -        return;
> -    
> -    TargetSP target_sp = backend.GetTargetSP();
> -    
> -    if (!target_sp)
> -        return;
> -    
> -    m_interpreter = target_sp->GetDebugger().GetCommandInterpreter().GetScriptInterpreter();
> -    
> -    if (m_interpreter != NULL)
> -        m_wrapper_sp = m_interpreter->CreateSyntheticScriptedProvider(m_python_class.c_str(), backend.GetSP());
> -}
> -
> -TypeSyntheticImpl::FrontEnd::~FrontEnd()
> -{
> -}
> -
> -lldb::ValueObjectSP
> -TypeSyntheticImpl::FrontEnd::GetChildAtIndex (size_t idx)
> -{
> -    if (!m_wrapper_sp || !m_interpreter)
> -        return lldb::ValueObjectSP();
> -    
> -    return m_interpreter->GetChildAtIndex(m_wrapper_sp, idx);
> -}
> -
> -std::string
> -TypeSyntheticImpl::GetDescription()
> -{
> -    StreamString sstr;
> -    sstr.Printf("%s%s%s Python class %s",
> -                Cascades() ? "" : " (not cascading)",
> -                SkipsPointers() ? " (skip pointers)" : "",
> -                SkipsReferences() ? " (skip references)" : "",
> -                m_python_class.c_str());
> -    
> -    return sstr.GetString();
> -}
> -
> -#endif // #ifndef LLDB_DISABLE_PYTHON
> -
> -int
> -SyntheticArrayView::GetRealIndexForIndex(size_t i)
> -{
> -    if (i >= GetCount())
> -        return -1;
> -    
> -    SyntheticArrayRange* ptr = &m_head;
> -    
> -    int residual = i;
> -    
> -    while(ptr && ptr != m_tail)
> -    {
> -        if (residual >= ptr->GetSelfCount())
> -        {
> -            residual -= ptr->GetSelfCount();
> -            ptr = ptr->GetNext();
> -        }
> -        
> -        return ptr->GetLow() + residual;
> -    }
> -    
> -    return -1;
> -}
> -
> -uint32_t
> -SyntheticArrayView::FrontEnd::GetIndexOfChildWithName (const ConstString &name_cs)
> -{
> -    const char* name_cstr = name_cs.GetCString();
> -    if (*name_cstr != '[')
> -        return UINT32_MAX;
> -    std::string name(name_cstr+1);
> -    if (name[name.size()-1] != ']')
> -        return UINT32_MAX;
> -    name = name.erase(name.size()-1,1);
> -    int index = Args::StringToSInt32 (name.c_str(), -1);
> -    if (index < 0)
> -        return UINT32_MAX;
> -    return index;
> -}
> 
> Removed: lldb/trunk/source/Core/FormatManager.cpp
> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Core/FormatManager.cpp?rev=173727&view=auto
> ==============================================================================
> --- lldb/trunk/source/Core/FormatManager.cpp (original)
> +++ lldb/trunk/source/Core/FormatManager.cpp (removed)
> @@ -1,1313 +0,0 @@
> -//===-- FormatManager.cpp -------------------------------------------*- C++ -*-===//
> -//
> -//                     The LLVM Compiler Infrastructure
> -//
> -// This file is distributed under the University of Illinois Open Source
> -// License. See LICENSE.TXT for details.
> -//
> -//===----------------------------------------------------------------------===//
> -
> -#include "lldb/lldb-python.h"
> -
> -#include "lldb/Core/FormatManager.h"
> -
> -// C Includes
> -// C++ Includes
> -// Other libraries and framework includes
> -// Project includes
> -
> -#include "lldb/Core/CXXFormatterFunctions.h"
> -#include "lldb/Core/Debugger.h"
> -
> -using namespace lldb;
> -using namespace lldb_private;
> -
> -
> -struct FormatInfo
> -{
> -    Format format;
> -    const char format_char; // One or more format characters that can be used for this format.
> -    const char *format_name;    // Long format name that can be used to specify the current format
> -};
> -
> -static FormatInfo 
> -g_format_infos[] = 
> -{
> -    { eFormatDefault        , '\0'  , "default"             },
> -    { eFormatBoolean        , 'B'   , "boolean"             },
> -    { eFormatBinary         , 'b'   , "binary"              },
> -    { eFormatBytes          , 'y'   , "bytes"               },
> -    { eFormatBytesWithASCII , 'Y'   , "bytes with ASCII"    },
> -    { eFormatChar           , 'c'   , "character"           },
> -    { eFormatCharPrintable  , 'C'   , "printable character" },
> -    { eFormatComplexFloat   , 'F'   , "complex float"       },
> -    { eFormatCString        , 's'   , "c-string"            },
> -    { eFormatDecimal        , 'd'   , "decimal"             },
> -    { eFormatEnum           , 'E'   , "enumeration"         },
> -    { eFormatHex            , 'x'   , "hex"                 },
> -    { eFormatHexUppercase   , 'X'   , "uppercase hex"       },
> -    { eFormatFloat          , 'f'   , "float"               },
> -    { eFormatOctal          , 'o'   , "octal"               },
> -    { eFormatOSType         , 'O'   , "OSType"              },
> -    { eFormatUnicode16      , 'U'   , "unicode16"           },
> -    { eFormatUnicode32      , '\0'  , "unicode32"           },
> -    { eFormatUnsigned       , 'u'   , "unsigned decimal"    },
> -    { eFormatPointer        , 'p'   , "pointer"             },
> -    { eFormatVectorOfChar   , '\0'  , "char[]"              },
> -    { eFormatVectorOfSInt8  , '\0'  , "int8_t[]"            },
> -    { eFormatVectorOfUInt8  , '\0'  , "uint8_t[]"           },
> -    { eFormatVectorOfSInt16 , '\0'  , "int16_t[]"           },
> -    { eFormatVectorOfUInt16 , '\0'  , "uint16_t[]"          },
> -    { eFormatVectorOfSInt32 , '\0'  , "int32_t[]"           },
> -    { eFormatVectorOfUInt32 , '\0'  , "uint32_t[]"          },
> -    { eFormatVectorOfSInt64 , '\0'  , "int64_t[]"           },
> -    { eFormatVectorOfUInt64 , '\0'  , "uint64_t[]"          },
> -    { eFormatVectorOfFloat32, '\0'  , "float32[]"           },
> -    { eFormatVectorOfFloat64, '\0'  , "float64[]"           },
> -    { eFormatVectorOfUInt128, '\0'  , "uint128_t[]"         },
> -    { eFormatComplexInteger , 'I'   , "complex integer"     },
> -    { eFormatCharArray      , 'a'   , "character array"     },
> -    { eFormatAddressInfo    , 'A'   , "address"             },
> -    { eFormatHexFloat       , '\0'  , "hex float"           },
> -    { eFormatInstruction    , 'i'   , "instruction"         },
> -    { eFormatVoid           , 'v'   , "void"                }
> -};
> -
> -static uint32_t 
> -g_num_format_infos = sizeof(g_format_infos)/sizeof(FormatInfo);
> -
> -static bool
> -GetFormatFromFormatChar (char format_char, Format &format)
> -{
> -    for (uint32_t i=0; i<g_num_format_infos; ++i)
> -    {
> -        if (g_format_infos[i].format_char == format_char)
> -        {
> -            format = g_format_infos[i].format;
> -            return true;
> -        }
> -    }
> -    format = eFormatInvalid;
> -    return false;
> -}
> -
> -static bool
> -GetFormatFromFormatName (const char *format_name, bool partial_match_ok, Format &format)
> -{
> -    uint32_t i;
> -    for (i=0; i<g_num_format_infos; ++i)
> -    {
> -        if (strcasecmp (g_format_infos[i].format_name, format_name) == 0)
> -        {
> -            format = g_format_infos[i].format;
> -            return true;
> -        }
> -    }
> -    
> -    if (partial_match_ok)
> -    {
> -        for (i=0; i<g_num_format_infos; ++i)
> -        {
> -            if (strcasestr (g_format_infos[i].format_name, format_name) == g_format_infos[i].format_name)
> -            {
> -                format = g_format_infos[i].format;
> -                return true;
> -            }
> -        }
> -    }
> -    format = eFormatInvalid;
> -    return false;
> -}
> -
> -bool
> -FormatManager::GetFormatFromCString (const char *format_cstr,
> -                                     bool partial_match_ok,
> -                                     lldb::Format &format)
> -{
> -    bool success = false;
> -    if (format_cstr && format_cstr[0])
> -    {
> -        if (format_cstr[1] == '\0')
> -        {
> -            success = GetFormatFromFormatChar (format_cstr[0], format);
> -            if (success)
> -                return true;
> -        }
> -        
> -        success = GetFormatFromFormatName (format_cstr, partial_match_ok, format);
> -    }
> -    if (!success)
> -        format = eFormatInvalid;
> -    return success;
> -}
> -
> -char
> -FormatManager::GetFormatAsFormatChar (lldb::Format format)
> -{
> -    for (uint32_t i=0; i<g_num_format_infos; ++i)
> -    {
> -        if (g_format_infos[i].format == format)
> -            return g_format_infos[i].format_char;
> -    }
> -    return '\0';
> -}
> -    
> -
> -
> -const char *
> -FormatManager::GetFormatAsCString (Format format)
> -{
> -    if (format >= eFormatDefault && format < kNumFormats)
> -        return g_format_infos[format].format_name;
> -    return NULL;
> -}
> -
> -TypeCategoryImpl::TypeCategoryImpl(IFormatChangeListener* clist,
> -                                   ConstString name) :
> -    m_summary_nav(new SummaryNavigator("summary",clist)),
> -    m_regex_summary_nav(new RegexSummaryNavigator("regex-summary",clist)),
> -    m_filter_nav(new FilterNavigator("filter",clist)),
> -    m_regex_filter_nav(new RegexFilterNavigator("regex-filter",clist)),
> -#ifndef LLDB_DISABLE_PYTHON
> -    m_synth_nav(new SynthNavigator("synth",clist)),
> -    m_regex_synth_nav(new RegexSynthNavigator("regex-synth",clist)),
> -#endif
> -    m_enabled(false),
> -    m_change_listener(clist),
> -    m_mutex(Mutex::eMutexTypeRecursive),
> -    m_name(name)
> -{}
> -
> -bool
> -TypeCategoryImpl::Get (ValueObject& valobj,
> -                     lldb::TypeSummaryImplSP& entry,
> -                     lldb::DynamicValueType use_dynamic,
> -                     uint32_t* reason)
> -{
> -    if (!IsEnabled())
> -        return false;
> -    if (GetSummaryNavigator()->Get(valobj, entry, use_dynamic, reason))
> -        return true;
> -    bool regex = GetRegexSummaryNavigator()->Get(valobj, entry, use_dynamic, reason);
> -    if (regex && reason)
> -        *reason |= lldb_private::eFormatterChoiceCriterionRegularExpressionSummary;
> -    return regex;
> -}
> -
> -bool
> -TypeCategoryImpl::Get(ValueObject& valobj,
> -                    lldb::SyntheticChildrenSP& entry_sp,
> -                    lldb::DynamicValueType use_dynamic,
> -                    uint32_t* reason)
> -{
> -    if (!IsEnabled())
> -        return false;
> -    TypeFilterImpl::SharedPointer filter_sp;
> -    uint32_t reason_filter = 0;
> -    bool regex_filter = false;
> -    // first find both Filter and Synth, and then check which is most recent
> -    
> -    if (!GetFilterNavigator()->Get(valobj, filter_sp, use_dynamic, &reason_filter))
> -        regex_filter = GetRegexFilterNavigator()->Get (valobj, filter_sp, use_dynamic, &reason_filter);
> -
> -#ifndef LLDB_DISABLE_PYTHON
> -    bool regex_synth = false;
> -    uint32_t reason_synth = 0;    
> -    bool pick_synth = false;
> -    TypeSyntheticImpl::SharedPointer synth;
> -    if (!GetSyntheticNavigator()->Get(valobj, synth, use_dynamic, &reason_synth))
> -        regex_synth = GetRegexSyntheticNavigator()->Get (valobj, synth, use_dynamic, &reason_synth);
> -    if (!filter_sp.get() && !synth.get())
> -        return false;
> -    else if (!filter_sp.get() && synth.get())
> -        pick_synth = true;
> -    
> -    else if (filter_sp.get() && !synth.get())
> -        pick_synth = false;
> -    
> -    else /*if (filter_sp.get() && synth.get())*/
> -    {
> -        if (filter_sp->GetRevision() > synth->GetRevision())
> -            pick_synth = false;
> -        else
> -            pick_synth = true;
> -    }
> -    if (pick_synth)
> -    {
> -        if (regex_synth && reason)
> -            *reason |= lldb_private::eFormatterChoiceCriterionRegularExpressionFilter;
> -        entry_sp = synth;
> -        return true;
> -    }
> -    else
> -    {
> -        if (regex_filter && reason)
> -            *reason |= lldb_private::eFormatterChoiceCriterionRegularExpressionFilter;
> -        entry_sp = filter_sp;
> -        return true;
> -    }
> -
> -#else
> -    if (filter_sp)
> -    {
> -        entry_sp = filter_sp;
> -        return true;
> -    }
> -#endif
> -
> -    return false;    
> -    
> -}
> -
> -void
> -TypeCategoryImpl::Clear (FormatCategoryItems items)
> -{
> -    if ( (items & eFormatCategoryItemSummary) == eFormatCategoryItemSummary )
> -        m_summary_nav->Clear();
> -    if ( (items & eFormatCategoryItemRegexSummary) == eFormatCategoryItemRegexSummary )
> -        m_regex_summary_nav->Clear();
> -    if ( (items & eFormatCategoryItemFilter)  == eFormatCategoryItemFilter )
> -        m_filter_nav->Clear();
> -    if ( (items & eFormatCategoryItemRegexFilter) == eFormatCategoryItemRegexFilter )
> -        m_regex_filter_nav->Clear();
> -#ifndef LLDB_DISABLE_PYTHON
> -    if ( (items & eFormatCategoryItemSynth)  == eFormatCategoryItemSynth )
> -        m_synth_nav->Clear();
> -    if ( (items & eFormatCategoryItemRegexSynth) == eFormatCategoryItemRegexSynth )
> -        m_regex_synth_nav->Clear();
> -#endif
> -}
> -
> -bool
> -TypeCategoryImpl::Delete (ConstString name,
> -                        FormatCategoryItems items)
> -{
> -    bool success = false;
> -    if ( (items & eFormatCategoryItemSummary) == eFormatCategoryItemSummary )
> -        success = m_summary_nav->Delete(name) || success;
> -    if ( (items & eFormatCategoryItemRegexSummary) == eFormatCategoryItemRegexSummary )
> -        success = m_regex_summary_nav->Delete(name) || success;
> -    if ( (items & eFormatCategoryItemFilter)  == eFormatCategoryItemFilter )
> -        success = m_filter_nav->Delete(name) || success;
> -    if ( (items & eFormatCategoryItemRegexFilter) == eFormatCategoryItemRegexFilter )
> -        success = m_regex_filter_nav->Delete(name) || success;
> -#ifndef LLDB_DISABLE_PYTHON
> -    if ( (items & eFormatCategoryItemSynth)  == eFormatCategoryItemSynth )
> -        success = m_synth_nav->Delete(name) || success;
> -    if ( (items & eFormatCategoryItemRegexSynth) == eFormatCategoryItemRegexSynth )
> -        success = m_regex_synth_nav->Delete(name) || success;
> -#endif
> -    return success;
> -}
> -
> -uint32_t
> -TypeCategoryImpl::GetCount (FormatCategoryItems items)
> -{
> -    uint32_t count = 0;
> -    if ( (items & eFormatCategoryItemSummary) == eFormatCategoryItemSummary )
> -        count += m_summary_nav->GetCount();
> -    if ( (items & eFormatCategoryItemRegexSummary) == eFormatCategoryItemRegexSummary )
> -        count += m_regex_summary_nav->GetCount();
> -    if ( (items & eFormatCategoryItemFilter)  == eFormatCategoryItemFilter )
> -        count += m_filter_nav->GetCount();
> -    if ( (items & eFormatCategoryItemRegexFilter) == eFormatCategoryItemRegexFilter )
> -        count += m_regex_filter_nav->GetCount();
> -#ifndef LLDB_DISABLE_PYTHON
> -    if ( (items & eFormatCategoryItemSynth)  == eFormatCategoryItemSynth )
> -        count += m_synth_nav->GetCount();
> -    if ( (items & eFormatCategoryItemRegexSynth) == eFormatCategoryItemRegexSynth )
> -        count += m_regex_synth_nav->GetCount();
> -#endif
> -    return count;
> -}
> -
> -bool
> -TypeCategoryImpl::AnyMatches(ConstString type_name,
> -                           FormatCategoryItems items,
> -                           bool only_enabled,
> -                           const char** matching_category,
> -                           FormatCategoryItems* matching_type)
> -{
> -    if (!IsEnabled() && only_enabled)
> -        return false;
> -    
> -    lldb::TypeSummaryImplSP summary;
> -    TypeFilterImpl::SharedPointer filter;
> -#ifndef LLDB_DISABLE_PYTHON
> -    TypeSyntheticImpl::SharedPointer synth;
> -#endif
> -    
> -    if ( (items & eFormatCategoryItemSummary) == eFormatCategoryItemSummary )
> -    {
> -        if (m_summary_nav->Get(type_name, summary))
> -        {
> -            if (matching_category)
> -                *matching_category = m_name.GetCString();
> -            if (matching_type)
> -                *matching_type = eFormatCategoryItemSummary;
> -            return true;
> -        }
> -    }
> -    if ( (items & eFormatCategoryItemRegexSummary) == eFormatCategoryItemRegexSummary )
> -    {
> -        if (m_regex_summary_nav->Get(type_name, summary))
> -        {
> -            if (matching_category)
> -                *matching_category = m_name.GetCString();
> -            if (matching_type)
> -                *matching_type = eFormatCategoryItemRegexSummary;
> -            return true;
> -        }
> -    }
> -    if ( (items & eFormatCategoryItemFilter)  == eFormatCategoryItemFilter )
> -    {
> -        if (m_filter_nav->Get(type_name, filter))
> -        {
> -            if (matching_category)
> -                *matching_category = m_name.GetCString();
> -            if (matching_type)
> -                *matching_type = eFormatCategoryItemFilter;
> -            return true;
> -        }
> -    }
> -    if ( (items & eFormatCategoryItemRegexFilter) == eFormatCategoryItemRegexFilter )
> -    {
> -        if (m_regex_filter_nav->Get(type_name, filter))
> -        {
> -            if (matching_category)
> -                *matching_category = m_name.GetCString();
> -            if (matching_type)
> -                *matching_type = eFormatCategoryItemRegexFilter;
> -            return true;
> -        }
> -    }
> -#ifndef LLDB_DISABLE_PYTHON
> -    if ( (items & eFormatCategoryItemSynth)  == eFormatCategoryItemSynth )
> -    {
> -        if (m_synth_nav->Get(type_name, synth))
> -        {
> -            if (matching_category)
> -                *matching_category = m_name.GetCString();
> -            if (matching_type)
> -                *matching_type = eFormatCategoryItemSynth;
> -            return true;
> -        }
> -    }
> -    if ( (items & eFormatCategoryItemRegexSynth) == eFormatCategoryItemRegexSynth )
> -    {
> -        if (m_regex_synth_nav->Get(type_name, synth))
> -        {
> -            if (matching_category)
> -                *matching_category = m_name.GetCString();
> -            if (matching_type)
> -                *matching_type = eFormatCategoryItemRegexSynth;
> -            return true;
> -        }
> -    }
> -#endif
> -    return false;
> -}
> -
> -bool
> -CategoryMap::AnyMatches (ConstString type_name,
> -                         TypeCategoryImpl::FormatCategoryItems items,
> -                         bool only_enabled,
> -                         const char** matching_category,
> -                         TypeCategoryImpl::FormatCategoryItems* matching_type)
> -{
> -    Mutex::Locker locker(m_map_mutex);
> -    
> -    MapIterator pos, end = m_map.end();
> -    for (pos = m_map.begin(); pos != end; pos++)
> -    {
> -        if (pos->second->AnyMatches(type_name,
> -                                    items,
> -                                    only_enabled,
> -                                    matching_category,
> -                                    matching_type))
> -            return true;
> -    }
> -    return false;
> -}
> -
> -lldb::TypeSummaryImplSP
> -CategoryMap::GetSummaryFormat (ValueObject& valobj,
> -                               lldb::DynamicValueType use_dynamic)
> -{
> -    Mutex::Locker locker(m_map_mutex);
> -    
> -    uint32_t reason_why;        
> -    ActiveCategoriesIterator begin, end = m_active_categories.end();
> -    
> -    LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_TYPES));
> -    
> -    for (begin = m_active_categories.begin(); begin != end; begin++)
> -    {
> -        lldb::TypeCategoryImplSP category_sp = *begin;
> -        lldb::TypeSummaryImplSP current_format;
> -        if (log)
> -            log->Printf("[CategoryMap::GetSummaryFormat] Trying to use category %s\n", category_sp->GetName());
> -        if (!category_sp->Get(valobj, current_format, use_dynamic, &reason_why))
> -            continue;
> -        return current_format;
> -    }
> -    if (log)
> -        log->Printf("[CategoryMap::GetSummaryFormat] nothing found - returning empty SP\n");
> -    return lldb::TypeSummaryImplSP();
> -}
> -
> -lldb::TypeSummaryImplSP
> -FormatManager::GetSummaryForType (lldb::TypeNameSpecifierImplSP type_sp)
> -{
> -    if (!type_sp)
> -        return lldb::TypeSummaryImplSP();
> -    lldb::TypeSummaryImplSP summary_chosen_sp;
> -    uint32_t num_categories = m_categories_map.GetCount();
> -    lldb::TypeCategoryImplSP category_sp;
> -    uint32_t prio_category = UINT32_MAX;
> -    for (uint32_t category_id = 0;
> -         category_id < num_categories;
> -         category_id++)
> -    {
> -        category_sp = GetCategoryAtIndex(category_id);
> -        if (category_sp->IsEnabled() == false)
> -            continue;
> -        lldb::TypeSummaryImplSP summary_current_sp = category_sp->GetSummaryForType(type_sp);
> -        if (summary_current_sp && (summary_chosen_sp.get() == NULL || (prio_category > category_sp->GetEnabledPosition())))
> -        {
> -            prio_category = category_sp->GetEnabledPosition();
> -            summary_chosen_sp = summary_current_sp;
> -        }
> -    }
> -    return summary_chosen_sp;
> -}
> -
> -lldb::TypeFilterImplSP
> -FormatManager::GetFilterForType (lldb::TypeNameSpecifierImplSP type_sp)
> -{
> -    if (!type_sp)
> -        return lldb::TypeFilterImplSP();
> -    lldb::TypeFilterImplSP filter_chosen_sp;
> -    uint32_t num_categories = m_categories_map.GetCount();
> -    lldb::TypeCategoryImplSP category_sp;
> -    uint32_t prio_category = UINT32_MAX;
> -    for (uint32_t category_id = 0;
> -         category_id < num_categories;
> -         category_id++)
> -    {
> -        category_sp = GetCategoryAtIndex(category_id);
> -        if (category_sp->IsEnabled() == false)
> -            continue;
> -        lldb::TypeFilterImplSP filter_current_sp((TypeFilterImpl*)category_sp->GetFilterForType(type_sp).get());
> -        if (filter_current_sp && (filter_chosen_sp.get() == NULL || (prio_category > category_sp->GetEnabledPosition())))
> -        {
> -            prio_category = category_sp->GetEnabledPosition();
> -            filter_chosen_sp = filter_current_sp;
> -        }
> -    }
> -    return filter_chosen_sp;
> -}
> -
> -#ifndef LLDB_DISABLE_PYTHON
> -lldb::TypeSyntheticImplSP
> -FormatManager::GetSyntheticForType (lldb::TypeNameSpecifierImplSP type_sp)
> -{
> -    if (!type_sp)
> -        return lldb::TypeSyntheticImplSP();
> -    lldb::TypeSyntheticImplSP synth_chosen_sp;
> -    uint32_t num_categories = m_categories_map.GetCount();
> -    lldb::TypeCategoryImplSP category_sp;
> -    uint32_t prio_category = UINT32_MAX;
> -    for (uint32_t category_id = 0;
> -         category_id < num_categories;
> -         category_id++)
> -    {
> -        category_sp = GetCategoryAtIndex(category_id);
> -        if (category_sp->IsEnabled() == false)
> -            continue;
> -        lldb::TypeSyntheticImplSP synth_current_sp((TypeSyntheticImpl*)category_sp->GetSyntheticForType(type_sp).get());
> -        if (synth_current_sp && (synth_chosen_sp.get() == NULL || (prio_category > category_sp->GetEnabledPosition())))
> -        {
> -            prio_category = category_sp->GetEnabledPosition();
> -            synth_chosen_sp = synth_current_sp;
> -        }
> -    }
> -    return synth_chosen_sp;
> -}
> -#endif
> -
> -#ifndef LLDB_DISABLE_PYTHON
> -lldb::SyntheticChildrenSP
> -FormatManager::GetSyntheticChildrenForType (lldb::TypeNameSpecifierImplSP type_sp)
> -{
> -    if (!type_sp)
> -        return lldb::SyntheticChildrenSP();
> -    lldb::TypeFilterImplSP filter_sp = GetFilterForType(type_sp);
> -    lldb::TypeSyntheticImplSP synth_sp = GetSyntheticForType(type_sp);
> -    if (filter_sp->GetRevision() > synth_sp->GetRevision())
> -        return lldb::SyntheticChildrenSP(filter_sp.get());
> -    else
> -        return lldb::SyntheticChildrenSP(synth_sp.get());
> -}
> -#endif
> -
> -#ifndef LLDB_DISABLE_PYTHON
> -lldb::SyntheticChildrenSP
> -CategoryMap::GetSyntheticChildren (ValueObject& valobj,
> -                                   lldb::DynamicValueType use_dynamic)
> -{
> -    Mutex::Locker locker(m_map_mutex);
> -    
> -    uint32_t reason_why;
> -    
> -    ActiveCategoriesIterator begin, end = m_active_categories.end();
> -    
> -    LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_TYPES));
> -    
> -    for (begin = m_active_categories.begin(); begin != end; begin++)
> -    {
> -        lldb::TypeCategoryImplSP category_sp = *begin;
> -        lldb::SyntheticChildrenSP current_format;
> -        if (log)
> -            log->Printf("[CategoryMap::GetSyntheticChildren] Trying to use category %s\n", category_sp->GetName());
> -        if (!category_sp->Get(valobj, current_format, use_dynamic, &reason_why))
> -            continue;
> -        return current_format;
> -    }
> -    if (log)
> -        log->Printf("[CategoryMap::GetSyntheticChildren] nothing found - returning empty SP\n");
> -    return lldb::SyntheticChildrenSP();
> -}
> -#endif
> -
> -void
> -CategoryMap::LoopThrough(CallbackType callback, void* param)
> -{
> -    if (callback)
> -    {
> -        Mutex::Locker locker(m_map_mutex);
> -        
> -        // loop through enabled categories in respective order
> -        {
> -            ActiveCategoriesIterator begin, end = m_active_categories.end();
> -            for (begin = m_active_categories.begin(); begin != end; begin++)
> -            {
> -                lldb::TypeCategoryImplSP category = *begin;
> -                ConstString type = ConstString(category->GetName());
> -                if (!callback(param, category))
> -                    break;
> -            }
> -        }
> -        
> -        // loop through disabled categories in just any order
> -        {
> -            MapIterator pos, end = m_map.end();
> -            for (pos = m_map.begin(); pos != end; pos++)
> -            {
> -                if (pos->second->IsEnabled())
> -                    continue;
> -                KeyType type = pos->first;
> -                if (!callback(param, pos->second))
> -                    break;
> -            }
> -        }
> -    }
> -}
> -
> -TypeCategoryImplSP
> -CategoryMap::GetAtIndex (size_t index)
> -{
> -    Mutex::Locker locker(m_map_mutex);
> -    
> -    if (index < m_map.size())
> -    {
> -        MapIterator pos, end = m_map.end();
> -        for (pos = m_map.begin(); pos != end; pos++)
> -        {
> -            if (index == 0)
> -                return pos->second;
> -            index--;
> -        }
> -    }
> -    
> -    return TypeCategoryImplSP();
> -}
> -
> -lldb::TypeCategoryImplSP
> -FormatManager::GetCategory (const ConstString& category_name,
> -                         bool can_create)
> -{
> -    if (!category_name)
> -        return GetCategory(m_default_category_name);
> -    lldb::TypeCategoryImplSP category;
> -    if (m_categories_map.Get(category_name, category))
> -        return category;
> -    
> -    if (!can_create)
> -        return lldb::TypeCategoryImplSP();
> -    
> -    m_categories_map.Add(category_name,lldb::TypeCategoryImplSP(new TypeCategoryImpl(this, category_name)));
> -    return GetCategory(category_name);
> -}
> -
> -lldb::Format
> -FormatManager::GetSingleItemFormat(lldb::Format vector_format)
> -{
> -    switch(vector_format)
> -    {
> -        case eFormatVectorOfChar:
> -            return eFormatCharArray;
> -            
> -        case eFormatVectorOfSInt8:
> -        case eFormatVectorOfSInt16:
> -        case eFormatVectorOfSInt32:
> -        case eFormatVectorOfSInt64:
> -            return eFormatDecimal;
> -            
> -        case eFormatVectorOfUInt8:
> -        case eFormatVectorOfUInt16:
> -        case eFormatVectorOfUInt32:
> -        case eFormatVectorOfUInt64:
> -        case eFormatVectorOfUInt128:
> -            return eFormatHex;
> -            
> -        case eFormatVectorOfFloat32:
> -        case eFormatVectorOfFloat64:
> -            return eFormatFloat;
> -            
> -        default:
> -            return lldb::eFormatInvalid;
> -    }
> -}
> -
> -ConstString
> -FormatManager::GetValidTypeName (const ConstString& type)
> -{
> -    return ::GetValidTypeName_Impl(type);
> -}
> -
> -FormatManager::FormatManager() : 
> -    m_value_nav("format",this),
> -    m_named_summaries_map(this),
> -    m_last_revision(0),
> -    m_categories_map(this),
> -    m_default_category_name(ConstString("default")),
> -    m_system_category_name(ConstString("system")), 
> -    m_gnu_cpp_category_name(ConstString("gnu-libstdc++")),
> -    m_libcxx_category_name(ConstString("libcxx")),
> -    m_objc_category_name(ConstString("objc")),
> -    m_corefoundation_category_name(ConstString("CoreFoundation")),
> -    m_coregraphics_category_name(ConstString("CoreGraphics")),
> -    m_coreservices_category_name(ConstString("CoreServices")),
> -    m_vectortypes_category_name(ConstString("VectorTypes")),
> -    m_appkit_category_name(ConstString("AppKit"))
> -{
> -    
> -    LoadSystemFormatters();
> -    LoadLibStdcppFormatters();
> -    LoadLibcxxFormatters();
> -    LoadObjCFormatters();
> -    
> -    EnableCategory(m_objc_category_name,CategoryMap::Last);
> -    EnableCategory(m_corefoundation_category_name,CategoryMap::Last);
> -    EnableCategory(m_appkit_category_name,CategoryMap::Last);
> -    EnableCategory(m_coreservices_category_name,CategoryMap::Last);
> -    EnableCategory(m_coregraphics_category_name,CategoryMap::Last);
> -    EnableCategory(m_gnu_cpp_category_name,CategoryMap::Last);
> -    EnableCategory(m_libcxx_category_name,CategoryMap::Last);
> -    EnableCategory(m_vectortypes_category_name,CategoryMap::Last);
> -    EnableCategory(m_system_category_name,CategoryMap::Last);
> -}
> -
> -static void
> -AddStringSummary(TypeCategoryImpl::SharedPointer category_sp,
> -                 const char* string,
> -                 ConstString type_name,
> -                 TypeSummaryImpl::Flags flags)
> -{
> -    lldb::TypeSummaryImplSP summary_sp(new StringSummaryFormat(flags,
> -                                                               string));
> -    category_sp->GetSummaryNavigator()->Add(type_name,
> -                                            summary_sp);
> -}
> -
> -#ifndef LLDB_DISABLE_PYTHON
> -static void
> -AddScriptSummary(TypeCategoryImpl::SharedPointer category_sp,
> -                 const char* funct_name,
> -                 ConstString type_name,
> -                 TypeSummaryImpl::Flags flags)
> -{
> -    
> -    std::string code("     ");
> -    code.append(funct_name).append("(valobj,internal_dict)");
> -    
> -    lldb::TypeSummaryImplSP summary_sp(new ScriptSummaryFormat(flags,
> -                                                               funct_name,
> -                                                               code.c_str()));
> -    category_sp->GetSummaryNavigator()->Add(type_name,
> -                                            summary_sp);
> -}
> -#endif
> -
> -#ifndef LLDB_DISABLE_PYTHON
> -static void
> -AddCXXSummary (TypeCategoryImpl::SharedPointer category_sp,
> -               CXXFunctionSummaryFormat::Callback funct,
> -               const char* description,
> -               ConstString type_name,
> -               TypeSummaryImpl::Flags flags)
> -{
> -    lldb::TypeSummaryImplSP summary_sp(new CXXFunctionSummaryFormat(flags,funct,description));
> -    category_sp->GetSummaryNavigator()->Add(type_name,
> -                                            summary_sp);
> -}
> -#endif
> -
> -#ifndef LLDB_DISABLE_PYTHON
> -static void AddCXXSynthetic  (TypeCategoryImpl::SharedPointer category_sp,
> -                              CXXSyntheticChildren::CreateFrontEndCallback generator,
> -                              const char* description,
> -                              ConstString type_name,
> -                              TypeSyntheticImpl::Flags flags)
> -{
> -    lldb::SyntheticChildrenSP synth_sp(new CXXSyntheticChildren(flags,description,generator));
> -    category_sp->GetSyntheticNavigator()->Add(type_name,synth_sp);
> -}
> -#endif
> -
> -void
> -FormatManager::LoadLibStdcppFormatters()
> -{
> -    TypeSummaryImpl::Flags stl_summary_flags;
> -    stl_summary_flags.SetCascades(true)
> -    .SetSkipPointers(false)
> -    .SetSkipReferences(false)
> -    .SetDontShowChildren(true)
> -    .SetDontShowValue(true)
> -    .SetShowMembersOneLiner(false)
> -    .SetHideItemNames(false);
> -    
> -    lldb::TypeSummaryImplSP std_string_summary_sp(new StringSummaryFormat(stl_summary_flags,
> -                                                                          "${var._M_dataplus._M_p}"));
> -    
> -    TypeCategoryImpl::SharedPointer gnu_category_sp = GetCategory(m_gnu_cpp_category_name);
> -    
> -    gnu_category_sp->GetSummaryNavigator()->Add(ConstString("std::string"),
> -                                                std_string_summary_sp);
> -    gnu_category_sp->GetSummaryNavigator()->Add(ConstString("std::basic_string<char>"),
> -                                                std_string_summary_sp);
> -    gnu_category_sp->GetSummaryNavigator()->Add(ConstString("std::basic_string<char,std::char_traits<char>,std::allocator<char> >"),
> -                                                std_string_summary_sp);
> -    gnu_category_sp->GetSummaryNavigator()->Add(ConstString("std::basic_string<char, std::char_traits<char>, std::allocator<char> >"),
> -                                                std_string_summary_sp);
> -    
> -    // making sure we force-pick the summary for printing wstring (_M_p is a wchar_t*)
> -    lldb::TypeSummaryImplSP std_wstring_summary_sp(new StringSummaryFormat(stl_summary_flags,
> -                                                                           "${var._M_dataplus._M_p%S}"));
> -    
> -    gnu_category_sp->GetSummaryNavigator()->Add(ConstString("std::wstring"),
> -                                                std_wstring_summary_sp);
> -    gnu_category_sp->GetSummaryNavigator()->Add(ConstString("std::basic_string<wchar_t>"),
> -                                                std_wstring_summary_sp);
> -    gnu_category_sp->GetSummaryNavigator()->Add(ConstString("std::basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t> >"),
> -                                                std_wstring_summary_sp);
> -    gnu_category_sp->GetSummaryNavigator()->Add(ConstString("std::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >"),
> -                                                std_wstring_summary_sp);
> -    
> -    
> -#ifndef LLDB_DISABLE_PYTHON
> -    
> -    SyntheticChildren::Flags stl_synth_flags;
> -    stl_synth_flags.SetCascades(true).SetSkipPointers(false).SetSkipReferences(false);
> -    
> -    gnu_category_sp->GetRegexSyntheticNavigator()->Add(RegularExpressionSP(new RegularExpression("^std::vector<.+>(( )?&)?$")),
> -                                                       SyntheticChildrenSP(new TypeSyntheticImpl(stl_synth_flags,
> -                                                                                                 "lldb.formatters.cpp.gnu_libstdcpp.StdVectorSynthProvider")));
> -    gnu_category_sp->GetRegexSyntheticNavigator()->Add(RegularExpressionSP(new RegularExpression("^std::map<.+> >(( )?&)?$")),
> -                                                       SyntheticChildrenSP(new TypeSyntheticImpl(stl_synth_flags,
> -                                                                                                 "lldb.formatters.cpp.gnu_libstdcpp.StdMapSynthProvider")));
> -    gnu_category_sp->GetRegexSyntheticNavigator()->Add(RegularExpressionSP(new RegularExpression("^std::list<.+>(( )?&)?$")),
> -                                                       SyntheticChildrenSP(new TypeSyntheticImpl(stl_synth_flags,
> -                                                                                                 "lldb.formatters.cpp.gnu_libstdcpp.StdListSynthProvider")));
> -    
> -    stl_summary_flags.SetDontShowChildren(false);
> -    gnu_category_sp->GetRegexSummaryNavigator()->Add(RegularExpressionSP(new RegularExpression("^std::vector<.+>(( )?&)?$")),
> -                                                     TypeSummaryImplSP(new StringSummaryFormat(stl_summary_flags,
> -                                                                                               "size=${svar%#}")));
> -    gnu_category_sp->GetRegexSummaryNavigator()->Add(RegularExpressionSP(new RegularExpression("^std::map<.+> >(( )?&)?$")),
> -                                                     TypeSummaryImplSP(new StringSummaryFormat(stl_summary_flags,
> -                                                                                               "size=${svar%#}")));
> -    gnu_category_sp->GetRegexSummaryNavigator()->Add(RegularExpressionSP(new RegularExpression("^std::list<.+>(( )?&)?$")),
> -                                                     TypeSummaryImplSP(new StringSummaryFormat(stl_summary_flags,
> -                                                                                               "size=${svar%#}")));
> -#endif
> -}
> -
> -void
> -FormatManager::LoadLibcxxFormatters()
> -{
> -    TypeSummaryImpl::Flags stl_summary_flags;
> -    stl_summary_flags.SetCascades(true)
> -    .SetSkipPointers(false)
> -    .SetSkipReferences(false)
> -    .SetDontShowChildren(true)
> -    .SetDontShowValue(true)
> -    .SetShowMembersOneLiner(false)
> -    .SetHideItemNames(false);
> -    
> -#ifndef LLDB_DISABLE_PYTHON
> -    //std::string code("     lldb.formatters.cpp.libcxx.stdstring_SummaryProvider(valobj,internal_dict)");
> -    //lldb::TypeSummaryImplSP std_string_summary_sp(new ScriptSummaryFormat(stl_summary_flags, "lldb.formatters.cpp.libcxx.stdstring_SummaryProvider",code.c_str()));
> -    
> -    lldb::TypeSummaryImplSP std_string_summary_sp(new CXXFunctionSummaryFormat(stl_summary_flags, lldb_private::formatters::LibcxxStringSummaryProvider, "std::string summary provider"));
> -    lldb::TypeSummaryImplSP std_wstring_summary_sp(new CXXFunctionSummaryFormat(stl_summary_flags, lldb_private::formatters::LibcxxWStringSummaryProvider, "std::wstring summary provider"));
> -
> -    TypeCategoryImpl::SharedPointer libcxx_category_sp = GetCategory(m_libcxx_category_name);
> -    
> -    libcxx_category_sp->GetSummaryNavigator()->Add(ConstString("std::__1::string"),
> -                                                   std_string_summary_sp);
> -    libcxx_category_sp->GetSummaryNavigator()->Add(ConstString("std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >"),
> -                                                   std_string_summary_sp);
> -
> -    libcxx_category_sp->GetSummaryNavigator()->Add(ConstString("std::__1::wstring"),
> -                                                   std_wstring_summary_sp);
> -    libcxx_category_sp->GetSummaryNavigator()->Add(ConstString("std::__1::basic_string<wchar_t, std::__1::char_traits<wchar_t>, std::__1::allocator<wchar_t> >"),
> -                                                   std_wstring_summary_sp);
> -    
> -    SyntheticChildren::Flags stl_synth_flags;
> -    stl_synth_flags.SetCascades(true).SetSkipPointers(false).SetSkipReferences(false);
> -    
> -    libcxx_category_sp->GetRegexSyntheticNavigator()->Add(RegularExpressionSP(new RegularExpression("^std::__1::vector<.+>(( )?&)?$")),
> -                                                       SyntheticChildrenSP(new TypeSyntheticImpl(stl_synth_flags,
> -                                                                                                 "lldb.formatters.cpp.libcxx.stdvector_SynthProvider")));
> -    libcxx_category_sp->GetRegexSyntheticNavigator()->Add(RegularExpressionSP(new RegularExpression("^std::__1::list<.+>(( )?&)?$")),
> -                                                       SyntheticChildrenSP(new TypeSyntheticImpl(stl_synth_flags,
> -                                                                                                 "lldb.formatters.cpp.libcxx.stdlist_SynthProvider")));
> -    libcxx_category_sp->GetRegexSyntheticNavigator()->Add(RegularExpressionSP(new RegularExpression("^std::__1::map<.+> >(( )?&)?$")),
> -                                                       SyntheticChildrenSP(new TypeSyntheticImpl(stl_synth_flags,
> -                                                                                                 "lldb.formatters.cpp.libcxx.stdmap_SynthProvider")));
> -    libcxx_category_sp->GetRegexSyntheticNavigator()->Add(RegularExpressionSP(new RegularExpression("^(std::__1::)deque<.+>(( )?&)?$")),
> -                                                          SyntheticChildrenSP(new TypeSyntheticImpl(stl_synth_flags,
> -                                                                                                    "lldb.formatters.cpp.libcxx.stddeque_SynthProvider")));
> -    libcxx_category_sp->GetRegexSyntheticNavigator()->Add(RegularExpressionSP(new RegularExpression("^(std::__1::)shared_ptr<.+>(( )?&)?$")),
> -                                                          SyntheticChildrenSP(new TypeSyntheticImpl(stl_synth_flags,
> -                                                                                                    "lldb.formatters.cpp.libcxx.stdsharedptr_SynthProvider")));
> -    libcxx_category_sp->GetRegexSyntheticNavigator()->Add(RegularExpressionSP(new RegularExpression("^(std::__1::)weak_ptr<.+>(( )?&)?$")),
> -                                                          SyntheticChildrenSP(new TypeSyntheticImpl(stl_synth_flags,
> -                                                                                                    "lldb.formatters.cpp.libcxx.stdsharedptr_SynthProvider")));
> -    
> -    stl_summary_flags.SetDontShowChildren(false);stl_summary_flags.SetSkipPointers(true);
> -    libcxx_category_sp->GetRegexSummaryNavigator()->Add(RegularExpressionSP(new RegularExpression("^std::__1::vector<.+>(( )?&)?$")),
> -                                                        TypeSummaryImplSP(new StringSummaryFormat(stl_summary_flags, "size=${svar%#}")));
> -    libcxx_category_sp->GetRegexSummaryNavigator()->Add(RegularExpressionSP(new RegularExpression("^std::__1::list<.+>(( )?&)?$")),
> -                                                        TypeSummaryImplSP(new StringSummaryFormat(stl_summary_flags, "size=${svar%#}")));
> -    libcxx_category_sp->GetRegexSummaryNavigator()->Add(RegularExpressionSP(new RegularExpression("^std::__1::map<.+> >(( )?&)?$")),
> -                                                        TypeSummaryImplSP(new StringSummaryFormat(stl_summary_flags, "size=${svar%#}")));
> -    libcxx_category_sp->GetRegexSummaryNavigator()->Add(RegularExpressionSP(new RegularExpression("^std::__1::deque<.+>(( )?&)?$")),
> -                                                        TypeSummaryImplSP(new StringSummaryFormat(stl_summary_flags, "size=${svar%#}")));
> -    libcxx_category_sp->GetRegexSummaryNavigator()->Add(RegularExpressionSP(new RegularExpression("^std::__1::shared_ptr<.+>(( )?&)?$")),
> -                                                        TypeSummaryImplSP(new StringSummaryFormat(stl_summary_flags, "{${var.__ptr_%S}} (strong=${var.count} weak=${var.weak_count})")));
> -    libcxx_category_sp->GetRegexSummaryNavigator()->Add(RegularExpressionSP(new RegularExpression("^std::__1::weak_ptr<.+>(( )?&)?$")),
> -                                                        TypeSummaryImplSP(new StringSummaryFormat(stl_summary_flags, "{${var.__ptr_%S}} (strong=${var.count} weak=${var.weak_count})")));
> -    
> -    // this summary prevails on the regex std::vector<> because we do exact matches before regex ones
> -    libcxx_category_sp->GetSummaryNavigator()->Add(ConstString("std::__1::vector<std::__1::allocator<bool> >"),
> -                                                   TypeSummaryImplSP(new StringSummaryFormat(stl_summary_flags, "size=${var.__size_}")));
> -
> -#endif
> -}
> -
> -void
> -FormatManager::LoadSystemFormatters()
> -{
> -    
> -    TypeSummaryImpl::Flags string_flags;
> -    string_flags.SetCascades(false)
> -    .SetSkipPointers(true)
> -    .SetSkipReferences(false)
> -    .SetDontShowChildren(true)
> -    .SetDontShowValue(false)
> -    .SetShowMembersOneLiner(false)
> -    .SetHideItemNames(false);
> -    
> -    lldb::TypeSummaryImplSP string_format(new StringSummaryFormat(string_flags, "${var%s}"));
> -    
> -    
> -    lldb::TypeSummaryImplSP string_array_format(new StringSummaryFormat(TypeSummaryImpl::Flags().SetCascades(false)
> -                                                                        .SetSkipPointers(true)
> -                                                                        .SetSkipReferences(false)
> -                                                                        .SetDontShowChildren(false)
> -                                                                        .SetDontShowValue(true)
> -                                                                        .SetShowMembersOneLiner(false)
> -                                                                        .SetHideItemNames(false),
> -                                                                        "${var%s}"));
> -    
> -    lldb::RegularExpressionSP any_size_char_arr(new RegularExpression("char \\[[0-9]+\\]"));
> -    
> -    TypeCategoryImpl::SharedPointer sys_category_sp = GetCategory(m_system_category_name);
> -    
> -    sys_category_sp->GetSummaryNavigator()->Add(ConstString("char *"), string_format);
> -    sys_category_sp->GetSummaryNavigator()->Add(ConstString("const char *"), string_format);
> -    sys_category_sp->GetRegexSummaryNavigator()->Add(any_size_char_arr, string_array_format);
> -    
> -    lldb::TypeSummaryImplSP ostype_summary(new StringSummaryFormat(TypeSummaryImpl::Flags().SetCascades(false)
> -                                                                   .SetSkipPointers(true)
> -                                                                   .SetSkipReferences(true)
> -                                                                   .SetDontShowChildren(true)
> -                                                                   .SetDontShowValue(false)
> -                                                                   .SetShowMembersOneLiner(false)
> -                                                                   .SetHideItemNames(false),
> -                                                                   "${var%O}"));
> -    
> -    sys_category_sp->GetSummaryNavigator()->Add(ConstString("OSType"), ostype_summary);
> -    
> -#ifndef LLDB_DISABLE_PYTHON
> -    // FIXME because of a bug in the FormatNavigator we need to add a summary for both X* and const X* (<rdar://problem/12717717>)
> -    AddCXXSummary(sys_category_sp, lldb_private::formatters::Char16StringSummaryProvider, "char16_t * summary provider", ConstString("char16_t *"), string_flags);
> -    AddCXXSummary(sys_category_sp, lldb_private::formatters::Char16StringSummaryProvider, "char16_t * summary provider", ConstString("const char16_t *"), string_flags);
> -    
> -    AddCXXSummary(sys_category_sp, lldb_private::formatters::Char32StringSummaryProvider, "char32_t * summary provider", ConstString("char32_t *"), string_flags);
> -    AddCXXSummary(sys_category_sp, lldb_private::formatters::Char32StringSummaryProvider, "char32_t * summary provider", ConstString("const char32_t *"), string_flags);
> -    
> -    AddCXXSummary(sys_category_sp, lldb_private::formatters::WCharStringSummaryProvider, "wchar_t * summary provider", ConstString("wchar_t *"), string_flags);
> -    AddCXXSummary(sys_category_sp, lldb_private::formatters::WCharStringSummaryProvider, "wchar_t * summary provider", ConstString("const wchar_t *"), string_flags);
> -    
> -    AddCXXSummary(sys_category_sp, lldb_private::formatters::Char16StringSummaryProvider, "unichar * summary provider", ConstString("unichar *"), string_flags);
> -    AddCXXSummary(sys_category_sp, lldb_private::formatters::Char16StringSummaryProvider, "unichar * summary provider", ConstString("const unichar *"), string_flags);
> -    
> -    TypeSummaryImpl::Flags widechar_flags;
> -    widechar_flags.SetDontShowValue(true)
> -    .SetSkipPointers(true)
> -    .SetSkipReferences(false)
> -    .SetCascades(true)
> -    .SetDontShowChildren(true)
> -    .SetHideItemNames(true)
> -    .SetShowMembersOneLiner(false);
> -    
> -    AddCXXSummary(sys_category_sp, lldb_private::formatters::Char16SummaryProvider, "char16_t summary provider", ConstString("char16_t"), widechar_flags);
> -    AddCXXSummary(sys_category_sp, lldb_private::formatters::Char32SummaryProvider, "char32_t summary provider", ConstString("char32_t"), widechar_flags);
> -    AddCXXSummary(sys_category_sp, lldb_private::formatters::WCharSummaryProvider, "wchar_t summary provider", ConstString("wchar_t"), widechar_flags);
> -
> -    AddCXXSummary(sys_category_sp, lldb_private::formatters::Char16SummaryProvider, "unichar summary provider", ConstString("unichar"), widechar_flags);
> -    
> -#endif
> -}
> -
> -void
> -FormatManager::LoadObjCFormatters()
> -{
> -    TypeSummaryImpl::Flags objc_flags;
> -    objc_flags.SetCascades(false)
> -    .SetSkipPointers(true)
> -    .SetSkipReferences(true)
> -    .SetDontShowChildren(true)
> -    .SetDontShowValue(true)
> -    .SetShowMembersOneLiner(false)
> -    .SetHideItemNames(false);
> -
> -    TypeCategoryImpl::SharedPointer objc_category_sp = GetCategory(m_objc_category_name);
> -    
> -    lldb::TypeSummaryImplSP ObjC_BOOL_summary(new CXXFunctionSummaryFormat(objc_flags, lldb_private::formatters::ObjCBOOLSummaryProvider,""));
> -    objc_category_sp->GetSummaryNavigator()->Add(ConstString("BOOL"),
> -                                                 ObjC_BOOL_summary);
> -    objc_category_sp->GetSummaryNavigator()->Add(ConstString("BOOL &"),
> -                                                 ObjC_BOOL_summary);
> -    objc_category_sp->GetSummaryNavigator()->Add(ConstString("BOOL *"),
> -                                                 ObjC_BOOL_summary);
> -
> -#ifndef LLDB_DISABLE_PYTHON
> -    // we need to skip pointers here since we are special casing a SEL* when retrieving its value
> -    objc_flags.SetSkipPointers(true);
> -    AddCXXSummary(objc_category_sp, lldb_private::formatters::ObjCSELSummaryProvider<false>, "SEL summary provider", ConstString("SEL"), objc_flags);
> -    AddCXXSummary(objc_category_sp, lldb_private::formatters::ObjCSELSummaryProvider<false>, "SEL summary provider", ConstString("struct objc_selector"), objc_flags);
> -    AddCXXSummary(objc_category_sp, lldb_private::formatters::ObjCSELSummaryProvider<false>, "SEL summary provider", ConstString("objc_selector"), objc_flags);
> -    AddCXXSummary(objc_category_sp, lldb_private::formatters::ObjCSELSummaryProvider<true>, "SEL summary provider", ConstString("objc_selector *"), objc_flags);
> -    
> -    AddScriptSummary(objc_category_sp, "lldb.formatters.objc.Class.Class_Summary", ConstString("Class"), objc_flags);
> -#endif // LLDB_DISABLE_PYTHON
> -
> -    objc_flags.SetSkipPointers(false);
> -
> -    TypeCategoryImpl::SharedPointer corefoundation_category_sp = GetCategory(m_corefoundation_category_name);
> -
> -    AddStringSummary(corefoundation_category_sp,
> -                     "${var.years} years, ${var.months} months, ${var.days} days, ${var.hours} hours, ${var.minutes} minutes ${var.seconds} seconds",
> -                     ConstString("CFGregorianUnits"),
> -                     objc_flags);
> -    AddStringSummary(corefoundation_category_sp,
> -                     "location=${var.location} length=${var.length}",
> -                     ConstString("CFRange"),
> -                     objc_flags);
> -    AddStringSummary(corefoundation_category_sp,
> -                     "(x=${var.x}, y=${var.y})",
> -                     ConstString("NSPoint"),
> -                     objc_flags);
> -    AddStringSummary(corefoundation_category_sp,
> -                     "location=${var.location}, length=${var.length}",
> -                     ConstString("NSRange"),
> -                     objc_flags);
> -    AddStringSummary(corefoundation_category_sp,
> -                     "${var.origin}, ${var.size}",
> -                     ConstString("NSRect"),
> -                     objc_flags);
> -    AddStringSummary(corefoundation_category_sp,
> -                     "(${var.origin}, ${var.size}), ...",
> -                     ConstString("NSRectArray"),
> -                     objc_flags);
> -    AddStringSummary(objc_category_sp,
> -                     "(width=${var.width}, height=${var.height})",
> -                     ConstString("NSSize"),
> -                     objc_flags);
> -    
> -    TypeCategoryImpl::SharedPointer coregraphics_category_sp = GetCategory(m_coregraphics_category_name);
> -    
> -    AddStringSummary(coregraphics_category_sp,
> -                     "(width=${var.width}, height=${var.height})",
> -                     ConstString("CGSize"),
> -                     objc_flags);
> -    AddStringSummary(coregraphics_category_sp,
> -                     "(x=${var.x}, y=${var.y})",
> -                     ConstString("CGPoint"),
> -                     objc_flags);
> -    AddStringSummary(coregraphics_category_sp,
> -                     "origin=${var.origin} size=${var.size}",
> -                     ConstString("CGRect"),
> -                     objc_flags);
> -    
> -    TypeCategoryImpl::SharedPointer coreservices_category_sp = GetCategory(m_coreservices_category_name);
> -    
> -    AddStringSummary(coreservices_category_sp,
> -                     "red=${var.red} green=${var.green} blue=${var.blue}",
> -                     ConstString("RGBColor"),
> -                     objc_flags);
> -    AddStringSummary(coreservices_category_sp,
> -                     "(t=${var.top}, l=${var.left}, b=${var.bottom}, r=${var.right})",
> -                     ConstString("Rect"),
> -                     objc_flags);
> -    AddStringSummary(coreservices_category_sp,
> -                     "(v=${var.v}, h=${var.h})",
> -                     ConstString("Point"),
> -                     objc_flags);
> -    AddStringSummary(coreservices_category_sp,
> -                     "${var.month}/${var.day}/${var.year}  ${var.hour} :${var.minute} :${var.second} dayOfWeek:${var.dayOfWeek}",
> -                     ConstString("DateTimeRect *"),
> -                     objc_flags);
> -    AddStringSummary(coreservices_category_sp,
> -                     "${var.ld.month}/${var.ld.day}/${var.ld.year} ${var.ld.hour} :${var.ld.minute} :${var.ld.second} dayOfWeek:${var.ld.dayOfWeek}",
> -                     ConstString("LongDateRect"),
> -                     objc_flags);
> -    AddStringSummary(coreservices_category_sp,
> -                     "(x=${var.x}, y=${var.y})",
> -                     ConstString("HIPoint"),
> -                     objc_flags);
> -    AddStringSummary(coreservices_category_sp,
> -                     "origin=${var.origin} size=${var.size}",
> -                     ConstString("HIRect"),
> -                     objc_flags);
> -    
> -    TypeCategoryImpl::SharedPointer appkit_category_sp = GetCategory(m_appkit_category_name);
> -    
> -    TypeSummaryImpl::Flags appkit_flags;
> -    appkit_flags.SetCascades(true)
> -    .SetSkipPointers(false)
> -    .SetSkipReferences(false)
> -    .SetDontShowChildren(true)
> -    .SetDontShowValue(false)
> -    .SetShowMembersOneLiner(false)
> -    .SetHideItemNames(false);
> -
> -    appkit_flags.SetDontShowChildren(false);
> -    
> -
> -#ifndef LLDB_DISABLE_PYTHON
> -    AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSArraySummaryProvider, "NSArray summary provider", ConstString("NSArray"), appkit_flags);
> -    AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSArraySummaryProvider, "NSArray summary provider", ConstString("NSMutableArray"), appkit_flags);
> -    AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSArraySummaryProvider, "NSArray summary provider", ConstString("__NSArrayI"), appkit_flags);
> -    AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSArraySummaryProvider, "NSArray summary provider", ConstString("__NSArrayM"), appkit_flags);
> -    AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSArraySummaryProvider, "NSArray summary provider", ConstString("__NSCFArray"), appkit_flags);
> -    AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSArraySummaryProvider, "NSArray summary provider", ConstString("CFArrayRef"), appkit_flags);
> -    AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSArraySummaryProvider, "NSArray summary provider", ConstString("CFMutableArrayRef"), appkit_flags);
> -
> -    AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSDictionarySummaryProvider<false>, "NSDictionary summary provider", ConstString("NSDictionary"), appkit_flags);
> -    AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSDictionarySummaryProvider<false>, "NSDictionary summary provider", ConstString("NSMutableDictionary"), appkit_flags);
> -    AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSDictionarySummaryProvider<false>, "NSDictionary summary provider", ConstString("__NSCFDictionary"), appkit_flags);
> -    AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSDictionarySummaryProvider<false>, "NSDictionary summary provider", ConstString("__NSDictionaryI"), appkit_flags);
> -    AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSDictionarySummaryProvider<false>, "NSDictionary summary provider", ConstString("__NSDictionaryM"), appkit_flags);
> -    AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSDictionarySummaryProvider<true>, "NSDictionary summary provider", ConstString("CFDictionaryRef"), appkit_flags);
> -    AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSDictionarySummaryProvider<true>, "NSDictionary summary provider", ConstString("CFMutableDictionaryRef"), appkit_flags);
> -    
> -    // AddSummary(appkit_category_sp, "${var.key%@} -> ${var.value%@}", ConstString("$_lldb_typegen_nspair"), appkit_flags);
> -    
> -    appkit_flags.SetDontShowChildren(true);
> -    
> -    AddCXXSynthetic(appkit_category_sp, lldb_private::formatters::NSArraySyntheticFrontEndCreator, "NSArray synthetic children", ConstString("__NSArrayM"), TypeSyntheticImpl::Flags());
> -    AddCXXSynthetic(appkit_category_sp, lldb_private::formatters::NSArraySyntheticFrontEndCreator, "NSArray synthetic children", ConstString("__NSArrayI"), TypeSyntheticImpl::Flags());
> -    AddCXXSynthetic(appkit_category_sp, lldb_private::formatters::NSArraySyntheticFrontEndCreator, "NSArray synthetic children", ConstString("NSArray"), TypeSyntheticImpl::Flags());
> -    AddCXXSynthetic(appkit_category_sp, lldb_private::formatters::NSArraySyntheticFrontEndCreator, "NSArray synthetic children", ConstString("NSMutableArray"), TypeSyntheticImpl::Flags());
> -    AddCXXSynthetic(appkit_category_sp, lldb_private::formatters::NSArraySyntheticFrontEndCreator, "NSArray synthetic children", ConstString("__NSCFArray"), TypeSyntheticImpl::Flags());
> -
> -    AddCXXSynthetic(appkit_category_sp, lldb_private::formatters::NSDictionarySyntheticFrontEndCreator, "NSDictionary synthetic children", ConstString("__NSDictionaryM"), TypeSyntheticImpl::Flags());
> -    AddCXXSynthetic(appkit_category_sp, lldb_private::formatters::NSDictionarySyntheticFrontEndCreator, "NSDictionary synthetic children", ConstString("__NSDictionaryI"), TypeSyntheticImpl::Flags());
> -    AddCXXSynthetic(appkit_category_sp, lldb_private::formatters::NSDictionarySyntheticFrontEndCreator, "NSDictionary synthetic children", ConstString("NSDictionary"), TypeSyntheticImpl::Flags());
> -    AddCXXSynthetic(appkit_category_sp, lldb_private::formatters::NSDictionarySyntheticFrontEndCreator, "NSDictionary synthetic children", ConstString("NSMutableDictionary"), TypeSyntheticImpl::Flags());
> -    AddCXXSynthetic(appkit_category_sp, lldb_private::formatters::NSDictionarySyntheticFrontEndCreator, "NSDictionary synthetic children", ConstString("CFDictionaryRef"), TypeSyntheticImpl::Flags());
> -    AddCXXSynthetic(appkit_category_sp, lldb_private::formatters::NSDictionarySyntheticFrontEndCreator, "NSDictionary synthetic children", ConstString("CFMutableDictionaryRef"), TypeSyntheticImpl::Flags());
> -
> -    AddScriptSummary(appkit_category_sp, "lldb.formatters.objc.CFBag.CFBag_SummaryProvider", ConstString("CFBagRef"), appkit_flags);
> -    AddScriptSummary(appkit_category_sp, "lldb.formatters.objc.CFBag.CFBag_SummaryProvider", ConstString("__CFBag"), appkit_flags);
> -    AddScriptSummary(appkit_category_sp, "lldb.formatters.objc.CFBag.CFBag_SummaryProvider", ConstString("const struct __CFBag"), appkit_flags);
> -    AddScriptSummary(appkit_category_sp, "lldb.formatters.objc.CFBag.CFBag_SummaryProvider", ConstString("CFMutableBagRef"), appkit_flags);
> -    
> -    AddScriptSummary(appkit_category_sp, "lldb.formatters.objc.CFBinaryHeap.CFBinaryHeap_SummaryProvider", ConstString("CFBinaryHeapRef"), appkit_flags);
> -    AddScriptSummary(appkit_category_sp, "lldb.formatters.objc.CFBinaryHeap.CFBinaryHeap_SummaryProvider", ConstString("__CFBinaryHeap"), appkit_flags);
> -
> -    AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSStringSummaryProvider, "NSString summary provider", ConstString("NSString"), appkit_flags);
> -    AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSStringSummaryProvider, "NSString summary provider", ConstString("CFStringRef"), appkit_flags);
> -    AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSStringSummaryProvider, "NSString summary provider", ConstString("CFMutableStringRef"), appkit_flags);
> -    AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSStringSummaryProvider, "NSString summary provider", ConstString("__NSCFConstantString"), appkit_flags);
> -    AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSStringSummaryProvider, "NSString summary provider", ConstString("__NSCFString"), appkit_flags);
> -    AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSStringSummaryProvider, "NSString summary provider", ConstString("NSCFConstantString"), appkit_flags);
> -    AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSStringSummaryProvider, "NSString summary provider", ConstString("NSCFString"), appkit_flags);
> -    AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSStringSummaryProvider, "NSString summary provider", ConstString("NSPathStore2"), appkit_flags);
> -    
> -    AddScriptSummary(appkit_category_sp, "lldb.formatters.objc.CFString.CFAttributedString_SummaryProvider", ConstString("NSAttributedString"), appkit_flags);
> -    
> -    AddScriptSummary(appkit_category_sp, "lldb.formatters.objc.NSBundle.NSBundle_SummaryProvider", ConstString("NSBundle"), appkit_flags);
> -
> -    AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSDataSummaryProvider<false>, "NSData summary provider", ConstString("NSData"), appkit_flags);
> -    AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSDataSummaryProvider<false>, "NSData summary provider", ConstString("NSConcreteData"), appkit_flags);
> -    AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSDataSummaryProvider<false>, "NSData summary provider", ConstString("NSConcreteMutableData"), appkit_flags);
> -    AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSDataSummaryProvider<false>, "NSData summary provider", ConstString("__NSCFData"), appkit_flags);
> -    AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSDataSummaryProvider<true>, "NSData summary provider", ConstString("CFDataRef"), appkit_flags);
> -    AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSDataSummaryProvider<true>, "NSData summary provider", ConstString("CFMutableDataRef"), appkit_flags);
> -
> -    AddScriptSummary(appkit_category_sp, "lldb.formatters.objc.NSException.NSException_SummaryProvider", ConstString("NSException"), appkit_flags);
> -
> -    AddScriptSummary(appkit_category_sp, "lldb.formatters.objc.NSMachPort.NSMachPort_SummaryProvider", ConstString("NSMachPort"), appkit_flags);
> -    
> -    AddScriptSummary(appkit_category_sp, "lldb.formatters.objc.NSNotification.NSNotification_SummaryProvider", ConstString("NSNotification"), appkit_flags);
> -    AddScriptSummary(appkit_category_sp, "lldb.formatters.objc.NSNotification.NSNotification_SummaryProvider", ConstString("NSConcreteNotification"), appkit_flags);
> -
> -    AddStringSummary(appkit_category_sp, "domain: ${var._domain} - code: ${var._code}", ConstString("NSError"), appkit_flags);
> -    
> -    AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSNumberSummaryProvider, "NSNumber summary provider", ConstString("NSNumber"), appkit_flags);
> -    AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSNumberSummaryProvider, "NSNumber summary provider", ConstString("__NSCFBoolean"), appkit_flags);
> -    AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSNumberSummaryProvider, "NSNumber summary provider", ConstString("__NSCFNumber"), appkit_flags);
> -    AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSNumberSummaryProvider, "NSNumber summary provider", ConstString("NSCFBoolean"), appkit_flags);
> -    AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSNumberSummaryProvider, "NSNumber summary provider", ConstString("NSCFNumber"), appkit_flags);
> -    
> -    AddCXXSummary(appkit_category_sp, lldb_private::formatters::RuntimeSpecificDescriptionSummaryProvider, "NSDecimalNumber summary provider", ConstString("NSDecimalNumber"), appkit_flags);
> -    AddCXXSummary(appkit_category_sp, lldb_private::formatters::RuntimeSpecificDescriptionSummaryProvider, "NSHost summary provider", ConstString("NSHost"), appkit_flags);
> -    AddCXXSummary(appkit_category_sp, lldb_private::formatters::RuntimeSpecificDescriptionSummaryProvider, "NSTask summary provider", ConstString("NSTask"), appkit_flags);
> -    AddCXXSummary(appkit_category_sp, lldb_private::formatters::RuntimeSpecificDescriptionSummaryProvider, "NSValue summary provider", ConstString("NSValue"), appkit_flags);
> -
> -    AddScriptSummary(appkit_category_sp, "lldb.formatters.objc.NSSet.NSSet_SummaryProvider", ConstString("NSSet"), appkit_flags);
> -    AddScriptSummary(appkit_category_sp, "lldb.formatters.objc.NSSet.NSSet_SummaryProvider2", ConstString("CFSetRef"), appkit_flags);
> -    AddScriptSummary(appkit_category_sp, "lldb.formatters.objc.NSSet.NSSet_SummaryProvider2", ConstString("CFMutableSetRef"), appkit_flags);
> -    AddScriptSummary(appkit_category_sp, "lldb.formatters.objc.NSSet.NSSet_SummaryProvider", ConstString("__NSCFSet"), appkit_flags);
> -    AddScriptSummary(appkit_category_sp, "lldb.formatters.objc.NSSet.NSSet_SummaryProvider", ConstString("__NSSetI"), appkit_flags);
> -    AddScriptSummary(appkit_category_sp, "lldb.formatters.objc.NSSet.NSSet_SummaryProvider", ConstString("__NSSetM"), appkit_flags);
> -    AddScriptSummary(appkit_category_sp, "lldb.formatters.objc.NSSet.NSSet_SummaryProvider", ConstString("NSCountedSet"), appkit_flags);
> -
> -    AddScriptSummary(appkit_category_sp, "lldb.formatters.objc.NSURL.NSURL_SummaryProvider", ConstString("NSURL"), appkit_flags);
> -    AddScriptSummary(appkit_category_sp, "lldb.formatters.objc.NSURL.NSURL_SummaryProvider", ConstString("CFURLRef"), appkit_flags);
> -    
> -    AddScriptSummary(appkit_category_sp, "lldb.formatters.objc.NSDate.NSDate_SummaryProvider", ConstString("NSDate"), appkit_flags);
> -    AddScriptSummary(appkit_category_sp, "lldb.formatters.objc.NSDate.NSDate_SummaryProvider", ConstString("__NSDate"), appkit_flags);
> -    AddScriptSummary(appkit_category_sp, "lldb.formatters.objc.NSDate.NSDate_SummaryProvider", ConstString("__NSTaggedDate"), appkit_flags);
> -    AddScriptSummary(appkit_category_sp, "lldb.formatters.objc.NSDate.NSDate_SummaryProvider", ConstString("NSCalendarDate"), appkit_flags);
> -
> -    AddScriptSummary(appkit_category_sp, "lldb.formatters.objc.NSDate.NSTimeZone_SummaryProvider", ConstString("NSTimeZone"), appkit_flags);
> -    AddScriptSummary(appkit_category_sp, "lldb.formatters.objc.NSDate.NSTimeZone_SummaryProvider", ConstString("CFTimeZoneRef"), appkit_flags);
> -    AddScriptSummary(appkit_category_sp, "lldb.formatters.objc.NSDate.NSTimeZone_SummaryProvider", ConstString("__NSTimeZone"), appkit_flags);
> -
> -    // CFAbsoluteTime is actually a double rather than a pointer to an object
> -    // we do not care about the numeric value, since it is probably meaningless to users
> -    appkit_flags.SetDontShowValue(true);
> -    AddScriptSummary(appkit_category_sp, "lldb.formatters.objc.NSDate.CFAbsoluteTime_SummaryProvider", ConstString("CFAbsoluteTime"), appkit_flags);
> -    appkit_flags.SetDontShowValue(false);
> -    
> -    AddScriptSummary(appkit_category_sp, "lldb.formatters.objc.NSIndexSet.NSIndexSet_SummaryProvider", ConstString("NSIndexSet"), appkit_flags);
> -    AddScriptSummary(appkit_category_sp, "lldb.formatters.objc.NSIndexSet.NSIndexSet_SummaryProvider", ConstString("NSMutableIndexSet"), appkit_flags);
> -
> -    AddStringSummary(appkit_category_sp,
> -                     "@\"${var.month%d}/${var.day%d}/${var.year%d} ${var.hour%d}:${var.minute%d}:${var.second}\"",
> -                     ConstString("CFGregorianDate"),
> -                     appkit_flags);
> -    
> -    AddScriptSummary(appkit_category_sp, "lldb.formatters.objc.CFBitVector.CFBitVector_SummaryProvider", ConstString("CFBitVectorRef"), appkit_flags);
> -    AddScriptSummary(appkit_category_sp, "lldb.formatters.objc.CFBitVector.CFBitVector_SummaryProvider", ConstString("CFMutableBitVectorRef"), appkit_flags);
> -    AddScriptSummary(appkit_category_sp, "lldb.formatters.objc.CFBitVector.CFBitVector_SummaryProvider", ConstString("__CFBitVector"), appkit_flags);
> -    AddScriptSummary(appkit_category_sp, "lldb.formatters.objc.CFBitVector.CFBitVector_SummaryProvider", ConstString("__CFMutableBitVector"), appkit_flags);
> -#endif // LLDB_DISABLE_PYTHON
> -    
> -    TypeCategoryImpl::SharedPointer vectors_category_sp = GetCategory(m_vectortypes_category_name);
> -
> -    TypeSummaryImpl::Flags vector_flags;
> -    vector_flags.SetCascades(true)
> -    .SetSkipPointers(true)
> -    .SetSkipReferences(false)
> -    .SetDontShowChildren(true)
> -    .SetDontShowValue(false)
> -    .SetShowMembersOneLiner(true)
> -    .SetHideItemNames(true);
> -    
> -    AddStringSummary(vectors_category_sp,
> -                     "${var.uint128}",
> -                     ConstString("builtin_type_vec128"),
> -                     objc_flags);
> -
> -    AddStringSummary(vectors_category_sp,
> -                     "",
> -                     ConstString("float [4]"),
> -                     vector_flags);
> -    AddStringSummary(vectors_category_sp,
> -                     "",
> -                     ConstString("int32_t [4]"),
> -                     vector_flags);
> -    AddStringSummary(vectors_category_sp,
> -                     "",
> -                     ConstString("int16_t [8]"),
> -                     vector_flags);
> -    AddStringSummary(vectors_category_sp,
> -                     "",
> -                     ConstString("vDouble"),
> -                     vector_flags);
> -    AddStringSummary(vectors_category_sp,
> -                     "",
> -                     ConstString("vFloat"),
> -                     vector_flags);
> -    AddStringSummary(vectors_category_sp,
> -                     "",
> -                     ConstString("vSInt8"),
> -                     vector_flags);
> -    AddStringSummary(vectors_category_sp,
> -                     "",
> -                     ConstString("vSInt16"),
> -                     vector_flags);
> -    AddStringSummary(vectors_category_sp,
> -                     "",
> -                     ConstString("vSInt32"),
> -                     vector_flags);
> -    AddStringSummary(vectors_category_sp,
> -                     "",
> -                     ConstString("vUInt16"),
> -                     vector_flags);
> -    AddStringSummary(vectors_category_sp,
> -                     "",
> -                     ConstString("vUInt8"),
> -                     vector_flags);
> -    AddStringSummary(vectors_category_sp,
> -                     "",
> -                     ConstString("vUInt16"),
> -                     vector_flags);
> -    AddStringSummary(vectors_category_sp,
> -                     "",
> -                     ConstString("vUInt32"),
> -                     vector_flags);
> -    AddStringSummary(vectors_category_sp,
> -                     "",
> -                     ConstString("vBool32"),
> -                     vector_flags);
> -}
> 
> Modified: lldb/trunk/source/Core/Timer.cpp
> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Core/Timer.cpp?rev=173728&r1=173727&r2=173728&view=diff
> ==============================================================================
> --- lldb/trunk/source/Core/Timer.cpp (original)
> +++ lldb/trunk/source/Core/Timer.cpp Mon Jan 28 17:47:25 2013
> @@ -25,7 +25,7 @@ uint32_t Timer::g_depth = 0;
> uint32_t Timer::g_display_depth = 0;
> FILE * Timer::g_file = NULL;
> typedef std::vector<Timer *> TimerStack;
> -typedef std::map<const char *, uint64_t> CategoryMap;
> +typedef std::map<const char *, uint64_t> TimerCategoryMap;
> static pthread_key_t g_key;
> 
> static Mutex &
> @@ -35,10 +35,10 @@ GetCategoryMutex()
>     return g_category_mutex;
> }
> 
> -static CategoryMap &
> +static TimerCategoryMap &
> GetCategoryMap()
> {
> -    static CategoryMap g_category_map;
> +    static TimerCategoryMap g_category_map;
>     return g_category_map;
> }
> 
> @@ -153,7 +153,7 @@ Timer::~Timer()
> 
>         // Keep total results for each category so we can dump results.
>         Mutex::Locker locker (GetCategoryMutex());
> -        CategoryMap &category_map = GetCategoryMap();
> +        TimerCategoryMap &category_map = GetCategoryMap();
>         category_map[m_category] += timer_nsec_uint;
>     }
>     if (g_depth > 0)
> @@ -214,7 +214,7 @@ Timer::SetDisplayDepth (uint32_t depth)
>  * - returns whether a person is less than another person
>  */
> static bool
> -CategoryMapIteratorSortCriterion (const CategoryMap::const_iterator& lhs, const CategoryMap::const_iterator& rhs)
> +CategoryMapIteratorSortCriterion (const TimerCategoryMap::const_iterator& lhs, const TimerCategoryMap::const_iterator& rhs)
> {
>     return lhs->second > rhs->second;
> }
> @@ -224,7 +224,7 @@ void
> Timer::ResetCategoryTimes ()
> {
>     Mutex::Locker locker (GetCategoryMutex());
> -    CategoryMap &category_map = GetCategoryMap();
> +    TimerCategoryMap &category_map = GetCategoryMap();
>     category_map.clear();
> }
> 
> @@ -232,9 +232,9 @@ void
> Timer::DumpCategoryTimes (Stream *s)
> {
>     Mutex::Locker locker (GetCategoryMutex());
> -    CategoryMap &category_map = GetCategoryMap();
> -    std::vector<CategoryMap::const_iterator> sorted_iterators;
> -    CategoryMap::const_iterator pos, end = category_map.end();
> +    TimerCategoryMap &category_map = GetCategoryMap();
> +    std::vector<TimerCategoryMap::const_iterator> sorted_iterators;
> +    TimerCategoryMap::const_iterator pos, end = category_map.end();
>     for (pos = category_map.begin(); pos != end; ++pos)
>     {
>         sorted_iterators.push_back (pos);
> 
> Modified: lldb/trunk/source/Core/ValueObject.cpp
> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Core/ValueObject.cpp?rev=173728&r1=173727&r2=173728&view=diff
> ==============================================================================
> --- lldb/trunk/source/Core/ValueObject.cpp (original)
> +++ lldb/trunk/source/Core/ValueObject.cpp Mon Jan 28 17:47:25 2013
> @@ -21,7 +21,6 @@
> 
> // Project includes
> #include "lldb/Core/DataBufferHeap.h"
> -#include "lldb/Core/DataVisualization.h"
> #include "lldb/Core/Debugger.h"
> #include "lldb/Core/Log.h"
> #include "lldb/Core/Module.h"
> @@ -34,6 +33,8 @@
> #include "lldb/Core/ValueObjectMemory.h"
> #include "lldb/Core/ValueObjectSyntheticFilter.h"
> 
> +#include "lldb/DataFormatters/DataVisualization.h"
> +
> #include "lldb/Host/Endian.h"
> 
> #include "lldb/Interpreter/CommandInterpreter.h"
> @@ -83,7 +84,6 @@ ValueObject::ValueObject (ValueObject &p
>     m_deref_valobj(NULL),
>     m_format (eFormatDefault),
>     m_last_format_mgr_revision(0),
> -    m_last_format_mgr_dynamic(parent.m_last_format_mgr_dynamic),
>     m_type_summary_sp(),
>     m_type_format_sp(),
>     m_synthetic_children_sp(),
> @@ -129,7 +129,6 @@ ValueObject::ValueObject (ExecutionConte
>     m_deref_valobj(NULL),
>     m_format (eFormatDefault),
>     m_last_format_mgr_revision(0),
> -    m_last_format_mgr_dynamic(eNoDynamicValues),
>     m_type_summary_sp(),
>     m_type_format_sp(),
>     m_synthetic_children_sp(),
> @@ -161,17 +160,11 @@ ValueObject::~ValueObject ()
> bool
> ValueObject::UpdateValueIfNeeded (bool update_format)
> {
> -    return UpdateValueIfNeeded(m_last_format_mgr_dynamic, update_format);
> -}
> -
> -bool
> -ValueObject::UpdateValueIfNeeded (DynamicValueType use_dynamic, bool update_format)
> -{
> 
>     bool did_change_formats = false;
> 
>     if (update_format)
> -        did_change_formats = UpdateFormatsIfNeeded(use_dynamic);
> +        did_change_formats = UpdateFormatsIfNeeded();
> 
>     // If this is a constant value, then our success is predicated on whether
>     // we have an error or not
> @@ -238,7 +231,7 @@ ValueObject::UpdateValueIfNeeded (Dynami
> }
> 
> bool
> -ValueObject::UpdateFormatsIfNeeded(DynamicValueType use_dynamic)
> +ValueObject::UpdateFormatsIfNeeded()
> {
>     LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_TYPES));
>     if (log)
> @@ -250,17 +243,15 @@ ValueObject::UpdateFormatsIfNeeded(Dynam
> 
>     bool any_change = false;
> 
> -    if ( (m_last_format_mgr_revision != DataVisualization::GetCurrentRevision()) ||
> -          m_last_format_mgr_dynamic != use_dynamic)
> +    if ( (m_last_format_mgr_revision != DataVisualization::GetCurrentRevision()))
>     {
>         SetValueFormat(DataVisualization::ValueFormats::GetFormat (*this, eNoDynamicValues));
> -        SetSummaryFormat(DataVisualization::GetSummaryFormat (*this, use_dynamic));
> +        SetSummaryFormat(DataVisualization::GetSummaryFormat (*this, GetDynamicValueType()));
> #ifndef LLDB_DISABLE_PYTHON
> -        SetSyntheticChildren(DataVisualization::GetSyntheticChildren (*this, use_dynamic));
> +        SetSyntheticChildren(DataVisualization::GetSyntheticChildren (*this, GetDynamicValueType()));
> #endif
> 
>         m_last_format_mgr_revision = DataVisualization::GetCurrentRevision();
> -        m_last_format_mgr_dynamic = use_dynamic;
> 
>         any_change = true;
>     }
> @@ -2033,42 +2024,6 @@ ValueObject::GetSyntheticBitFieldChild (
> }
> 
> ValueObjectSP
> -ValueObject::GetSyntheticArrayRangeChild (uint32_t from, uint32_t to, bool can_create)
> -{
> -    ValueObjectSP synthetic_child_sp;
> -    if (IsArrayType () || IsPointerType ())
> -    {
> -        char index_str[64];
> -        snprintf(index_str, sizeof(index_str), "[%i-%i]", from, to);
> -        ConstString index_const_str(index_str);
> -        // Check if we have already created a synthetic array member in this
> -        // valid object. If we have we will re-use it.
> -        synthetic_child_sp = GetSyntheticChild (index_const_str);
> -        if (!synthetic_child_sp)
> -        {
> -            ValueObjectSynthetic *synthetic_child;
> -            
> -            // We haven't made a synthetic array member for INDEX yet, so
> -            // lets make one and cache it for any future reference.
> -            SyntheticArrayView *view = new SyntheticArrayView(SyntheticChildren::Flags());
> -            view->AddRange(from,to);
> -            SyntheticChildrenSP view_sp(view);
> -            synthetic_child = new ValueObjectSynthetic(*this, view_sp);
> -            
> -            // Cache the value if we got one back...
> -            if (synthetic_child)
> -            {
> -                AddSyntheticChild(index_const_str, synthetic_child);
> -                synthetic_child_sp = synthetic_child->GetSP();
> -                synthetic_child_sp->SetName(ConstString(index_str));
> -                synthetic_child_sp->m_is_bitfield_for_scalar = true;
> -            }
> -        }
> -    }
> -    return synthetic_child_sp;
> -}
> -
> -ValueObjectSP
> ValueObject::GetSyntheticChildAtOffset(uint32_t offset, const ClangASTType& type, bool can_create)
> {
> 
> @@ -2168,7 +2123,7 @@ ValueObject::CalculateSyntheticValue (bo
> 
>     lldb::SyntheticChildrenSP current_synth_sp(m_synthetic_children_sp);
> 
> -    if (!UpdateFormatsIfNeeded(m_last_format_mgr_dynamic) && m_synthetic_value)
> +    if (!UpdateFormatsIfNeeded() && m_synthetic_value)
>         return;
> 
>     if (m_synthetic_children_sp.get() == NULL)
> @@ -2243,7 +2198,7 @@ ValueObject::GetSyntheticValue (bool use
> bool
> ValueObject::HasSyntheticValue()
> {
> -    UpdateFormatsIfNeeded(m_last_format_mgr_dynamic);
> +    UpdateFormatsIfNeeded();
> 
>     if (m_synthetic_children_sp.get() == NULL)
>         return false;
> @@ -3285,7 +3240,7 @@ DumpValueObject_Impl (Stream &s,
> {
>     if (valobj)
>     {
> -        bool update_success = valobj->UpdateValueIfNeeded (options.m_use_dynamic, true);
> +        bool update_success = valobj->UpdateValueIfNeeded (true);
> 
>         const char *root_valobj_name = 
>             options.m_root_valobj_name.empty() ? 
> 
> Modified: lldb/trunk/source/Core/ValueObjectDynamicValue.cpp
> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Core/ValueObjectDynamicValue.cpp?rev=173728&r1=173727&r2=173728&view=diff
> ==============================================================================
> --- lldb/trunk/source/Core/ValueObjectDynamicValue.cpp (original)
> +++ lldb/trunk/source/Core/ValueObjectDynamicValue.cpp Mon Jan 28 17:47:25 2013
> @@ -41,7 +41,6 @@ ValueObjectDynamicValue::ValueObjectDyna
>     m_dynamic_type_info(),
>     m_use_dynamic (use_dynamic)
> {
> -    m_last_format_mgr_dynamic = use_dynamic;
>     SetName (parent.GetName());
> }
> 
> 
> Modified: lldb/trunk/source/Core/ValueObjectSyntheticFilter.cpp
> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Core/ValueObjectSyntheticFilter.cpp?rev=173728&r1=173727&r2=173728&view=diff
> ==============================================================================
> --- lldb/trunk/source/Core/ValueObjectSyntheticFilter.cpp (original)
> +++ lldb/trunk/source/Core/ValueObjectSyntheticFilter.cpp Mon Jan 28 17:47:25 2013
> @@ -15,8 +15,8 @@
> // C++ Includes
> // Other libraries and framework includes
> // Project includes
> -#include "lldb/Core/FormatClasses.h"
> #include "lldb/Core/ValueObject.h"
> +#include "lldb/DataFormatters/FormatClasses.h"
> 
> using namespace lldb_private;
> 
> @@ -39,7 +39,7 @@ public:
>         return lldb::ValueObjectSP();
>     }
> 
> -    uint32_t
> +    size_t
>     GetIndexOfChildWithName (const ConstString &name)
>     {
>         return UINT32_MAX;
> @@ -95,6 +95,12 @@ ValueObjectSynthetic::GetTypeName()
>     return m_parent->GetTypeName();
> }
> 
> +ConstString
> +ValueObjectSynthetic::GetQualifiedTypeName()
> +{
> +    return m_parent->GetQualifiedTypeName();
> +}
> +
> size_t
> ValueObjectSynthetic::CalculateNumChildren()
> {
> @@ -104,6 +110,16 @@ ValueObjectSynthetic::CalculateNumChildr
>     return (m_synthetic_children_count = m_synth_filter_ap->CalculateNumChildren());
> }
> 
> +lldb::ValueObjectSP
> +ValueObjectSynthetic::GetDynamicValue (lldb::DynamicValueType valueType)
> +{
> +    if (!m_parent)
> +        return lldb::ValueObjectSP();
> +    if (m_parent->IsDynamic() && m_parent->GetDynamicValueType() == valueType)
> +        return m_parent->GetSP();
> +    return ValueObject::GetDynamicValue(valueType);
> +}
> +
> bool
> ValueObjectSynthetic::MightHaveChildren()
> {
> 
> Copied: lldb/trunk/source/DataFormatters/CXXFormatterFunctions.cpp (from r173281, lldb/trunk/source/Core/CXXFormatterFunctions.cpp)
> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/DataFormatters/CXXFormatterFunctions.cpp?p2=lldb/trunk/source/DataFormatters/CXXFormatterFunctions.cpp&p1=lldb/trunk/source/Core/CXXFormatterFunctions.cpp&r1=173281&r2=173728&rev=173728&view=diff
> ==============================================================================
> --- lldb/trunk/source/Core/CXXFormatterFunctions.cpp (original)
> +++ lldb/trunk/source/DataFormatters/CXXFormatterFunctions.cpp Mon Jan 28 17:47:25 2013
> @@ -9,7 +9,7 @@
> 
> #include "lldb/lldb-python.h"
> 
> -#include "lldb/Core/CXXFormatterFunctions.h"
> +#include "lldb/DataFormatters/CXXFormatterFunctions.h"
> 
> // needed to get ConvertUTF16/32ToUTF8
> #define CLANG_NEEDS_THESE_ONE_DAY
> @@ -1092,7 +1092,7 @@ m_data_64(NULL)
>     }
> }
> 
> -uint32_t
> +size_t
> lldb_private::formatters::NSArrayMSyntheticFrontEnd::CalculateNumChildren ()
> {
>     if (m_data_32)
> @@ -1103,7 +1103,7 @@ lldb_private::formatters::NSArrayMSynthe
> }
> 
> lldb::ValueObjectSP
> -lldb_private::formatters::NSArrayMSyntheticFrontEnd::GetChildAtIndex (uint32_t idx)
> +lldb_private::formatters::NSArrayMSyntheticFrontEnd::GetChildAtIndex (size_t idx)
> {
>     if (!m_data_32 && !m_data_64)
>         return lldb::ValueObjectSP();
> @@ -1112,7 +1112,7 @@ lldb_private::formatters::NSArrayMSynthe
>     lldb::addr_t object_at_idx = (m_data_32 ? m_data_32->_data : m_data_64->_data);
>     object_at_idx += (idx * m_ptr_size);
>     StreamString idx_name;
> -    idx_name.Printf("[%d]",idx);
> +    idx_name.Printf("[%zu]",idx);
>     lldb::ValueObjectSP retval_sp = ValueObject::CreateValueObjectFromAddress(idx_name.GetData(),
>                                                                               object_at_idx,
>                                                                               m_exe_ctx_ref,
> @@ -1192,7 +1192,7 @@ ExtractIndexFromString (const char* item
>     return idx;
> }
> 
> -uint32_t
> +size_t
> lldb_private::formatters::NSArrayMSyntheticFrontEnd::GetIndexOfChildWithName (const ConstString &name)
> {
>     if (!m_data_32 && !m_data_64)
> @@ -1230,7 +1230,7 @@ lldb_private::formatters::NSArrayISynthe
> {
> }
> 
> -uint32_t
> +size_t
> lldb_private::formatters::NSArrayISyntheticFrontEnd::GetIndexOfChildWithName (const ConstString &name)
> {
>     const char* item_name = name.GetCString();
> @@ -1240,7 +1240,7 @@ lldb_private::formatters::NSArrayISynthe
>     return idx;
> }
> 
> -uint32_t
> +size_t
> lldb_private::formatters::NSArrayISyntheticFrontEnd::CalculateNumChildren ()
> {
>     return m_items;
> @@ -1286,7 +1286,7 @@ lldb_private::formatters::NSArrayISynthe
> }
> 
> lldb::ValueObjectSP
> -lldb_private::formatters::NSArrayISyntheticFrontEnd::GetChildAtIndex (uint32_t idx)
> +lldb_private::formatters::NSArrayISyntheticFrontEnd::GetChildAtIndex (size_t idx)
> {
>     if (idx >= CalculateNumChildren())
>         return lldb::ValueObjectSP();
> @@ -1302,7 +1302,7 @@ lldb_private::formatters::NSArrayISynthe
>     StreamString expr;
>     expr.Printf("(id)%" PRIu64,object_at_idx);
>     StreamString idx_name;
> -    idx_name.Printf("[%d]",idx);
> +    idx_name.Printf("[%zu]",idx);
>     lldb::ValueObjectSP retval_sp = ValueObject::CreateValueObjectFromExpression(idx_name.GetData(), expr.GetData(), m_exe_ctx_ref);
>     m_children.push_back(retval_sp);
>     return retval_sp;
> @@ -1353,7 +1353,7 @@ lldb_private::formatters::NSArrayCodeRun
> SyntheticChildrenFrontEnd(*valobj_sp.get())
> {}
> 
> -uint32_t
> +size_t
> lldb_private::formatters::NSArrayCodeRunningSyntheticFrontEnd::CalculateNumChildren ()
> {
>     uint64_t count = 0;
> @@ -1363,10 +1363,10 @@ lldb_private::formatters::NSArrayCodeRun
> }
> 
> lldb::ValueObjectSP
> -lldb_private::formatters::NSArrayCodeRunningSyntheticFrontEnd::GetChildAtIndex (uint32_t idx)
> +lldb_private::formatters::NSArrayCodeRunningSyntheticFrontEnd::GetChildAtIndex (size_t idx)
> {
>     StreamString idx_name;
> -    idx_name.Printf("[%d]",idx);
> +    idx_name.Printf("[%zu]",idx);
>     lldb::ValueObjectSP valobj_sp = CallSelectorOnObject(m_backend,"id","objectAtIndex:",idx);
>     if (valobj_sp)
>         valobj_sp->SetName(ConstString(idx_name.GetData()));
> @@ -1385,7 +1385,7 @@ lldb_private::formatters::NSArrayCodeRun
>     return true;
> }
> 
> -uint32_t
> +size_t
> lldb_private::formatters::NSArrayCodeRunningSyntheticFrontEnd::GetIndexOfChildWithName (const ConstString &name)
> {
>     return 0;
> @@ -1440,7 +1440,7 @@ lldb_private::formatters::NSDictionaryCo
> SyntheticChildrenFrontEnd(*valobj_sp.get())
> {}
> 
> -uint32_t
> +size_t
> lldb_private::formatters::NSDictionaryCodeRunningSyntheticFrontEnd::CalculateNumChildren ()
> {
>     uint64_t count = 0;
> @@ -1450,14 +1450,14 @@ lldb_private::formatters::NSDictionaryCo
> }
> 
> lldb::ValueObjectSP
> -lldb_private::formatters::NSDictionaryCodeRunningSyntheticFrontEnd::GetChildAtIndex (uint32_t idx)
> +lldb_private::formatters::NSDictionaryCodeRunningSyntheticFrontEnd::GetChildAtIndex (size_t idx)
> {
>     StreamString idx_name;
> -    idx_name.Printf("[%d]",idx);
> +    idx_name.Printf("[%zu]",idx);
>     StreamString valobj_expr_path;
>     m_backend.GetExpressionPath(valobj_expr_path, false);
>     StreamString key_fetcher_expr;
> -    key_fetcher_expr.Printf("(id)[(NSArray*)[%s allKeys] objectAtIndex:%d]",valobj_expr_path.GetData(),idx);
> +    key_fetcher_expr.Printf("(id)[(NSArray*)[%s allKeys] objectAtIndex:%zu]",valobj_expr_path.GetData(),idx);
>     StreamString value_fetcher_expr;
>     value_fetcher_expr.Printf("(id)[%s objectForKey:%s]",valobj_expr_path.GetData(),key_fetcher_expr.GetData());
>     StreamString object_fetcher_expr;
> @@ -1482,7 +1482,7 @@ lldb_private::formatters::NSDictionaryCo
>     return true;
> }
> 
> -uint32_t
> +size_t
> lldb_private::formatters::NSDictionaryCodeRunningSyntheticFrontEnd::GetIndexOfChildWithName (const ConstString &name)
> {
>     return 0;
> @@ -1510,7 +1510,7 @@ lldb_private::formatters::NSDictionaryIS
>     m_data_64 = NULL;
> }
> 
> -uint32_t
> +size_t
> lldb_private::formatters::NSDictionaryISyntheticFrontEnd::GetIndexOfChildWithName (const ConstString &name)
> {
>     const char* item_name = name.GetCString();
> @@ -1520,7 +1520,7 @@ lldb_private::formatters::NSDictionaryIS
>     return idx;
> }
> 
> -uint32_t
> +size_t
> lldb_private::formatters::NSDictionaryISyntheticFrontEnd::CalculateNumChildren ()
> {
>     if (!m_data_32 && !m_data_64)
> @@ -1581,7 +1581,7 @@ lldb_private::formatters::NSDictionaryIS
> }
> 
> lldb::ValueObjectSP
> -lldb_private::formatters::NSDictionaryISyntheticFrontEnd::GetChildAtIndex (uint32_t idx)
> +lldb_private::formatters::NSDictionaryISyntheticFrontEnd::GetChildAtIndex (size_t idx)
> {
>     uint32_t num_children = CalculateNumChildren();
> 
> @@ -1633,7 +1633,7 @@ lldb_private::formatters::NSDictionaryIS
>         StreamString expr;
>         expr.Printf("struct __lldb_autogen_nspair { id key; id value; } _lldb_valgen_item; _lldb_valgen_item.key = (id)%" PRIu64 " ; _lldb_valgen_item.value = (id)%" PRIu64 "; _lldb_valgen_item;",dict_item.key_ptr,dict_item.val_ptr);
>         StreamString idx_name;
> -        idx_name.Printf("[%d]",idx);
> +        idx_name.Printf("[%zu]",idx);
>         dict_item.valobj_sp = ValueObject::CreateValueObjectFromExpression(idx_name.GetData(), expr.GetData(), m_exe_ctx_ref);
>     }
>     return dict_item.valobj_sp;
> @@ -1658,7 +1658,7 @@ lldb_private::formatters::NSDictionaryMS
>     m_data_64 = NULL;
> }
> 
> -uint32_t
> +size_t
> lldb_private::formatters::NSDictionaryMSyntheticFrontEnd::GetIndexOfChildWithName (const ConstString &name)
> {
>     const char* item_name = name.GetCString();
> @@ -1668,7 +1668,7 @@ lldb_private::formatters::NSDictionaryMS
>     return idx;
> }
> 
> -uint32_t
> +size_t
> lldb_private::formatters::NSDictionaryMSyntheticFrontEnd::CalculateNumChildren ()
> {
>     if (!m_data_32 && !m_data_64)
> @@ -1728,7 +1728,7 @@ lldb_private::formatters::NSDictionaryMS
> }
> 
> lldb::ValueObjectSP
> -lldb_private::formatters::NSDictionaryMSyntheticFrontEnd::GetChildAtIndex (uint32_t idx)
> +lldb_private::formatters::NSDictionaryMSyntheticFrontEnd::GetChildAtIndex (size_t idx)
> {
>     lldb::addr_t m_keys_ptr = (m_data_32 ? m_data_32->_keys_addr : m_data_64->_keys_addr);
>     lldb::addr_t m_values_ptr = (m_data_32 ? m_data_32->_objs_addr : m_data_64->_objs_addr);
> @@ -1783,7 +1783,7 @@ lldb_private::formatters::NSDictionaryMS
>         StreamString expr;
>         expr.Printf("struct __lldb_autogen_nspair { id key; id value; } _lldb_valgen_item; _lldb_valgen_item.key = (id)%" PRIu64 " ; _lldb_valgen_item.value = (id)%" PRIu64 "; _lldb_valgen_item;",dict_item.key_ptr,dict_item.val_ptr);
>         StreamString idx_name;
> -        idx_name.Printf("[%d]",idx);
> +        idx_name.Printf("[%zu]",idx);
>         dict_item.valobj_sp = ValueObject::CreateValueObjectFromExpression(idx_name.GetData(), expr.GetData(), m_exe_ctx_ref);
>     }
>     return dict_item.valobj_sp;
> 
> Copied: lldb/trunk/source/DataFormatters/DataVisualization.cpp (from r173281, lldb/trunk/source/Core/DataVisualization.cpp)
> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/DataFormatters/DataVisualization.cpp?p2=lldb/trunk/source/DataFormatters/DataVisualization.cpp&p1=lldb/trunk/source/Core/DataVisualization.cpp&r1=173281&r2=173728&rev=173728&view=diff
> ==============================================================================
> --- lldb/trunk/source/Core/DataVisualization.cpp (original)
> +++ lldb/trunk/source/DataFormatters/DataVisualization.cpp Mon Jan 28 17:47:25 2013
> @@ -9,7 +9,7 @@
> 
> #include "lldb/lldb-python.h"
> 
> -#include "lldb/Core/DataVisualization.h"
> +#include "lldb/DataFormatters/DataVisualization.h"
> 
> // C Includes
> // C++ Includes
> @@ -80,20 +80,20 @@ DataVisualization::ValueFormats::LoopThr
>     GetFormatManager().GetValueNavigator().LoopThrough(callback, callback_baton);
> }
> 
> -uint32_t
> +size_t
> DataVisualization::ValueFormats::GetCount ()
> {
>     return GetFormatManager().GetValueNavigator().GetCount();
> }
> 
> lldb::TypeNameSpecifierImplSP
> -DataVisualization::ValueFormats::GetTypeNameSpecifierForFormatAtIndex (uint32_t index)
> +DataVisualization::ValueFormats::GetTypeNameSpecifierForFormatAtIndex (size_t index)
> {
>     return GetFormatManager().GetValueNavigator().GetTypeNameSpecifierAtIndex(index);
> }
> 
> lldb::TypeFormatImplSP
> -DataVisualization::ValueFormats::GetFormatAtIndex (uint32_t index)
> +DataVisualization::ValueFormats::GetFormatAtIndex (size_t index)
> {
>     return GetFormatManager().GetValueNavigator().GetAtIndex(index);
> }
> @@ -135,7 +135,7 @@ DataVisualization::GetFilterForType (lld
> }
> 
> #ifndef LLDB_DISABLE_PYTHON
> -lldb::TypeSyntheticImplSP
> +lldb::ScriptedSyntheticChildrenSP
> DataVisualization::GetSyntheticForType (lldb::TypeNameSpecifierImplSP type_sp)
> {
>     return GetFormatManager().GetSyntheticForType(type_sp);
> @@ -191,7 +191,7 @@ DataVisualization::Categories::Clear (co
> 
> void
> DataVisualization::Categories::Enable (const ConstString& category,
> -                                       CategoryMap::Position pos)
> +                                       TypeCategoryMap::Position pos)
> {
>     if (GetFormatManager().GetCategory(category)->IsEnabled())
>         GetFormatManager().DisableCategory(category);
> @@ -207,7 +207,7 @@ DataVisualization::Categories::Disable (
> 
> void
> DataVisualization::Categories::Enable (const lldb::TypeCategoryImplSP& category,
> -                                       CategoryMap::Position pos)
> +                                       TypeCategoryMap::Position pos)
> {
>     if (category.get())
>     {
> @@ -237,7 +237,7 @@ DataVisualization::Categories::GetCount 
> }
> 
> lldb::TypeCategoryImplSP
> -DataVisualization::Categories::GetCategoryAtIndex (uint32_t index)
> +DataVisualization::Categories::GetCategoryAtIndex (size_t index)
> {
>     return GetFormatManager().GetCategoryAtIndex(index);
> }
> 
> Added: lldb/trunk/source/DataFormatters/FormatCache.cpp
> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/DataFormatters/FormatCache.cpp?rev=173728&view=auto
> ==============================================================================
> --- lldb/trunk/source/DataFormatters/FormatCache.cpp (added)
> +++ lldb/trunk/source/DataFormatters/FormatCache.cpp Mon Jan 28 17:47:25 2013
> @@ -0,0 +1,163 @@
> +//===-- FormatCache.cpp ------------------------------------------*- C++ -*-===//
> +//
> +//                     The LLVM Compiler Infrastructure
> +//
> +// This file is distributed under the University of Illinois Open Source
> +// License. See LICENSE.TXT for details.
> +//
> +//===----------------------------------------------------------------------===//
> +
> +// C Includes
> +
> +// C++ Includes
> +
> +// Other libraries and framework includes
> +
> +// Project includes
> +#include "lldb/DataFormatters/FormatCache.h"
> +
> +using namespace lldb;
> +using namespace lldb_private;
> +
> +FormatCache::Entry::Entry () :
> +m_summary_cached(false),
> +m_synthetic_cached(false),
> +m_summary_sp(nullptr),
> +m_synthetic_sp(nullptr)
> +{}
> +
> +FormatCache::Entry::Entry (lldb::TypeSummaryImplSP summary_sp) : FormatCache::Entry()
> +{
> +    SetSummary (summary_sp);
> +}
> +
> +FormatCache::Entry::Entry (lldb::SyntheticChildrenSP synthetic_sp) : FormatCache::Entry()
> +{
> +    SetSynthetic (synthetic_sp);
> +}
> +
> +FormatCache::Entry::Entry (lldb::TypeSummaryImplSP summary_sp,lldb::SyntheticChildrenSP synthetic_sp) : FormatCache::Entry()
> +{
> +    SetSummary (summary_sp);
> +    SetSynthetic (synthetic_sp);
> +}
> +
> +bool
> +FormatCache::Entry::IsSummaryCached ()
> +{
> +    return m_summary_cached;
> +}
> +
> +bool
> +FormatCache::Entry::IsSyntheticCached ()
> +{
> +    return m_synthetic_cached;
> +}
> +
> +lldb::TypeSummaryImplSP
> +FormatCache::Entry::GetSummary ()
> +{
> +    return m_summary_sp;
> +}
> +
> +lldb::SyntheticChildrenSP
> +FormatCache::Entry::GetSynthetic ()
> +{
> +    return m_synthetic_sp;
> +}
> +
> +void
> +FormatCache::Entry::SetSummary (lldb::TypeSummaryImplSP summary_sp)
> +{
> +    m_summary_cached = true;
> +    m_summary_sp = summary_sp;
> +}
> +
> +void
> +FormatCache::Entry::SetSynthetic (lldb::SyntheticChildrenSP synthetic_sp)
> +{
> +    m_synthetic_cached = true;
> +    m_synthetic_sp = synthetic_sp;
> +}
> +
> +FormatCache::FormatCache () :
> +m_map(),
> +m_mutex (Mutex::eMutexTypeRecursive)
> +#ifdef LLDB_CONFIGURATION_DEBUG
> +,m_cache_hits(0),m_cache_misses(0)
> +#endif
> +{
> +}
> +
> +FormatCache::Entry&
> +FormatCache::GetEntry (const ConstString& type)
> +{
> +    auto i = m_map.find(type),
> +    e = m_map.end();
> +    if (i != e)
> +        return i->second;
> +    m_map[type] = FormatCache::Entry();
> +    return m_map[type];
> +}
> +
> +bool
> +FormatCache::GetSummary (const ConstString& type,lldb::TypeSummaryImplSP& summary_sp)
> +{
> +    Mutex::Locker lock(m_mutex);
> +    auto entry = GetEntry(type);
> +    if (entry.IsSummaryCached())
> +    {
> +#ifdef LLDB_CONFIGURATION_DEBUG
> +        m_cache_hits++;
> +#endif
> +        summary_sp = entry.GetSummary();
> +        return true;
> +    }
> +#ifdef LLDB_CONFIGURATION_DEBUG
> +    m_cache_misses++;
> +#endif
> +    summary_sp.reset();
> +    return false;
> +}
> +
> +bool
> +FormatCache::GetSynthetic (const ConstString& type,lldb::SyntheticChildrenSP& synthetic_sp)
> +{
> +    Mutex::Locker lock(m_mutex);
> +    auto entry = GetEntry(type);
> +    if (entry.IsSyntheticCached())
> +    {
> +#ifdef LLDB_CONFIGURATION_DEBUG
> +        m_cache_hits++;
> +#endif
> +        synthetic_sp = entry.GetSynthetic();
> +        return true;
> +    }
> +#ifdef LLDB_CONFIGURATION_DEBUG
> +    m_cache_misses++;
> +#endif
> +    synthetic_sp.reset();
> +    return false;
> +}
> +
> +void
> +FormatCache::SetSummary (const ConstString& type,lldb::TypeSummaryImplSP& summary_sp)
> +{
> +    Mutex::Locker lock(m_mutex);
> +    GetEntry(type).SetSummary(summary_sp);
> +}
> +
> +void
> +FormatCache::SetSynthetic (const ConstString& type,lldb::SyntheticChildrenSP& synthetic_sp)
> +{
> +    Mutex::Locker lock(m_mutex);
> +    GetEntry(type).SetSynthetic(synthetic_sp);
> +}
> +
> +void
> +FormatCache::Clear ()
> +{
> +    Mutex::Locker lock(m_mutex);
> +    m_map.clear();
> +}
> +
> 
> Copied: lldb/trunk/source/DataFormatters/FormatClasses.cpp (from r173281, lldb/trunk/source/Core/FormatClasses.cpp)
> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/DataFormatters/FormatClasses.cpp?p2=lldb/trunk/source/DataFormatters/FormatClasses.cpp&p1=lldb/trunk/source/Core/FormatClasses.cpp&r1=173281&r2=173728&rev=173728&view=diff
> ==============================================================================
> --- lldb/trunk/source/Core/FormatClasses.cpp (original)
> +++ lldb/trunk/source/DataFormatters/FormatClasses.cpp Mon Jan 28 17:47:25 2013
> @@ -20,9 +20,9 @@
> #include "lldb/lldb-enumerations.h"
> 
> #include "lldb/Core/Debugger.h"
> -#include "lldb/Core/FormatClasses.h"
> #include "lldb/Core/StreamString.h"
> #include "lldb/Core/Timer.h"
> +#include "lldb/DataFormatters/FormatClasses.h"
> #include "lldb/Interpreter/CommandInterpreter.h"
> #include "lldb/Symbol/ClangASTType.h"
> #include "lldb/Target/StackFrame.h"
> @@ -31,379 +31,3 @@
> using namespace lldb;
> using namespace lldb_private;
> 
> -TypeFormatImpl::TypeFormatImpl (lldb::Format f,
> -                          const Flags& flags) : 
> -    m_flags(flags),
> -    m_format (f)
> -{
> -}
> -
> -std::string
> -TypeFormatImpl::GetDescription()
> -{
> -    StreamString sstr;
> -    sstr.Printf ("%s%s%s%s\n", 
> -                 FormatManager::GetFormatAsCString (GetFormat()),
> -                 Cascades() ? "" : " (not cascading)",
> -                 SkipsPointers() ? " (skip pointers)" : "",
> -                 SkipsReferences() ? " (skip references)" : "");
> -    return sstr.GetString();
> -}
> -
> -TypeSummaryImpl::TypeSummaryImpl(const TypeSummaryImpl::Flags& flags) :
> -    m_flags(flags)
> -{
> -}
> -
> -
> -StringSummaryFormat::StringSummaryFormat(const TypeSummaryImpl::Flags& flags,
> -                                         const char *format_cstr) :
> -    TypeSummaryImpl(flags),
> -    m_format()
> -{
> -  if (format_cstr)
> -    m_format.assign(format_cstr);
> -}
> -
> -bool
> -StringSummaryFormat::FormatObject(ValueObject *valobj,
> -                                  std::string& retval)
> -{
> -    if (!valobj)
> -    {
> -        retval.assign("NULL ValueObject");
> -        return false;
> -    }
> -    
> -    StreamString s;
> -    ExecutionContext exe_ctx (valobj->GetExecutionContextRef());
> -    SymbolContext sc;
> -    StackFrame *frame = exe_ctx.GetFramePtr();
> -    if (frame)
> -        sc = frame->GetSymbolContext(lldb::eSymbolContextEverything);
> -    
> -    if (IsOneliner())
> -    {
> -        ValueObject* object;
> -        
> -        ValueObjectSP synth_valobj = valobj->GetSyntheticValue();
> -        if (synth_valobj)
> -            object = synth_valobj.get();
> -        else
> -            object = valobj;
> -        
> -        const uint32_t num_children = object->GetNumChildren();
> -        if (num_children)
> -        {
> -            s.PutChar('(');
> -            
> -            for (uint32_t idx=0; idx<num_children; ++idx)
> -            {
> -                lldb::ValueObjectSP child_sp(object->GetChildAtIndex(idx, true));
> -                if (child_sp.get())
> -                {
> -                    if (idx)
> -                        s.PutCString(", ");
> -                    if (!HideNames())
> -                    {
> -                        s.PutCString(child_sp.get()->GetName().AsCString());
> -                        s.PutCString(" = ");
> -                    }
> -                    child_sp.get()->DumpPrintableRepresentation(s,
> -                                                                ValueObject::eValueObjectRepresentationStyleSummary,
> -                                                                lldb::eFormatInvalid,
> -                                                                ValueObject::ePrintableRepresentationSpecialCasesDisable);
> -                }
> -            }
> -            
> -            s.PutChar(')');
> -            
> -            retval.assign(s.GetString());
> -            return true;
> -        }
> -        else
> -        {
> -            retval.assign("error: oneliner for no children");
> -            return false;
> -        }
> -        
> -    }
> -    else
> -    {
> -        if (Debugger::FormatPrompt(m_format.c_str(), &sc, &exe_ctx, &sc.line_entry.range.GetBaseAddress(), s, NULL, valobj))
> -        {
> -            retval.assign(s.GetString());
> -            return true;
> -        }
> -        else
> -        {
> -            retval.assign("error: summary string parsing error");
> -            return false;
> -        }
> -    }
> -}
> -
> -std::string
> -StringSummaryFormat::GetDescription()
> -{
> -    StreamString sstr;
> -    
> -    sstr.Printf ("`%s`%s%s%s%s%s%s%s",      m_format.c_str(),
> -                 Cascades() ? "" : " (not cascading)",
> -                 !DoesPrintChildren() ? "" : " (show children)",
> -                 !DoesPrintValue() ? " (hide value)" : "",
> -                 IsOneliner() ? " (one-line printout)" : "",
> -                 SkipsPointers() ? " (skip pointers)" : "",
> -                 SkipsReferences() ? " (skip references)" : "",
> -                 HideNames() ? " (hide member names)" : "");
> -    return sstr.GetString();
> -}
> -
> -CXXFunctionSummaryFormat::CXXFunctionSummaryFormat (const TypeSummaryImpl::Flags& flags,
> -                                                    Callback impl,
> -                                                    const char* description) :
> -                                                    TypeSummaryImpl(flags),
> -                                                    m_impl(impl),
> -                                                    m_description(description ? description : "")
> -{
> -}
> -    
> -bool
> -CXXFunctionSummaryFormat::FormatObject(ValueObject *valobj,
> -                                       std::string& dest)
> -{
> -    dest.clear();
> -    StreamString stream;
> -    if (!m_impl || m_impl(*valobj,stream) == false)
> -        return false;
> -    dest.assign(stream.GetData());
> -    return true;
> -}
> -
> -std::string
> -CXXFunctionSummaryFormat::GetDescription()
> -{
> -    StreamString sstr;
> -    sstr.Printf ("`%s (%p) `%s%s%s%s%s%s%s",      m_description.c_str(),m_impl,
> -                 Cascades() ? "" : " (not cascading)",
> -                 !DoesPrintChildren() ? "" : " (show children)",
> -                 !DoesPrintValue() ? " (hide value)" : "",
> -                 IsOneliner() ? " (one-line printout)" : "",
> -                 SkipsPointers() ? " (skip pointers)" : "",
> -                 SkipsReferences() ? " (skip references)" : "",
> -                 HideNames() ? " (hide member names)" : "");
> -    return sstr.GetString();
> -}
> -
> -#ifndef LLDB_DISABLE_PYTHON
> -
> -
> -ScriptSummaryFormat::ScriptSummaryFormat(const TypeSummaryImpl::Flags& flags,
> -                                         const char * function_name,
> -                                         const char * python_script) :
> -    TypeSummaryImpl(flags),
> -    m_function_name(),
> -    m_python_script(),
> -    m_script_function_sp()
> -{
> -   if (function_name)
> -     m_function_name.assign(function_name);
> -   if (python_script)
> -     m_python_script.assign(python_script);
> -}
> -
> -bool
> -ScriptSummaryFormat::FormatObject(ValueObject *valobj,
> -                                  std::string& retval)
> -{
> -    Timer scoped_timer (__PRETTY_FUNCTION__, __PRETTY_FUNCTION__);
> -
> -    TargetSP target_sp(valobj->GetTargetSP());
> -
> -    if (!target_sp)
> -    {
> -        retval.assign("error: no target");
> -        return false;
> -    }
> -
> -    ScriptInterpreter *script_interpreter = target_sp->GetDebugger().GetCommandInterpreter().GetScriptInterpreter();
> -
> -    if (!script_interpreter)
> -    {
> -        retval.assign("error: no ScriptInterpreter");
> -        return false;
> -    }
> -        
> -    return script_interpreter->GetScriptedSummary(m_function_name.c_str(),
> -                                                  valobj->GetSP(),
> -                                                  m_script_function_sp,
> -                                                  retval);
> -
> -}
> -
> -std::string
> -ScriptSummaryFormat::GetDescription()
> -{
> -    StreamString sstr;
> -    sstr.Printf ("%s%s%s%s%s%s%s\n%s",       Cascades() ? "" : " (not cascading)",
> -                 !DoesPrintChildren() ? "" : " (show children)",
> -                 !DoesPrintValue() ? " (hide value)" : "",
> -                 IsOneliner() ? " (one-line printout)" : "",
> -                 SkipsPointers() ? " (skip pointers)" : "",
> -                 SkipsReferences() ? " (skip references)" : "",
> -                 HideNames() ? " (hide member names)" : "",
> -                 m_python_script.c_str());
> -    return sstr.GetString();
> -    
> -}
> -
> -#endif // #ifndef LLDB_DISABLE_PYTHON
> -
> -std::string
> -TypeFilterImpl::GetDescription()
> -{
> -    StreamString sstr;
> -    sstr.Printf("%s%s%s {\n",
> -                Cascades() ? "" : " (not cascading)",
> -                SkipsPointers() ? " (skip pointers)" : "",
> -                SkipsReferences() ? " (skip references)" : "");
> -    
> -    for (int i = 0; i < GetCount(); i++)
> -    {
> -        sstr.Printf("    %s\n",
> -                    GetExpressionPathAtIndex(i));
> -    }
> -                    
> -    sstr.Printf("}");
> -    return sstr.GetString();
> -}
> -
> -std::string
> -CXXSyntheticChildren::GetDescription()
> -{
> -    StreamString sstr;
> -    sstr.Printf("%s%s%s Generator at %p - %s\n",
> -                Cascades() ? "" : " (not cascading)",
> -                SkipsPointers() ? " (skip pointers)" : "",
> -                SkipsReferences() ? " (skip references)" : "",
> -                m_create_callback,
> -                m_description.c_str());
> -    
> -    return sstr.GetString();
> -}
> -
> -std::string
> -SyntheticArrayView::GetDescription()
> -{
> -    StreamString sstr;
> -    sstr.Printf("%s%s%s {\n",
> -                Cascades() ? "" : " (not cascading)",
> -                SkipsPointers() ? " (skip pointers)" : "",
> -                SkipsReferences() ? " (skip references)" : "");
> -    
> -    SyntheticArrayRange* ptr = &m_head;
> -    while (ptr && ptr != m_tail)
> -    {
> -        if (ptr->GetLow() == ptr->GetHigh())
> -            sstr.Printf("    [%d]\n",
> -                        ptr->GetLow());
> -        else
> -            sstr.Printf("    [%d-%d]\n",
> -                        ptr->GetLow(),
> -                        ptr->GetHigh());
> -        ptr = ptr->GetNext();
> -    }
> -    
> -    sstr.Printf("}");
> -    return sstr.GetString();
> -}
> -
> -#ifndef LLDB_DISABLE_PYTHON
> -
> -TypeSyntheticImpl::FrontEnd::FrontEnd(std::string pclass, ValueObject &backend) :
> -    SyntheticChildrenFrontEnd(backend),
> -    m_python_class(pclass),
> -    m_wrapper_sp(),
> -    m_interpreter(NULL)
> -{
> -    if (backend == LLDB_INVALID_UID)
> -        return;
> -    
> -    TargetSP target_sp = backend.GetTargetSP();
> -    
> -    if (!target_sp)
> -        return;
> -    
> -    m_interpreter = target_sp->GetDebugger().GetCommandInterpreter().GetScriptInterpreter();
> -    
> -    if (m_interpreter != NULL)
> -        m_wrapper_sp = m_interpreter->CreateSyntheticScriptedProvider(m_python_class.c_str(), backend.GetSP());
> -}
> -
> -TypeSyntheticImpl::FrontEnd::~FrontEnd()
> -{
> -}
> -
> -lldb::ValueObjectSP
> -TypeSyntheticImpl::FrontEnd::GetChildAtIndex (uint32_t idx)
> -{
> -    if (!m_wrapper_sp || !m_interpreter)
> -        return lldb::ValueObjectSP();
> -    
> -    return m_interpreter->GetChildAtIndex(m_wrapper_sp, idx);
> -}
> -
> -std::string
> -TypeSyntheticImpl::GetDescription()
> -{
> -    StreamString sstr;
> -    sstr.Printf("%s%s%s Python class %s",
> -                Cascades() ? "" : " (not cascading)",
> -                SkipsPointers() ? " (skip pointers)" : "",
> -                SkipsReferences() ? " (skip references)" : "",
> -                m_python_class.c_str());
> -    
> -    return sstr.GetString();
> -}
> -
> -#endif // #ifndef LLDB_DISABLE_PYTHON
> -
> -int
> -SyntheticArrayView::GetRealIndexForIndex(int i)
> -{
> -    if (i >= GetCount())
> -        return -1;
> -    
> -    SyntheticArrayRange* ptr = &m_head;
> -    
> -    int residual = i;
> -    
> -    while(ptr && ptr != m_tail)
> -    {
> -        if (residual >= ptr->GetSelfCount())
> -        {
> -            residual -= ptr->GetSelfCount();
> -            ptr = ptr->GetNext();
> -        }
> -        
> -        return ptr->GetLow() + residual;
> -    }
> -    
> -    return -1;
> -}
> -
> -uint32_t
> -SyntheticArrayView::FrontEnd::GetIndexOfChildWithName (const ConstString &name_cs)
> -{
> -    const char* name_cstr = name_cs.GetCString();
> -    if (*name_cstr != '[')
> -        return UINT32_MAX;
> -    std::string name(name_cstr+1);
> -    if (name[name.size()-1] != ']')
> -        return UINT32_MAX;
> -    name = name.erase(name.size()-1,1);
> -    int index = Args::StringToSInt32 (name.c_str(), -1);
> -    if (index < 0)
> -        return UINT32_MAX;
> -    return index;
> -}
> 
> Copied: lldb/trunk/source/DataFormatters/FormatManager.cpp (from r173281, lldb/trunk/source/Core/FormatManager.cpp)
> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/DataFormatters/FormatManager.cpp?p2=lldb/trunk/source/DataFormatters/FormatManager.cpp&p1=lldb/trunk/source/Core/FormatManager.cpp&r1=173281&r2=173728&rev=173728&view=diff
> ==============================================================================
> --- lldb/trunk/source/Core/FormatManager.cpp (original)
> +++ lldb/trunk/source/DataFormatters/FormatManager.cpp Mon Jan 28 17:47:25 2013
> @@ -9,15 +9,18 @@
> 
> #include "lldb/lldb-python.h"
> 
> -#include "lldb/Core/FormatManager.h"
> +#include "lldb/DataFormatters/FormatManager.h"
> 
> // C Includes
> // C++ Includes
> // Other libraries and framework includes
> // Project includes
> 
> -#include "lldb/Core/CXXFormatterFunctions.h"
> #include "lldb/Core/Debugger.h"
> +#include "lldb/DataFormatters/CXXFormatterFunctions.h"
> +#include "lldb/Interpreter/ScriptInterpreterPython.h"
> +#include "lldb/Target/ExecutionContext.h"
> +#include "lldb/Target/Platform.h"
> 
> using namespace lldb;
> using namespace lldb_private;
> @@ -151,8 +154,6 @@ FormatManager::GetFormatAsFormatChar (ll
>     }
>     return '\0';
> }
> -    
> -
> 
> const char *
> FormatManager::GetFormatAsCString (Format format)
> @@ -162,300 +163,6 @@ FormatManager::GetFormatAsCString (Forma
>     return NULL;
> }
> 
> -TypeCategoryImpl::TypeCategoryImpl(IFormatChangeListener* clist,
> -                                   ConstString name) :
> -    m_summary_nav(new SummaryNavigator("summary",clist)),
> -    m_regex_summary_nav(new RegexSummaryNavigator("regex-summary",clist)),
> -    m_filter_nav(new FilterNavigator("filter",clist)),
> -    m_regex_filter_nav(new RegexFilterNavigator("regex-filter",clist)),
> -#ifndef LLDB_DISABLE_PYTHON
> -    m_synth_nav(new SynthNavigator("synth",clist)),
> -    m_regex_synth_nav(new RegexSynthNavigator("regex-synth",clist)),
> -#endif
> -    m_enabled(false),
> -    m_change_listener(clist),
> -    m_mutex(Mutex::eMutexTypeRecursive),
> -    m_name(name)
> -{}
> -
> -bool
> -TypeCategoryImpl::Get (ValueObject& valobj,
> -                     lldb::TypeSummaryImplSP& entry,
> -                     lldb::DynamicValueType use_dynamic,
> -                     uint32_t* reason)
> -{
> -    if (!IsEnabled())
> -        return false;
> -    if (GetSummaryNavigator()->Get(valobj, entry, use_dynamic, reason))
> -        return true;
> -    bool regex = GetRegexSummaryNavigator()->Get(valobj, entry, use_dynamic, reason);
> -    if (regex && reason)
> -        *reason |= lldb_private::eFormatterChoiceCriterionRegularExpressionSummary;
> -    return regex;
> -}
> -
> -bool
> -TypeCategoryImpl::Get(ValueObject& valobj,
> -                    lldb::SyntheticChildrenSP& entry_sp,
> -                    lldb::DynamicValueType use_dynamic,
> -                    uint32_t* reason)
> -{
> -    if (!IsEnabled())
> -        return false;
> -    TypeFilterImpl::SharedPointer filter_sp;
> -    uint32_t reason_filter = 0;
> -    bool regex_filter = false;
> -    // first find both Filter and Synth, and then check which is most recent
> -    
> -    if (!GetFilterNavigator()->Get(valobj, filter_sp, use_dynamic, &reason_filter))
> -        regex_filter = GetRegexFilterNavigator()->Get (valobj, filter_sp, use_dynamic, &reason_filter);
> -
> -#ifndef LLDB_DISABLE_PYTHON
> -    bool regex_synth = false;
> -    uint32_t reason_synth = 0;    
> -    bool pick_synth = false;
> -    TypeSyntheticImpl::SharedPointer synth;
> -    if (!GetSyntheticNavigator()->Get(valobj, synth, use_dynamic, &reason_synth))
> -        regex_synth = GetRegexSyntheticNavigator()->Get (valobj, synth, use_dynamic, &reason_synth);
> -    if (!filter_sp.get() && !synth.get())
> -        return false;
> -    else if (!filter_sp.get() && synth.get())
> -        pick_synth = true;
> -    
> -    else if (filter_sp.get() && !synth.get())
> -        pick_synth = false;
> -    
> -    else /*if (filter_sp.get() && synth.get())*/
> -    {
> -        if (filter_sp->GetRevision() > synth->GetRevision())
> -            pick_synth = false;
> -        else
> -            pick_synth = true;
> -    }
> -    if (pick_synth)
> -    {
> -        if (regex_synth && reason)
> -            *reason |= lldb_private::eFormatterChoiceCriterionRegularExpressionFilter;
> -        entry_sp = synth;
> -        return true;
> -    }
> -    else
> -    {
> -        if (regex_filter && reason)
> -            *reason |= lldb_private::eFormatterChoiceCriterionRegularExpressionFilter;
> -        entry_sp = filter_sp;
> -        return true;
> -    }
> -
> -#else
> -    if (filter_sp)
> -    {
> -        entry_sp = filter_sp;
> -        return true;
> -    }
> -#endif
> -
> -    return false;    
> -    
> -}
> -
> -void
> -TypeCategoryImpl::Clear (FormatCategoryItems items)
> -{
> -    if ( (items & eFormatCategoryItemSummary) == eFormatCategoryItemSummary )
> -        m_summary_nav->Clear();
> -    if ( (items & eFormatCategoryItemRegexSummary) == eFormatCategoryItemRegexSummary )
> -        m_regex_summary_nav->Clear();
> -    if ( (items & eFormatCategoryItemFilter)  == eFormatCategoryItemFilter )
> -        m_filter_nav->Clear();
> -    if ( (items & eFormatCategoryItemRegexFilter) == eFormatCategoryItemRegexFilter )
> -        m_regex_filter_nav->Clear();
> -#ifndef LLDB_DISABLE_PYTHON
> -    if ( (items & eFormatCategoryItemSynth)  == eFormatCategoryItemSynth )
> -        m_synth_nav->Clear();
> -    if ( (items & eFormatCategoryItemRegexSynth) == eFormatCategoryItemRegexSynth )
> -        m_regex_synth_nav->Clear();
> -#endif
> -}
> -
> -bool
> -TypeCategoryImpl::Delete (ConstString name,
> -                        FormatCategoryItems items)
> -{
> -    bool success = false;
> -    if ( (items & eFormatCategoryItemSummary) == eFormatCategoryItemSummary )
> -        success = m_summary_nav->Delete(name) || success;
> -    if ( (items & eFormatCategoryItemRegexSummary) == eFormatCategoryItemRegexSummary )
> -        success = m_regex_summary_nav->Delete(name) || success;
> -    if ( (items & eFormatCategoryItemFilter)  == eFormatCategoryItemFilter )
> -        success = m_filter_nav->Delete(name) || success;
> -    if ( (items & eFormatCategoryItemRegexFilter) == eFormatCategoryItemRegexFilter )
> -        success = m_regex_filter_nav->Delete(name) || success;
> -#ifndef LLDB_DISABLE_PYTHON
> -    if ( (items & eFormatCategoryItemSynth)  == eFormatCategoryItemSynth )
> -        success = m_synth_nav->Delete(name) || success;
> -    if ( (items & eFormatCategoryItemRegexSynth) == eFormatCategoryItemRegexSynth )
> -        success = m_regex_synth_nav->Delete(name) || success;
> -#endif
> -    return success;
> -}
> -
> -uint32_t
> -TypeCategoryImpl::GetCount (FormatCategoryItems items)
> -{
> -    uint32_t count = 0;
> -    if ( (items & eFormatCategoryItemSummary) == eFormatCategoryItemSummary )
> -        count += m_summary_nav->GetCount();
> -    if ( (items & eFormatCategoryItemRegexSummary) == eFormatCategoryItemRegexSummary )
> -        count += m_regex_summary_nav->GetCount();
> -    if ( (items & eFormatCategoryItemFilter)  == eFormatCategoryItemFilter )
> -        count += m_filter_nav->GetCount();
> -    if ( (items & eFormatCategoryItemRegexFilter) == eFormatCategoryItemRegexFilter )
> -        count += m_regex_filter_nav->GetCount();
> -#ifndef LLDB_DISABLE_PYTHON
> -    if ( (items & eFormatCategoryItemSynth)  == eFormatCategoryItemSynth )
> -        count += m_synth_nav->GetCount();
> -    if ( (items & eFormatCategoryItemRegexSynth) == eFormatCategoryItemRegexSynth )
> -        count += m_regex_synth_nav->GetCount();
> -#endif
> -    return count;
> -}
> -
> -bool
> -TypeCategoryImpl::AnyMatches(ConstString type_name,
> -                           FormatCategoryItems items,
> -                           bool only_enabled,
> -                           const char** matching_category,
> -                           FormatCategoryItems* matching_type)
> -{
> -    if (!IsEnabled() && only_enabled)
> -        return false;
> -    
> -    lldb::TypeSummaryImplSP summary;
> -    TypeFilterImpl::SharedPointer filter;
> -#ifndef LLDB_DISABLE_PYTHON
> -    TypeSyntheticImpl::SharedPointer synth;
> -#endif
> -    
> -    if ( (items & eFormatCategoryItemSummary) == eFormatCategoryItemSummary )
> -    {
> -        if (m_summary_nav->Get(type_name, summary))
> -        {
> -            if (matching_category)
> -                *matching_category = m_name.GetCString();
> -            if (matching_type)
> -                *matching_type = eFormatCategoryItemSummary;
> -            return true;
> -        }
> -    }
> -    if ( (items & eFormatCategoryItemRegexSummary) == eFormatCategoryItemRegexSummary )
> -    {
> -        if (m_regex_summary_nav->Get(type_name, summary))
> -        {
> -            if (matching_category)
> -                *matching_category = m_name.GetCString();
> -            if (matching_type)
> -                *matching_type = eFormatCategoryItemRegexSummary;
> -            return true;
> -        }
> -    }
> -    if ( (items & eFormatCategoryItemFilter)  == eFormatCategoryItemFilter )
> -    {
> -        if (m_filter_nav->Get(type_name, filter))
> -        {
> -            if (matching_category)
> -                *matching_category = m_name.GetCString();
> -            if (matching_type)
> -                *matching_type = eFormatCategoryItemFilter;
> -            return true;
> -        }
> -    }
> -    if ( (items & eFormatCategoryItemRegexFilter) == eFormatCategoryItemRegexFilter )
> -    {
> -        if (m_regex_filter_nav->Get(type_name, filter))
> -        {
> -            if (matching_category)
> -                *matching_category = m_name.GetCString();
> -            if (matching_type)
> -                *matching_type = eFormatCategoryItemRegexFilter;
> -            return true;
> -        }
> -    }
> -#ifndef LLDB_DISABLE_PYTHON
> -    if ( (items & eFormatCategoryItemSynth)  == eFormatCategoryItemSynth )
> -    {
> -        if (m_synth_nav->Get(type_name, synth))
> -        {
> -            if (matching_category)
> -                *matching_category = m_name.GetCString();
> -            if (matching_type)
> -                *matching_type = eFormatCategoryItemSynth;
> -            return true;
> -        }
> -    }
> -    if ( (items & eFormatCategoryItemRegexSynth) == eFormatCategoryItemRegexSynth )
> -    {
> -        if (m_regex_synth_nav->Get(type_name, synth))
> -        {
> -            if (matching_category)
> -                *matching_category = m_name.GetCString();
> -            if (matching_type)
> -                *matching_type = eFormatCategoryItemRegexSynth;
> -            return true;
> -        }
> -    }
> -#endif
> -    return false;
> -}
> -
> -bool
> -CategoryMap::AnyMatches (ConstString type_name,
> -                         TypeCategoryImpl::FormatCategoryItems items,
> -                         bool only_enabled,
> -                         const char** matching_category,
> -                         TypeCategoryImpl::FormatCategoryItems* matching_type)
> -{
> -    Mutex::Locker locker(m_map_mutex);
> -    
> -    MapIterator pos, end = m_map.end();
> -    for (pos = m_map.begin(); pos != end; pos++)
> -    {
> -        if (pos->second->AnyMatches(type_name,
> -                                    items,
> -                                    only_enabled,
> -                                    matching_category,
> -                                    matching_type))
> -            return true;
> -    }
> -    return false;
> -}
> -
> -lldb::TypeSummaryImplSP
> -CategoryMap::GetSummaryFormat (ValueObject& valobj,
> -                               lldb::DynamicValueType use_dynamic)
> -{
> -    Mutex::Locker locker(m_map_mutex);
> -    
> -    uint32_t reason_why;        
> -    ActiveCategoriesIterator begin, end = m_active_categories.end();
> -    
> -    LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_TYPES));
> -    
> -    for (begin = m_active_categories.begin(); begin != end; begin++)
> -    {
> -        lldb::TypeCategoryImplSP category_sp = *begin;
> -        lldb::TypeSummaryImplSP current_format;
> -        if (log)
> -            log->Printf("[CategoryMap::GetSummaryFormat] Trying to use category %s\n", category_sp->GetName());
> -        if (!category_sp->Get(valobj, current_format, use_dynamic, &reason_why))
> -            continue;
> -        return current_format;
> -    }
> -    if (log)
> -        log->Printf("[CategoryMap::GetSummaryFormat] nothing found - returning empty SP\n");
> -    return lldb::TypeSummaryImplSP();
> -}
> -
> lldb::TypeSummaryImplSP
> FormatManager::GetSummaryForType (lldb::TypeNameSpecifierImplSP type_sp)
> {
> @@ -509,12 +216,12 @@ FormatManager::GetFilterForType (lldb::T
> }
> 
> #ifndef LLDB_DISABLE_PYTHON
> -lldb::TypeSyntheticImplSP
> +lldb::ScriptedSyntheticChildrenSP
> FormatManager::GetSyntheticForType (lldb::TypeNameSpecifierImplSP type_sp)
> {
>     if (!type_sp)
> -        return lldb::TypeSyntheticImplSP();
> -    lldb::TypeSyntheticImplSP synth_chosen_sp;
> +        return lldb::ScriptedSyntheticChildrenSP();
> +    lldb::ScriptedSyntheticChildrenSP synth_chosen_sp;
>     uint32_t num_categories = m_categories_map.GetCount();
>     lldb::TypeCategoryImplSP category_sp;
>     uint32_t prio_category = UINT32_MAX;
> @@ -525,7 +232,7 @@ FormatManager::GetSyntheticForType (lldb
>         category_sp = GetCategoryAtIndex(category_id);
>         if (category_sp->IsEnabled() == false)
>             continue;
> -        lldb::TypeSyntheticImplSP synth_current_sp((TypeSyntheticImpl*)category_sp->GetSyntheticForType(type_sp).get());
> +        lldb::ScriptedSyntheticChildrenSP synth_current_sp((ScriptedSyntheticChildren*)category_sp->GetSyntheticForType(type_sp).get());
>         if (synth_current_sp && (synth_chosen_sp.get() == NULL || (prio_category > category_sp->GetEnabledPosition())))
>         {
>             prio_category = category_sp->GetEnabledPosition();
> @@ -543,7 +250,7 @@ FormatManager::GetSyntheticChildrenForTy
>     if (!type_sp)
>         return lldb::SyntheticChildrenSP();
>     lldb::TypeFilterImplSP filter_sp = GetFilterForType(type_sp);
> -    lldb::TypeSyntheticImplSP synth_sp = GetSyntheticForType(type_sp);
> +    lldb::ScriptedSyntheticChildrenSP synth_sp = GetSyntheticForType(type_sp);
>     if (filter_sp->GetRevision() > synth_sp->GetRevision())
>         return lldb::SyntheticChildrenSP(filter_sp.get());
>     else
> @@ -551,88 +258,6 @@ FormatManager::GetSyntheticChildrenForTy
> }
> #endif
> 
> -#ifndef LLDB_DISABLE_PYTHON
> -lldb::SyntheticChildrenSP
> -CategoryMap::GetSyntheticChildren (ValueObject& valobj,
> -                                   lldb::DynamicValueType use_dynamic)
> -{
> -    Mutex::Locker locker(m_map_mutex);
> -    
> -    uint32_t reason_why;
> -    
> -    ActiveCategoriesIterator begin, end = m_active_categories.end();
> -    
> -    LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_TYPES));
> -    
> -    for (begin = m_active_categories.begin(); begin != end; begin++)
> -    {
> -        lldb::TypeCategoryImplSP category_sp = *begin;
> -        lldb::SyntheticChildrenSP current_format;
> -        if (log)
> -            log->Printf("[CategoryMap::GetSyntheticChildren] Trying to use category %s\n", category_sp->GetName());
> -        if (!category_sp->Get(valobj, current_format, use_dynamic, &reason_why))
> -            continue;
> -        return current_format;
> -    }
> -    if (log)
> -        log->Printf("[CategoryMap::GetSyntheticChildren] nothing found - returning empty SP\n");
> -    return lldb::SyntheticChildrenSP();
> -}
> -#endif
> -
> -void
> -CategoryMap::LoopThrough(CallbackType callback, void* param)
> -{
> -    if (callback)
> -    {
> -        Mutex::Locker locker(m_map_mutex);
> -        
> -        // loop through enabled categories in respective order
> -        {
> -            ActiveCategoriesIterator begin, end = m_active_categories.end();
> -            for (begin = m_active_categories.begin(); begin != end; begin++)
> -            {
> -                lldb::TypeCategoryImplSP category = *begin;
> -                ConstString type = ConstString(category->GetName());
> -                if (!callback(param, category))
> -                    break;
> -            }
> -        }
> -        
> -        // loop through disabled categories in just any order
> -        {
> -            MapIterator pos, end = m_map.end();
> -            for (pos = m_map.begin(); pos != end; pos++)
> -            {
> -                if (pos->second->IsEnabled())
> -                    continue;
> -                KeyType type = pos->first;
> -                if (!callback(param, pos->second))
> -                    break;
> -            }
> -        }
> -    }
> -}
> -
> -TypeCategoryImplSP
> -CategoryMap::GetAtIndex (uint32_t index)
> -{
> -    Mutex::Locker locker(m_map_mutex);
> -    
> -    if (index < m_map.size())
> -    {
> -        MapIterator pos, end = m_map.end();
> -        for (pos = m_map.begin(); pos != end; pos++)
> -        {
> -            if (index == 0)
> -                return pos->second;
> -            index--;
> -        }
> -    }
> -    
> -    return TypeCategoryImplSP();
> -}
> -
> lldb::TypeCategoryImplSP
> FormatManager::GetCategory (const ConstString& category_name,
>                          bool can_create)
> @@ -686,7 +311,103 @@ FormatManager::GetValidTypeName (const C
>     return ::GetValidTypeName_Impl(type);
> }
> 
> -FormatManager::FormatManager() : 
> +ConstString
> +GetTypeForCache (ValueObject& valobj,
> +                 lldb::DynamicValueType use_dynamic)
> +{
> +    if (use_dynamic == lldb::eNoDynamicValues)
> +    {
> +        if (valobj.IsDynamic())
> +        {
> +            if (valobj.GetStaticValue())
> +                return valobj.GetStaticValue()->GetQualifiedTypeName();
> +            else
> +                return ConstString();
> +        }
> +        else
> +            return valobj.GetQualifiedTypeName();
> +    }
> +    if (valobj.IsDynamic())
> +        return valobj.GetQualifiedTypeName();
> +    if (valobj.GetDynamicValue(use_dynamic))
> +        return valobj.GetDynamicValue(use_dynamic)->GetQualifiedTypeName();
> +    return ConstString();
> +}
> +
> +#define USE_CACHE 1
> +lldb::TypeSummaryImplSP
> +FormatManager::GetSummaryFormat (ValueObject& valobj,
> +                                 lldb::DynamicValueType use_dynamic)
> +{
> +    TypeSummaryImplSP retval;
> +#if USE_CACHE
> +    LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_TYPES));
> +    ConstString valobj_type(GetTypeForCache(valobj, use_dynamic));
> +    if (valobj_type)
> +    {
> +        if (log)
> +            log->Printf("[FormatManager::GetSummaryFormat] Looking into cache for type %s", valobj_type.AsCString("<invalid>"));
> +        if (m_format_cache.GetSummary(valobj_type,retval))
> +            return retval;
> +        if (log)
> +            log->Printf("[FormatManager::GetSummaryFormat] Cache search failed. Going normal route");
> +    }
> +#endif
> +    retval = m_categories_map.GetSummaryFormat(valobj, use_dynamic);
> +#if USE_CACHE
> +    if (valobj_type)
> +    {
> +        if (log)
> +            log->Printf("[FormatManager::GetSummaryFormat] Caching %p for type %s",retval.get(),valobj_type.AsCString("<invalid>"));
> +        m_format_cache.SetSummary(valobj_type,retval);
> +    }
> +#ifdef LLDB_CONFIGURATION_DEBUG
> +    if (log)
> +        log->Printf("[FormatManager::GetSummaryFormat] Cache hits: %llu - Cache Misses: %llu", m_format_cache.GetCacheHits(), m_format_cache.GetCacheMisses());
> +#endif
> +#endif
> +    return retval;
> +}
> +
> +#ifndef LLDB_DISABLE_PYTHON
> +lldb::SyntheticChildrenSP
> +FormatManager::GetSyntheticChildren (ValueObject& valobj,
> +                      lldb::DynamicValueType use_dynamic)
> +{
> +    SyntheticChildrenSP retval;
> +#if USE_CACHE
> +    LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_TYPES));
> +    ConstString valobj_type(GetTypeForCache(valobj, use_dynamic));
> +    if (valobj_type)
> +    {
> +        if (log)
> +            log->Printf("[FormatManager::GetSyntheticChildren] Looking into cache for type %s\n", valobj_type.AsCString("<invalid>"));
> +        if (m_format_cache.GetSynthetic(valobj_type,retval))
> +            return retval;
> +        if (log)
> +            log->Printf("[FormatManager::GetSyntheticChildren] Cache search failed. Going normal route\n");
> +    }
> +#endif
> +    retval = m_categories_map.GetSyntheticChildren(valobj, use_dynamic);
> +#if USE_CACHE
> +    if (valobj_type)
> +    {
> +        if (log)
> +            log->Printf("[FormatManager::GetSyntheticChildren] Caching %p for type %s\n",retval.get(),valobj_type.AsCString("<invalid>"));
> +        m_format_cache.SetSynthetic(valobj_type,retval);
> +    }
> +#ifdef LLDB_CONFIGURATION_DEBUG
> +    if (log)
> +        log->Printf("[FormatManager::GetSyntheticChildren] Cache hits: %llu - Cache Misses: %llu", m_format_cache.GetCacheHits(), m_format_cache.GetCacheMisses());
> +#endif
> +#endif
> +    return retval;
> +}
> +#endif
> +#undef USE_CACHE
> +
> +FormatManager::FormatManager() :
> +    m_format_cache(),
>     m_value_nav("format",this),
>     m_named_summaries_map(this),
>     m_last_revision(0),
> @@ -702,21 +423,20 @@ FormatManager::FormatManager() : 
>     m_vectortypes_category_name(ConstString("VectorTypes")),
>     m_appkit_category_name(ConstString("AppKit"))
> {
> -    
>     LoadSystemFormatters();
>     LoadLibStdcppFormatters();
>     LoadLibcxxFormatters();
>     LoadObjCFormatters();
> 
> -    EnableCategory(m_objc_category_name,CategoryMap::Last);
> -    EnableCategory(m_corefoundation_category_name,CategoryMap::Last);
> -    EnableCategory(m_appkit_category_name,CategoryMap::Last);
> -    EnableCategory(m_coreservices_category_name,CategoryMap::Last);
> -    EnableCategory(m_coregraphics_category_name,CategoryMap::Last);
> -    EnableCategory(m_gnu_cpp_category_name,CategoryMap::Last);
> -    EnableCategory(m_libcxx_category_name,CategoryMap::Last);
> -    EnableCategory(m_vectortypes_category_name,CategoryMap::Last);
> -    EnableCategory(m_system_category_name,CategoryMap::Last);
> +    EnableCategory(m_objc_category_name,TypeCategoryMap::Last);
> +    EnableCategory(m_corefoundation_category_name,TypeCategoryMap::Last);
> +    EnableCategory(m_appkit_category_name,TypeCategoryMap::Last);
> +    EnableCategory(m_coreservices_category_name,TypeCategoryMap::Last);
> +    EnableCategory(m_coregraphics_category_name,TypeCategoryMap::Last);
> +    EnableCategory(m_gnu_cpp_category_name,TypeCategoryMap::Last);
> +    EnableCategory(m_libcxx_category_name,TypeCategoryMap::Last);
> +    EnableCategory(m_vectortypes_category_name,TypeCategoryMap::Last);
> +    EnableCategory(m_system_category_name,TypeCategoryMap::Last);
> }
> 
> static void
> @@ -769,7 +489,7 @@ static void AddCXXSynthetic  (TypeCatego
>                               CXXSyntheticChildren::CreateFrontEndCallback generator,
>                               const char* description,
>                               ConstString type_name,
> -                              TypeSyntheticImpl::Flags flags)
> +                              ScriptedSyntheticChildren::Flags flags)
> {
>     lldb::SyntheticChildrenSP synth_sp(new CXXSyntheticChildren(flags,description,generator));
>     category_sp->GetSyntheticNavigator()->Add(type_name,synth_sp);
> @@ -822,13 +542,13 @@ FormatManager::LoadLibStdcppFormatters()
>     stl_synth_flags.SetCascades(true).SetSkipPointers(false).SetSkipReferences(false);
> 
>     gnu_category_sp->GetRegexSyntheticNavigator()->Add(RegularExpressionSP(new RegularExpression("^std::vector<.+>(( )?&)?$")),
> -                                                       SyntheticChildrenSP(new TypeSyntheticImpl(stl_synth_flags,
> +                                                       SyntheticChildrenSP(new ScriptedSyntheticChildren(stl_synth_flags,
>                                                                                                  "lldb.formatters.cpp.gnu_libstdcpp.StdVectorSynthProvider")));
>     gnu_category_sp->GetRegexSyntheticNavigator()->Add(RegularExpressionSP(new RegularExpression("^std::map<.+> >(( )?&)?$")),
> -                                                       SyntheticChildrenSP(new TypeSyntheticImpl(stl_synth_flags,
> +                                                       SyntheticChildrenSP(new ScriptedSyntheticChildren(stl_synth_flags,
>                                                                                                  "lldb.formatters.cpp.gnu_libstdcpp.StdMapSynthProvider")));
>     gnu_category_sp->GetRegexSyntheticNavigator()->Add(RegularExpressionSP(new RegularExpression("^std::list<.+>(( )?&)?$")),
> -                                                       SyntheticChildrenSP(new TypeSyntheticImpl(stl_synth_flags,
> +                                                       SyntheticChildrenSP(new ScriptedSyntheticChildren(stl_synth_flags,
>                                                                                                  "lldb.formatters.cpp.gnu_libstdcpp.StdListSynthProvider")));
> 
>     stl_summary_flags.SetDontShowChildren(false);
> @@ -879,22 +599,22 @@ FormatManager::LoadLibcxxFormatters()
>     stl_synth_flags.SetCascades(true).SetSkipPointers(false).SetSkipReferences(false);
> 
>     libcxx_category_sp->GetRegexSyntheticNavigator()->Add(RegularExpressionSP(new RegularExpression("^std::__1::vector<.+>(( )?&)?$")),
> -                                                       SyntheticChildrenSP(new TypeSyntheticImpl(stl_synth_flags,
> +                                                       SyntheticChildrenSP(new ScriptedSyntheticChildren(stl_synth_flags,
>                                                                                                  "lldb.formatters.cpp.libcxx.stdvector_SynthProvider")));
>     libcxx_category_sp->GetRegexSyntheticNavigator()->Add(RegularExpressionSP(new RegularExpression("^std::__1::list<.+>(( )?&)?$")),
> -                                                       SyntheticChildrenSP(new TypeSyntheticImpl(stl_synth_flags,
> +                                                       SyntheticChildrenSP(new ScriptedSyntheticChildren(stl_synth_flags,
>                                                                                                  "lldb.formatters.cpp.libcxx.stdlist_SynthProvider")));
>     libcxx_category_sp->GetRegexSyntheticNavigator()->Add(RegularExpressionSP(new RegularExpression("^std::__1::map<.+> >(( )?&)?$")),
> -                                                       SyntheticChildrenSP(new TypeSyntheticImpl(stl_synth_flags,
> +                                                       SyntheticChildrenSP(new ScriptedSyntheticChildren(stl_synth_flags,
>                                                                                                  "lldb.formatters.cpp.libcxx.stdmap_SynthProvider")));
>     libcxx_category_sp->GetRegexSyntheticNavigator()->Add(RegularExpressionSP(new RegularExpression("^(std::__1::)deque<.+>(( )?&)?$")),
> -                                                          SyntheticChildrenSP(new TypeSyntheticImpl(stl_synth_flags,
> +                                                          SyntheticChildrenSP(new ScriptedSyntheticChildren(stl_synth_flags,
>                                                                                                     "lldb.formatters.cpp.libcxx.stddeque_SynthProvider")));
>     libcxx_category_sp->GetRegexSyntheticNavigator()->Add(RegularExpressionSP(new RegularExpression("^(std::__1::)shared_ptr<.+>(( )?&)?$")),
> -                                                          SyntheticChildrenSP(new TypeSyntheticImpl(stl_synth_flags,
> +                                                          SyntheticChildrenSP(new ScriptedSyntheticChildren(stl_synth_flags,
>                                                                                                     "lldb.formatters.cpp.libcxx.stdsharedptr_SynthProvider")));
>     libcxx_category_sp->GetRegexSyntheticNavigator()->Add(RegularExpressionSP(new RegularExpression("^(std::__1::)weak_ptr<.+>(( )?&)?$")),
> -                                                          SyntheticChildrenSP(new TypeSyntheticImpl(stl_synth_flags,
> +                                                          SyntheticChildrenSP(new ScriptedSyntheticChildren(stl_synth_flags,
>                                                                                                     "lldb.formatters.cpp.libcxx.stdsharedptr_SynthProvider")));
> 
>     stl_summary_flags.SetDontShowChildren(false);stl_summary_flags.SetSkipPointers(true);
> @@ -1141,18 +861,18 @@ FormatManager::LoadObjCFormatters()
> 
>     appkit_flags.SetDontShowChildren(true);
> 
> -    AddCXXSynthetic(appkit_category_sp, lldb_private::formatters::NSArraySyntheticFrontEndCreator, "NSArray synthetic children", ConstString("__NSArrayM"), TypeSyntheticImpl::Flags());
> -    AddCXXSynthetic(appkit_category_sp, lldb_private::formatters::NSArraySyntheticFrontEndCreator, "NSArray synthetic children", ConstString("__NSArrayI"), TypeSyntheticImpl::Flags());
> -    AddCXXSynthetic(appkit_category_sp, lldb_private::formatters::NSArraySyntheticFrontEndCreator, "NSArray synthetic children", ConstString("NSArray"), TypeSyntheticImpl::Flags());
> -    AddCXXSynthetic(appkit_category_sp, lldb_private::formatters::NSArraySyntheticFrontEndCreator, "NSArray synthetic children", ConstString("NSMutableArray"), TypeSyntheticImpl::Flags());
> -    AddCXXSynthetic(appkit_category_sp, lldb_private::formatters::NSArraySyntheticFrontEndCreator, "NSArray synthetic children", ConstString("__NSCFArray"), TypeSyntheticImpl::Flags());
> -
> -    AddCXXSynthetic(appkit_category_sp, lldb_private::formatters::NSDictionarySyntheticFrontEndCreator, "NSDictionary synthetic children", ConstString("__NSDictionaryM"), TypeSyntheticImpl::Flags());
> -    AddCXXSynthetic(appkit_category_sp, lldb_private::formatters::NSDictionarySyntheticFrontEndCreator, "NSDictionary synthetic children", ConstString("__NSDictionaryI"), TypeSyntheticImpl::Flags());
> -    AddCXXSynthetic(appkit_category_sp, lldb_private::formatters::NSDictionarySyntheticFrontEndCreator, "NSDictionary synthetic children", ConstString("NSDictionary"), TypeSyntheticImpl::Flags());
> -    AddCXXSynthetic(appkit_category_sp, lldb_private::formatters::NSDictionarySyntheticFrontEndCreator, "NSDictionary synthetic children", ConstString("NSMutableDictionary"), TypeSyntheticImpl::Flags());
> -    AddCXXSynthetic(appkit_category_sp, lldb_private::formatters::NSDictionarySyntheticFrontEndCreator, "NSDictionary synthetic children", ConstString("CFDictionaryRef"), TypeSyntheticImpl::Flags());
> -    AddCXXSynthetic(appkit_category_sp, lldb_private::formatters::NSDictionarySyntheticFrontEndCreator, "NSDictionary synthetic children", ConstString("CFMutableDictionaryRef"), TypeSyntheticImpl::Flags());
> +    AddCXXSynthetic(appkit_category_sp, lldb_private::formatters::NSArraySyntheticFrontEndCreator, "NSArray synthetic children", ConstString("__NSArrayM"), ScriptedSyntheticChildren::Flags());
> +    AddCXXSynthetic(appkit_category_sp, lldb_private::formatters::NSArraySyntheticFrontEndCreator, "NSArray synthetic children", ConstString("__NSArrayI"), ScriptedSyntheticChildren::Flags());
> +    AddCXXSynthetic(appkit_category_sp, lldb_private::formatters::NSArraySyntheticFrontEndCreator, "NSArray synthetic children", ConstString("NSArray"), ScriptedSyntheticChildren::Flags());
> +    AddCXXSynthetic(appkit_category_sp, lldb_private::formatters::NSArraySyntheticFrontEndCreator, "NSArray synthetic children", ConstString("NSMutableArray"), ScriptedSyntheticChildren::Flags());
> +    AddCXXSynthetic(appkit_category_sp, lldb_private::formatters::NSArraySyntheticFrontEndCreator, "NSArray synthetic children", ConstString("__NSCFArray"), ScriptedSyntheticChildren::Flags());
> +
> +    AddCXXSynthetic(appkit_category_sp, lldb_private::formatters::NSDictionarySyntheticFrontEndCreator, "NSDictionary synthetic children", ConstString("__NSDictionaryM"), ScriptedSyntheticChildren::Flags());
> +    AddCXXSynthetic(appkit_category_sp, lldb_private::formatters::NSDictionarySyntheticFrontEndCreator, "NSDictionary synthetic children", ConstString("__NSDictionaryI"), ScriptedSyntheticChildren::Flags());
> +    AddCXXSynthetic(appkit_category_sp, lldb_private::formatters::NSDictionarySyntheticFrontEndCreator, "NSDictionary synthetic children", ConstString("NSDictionary"), ScriptedSyntheticChildren::Flags());
> +    AddCXXSynthetic(appkit_category_sp, lldb_private::formatters::NSDictionarySyntheticFrontEndCreator, "NSDictionary synthetic children", ConstString("NSMutableDictionary"), ScriptedSyntheticChildren::Flags());
> +    AddCXXSynthetic(appkit_category_sp, lldb_private::formatters::NSDictionarySyntheticFrontEndCreator, "NSDictionary synthetic children", ConstString("CFDictionaryRef"), ScriptedSyntheticChildren::Flags());
> +    AddCXXSynthetic(appkit_category_sp, lldb_private::formatters::NSDictionarySyntheticFrontEndCreator, "NSDictionary synthetic children", ConstString("CFMutableDictionaryRef"), ScriptedSyntheticChildren::Flags());
> 
>     AddScriptSummary(appkit_category_sp, "lldb.formatters.objc.CFBag.CFBag_SummaryProvider", ConstString("CFBagRef"), appkit_flags);
>     AddScriptSummary(appkit_category_sp, "lldb.formatters.objc.CFBag.CFBag_SummaryProvider", ConstString("__CFBag"), appkit_flags);
> @@ -1182,15 +902,14 @@ FormatManager::LoadObjCFormatters()
>     AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSDataSummaryProvider<true>, "NSData summary provider", ConstString("CFDataRef"), appkit_flags);
>     AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSDataSummaryProvider<true>, "NSData summary provider", ConstString("CFMutableDataRef"), appkit_flags);
> 
> -    AddScriptSummary(appkit_category_sp, "lldb.formatters.objc.NSException.NSException_SummaryProvider", ConstString("NSException"), appkit_flags);
> -
>     AddScriptSummary(appkit_category_sp, "lldb.formatters.objc.NSMachPort.NSMachPort_SummaryProvider", ConstString("NSMachPort"), appkit_flags);
> 
>     AddScriptSummary(appkit_category_sp, "lldb.formatters.objc.NSNotification.NSNotification_SummaryProvider", ConstString("NSNotification"), appkit_flags);
>     AddScriptSummary(appkit_category_sp, "lldb.formatters.objc.NSNotification.NSNotification_SummaryProvider", ConstString("NSConcreteNotification"), appkit_flags);
> 
>     AddStringSummary(appkit_category_sp, "domain: ${var._domain} - code: ${var._code}", ConstString("NSError"), appkit_flags);
> -    
> +    AddStringSummary(appkit_category_sp,"name:${var.name%S} reason:${var.reason%S}",ConstString("NSException"),appkit_flags);
> +
>     AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSNumberSummaryProvider, "NSNumber summary provider", ConstString("NSNumber"), appkit_flags);
>     AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSNumberSummaryProvider, "NSNumber summary provider", ConstString("__NSCFBoolean"), appkit_flags);
>     AddCXXSummary(appkit_category_sp, lldb_private::formatters::NSNumberSummaryProvider, "NSNumber summary provider", ConstString("__NSCFNumber"), appkit_flags);
> @@ -1202,6 +921,7 @@ FormatManager::LoadObjCFormatters()
>     AddCXXSummary(appkit_category_sp, lldb_private::formatters::RuntimeSpecificDescriptionSummaryProvider, "NSTask summary provider", ConstString("NSTask"), appkit_flags);
>     AddCXXSummary(appkit_category_sp, lldb_private::formatters::RuntimeSpecificDescriptionSummaryProvider, "NSValue summary provider", ConstString("NSValue"), appkit_flags);
> 
> +
>     AddScriptSummary(appkit_category_sp, "lldb.formatters.objc.NSSet.NSSet_SummaryProvider", ConstString("NSSet"), appkit_flags);
>     AddScriptSummary(appkit_category_sp, "lldb.formatters.objc.NSSet.NSSet_SummaryProvider2", ConstString("CFSetRef"), appkit_flags);
>     AddScriptSummary(appkit_category_sp, "lldb.formatters.objc.NSSet.NSSet_SummaryProvider2", ConstString("CFMutableSetRef"), appkit_flags);
> 
> Added: lldb/trunk/source/DataFormatters/TypeCategory.cpp
> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/DataFormatters/TypeCategory.cpp?rev=173728&view=auto
> ==============================================================================
> --- lldb/trunk/source/DataFormatters/TypeCategory.cpp (added)
> +++ lldb/trunk/source/DataFormatters/TypeCategory.cpp Mon Jan 28 17:47:25 2013
> @@ -0,0 +1,378 @@
> +//===-- TypeCategory.cpp -------------------------------------------*- C++ -*-===//
> +//
> +//                     The LLVM Compiler Infrastructure
> +//
> +// This file is distributed under the University of Illinois Open Source
> +// License. See LICENSE.TXT for details.
> +//
> +//===----------------------------------------------------------------------===//
> +
> +#include "lldb/DataFormatters/TypeCategory.h"
> +
> +// C Includes
> +// C++ Includes
> +// Other libraries and framework includes
> +// Project includes
> +
> +using namespace lldb;
> +using namespace lldb_private;
> +
> +TypeCategoryImpl::TypeCategoryImpl(IFormatChangeListener* clist,
> +                                   ConstString name) :
> +m_summary_nav(new SummaryNavigator("summary",clist)),
> +m_regex_summary_nav(new RegexSummaryNavigator("regex-summary",clist)),
> +m_filter_nav(new FilterNavigator("filter",clist)),
> +m_regex_filter_nav(new RegexFilterNavigator("regex-filter",clist)),
> +#ifndef LLDB_DISABLE_PYTHON
> +m_synth_nav(new SynthNavigator("synth",clist)),
> +m_regex_synth_nav(new RegexSynthNavigator("regex-synth",clist)),
> +#endif
> +m_enabled(false),
> +m_change_listener(clist),
> +m_mutex(Mutex::eMutexTypeRecursive),
> +m_name(name)
> +{}
> +
> +bool
> +TypeCategoryImpl::Get (ValueObject& valobj,
> +                       lldb::TypeSummaryImplSP& entry,
> +                       lldb::DynamicValueType use_dynamic,
> +                       uint32_t* reason)
> +{
> +    if (!IsEnabled())
> +        return false;
> +    if (GetSummaryNavigator()->Get(valobj, entry, use_dynamic, reason))
> +        return true;
> +    bool regex = GetRegexSummaryNavigator()->Get(valobj, entry, use_dynamic, reason);
> +    if (regex && reason)
> +        *reason |= lldb_private::eFormatterChoiceCriterionRegularExpressionSummary;
> +    return regex;
> +}
> +
> +bool
> +TypeCategoryImpl::Get(ValueObject& valobj,
> +                      lldb::SyntheticChildrenSP& entry_sp,
> +                      lldb::DynamicValueType use_dynamic,
> +                      uint32_t* reason)
> +{
> +    if (!IsEnabled())
> +        return false;
> +    TypeFilterImpl::SharedPointer filter_sp;
> +    uint32_t reason_filter = 0;
> +    bool regex_filter = false;
> +    // first find both Filter and Synth, and then check which is most recent
> +    
> +    if (!GetFilterNavigator()->Get(valobj, filter_sp, use_dynamic, &reason_filter))
> +        regex_filter = GetRegexFilterNavigator()->Get (valobj, filter_sp, use_dynamic, &reason_filter);
> +    
> +#ifndef LLDB_DISABLE_PYTHON
> +    bool regex_synth = false;
> +    uint32_t reason_synth = 0;
> +    bool pick_synth = false;
> +    ScriptedSyntheticChildren::SharedPointer synth;
> +    if (!GetSyntheticNavigator()->Get(valobj, synth, use_dynamic, &reason_synth))
> +        regex_synth = GetRegexSyntheticNavigator()->Get (valobj, synth, use_dynamic, &reason_synth);
> +    if (!filter_sp.get() && !synth.get())
> +        return false;
> +    else if (!filter_sp.get() && synth.get())
> +        pick_synth = true;
> +    
> +    else if (filter_sp.get() && !synth.get())
> +        pick_synth = false;
> +    
> +    else /*if (filter_sp.get() && synth.get())*/
> +    {
> +        if (filter_sp->GetRevision() > synth->GetRevision())
> +            pick_synth = false;
> +        else
> +            pick_synth = true;
> +    }
> +    if (pick_synth)
> +    {
> +        if (regex_synth && reason)
> +            *reason |= lldb_private::eFormatterChoiceCriterionRegularExpressionFilter;
> +        entry_sp = synth;
> +        return true;
> +    }
> +    else
> +    {
> +        if (regex_filter && reason)
> +            *reason |= lldb_private::eFormatterChoiceCriterionRegularExpressionFilter;
> +        entry_sp = filter_sp;
> +        return true;
> +    }
> +    
> +#else
> +    if (filter_sp)
> +    {
> +        entry_sp = filter_sp;
> +        return true;
> +    }
> +#endif
> +    
> +    return false;
> +    
> +}
> +
> +void
> +TypeCategoryImpl::Clear (FormatCategoryItems items)
> +{
> +    if ( (items & eFormatCategoryItemSummary) == eFormatCategoryItemSummary )
> +        m_summary_nav->Clear();
> +    if ( (items & eFormatCategoryItemRegexSummary) == eFormatCategoryItemRegexSummary )
> +        m_regex_summary_nav->Clear();
> +    if ( (items & eFormatCategoryItemFilter)  == eFormatCategoryItemFilter )
> +        m_filter_nav->Clear();
> +    if ( (items & eFormatCategoryItemRegexFilter) == eFormatCategoryItemRegexFilter )
> +        m_regex_filter_nav->Clear();
> +#ifndef LLDB_DISABLE_PYTHON
> +    if ( (items & eFormatCategoryItemSynth)  == eFormatCategoryItemSynth )
> +        m_synth_nav->Clear();
> +    if ( (items & eFormatCategoryItemRegexSynth) == eFormatCategoryItemRegexSynth )
> +        m_regex_synth_nav->Clear();
> +#endif
> +}
> +
> +bool
> +TypeCategoryImpl::Delete (ConstString name,
> +                          FormatCategoryItems items)
> +{
> +    bool success = false;
> +    if ( (items & eFormatCategoryItemSummary) == eFormatCategoryItemSummary )
> +        success = m_summary_nav->Delete(name) || success;
> +    if ( (items & eFormatCategoryItemRegexSummary) == eFormatCategoryItemRegexSummary )
> +        success = m_regex_summary_nav->Delete(name) || success;
> +    if ( (items & eFormatCategoryItemFilter)  == eFormatCategoryItemFilter )
> +        success = m_filter_nav->Delete(name) || success;
> +    if ( (items & eFormatCategoryItemRegexFilter) == eFormatCategoryItemRegexFilter )
> +        success = m_regex_filter_nav->Delete(name) || success;
> +#ifndef LLDB_DISABLE_PYTHON
> +    if ( (items & eFormatCategoryItemSynth)  == eFormatCategoryItemSynth )
> +        success = m_synth_nav->Delete(name) || success;
> +    if ( (items & eFormatCategoryItemRegexSynth) == eFormatCategoryItemRegexSynth )
> +        success = m_regex_synth_nav->Delete(name) || success;
> +#endif
> +    return success;
> +}
> +
> +uint32_t
> +TypeCategoryImpl::GetCount (FormatCategoryItems items)
> +{
> +    uint32_t count = 0;
> +    if ( (items & eFormatCategoryItemSummary) == eFormatCategoryItemSummary )
> +        count += m_summary_nav->GetCount();
> +    if ( (items & eFormatCategoryItemRegexSummary) == eFormatCategoryItemRegexSummary )
> +        count += m_regex_summary_nav->GetCount();
> +    if ( (items & eFormatCategoryItemFilter)  == eFormatCategoryItemFilter )
> +        count += m_filter_nav->GetCount();
> +    if ( (items & eFormatCategoryItemRegexFilter) == eFormatCategoryItemRegexFilter )
> +        count += m_regex_filter_nav->GetCount();
> +#ifndef LLDB_DISABLE_PYTHON
> +    if ( (items & eFormatCategoryItemSynth)  == eFormatCategoryItemSynth )
> +        count += m_synth_nav->GetCount();
> +    if ( (items & eFormatCategoryItemRegexSynth) == eFormatCategoryItemRegexSynth )
> +        count += m_regex_synth_nav->GetCount();
> +#endif
> +    return count;
> +}
> +
> +bool
> +TypeCategoryImpl::AnyMatches(ConstString type_name,
> +                             FormatCategoryItems items,
> +                             bool only_enabled,
> +                             const char** matching_category,
> +                             FormatCategoryItems* matching_type)
> +{
> +    if (!IsEnabled() && only_enabled)
> +        return false;
> +    
> +    lldb::TypeSummaryImplSP summary;
> +    TypeFilterImpl::SharedPointer filter;
> +#ifndef LLDB_DISABLE_PYTHON
> +    ScriptedSyntheticChildren::SharedPointer synth;
> +#endif
> +    
> +    if ( (items & eFormatCategoryItemSummary) == eFormatCategoryItemSummary )
> +    {
> +        if (m_summary_nav->Get(type_name, summary))
> +        {
> +            if (matching_category)
> +                *matching_category = m_name.GetCString();
> +            if (matching_type)
> +                *matching_type = eFormatCategoryItemSummary;
> +            return true;
> +        }
> +    }
> +    if ( (items & eFormatCategoryItemRegexSummary) == eFormatCategoryItemRegexSummary )
> +    {
> +        if (m_regex_summary_nav->Get(type_name, summary))
> +        {
> +            if (matching_category)
> +                *matching_category = m_name.GetCString();
> +            if (matching_type)
> +                *matching_type = eFormatCategoryItemRegexSummary;
> +            return true;
> +        }
> +    }
> +    if ( (items & eFormatCategoryItemFilter)  == eFormatCategoryItemFilter )
> +    {
> +        if (m_filter_nav->Get(type_name, filter))
> +        {
> +            if (matching_category)
> +                *matching_category = m_name.GetCString();
> +            if (matching_type)
> +                *matching_type = eFormatCategoryItemFilter;
> +            return true;
> +        }
> +    }
> +    if ( (items & eFormatCategoryItemRegexFilter) == eFormatCategoryItemRegexFilter )
> +    {
> +        if (m_regex_filter_nav->Get(type_name, filter))
> +        {
> +            if (matching_category)
> +                *matching_category = m_name.GetCString();
> +            if (matching_type)
> +                *matching_type = eFormatCategoryItemRegexFilter;
> +            return true;
> +        }
> +    }
> +#ifndef LLDB_DISABLE_PYTHON
> +    if ( (items & eFormatCategoryItemSynth)  == eFormatCategoryItemSynth )
> +    {
> +        if (m_synth_nav->Get(type_name, synth))
> +        {
> +            if (matching_category)
> +                *matching_category = m_name.GetCString();
> +            if (matching_type)
> +                *matching_type = eFormatCategoryItemSynth;
> +            return true;
> +        }
> +    }
> +    if ( (items & eFormatCategoryItemRegexSynth) == eFormatCategoryItemRegexSynth )
> +    {
> +        if (m_regex_synth_nav->Get(type_name, synth))
> +        {
> +            if (matching_category)
> +                *matching_category = m_name.GetCString();
> +            if (matching_type)
> +                *matching_type = eFormatCategoryItemRegexSynth;
> +            return true;
> +        }
> +    }
> +#endif
> +    return false;
> +}
> +
> +TypeCategoryImpl::SummaryNavigator::MapValueType
> +TypeCategoryImpl::GetSummaryForType (lldb::TypeNameSpecifierImplSP type_sp)
> +{
> +    SummaryNavigator::MapValueType retval;
> +    
> +    if (type_sp)
> +    {
> +        if (type_sp->IsRegex())
> +            m_regex_summary_nav->GetExact(ConstString(type_sp->GetName()),retval);
> +        else
> +            m_summary_nav->GetExact(ConstString(type_sp->GetName()),retval);
> +    }
> +    
> +    return retval;
> +}
> +
> +TypeCategoryImpl::FilterNavigator::MapValueType
> +TypeCategoryImpl::GetFilterForType (lldb::TypeNameSpecifierImplSP type_sp)
> +{
> +    FilterNavigator::MapValueType retval;
> +    
> +    if (type_sp)
> +    {
> +        if (type_sp->IsRegex())
> +            m_regex_filter_nav->GetExact(ConstString(type_sp->GetName()),retval);
> +        else
> +            m_filter_nav->GetExact(ConstString(type_sp->GetName()),retval);
> +    }
> +    
> +    return retval;
> +}
> +
> +#ifndef LLDB_DISABLE_PYTHON
> +TypeCategoryImpl::SynthNavigator::MapValueType
> +TypeCategoryImpl::GetSyntheticForType (lldb::TypeNameSpecifierImplSP type_sp)
> +{
> +    SynthNavigator::MapValueType retval;
> +    
> +    if (type_sp)
> +    {
> +        if (type_sp->IsRegex())
> +            m_regex_synth_nav->GetExact(ConstString(type_sp->GetName()),retval);
> +        else
> +            m_synth_nav->GetExact(ConstString(type_sp->GetName()),retval);
> +    }
> +    
> +    return retval;
> +}
> +#endif
> +
> +lldb::TypeNameSpecifierImplSP
> +TypeCategoryImpl::GetTypeNameSpecifierForSummaryAtIndex (size_t index)
> +{
> +    if (index < m_summary_nav->GetCount())
> +        return m_summary_nav->GetTypeNameSpecifierAtIndex(index);
> +    else
> +        return m_regex_summary_nav->GetTypeNameSpecifierAtIndex(index-m_summary_nav->GetCount());
> +}
> +
> +TypeCategoryImpl::SummaryNavigator::MapValueType
> +TypeCategoryImpl::GetSummaryAtIndex (size_t index)
> +{
> +    if (index < m_summary_nav->GetCount())
> +        return m_summary_nav->GetAtIndex(index);
> +    else
> +        return m_regex_summary_nav->GetAtIndex(index-m_summary_nav->GetCount());
> +}
> +
> +TypeCategoryImpl::FilterNavigator::MapValueType
> +TypeCategoryImpl::GetFilterAtIndex (size_t index)
> +{
> +    if (index < m_filter_nav->GetCount())
> +        return m_filter_nav->GetAtIndex(index);
> +    else
> +        return m_regex_filter_nav->GetAtIndex(index-m_filter_nav->GetCount());
> +}
> +
> +lldb::TypeNameSpecifierImplSP
> +TypeCategoryImpl::GetTypeNameSpecifierForFilterAtIndex (size_t index)
> +{
> +    if (index < m_filter_nav->GetCount())
> +        return m_filter_nav->GetTypeNameSpecifierAtIndex(index);
> +    else
> +        return m_regex_filter_nav->GetTypeNameSpecifierAtIndex(index-m_filter_nav->GetCount());
> +}
> +
> +TypeCategoryImpl::SynthNavigator::MapValueType
> +TypeCategoryImpl::GetSyntheticAtIndex (size_t index)
> +{
> +    if (index < m_synth_nav->GetCount())
> +        return m_synth_nav->GetAtIndex(index);
> +    else
> +        return m_regex_synth_nav->GetAtIndex(index-m_synth_nav->GetCount());
> +}
> +
> +lldb::TypeNameSpecifierImplSP
> +TypeCategoryImpl::GetTypeNameSpecifierForSyntheticAtIndex (size_t index)
> +{
> +    if (index < m_synth_nav->GetCount())
> +        return m_synth_nav->GetTypeNameSpecifierAtIndex(index);
> +    else
> +        return m_regex_synth_nav->GetTypeNameSpecifierAtIndex(index - m_synth_nav->GetCount());
> +}
> +
> +void
> +TypeCategoryImpl::Enable (bool value, uint32_t position)
> +{
> +    Mutex::Locker locker(m_mutex);
> +    m_enabled = value;
> +    m_enabled_position = position;
> +    if (m_change_listener)
> +        m_change_listener->Changed();
> +}
> 
> Added: lldb/trunk/source/DataFormatters/TypeCategoryMap.cpp
> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/DataFormatters/TypeCategoryMap.cpp?rev=173728&view=auto
> ==============================================================================
> --- lldb/trunk/source/DataFormatters/TypeCategoryMap.cpp (added)
> +++ lldb/trunk/source/DataFormatters/TypeCategoryMap.cpp Mon Jan 28 17:47:25 2013
> @@ -0,0 +1,283 @@
> +//===-- TypeCategoryMap.cpp ----------------------------------------*- C++ -*-===//
> +//
> +//                     The LLVM Compiler Infrastructure
> +//
> +// This file is distributed under the University of Illinois Open Source
> +// License. See LICENSE.TXT for details.
> +//
> +//===----------------------------------------------------------------------===//
> +
> +#include "lldb/DataFormatters/TypeCategoryMap.h"
> +
> +// C Includes
> +// C++ Includes
> +// Other libraries and framework includes
> +// Project includes
> +
> +using namespace lldb;
> +using namespace lldb_private;
> +
> +TypeCategoryMap::TypeCategoryMap (IFormatChangeListener* lst) :
> +m_map_mutex(Mutex::eMutexTypeRecursive),
> +listener(lst),
> +m_map(),
> +m_active_categories()
> +{
> +    ConstString default_cs("default");
> +    lldb::TypeCategoryImplSP default_sp = lldb::TypeCategoryImplSP(new TypeCategoryImpl(listener, default_cs));
> +    Add(default_cs,default_sp);
> +    Enable(default_cs,First);
> +}
> +
> +void
> +TypeCategoryMap::Add (KeyType name, const ValueSP& entry)
> +{
> +    Mutex::Locker locker(m_map_mutex);
> +    m_map[name] = entry;
> +    if (listener)
> +        listener->Changed();
> +}
> +
> +bool
> +TypeCategoryMap::Delete (KeyType name)
> +{
> +    Mutex::Locker locker(m_map_mutex);
> +    MapIterator iter = m_map.find(name);
> +    if (iter == m_map.end())
> +        return false;
> +    m_map.erase(name);
> +    Disable(name);
> +    if (listener)
> +        listener->Changed();
> +    return true;
> +}
> +
> +bool
> +TypeCategoryMap::Enable (KeyType category_name, Position pos)
> +{
> +    Mutex::Locker locker(m_map_mutex);
> +    ValueSP category;
> +    if (!Get(category_name,category))
> +        return false;
> +    return Enable(category, pos);
> +}
> +
> +bool
> +TypeCategoryMap::Disable (KeyType category_name)
> +{
> +    Mutex::Locker locker(m_map_mutex);
> +    ValueSP category;
> +    if (!Get(category_name,category))
> +        return false;
> +    return Disable(category);
> +}
> +
> +bool
> +TypeCategoryMap::Enable (ValueSP category, Position pos)
> +{
> +    Mutex::Locker locker(m_map_mutex);
> +    if (category.get())
> +    {
> +        Position pos_w = pos;
> +        if (pos == First || m_active_categories.size() == 0)
> +            m_active_categories.push_front(category);
> +        else if (pos == Last || pos == m_active_categories.size())
> +            m_active_categories.push_back(category);
> +        else if (pos < m_active_categories.size())
> +        {
> +            ActiveCategoriesList::iterator iter = m_active_categories.begin();
> +            while (pos_w)
> +            {
> +                pos_w--,iter++;
> +            }
> +            m_active_categories.insert(iter,category);
> +        }
> +        else
> +            return false;
> +        category->Enable(true,
> +                         pos);
> +        return true;
> +    }
> +    return false;
> +}
> +
> +bool
> +TypeCategoryMap::Disable (ValueSP category)
> +{
> +    Mutex::Locker locker(m_map_mutex);
> +    if (category.get())
> +    {
> +        m_active_categories.remove_if(delete_matching_categories(category));
> +        category->Disable();
> +        return true;
> +    }
> +    return false;
> +}
> +
> +void
> +TypeCategoryMap::Clear ()
> +{
> +    Mutex::Locker locker(m_map_mutex);
> +    m_map.clear();
> +    m_active_categories.clear();
> +    if (listener)
> +        listener->Changed();
> +}
> +
> +bool
> +TypeCategoryMap::Get (KeyType name, ValueSP& entry)
> +{
> +    Mutex::Locker locker(m_map_mutex);
> +    MapIterator iter = m_map.find(name);
> +    if (iter == m_map.end())
> +        return false;
> +    entry = iter->second;
> +    return true;
> +}
> +
> +bool
> +TypeCategoryMap::Get (uint32_t pos, ValueSP& entry)
> +{
> +    Mutex::Locker locker(m_map_mutex);
> +    MapIterator iter = m_map.begin();
> +    MapIterator end = m_map.end();
> +    while (pos > 0)
> +    {
> +        iter++;
> +        pos--;
> +        if (iter == end)
> +            return false;
> +    }
> +    entry = iter->second;
> +    return false;
> +}
> +
> +bool
> +TypeCategoryMap::AnyMatches (ConstString type_name,
> +                             TypeCategoryImpl::FormatCategoryItems items,
> +                             bool only_enabled,
> +                             const char** matching_category,
> +                             TypeCategoryImpl::FormatCategoryItems* matching_type)
> +{
> +    Mutex::Locker locker(m_map_mutex);
> +    
> +    MapIterator pos, end = m_map.end();
> +    for (pos = m_map.begin(); pos != end; pos++)
> +    {
> +        if (pos->second->AnyMatches(type_name,
> +                                    items,
> +                                    only_enabled,
> +                                    matching_category,
> +                                    matching_type))
> +            return true;
> +    }
> +    return false;
> +}
> +
> +lldb::TypeSummaryImplSP
> +TypeCategoryMap::GetSummaryFormat (ValueObject& valobj,
> +                                   lldb::DynamicValueType use_dynamic)
> +{
> +    Mutex::Locker locker(m_map_mutex);
> +    
> +    uint32_t reason_why;
> +    ActiveCategoriesIterator begin, end = m_active_categories.end();
> +    
> +    LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_TYPES));
> +    
> +    for (begin = m_active_categories.begin(); begin != end; begin++)
> +    {
> +        lldb::TypeCategoryImplSP category_sp = *begin;
> +        lldb::TypeSummaryImplSP current_format;
> +        if (log)
> +            log->Printf("[CategoryMap::GetSummaryFormat] Trying to use category %s\n", category_sp->GetName());
> +        if (!category_sp->Get(valobj, current_format, use_dynamic, &reason_why))
> +            continue;
> +        return current_format;
> +    }
> +    if (log)
> +        log->Printf("[CategoryMap::GetSummaryFormat] nothing found - returning empty SP\n");
> +    return lldb::TypeSummaryImplSP();
> +}
> +
> +#ifndef LLDB_DISABLE_PYTHON
> +lldb::SyntheticChildrenSP
> +TypeCategoryMap::GetSyntheticChildren (ValueObject& valobj,
> +                                       lldb::DynamicValueType use_dynamic)
> +{
> +    Mutex::Locker locker(m_map_mutex);
> +    
> +    uint32_t reason_why;
> +    
> +    ActiveCategoriesIterator begin, end = m_active_categories.end();
> +    
> +    LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_TYPES));
> +    
> +    for (begin = m_active_categories.begin(); begin != end; begin++)
> +    {
> +        lldb::TypeCategoryImplSP category_sp = *begin;
> +        lldb::SyntheticChildrenSP current_format;
> +        if (log)
> +            log->Printf("[CategoryMap::GetSyntheticChildren] Trying to use category %s\n", category_sp->GetName());
> +        if (!category_sp->Get(valobj, current_format, use_dynamic, &reason_why))
> +            continue;
> +        return current_format;
> +    }
> +    if (log)
> +        log->Printf("[CategoryMap::GetSyntheticChildren] nothing found - returning empty SP\n");
> +    return lldb::SyntheticChildrenSP();
> +}
> +#endif
> +
> +void
> +TypeCategoryMap::LoopThrough(CallbackType callback, void* param)
> +{
> +    if (callback)
> +    {
> +        Mutex::Locker locker(m_map_mutex);
> +        
> +        // loop through enabled categories in respective order
> +        {
> +            ActiveCategoriesIterator begin, end = m_active_categories.end();
> +            for (begin = m_active_categories.begin(); begin != end; begin++)
> +            {
> +                lldb::TypeCategoryImplSP category = *begin;
> +                ConstString type = ConstString(category->GetName());
> +                if (!callback(param, category))
> +                    break;
> +            }
> +        }
> +        
> +        // loop through disabled categories in just any order
> +        {
> +            MapIterator pos, end = m_map.end();
> +            for (pos = m_map.begin(); pos != end; pos++)
> +            {
> +                if (pos->second->IsEnabled())
> +                    continue;
> +                KeyType type = pos->first;
> +                if (!callback(param, pos->second))
> +                    break;
> +            }
> +        }
> +    }
> +}
> +
> +TypeCategoryImplSP
> +TypeCategoryMap::GetAtIndex (uint32_t index)
> +{
> +    Mutex::Locker locker(m_map_mutex);
> +    
> +    if (index < m_map.size())
> +    {
> +        MapIterator pos, end = m_map.end();
> +        for (pos = m_map.begin(); pos != end; pos++)
> +        {
> +            if (index == 0)
> +                return pos->second;
> +            index--;
> +        }
> +    }
> +    
> +    return TypeCategoryImplSP();
> +}
> 
> Added: lldb/trunk/source/DataFormatters/TypeFormat.cpp
> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/DataFormatters/TypeFormat.cpp?rev=173728&view=auto
> ==============================================================================
> --- lldb/trunk/source/DataFormatters/TypeFormat.cpp (added)
> +++ lldb/trunk/source/DataFormatters/TypeFormat.cpp Mon Jan 28 17:47:25 2013
> @@ -0,0 +1,50 @@
> +//===-- TypeFormat.cpp ----------------------------------------*- C++ -*-===//
> +//
> +//                     The LLVM Compiler Infrastructure
> +//
> +// This file is distributed under the University of Illinois Open Source
> +// License. See LICENSE.TXT for details.
> +//
> +//===----------------------------------------------------------------------===//
> +
> +// C Includes
> +
> +// C++ Includes
> +
> +// Other libraries and framework includes
> +
> +// Project includes
> +#include "lldb/lldb-public.h"
> +#include "lldb/lldb-enumerations.h"
> +
> +#include "lldb/Core/Debugger.h"
> +#include "lldb/Core/StreamString.h"
> +#include "lldb/Core/Timer.h"
> +#include "lldb/DataFormatters/TypeFormat.h"
> +#include "lldb/Interpreter/CommandInterpreter.h"
> +#include "lldb/Symbol/ClangASTType.h"
> +#include "lldb/Target/StackFrame.h"
> +#include "lldb/Target/Target.h"
> +
> +using namespace lldb;
> +using namespace lldb_private;
> +
> +TypeFormatImpl::TypeFormatImpl (lldb::Format f,
> +                                const Flags& flags) :
> +m_flags(flags),
> +m_format (f)
> +{
> +}
> +
> +std::string
> +TypeFormatImpl::GetDescription()
> +{
> +    StreamString sstr;
> +    sstr.Printf ("%s%s%s%s\n",
> +                 FormatManager::GetFormatAsCString (GetFormat()),
> +                 Cascades() ? "" : " (not cascading)",
> +                 SkipsPointers() ? " (skip pointers)" : "",
> +                 SkipsReferences() ? " (skip references)" : "");
> +    return sstr.GetString();
> +}
> +
> 
> Added: lldb/trunk/source/DataFormatters/TypeSummary.cpp
> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/DataFormatters/TypeSummary.cpp?rev=173728&view=auto
> ==============================================================================
> --- lldb/trunk/source/DataFormatters/TypeSummary.cpp (added)
> +++ lldb/trunk/source/DataFormatters/TypeSummary.cpp Mon Jan 28 17:47:25 2013
> @@ -0,0 +1,239 @@
> +//===-- TypeSummary.cpp ----------------------------------------*- C++ -*-===//
> +//
> +//                     The LLVM Compiler Infrastructure
> +//
> +// This file is distributed under the University of Illinois Open Source
> +// License. See LICENSE.TXT for details.
> +//
> +//===----------------------------------------------------------------------===//
> +
> +// C Includes
> +
> +// C++ Includes
> +
> +// Other libraries and framework includes
> +
> +// Project includes
> +#include "lldb/lldb-public.h"
> +#include "lldb/lldb-enumerations.h"
> +
> +#include "lldb/Core/Debugger.h"
> +#include "lldb/Core/StreamString.h"
> +#include "lldb/Core/Timer.h"
> +#include "lldb/DataFormatters/TypeSummary.h"
> +#include "lldb/Interpreter/CommandInterpreter.h"
> +#include "lldb/Symbol/ClangASTType.h"
> +#include "lldb/Target/StackFrame.h"
> +#include "lldb/Target/Target.h"
> +
> +using namespace lldb;
> +using namespace lldb_private;
> +
> +TypeSummaryImpl::TypeSummaryImpl (const TypeSummaryImpl::Flags& flags) :
> +m_flags(flags)
> +{
> +}
> +
> +
> +StringSummaryFormat::StringSummaryFormat (const TypeSummaryImpl::Flags& flags,
> +                                          const char *format_cstr) :
> +TypeSummaryImpl(flags),
> +m_format()
> +{
> +    if (format_cstr)
> +        m_format.assign(format_cstr);
> +}
> +
> +bool
> +StringSummaryFormat::FormatObject (ValueObject *valobj,
> +                                   std::string& retval)
> +{
> +    if (!valobj)
> +    {
> +        retval.assign("NULL ValueObject");
> +        return false;
> +    }
> +    
> +    StreamString s;
> +    ExecutionContext exe_ctx (valobj->GetExecutionContextRef());
> +    SymbolContext sc;
> +    StackFrame *frame = exe_ctx.GetFramePtr();
> +    if (frame)
> +        sc = frame->GetSymbolContext(lldb::eSymbolContextEverything);
> +    
> +    if (IsOneliner())
> +    {
> +        ValueObject* object;
> +        
> +        ValueObjectSP synth_valobj = valobj->GetSyntheticValue();
> +        if (synth_valobj)
> +            object = synth_valobj.get();
> +        else
> +            object = valobj;
> +        
> +        const uint32_t num_children = object->GetNumChildren();
> +        if (num_children)
> +        {
> +            s.PutChar('(');
> +            
> +            for (uint32_t idx=0; idx<num_children; ++idx)
> +            {
> +                lldb::ValueObjectSP child_sp(object->GetChildAtIndex(idx, true));
> +                if (child_sp.get())
> +                {
> +                    if (idx)
> +                        s.PutCString(", ");
> +                    if (!HideNames())
> +                    {
> +                        s.PutCString(child_sp.get()->GetName().AsCString());
> +                        s.PutCString(" = ");
> +                    }
> +                    child_sp.get()->DumpPrintableRepresentation(s,
> +                                                                ValueObject::eValueObjectRepresentationStyleSummary,
> +                                                                lldb::eFormatInvalid,
> +                                                                ValueObject::ePrintableRepresentationSpecialCasesDisable);
> +                }
> +            }
> +            
> +            s.PutChar(')');
> +            
> +            retval.assign(s.GetString());
> +            return true;
> +        }
> +        else
> +        {
> +            retval.assign("error: oneliner for no children");
> +            return false;
> +        }
> +        
> +    }
> +    else
> +    {
> +        if (Debugger::FormatPrompt(m_format.c_str(), &sc, &exe_ctx, &sc.line_entry.range.GetBaseAddress(), s, NULL, valobj))
> +        {
> +            retval.assign(s.GetString());
> +            return true;
> +        }
> +        else
> +        {
> +            retval.assign("error: summary string parsing error");
> +            return false;
> +        }
> +    }
> +}
> +
> +std::string
> +StringSummaryFormat::GetDescription ()
> +{
> +    StreamString sstr;
> +    
> +    sstr.Printf ("`%s`%s%s%s%s%s%s%s",      m_format.c_str(),
> +                 Cascades() ? "" : " (not cascading)",
> +                 !DoesPrintChildren() ? "" : " (show children)",
> +                 !DoesPrintValue() ? " (hide value)" : "",
> +                 IsOneliner() ? " (one-line printout)" : "",
> +                 SkipsPointers() ? " (skip pointers)" : "",
> +                 SkipsReferences() ? " (skip references)" : "",
> +                 HideNames() ? " (hide member names)" : "");
> +    return sstr.GetString();
> +}
> +
> +CXXFunctionSummaryFormat::CXXFunctionSummaryFormat (const TypeSummaryImpl::Flags& flags,
> +                                                    Callback impl,
> +                                                    const char* description) :
> +TypeSummaryImpl(flags),
> +m_impl(impl),
> +m_description(description ? description : "")
> +{
> +}
> +
> +bool
> +CXXFunctionSummaryFormat::FormatObject (ValueObject *valobj,
> +                                        std::string& dest)
> +{
> +    dest.clear();
> +    StreamString stream;
> +    if (!m_impl || m_impl(*valobj,stream) == false)
> +        return false;
> +    dest.assign(stream.GetData());
> +    return true;
> +}
> +
> +std::string
> +CXXFunctionSummaryFormat::GetDescription ()
> +{
> +    StreamString sstr;
> +    sstr.Printf ("`%s (%p) `%s%s%s%s%s%s%s",      m_description.c_str(),m_impl,
> +                 Cascades() ? "" : " (not cascading)",
> +                 !DoesPrintChildren() ? "" : " (show children)",
> +                 !DoesPrintValue() ? " (hide value)" : "",
> +                 IsOneliner() ? " (one-line printout)" : "",
> +                 SkipsPointers() ? " (skip pointers)" : "",
> +                 SkipsReferences() ? " (skip references)" : "",
> +                 HideNames() ? " (hide member names)" : "");
> +    return sstr.GetString();
> +}
> +
> +#ifndef LLDB_DISABLE_PYTHON
> +
> +
> +ScriptSummaryFormat::ScriptSummaryFormat (const TypeSummaryImpl::Flags& flags,
> +                                          const char * function_name,
> +                                          const char * python_script) :
> +TypeSummaryImpl(flags),
> +m_function_name(),
> +m_python_script(),
> +m_script_function_sp()
> +{
> +    if (function_name)
> +        m_function_name.assign(function_name);
> +    if (python_script)
> +        m_python_script.assign(python_script);
> +}
> +
> +bool
> +ScriptSummaryFormat::FormatObject (ValueObject *valobj,
> +                                   std::string& retval)
> +{
> +    Timer scoped_timer (__PRETTY_FUNCTION__, __PRETTY_FUNCTION__);
> +    
> +    TargetSP target_sp(valobj->GetTargetSP());
> +    
> +    if (!target_sp)
> +    {
> +        retval.assign("error: no target");
> +        return false;
> +    }
> +    
> +    ScriptInterpreter *script_interpreter = target_sp->GetDebugger().GetCommandInterpreter().GetScriptInterpreter();
> +    
> +    if (!script_interpreter)
> +    {
> +        retval.assign("error: no ScriptInterpreter");
> +        return false;
> +    }
> +    
> +    return script_interpreter->GetScriptedSummary(m_function_name.c_str(),
> +                                                  valobj->GetSP(),
> +                                                  m_script_function_sp,
> +                                                  retval);
> +    
> +}
> +
> +std::string
> +ScriptSummaryFormat::GetDescription ()
> +{
> +    StreamString sstr;
> +    sstr.Printf ("%s%s%s%s%s%s%s\n%s",       Cascades() ? "" : " (not cascading)",
> +                 !DoesPrintChildren() ? "" : " (show children)",
> +                 !DoesPrintValue() ? " (hide value)" : "",
> +                 IsOneliner() ? " (one-line printout)" : "",
> +                 SkipsPointers() ? " (skip pointers)" : "",
> +                 SkipsReferences() ? " (skip references)" : "",
> +                 HideNames() ? " (hide member names)" : "",
> +                 m_python_script.c_str());
> +    return sstr.GetString();
> +    
> +}
> +
> +#endif // #ifndef LLDB_DISABLE_PYTHON
> 
> Added: lldb/trunk/source/DataFormatters/TypeSynthetic.cpp
> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/DataFormatters/TypeSynthetic.cpp?rev=173728&view=auto
> ==============================================================================
> --- lldb/trunk/source/DataFormatters/TypeSynthetic.cpp (added)
> +++ lldb/trunk/source/DataFormatters/TypeSynthetic.cpp Mon Jan 28 17:47:25 2013
> @@ -0,0 +1,112 @@
> +//===-- TypeSynthetic.cpp ----------------------------------------*- C++ -*-===//
> +//
> +//                     The LLVM Compiler Infrastructure
> +//
> +// This file is distributed under the University of Illinois Open Source
> +// License. See LICENSE.TXT for details.
> +//
> +//===----------------------------------------------------------------------===//
> +
> +// C Includes
> +
> +// C++ Includes
> +
> +// Other libraries and framework includes
> +
> +// Project includes
> +#include "lldb/lldb-public.h"
> +#include "lldb/lldb-enumerations.h"
> +
> +#include "lldb/Core/Debugger.h"
> +#include "lldb/Core/StreamString.h"
> +#include "lldb/DataFormatters/TypeSynthetic.h"
> +#include "lldb/Interpreter/CommandInterpreter.h"
> +#include "lldb/Symbol/ClangASTType.h"
> +#include "lldb/Target/StackFrame.h"
> +#include "lldb/Target/Target.h"
> +
> +using namespace lldb;
> +using namespace lldb_private;
> +
> +std::string
> +TypeFilterImpl::GetDescription()
> +{
> +    StreamString sstr;
> +    sstr.Printf("%s%s%s {\n",
> +                Cascades() ? "" : " (not cascading)",
> +                SkipsPointers() ? " (skip pointers)" : "",
> +                SkipsReferences() ? " (skip references)" : "");
> +    
> +    for (int i = 0; i < GetCount(); i++)
> +    {
> +        sstr.Printf("    %s\n",
> +                    GetExpressionPathAtIndex(i));
> +    }
> +    
> +    sstr.Printf("}");
> +    return sstr.GetString();
> +}
> +
> +std::string
> +CXXSyntheticChildren::GetDescription()
> +{
> +    StreamString sstr;
> +    sstr.Printf("%s%s%s Generator at %p - %s\n",
> +                Cascades() ? "" : " (not cascading)",
> +                SkipsPointers() ? " (skip pointers)" : "",
> +                SkipsReferences() ? " (skip references)" : "",
> +                m_create_callback,
> +                m_description.c_str());
> +    
> +    return sstr.GetString();
> +}
> +
> +#ifndef LLDB_DISABLE_PYTHON
> +
> +ScriptedSyntheticChildren::FrontEnd::FrontEnd(std::string pclass, ValueObject &backend) :
> +SyntheticChildrenFrontEnd(backend),
> +m_python_class(pclass),
> +m_wrapper_sp(),
> +m_interpreter(NULL)
> +{
> +    if (backend == LLDB_INVALID_UID)
> +        return;
> +    
> +    TargetSP target_sp = backend.GetTargetSP();
> +    
> +    if (!target_sp)
> +        return;
> +    
> +    m_interpreter = target_sp->GetDebugger().GetCommandInterpreter().GetScriptInterpreter();
> +    
> +    if (m_interpreter != NULL)
> +        m_wrapper_sp = m_interpreter->CreateSyntheticScriptedProvider(m_python_class.c_str(), backend.GetSP());
> +}
> +
> +ScriptedSyntheticChildren::FrontEnd::~FrontEnd()
> +{
> +}
> +
> +lldb::ValueObjectSP
> +ScriptedSyntheticChildren::FrontEnd::GetChildAtIndex (size_t idx)
> +{
> +    if (!m_wrapper_sp || !m_interpreter)
> +        return lldb::ValueObjectSP();
> +    
> +    return m_interpreter->GetChildAtIndex(m_wrapper_sp, idx);
> +}
> +
> +std::string
> +ScriptedSyntheticChildren::GetDescription()
> +{
> +    StreamString sstr;
> +    sstr.Printf("%s%s%s Python class %s",
> +                Cascades() ? "" : " (not cascading)",
> +                SkipsPointers() ? " (skip pointers)" : "",
> +                SkipsReferences() ? " (skip references)" : "",
> +                m_python_class.c_str());
> +    
> +    return sstr.GetString();
> +}
> +
> +#endif // #ifndef LLDB_DISABLE_PYTHON
> 
> Modified: lldb/trunk/source/Interpreter/Args.cpp
> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Interpreter/Args.cpp?rev=173728&r1=173727&r2=173728&view=diff
> ==============================================================================
> --- lldb/trunk/source/Interpreter/Args.cpp (original)
> +++ lldb/trunk/source/Interpreter/Args.cpp Mon Jan 28 17:47:25 2013
> @@ -16,10 +16,10 @@
> // Other libraries and framework includes
> // Project includes
> #include "lldb/Interpreter/Args.h"
> -#include "lldb/Core/FormatManager.h"
> #include "lldb/Core/Stream.h"
> #include "lldb/Core/StreamFile.h"
> #include "lldb/Core/StreamString.h"
> +#include "lldb/DataFormatters/FormatManager.h"
> #include "lldb/Interpreter/Options.h"
> #include "lldb/Interpreter/CommandReturnObject.h"
> #include "lldb/Target/Process.h"
> 
> Modified: lldb/trunk/source/Interpreter/CommandObjectScript.cpp
> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Interpreter/CommandObjectScript.cpp?rev=173728&r1=173727&r2=173728&view=diff
> ==============================================================================
> --- lldb/trunk/source/Interpreter/CommandObjectScript.cpp (original)
> +++ lldb/trunk/source/Interpreter/CommandObjectScript.cpp Mon Jan 28 17:47:25 2013
> @@ -16,13 +16,14 @@
> // Other libraries and framework includes
> // Project includes
> 
> -#include "lldb/Core/DataVisualization.h"
> #include "lldb/Core/Debugger.h"
> -#include "lldb/Interpreter/Args.h"
> 
> +#include "lldb/DataFormatters/DataVisualization.h"
> +
> +#include "lldb/Interpreter/Args.h"
> +#include "lldb/Interpreter/CommandInterpreter.h"
> #include "lldb/Interpreter/CommandReturnObject.h"
> #include "lldb/Interpreter/ScriptInterpreter.h"
> -#include "lldb/Interpreter/CommandInterpreter.h"
> 
> using namespace lldb;
> using namespace lldb_private;
> 
> Modified: lldb/trunk/source/Interpreter/OptionGroupVariable.cpp
> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Interpreter/OptionGroupVariable.cpp?rev=173728&r1=173727&r2=173728&view=diff
> ==============================================================================
> --- lldb/trunk/source/Interpreter/OptionGroupVariable.cpp (original)
> +++ lldb/trunk/source/Interpreter/OptionGroupVariable.cpp Mon Jan 28 17:47:25 2013
> @@ -15,10 +15,10 @@
> // C++ Includes
> // Other libraries and framework includes
> // Project includes
> -#include "lldb/Core/DataVisualization.h"
> #include "lldb/Core/Error.h"
> -#include "lldb/Target/Target.h"
> +#include "lldb/DataFormatters/DataVisualization.h"
> #include "lldb/Interpreter/CommandInterpreter.h"
> +#include "lldb/Target/Target.h"
> #include "lldb/Utility/Utils.h"
> 
> using namespace lldb;
> 
> Modified: lldb/trunk/source/Interpreter/OptionValueArch.cpp
> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Interpreter/OptionValueArch.cpp?rev=173728&r1=173727&r2=173728&view=diff
> ==============================================================================
> --- lldb/trunk/source/Interpreter/OptionValueArch.cpp (original)
> +++ lldb/trunk/source/Interpreter/OptionValueArch.cpp Mon Jan 28 17:47:25 2013
> @@ -15,8 +15,8 @@
> // C++ Includes
> // Other libraries and framework includes
> // Project includes
> -#include "lldb/Core/FormatManager.h"
> #include "lldb/Core/State.h"
> +#include "lldb/DataFormatters/FormatManager.h"
> #include "lldb/Interpreter/Args.h"
> #include "lldb/Interpreter/CommandCompletions.h"
> 
> 
> Modified: lldb/trunk/source/Interpreter/OptionValueDictionary.cpp
> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Interpreter/OptionValueDictionary.cpp?rev=173728&r1=173727&r2=173728&view=diff
> ==============================================================================
> --- lldb/trunk/source/Interpreter/OptionValueDictionary.cpp (original)
> +++ lldb/trunk/source/Interpreter/OptionValueDictionary.cpp Mon Jan 28 17:47:25 2013
> @@ -16,8 +16,8 @@
> // Other libraries and framework includes
> #include "llvm/ADT/StringRef.h"
> // Project includes
> -#include "lldb/Core/FormatManager.h"
> #include "lldb/Core/State.h"
> +#include "lldb/DataFormatters/FormatManager.h"
> #include "lldb/Interpreter/Args.h"
> #include "lldb/Interpreter/OptionValueString.h"
> 
> 
> Modified: lldb/trunk/source/Interpreter/OptionValueFileSpec.cpp
> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Interpreter/OptionValueFileSpec.cpp?rev=173728&r1=173727&r2=173728&view=diff
> ==============================================================================
> --- lldb/trunk/source/Interpreter/OptionValueFileSpec.cpp (original)
> +++ lldb/trunk/source/Interpreter/OptionValueFileSpec.cpp Mon Jan 28 17:47:25 2013
> @@ -15,8 +15,8 @@
> // C++ Includes
> // Other libraries and framework includes
> // Project includes
> -#include "lldb/Core/FormatManager.h"
> #include "lldb/Core/State.h"
> +#include "lldb/DataFormatters/FormatManager.h"
> #include "lldb/Interpreter/Args.h"
> #include "lldb/Interpreter/CommandCompletions.h"
> 
> 
> Modified: lldb/trunk/source/Interpreter/OptionValueFormat.cpp
> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Interpreter/OptionValueFormat.cpp?rev=173728&r1=173727&r2=173728&view=diff
> ==============================================================================
> --- lldb/trunk/source/Interpreter/OptionValueFormat.cpp (original)
> +++ lldb/trunk/source/Interpreter/OptionValueFormat.cpp Mon Jan 28 17:47:25 2013
> @@ -15,8 +15,8 @@
> // C++ Includes
> // Other libraries and framework includes
> // Project includes
> -#include "lldb/Core/FormatManager.h"
> #include "lldb/Core/Stream.h"
> +#include "lldb/DataFormatters/FormatManager.h"
> #include "lldb/Interpreter/Args.h"
> 
> using namespace lldb;
> 
> Modified: lldb/trunk/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCRuntimeV1.cpp
> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCRuntimeV1.cpp?rev=173728&r1=173727&r2=173728&view=diff
> ==============================================================================
> --- lldb/trunk/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCRuntimeV1.cpp (original)
> +++ lldb/trunk/source/Plugins/LanguageRuntime/ObjC/AppleObjCRuntime/AppleObjCRuntimeV1.cpp Mon Jan 28 17:47:25 2013
> @@ -49,13 +49,26 @@ AppleObjCRuntimeV1::AppleObjCRuntimeV1(P
> {
> }
> 
> +// for V1 runtime we just try to return a class name as that is the minimum level of support
> +// required for the data formatters to work
> bool
> AppleObjCRuntimeV1::GetDynamicTypeAndAddress (ValueObject &in_value,
>                                              lldb::DynamicValueType use_dynamic, 
>                                              TypeAndOrName &class_type_or_name, 
>                                              Address &address)
> {
> -    return false;
> +    class_type_or_name.Clear();
> +    if (CouldHaveDynamicValue(in_value))
> +    {
> +        auto class_descriptor(GetClassDescriptor(in_value));
> +        if (class_descriptor && class_descriptor->IsValid() && class_descriptor->GetClassName())
> +        {
> +            const addr_t object_ptr = in_value.GetPointerValue();
> +            address.SetRawAddress(object_ptr);
> +            class_type_or_name.SetName(class_descriptor->GetClassName());
> +        }
> +    }
> +    return class_type_or_name.IsEmpty() == false;
> }
> 
> //------------------------------------------------------------------
> 
> Modified: lldb/trunk/test/functionalities/data-formatter/rdar-12437442/TestRdar12437442.py
> URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/test/functionalities/data-formatter/rdar-12437442/TestRdar12437442.py?rev=173728&r1=173727&r2=173728&view=diff
> ==============================================================================
> --- lldb/trunk/test/functionalities/data-formatter/rdar-12437442/TestRdar12437442.py (original)
> +++ lldb/trunk/test/functionalities/data-formatter/rdar-12437442/TestRdar12437442.py Mon Jan 28 17:47:25 2013
> @@ -69,6 +69,7 @@ class DataFormatterRdar12437442TestCase(
>         self.assertTrue(id_x.GetSummary() == '@"5 objects"', "array does not get correct summary")
> 
>         self.runCmd("next")
> +        self.runCmd("frame select 0")
> 
>         id_x = self.dbg.GetSelectedTarget().GetProcess().GetSelectedThread().GetSelectedFrame().FindVariable("x")
>         id_x.SetPreferDynamicValue(lldb.eDynamicCanRunTarget)
> 
> 
> _______________________________________________
> lldb-commits mailing list
> lldb-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/lldb-commits

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/lldb-commits/attachments/20130128/a0997ee7/attachment.html>


More information about the lldb-commits mailing list