aboutsummaryrefslogtreecommitdiff
path: root/source/Core/ValueObjectCast.cpp
blob: 1c5838b820e135f405b89cdb2a20def0a8ac8282 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
//===-- ValueObjectDynamicValue.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/Core/ValueObjectCast.h"

// C Includes
// C++ Includes
// Other libraries and framework includes
// Project includes
#include "lldb/Core/Log.h"
#include "lldb/Core/Module.h"
#include "lldb/Core/ValueObjectList.h"
#include "lldb/Core/Value.h"
#include "lldb/Core/ValueObject.h"

#include "lldb/Symbol/CompilerType.h"
#include "lldb/Symbol/ObjectFile.h"
#include "lldb/Symbol/SymbolContext.h"
#include "lldb/Symbol/Type.h"
#include "lldb/Symbol/Variable.h"

#include "lldb/Target/ExecutionContext.h"
#include "lldb/Target/Process.h"
#include "lldb/Target/RegisterContext.h"
#include "lldb/Target/Target.h"
#include "lldb/Target/Thread.h"

using namespace lldb_private;

lldb::ValueObjectSP
ValueObjectCast::Create (ValueObject &parent, 
                         const ConstString &name, 
                         const CompilerType &cast_type)
{
    ValueObjectCast *cast_valobj_ptr = new ValueObjectCast (parent, name, cast_type);
    return cast_valobj_ptr->GetSP();
}

ValueObjectCast::ValueObjectCast
(
    ValueObject &parent, 
    const ConstString &name, 
    const CompilerType &cast_type
) :
    ValueObject(parent),
    m_cast_type (cast_type)
{
    SetName (name);
    //m_value.SetContext (Value::eContextTypeClangType, cast_type.GetOpaqueQualType());
    m_value.SetCompilerType (cast_type);
}

ValueObjectCast::~ValueObjectCast()
{
}

CompilerType
ValueObjectCast::GetCompilerTypeImpl ()
{
    return m_cast_type;
}

size_t
ValueObjectCast::CalculateNumChildren(uint32_t max)
{
    auto children_count = GetCompilerType().GetNumChildren (true);
    return children_count <= max ? children_count : max;
}

uint64_t
ValueObjectCast::GetByteSize()
{
    ExecutionContext exe_ctx (GetExecutionContextRef());
    return m_value.GetValueByteSize(nullptr, &exe_ctx);
}

lldb::ValueType
ValueObjectCast::GetValueType() const
{
    // Let our parent answer global, local, argument, etc...
    return m_parent->GetValueType();
}

bool
ValueObjectCast::UpdateValue ()
{
    SetValueIsValid (false);
    m_error.Clear();
    
    if (m_parent->UpdateValueIfNeeded(false))
    {
        Value old_value(m_value);
        m_update_point.SetUpdated();
        m_value = m_parent->GetValue();
        CompilerType compiler_type (GetCompilerType());
        //m_value.SetContext (Value::eContextTypeClangType, compiler_type);
        m_value.SetCompilerType (compiler_type);
        SetAddressTypeOfChildren(m_parent->GetAddressTypeOfChildren());
        if (!CanProvideValue())
        {
            // this value object represents an aggregate type whose
            // children have values, but this object does not. So we
            // say we are changed if our location has changed.
            SetValueDidChange (m_value.GetValueType() != old_value.GetValueType() || m_value.GetScalar() != old_value.GetScalar());
        } 
        ExecutionContext exe_ctx (GetExecutionContextRef());
        m_error = m_value.GetValueAsData(&exe_ctx, m_data, 0, GetModule().get());
        SetValueDidChange (m_parent->GetValueDidChange());
        return true;
    }
    
    // The dynamic value failed to get an error, pass the error along
    if (m_error.Success() && m_parent->GetError().Fail())
        m_error = m_parent->GetError();
    SetValueIsValid (false);
    return false;
}

bool
ValueObjectCast::IsInScope ()
{
    return m_parent->IsInScope();
}