| //===-- ClangPersistentVariables.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/Expression/ClangPersistentVariables.h" |
| #include "lldb/Core/DataExtractor.h" |
| #include "lldb/Core/Log.h" |
| #include "lldb/Core/StreamString.h" |
| #include "lldb/Core/Value.h" |
| |
| #include "llvm/ADT/StringMap.h" |
| |
| using namespace lldb; |
| using namespace lldb_private; |
| |
| ClangPersistentVariables::ClangPersistentVariables () : |
| ClangExpressionVariableList(), |
| m_next_persistent_variable_id (0) |
| { |
| } |
| |
| ClangExpressionVariableSP |
| ClangPersistentVariables::CreatePersistentVariable (const lldb::ValueObjectSP &valobj_sp) |
| { |
| ClangExpressionVariableSP var_sp (CreateVariable(valobj_sp)); |
| return var_sp; |
| } |
| |
| ClangExpressionVariableSP |
| ClangPersistentVariables::CreatePersistentVariable (ExecutionContextScope *exe_scope, |
| const ConstString &name, |
| const TypeFromUser& user_type, |
| lldb::ByteOrder byte_order, |
| uint32_t addr_byte_size) |
| { |
| ClangExpressionVariableSP var_sp (GetVariable(name)); |
| |
| if (!var_sp) |
| var_sp = CreateVariable(exe_scope, name, user_type, byte_order, addr_byte_size); |
| |
| return var_sp; |
| } |
| |
| void |
| ClangPersistentVariables::RemovePersistentVariable (lldb::ClangExpressionVariableSP variable) |
| { |
| RemoveVariable(variable); |
| |
| const char *name = variable->GetName().AsCString(); |
| |
| if (*name != '$') |
| return; |
| name++; |
| |
| if (strtoul(name, NULL, 0) == m_next_persistent_variable_id - 1) |
| m_next_persistent_variable_id--; |
| } |
| |
| ConstString |
| ClangPersistentVariables::GetNextPersistentVariableName () |
| { |
| char name_cstr[256]; |
| ::snprintf (name_cstr, sizeof(name_cstr), "$%u", m_next_persistent_variable_id++); |
| ConstString name(name_cstr); |
| return name; |
| } |
| |
| void |
| ClangPersistentVariables::RegisterPersistentType (const ConstString &name, |
| clang::TypeDecl *type_decl) |
| { |
| m_persistent_types.insert(std::pair<const char*, clang::TypeDecl*>(name.GetCString(), type_decl)); |
| } |
| |
| clang::TypeDecl * |
| ClangPersistentVariables::GetPersistentType (const ConstString &name) |
| { |
| PersistentTypeMap::const_iterator i = m_persistent_types.find(name.GetCString()); |
| |
| if (i == m_persistent_types.end()) |
| return NULL; |
| else |
| return i->second; |
| } |