use string/int/length lookup functions for bpy.types, gives 20-30% overall startup time speedup on my system.
This commit is contained in:
@@ -798,6 +798,42 @@ static void rna_BlenderRNA_structs_begin(CollectionPropertyIterator *iter, Point
|
|||||||
rna_iterator_listbase_begin(iter, &((BlenderRNA*)ptr->data)->structs, NULL);
|
rna_iterator_listbase_begin(iter, &((BlenderRNA*)ptr->data)->structs, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* optional, for faster lookups */
|
||||||
|
static int rna_BlenderRNA_structs_length(PointerRNA *ptr, int index)
|
||||||
|
{
|
||||||
|
return BLI_countlist(&((BlenderRNA*)ptr->data)->structs);
|
||||||
|
}
|
||||||
|
static PointerRNA rna_BlenderRNA_structs_lookup_int(PointerRNA *ptr, int index)
|
||||||
|
{
|
||||||
|
StructRNA *srna= BLI_findlink(&((BlenderRNA*)ptr->data)->structs, index);
|
||||||
|
|
||||||
|
if(srna) {
|
||||||
|
PointerRNA r_ptr;
|
||||||
|
RNA_pointer_create(NULL, &RNA_Struct, srna, &r_ptr);
|
||||||
|
return r_ptr;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return PointerRNA_NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
static PointerRNA rna_BlenderRNA_structs_lookup_string(PointerRNA *ptr, const char *key)
|
||||||
|
{
|
||||||
|
StructRNA *srna= ((BlenderRNA*)ptr->data)->structs.first;
|
||||||
|
for(; srna; srna=srna->cont.next)
|
||||||
|
if(key[0] == srna->identifier[0] && strcmp(key, srna->identifier)==0)
|
||||||
|
break;
|
||||||
|
|
||||||
|
if(srna) {
|
||||||
|
PointerRNA r_ptr;
|
||||||
|
RNA_pointer_create(NULL, &RNA_Struct, srna, &r_ptr);
|
||||||
|
return r_ptr;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return PointerRNA_NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
#else
|
#else
|
||||||
|
|
||||||
static void rna_def_struct(BlenderRNA *brna)
|
static void rna_def_struct(BlenderRNA *brna)
|
||||||
@@ -1238,7 +1274,14 @@ void RNA_def_rna(BlenderRNA *brna)
|
|||||||
prop= RNA_def_property(srna, "structs", PROP_COLLECTION, PROP_NONE);
|
prop= RNA_def_property(srna, "structs", PROP_COLLECTION, PROP_NONE);
|
||||||
RNA_def_property_clear_flag(prop, PROP_EDITABLE);
|
RNA_def_property_clear_flag(prop, PROP_EDITABLE);
|
||||||
RNA_def_property_struct_type(prop, "Struct");
|
RNA_def_property_struct_type(prop, "Struct");
|
||||||
RNA_def_property_collection_funcs(prop, "rna_BlenderRNA_structs_begin", "rna_iterator_listbase_next", "rna_iterator_listbase_end", "rna_iterator_listbase_get", 0, 0, 0);
|
RNA_def_property_collection_funcs(prop, "rna_BlenderRNA_structs_begin", "rna_iterator_listbase_next", "rna_iterator_listbase_end", "rna_iterator_listbase_get",
|
||||||
|
/* included for speed, can be removed */
|
||||||
|
#if 0
|
||||||
|
0,0,0);
|
||||||
|
#else
|
||||||
|
"rna_BlenderRNA_structs_length", "rna_BlenderRNA_structs_lookup_int", "rna_BlenderRNA_structs_lookup_string");
|
||||||
|
#endif
|
||||||
|
|
||||||
RNA_def_property_ui_text(prop, "Structs", "");
|
RNA_def_property_ui_text(prop, "Structs", "");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -3472,8 +3472,13 @@ static PyObject *pyrna_basetype_getattro( BPy_BaseTypeRNA *self, PyObject *pynam
|
|||||||
{
|
{
|
||||||
PointerRNA newptr;
|
PointerRNA newptr;
|
||||||
PyObject *ret;
|
PyObject *ret;
|
||||||
|
char *name= _PyUnicode_AsString(pyname);
|
||||||
|
|
||||||
if (RNA_property_collection_lookup_string(&self->ptr, self->prop, _PyUnicode_AsString(pyname), &newptr)) {
|
if(strcmp(name, "register")==0) {
|
||||||
|
/* this is called so often, make an exception and save a full lookup on all types */
|
||||||
|
ret= PyObject_GenericGetAttr((PyObject *)self, pyname);
|
||||||
|
}
|
||||||
|
else if (RNA_property_collection_lookup_string(&self->ptr, self->prop, name, &newptr)) {
|
||||||
ret= pyrna_struct_Subtype(&newptr);
|
ret= pyrna_struct_Subtype(&newptr);
|
||||||
if (ret==NULL) {
|
if (ret==NULL) {
|
||||||
PyErr_Format(PyExc_SystemError, "bpy.types.%.200s subtype could not be generated, this is a bug!", _PyUnicode_AsString(pyname));
|
PyErr_Format(PyExc_SystemError, "bpy.types.%.200s subtype could not be generated, this is a bug!", _PyUnicode_AsString(pyname));
|
||||||
|
|||||||
Reference in New Issue
Block a user