[Mlir-commits] [mlir] 1689dad - [MLIR] [Python] Allow 'operation.parent' to return 'None'
John Demme
llvmlistbot at llvm.org
Mon Aug 16 22:38:14 PDT 2021
Author: John Demme
Date: 2021-08-16T22:38:07-07:00
New Revision: 1689dade4218945db175f7916c2261667f9bf371
URL: https://github.com/llvm/llvm-project/commit/1689dade4218945db175f7916c2261667f9bf371
DIFF: https://github.com/llvm/llvm-project/commit/1689dade4218945db175f7916c2261667f9bf371.diff
LOG: [MLIR] [Python] Allow 'operation.parent' to return 'None'
This is more Pythonic and better matches the C++ and C APIs.
Reviewed By: stellaraccident
Differential Revision: https://reviews.llvm.org/D108183
Added:
Modified:
mlir/lib/Bindings/Python/IRCore.cpp
mlir/lib/Bindings/Python/IRModule.h
Removed:
################################################################################
diff --git a/mlir/lib/Bindings/Python/IRCore.cpp b/mlir/lib/Bindings/Python/IRCore.cpp
index 1f81550005250..3e927ceec190f 100644
--- a/mlir/lib/Bindings/Python/IRCore.cpp
+++ b/mlir/lib/Bindings/Python/IRCore.cpp
@@ -868,22 +868,23 @@ py::object PyOperationBase::getAsm(bool binary,
return fileObject.attr("getvalue")();
}
-PyOperationRef PyOperation::getParentOperation() {
+llvm::Optional<PyOperationRef> PyOperation::getParentOperation() {
checkValid();
if (!isAttached())
throw SetPyError(PyExc_ValueError, "Detached operations have no parent");
MlirOperation operation = mlirOperationGetParentOperation(get());
if (mlirOperationIsNull(operation))
- throw SetPyError(PyExc_ValueError, "Operation has no parent.");
+ return {};
return PyOperation::forOperation(getContext(), operation);
}
PyBlock PyOperation::getBlock() {
checkValid();
- PyOperationRef parentOperation = getParentOperation();
+ llvm::Optional<PyOperationRef> parentOperation = getParentOperation();
MlirBlock block = mlirOperationGetBlock(get());
assert(!mlirBlockIsNull(block) && "Attached operation has null parent");
- return PyBlock{std::move(parentOperation), block};
+ assert(parentOperation && "Operation has no parent");
+ return PyBlock{std::move(*parentOperation), block};
}
py::object PyOperation::getCapsule() {
@@ -2121,8 +2122,11 @@ void mlir::python::populateIRCore(py::module &m) {
py::arg("loc") = py::none(), py::arg("ip") = py::none(),
kOperationCreateDocstring)
.def_property_readonly("parent",
- [](PyOperation &self) {
- return self.getParentOperation().getObject();
+ [](PyOperation &self) -> py::object {
+ auto parent = self.getParentOperation();
+ if (parent)
+ return parent->getObject();
+ return py::none();
})
.def("erase", &PyOperation::erase)
.def_property_readonly(MLIR_PYTHON_CAPI_PTR_ATTR,
diff --git a/mlir/lib/Bindings/Python/IRModule.h b/mlir/lib/Bindings/Python/IRModule.h
index 79c480e9446f5..9d217c872191d 100644
--- a/mlir/lib/Bindings/Python/IRModule.h
+++ b/mlir/lib/Bindings/Python/IRModule.h
@@ -18,6 +18,7 @@
#include "mlir-c/IR.h"
#include "mlir-c/IntegerSet.h"
#include "llvm/ADT/DenseMap.h"
+#include "llvm/ADT/Optional.h"
namespace mlir {
namespace python {
@@ -452,7 +453,7 @@ class PyOperation : public PyOperationBase, public BaseContextObject {
/// Gets the parent operation or raises an exception if the operation has
/// no parent.
- PyOperationRef getParentOperation();
+ llvm::Optional<PyOperationRef> getParentOperation();
/// Gets a capsule wrapping the void* within the MlirOperation.
pybind11::object getCapsule();
More information about the Mlir-commits
mailing list