12079Siignatyev//===-- TypeSynthetic.h -------------------------------------------*- C++ -*-===//
22079Siignatyev//
32079Siignatyev//                     The LLVM Compiler Infrastructure
42079Siignatyev//
52079Siignatyev// This file is distributed under the University of Illinois Open Source
62079Siignatyev// License. See LICENSE.TXT for details.
72079Siignatyev//
82079Siignatyev//===----------------------------------------------------------------------===//
92079Siignatyev
102079Siignatyev#ifndef lldb_TypeSynthetic_h_
112079Siignatyev#define lldb_TypeSynthetic_h_
122079Siignatyev
132079Siignatyev// C Includes
142079Siignatyev#include <stdint.h>
152079Siignatyev#include <unistd.h>
162079Siignatyev
172079Siignatyev// C++ Includes
182079Siignatyev#include <string>
192079Siignatyev#include <vector>
202079Siignatyev
212079Siignatyev// Other libraries and framework includes
222079Siignatyev
232079Siignatyev// Project includes
242079Siignatyev#include "lldb/lldb-public.h"
252079Siignatyev#include "lldb/lldb-enumerations.h"
262079Siignatyev
272079Siignatyev#include "lldb/Core/ValueObject.h"
282079Siignatyev#include "lldb/Interpreter/ScriptInterpreterPython.h"
292079Siignatyev#include "lldb/Symbol/Type.h"
302079Siignatyev
312079Siignatyevnamespace lldb_private {
322079Siignatyev    class SyntheticChildrenFrontEnd
332079Siignatyev    {
342079Siignatyev    protected:
352079Siignatyev        ValueObject &m_backend;
362079Siignatyev    public:
372079Siignatyev
382079Siignatyev        SyntheticChildrenFrontEnd (ValueObject &backend) :
392079Siignatyev        m_backend(backend)
402079Siignatyev        {}
412079Siignatyev
422079Siignatyev        virtual
432079Siignatyev        ~SyntheticChildrenFrontEnd ()
442079Siignatyev        {
452079Siignatyev        }
462079Siignatyev
472079Siignatyev        virtual size_t
482079Siignatyev        CalculateNumChildren () = 0;
492079Siignatyev
502079Siignatyev        virtual lldb::ValueObjectSP
512079Siignatyev        GetChildAtIndex (size_t idx) = 0;
522079Siignatyev
532079Siignatyev        virtual size_t
542079Siignatyev        GetIndexOfChildWithName (const ConstString &name) = 0;
552079Siignatyev
562079Siignatyev        // this function is assumed to always succeed and it if fails, the front-end should know to deal
572079Siignatyev        // with it in the correct way (most probably, by refusing to return any children)
582079Siignatyev        // the return value of Update() should actually be interpreted as "ValueObjectSyntheticFilter cache is good/bad"
592079Siignatyev        // if =true, ValueObjectSyntheticFilter is allowed to use the children it fetched previously and cached
602079Siignatyev        // if =false, ValueObjectSyntheticFilter must throw away its cache, and query again for children
612079Siignatyev        virtual bool
622079Siignatyev        Update () = 0;
632079Siignatyev
642079Siignatyev        // if this function returns false, then CalculateNumChildren() MUST return 0 since UI frontends
652079Siignatyev        // might validly decide not to inquire for children given a false return value from this call
662079Siignatyev        // if it returns true, then CalculateNumChildren() can return any number >= 0 (0 being valid)
672079Siignatyev        // it should if at all possible be more efficient than CalculateNumChildren()
682079Siignatyev        virtual bool
692079Siignatyev        MightHaveChildren () = 0;
702079Siignatyev
712079Siignatyev        typedef std::shared_ptr<SyntheticChildrenFrontEnd> SharedPointer;
722079Siignatyev        typedef std::unique_ptr<SyntheticChildrenFrontEnd> AutoPointer;
732079Siignatyev
742079Siignatyev    private:
752079Siignatyev        DISALLOW_COPY_AND_ASSIGN(SyntheticChildrenFrontEnd);
762079Siignatyev    };
772079Siignatyev
782079Siignatyev    class SyntheticChildren
792079Siignatyev    {
802079Siignatyev    public:
812079Siignatyev
822079Siignatyev        class Flags
832079Siignatyev        {
842079Siignatyev        public:
852079Siignatyev
862079Siignatyev            Flags () :
872079Siignatyev            m_flags (lldb::eTypeOptionCascade)
882079Siignatyev            {}
892079Siignatyev
902079Siignatyev            Flags (const Flags& other) :
912079Siignatyev            m_flags (other.m_flags)
922079Siignatyev            {}
932079Siignatyev
942079Siignatyev            Flags (uint32_t value) :
952079Siignatyev            m_flags (value)
962079Siignatyev            {}
972079Siignatyev
982079Siignatyev            Flags&
992079Siignatyev            operator = (const Flags& rhs)
1002079Siignatyev            {
1012079Siignatyev                if (&rhs != this)
1022079Siignatyev                    m_flags = rhs.m_flags;
1032079Siignatyev
1042079Siignatyev                return *this;
1052079Siignatyev            }
1062079Siignatyev
1072079Siignatyev            Flags&
1082079Siignatyev            operator = (const uint32_t& rhs)
1092079Siignatyev            {
1102079Siignatyev                m_flags = rhs;
1112079Siignatyev                return *this;
1122079Siignatyev            }
1132079Siignatyev
1142079Siignatyev            Flags&
1152079Siignatyev            Clear()
1162079Siignatyev            {
1172079Siignatyev                m_flags = 0;
1182079Siignatyev                return *this;
1192079Siignatyev            }
1202079Siignatyev
1212079Siignatyev            bool
1222079Siignatyev            GetCascades () const
1232079Siignatyev            {
1242079Siignatyev                return (m_flags & lldb::eTypeOptionCascade) == lldb::eTypeOptionCascade;
1252079Siignatyev            }
1262079Siignatyev
1272079Siignatyev            Flags&
1282079Siignatyev            SetCascades (bool value = true)
1292079Siignatyev            {
1302079Siignatyev                if (value)
1312079Siignatyev                    m_flags |= lldb::eTypeOptionCascade;
1322079Siignatyev                else
1332079Siignatyev                    m_flags &= ~lldb::eTypeOptionCascade;
1342079Siignatyev                return *this;
1352079Siignatyev            }
1362079Siignatyev
1372079Siignatyev            bool
1382079Siignatyev            GetSkipPointers () const
1392079Siignatyev            {
1402079Siignatyev                return (m_flags & lldb::eTypeOptionSkipPointers) == lldb::eTypeOptionSkipPointers;
1412079Siignatyev            }
1422079Siignatyev
1432079Siignatyev            Flags&
1442079Siignatyev            SetSkipPointers (bool value = true)
1452079Siignatyev            {
1462079Siignatyev                if (value)
1472079Siignatyev                    m_flags |= lldb::eTypeOptionSkipPointers;
1482079Siignatyev                else
1492079Siignatyev                    m_flags &= ~lldb::eTypeOptionSkipPointers;
1502079Siignatyev                return *this;
1512079Siignatyev            }
1522079Siignatyev
1532079Siignatyev            bool
1542079Siignatyev            GetSkipReferences () const
1552079Siignatyev            {
1562079Siignatyev                return (m_flags & lldb::eTypeOptionSkipReferences) == lldb::eTypeOptionSkipReferences;
1572079Siignatyev            }
1582079Siignatyev
1592079Siignatyev            Flags&
1602079Siignatyev            SetSkipReferences (bool value = true)
1612079Siignatyev            {
1622079Siignatyev                if (value)
1632079Siignatyev                    m_flags |= lldb::eTypeOptionSkipReferences;
1642079Siignatyev                else
1652079Siignatyev                    m_flags &= ~lldb::eTypeOptionSkipReferences;
1662079Siignatyev                return *this;
1672079Siignatyev            }
1682079Siignatyev
1692079Siignatyev            uint32_t
1702079Siignatyev            GetValue ()
1712079Siignatyev            {
1722079Siignatyev                return m_flags;
1732079Siignatyev            }
1742079Siignatyev
1752079Siignatyev            void
1762079Siignatyev            SetValue (uint32_t value)
1772079Siignatyev            {
1782079Siignatyev                m_flags = value;
1792079Siignatyev            }
1802079Siignatyev
1812079Siignatyev        private:
1822079Siignatyev            uint32_t m_flags;
1832079Siignatyev        };
1842079Siignatyev
1852079Siignatyev        SyntheticChildren (const Flags& flags) :
1862079Siignatyev        m_flags(flags)
1872079Siignatyev        {
1882079Siignatyev        }
1892079Siignatyev
1902079Siignatyev        virtual
1912079Siignatyev        ~SyntheticChildren ()
1922079Siignatyev        {
1932079Siignatyev        }
1942079Siignatyev
1952079Siignatyev        bool
1962079Siignatyev        Cascades () const
1972079Siignatyev        {
1982079Siignatyev            return m_flags.GetCascades();
1992079Siignatyev        }
2002079Siignatyev        bool
2012079Siignatyev        SkipsPointers () const
2022079Siignatyev        {
2032079Siignatyev            return m_flags.GetSkipPointers();
2042079Siignatyev        }
2052079Siignatyev        bool
2062079Siignatyev        SkipsReferences () const
2072079Siignatyev        {
2082079Siignatyev            return m_flags.GetSkipReferences();
2092079Siignatyev        }
2102079Siignatyev
2112079Siignatyev        void
2122079Siignatyev        SetCascades (bool value)
2132079Siignatyev        {
2142079Siignatyev            m_flags.SetCascades(value);
2152079Siignatyev        }
2162079Siignatyev
2172079Siignatyev        void
2182079Siignatyev        SetSkipsPointers (bool value)
2192079Siignatyev        {
2202079Siignatyev            m_flags.SetSkipPointers(value);
2212079Siignatyev        }
2222079Siignatyev
2232079Siignatyev        void
2242079Siignatyev        SetSkipsReferences (bool value)
2252079Siignatyev        {
2262079Siignatyev            m_flags.SetSkipReferences(value);
2272079Siignatyev        }
2282079Siignatyev
2292079Siignatyev        uint32_t
2302079Siignatyev        GetOptions ()
2312079Siignatyev        {
2322079Siignatyev            return m_flags.GetValue();
2332079Siignatyev        }
2342079Siignatyev
2352079Siignatyev        void
2362079Siignatyev        SetOptions (uint32_t value)
2372079Siignatyev        {
2382079Siignatyev            m_flags.SetValue(value);
2392079Siignatyev        }
2402079Siignatyev
2412079Siignatyev        virtual bool
2422079Siignatyev        IsScripted () = 0;
2432079Siignatyev
2442079Siignatyev        virtual std::string
2452079Siignatyev        GetDescription () = 0;
2462079Siignatyev
2472079Siignatyev        virtual SyntheticChildrenFrontEnd::AutoPointer
2482079Siignatyev        GetFrontEnd (ValueObject &backend) = 0;
2492079Siignatyev
2502079Siignatyev        typedef std::shared_ptr<SyntheticChildren> SharedPointer;
2512079Siignatyev        typedef bool(*SyntheticChildrenCallback)(void*, ConstString, const SyntheticChildren::SharedPointer&);
2522079Siignatyev
2532079Siignatyev        uint32_t&
2542079Siignatyev        GetRevision ()
2552079Siignatyev        {
2562079Siignatyev            return m_my_revision;
2572079Siignatyev        }
2582079Siignatyev
2592079Siignatyev    protected:
2602079Siignatyev        uint32_t m_my_revision;
2612079Siignatyev        Flags m_flags;
2622079Siignatyev
2632079Siignatyev    private:
2642079Siignatyev        DISALLOW_COPY_AND_ASSIGN(SyntheticChildren);
2652079Siignatyev    };
2662079Siignatyev
2672079Siignatyev    class TypeFilterImpl : public SyntheticChildren
2682079Siignatyev    {
2692079Siignatyev        std::vector<std::string> m_expression_paths;
2702079Siignatyev    public:
2712079Siignatyev        TypeFilterImpl(const SyntheticChildren::Flags& flags) :
2722079Siignatyev        SyntheticChildren(flags),
2732079Siignatyev        m_expression_paths()
2742079Siignatyev        {
2752079Siignatyev        }
2762079Siignatyev
2772079Siignatyev        TypeFilterImpl(const SyntheticChildren::Flags& flags,
2782079Siignatyev                       const std::initializer_list<const char*> items) :
2792079Siignatyev        SyntheticChildren(flags),
2802079Siignatyev        m_expression_paths()
2812079Siignatyev        {
2822079Siignatyev            for (auto path : items)
2832079Siignatyev                AddExpressionPath (path);
2842079Siignatyev        }
2852079Siignatyev
2862079Siignatyev        void
2872079Siignatyev        AddExpressionPath (const char* path)
2882079Siignatyev        {
2892079Siignatyev            AddExpressionPath(std::string(path));
2902079Siignatyev        }
2912079Siignatyev
2922079Siignatyev        void
2932079Siignatyev        Clear()
2942079Siignatyev        {
2952079Siignatyev            m_expression_paths.clear();
2962079Siignatyev        }
2972079Siignatyev
2982079Siignatyev        size_t
2992079Siignatyev        GetCount() const
3002079Siignatyev        {
3012079Siignatyev            return m_expression_paths.size();
3022079Siignatyev        }
3032079Siignatyev
3042079Siignatyev        const char*
3052079Siignatyev        GetExpressionPathAtIndex(size_t i) const
3062079Siignatyev        {
3072079Siignatyev            return m_expression_paths[i].c_str();
3082079Siignatyev        }
3092079Siignatyev
3102079Siignatyev        bool
3112079Siignatyev        SetExpressionPathAtIndex (size_t i, const char* path)
3122079Siignatyev        {
3132079Siignatyev            return SetExpressionPathAtIndex(i, std::string(path));
3142079Siignatyev        }
3152079Siignatyev
3162079Siignatyev        void
3172079Siignatyev        AddExpressionPath (const std::string& path)
3182079Siignatyev        {
3192079Siignatyev            bool need_add_dot = true;
3202079Siignatyev            if (path[0] == '.' ||
3212079Siignatyev                (path[0] == '-' && path[1] == '>') ||
3222079Siignatyev                path[0] == '[')
3232079Siignatyev                need_add_dot = false;
3242079Siignatyev            // add a '.' symbol to help forgetful users
3252079Siignatyev            if(!need_add_dot)
3262079Siignatyev                m_expression_paths.push_back(path);
3272079Siignatyev            else
3282079Siignatyev                m_expression_paths.push_back(std::string(".") + path);
3292079Siignatyev        }
3302079Siignatyev
3312079Siignatyev        bool
3322079Siignatyev        SetExpressionPathAtIndex (size_t i, const std::string& path)
3332079Siignatyev        {
3342079Siignatyev            if (i >= GetCount())
3352079Siignatyev                return false;
3362079Siignatyev            bool need_add_dot = true;
3372079Siignatyev            if (path[0] == '.' ||
3382079Siignatyev                (path[0] == '-' && path[1] == '>') ||
3392079Siignatyev                path[0] == '[')
3402079Siignatyev                need_add_dot = false;
3412079Siignatyev            // add a '.' symbol to help forgetful users
3422079Siignatyev            if(!need_add_dot)
3432079Siignatyev                m_expression_paths[i] = path;
3442079Siignatyev            else
3452079Siignatyev                m_expression_paths[i] = std::string(".") + path;
3462079Siignatyev            return true;
3472079Siignatyev        }
3482079Siignatyev
3492079Siignatyev        bool
3502079Siignatyev        IsScripted ()
3512079Siignatyev        {
3522079Siignatyev            return false;
3532079Siignatyev        }
3542079Siignatyev
3552079Siignatyev        std::string
3562079Siignatyev        GetDescription ();
3572079Siignatyev
3582079Siignatyev        class FrontEnd : public SyntheticChildrenFrontEnd
3592079Siignatyev        {
3602079Siignatyev        private:
3612079Siignatyev            TypeFilterImpl* filter;
3622079Siignatyev        public:
3632079Siignatyev
3642079Siignatyev            FrontEnd(TypeFilterImpl* flt,
3652079Siignatyev                     ValueObject &backend) :
3662079Siignatyev            SyntheticChildrenFrontEnd(backend),
3672079Siignatyev            filter(flt)
3682079Siignatyev            {}
3692079Siignatyev
3702079Siignatyev            virtual
3712079Siignatyev            ~FrontEnd ()
3722079Siignatyev            {
3732079Siignatyev            }
3742079Siignatyev
3752079Siignatyev            virtual size_t
3762079Siignatyev            CalculateNumChildren ()
3772079Siignatyev            {
3782079Siignatyev                return filter->GetCount();
3792079Siignatyev            }
3802079Siignatyev
3812079Siignatyev            virtual lldb::ValueObjectSP
3822079Siignatyev            GetChildAtIndex (size_t idx)
3832079Siignatyev            {
3842079Siignatyev                if (idx >= filter->GetCount())
3852079Siignatyev                    return lldb::ValueObjectSP();
3862079Siignatyev                return m_backend.GetSyntheticExpressionPathChild(filter->GetExpressionPathAtIndex(idx), true);
3872079Siignatyev            }
3882079Siignatyev
3892079Siignatyev            virtual bool
3902079Siignatyev            Update() { return false; }
3912079Siignatyev
3922079Siignatyev            virtual bool
3932079Siignatyev            MightHaveChildren ()
3942079Siignatyev            {
3952079Siignatyev                return filter->GetCount() > 0;
3962079Siignatyev            }
3972079Siignatyev
3982079Siignatyev            virtual size_t
3992079Siignatyev            GetIndexOfChildWithName (const ConstString &name)
4002079Siignatyev            {
4012079Siignatyev                const char* name_cstr = name.GetCString();
4022079Siignatyev                for (size_t i = 0; i < filter->GetCount(); i++)
4032079Siignatyev                {
4042079Siignatyev                    const char* expr_cstr = filter->GetExpressionPathAtIndex(i);
4052079Siignatyev                    if (expr_cstr)
4062079Siignatyev                    {
4072079Siignatyev                        if (*expr_cstr == '.')
4082079Siignatyev                            expr_cstr++;
4092079Siignatyev                        else if (*expr_cstr == '-' && *(expr_cstr+1) == '>')
4102079Siignatyev                            expr_cstr += 2;
4112079Siignatyev                    }
4122079Siignatyev                    if (!::strcmp(name_cstr, expr_cstr))
4132079Siignatyev                        return i;
4142079Siignatyev                }
4152079Siignatyev                return UINT32_MAX;
4162079Siignatyev            }
4172079Siignatyev
4182079Siignatyev            typedef std::shared_ptr<SyntheticChildrenFrontEnd> SharedPointer;
4192079Siignatyev
4202079Siignatyev        private:
4212079Siignatyev            DISALLOW_COPY_AND_ASSIGN(FrontEnd);
4222079Siignatyev        };
4232079Siignatyev
4242079Siignatyev        virtual SyntheticChildrenFrontEnd::AutoPointer
4252079Siignatyev        GetFrontEnd(ValueObject &backend)
4262079Siignatyev        {
4272079Siignatyev            return SyntheticChildrenFrontEnd::AutoPointer(new FrontEnd(this, backend));
4282079Siignatyev        }
4292079Siignatyev
4302079Siignatyev    private:
4312079Siignatyev        DISALLOW_COPY_AND_ASSIGN(TypeFilterImpl);
4322079Siignatyev    };
4332079Siignatyev
4342079Siignatyev    class CXXSyntheticChildren : public SyntheticChildren
4352079Siignatyev    {
4362079Siignatyev    public:
4372079Siignatyev        typedef SyntheticChildrenFrontEnd* (*CreateFrontEndCallback) (CXXSyntheticChildren*, lldb::ValueObjectSP);
4382079Siignatyev    protected:
4392079Siignatyev        CreateFrontEndCallback m_create_callback;
4402079Siignatyev        std::string m_description;
4412079Siignatyev    public:
4422079Siignatyev        CXXSyntheticChildren (const SyntheticChildren::Flags& flags,
4432079Siignatyev                              const char* description,
4442079Siignatyev                              CreateFrontEndCallback callback) :
4452079Siignatyev        SyntheticChildren(flags),
4462079Siignatyev        m_create_callback(callback),
4472079Siignatyev        m_description(description ? description : "")
4482079Siignatyev        {
4492079Siignatyev        }
4502079Siignatyev
4512079Siignatyev        bool
4522079Siignatyev        IsScripted ()
4532079Siignatyev        {
4542079Siignatyev            return false;
4552079Siignatyev        }
4562079Siignatyev
4572079Siignatyev        std::string
4582079Siignatyev        GetDescription ();
4592079Siignatyev
4602079Siignatyev        virtual SyntheticChildrenFrontEnd::AutoPointer
4612079Siignatyev        GetFrontEnd (ValueObject &backend)
4622079Siignatyev        {
4632079Siignatyev            return SyntheticChildrenFrontEnd::AutoPointer(m_create_callback(this, backend.GetSP()));
4642079Siignatyev        }
4652079Siignatyev
4662079Siignatyev    private:
4672079Siignatyev        DISALLOW_COPY_AND_ASSIGN(CXXSyntheticChildren);
4682079Siignatyev    };
4692079Siignatyev
4702079Siignatyev#ifndef LLDB_DISABLE_PYTHON
4712079Siignatyev
4722079Siignatyev    class ScriptedSyntheticChildren : public SyntheticChildren
4732079Siignatyev    {
4742079Siignatyev        std::string m_python_class;
4752079Siignatyev        std::string m_python_code;
4762079Siignatyev    public:
4772079Siignatyev
4782079Siignatyev        ScriptedSyntheticChildren (const SyntheticChildren::Flags& flags,
4792079Siignatyev                                   const char* pclass,
4802079Siignatyev                                   const char* pcode = NULL) :
4812079Siignatyev        SyntheticChildren(flags),
4822079Siignatyev        m_python_class(),
4832079Siignatyev        m_python_code()
4842079Siignatyev        {
4852079Siignatyev            if (pclass)
4862079Siignatyev                m_python_class = pclass;
4872079Siignatyev            if (pcode)
4882079Siignatyev                m_python_code = pcode;
4892079Siignatyev        }
4902079Siignatyev
4912079Siignatyev        const char*
4922079Siignatyev        GetPythonClassName ()
4932079Siignatyev        {
4942079Siignatyev            return m_python_class.c_str();
4952079Siignatyev        }
4962079Siignatyev
4972079Siignatyev        const char*
4982079Siignatyev        GetPythonCode ()
4992079Siignatyev        {
5002079Siignatyev            return m_python_code.c_str();
5012079Siignatyev        }
5022079Siignatyev
5032079Siignatyev        void
5042079Siignatyev        SetPythonClassName (const char* fname)
5052079Siignatyev        {
5062079Siignatyev            m_python_class.assign(fname);
5072079Siignatyev            m_python_code.clear();
5082079Siignatyev        }
5092079Siignatyev
5102079Siignatyev        void
5112079Siignatyev        SetPythonCode (const char* script)
5122079Siignatyev        {
5132079Siignatyev            m_python_code.assign(script);
5142079Siignatyev        }
5152079Siignatyev
5162079Siignatyev        std::string
5172079Siignatyev        GetDescription ();
5182079Siignatyev
5192079Siignatyev        bool
5202079Siignatyev        IsScripted ()
5212079Siignatyev        {
5222079Siignatyev            return true;
5232079Siignatyev        }
5242079Siignatyev
5252079Siignatyev        class FrontEnd : public SyntheticChildrenFrontEnd
5262079Siignatyev        {
5272079Siignatyev        private:
5282079Siignatyev            std::string m_python_class;
5292079Siignatyev            lldb::ScriptInterpreterObjectSP m_wrapper_sp;
5302079Siignatyev            ScriptInterpreter *m_interpreter;
5312079Siignatyev        public:
5322079Siignatyev
5332079Siignatyev            FrontEnd (std::string pclass,
5342079Siignatyev                      ValueObject &backend);
5352079Siignatyev
5362079Siignatyev            virtual
5372079Siignatyev            ~FrontEnd ();
5382079Siignatyev
5392079Siignatyev            virtual size_t
5402079Siignatyev            CalculateNumChildren ()
5412079Siignatyev            {
5422079Siignatyev                if (!m_wrapper_sp || m_interpreter == NULL)
5432079Siignatyev                    return 0;
5442079Siignatyev                return m_interpreter->CalculateNumChildren(m_wrapper_sp);
5452079Siignatyev            }
5462079Siignatyev
5472079Siignatyev            virtual lldb::ValueObjectSP
5482079Siignatyev            GetChildAtIndex (size_t idx);
5492079Siignatyev
5502079Siignatyev            virtual bool
5512079Siignatyev            Update ()
5522079Siignatyev            {
5532079Siignatyev                if (!m_wrapper_sp || m_interpreter == NULL)
5542079Siignatyev                    return false;
5552079Siignatyev
5562079Siignatyev                return m_interpreter->UpdateSynthProviderInstance(m_wrapper_sp);
5572079Siignatyev            }
5582079Siignatyev
5592079Siignatyev            virtual bool
5602079Siignatyev            MightHaveChildren ()
5612079Siignatyev            {
5622079Siignatyev                if (!m_wrapper_sp || m_interpreter == NULL)
5632079Siignatyev                    return false;
5642079Siignatyev
5652079Siignatyev                return m_interpreter->MightHaveChildrenSynthProviderInstance(m_wrapper_sp);
5662079Siignatyev            }
5672079Siignatyev
5682079Siignatyev            virtual size_t
5692079Siignatyev            GetIndexOfChildWithName (const ConstString &name)
5702079Siignatyev            {
5712079Siignatyev                if (!m_wrapper_sp || m_interpreter == NULL)
5722079Siignatyev                    return UINT32_MAX;
5732079Siignatyev                return m_interpreter->GetIndexOfChildWithName(m_wrapper_sp, name.GetCString());
5742079Siignatyev            }
5752079Siignatyev
5762079Siignatyev            typedef std::shared_ptr<SyntheticChildrenFrontEnd> SharedPointer;
5772079Siignatyev
5782079Siignatyev        private:
5792079Siignatyev            DISALLOW_COPY_AND_ASSIGN(FrontEnd);
5802079Siignatyev        };
5812079Siignatyev
5822079Siignatyev        virtual SyntheticChildrenFrontEnd::AutoPointer
5832079Siignatyev        GetFrontEnd(ValueObject &backend)
5842079Siignatyev        {
5852079Siignatyev            return SyntheticChildrenFrontEnd::AutoPointer(new FrontEnd(m_python_class, backend));
5862079Siignatyev        }
5872079Siignatyev
5882079Siignatyev    private:
5892079Siignatyev        DISALLOW_COPY_AND_ASSIGN(ScriptedSyntheticChildren);
5902079Siignatyev    };
5912079Siignatyev#endif
5922079Siignatyev} // namespace lldb_private
5932079Siignatyev
5942079Siignatyev#endif	// lldb_TypeSynthetic_h_
5952079Siignatyev