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