//===-- 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"
#include "lldb/Core/ConstString.h"
#include "lldb/Core/DataExtractor.h"
#include "lldb/Core/Stream.h"
#include "lldb/Core/Value.h"
#include "lldb/Core/ValueObjectConstResult.h"
#include "lldb/Target/ExecutionContext.h"
#include "lldb/Target/Process.h"

using namespace lldb_private;
using namespace clang;

ClangExpressionVariable::ClangExpressionVariable(lldb::ByteOrder byte_order, uint32_t addr_byte_size) :
    m_parser_vars(),
    m_jit_vars (),
    m_frozen_sp (new ValueObjectConstResult(byte_order, addr_byte_size)),
    m_flags (EVNone)
{
}

ClangExpressionVariable::ClangExpressionVariable (const lldb::ValueObjectSP &valobj_sp) :
    m_parser_vars(),
    m_jit_vars (),
    m_frozen_sp (valobj_sp),
    m_flags (EVNone)
{
}

//----------------------------------------------------------------------
/// Return the variable's size in bytes
//----------------------------------------------------------------------
size_t 
ClangExpressionVariable::GetByteSize ()
{
    return m_frozen_sp->GetByteSize();
}    

const ConstString &
ClangExpressionVariable::GetName ()
{
    return m_frozen_sp->GetName();
}    

lldb::ValueObjectSP
ClangExpressionVariable::GetValueObject()
{
    return m_frozen_sp;
}

lldb::RegisterInfo *
ClangExpressionVariable::GetRegisterInfo()
{
    return m_frozen_sp->GetValue().GetRegisterInfo();
}

void
ClangExpressionVariable::SetRegisterInfo (const lldb::RegisterInfo *reg_info)
{
    return m_frozen_sp->GetValue().SetContext (Value::eContextTypeRegisterInfo, const_cast<lldb::RegisterInfo *>(reg_info));
}

lldb::clang_type_t
ClangExpressionVariable::GetClangType()
{
    return m_frozen_sp->GetClangType();
}    

void
ClangExpressionVariable::SetClangType(lldb::clang_type_t clang_type)
{
    m_frozen_sp->GetValue().SetContext(Value::eContextTypeClangType, clang_type);
}    

clang::ASTContext *
ClangExpressionVariable::GetClangAST()
{
    return m_frozen_sp->GetClangAST();
}    

void
ClangExpressionVariable::SetClangAST (clang::ASTContext *ast)
{
    m_frozen_sp->SetClangAST (ast);
}

TypeFromUser
ClangExpressionVariable::GetTypeFromUser()
{
    TypeFromUser tfu (m_frozen_sp->GetClangType(), m_frozen_sp->GetClangAST());
    return tfu;
}    

uint8_t *
ClangExpressionVariable::GetValueBytes()
{
    const size_t byte_size = m_frozen_sp->GetByteSize();
    if (byte_size > 0)
    {
        if (m_frozen_sp->GetDataExtractor().GetByteSize() < byte_size)
        {
            m_frozen_sp->GetValue().ResizeData(byte_size);
            m_frozen_sp->GetValue().GetData (m_frozen_sp->GetDataExtractor());
        }
        return const_cast<uint8_t *>(m_frozen_sp->GetDataExtractor().GetDataStart());
    }
    return NULL;
}

void
ClangExpressionVariable::SetName (const ConstString &name)
{
    m_frozen_sp->SetName (name);
}

void
ClangExpressionVariable::ValueUpdated ()
{
    m_frozen_sp->ValueUpdated ();
}

