From ddacff06f287a849b88b498d5efcab90253e49c3 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Sat, 27 Feb 2010 14:44:46 +0000 Subject: hold the python operator instance in the operator, otherwise the handelers need to be stored in the operator type or in the module which isnt nice for modal operators. --- source/blender/python/intern/bpy_rna.c | 41 ++++++++++++++++++++++++++++------ 1 file changed, 34 insertions(+), 7 deletions(-) (limited to 'source/blender/python') diff --git a/source/blender/python/intern/bpy_rna.c b/source/blender/python/intern/bpy_rna.c index a5ada5f4218..6f36a7e12e2 100644 --- a/source/blender/python/intern/bpy_rna.c +++ b/source/blender/python/intern/bpy_rna.c @@ -4149,7 +4149,8 @@ extern void BPY_update_modules( void ); //XXX temp solution static int bpy_class_call(PointerRNA *ptr, FunctionRNA *func, ParameterList *parms) { PyObject *args; - PyObject *ret= NULL, *py_class, *py_class_instance, *item, *parmitem; + PyObject *ret= NULL, *py_srna= NULL, *py_class, *py_class_instance= NULL, *parmitem; + void **py_class_instance_store= NULL; PropertyRNA *parm; ParameterIterator iter; PointerRNA funcptr; @@ -4165,23 +4166,49 @@ static int bpy_class_call(PointerRNA *ptr, FunctionRNA *func, ParameterList *par py_class= RNA_struct_py_type_get(ptr->type); - item = pyrna_struct_CreatePyObject(ptr); - if(item == NULL) { + /* exception, operators store their PyObjects for re-use */ + if(ptr->data) { + if(RNA_struct_is_a(ptr->type, &RNA_Operator)) { + wmOperator *op= ptr->data; + if(op->py_instance) { + py_class_instance= op->py_instance; + Py_INCREF(py_class_instance); + } + else { + /* store the instance here once its created */ + py_class_instance_store= &op->py_instance; + } + } + } + /* end exception */ + + if(py_class_instance==NULL) + py_srna= pyrna_struct_CreatePyObject(ptr); + + if(py_class_instance) { + /* special case, instance is cached */ + } + else if(py_srna == NULL) { py_class_instance = NULL; } - else if(item == Py_None) { /* probably wont ever happen but possible */ - Py_DECREF(item); + else if(py_srna == Py_None) { /* probably wont ever happen but possible */ + Py_DECREF(py_srna); py_class_instance = NULL; } else { args = PyTuple_New(1); - PyTuple_SET_ITEM(args, 0, item); + PyTuple_SET_ITEM(args, 0, py_srna); py_class_instance = PyObject_Call(py_class, args, NULL); Py_DECREF(args); + + if(py_class_instance_store) { + *py_class_instance_store = py_class_instance; + Py_INCREF(py_class_instance); + } } if (py_class_instance) { /* Initializing the class worked, now run its invoke function */ - item= PyObject_GetAttrString(py_class, RNA_function_identifier(func)); + PyObject *item= PyObject_GetAttrString(py_class, RNA_function_identifier(func)); // flag= RNA_function_flag(func); if(item) { -- cgit v1.2.3