RNA: Limit which classes struct-map contains
authorCampbell Barton <ideasman42@gmail.com>
Thu, 31 Aug 2017 13:32:21 +0000 (23:32 +1000)
committerCampbell Barton <ideasman42@gmail.com>
Thu, 31 Aug 2017 13:49:50 +0000 (23:49 +1000)
Only add subclasses of: Menu, Panel, Header, UIList, Operator

This helps avoid unnecessary naming collisions,

See T52599 for details

14 files changed:
source/blender/makesrna/RNA_types.h
source/blender/makesrna/intern/rna_ID.c
source/blender/makesrna/intern/rna_access.c
source/blender/makesrna/intern/rna_animation.c
source/blender/makesrna/intern/rna_define.c
source/blender/makesrna/intern/rna_internal_types.h
source/blender/makesrna/intern/rna_nodetree.c
source/blender/makesrna/intern/rna_render.c
source/blender/makesrna/intern/rna_rna.c
source/blender/makesrna/intern/rna_ui.c
source/blender/makesrna/intern/rna_userdef.c
source/blender/makesrna/intern/rna_wm.c
source/blender/python/intern/bpy_operator_wrap.c
source/blender/python/intern/bpy_rna.c

index ecd7f3211bbc87f7a132d15762ce8b5174c0eade..e119c49401e17eda47b7e86f7b3cea82b18b55f9 100644 (file)
@@ -436,6 +436,8 @@ typedef enum StructFlag {
        STRUCT_NO_IDPROPERTIES = (1 << 6), /* Menus and Panels don't need properties */
        STRUCT_NO_DATABLOCK_IDPROPERTIES = (1 << 7), /* e.g. for Operator */
        STRUCT_CONTAINS_DATABLOCK_IDPROPERTIES = (1 << 8), /* for PropertyGroup which contains pointers to datablocks */
+       STRUCT_PUBLIC_NAMESPACE = (1 << 9), /* Added to type-map #BlenderRNA.structs_map */
+       STRUCT_PUBLIC_NAMESPACE_INHERIT = (1 << 10), /* All subtypes are added too. */
 } StructFlag;
 
 typedef int (*StructValidateFunc)(struct PointerRNA *ptr, void *data, int *have_function);
index 9d7dd7f424aa32ca3e823b30b71e67f2bf11d96c..a74758a4f71763df6c00c69932f0d8d35793a210 100644 (file)
@@ -273,10 +273,6 @@ StructRNA *rna_PropertyGroup_register(Main *UNUSED(bmain), ReportList *reports,
                return NULL;
        }
 
-       if (!RNA_struct_available_or_report(reports, identifier)) {
-               return NULL;
-       }
-
        return RNA_def_struct_ptr(&BLENDER_RNA, identifier, &RNA_PropertyGroup);  /* XXX */
 }
 
index 15b535625df0d833915f397f19da99e56a197636..6f2cfbdb6bd1a86a945671008b9d9ac75e80d952 100644 (file)
@@ -89,6 +89,7 @@ void RNA_init(void)
                                }
                        }
                }
+               BLI_assert(srna->flag & STRUCT_PUBLIC_NAMESPACE);
                BLI_ghash_insert(BLENDER_RNA.structs_map, (void *)srna->identifier, srna);
                BLENDER_RNA.structs_len += 1;
        }
@@ -814,6 +815,9 @@ char *RNA_struct_name_get_alloc(PointerRNA *ptr, char *fixedbuf, int fixedlen, i
        return NULL;
 }
 
