1 //===-- SBData.cpp ----------------------------------------------*- C++ -*-===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 #include "lldb/API/SBData.h"
11 #include "lldb/API/SBError.h"
12 #include "lldb/API/SBStream.h"
14 #include "lldb/Core/DataBufferHeap.h"
15 #include "lldb/Core/DataExtractor.h"
16 #include "lldb/Core/Log.h"
17 #include "lldb/Core/Stream.h"
21 using namespace lldb_private;
24 m_opaque_sp(new DataExtractor())
28 SBData::SBData (const lldb::DataExtractorSP& data_sp) :
33 SBData::SBData(const SBData &rhs) :
34 m_opaque_sp (rhs.m_opaque_sp)
39 SBData::operator = (const SBData &rhs)
42 m_opaque_sp = rhs.m_opaque_sp;
51 SBData::SetOpaque (const lldb::DataExtractorSP &data_sp)
53 m_opaque_sp = data_sp;
56 lldb_private::DataExtractor *
59 return m_opaque_sp.get();
62 lldb_private::DataExtractor *
63 SBData::operator->() const
65 return m_opaque_sp.operator->();
68 lldb::DataExtractorSP &
74 const lldb::DataExtractorSP &
75 SBData::operator*() const
83 return m_opaque_sp.get() != NULL;
87 SBData::GetAddressByteSize ()
89 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
91 if (m_opaque_sp.get())
92 value = m_opaque_sp->GetAddressByteSize();
94 log->Printf ("SBData::GetAddressByteSize () => "
100 SBData::SetAddressByteSize (uint8_t addr_byte_size)
102 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
103 if (m_opaque_sp.get())
104 m_opaque_sp->SetAddressByteSize(addr_byte_size);
106 log->Printf ("SBData::SetAddressByteSize (%i)", addr_byte_size);
112 if (m_opaque_sp.get())
113 m_opaque_sp->Clear();
117 SBData::GetByteSize ()
119 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
121 if (m_opaque_sp.get())
122 value = m_opaque_sp->GetByteSize();
124 log->Printf ("SBData::GetByteSize () => "
130 SBData::GetByteOrder ()
132 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
133 lldb::ByteOrder value = eByteOrderInvalid;
134 if (m_opaque_sp.get())
135 value = m_opaque_sp->GetByteOrder();
137 log->Printf ("SBData::GetByteOrder () => "
143 SBData::SetByteOrder (lldb::ByteOrder endian)
145 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
146 if (m_opaque_sp.get())
147 m_opaque_sp->SetByteOrder(endian);
149 log->Printf ("SBData::GetByteOrder (%i)", endian);
154 SBData::GetFloat (lldb::SBError& error, lldb::offset_t offset)
156 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
158 if (!m_opaque_sp.get())
160 error.SetErrorString("no value to read from");
164 uint32_t old_offset = offset;
165 value = m_opaque_sp->GetFloat(&offset);
166 if (offset == old_offset)
167 error.SetErrorString("unable to read data");
170 log->Printf ("SBData::GetFloat (error=%p,offset=%" PRIu64 ") => "
171 "(%f)", error.get(), offset, value);
176 SBData::GetDouble (lldb::SBError& error, lldb::offset_t offset)
178 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
180 if (!m_opaque_sp.get())
182 error.SetErrorString("no value to read from");
186 uint32_t old_offset = offset;
187 value = m_opaque_sp->GetDouble(&offset);
188 if (offset == old_offset)
189 error.SetErrorString("unable to read data");
192 log->Printf ("SBData::GetDouble (error=%p,offset=%" PRIu64 ") => "
193 "(%f)", error.get(), offset, value);
198 SBData::GetLongDouble (lldb::SBError& error, lldb::offset_t offset)
200 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
201 long double value = 0;
202 if (!m_opaque_sp.get())
204 error.SetErrorString("no value to read from");
208 uint32_t old_offset = offset;
209 value = m_opaque_sp->GetLongDouble(&offset);
210 if (offset == old_offset)
211 error.SetErrorString("unable to read data");
214 log->Printf ("SBData::GetLongDouble (error=%p,offset=%" PRIu64 ") => "
215 "(%Lf)", error.get(), offset, value);
220 SBData::GetAddress (lldb::SBError& error, lldb::offset_t offset)
222 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
223 lldb::addr_t value = 0;
224 if (!m_opaque_sp.get())
226 error.SetErrorString("no value to read from");
230 uint32_t old_offset = offset;
231 value = m_opaque_sp->GetAddress(&offset);
232 if (offset == old_offset)
233 error.SetErrorString("unable to read data");
236 log->Printf ("SBData::GetAddress (error=%p,offset=%" PRIu64 ") => "
237 "(%p)", error.get(), offset, (void*)value);
242 SBData::GetUnsignedInt8 (lldb::SBError& error, lldb::offset_t offset)
244 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
246 if (!m_opaque_sp.get())
248 error.SetErrorString("no value to read from");
252 uint32_t old_offset = offset;
253 value = m_opaque_sp->GetU8(&offset);
254 if (offset == old_offset)
255 error.SetErrorString("unable to read data");
258 log->Printf ("SBData::GetUnsignedInt8 (error=%p,offset=%" PRIu64 ") => "
259 "(%c)", error.get(), offset, value);
264 SBData::GetUnsignedInt16 (lldb::SBError& error, lldb::offset_t offset)
266 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
268 if (!m_opaque_sp.get())
270 error.SetErrorString("no value to read from");
274 uint32_t old_offset = offset;
275 value = m_opaque_sp->GetU16(&offset);
276 if (offset == old_offset)
277 error.SetErrorString("unable to read data");
280 log->Printf ("SBData::GetUnsignedInt16 (error=%p,offset=%" PRIu64 ") => "
281 "(%hd)", error.get(), offset, value);
286 SBData::GetUnsignedInt32 (lldb::SBError& error, lldb::offset_t offset)
288 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
290 if (!m_opaque_sp.get())
292 error.SetErrorString("no value to read from");
296 uint32_t old_offset = offset;
297 value = m_opaque_sp->GetU32(&offset);
298 if (offset == old_offset)
299 error.SetErrorString("unable to read data");
302 log->Printf ("SBData::GetUnsignedInt32 (error=%p,offset=%" PRIu64 ") => "
303 "(%d)", error.get(), offset, value);
308 SBData::GetUnsignedInt64 (lldb::SBError& error, lldb::offset_t offset)
310 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
312 if (!m_opaque_sp.get())
314 error.SetErrorString("no value to read from");
318 uint32_t old_offset = offset;
319 value = m_opaque_sp->GetU64(&offset);
320 if (offset == old_offset)
321 error.SetErrorString("unable to read data");
324 log->Printf ("SBData::GetUnsignedInt64 (error=%p,offset=%" PRIu64 ") => "
325 "(%" PRId64 ")", error.get(), offset, value);
330 SBData::GetSignedInt8 (lldb::SBError& error, lldb::offset_t offset)
332 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
334 if (!m_opaque_sp.get())
336 error.SetErrorString("no value to read from");
340 uint32_t old_offset = offset;
341 value = (int8_t)m_opaque_sp->GetMaxS64(&offset, 1);
342 if (offset == old_offset)
343 error.SetErrorString("unable to read data");
346 log->Printf ("SBData::GetSignedInt8 (error=%p,offset=%" PRIu64 ") => "
347 "(%c)", error.get(), offset, value);
352 SBData::GetSignedInt16 (lldb::SBError& error, lldb::offset_t offset)
354 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
356 if (!m_opaque_sp.get())
358 error.SetErrorString("no value to read from");
362 uint32_t old_offset = offset;
363 value = (int16_t)m_opaque_sp->GetMaxS64(&offset, 2);
364 if (offset == old_offset)
365 error.SetErrorString("unable to read data");
368 log->Printf ("SBData::GetSignedInt16 (error=%p,offset=%" PRIu64 ") => "
369 "(%hd)", error.get(), offset, value);
374 SBData::GetSignedInt32 (lldb::SBError& error, lldb::offset_t offset)
376 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
378 if (!m_opaque_sp.get())
380 error.SetErrorString("no value to read from");
384 uint32_t old_offset = offset;
385 value = (int32_t)m_opaque_sp->GetMaxS64(&offset, 4);
386 if (offset == old_offset)
387 error.SetErrorString("unable to read data");
390 log->Printf ("SBData::GetSignedInt32 (error=%p,offset=%" PRIu64 ") => "
391 "(%d)", error.get(), offset, value);
396 SBData::GetSignedInt64 (lldb::SBError& error, lldb::offset_t offset)
398 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
400 if (!m_opaque_sp.get())
402 error.SetErrorString("no value to read from");
406 uint32_t old_offset = offset;
407 value = (int64_t)m_opaque_sp->GetMaxS64(&offset, 8);
408 if (offset == old_offset)
409 error.SetErrorString("unable to read data");
412 log->Printf ("SBData::GetSignedInt64 (error=%p,offset=%" PRIu64 ") => "
413 "(%" PRId64 ")", error.get(), offset, value);
418 SBData::GetString (lldb::SBError& error, lldb::offset_t offset)
420 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
421 const char* value = 0;
422 if (!m_opaque_sp.get())
424 error.SetErrorString("no value to read from");
428 uint32_t old_offset = offset;
429 value = m_opaque_sp->GetCStr(&offset);
430 if (offset == old_offset || (value == NULL))
431 error.SetErrorString("unable to read data");
434 log->Printf ("SBData::GetString (error=%p,offset=%" PRIu64 ") => "
435 "(%p)", error.get(), offset, value);
440 SBData::GetDescription (lldb::SBStream &description, lldb::addr_t base_addr)
442 Stream &strm = description.ref();
446 m_opaque_sp->Dump (&strm,
448 lldb::eFormatBytesWithASCII,
450 m_opaque_sp->GetByteSize(),
457 strm.PutCString ("No value");
463 SBData::ReadRawData (lldb::SBError& error,
464 lldb::offset_t offset,
468 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
470 if (!m_opaque_sp.get())
472 error.SetErrorString("no value to read from");
476 uint32_t old_offset = offset;
477 ok = m_opaque_sp->GetU8(&offset, buf, size);
478 if ((offset == old_offset) || (ok == NULL))
479 error.SetErrorString("unable to read data");
482 log->Printf ("SBData::ReadRawData (error=%p,offset=%" PRIu64 ",buf=%p,size=%zu) => "
483 "(%p)", error.get(), offset, buf, size, ok);
484 return ok ? size : 0;
488 SBData::SetData (lldb::SBError& error,
491 lldb::ByteOrder endian,
494 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
495 if (!m_opaque_sp.get())
496 m_opaque_sp.reset(new DataExtractor(buf, size, endian, addr_size));
498 m_opaque_sp->SetData(buf, size, endian);
500 log->Printf ("SBData::SetData (error=%p,buf=%p,size=%zu,endian=%d,addr_size=%c) => "
501 "(%p)", error.get(), buf, size, endian, addr_size, m_opaque_sp.get());
505 SBData::Append (const SBData& rhs)
507 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
509 if (m_opaque_sp.get() && rhs.m_opaque_sp.get())
510 value = m_opaque_sp.get()->Append(*rhs.m_opaque_sp);
512 log->Printf ("SBData::Append (rhs=%p) => "
513 "(%s)", rhs.get(), value ? "true" : "false");
518 SBData::CreateDataFromCString (lldb::ByteOrder endian, uint32_t addr_byte_size, const char* data)
520 if (!data || !data[0])
523 uint32_t data_len = strlen(data);
525 lldb::DataBufferSP buffer_sp(new DataBufferHeap(data, data_len));
526 lldb::DataExtractorSP data_sp(new DataExtractor(buffer_sp, endian, addr_byte_size));
534 SBData::CreateDataFromUInt64Array (lldb::ByteOrder endian, uint32_t addr_byte_size, uint64_t* array, size_t array_len)
536 if (!array || array_len == 0)
539 size_t data_len = array_len * sizeof(uint64_t);
541 lldb::DataBufferSP buffer_sp(new DataBufferHeap(array, data_len));
542 lldb::DataExtractorSP data_sp(new DataExtractor(buffer_sp, endian, addr_byte_size));
550 SBData::CreateDataFromUInt32Array (lldb::ByteOrder endian, uint32_t addr_byte_size, uint32_t* array, size_t array_len)
552 if (!array || array_len == 0)
555 size_t data_len = array_len * sizeof(uint32_t);
557 lldb::DataBufferSP buffer_sp(new DataBufferHeap(array, data_len));
558 lldb::DataExtractorSP data_sp(new DataExtractor(buffer_sp, endian, addr_byte_size));
566 SBData::CreateDataFromSInt64Array (lldb::ByteOrder endian, uint32_t addr_byte_size, int64_t* array, size_t array_len)
568 if (!array || array_len == 0)
571 size_t data_len = array_len * sizeof(int64_t);
573 lldb::DataBufferSP buffer_sp(new DataBufferHeap(array, data_len));
574 lldb::DataExtractorSP data_sp(new DataExtractor(buffer_sp, endian, addr_byte_size));
582 SBData::CreateDataFromSInt32Array (lldb::ByteOrder endian, uint32_t addr_byte_size, int32_t* array, size_t array_len)
584 if (!array || array_len == 0)
587 size_t data_len = array_len * sizeof(int32_t);
589 lldb::DataBufferSP buffer_sp(new DataBufferHeap(array, data_len));
590 lldb::DataExtractorSP data_sp(new DataExtractor(buffer_sp, endian, addr_byte_size));
598 SBData::CreateDataFromDoubleArray (lldb::ByteOrder endian, uint32_t addr_byte_size, double* array, size_t array_len)
600 if (!array || array_len == 0)
603 size_t data_len = array_len * sizeof(double);
605 lldb::DataBufferSP buffer_sp(new DataBufferHeap(array, data_len));
606 lldb::DataExtractorSP data_sp(new DataExtractor(buffer_sp, endian, addr_byte_size));
614 SBData::SetDataFromCString (const char* data)
616 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
621 log->Printf ("SBData::SetDataFromCString (data=%p) => "
626 size_t data_len = strlen(data);
628 lldb::DataBufferSP buffer_sp(new DataBufferHeap(data, data_len));
630 if (!m_opaque_sp.get())
631 m_opaque_sp.reset(new DataExtractor(buffer_sp, GetByteOrder(), GetAddressByteSize()));
633 m_opaque_sp->SetData(buffer_sp);
636 log->Printf ("SBData::SetDataFromCString (data=%p) => "
643 SBData::SetDataFromUInt64Array (uint64_t* array, size_t array_len)
645 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
647 if (!array || array_len == 0)
650 log->Printf ("SBData::SetDataFromUInt64Array (array=%p, array_len = %zu) => "
651 "false", array, array_len);
655 size_t data_len = array_len * sizeof(uint64_t);
657 lldb::DataBufferSP buffer_sp(new DataBufferHeap(array, data_len));
659 if (!m_opaque_sp.get())
660 m_opaque_sp.reset(new DataExtractor(buffer_sp, GetByteOrder(), GetAddressByteSize()));
662 m_opaque_sp->SetData(buffer_sp);
665 log->Printf ("SBData::SetDataFromUInt64Array (array=%p, array_len = %zu) => "
666 "true", array, array_len);
672 SBData::SetDataFromUInt32Array (uint32_t* array, size_t array_len)
674 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
676 if (!array || array_len == 0)
679 log->Printf ("SBData::SetDataFromUInt32Array (array=%p, array_len = %zu) => "
680 "false", array, array_len);
684 size_t data_len = array_len * sizeof(uint32_t);
686 lldb::DataBufferSP buffer_sp(new DataBufferHeap(array, data_len));
688 if (!m_opaque_sp.get())
689 m_opaque_sp.reset(new DataExtractor(buffer_sp, GetByteOrder(), GetAddressByteSize()));
691 m_opaque_sp->SetData(buffer_sp);
694 log->Printf ("SBData::SetDataFromUInt32Array (array=%p, array_len = %zu) => "
695 "true", array, array_len);
701 SBData::SetDataFromSInt64Array (int64_t* array, size_t array_len)
703 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
705 if (!array || array_len == 0)
708 log->Printf ("SBData::SetDataFromSInt64Array (array=%p, array_len = %zu) => "
709 "false", array, array_len);
713 size_t data_len = array_len * sizeof(int64_t);
715 lldb::DataBufferSP buffer_sp(new DataBufferHeap(array, data_len));
717 if (!m_opaque_sp.get())
718 m_opaque_sp.reset(new DataExtractor(buffer_sp, GetByteOrder(), GetAddressByteSize()));
720 m_opaque_sp->SetData(buffer_sp);
723 log->Printf ("SBData::SetDataFromSInt64Array (array=%p, array_len = %zu) => "
724 "true", array, array_len);
730 SBData::SetDataFromSInt32Array (int32_t* array, size_t array_len)
732 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
734 if (!array || array_len == 0)
737 log->Printf ("SBData::SetDataFromSInt32Array (array=%p, array_len = %zu) => "
738 "false", array, array_len);
742 size_t data_len = array_len * sizeof(int32_t);
744 lldb::DataBufferSP buffer_sp(new DataBufferHeap(array, data_len));
746 if (!m_opaque_sp.get())
747 m_opaque_sp.reset(new DataExtractor(buffer_sp, GetByteOrder(), GetAddressByteSize()));
749 m_opaque_sp->SetData(buffer_sp);
752 log->Printf ("SBData::SetDataFromSInt32Array (array=%p, array_len = %zu) => "
753 "true", array, array_len);
759 SBData::SetDataFromDoubleArray (double* array, size_t array_len)
761 Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_API));
763 if (!array || array_len == 0)
766 log->Printf ("SBData::SetDataFromDoubleArray (array=%p, array_len = %zu) => "
767 "false", array, array_len);
771 size_t data_len = array_len * sizeof(double);
773 lldb::DataBufferSP buffer_sp(new DataBufferHeap(array, data_len));
775 if (!m_opaque_sp.get())
776 m_opaque_sp.reset(new DataExtractor(buffer_sp, GetByteOrder(), GetAddressByteSize()));
778 m_opaque_sp->SetData(buffer_sp);
781 log->Printf ("SBData::SetDataFromDoubleArray (array=%p, array_len = %zu) => "
782 "true", array, array_len);