diff options
| author | Dimitry Andric <dim@FreeBSD.org> | 2019-08-20 20:51:52 +0000 | 
|---|---|---|
| committer | Dimitry Andric <dim@FreeBSD.org> | 2019-08-20 20:51:52 +0000 | 
| commit | 5f29bb8a675e8f96452b632e7129113f7dec850e (patch) | |
| tree | 3d3f2a0d3ad10872a4dcaba8ec8d1d20c87ab147 /source/API/SBStream.cpp | |
| parent | 88c643b6fec27eec436c8d138fee6346e92337d6 (diff) | |
Notes
Diffstat (limited to 'source/API/SBStream.cpp')
| -rw-r--r-- | source/API/SBStream.cpp | 114 | 
1 files changed, 79 insertions, 35 deletions
| diff --git a/source/API/SBStream.cpp b/source/API/SBStream.cpp index 876ef02170d2f..ae652338e1ea5 100644 --- a/source/API/SBStream.cpp +++ b/source/API/SBStream.cpp @@ -1,14 +1,14 @@  //===-- SBStream.cpp ----------------------------------------*- C++ -*-===//  // -//                     The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception  //  //===----------------------------------------------------------------------===//  #include "lldb/API/SBStream.h" +#include "SBReproducerPrivate.h"  #include "lldb/Core/StreamFile.h"  #include "lldb/Host/FileSystem.h"  #include "lldb/Utility/Status.h" @@ -18,31 +18,45 @@  using namespace lldb;  using namespace lldb_private; -SBStream::SBStream() : m_opaque_ap(new StreamString()), m_is_file(false) {} +SBStream::SBStream() : m_opaque_up(new StreamString()), m_is_file(false) { +  LLDB_RECORD_CONSTRUCTOR_NO_ARGS(SBStream); +}  SBStream::SBStream(SBStream &&rhs) -    : m_opaque_ap(std::move(rhs.m_opaque_ap)), m_is_file(rhs.m_is_file) {} +    : m_opaque_up(std::move(rhs.m_opaque_up)), m_is_file(rhs.m_is_file) {}  SBStream::~SBStream() {} -bool SBStream::IsValid() const { return (m_opaque_ap != NULL); } +bool SBStream::IsValid() const { +  LLDB_RECORD_METHOD_CONST_NO_ARGS(bool, SBStream, IsValid); +  return this->operator bool(); +} +SBStream::operator bool() const { +  LLDB_RECORD_METHOD_CONST_NO_ARGS(bool, SBStream, operator bool); + +  return (m_opaque_up != nullptr); +}  // If this stream is not redirected to a file, it will maintain a local cache  // for the stream data which can be accessed using this accessor.  const char *SBStream::GetData() { -  if (m_is_file || m_opaque_ap == NULL) -    return NULL; +  LLDB_RECORD_METHOD_NO_ARGS(const char *, SBStream, GetData); + +  if (m_is_file || m_opaque_up == nullptr) +    return nullptr; -  return static_cast<StreamString *>(m_opaque_ap.get())->GetData(); +  return static_cast<StreamString *>(m_opaque_up.get())->GetData();  }  // If this stream is not redirected to a file, it will maintain a local cache  // for the stream output whose length can be accessed using this accessor.  size_t SBStream::GetSize() { -  if (m_is_file || m_opaque_ap == NULL) +  LLDB_RECORD_METHOD_NO_ARGS(size_t, SBStream, GetSize); + +  if (m_is_file || m_opaque_up == nullptr)      return 0; -  return static_cast<StreamString *>(m_opaque_ap.get())->GetSize(); +  return static_cast<StreamString *>(m_opaque_up.get())->GetSize();  }  void SBStream::Printf(const char *format, ...) { @@ -55,15 +69,18 @@ void SBStream::Printf(const char *format, ...) {  }  void SBStream::RedirectToFile(const char *path, bool append) { +  LLDB_RECORD_METHOD(void, SBStream, RedirectToFile, (const char *, bool), path, +                     append); +    if (path == nullptr)      return;    std::string local_data; -  if (m_opaque_ap) { +  if (m_opaque_up) {      // See if we have any locally backed data. If so, copy it so we can then      // redirect it to the file so we don't lose the data      if (!m_is_file) -      local_data = static_cast<StreamString *>(m_opaque_ap.get())->GetString(); +      local_data = static_cast<StreamString *>(m_opaque_up.get())->GetString();    }    StreamFile *stream_file = new StreamFile;    uint32_t open_options = File::eOpenOptionWrite | File::eOpenOptionCanCreate; @@ -74,81 +91,108 @@ void SBStream::RedirectToFile(const char *path, bool append) {    FileSystem::Instance().Open(stream_file->GetFile(), FileSpec(path),                                open_options); -  m_opaque_ap.reset(stream_file); +  m_opaque_up.reset(stream_file); -  if (m_opaque_ap) { +  if (m_opaque_up) {      m_is_file = true;      // If we had any data locally in our StreamString, then pass that along to      // the to new file we are redirecting to.      if (!local_data.empty()) -      m_opaque_ap->Write(&local_data[0], local_data.size()); +      m_opaque_up->Write(&local_data[0], local_data.size());    } else      m_is_file = false;  }  void SBStream::RedirectToFileHandle(FILE *fh, bool transfer_fh_ownership) { +  LLDB_RECORD_METHOD(void, SBStream, RedirectToFileHandle, (FILE *, bool), fh, +                     transfer_fh_ownership); +    if (fh == nullptr)      return;    std::string local_data; -  if (m_opaque_ap) { +  if (m_opaque_up) {      // See if we have any locally backed data. If so, copy it so we can then      // redirect it to the file so we don't lose the data      if (!m_is_file) -      local_data = static_cast<StreamString *>(m_opaque_ap.get())->GetString(); +      local_data = static_cast<StreamString *>(m_opaque_up.get())->GetString();    } -  m_opaque_ap.reset(new StreamFile(fh, transfer_fh_ownership)); +  m_opaque_up.reset(new StreamFile(fh, transfer_fh_ownership)); -  if (m_opaque_ap) { +  if (m_opaque_up) {      m_is_file = true;      // If we had any data locally in our StreamString, then pass that along to      // the to new file we are redirecting to.      if (!local_data.empty()) -      m_opaque_ap->Write(&local_data[0], local_data.size()); +      m_opaque_up->Write(&local_data[0], local_data.size());    } else      m_is_file = false;  }  void SBStream::RedirectToFileDescriptor(int fd, bool transfer_fh_ownership) { +  LLDB_RECORD_METHOD(void, SBStream, RedirectToFileDescriptor, (int, bool), fd, +                     transfer_fh_ownership); +    std::string local_data; -  if (m_opaque_ap) { +  if (m_opaque_up) {      // See if we have any locally backed data. If so, copy it so we can then      // redirect it to the file so we don't lose the data      if (!m_is_file) -      local_data = static_cast<StreamString *>(m_opaque_ap.get())->GetString(); +      local_data = static_cast<StreamString *>(m_opaque_up.get())->GetString();    } -  m_opaque_ap.reset(new StreamFile(::fdopen(fd, "w"), transfer_fh_ownership)); -  if (m_opaque_ap) { +  m_opaque_up.reset(new StreamFile(::fdopen(fd, "w"), transfer_fh_ownership)); +  if (m_opaque_up) {      m_is_file = true;      // If we had any data locally in our StreamString, then pass that along to      // the to new file we are redirecting to.      if (!local_data.empty()) -      m_opaque_ap->Write(&local_data[0], local_data.size()); +      m_opaque_up->Write(&local_data[0], local_data.size());    } else      m_is_file = false;  } -lldb_private::Stream *SBStream::operator->() { return m_opaque_ap.get(); } +lldb_private::Stream *SBStream::operator->() { return m_opaque_up.get(); } -lldb_private::Stream *SBStream::get() { return m_opaque_ap.get(); } +lldb_private::Stream *SBStream::get() { return m_opaque_up.get(); }  lldb_private::Stream &SBStream::ref() { -  if (m_opaque_ap == NULL) -    m_opaque_ap.reset(new StreamString()); -  return *m_opaque_ap; +  if (m_opaque_up == nullptr) +    m_opaque_up.reset(new StreamString()); +  return *m_opaque_up;  }  void SBStream::Clear() { -  if (m_opaque_ap) { +  LLDB_RECORD_METHOD_NO_ARGS(void, SBStream, Clear); + +  if (m_opaque_up) {      // See if we have any locally backed data. If so, copy it so we can then      // redirect it to the file so we don't lose the data      if (m_is_file) -      m_opaque_ap.reset(); +      m_opaque_up.reset();      else -      static_cast<StreamString *>(m_opaque_ap.get())->Clear(); +      static_cast<StreamString *>(m_opaque_up.get())->Clear();    }  } + +namespace lldb_private { +namespace repro { + +template <> +void RegisterMethods<SBStream>(Registry &R) { +  LLDB_REGISTER_CONSTRUCTOR(SBStream, ()); +  LLDB_REGISTER_METHOD_CONST(bool, SBStream, IsValid, ()); +  LLDB_REGISTER_METHOD_CONST(bool, SBStream, operator bool, ()); +  LLDB_REGISTER_METHOD(const char *, SBStream, GetData, ()); +  LLDB_REGISTER_METHOD(size_t, SBStream, GetSize, ()); +  LLDB_REGISTER_METHOD(void, SBStream, RedirectToFile, (const char *, bool)); +  LLDB_REGISTER_METHOD(void, SBStream, RedirectToFileHandle, (FILE *, bool)); +  LLDB_REGISTER_METHOD(void, SBStream, RedirectToFileDescriptor, (int, bool)); +  LLDB_REGISTER_METHOD(void, SBStream, Clear, ()); +} + +} +} | 
