[Mlir-commits] [mlir] 7b1ceee - Revert "[mlir] fix crash in PybindAdaptors.h"

Alex Zinenko llvmlistbot at llvm.org
Tue Jan 18 08:05:50 PST 2022


Author: Alex Zinenko
Date: 2022-01-18T17:05:44+01:00
New Revision: 7b1ceee63ea6c0c97d6428ef4ef26deccfcef224

URL: https://github.com/llvm/llvm-project/commit/7b1ceee63ea6c0c97d6428ef4ef26deccfcef224
DIFF: https://github.com/llvm/llvm-project/commit/7b1ceee63ea6c0c97d6428ef4ef26deccfcef224.diff

LOG: Revert "[mlir] fix crash in PybindAdaptors.h"

This reverts commit 289021a45decdef8ed61d054b9c90ce775ca9c96.

Added: 
    

Modified: 
    mlir/include/mlir/Bindings/Python/PybindAdaptors.h

Removed: 
    


################################################################################
diff  --git a/mlir/include/mlir/Bindings/Python/PybindAdaptors.h b/mlir/include/mlir/Bindings/Python/PybindAdaptors.h
index becbf01806f44..0340e9cc4b87f 100644
--- a/mlir/include/mlir/Bindings/Python/PybindAdaptors.h
+++ b/mlir/include/mlir/Bindings/Python/PybindAdaptors.h
@@ -291,29 +291,6 @@ class pure_subclass {
   py::object get_class() const { return thisClass; }
 
 protected:
-  /// Defers to the constructor of the superClass the configuration of the
-  /// pybind11 object from the given arguments. Pybind11 has a special handling
-  /// for constructors such that they don't accept a "self" reference, unlike
-  /// Python "__init__" calls. Therefore, one cannot just call the "__init__" of
-  /// the parent class, which would require access to "self". Instead, create an
-  /// instance of the superclass and take its instance pointer to the base C++
-  /// object to populate the instance pointer of the constructed object. Since
-  /// we only deal with _pure_ subclasses, this should be sufficient as derived
-  /// classes cannot have more data fields.
-  template <typename... Args>
-  static void deferToSuperclassConstructor(py::detail::value_and_holder &vh,
-                                           py::object superClass,
-                                           Args &&...args) {
-    py::object super = superClass(std::forward<Args>(args)...);
-    py::detail::type_info *ti =
-        py::detail::get_type_info((PyTypeObject *)superClass.ptr());
-    auto *instance = reinterpret_cast<py::detail::instance *>(super.ptr());
-
-    // Take ownership of the value pointer from the base class.
-    vh.value_ptr() = instance->get_value_and_holder(ti, true).value_ptr();
-    super.release();
-  }
-
   py::object superClass;
   py::object thisClass;
 };
@@ -343,16 +320,12 @@ class mlir_attribute_subclass : public pure_subclass {
     // Casting constructor. Note that defining an __init__ method is special
     // and not yet generalized on pure_subclass (it requires a somewhat
     // 
diff erent cpp_function and other requirements on chaining to super
-    // __init__ make it more awkward to do generally). It is marked as
-    // `is_new_style_constructor` to suppress the deprecation warning from
-    // pybind11 related to placement-new since we are not doing any allocation
-    // here but relying on the superclass constructor that does "new-style"
-    // allocation for pybind11.
+    // __init__ make it more awkward to do generally).
     std::string captureTypeName(
         typeClassName); // As string in case if typeClassName is not static.
     py::cpp_function initCf(
-        [superClass, isaFunction, captureTypeName](
-            py::detail::value_and_holder &vh, py::object otherType) {
+        [superClass, isaFunction, captureTypeName](py::object self,
+                                                   py::object otherType) {
           MlirAttribute rawAttribute = py::cast<MlirAttribute>(otherType);
           if (!isaFunction(rawAttribute)) {
             auto origRepr = py::repr(otherType).cast<std::string>();
@@ -361,12 +334,9 @@ class mlir_attribute_subclass : public pure_subclass {
                  " (from " + origRepr + ")")
                     .str());
           }
-          pure_subclass::deferToSuperclassConstructor(vh, superClass,
-                                                      otherType);
+          superClass.attr("__init__")(self, otherType);
         },
-        py::name("__init__"), py::arg("cast_from_type"),
-        py::is_method(scope.attr(typeClassName)),
-        py::detail::is_new_style_constructor(),
+        py::arg("cast_from_type"), py::is_method(py::none()),
         "Casts the passed type to this specific sub-type.");
     thisClass.attr("__init__") = initCf;
 
@@ -401,16 +371,12 @@ class mlir_type_subclass : public pure_subclass {
     // Casting constructor. Note that defining an __init__ method is special
     // and not yet generalized on pure_subclass (it requires a somewhat
     // 
diff erent cpp_function and other requirements on chaining to super
-    // __init__ make it more awkward to do generally). It is marked as
-    // `is_new_style_constructor` to suppress the deprecation warning from
-    // pybind11 related to placement-new since we are not doing any allocation
-    // here but relying on the superclass constructor that does "new-style"
-    // allocation for pybind11.
+    // __init__ make it more awkward to do generally).
     std::string captureTypeName(
         typeClassName); // As string in case if typeClassName is not static.
     py::cpp_function initCf(
-        [superClass, isaFunction, captureTypeName](
-            py::detail::value_and_holder &vh, py::object otherType) {
+        [superClass, isaFunction, captureTypeName](py::object self,
+                                                   py::object otherType) {
           MlirType rawType = py::cast<MlirType>(otherType);
           if (!isaFunction(rawType)) {
             auto origRepr = py::repr(otherType).cast<std::string>();
@@ -419,12 +385,9 @@ class mlir_type_subclass : public pure_subclass {
                                          origRepr + ")")
                                             .str());
           }
-          pure_subclass::deferToSuperclassConstructor(vh, superClass,
-                                                      otherType);
+          superClass.attr("__init__")(self, otherType);
         },
-        py::name("__init__"), py::arg("cast_from_type"),
-        py::is_method(scope.attr(typeClassName)),
-        py::detail::is_new_style_constructor(),
+        py::arg("cast_from_type"), py::is_method(py::none()),
         "Casts the passed type to this specific sub-type.");
     thisClass.attr("__init__") = initCf;
 


        


More information about the Mlir-commits mailing list