[lldb/python] Use PythonObject in LLDBSwigPython functions

Return our PythonObject wrappers instead of raw PyObjects (obfuscated as
void *). This ensures that ownership (reference counts) of python
objects is automatically tracked.

Differential Revision: https://reviews.llvm.org/D117462
This commit is contained in:
Pavel Labath
2022-01-17 11:29:35 +01:00
parent cc0d208805
commit c154f397ee
8 changed files with 154 additions and 181 deletions

View File

@@ -83,39 +83,6 @@ protected:
PyGILState_STATE m_state;
};
class StructuredPythonObject : public StructuredData::Generic {
public:
StructuredPythonObject() : StructuredData::Generic() {}
StructuredPythonObject(void *obj) : StructuredData::Generic(obj) {
assert(PyGILState_Check());
Py_XINCREF(GetValue());
}
~StructuredPythonObject() override {
if (Py_IsInitialized()) {
if (_Py_IsFinalizing()) {
// Leak GetValue() rather than crashing the process.
// https://docs.python.org/3/c-api/init.html#c.PyGILState_Ensure
} else {
PyGILState_STATE state = PyGILState_Ensure();
Py_XDECREF(GetValue());
PyGILState_Release(state);
}
}
SetValue(nullptr);
}
bool IsValid() const override { return GetValue() && GetValue() != Py_None; }
void Serialize(llvm::json::OStream &s) const override;
private:
StructuredPythonObject(const StructuredPythonObject &) = delete;
const StructuredPythonObject &
operator=(const StructuredPythonObject &) = delete;
};
enum class PyObjectType {
Unknown,
None,
@@ -784,6 +751,30 @@ public:
}
};
class StructuredPythonObject : public StructuredData::Generic {
public:
StructuredPythonObject() : StructuredData::Generic() {}
// Take ownership of the object we received.
StructuredPythonObject(PythonObject obj)
: StructuredData::Generic(obj.release()) {}
~StructuredPythonObject() override {
// Hand ownership back to a (temporary) PythonObject instance and let it
// take care of releasing it.
PythonObject(PyRefType::Owned, static_cast<PyObject *>(GetValue()));
}
bool IsValid() const override { return GetValue() && GetValue() != Py_None; }
void Serialize(llvm::json::OStream &s) const override;
private:
StructuredPythonObject(const StructuredPythonObject &) = delete;
const StructuredPythonObject &
operator=(const StructuredPythonObject &) = delete;
};
} // namespace python
} // namespace lldb_private