
Summary: This patch factors out File as an abstract base class and moves most of its actual functionality into a subclass called NativeFile. In the next patch, I'm going to be adding subclasses of File that don't necessarily have any connection to actual OS files, so they will not inherit from NativeFile. This patch was split out as a prerequisite for https://reviews.llvm.org/D68188 Reviewers: JDevlieghere, jasonmolenda, labath Reviewed By: labath Subscribers: lldb-commits Tags: #lldb Differential Revision: https://reviews.llvm.org/D68317 llvm-svn: 373564
116 lines
3.6 KiB
C++
116 lines
3.6 KiB
C++
//===-- SBFile.cpp ------------------------------------------*- C++ -*-===//
|
|
//
|
|
// 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/SBFile.h"
|
|
#include "SBReproducerPrivate.h"
|
|
#include "lldb/API/SBError.h"
|
|
#include "lldb/Host/File.h"
|
|
|
|
using namespace lldb;
|
|
using namespace lldb_private;
|
|
|
|
SBFile::~SBFile() {}
|
|
|
|
SBFile::SBFile(FileSP file_sp) : m_opaque_sp(file_sp) {}
|
|
|
|
SBFile::SBFile() { LLDB_RECORD_CONSTRUCTOR_NO_ARGS(SBFile); }
|
|
|
|
SBFile::SBFile(FILE *file, bool transfer_ownership) {
|
|
m_opaque_sp = std::make_shared<NativeFile>(file, transfer_ownership);
|
|
}
|
|
|
|
SBFile::SBFile(int fd, const char *mode, bool transfer_owndership) {
|
|
LLDB_RECORD_CONSTRUCTOR(SBFile, (int, const char *, bool), fd, mode,
|
|
transfer_owndership);
|
|
auto options = File::GetOptionsFromMode(mode);
|
|
m_opaque_sp = std::make_shared<NativeFile>(fd, options, transfer_owndership);
|
|
}
|
|
|
|
SBError SBFile::Read(uint8_t *buf, size_t num_bytes, size_t *bytes_read) {
|
|
LLDB_RECORD_DUMMY(lldb::SBError, SBFile, Read, (uint8_t *, size_t, size_t *),
|
|
buf, num_bytes, bytes_read);
|
|
SBError error;
|
|
if (!m_opaque_sp) {
|
|
error.SetErrorString("invalid SBFile");
|
|
*bytes_read = 0;
|
|
} else {
|
|
Status status = m_opaque_sp->Read(buf, num_bytes);
|
|
error.SetError(status);
|
|
*bytes_read = num_bytes;
|
|
}
|
|
return LLDB_RECORD_RESULT(error);
|
|
}
|
|
|
|
SBError SBFile::Write(const uint8_t *buf, size_t num_bytes,
|
|
size_t *bytes_written) {
|
|
LLDB_RECORD_DUMMY(lldb::SBError, SBFile, Write,
|
|
(const uint8_t *, size_t, size_t *), buf, num_bytes,
|
|
bytes_written);
|
|
SBError error;
|
|
if (!m_opaque_sp) {
|
|
error.SetErrorString("invalid SBFile");
|
|
*bytes_written = 0;
|
|
} else {
|
|
Status status = m_opaque_sp->Write(buf, num_bytes);
|
|
error.SetError(status);
|
|
*bytes_written = num_bytes;
|
|
}
|
|
return LLDB_RECORD_RESULT(error);
|
|
}
|
|
|
|
SBError SBFile::Flush() {
|
|
LLDB_RECORD_METHOD_NO_ARGS(lldb::SBError, SBFile, Flush);
|
|
SBError error;
|
|
if (!m_opaque_sp) {
|
|
error.SetErrorString("invalid SBFile");
|
|
} else {
|
|
Status status = m_opaque_sp->Flush();
|
|
error.SetError(status);
|
|
}
|
|
return LLDB_RECORD_RESULT(error);
|
|
}
|
|
|
|
bool SBFile::IsValid() const {
|
|
LLDB_RECORD_METHOD_CONST_NO_ARGS(bool, SBFile, IsValid);
|
|
return m_opaque_sp && m_opaque_sp->IsValid();
|
|
}
|
|
|
|
SBError SBFile::Close() {
|
|
LLDB_RECORD_METHOD_NO_ARGS(lldb::SBError, SBFile, Close);
|
|
SBError error;
|
|
if (m_opaque_sp) {
|
|
Status status = m_opaque_sp->Close();
|
|
error.SetError(status);
|
|
}
|
|
return LLDB_RECORD_RESULT(error);
|
|
}
|
|
|
|
SBFile::operator bool() const {
|
|
LLDB_RECORD_METHOD_CONST_NO_ARGS(bool, SBFile, operator bool);
|
|
return LLDB_RECORD_RESULT(IsValid());
|
|
}
|
|
|
|
bool SBFile::operator!() const {
|
|
LLDB_RECORD_METHOD_CONST_NO_ARGS(bool, SBFile, operator!);
|
|
return LLDB_RECORD_RESULT(!IsValid());
|
|
}
|
|
|
|
namespace lldb_private {
|
|
namespace repro {
|
|
template <> void RegisterMethods<SBFile>(Registry &R) {
|
|
LLDB_REGISTER_CONSTRUCTOR(SBFile, ());
|
|
LLDB_REGISTER_CONSTRUCTOR(SBFile, (int, const char *, bool));
|
|
LLDB_REGISTER_METHOD(lldb::SBError, SBFile, Flush, ());
|
|
LLDB_REGISTER_METHOD_CONST(bool, SBFile, IsValid, ());
|
|
LLDB_REGISTER_METHOD_CONST(bool, SBFile, operator bool,());
|
|
LLDB_REGISTER_METHOD_CONST(bool, SBFile, operator!,());
|
|
LLDB_REGISTER_METHOD(lldb::SBError, SBFile, Close, ());
|
|
}
|
|
} // namespace repro
|
|
} // namespace lldb_private
|