+/**
+ * Use when registering structs with the #STRUCT_PUBLIC_NAMESPACE flag.
+ */
 bool RNA_struct_available_or_report(ReportList *reports, const char *identifier)
 {
        const StructRNA *srna_exists = RNA_struct_find(identifier);
index cc3c140c5c60d6ade74e5c0e9e43866836f9518c..d9f673acf895e55d9e44d7a88026d8ca0a4c015e 100644 (file)
@@ -273,9 +273,6 @@ static StructRNA *rna_KeyingSetInfo_register(Main *bmain, ReportList *reports, v
        if (ksi && ksi->ext.srna) {
                rna_KeyingSetInfo_unregister(bmain, ksi->ext.srna);
        }
-       if (!RNA_struct_available_or_report(reports, dummyksi.idname)) {
-               return NULL;
-       }
 
        /* create a new KeyingSetInfo type */
        ksi = MEM_callocN(sizeof(KeyingSetInfo), "python keying set info");
index cbe9684e8212066257feeeddc035f68869b05e6a..2a6a3d06b153ca011c945336680addfcc76ef38f 100644 (file)
@@ -142,7 +142,9 @@ static void rna_brna_structs_add(BlenderRNA *brna, StructRNA *srna)
 
        /* This exception is only needed for pre-processing.
         * otherwise we don't allow empty names. */
-       if (srna->identifier[0] != '\0') {
+       if ((srna->flag & STRUCT_PUBLIC_NAMESPACE) &&
+           (srna->identifier[0] != '\0'))
+       {
                BLI_ghash_insert(brna->structs_map, (void *)srna->identifier, srna);
        }
 }
@@ -150,7 +152,7 @@ static void rna_brna_structs_add(BlenderRNA *brna, StructRNA *srna)
 #ifdef RNA_RUNTIME
 static void rna_brna_structs_remove_and_free(BlenderRNA *brna, StructRNA *srna)
 {
-       if (brna->structs_map) {
+       if ((srna->flag & STRUCT_PUBLIC_NAMESPACE) && brna->structs_map) {
                if (srna->identifier[0] != '\0') {
                        BLI_ghash_remove(brna->structs_map, (void *)srna->identifier, NULL, NULL);
                }
@@ -763,12 +765,19 @@ StructRNA *RNA_def_struct_ptr(BlenderRNA *brna, const char *identifier, StructRN
                BLI_listbase_clear(&srna->functions);
                srna->py_type = NULL;
 
+               srna->base = srnafrom;
+
                if (DefRNA.preprocess) {
-                       srna->base = srnafrom;
                        dsfrom = rna_find_def_struct(srnafrom);
                }
-               else
-                       srna->base = srnafrom;
+               else {
+                       if (srnafrom->flag & STRUCT_PUBLIC_NAMESPACE_INHERIT) {
+                               srna->flag |= STRUCT_PUBLIC_NAMESPACE | STRUCT_PUBLIC_NAMESPACE_INHERIT;
+                       }
+                       else {
+                               srna->flag &= ~(STRUCT_PUBLIC_NAMESPACE | STRUCT_PUBLIC_NAMESPACE_INHERIT);
+                       }
+               }
        }
 
        srna->identifier = identifier;
@@ -780,6 +789,10 @@ StructRNA *RNA_def_struct_ptr(BlenderRNA *brna, const char *identifier, StructRN
        if (!srnafrom)
                srna->icon = ICON_DOT;
 
+       if (DefRNA.preprocess) {
+               srna->flag |= STRUCT_PUBLIC_NAMESPACE;
+       }
+
        rna_brna_structs_add(brna, srna);
 
        if (DefRNA.preprocess) {
@@ -1001,12 +1014,14 @@ void RNA_def_struct_identifier(BlenderRNA *brna, StructRNA *srna, const char *id
        }
 
        /* Operator registration may set twice, see: operator_properties_init */
-       if (identifier != srna->identifier) {
-               if (srna->identifier[0] != '\0') {
-                       BLI_ghash_remove(brna->structs_map, (void *)srna->identifier, NULL, NULL);
-               }
-               if (identifier[0] != '\0') {
-                       BLI_ghash_insert(brna->structs_map, (void *)identifier, srna);
+       if (srna->flag & STRUCT_PUBLIC_NAMESPACE) {
+               if (identifier != srna->identifier) {
+                       if (srna->identifier[0] != '\0') {
+                               BLI_ghash_remove(brna->structs_map, (void *)srna->identifier, NULL, NULL);
+                       }
+                       if (identifier[0] != '\0') {
+                               BLI_ghash_insert(brna->structs_map, (void *)identifier, srna);
+                       }
                }
        }
 
@@ -3316,8 +3331,10 @@ void RNA_enum_item_end(EnumPropertyItem **items, int *totitem)
 void RNA_def_struct_duplicate_pointers(BlenderRNA *brna, StructRNA *srna)
 {
        if (srna->identifier) {
-               srna->identifier = BLI_strdup(srna->identifier);
-               BLI_ghash_replace_key(brna->structs_map, (void *)srna->identifier);
+               if (srna->flag & STRUCT_PUBLIC_NAMESPACE) {
+                       srna->identifier = BLI_strdup(srna->identifier);
+                       BLI_ghash_replace_key(brna->structs_map, (void *)srna->identifier);
+               }
        }
        if (srna->name) {
                srna->name = BLI_strdup(srna->name);
@@ -3333,8 +3350,10 @@ void RNA_def_struct_free_pointers(BlenderRNA *brna, StructRNA *srna)
 {
        if (srna->flag & STRUCT_FREE_POINTERS) {
                if (srna->identifier) {
-                       if (brna != NULL) {
-                               BLI_ghash_remove(brna->structs_map, (void *)srna->identifier, NULL, NULL);
+                       if (srna->flag & STRUCT_PUBLIC_NAMESPACE) {
+                               if (brna != NULL) {
+                                       BLI_ghash_remove(brna->structs_map, (void *)srna->identifier, NULL, NULL);
+                               }
                        }
                        MEM_freeN((void *)srna->identifier);
                }
index b52f6c78f3a87d42e9d34d875dd9b79bedb55d1a..a470c807091b223f45d0724f86b44ec5fadcb3f5 100644 (file)
@@ -413,6 +413,8 @@ struct StructRNA {
 
 struct BlenderRNA {
        ListBase structs;
+       /* A map of structs: {StructRNA.identifier -> StructRNA}
+        * These are ensured to have unique names (with STRUCT_PUBLIC_NAMESPACE enabled). */
        struct GHash *structs_map;
        /* Needed because types with an empty identifier aren't included in 'structs_map'. */
        unsigned int  structs_len;
index 1c7d7816f0ff6d6db4cde94fc3b992c7f797969c..4de91a1c57c44f056eae7f9880108bbab0316ae2 100644 (file)
@@ -633,9 +633,6 @@ static StructRNA *rna_NodeTree_register(
        if (nt) {
                rna_NodeTree_unregister(bmain, nt->ext.srna);
        }
-       if (!RNA_struct_available_or_report(reports, dummynt.idname)) {
-               return NULL;
-       }
 
        /* create a new node tree type */
        nt = MEM_callocN(sizeof(bNodeTreeType), "node tree type");
@@ -1399,9 +1396,6 @@ static bNodeType *rna_Node_register_base(Main *bmain, ReportList *reports, Struc
        if (nt) {
                rna_Node_unregister(bmain, nt->ext.srna);
        }
-       if (!RNA_struct_available_or_report(reports, dummynt.idname)) {
-               return NULL;
-       }
        
        /* create a new node type */
        nt = MEM_callocN(sizeof(bNodeType), "node type");
index 360b8831f8c646197de17f5f059f7456b7cc4f68..a66c160ed1a3ebbb9491891db8098d45f6e5edb8 100644 (file)
@@ -321,9 +321,6 @@ static StructRNA *rna_RenderEngine_register(Main *bmain, ReportList *reports, vo
                        break;
                }
        }
-       if (!RNA_struct_available_or_report(reports, dummyet.idname)) {
-               return NULL;
-       }
        
        /* create a new engine type */
        et = MEM_callocN(sizeof(RenderEngineType), "python render engine");
index bbd0fe2486ea45394f0fd5c787e57fd497cfe119..b50ac7a61ef2f8a236207086f23e267c735da04b 100644 (file)
@@ -983,10 +983,18 @@ static int rna_Function_use_self_type_get(PointerRNA *ptr)
 
 /* Blender RNA */
 
+static int rna_struct_is_publc(CollectionPropertyIterator *UNUSED(iter), void *data)
+{
+       StructRNA *srna = data;
+
+       return !(srna->flag & STRUCT_PUBLIC_NAMESPACE);
+}
+
+
 static void rna_BlenderRNA_structs_begin(CollectionPropertyIterator *iter, PointerRNA *ptr)
 {
        BlenderRNA *brna = ptr->data;
-       rna_iterator_listbase_begin(iter, &brna->structs, NULL);
+       rna_iterator_listbase_begin(iter, &brna->structs, rna_struct_is_publc);
 }
 
 /* optional, for faster lookups */
index 84e446ef330a2d45d6c6715587e13c6001be2465..0e8f47e59ef24618b6ccb8d5cd636c4f159a129f 100644 (file)
@@ -949,6 +949,7 @@ static void rna_def_panel(BlenderRNA *brna)
        RNA_def_struct_refine_func(srna, "rna_Panel_refine");
        RNA_def_struct_register_funcs(srna, "rna_Panel_register", "rna_Panel_unregister", NULL);
        RNA_def_struct_translation_context(srna, BLT_I18NCONTEXT_DEFAULT_BPYRNA);
+       RNA_def_struct_flag(srna, STRUCT_PUBLIC_NAMESPACE_INHERIT);
 
        /* poll */
        func = RNA_def_function(srna, "poll", NULL);
@@ -1051,7 +1052,7 @@ static void rna_def_uilist(BlenderRNA *brna)
        RNA_def_struct_refine_func(srna, "rna_UIList_refine");
        RNA_def_struct_register_funcs(srna, "rna_UIList_register", "rna_UIList_unregister", NULL);
        RNA_def_struct_idprops_func(srna, "rna_UIList_idprops");
-       RNA_def_struct_flag(srna, STRUCT_NO_DATABLOCK_IDPROPERTIES);
+       RNA_def_struct_flag(srna, STRUCT_NO_DATABLOCK_IDPROPERTIES | STRUCT_PUBLIC_NAMESPACE_INHERIT);
 
        /* Registration */
        prop = RNA_def_property(srna, "bl_idname", PROP_STRING, PROP_NONE);
@@ -1173,6 +1174,7 @@ static void rna_def_header(BlenderRNA *brna)
        RNA_def_struct_sdna(srna, "Header");
        RNA_def_struct_refine_func(srna, "rna_Header_refine");
        RNA_def_struct_register_funcs(srna, "rna_Header_register", "rna_Header_unregister", NULL);
+       RNA_def_struct_flag(srna, STRUCT_PUBLIC_NAMESPACE_INHERIT);
 
        /* draw */
        func = RNA_def_function(srna, "draw", NULL);
@@ -1220,6 +1222,7 @@ static void rna_def_menu(BlenderRNA *brna)
        RNA_def_struct_refine_func(srna, "rna_Menu_refine");
        RNA_def_struct_register_funcs(srna, "rna_Menu_register", "rna_Menu_unregister", NULL);
        RNA_def_struct_translation_context(srna, BLT_I18NCONTEXT_DEFAULT_BPYRNA);
+       RNA_def_struct_flag(srna, STRUCT_PUBLIC_NAMESPACE_INHERIT);
 
        /* poll */
        func = RNA_def_function(srna, "poll", NULL);
index 3ecacd11a5c7713bbb1cf6c33d7f77479b9f040a..358d790e555ad14468664205d9f952102d190e11 100644 (file)
@@ -641,9 +641,6 @@ static StructRNA *rna_AddonPref_register(Main *bmain, ReportList *reports, void
        if (apt && apt->ext.srna) {
                rna_AddonPref_unregister(bmain, apt->ext.srna);
        }
-       if (!RNA_struct_available_or_report(reports, identifier)) {
-               return NULL;
-       }
 
        /* create a new header type */
        apt = MEM_mallocN(sizeof(bAddonPrefType), "addonpreftype");
index cb6aebddfba71b6ba7a7bdb54ed01f2df1fdd777..678d3dd2f084f4d8244125f59c561290d59266d5 100644 (file)
@@ -1546,7 +1546,7 @@ static void rna_def_operator(BlenderRNA *brna)
        RNA_def_struct_ui_text(srna, "Operator Properties", "Input properties of an Operator");
        RNA_def_struct_refine_func(srna, "rna_OperatorProperties_refine");
        RNA_def_struct_idprops_func(srna, "rna_OperatorProperties_idprops");
-       RNA_def_struct_flag(srna, STRUCT_NO_DATABLOCK_IDPROPERTIES);
+       RNA_def_struct_flag(srna, STRUCT_NO_DATABLOCK_IDPROPERTIES | STRUCT_PUBLIC_NAMESPACE_INHERIT);
 }
 
 static void rna_def_macro_operator(BlenderRNA *brna)
index 9d57adca94659f5129e99a9560c3e0ea89fe72dd..3afde45195c4231dfa10944e0b13b1c47fa258be 100644 (file)
@@ -53,7 +53,7 @@ static void operator_properties_init(wmOperatorType *ot)
         *
         * Note the 'no_struct_map' function is used since the actual struct name is already used by the operator.
         */
-       RNA_def_struct_identifier_no_struct_map(ot->srna, ot->idname);
+       RNA_def_struct_identifier(&BLENDER_RNA, ot->srna, ot->idname);
 
        if (pyrna_deferred_register_class(ot->srna, py_class) != 0) {
                PyErr_Print(); /* failed to register operator props */
index afc082db3d5d498cd00186aba97ff406bb612de3..dfd643319e55e246216f71ebe4cc2b7d8ca189a8 100644 (file)
@@ -6927,15 +6927,7 @@ static PyObject *pyrna_basetype_dir(BPy_BaseTypeRNA *self)
        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 */
-                       PyList_APPEND(ret, PyUnicode_FromString(RNA_struct_identifier(srna)));
-               }
+               PyList_APPEND(ret, PyUnicode_FromString(RNA_struct_identifier(srna)));
        }
        RNA_PROP_END;