19#include "llvm/ADT/ScopeExit.h"
20#include "llvm/Support/Casting.h"
21#include "llvm/Support/ConvertUTF.h"
22#include "llvm/Support/Errno.h"
41 return obj.takeError();
42 return obj.get().IsTrue();
48 return obj.takeError();
49 return obj->AsLongLong();
53Expected<unsigned long long>
56 return obj.takeError();
57 return obj->AsUnsignedLongLong();
63 return obj.takeError();
64 PyObject *str_obj = PyObject_Str(obj.get().get());
66 return llvm::make_error<PythonException>();
68 auto utf8 = str.AsUTF8();
70 return utf8.takeError();
71 return std::string(utf8.get());
75 if (
m_py_obj && Py_IsInitialized()) {
76 PyGILState_STATE state = PyGILState_Ensure();
78 PyGILState_Release(state);
86 assert(!PyErr_Occurred());
87 long long r = PyLong_AsLongLong(
m_py_obj);
96 assert(!PyErr_Occurred());
97 long long r = PyLong_AsUnsignedLongLong(
m_py_obj);
107 assert(!PyErr_Occurred());
108 unsigned long long r = PyLong_AsUnsignedLongLongMask(
m_py_obj);
110 if (PyErr_Occurred())
116 s.value(llvm::formatv(
"Python Obj: {0:X}",
GetValue()).str());
127 PyObject *py_str = PyObject_Repr(
m_py_obj);
131 llvm::scope_exit release_py_str([py_str] { Py_DECREF(py_str); });
133 PyObject *py_bytes = PyUnicode_AsEncodedString(py_str,
"utf-8",
"replace");
137 llvm::scope_exit release_py_bytes([py_bytes] { Py_DECREF(py_bytes); });
139 char *buffer =
nullptr;
140 Py_ssize_t length = 0;
141 if (PyBytes_AsStringAndSize(py_bytes, &buffer, &length) == -1)
144 strm << llvm::StringRef(buffer, length);
179 PyObject *repr = PyObject_Repr(
m_py_obj);
188 PyObject *str = PyObject_Str(
m_py_obj);
197 size_t dot_pos = name.find(
'.');
198 llvm::StringRef piece = name.substr(0, dot_pos);
200 if (dot_pos == llvm::StringRef::npos) {
207 return result.
ResolveName(name.substr(dot_pos + 1));
221 size_t dot_pos = name.find(
'.');
222 if (dot_pos == llvm::StringRef::npos) {
235 return parent.
ResolveName(name.substr(dot_pos + 1));
242 return !!PyObject_HasAttr(
m_py_obj, py_attr.
get());
268 if (std::holds_alternative<StructuredData::UnsignedIntegerSP>(int_sp))
269 return std::get<StructuredData::UnsignedIntegerSP>(int_sp);
270 if (std::holds_alternative<StructuredData::SignedIntegerSP>(int_sp))
271 return std::get<StructuredData::SignedIntegerSP>(int_sp);
296 SetBytes(llvm::ArrayRef<uint8_t>(bytes, length));
302 return PyBytes_Check(py_obj);
307 return llvm::ArrayRef<uint8_t>();
312 PyBytes_AsStringAndSize(
m_py_obj, &c, &size);
313 return llvm::ArrayRef<uint8_t>(
reinterpret_cast<uint8_t *
>(c), size);
323 const char *data =
reinterpret_cast<const char *
>(bytes.data());
331 PyBytes_AsStringAndSize(
m_py_obj, &c, &size);
332 result->SetValue(std::string(c, size));
340 const char *str =
reinterpret_cast<const char *
>(bytes);
347 return PyByteArray_Check(py_obj);
352 return llvm::ArrayRef<uint8_t>();
354 char *c = PyByteArray_AsString(
m_py_obj);
356 return llvm::ArrayRef<uint8_t>(
reinterpret_cast<uint8_t *
>(c), size);
368 llvm::ArrayRef<uint8_t> bytes =
GetBytes();
369 const char *str =
reinterpret_cast<const char *
>(bytes.data());
370 result->SetValue(std::string(str, bytes.size()));
377 PyObject *str = PyUnicode_FromStringAndSize(
string.data(),
string.size());
379 return llvm::make_error<PythonException>();
389 if (PyUnicode_Check(py_obj))
397 llvm::consumeError(s.takeError());
398 return llvm::StringRef(
"");
412#if defined(Py_LIMITED_API) && (Py_LIMITED_API < 0x030a0000)
413 PyObject *py_bytes = PyUnicode_AsUTF8String(
m_py_obj);
416 llvm::scope_exit release_py_str([py_bytes] { Py_DECREF(py_bytes); });
417 Py_ssize_t size = PyBytes_Size(py_bytes);
418 const char *str = PyBytes_AsString(py_bytes);
426 const char *str = PyUnicode_AsUTF8AndSize(
m_py_obj, &size);
431 return llvm::StringRef(str, size);
437 return PyUnicode_GetLength(
m_py_obj);
444 llvm::consumeError(s.takeError());
447 *
this = std::move(s.get());
467 return PyLong_Check(py_obj);
485 llvm::consumeError(value.takeError());
487 result = std::make_shared<StructuredData::UnsignedInteger>(value.get());
495 llvm::Expected<long long> value =
AsLongLong();
497 llvm::consumeError(value.takeError());
499 result = std::make_shared<StructuredData::SignedInteger>(value.get());
509 return py_obj ? PyBool_Check(py_obj) :
false;
540 return PyList_Check(py_obj);
559 Py_INCREF(
object.
get());
575 for (uint32_t i = 0; i < count; ++i) {
594 m_py_obj = PyTuple_New(objects.size());
597 for (
auto object : objects) {
605 m_py_obj = PyTuple_New(objects.size());
608 for (
auto py_object : objects) {
619 return PyTuple_Check(py_obj);
638 Py_INCREF(
object.
get());
646 for (uint32_t i = 0; i < count; ++i) {
664 return PyDict_Check(py_obj);
671 PythonString key_object(key.isSingleStringRef() ? key.getSingleStringRef()
674 if (
int res = PyDict_Contains(
m_py_obj, key_object.
get()) > 0)
696 llvm::consumeError(item.takeError());
699 return std::move(item.get());
702Expected<PythonObject>
706 PyObject *o = PyDict_GetItemWithError(
m_py_obj, key.
get());
707 if (PyErr_Occurred())
718 if (PyErr_Occurred())
732 return Error::success();
742 return Error::success();
749 llvm::consumeError(std::move(
error));
756 uint32_t num_keys = keys.
GetSize();
757 for (uint32_t i = 0; i < num_keys; ++i) {
761 result->AddItem(key.
Str().
GetString(), structured_value);
771 std::string str =
module.str();
785 PyObject *dict = PyModule_GetDict(
m_py_obj);
788 PyObject *item = PyDict_GetItemString(dict,
NullTerminated(name));
798 return PyModule_Check(py_obj);
819 return PyCallable_Check(function_obj.
release());
822 return PyCallable_Check(py_obj);
826from inspect import signature, Parameter, ismethod
827from collections import namedtuple
828ArgInfo = namedtuple('ArgInfo', ['count', 'has_varargs'])
832 for parameter in signature(f).parameters.values():
833 kind = parameter.kind
834 if kind in (Parameter.POSITIONAL_ONLY,
835 Parameter.POSITIONAL_OR_KEYWORD):
837 elif kind == Parameter.VAR_POSITIONAL:
839 elif kind in (Parameter.KEYWORD_ONLY,
840 Parameter.VAR_KEYWORD):
843 raise Exception(f'unknown parameter kind: {kind}')
844 return ArgInfo(count, varargs)
853Expected<PythonCallable::ArgInfo>
858 Expected<PythonObject> pyarginfo = get_arg_info(callable);
860 return pyarginfo.takeError();
862 cantFail(
As<long long>(pyarginfo.get().GetAttribute(
"count")));
864 cantFail(
As<bool>(pyarginfo.get().GetAttribute(
"has_varargs")));
892 bool implicit_first_arg =
false;
894 implicit_first_arg =
true;
895 Expected<PythonObject> func_or_err =
GetAttribute(
"__func__");
897 return func_or_err.takeError();
900 implicit_first_arg =
true;
902 Expected<PythonObject> init_or_err =
GetAttribute(
"__init__");
904 return init_or_err.takeError();
911 Expected<PythonObject> new_or_err =
GetAttribute(
"__new__");
913 return new_or_err.takeError();
919 Expected<PythonObject> call_or_err =
GetAttribute(
"__call__");
921 return call_or_err.takeError();
924 Expected<PythonObject> inner_or_err = func.
GetAttribute(
"__func__");
926 return inner_or_err.takeError();
927 func = *inner_or_err;
930 return llvm::createStringError(
"__call__ has no __code__");
934 Expected<PythonObject> code_or_err = func.
GetAttribute(
"__code__");
936 return code_or_err.takeError();
939 Expected<long long> argcount =
942 return argcount.takeError();
945 return flags.takeError();
950 constexpr long long kCoFlagVarArgs = 0x04;
951 if (*flags & kCoFlagVarArgs) {
954 long long count = *argcount - (implicit_first_arg ? 1 : 0);
991 llvm::consumeError(io_module.takeError());
994 auto iobase = io_module.get().Get(
"IOBase");
996 llvm::consumeError(iobase.takeError());
999 int r = PyObject_IsInstance(py_obj, iobase.get().get());
1007#if defined(_WIN32) && !defined(_DLL)
1014 intptr_t handle = _get_osfhandle(our_fd);
1015 if (handle == 0 || (
HANDLE)handle == INVALID_HANDLE_VALUE)
1018 PyObject *msvcrt = PyImport_ImportModule(
"msvcrt");
1021 PyObject *open_osf = PyObject_GetAttrString(msvcrt,
"open_osfhandle");
1026 PyObject_CallFunction(open_osf,
"Li", (
long long)handle, 0);
1027 Py_XDECREF(open_osf);
1030 if (!PyLong_Check(fd_obj)) {
1034 long theirs = PyLong_AsLong(fd_obj);
1040 PyObject *msvcrt = PyImport_ImportModule(
"msvcrt");
1043 PyObject *get_handle = PyObject_GetAttrString(msvcrt,
"get_osfhandle");
1047 PyObject *handle_obj = PyObject_CallFunction(get_handle,
"i", their_fd);
1048 Py_XDECREF(get_handle);
1051 if (!PyLong_Check(handle_obj)) {
1052 Py_XDECREF(handle_obj);
1055 size_t handle = PyLong_AsSize_t(handle_obj);
1056 Py_XDECREF(handle_obj);
1057 return _open_osfhandle((intptr_t)handle, 0);
1066 return "unknown exception";
1071 assert(PyErr_Occurred());
1079 m_repr_bytes = PyUnicode_AsEncodedString(repr,
"utf-8",
nullptr);
1098 PyErr_SetString(PyExc_Exception,
toCString());
1113 return llvm::inconvertibleErrorCode();
1122from traceback import print_exception
1123from io import StringIO
1124def main(exc_type, exc_value, tb):
1126 print_exception(exc_type, exc_value, tb, file=f)
1142 std::string message =
1144 "Traceback unavailable, an error occurred while reading it:\n";
1145 return (message + llvm::toString(backtrace.takeError()));
1148 return std::move(backtrace.get());
1153llvm::Expected<File::OpenOptions>
1158 return readable.takeError();
1161 return writable.takeError();
1162 if (readable.get() && writable.get())
1164 else if (writable.get())
1166 else if (readable.get())
1175template <
typename Base>
class OwnedPythonFile :
public Base {
1177 template <
typename... Args>
1178 OwnedPythonFile(
const PythonFile &file,
bool borrowed, Args... args)
1179 : Base(args...), m_py_obj(file), m_borrowed(borrowed) {
1183 ~OwnedPythonFile()
override {
1192 bool IsPythonSideValid()
const {
1194 auto closed =
As<bool>(m_py_obj.GetAttribute(
"closed"));
1196 llvm::consumeError(closed.takeError());
1199 return !closed.get();
1202 bool IsValid()
const override {
1203 return IsPythonSideValid() && Base::IsValid();
1206 Status Close()
override {
1208 Status py_error, base_error;
1211 auto r = m_py_obj.CallMethod(
"close");
1213 py_error = Status::FromError(r.takeError());
1215 base_error = Base::Close();
1217 if (py_error.
Fail())
1218 return py_error.
Clone();
1219 return base_error.
Clone();
1222 PyObject *GetPythonObject()
const {
1223 assert(m_py_obj.IsValid());
1224 return m_py_obj.get();
1227 static bool classof(
const File *file) =
delete;
1230 PythonFile m_py_obj;
1238class SimplePythonFile :
public OwnedPythonFile<NativeFile> {
1240 SimplePythonFile(
const PythonFile &file,
bool borrowed,
int fd,
1242 : OwnedPythonFile(file, borrowed, fd, options, false) {}
1245 bool isA(
const void *classID)
const override {
1248 static bool classof(
const File *file) {
return file->
isA(&
ID); }
1250char SimplePythonFile::ID = 0;
1255class PythonIOFile :
public OwnedPythonFile<File> {
1257 PythonIOFile(
const PythonFile &file,
bool borrowed)
1258 : OwnedPythonFile(file, borrowed) {}
1260 ~PythonIOFile()
override { Close(); }
1262 bool IsValid()
const override {
return IsPythonSideValid(); }
1264 Status Close()
override {
1269 auto r = m_py_obj.CallMethod(
"close");
1272 return Status::FromError(r.takeError()).Clone();
1276 Status Flush()
override {
1278 auto r = m_py_obj.CallMethod(
"flush");
1281 return Status::FromError(r.takeError()).Clone();
1285 Expected<File::OpenOptions> GetOptions()
const override {
1291 bool isA(
const void *classID)
const override {
1294 static bool classof(
const File *file) {
return file->
isA(&
ID); }
1296char PythonIOFile::ID = 0;
1300class BinaryPythonFile :
public PythonIOFile {
1305 BinaryPythonFile(
int fd,
const PythonFile &file,
bool borrowed)
1306 : PythonIOFile(file, borrowed),
1307 m_descriptor(
File::DescriptorIsValid(fd) ? fd
1308 :
File::kInvalidDescriptor) {}
1310 int GetDescriptor()
const override {
return m_descriptor; }
1312 Status Write(
const void *buf,
size_t &num_bytes)
override {
1314 PyObject *pybuffer_p = PyMemoryView_FromMemory(
1315 const_cast<char *
>((
const char *)buf), num_bytes,
PyBUF_READ);
1318 return Status::FromError(llvm::make_error<PythonException>()).Clone();
1321 auto bytes_written =
As<long long>(m_py_obj.CallMethod(
"write", pybuffer));
1323 return Status::FromError(bytes_written.takeError());
1324 if (bytes_written.get() < 0)
1325 return Status::FromErrorString(
1326 ".write() method returned a negative number!");
1327 static_assert(
sizeof(
long long) >=
sizeof(size_t),
"overflow");
1328 num_bytes = bytes_written.get();
1332 Status Read(
void *buf,
size_t &num_bytes)
override {
1334 static_assert(
sizeof(
long long) >=
sizeof(size_t),
"overflow");
1336 m_py_obj.CallMethod(
"read", (
unsigned long long)num_bytes);
1339 return Status::FromError(pybuffer_obj.takeError()).Clone();
1341 if (pybuffer_obj.get().IsNone()) {
1346 PythonBytes pybytes(PyRefType::Borrowed, pybuffer_obj->get());
1348 return Status::FromError(llvm::make_error<PythonException>());
1349 llvm::ArrayRef<uint8_t> bytes = pybytes.GetBytes();
1350 memcpy(buf, bytes.begin(), bytes.size());
1351 num_bytes = bytes.size();
1358class TextPythonFile :
public PythonIOFile {
1363 TextPythonFile(
int fd,
const PythonFile &file,
bool borrowed)
1364 : PythonIOFile(file, borrowed),
1365 m_descriptor(
File::DescriptorIsValid(fd) ? fd
1366 :
File::kInvalidDescriptor) {}
1368 int GetDescriptor()
const override {
return m_descriptor; }
1370 Status Write(
const void *buf,
size_t &num_bytes)
override {
1375 return Status::FromError(pystring.takeError());
1377 auto bytes_written =
1378 As<long long>(m_py_obj.CallMethod(
"write", pystring.get()));
1381 return Status::FromError(bytes_written.takeError()).Clone();
1382 if (bytes_written.get() < 0)
1383 return Status::FromErrorString(
1384 ".write() method returned a negative number!");
1385 static_assert(
sizeof(
long long) >=
sizeof(size_t),
"overflow");
1386 num_bytes = bytes_written.get();
1390 Status Read(
void *buf,
size_t &num_bytes)
override {
1392 size_t num_chars = num_bytes / 6;
1393 size_t orig_num_bytes = num_bytes;
1395 if (orig_num_bytes < 6) {
1396 return Status::FromErrorString(
1397 "can't read less than 6 bytes from a utf8 text stream");
1400 m_py_obj.CallMethod(
"read", (
unsigned long long)num_chars));
1403 return Status::FromError(pystring.takeError()).Clone();
1404 if (pystring.get().IsNone()) {
1408 auto stringref = pystring.get().AsUTF8();
1411 return Status::FromError(stringref.takeError()).Clone();
1412 num_bytes = stringref.get().size();
1413 memcpy(buf, stringref.get().begin(), num_bytes);
1421 return llvm::createStringError(llvm::inconvertibleErrorCode(),
1422 "invalid PythonFile");
1424 int fd = PyObject_AsFileDescriptor(
m_py_obj);
1432 return llvm::createStringError(
"failed to translate Python fd to our fd");
1437 return options.takeError();
1447 return r.takeError();
1454 file_sp = std::make_shared<NativeFile>(fd, options.get(),
false);
1456 file_sp = std::static_pointer_cast<File>(
1457 std::make_shared<SimplePythonFile>(*
this, borrowed, fd, options.get()));
1459 if (!file_sp->IsValid())
1460 return llvm::createStringError(llvm::inconvertibleErrorCode(),
1466llvm::Expected<FileSP>
1469 assert(!PyErr_Occurred());
1472 return llvm::createStringError(llvm::inconvertibleErrorCode(),
1473 "invalid PythonFile");
1475 int fd = PyObject_AsFileDescriptor(
m_py_obj);
1483 return llvm::createStringError(
"failed to translate Python fd to our fd");
1489 return io_module.takeError();
1490 auto textIOBase = io_module.get().Get(
"TextIOBase");
1492 return textIOBase.takeError();
1493 auto rawIOBase = io_module.get().Get(
"RawIOBase");
1495 return rawIOBase.takeError();
1496 auto bufferedIOBase = io_module.get().Get(
"BufferedIOBase");
1497 if (!bufferedIOBase)
1498 return bufferedIOBase.takeError();
1502 auto isTextIO =
IsInstance(textIOBase.get());
1504 return isTextIO.takeError();
1506 file_sp = std::static_pointer_cast<File>(
1507 std::make_shared<TextPythonFile>(fd, *
this, borrowed));
1511 return isRawIO.takeError();
1512 auto isBufferedIO =
IsInstance(bufferedIOBase.get());
1514 return isBufferedIO.takeError();
1516 if (isRawIO.get() || isBufferedIO.get()) {
1517 file_sp = std::static_pointer_cast<File>(
1518 std::make_shared<BinaryPythonFile>(fd, *
this, borrowed));
1522 return llvm::createStringError(llvm::inconvertibleErrorCode(),
1523 "python file is neither text nor binary");
1525 if (!file_sp->IsValid())
1526 return llvm::createStringError(llvm::inconvertibleErrorCode(),
1534 return llvm::createStringError(llvm::inconvertibleErrorCode(),
1537 if (
auto *simple = llvm::dyn_cast<SimplePythonFile>(&file))
1539 if (
auto *pythonio = llvm::dyn_cast<PythonIOFile>(&file))
1545 return m.takeError();
1551 mode, -1,
nullptr,
"ignore",
nullptr, 0);
1561 return Error::success();
1565 if (Error
error = globals.
SetItem(
"__builtins__", builtins))
1573 return f.takeError();
1576 return Error::success();
1579llvm::Expected<PythonObject>
1587 Py_CompileString(
NullTerminated(
string),
"<string>", Py_eval_input);
1591 Py_CompileString(
NullTerminated(
string),
"<string>", Py_single_input);
1597 PyObject *result = PyEval_EvalCode(code, globals.
get(), locals.
get());
1605llvm::Expected<PythonObject>
1612 globals.
get(), locals.
get());
1619 PyObject *globals, PyObject *locals) {
1620 const char *filename =
"<string>";
1623 PyObject *code = Py_CompileString(str, filename, start);
1628 PyObject *result = PyEval_EvalCode(code, globals, locals);
1637 PyObject *main_module = PyImport_AddModule(
"__main__");
1641 PyObject *globals = PyModule_GetDict(main_module);
1645 PyObject *result =
RunString(str, Py_file_input, globals, globals);
static llvm::raw_ostream & error(Stream &strm)
#define LLDB_LOGF(log,...)
static const char get_arg_info_script[]
llvm::Expected< File::OpenOptions > GetOptionsForPyObject(const PythonObject &obj)
const char read_exception_script[]
A uniqued constant string class.
llvm::StringRef GetStringRef() const
Get the string value as a llvm::StringRef.
virtual bool isA(const void *classID) const
static int kInvalidDescriptor
virtual int GetDescriptor() const
Get underlying OS file descriptor for this file, or kInvalidDescriptor.
llvm::Expected< const char * > GetOpenMode() const
bool IsValid() const override
IsValid.
bool isA(const void *classID) const override
Status Clone() const
Don't call this function in new code.
bool Fail() const
Test for error condition.
A stream class that can stream formatted output to a file.
std::shared_ptr< UnsignedInteger > UnsignedIntegerSP
std::shared_ptr< Dictionary > DictionarySP
std::shared_ptr< Object > ObjectSP
std::shared_ptr< String > StringSP
std::shared_ptr< Array > ArraySP
std::shared_ptr< Boolean > BooleanSP
std::shared_ptr< SignedInteger > SignedIntegerSP
std::variant< UnsignedIntegerSP, SignedIntegerSP > IntegerSP
StructuredData::BooleanSP CreateStructuredBoolean() const
static bool Check(PyObject *py_obj)
PythonBoolean(bool value)
void SetValue(bool value)
StructuredData::StringSP CreateStructuredString() const
llvm::ArrayRef< uint8_t > GetBytes() const
static bool Check(PyObject *py_obj)
PythonByteArray(llvm::ArrayRef< uint8_t > bytes)
static bool Check(PyObject *py_obj)
StructuredData::StringSP CreateStructuredString() const
void SetBytes(llvm::ArrayRef< uint8_t > stringbytes)
PythonBytes(llvm::ArrayRef< uint8_t > bytes)
llvm::ArrayRef< uint8_t > GetBytes() const
static llvm::Expected< ArgInfo > GetArgInfoFromInspectSignature(const PythonCallable &callable)
llvm::Expected< ArgInfo > GetArgInfo() const
PythonObject operator()()
static bool Check(PyObject *py_obj)
StructuredData::DictionarySP CreateStructuredDictionary() const
llvm::Expected< PythonObject > GetItem(const PythonObject &key) const
bool HasKey(const llvm::Twine &key) const
static bool Check(PyObject *py_obj)
PythonObject GetItemForKey(const PythonObject &key) const
llvm::Error SetItem(const PythonObject &key, const PythonObject &value) const
PythonList GetKeys() const
void SetItemForKey(const PythonObject &key, const PythonObject &value)
const char * toCString() const
PyObject * m_exception_type
bool Matches(PyObject *exc) const
std::string ReadBacktrace() const
std::error_code convertToErrorCode() const override
void log(llvm::raw_ostream &OS) const override
~PythonException() override
PythonException(const char *caller=nullptr)
llvm::Expected< lldb::FileSP > ConvertToFileForcingUseOfScriptingIOMethods(bool borrowed=false)
static int TranslateFdFromPython(int their_fd)
llvm::Expected< lldb::FileSP > ConvertToFile(bool borrowed=false)
static bool Check(PyObject *py_obj)
static int TranslateFdToPython(int our_fd)
static llvm::Expected< PythonFile > FromFile(File &file, const char *mode=nullptr)
StructuredData::SignedIntegerSP CreateStructuredSignedInteger() const
static bool Check(PyObject *py_obj)
StructuredData::UnsignedIntegerSP CreateStructuredUnsignedInteger() const
StructuredData::IntegerSP CreateStructuredInteger() const
void SetInteger(int64_t value)
PythonObject GetItemAtIndex(uint32_t index) const
void AppendItem(const PythonObject &object)
static bool Check(PyObject *py_obj)
void SetItemAtIndex(uint32_t index, const PythonObject &object)
StructuredData::ArraySP CreateStructuredArray() const
static PythonModule BuiltinsModule()
static PythonModule AddModule(llvm::StringRef module)
static PythonModule MainModule()
llvm::Expected< PythonObject > Get(const llvm::Twine &name)
PythonDictionary GetDictionary() const
static bool Check(PyObject *py_obj)
static llvm::Expected< PythonModule > Import(const llvm::Twine &name)
PythonObject ResolveName(llvm::StringRef name) const
PythonString Repr() const
llvm::Expected< long long > AsLongLong() const
StructuredData::ObjectSP CreateStructuredObject() const
llvm::Expected< unsigned long long > AsModuloUnsignedLongLong() const
PythonObject GetAttributeValue(llvm::StringRef attribute) const
static PythonObject ResolveNameWithDictionary(llvm::StringRef name, const PythonDictionary &dict)
llvm::Expected< unsigned long long > AsUnsignedLongLong() const
llvm::Expected< bool > IsInstance(const PythonObject &cls)
llvm::Expected< PythonObject > GetAttribute(const llvm::Twine &name) const
PyObjectType GetObjectType() const
void Dump(Stream &strm) const
bool HasAttribute(llvm::StringRef attribute) const
llvm::Expected< PythonObject > CallMethod(const char *name, const T &... t) const
llvm::Expected< llvm::StringRef > AsUTF8() const
llvm::StringRef GetString() const
void SetString(llvm::StringRef string)
StructuredData::StringSP CreateStructuredString() const
static bool Check(PyObject *py_obj)
static llvm::Expected< PythonString > FromUTF8(llvm::StringRef string)
PythonTuple(PyInitialValue value)
StructuredData::ArraySP CreateStructuredArray() const
void SetItemAtIndex(uint32_t index, const PythonObject &object)
PythonObject GetItemAtIndex(uint32_t index) const
static bool Check(PyObject *py_obj)
void Serialize(llvm::json::OStream &s) const override
llvm::Expected< unsigned long long > As< unsigned long long >(llvm::Expected< PythonObject > &&obj)
llvm::Error exception(const char *s=nullptr)
llvm::Expected< std::string > As< std::string >(llvm::Expected< PythonObject > &&obj)
PyObject * RunString(const char *str, int start, PyObject *globals, PyObject *locals)
llvm::Expected< T > As(llvm::Expected< PythonObject > &&obj)
llvm::Expected< PythonObject > runStringMultiLine(const llvm::Twine &string, const PythonDictionary &globals, const PythonDictionary &locals)
int RunSimpleString(const char *str)
llvm::Expected< long long > As< long long >(llvm::Expected< PythonObject > &&obj)
llvm::Expected< bool > As< bool >(llvm::Expected< PythonObject > &&obj)
llvm::Expected< PythonObject > runStringOneLine(const llvm::Twine &string, const PythonDictionary &globals, const PythonDictionary &locals)
A class that represents a running process on the host machine.
Log * GetLog(Cat mask)
Retrieve the Log object for the channel associated with the given log enum.
std::shared_ptr< lldb_private::File > FileSP
unsigned max_positional_args
static constexpr unsigned UNBOUNDED