| //===-- ClangExpressionVariable.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/ClangExpressionVariable.h" |
| |
| // C Includes |
| // C++ Includes |
| // Other libraries and framework includes |
| // Project includes |
| #include "clang/AST/ASTContext.h" |
| |
| using namespace lldb_private; |
| using namespace clang; |
| |
| ClangExpressionVariableList::ClangExpressionVariableList() : |
| m_variables() |
| { |
| } |
| |
| ClangExpressionVariableList::~ClangExpressionVariableList() |
| { |
| uint32_t num_variables = m_variables.size(); |
| uint32_t var_index; |
| |
| for (var_index = 0; var_index < num_variables; ++var_index) |
| delete m_variables[var_index].m_value; |
| } |
| |
| Value * |
| ValueForDecl(ASTContext &ast_context, const VarDecl *var_decl) |
| { |
| Value *ret = new Value; |
| |
| ret->SetContext(Value::eContextTypeOpaqueClangQualType, |
| var_decl->getType().getAsOpaquePtr()); |
| |
| uint64_t bit_width = ast_context.getTypeSize(var_decl->getType()); |
| |
| uint32_t byte_size = (bit_width + 7 ) / 8; |
| |
| ret->ResizeData(byte_size); |
| |
| return ret; |
| } |
| |
| Value * |
| ClangExpressionVariableList::GetVariableForVarDecl (ASTContext &ast_context, const VarDecl *var_decl, uint32_t& idx, bool can_create) |
| { |
| uint32_t num_variables = m_variables.size(); |
| uint32_t var_index; |
| |
| for (var_index = 0; var_index < num_variables; ++var_index) |
| { |
| if (m_variables[var_index].m_var_decl == var_decl) |
| { |
| idx = var_index; |
| return m_variables[var_index].m_value; |
| } |
| } |
| |
| if (!can_create) |
| return NULL; |
| |
| idx = m_variables.size(); |
| |
| ClangExpressionVariable val; |
| val.m_var_decl = var_decl; |
| val.m_value = ValueForDecl(ast_context, var_decl); |
| m_variables.push_back(val); |
| |
| return m_variables.back().m_value; |
| } |
| |
| Value * |
| ClangExpressionVariableList::GetVariableAtIndex (uint32_t idx) |
| { |
| if (idx < m_variables.size()) |
| return m_variables[idx].m_value; |
| |
| return NULL; |
| } |
| |
| uint32_t |
| ClangExpressionVariableList::AppendValue (Value *value) |
| { |
| uint32_t idx = m_variables.size(); |
| |
| ClangExpressionVariable val; |
| val.m_var_decl = NULL; |
| val.m_value = value; |
| |
| m_variables.push_back(val); |
| return idx; |
| } |