aboutsummaryrefslogtreecommitdiff
path: root/lldb/source/Plugins/ScriptInterpreter/Python/PythonDataObjects.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'lldb/source/Plugins/ScriptInterpreter/Python/PythonDataObjects.cpp')
-rw-r--r--lldb/source/Plugins/ScriptInterpreter/Python/PythonDataObjects.cpp51
1 files changed, 37 insertions, 14 deletions
diff --git a/lldb/source/Plugins/ScriptInterpreter/Python/PythonDataObjects.cpp b/lldb/source/Plugins/ScriptInterpreter/Python/PythonDataObjects.cpp
index 2291856..eee2f6f 100644
--- a/lldb/source/Plugins/ScriptInterpreter/Python/PythonDataObjects.cpp
+++ b/lldb/source/Plugins/ScriptInterpreter/Python/PythonDataObjects.cpp
@@ -25,6 +25,7 @@
#include "llvm/Support/Errno.h"
#include <cstdio>
+#include <variant>
using namespace lldb_private;
using namespace lldb;
@@ -101,7 +102,7 @@ Expected<long long> PythonObject::AsLongLong() const {
return r;
}
-Expected<long long> PythonObject::AsUnsignedLongLong() const {
+Expected<unsigned long long> PythonObject::AsUnsignedLongLong() const {
if (!m_py_obj)
return nullDeref();
assert(!PyErr_Occurred());
@@ -117,6 +118,7 @@ Expected<unsigned long long> PythonObject::AsModuloUnsignedLongLong() const {
return nullDeref();
assert(!PyErr_Occurred());
unsigned long long r = PyLong_AsUnsignedLongLongMask(m_py_obj);
+ // FIXME: We should fetch the exception message and hoist it.
if (PyErr_Occurred())
return exception();
return r;
@@ -267,9 +269,15 @@ StructuredData::ObjectSP PythonObject::CreateStructuredObject() const {
case PyObjectType::Boolean:
return PythonBoolean(PyRefType::Borrowed, m_py_obj)
.CreateStructuredBoolean();
- case PyObjectType::Integer:
- return PythonInteger(PyRefType::Borrowed, m_py_obj)
- .CreateStructuredInteger();
+ case PyObjectType::Integer: {
+ StructuredData::IntegerSP int_sp =
+ PythonInteger(PyRefType::Borrowed, m_py_obj).CreateStructuredInteger();
+ if (std::holds_alternative<StructuredData::UnsignedIntegerSP>(int_sp))
+ return std::get<StructuredData::UnsignedIntegerSP>(int_sp);
+ if (std::holds_alternative<StructuredData::SignedIntegerSP>(int_sp))
+ return std::get<StructuredData::SignedIntegerSP>(int_sp);
+ return nullptr;
+ };
case PyObjectType::List:
return PythonList(PyRefType::Borrowed, m_py_obj).CreateStructuredArray();
case PyObjectType::String:
@@ -459,17 +467,32 @@ void PythonInteger::SetInteger(int64_t value) {
}
StructuredData::IntegerSP PythonInteger::CreateStructuredInteger() const {
- StructuredData::IntegerSP result(new StructuredData::Integer);
- // FIXME this is really not ideal. Errors are silently converted to 0
- // and overflows are silently wrapped. But we'd need larger changes
- // to StructuredData to fix it, so that's how it is for now.
- llvm::Expected<unsigned long long> value = AsModuloUnsignedLongLong();
- if (!value) {
+ StructuredData::UnsignedIntegerSP uint_sp = CreateStructuredUnsignedInteger();
+ return uint_sp ? StructuredData::IntegerSP(uint_sp)
+ : CreateStructuredSignedInteger();
+}
+
+StructuredData::UnsignedIntegerSP
+PythonInteger::CreateStructuredUnsignedInteger() const {
+ StructuredData::UnsignedIntegerSP result = nullptr;
+ llvm::Expected<unsigned long long> value = AsUnsignedLongLong();
+ if (!value)
llvm::consumeError(value.takeError());
- result->SetValue(0);
- } else {
- result->SetValue(value.get());
- }
+ else
+ result = std::make_shared<StructuredData::UnsignedInteger>(value.get());
+
+ return result;
+}
+
+StructuredData::SignedIntegerSP
+PythonInteger::CreateStructuredSignedInteger() const {
+ StructuredData::SignedIntegerSP result = nullptr;
+ llvm::Expected<long long> value = AsLongLong();
+ if (!value)
+ llvm::consumeError(value.takeError());
+ else
+ result = std::make_shared<StructuredData::SignedInteger>(value.get());
+
return result;
}