fix [#29666] Duplicate entries in bpy.types
authorCampbell Barton <ideasman42@gmail.com>
Thu, 2 Feb 2012 04:43:35 +0000 (04:43 +0000)
committerCampbell Barton <ideasman42@gmail.com>
Thu, 2 Feb 2012 04:43:35 +0000 (04:43 +0000)
Python operator subclasses and operator types each get their own SRNA, causing double ups for bpy.types.__dir__()

From the operator type - these share names.
* ot->ext.srna
* ot->srna

Note that this conflict is still there, this only disables 'ot->ext.srna' from being included in dir(bpy.types).

source/blender/makesrna/intern/rna_wm.c
source/blender/python/intern/bpy_rna.c

index 52a4a1db36b054951bd309e23e10801bcfc573b7..b5c24ec568e430a6726fda6a84a39ab1c8591ec9 100644 (file)
@@ -1050,6 +1050,9 @@ static StructRNA *rna_Operator_register(Main *bmain, ReportList *reports, void *
                        rna_Operator_unregister(bmain, ot->ext.srna);
        }
 
+       /* XXX, this doubles up with the operator name [#29666]
+        * for now just remove from dir(bpy.types) */
+
        /* create a new operator type */
        dummyot.ext.srna= RNA_def_struct(&BLENDER_RNA, dummyot.idname, "Operator");
        RNA_def_struct_flag(dummyot.ext.srna, STRUCT_NO_IDPROPERTIES); /* operator properties are registered separately */
@@ -1126,7 +1129,10 @@ static StructRNA *rna_MacroOperator_register(Main *bmain, ReportList *reports, v
                        rna_Operator_unregister(bmain, ot->ext.srna);
        }
 
-       /* create a new menu type */
+       /* XXX, this doubles up with the operator name [#29666]
+        * for now just remove from dir(bpy.types) */
+
+       /* create a new operator type */
        dummyot.ext.srna= RNA_def_struct(&BLENDER_RNA, dummyot.idname, "Operator");
        dummyot.ext.data= data;
        dummyot.ext.call= call;
index bfb79ea6531f4151661beb8e744306bdb368910e..11e79fdee2a7e401045f2b9140cc6efaaa69ce98 100644 (file)
@@ -6298,6 +6298,8 @@ static struct PyMethodDef pyrna_basetype_methods[] = {
        {NULL, NULL, 0, NULL}
 };
 
+/* used to call ..._keys() direct, but we need to filter out operator subclasses */
+#if 0
 static PyObject *pyrna_basetype_dir(BPy_BaseTypeRNA *self)
 {
        PyObject *list;
@@ -6318,6 +6320,34 @@ static PyObject *pyrna_basetype_dir(BPy_BaseTypeRNA *self)
        return list;
 }
 
+#else
+
+static PyObject *pyrna_basetype_dir(BPy_BaseTypeRNA *self)
+{
+       PyObject *ret = PyList_New(0);
+       PyObject *item;
+
+       RNA_PROP_BEGIN(&self->ptr, itemptr, self->prop) {
+               StructRNA *srna = itemptr.data;
+               StructRNA *srna_base = RNA_struct_base(itemptr.data);
+               /* skip own operators, these double up [#29666] */
+               if (srna_base == &RNA_Operator) {
+                       /* do nothing */
+               }
+               else {
+                       /* add to python list */
+                       item = PyUnicode_FromString(RNA_struct_identifier(srna));
+                       PyList_Append(ret, item);
+                       Py_DECREF(item);
+               }
+       }
+       RNA_PROP_END;
+
+       return ret;
+}
+
+#endif
+
 static PyTypeObject pyrna_basetype_Type = BLANK_PYTHON_TYPE;
 
 PyObject *BPY_rna_types(void)