aboutsummaryrefslogtreecommitdiff
path: root/lldb/source/Plugins/ScriptInterpreter/Python/PythonDataObjects.h
diff options
context:
space:
mode:
authorLawrence D'Anna <lawrence_danna@apple.com>2020-04-21 16:53:47 -0700
committerLawrence D'Anna <lawrence_danna@apple.com>2020-04-21 16:55:51 -0700
commit7375212172951d2fc283c81d03c1a8588c3280c6 (patch)
tree8fd63b96fb1150d45070fbe0ae1aa96ad3bce263 /lldb/source/Plugins/ScriptInterpreter/Python/PythonDataObjects.h
parentdad6de411227faed9b15cd85d916e96e751b8528 (diff)
downloadllvm-7375212172951d2fc283c81d03c1a8588c3280c6.zip
llvm-7375212172951d2fc283c81d03c1a8588c3280c6.tar.gz
llvm-7375212172951d2fc283c81d03c1a8588c3280c6.tar.bz2
get rid of PythonInteger::GetInteger()
Summary: One small step in my long running quest to improve python exception handling in LLDB. Replace GetInteger() which just returns an int with As<long long> and friends, which return Expected types that can track python exceptions Reviewers: labath, jasonmolenda, JDevlieghere, vadimcn Reviewed By: labath Subscribers: lldb-commits Tags: #lldb Differential Revision: https://reviews.llvm.org/D78462
Diffstat (limited to 'lldb/source/Plugins/ScriptInterpreter/Python/PythonDataObjects.h')
-rw-r--r--lldb/source/Plugins/ScriptInterpreter/Python/PythonDataObjects.h27
1 files changed, 25 insertions, 2 deletions
diff --git a/lldb/source/Plugins/ScriptInterpreter/Python/PythonDataObjects.h b/lldb/source/Plugins/ScriptInterpreter/Python/PythonDataObjects.h
index 1689680..b09f42e 100644
--- a/lldb/source/Plugins/ScriptInterpreter/Python/PythonDataObjects.h
+++ b/lldb/source/Plugins/ScriptInterpreter/Python/PythonDataObjects.h
@@ -370,6 +370,27 @@ public:
return r;
}
+ llvm::Expected<long long> AsUnsignedLongLong() {
+ if (!m_py_obj)
+ return nullDeref();
+ assert(!PyErr_Occurred());
+ long long r = PyLong_AsUnsignedLongLong(m_py_obj);
+ if (PyErr_Occurred())
+ return exception();
+ return r;
+ }
+
+ llvm::Expected<unsigned long long> AsModuloUnsignedLongLong() const {
+ // wraps on overflow, instead of raising an error.
+ if (!m_py_obj)
+ return nullDeref();
+ assert(!PyErr_Occurred());
+ unsigned long long r = PyLong_AsUnsignedLongLongMask(m_py_obj);
+ if (PyErr_Occurred())
+ return exception();
+ return r;
+ }
+
llvm::Expected<bool> IsInstance(const PythonObject &cls) {
if (!m_py_obj || !cls.IsValid())
return nullDeref();
@@ -400,6 +421,10 @@ template <>
llvm::Expected<long long> As<long long>(llvm::Expected<PythonObject> &&obj);
template <>
+llvm::Expected<unsigned long long>
+As<unsigned long long>(llvm::Expected<PythonObject> &&obj);
+
+template <>
llvm::Expected<std::string> As<std::string>(llvm::Expected<PythonObject> &&obj);
@@ -491,8 +516,6 @@ public:
static bool Check(PyObject *py_obj);
static void Convert(PyRefType &type, PyObject *&py_obj);
- int64_t GetInteger() const;
-
void SetInteger(int64_t value);
StructuredData::IntegerSP CreateStructuredInteger() const;