1 //===-- ValueObjectSyntheticFilter.h -------------------------------*- C++ -*-===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 10 #ifndef liblldb_ValueObjectSyntheticFilter_h_ 11 #define liblldb_ValueObjectSyntheticFilter_h_ 12 13 // C Includes 14 // C++ Includes 15 #include <map> 16 #include <vector> 17 // Other libraries and framework includes 18 // Project includes 19 #include "lldb/Core/ValueObject.h" 20 21 namespace lldb_private { 22 23 //---------------------------------------------------------------------- 24 // A ValueObject that obtains its children from some source other than 25 // real information 26 // This is currently used to implement Python-based children and filters 27 // but you can bind it to any source of synthetic information and have 28 // it behave accordingly 29 //---------------------------------------------------------------------- 30 class ValueObjectSynthetic : public ValueObject 31 { 32 public: 33 virtual 34 ~ValueObjectSynthetic(); 35 36 virtual uint64_t 37 GetByteSize(); 38 39 virtual ConstString 40 GetTypeName(); 41 42 virtual ConstString 43 GetQualifiedTypeName(); 44 45 virtual bool 46 MightHaveChildren(); 47 48 virtual size_t 49 CalculateNumChildren(); 50 51 virtual lldb::ValueType 52 GetValueType() const; 53 54 virtual lldb::ValueObjectSP 55 GetChildAtIndex (size_t idx, bool can_create); 56 57 virtual lldb::ValueObjectSP 58 GetChildMemberWithName (const ConstString &name, bool can_create); 59 60 virtual size_t 61 GetIndexOfChildWithName (const ConstString &name); 62 63 virtual lldb::ValueObjectSP 64 GetDynamicValue (lldb::DynamicValueType valueType); 65 66 virtual bool 67 IsInScope (); 68 69 virtual bool HasSyntheticValue()70 HasSyntheticValue() 71 { 72 return false; 73 } 74 75 virtual bool IsSynthetic()76 IsSynthetic() { return true; } 77 78 virtual void CalculateSyntheticValue(bool use_synthetic)79 CalculateSyntheticValue (bool use_synthetic) 80 { 81 } 82 83 virtual bool IsDynamic()84 IsDynamic () 85 { 86 if (m_parent) 87 return m_parent->IsDynamic(); 88 else 89 return false; 90 } 91 92 virtual lldb::ValueObjectSP GetStaticValue()93 GetStaticValue () 94 { 95 if (m_parent) 96 return m_parent->GetStaticValue(); 97 else 98 return GetSP(); 99 } 100 101 virtual lldb::DynamicValueType GetDynamicValueType()102 GetDynamicValueType () 103 { 104 if (m_parent) 105 return m_parent->GetDynamicValueType(); 106 else 107 return lldb::eNoDynamicValues; 108 } 109 110 virtual ValueObject * GetParent()111 GetParent() 112 { 113 if (m_parent) 114 return m_parent->GetParent(); 115 else 116 return NULL; 117 } 118 119 virtual const ValueObject * GetParent()120 GetParent() const 121 { 122 if (m_parent) 123 return m_parent->GetParent(); 124 else 125 return NULL; 126 } 127 128 virtual lldb::ValueObjectSP 129 GetNonSyntheticValue (); 130 131 virtual bool ResolveValue(Scalar & scalar)132 ResolveValue (Scalar &scalar) 133 { 134 if (m_parent) 135 return m_parent->ResolveValue(scalar); 136 return false; 137 } 138 139 protected: 140 virtual bool 141 UpdateValue (); 142 143 virtual ClangASTType 144 GetClangTypeImpl (); 145 146 virtual void 147 CreateSynthFilter (); 148 149 // we need to hold on to the SyntheticChildren because someone might delete the type binding while we are alive 150 lldb::SyntheticChildrenSP m_synth_sp; 151 std::unique_ptr<SyntheticChildrenFrontEnd> m_synth_filter_ap; 152 153 typedef std::map<uint32_t, ValueObject*> ByIndexMap; 154 typedef std::map<const char*, uint32_t> NameToIndexMap; 155 156 typedef ByIndexMap::iterator ByIndexIterator; 157 typedef NameToIndexMap::iterator NameToIndexIterator; 158 159 ByIndexMap m_children_byindex; 160 NameToIndexMap m_name_toindex; 161 uint32_t m_synthetic_children_count; // FIXME use the ValueObject's ChildrenManager instead of a special purpose solution 162 163 ConstString m_parent_type_name; 164 165 LazyBool m_might_have_children; 166 167 private: 168 friend class ValueObject; 169 ValueObjectSynthetic (ValueObject &parent, lldb::SyntheticChildrenSP filter); 170 171 void 172 CopyParentData (); 173 174 //------------------------------------------------------------------ 175 // For ValueObject only 176 //------------------------------------------------------------------ 177 DISALLOW_COPY_AND_ASSIGN (ValueObjectSynthetic); 178 }; 179 180 } // namespace lldb_private 181 182 #endif // liblldb_ValueObjectSyntheticFilter_h_ 183