[Bf-blender-cvs] [75d0287cee1] blender-v2.83-release: PyAPI: support PyGetSetDef when extending RNA types

Campbell Barton noreply at git.blender.org
Wed May 13 08:05:50 CEST 2020


Commit: 75d0287cee1aae1a94e46d3fb90379ce016eda8c
Author: Campbell Barton
Date:   Wed May 13 15:57:29 2020 +1000
Branches: blender-v2.83-release
https://developer.blender.org/rB75d0287cee1aae1a94e46d3fb90379ce016eda8c

PyAPI: support PyGetSetDef when extending RNA types

Support extending properties as well as methods.

===================================================================

M	source/blender/python/intern/bpy_rna.c
M	source/blender/python/intern/bpy_rna.h
M	source/blender/python/intern/bpy_rna_types_capi.c

===================================================================

diff --git a/source/blender/python/intern/bpy_rna.c b/source/blender/python/intern/bpy_rna.c
index 4da81e3380f..55bf87051ec 100644
--- a/source/blender/python/intern/bpy_rna.c
+++ b/source/blender/python/intern/bpy_rna.c
@@ -9034,9 +9034,11 @@ static PyObject *pyrna_unregister_class(PyObject *UNUSED(self), PyObject *py_cla
 }
 
 /**
- * Extend RNA types with C/API methods.
+ * Extend RNA types with C/API methods, properties.
  */
-void pyrna_struct_type_extend_capi(struct StructRNA *srna, struct PyMethodDef *method)
+void pyrna_struct_type_extend_capi(struct StructRNA *srna,
+                                   struct PyMethodDef *method,
+                                   struct PyGetSetDef *getset)
 {
   PyObject *cls = pyrna_srna_Subtype(srna);
   if (method != NULL) {
@@ -9052,6 +9054,16 @@ void pyrna_struct_type_extend_capi(struct StructRNA *srna, struct PyMethodDef *m
       Py_DECREF(args); /* Clears 'func' too. */
     }
   }
+
+  if (getset != NULL) {
+    for (; getset->name != NULL; getset++) {
+      PyObject *dict = ((PyTypeObject *)cls)->tp_dict;
+      PyObject *descr = PyDescr_NewGetSet((PyTypeObject *)cls, getset);
+      BLI_assert(PyDict_GetItem(dict, PyDescr_NAME(descr)) == NULL);
+      PyDict_SetItem(dict, PyDescr_NAME(descr), descr);
+      Py_DECREF(descr);
+    }
+  }
   Py_DECREF(cls);
 }
 
diff --git a/source/blender/python/intern/bpy_rna.h b/source/blender/python/intern/bpy_rna.h
index 3f73ea20205..652d65fe64c 100644
--- a/source/blender/python/intern/bpy_rna.h
+++ b/source/blender/python/intern/bpy_rna.h
@@ -220,7 +220,9 @@ int pyrna_enum_value_from_id(const EnumPropertyItem *item,
 
 int pyrna_deferred_register_class(struct StructRNA *srna, PyTypeObject *py_class);
 
-void pyrna_struct_type_extend_capi(struct StructRNA *srna, struct PyMethodDef *py_method);
+void pyrna_struct_type_extend_capi(struct StructRNA *srna,
+                                   struct PyMethodDef *py_method,
+                                   struct PyGetSetDef *py_getset);
 
 /* called before stopping python */
 void pyrna_alloc_types(void);
diff --git a/source/blender/python/intern/bpy_rna_types_capi.c b/source/blender/python/intern/bpy_rna_types_capi.c
index 1b4533224b8..00442295e0b 100644
--- a/source/blender/python/intern/bpy_rna_types_capi.c
+++ b/source/blender/python/intern/bpy_rna_types_capi.c
@@ -121,9 +121,8 @@ static struct PyMethodDef pyrna_space_methods[] = {
 
 void BPY_rna_types_extend_capi(void)
 {
-  pyrna_struct_type_extend_capi(&RNA_Space, pyrna_space_methods);
-  pyrna_struct_type_extend_capi(
-      &RNA_WindowManager, pyrna_windowmanager_methods);
+  pyrna_struct_type_extend_capi(&RNA_Space, pyrna_space_methods, NULL);
+  pyrna_struct_type_extend_capi(&RNA_WindowManager, pyrna_windowmanager_methods, NULL);
 }
 
 /** \} */



More information about the Bf-blender-cvs mailing list