diff options
author | Lawrence D'Anna <lawrence_danna@apple.com> | 2020-04-21 16:53:47 -0700 |
---|---|---|
committer | Lawrence D'Anna <lawrence_danna@apple.com> | 2020-04-21 16:55:51 -0700 |
commit | 7375212172951d2fc283c81d03c1a8588c3280c6 (patch) | |
tree | 8fd63b96fb1150d45070fbe0ae1aa96ad3bce263 /lldb/source/Plugins/ScriptInterpreter/Python/PythonDataObjects.h | |
parent | dad6de411227faed9b15cd85d916e96e751b8528 (diff) | |
download | llvm-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.h | 27 |
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; |