1//===-- SBInstructionList.cpp -----------------------------------*- 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#include "lldb/API/SBInstructionList.h"
11#include "lldb/API/SBInstruction.h"
12#include "lldb/API/SBStream.h"
13#include "lldb/Core/Disassembler.h"
14#include "lldb/Core/Stream.h"
15
16using namespace lldb;
17using namespace lldb_private;
18
19
20SBInstructionList::SBInstructionList () :
21    m_opaque_sp()
22{
23}
24
25SBInstructionList::SBInstructionList(const SBInstructionList &rhs) :
26    m_opaque_sp (rhs.m_opaque_sp)
27{
28}
29
30const SBInstructionList &
31SBInstructionList::operator = (const SBInstructionList &rhs)
32{
33    if (this != &rhs)
34        m_opaque_sp = rhs.m_opaque_sp;
35    return *this;
36}
37
38
39SBInstructionList::~SBInstructionList ()
40{
41}
42
43bool
44SBInstructionList::IsValid () const
45{
46    return m_opaque_sp.get() != NULL;
47}
48
49size_t
50SBInstructionList::GetSize ()
51{
52    if (m_opaque_sp)
53        return m_opaque_sp->GetInstructionList().GetSize();
54    return 0;
55}
56
57SBInstruction
58SBInstructionList::GetInstructionAtIndex (uint32_t idx)
59{
60    SBInstruction inst;
61    if (m_opaque_sp && idx < m_opaque_sp->GetInstructionList().GetSize())
62        inst.SetOpaque (m_opaque_sp->GetInstructionList().GetInstructionAtIndex (idx));
63    return inst;
64}
65
66void
67SBInstructionList::Clear ()
68{
69    m_opaque_sp.reset();
70}
71
72void
73SBInstructionList::AppendInstruction (SBInstruction insn)
74{
75}
76
77void
78SBInstructionList::SetDisassembler (const lldb::DisassemblerSP &opaque_sp)
79{
80    m_opaque_sp = opaque_sp;
81}
82
83void
84SBInstructionList::Print (FILE *out)
85{
86    if (out == NULL)
87        return;
88}
89
90
91bool
92SBInstructionList::GetDescription (lldb::SBStream &description)
93{
94    if (m_opaque_sp)
95    {
96        size_t num_instructions = GetSize ();
97        if (num_instructions)
98        {
99            // Call the ref() to make sure a stream is created if one deesn't
100            // exist already inside description...
101            Stream &sref = description.ref();
102            const uint32_t max_opcode_byte_size = m_opaque_sp->GetInstructionList().GetMaxOpcocdeByteSize();
103            for (size_t i=0; i<num_instructions; ++i)
104            {
105                Instruction *inst = m_opaque_sp->GetInstructionList().GetInstructionAtIndex (i).get();
106                if (inst == NULL)
107                    break;
108                inst->Dump (&sref, max_opcode_byte_size, true, false, NULL);
109                sref.EOL();
110            }
111            return true;
112        }
113    }
114    return false;
115}
116
117
118bool
119SBInstructionList::DumpEmulationForAllInstructions (const char *triple)
120{
121    if (m_opaque_sp)
122    {
123        size_t len = GetSize();
124        for (size_t i = 0; i < len; ++i)
125        {
126            if (!GetInstructionAtIndex((uint32_t) i).DumpEmulation (triple))
127                return false;
128        }
129    }
130    return true;
131}
132
133