forked from bartvdbraak/blender
py-api: store frequently used strings as unicode PyObject's to avoid creating/distroying every time.
also fix for cmake warning
This commit is contained in:
parent
f7e22c729e
commit
82216030e9
@ -37,7 +37,7 @@ macro(blender_source_group
|
||||
|
||||
foreach(_SRC ${sources})
|
||||
get_filename_component(_SRC_EXT ${_SRC} EXT)
|
||||
if(${_SRC_EXT} MATCHES ".h" OR ${_SRC_EXT} MATCHES ".hpp")
|
||||
if((${_SRC_EXT} MATCHES ".h") OR (${_SRC_EXT} MATCHES ".hpp"))
|
||||
source_group("Header Files" FILES ${_SRC})
|
||||
else()
|
||||
source_group("Source Files" FILES ${_SRC})
|
||||
|
@ -45,6 +45,7 @@ set(SRC
|
||||
bpy_app.c
|
||||
bpy_driver.c
|
||||
bpy_interface.c
|
||||
bpy_intern_string.c
|
||||
bpy_library.c
|
||||
bpy_operator.c
|
||||
bpy_operator_wrap.c
|
||||
@ -60,6 +61,7 @@ set(SRC
|
||||
bpy.h
|
||||
bpy_app.h
|
||||
bpy_driver.h
|
||||
bpy_intern_string.h
|
||||
bpy_operator.h
|
||||
bpy_operator_wrap.h
|
||||
bpy_props.h
|
||||
|
@ -43,6 +43,7 @@
|
||||
#include "bpy_rna.h"
|
||||
#include "bpy_util.h"
|
||||
#include "bpy_traceback.h"
|
||||
#include "bpy_intern_string.h"
|
||||
|
||||
#include "DNA_space_types.h"
|
||||
#include "DNA_text_types.h"
|
||||
@ -205,7 +206,9 @@ void BPY_python_start(int argc, const char **argv)
|
||||
Py_NoSiteFlag= 1;
|
||||
|
||||
Py_Initialize();
|
||||
|
||||
|
||||
bpy_intern_string_init();
|
||||
|
||||
// PySys_SetArgv(argc, argv); // broken in py3, not a huge deal
|
||||
/* sigh, why do python guys not have a char** version anymore? :( */
|
||||
{
|
||||
@ -251,7 +254,9 @@ void BPY_python_end(void)
|
||||
pyrna_free_types();
|
||||
|
||||
/* clear all python data from structs */
|
||||
|
||||
|
||||
bpy_intern_string_exit();
|
||||
|
||||
Py_Finalize();
|
||||
|
||||
#ifdef TIME_PY_RUN
|
||||
|
57
source/blender/python/intern/bpy_intern_string.c
Normal file
57
source/blender/python/intern/bpy_intern_string.c
Normal file
@ -0,0 +1,57 @@
|
||||
/*
|
||||
* $Id:
|
||||
*
|
||||
* ***** BEGIN GPL LICENSE BLOCK *****
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation; either version 2
|
||||
* of the License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
*
|
||||
* Contributor(s): Campbell Barton
|
||||
*
|
||||
* ***** END GPL LICENSE BLOCK *****
|
||||
*/
|
||||
|
||||
/** \file blender/python/intern/bpy_intern_string.c
|
||||
* \ingroup pythonintern
|
||||
*/
|
||||
|
||||
#include <Python.h>
|
||||
|
||||
PyObject *bpy_intern_str_register;
|
||||
PyObject *bpy_intern_str_unregister;
|
||||
PyObject *bpy_intern_str_bl_rna;
|
||||
PyObject *bpy_intern_str_order;
|
||||
PyObject *bpy_intern_str_attr;
|
||||
PyObject *bpy_intern_str___slots__;
|
||||
PyObject *bpy_intern_str___bases__;
|
||||
|
||||
void bpy_intern_string_init(void)
|
||||
{
|
||||
bpy_intern_str_register= PyUnicode_FromString("register");
|
||||
bpy_intern_str_unregister= PyUnicode_FromString("unregister");;
|
||||
bpy_intern_str_bl_rna= PyUnicode_FromString("bl_rna");
|
||||
bpy_intern_str_order= PyUnicode_FromString("order");
|
||||
bpy_intern_str_attr= PyUnicode_FromString("attr");
|
||||
bpy_intern_str___slots__= PyUnicode_FromString("__slots__");
|
||||
}
|
||||
|
||||
void bpy_intern_string_exit(void)
|
||||
{
|
||||
Py_DECREF(bpy_intern_str_register);
|
||||
Py_DECREF(bpy_intern_str_unregister);
|
||||
Py_DECREF(bpy_intern_str_bl_rna);
|
||||
Py_DECREF(bpy_intern_str_order);
|
||||
Py_DECREF(bpy_intern_str_attr);
|
||||
Py_DECREF(bpy_intern_str___slots__);
|
||||
}
|
37
source/blender/python/intern/bpy_intern_string.h
Normal file
37
source/blender/python/intern/bpy_intern_string.h
Normal file
@ -0,0 +1,37 @@
|
||||
/*
|
||||
* $Id:
|
||||
*
|
||||
* ***** BEGIN GPL LICENSE BLOCK *****
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation; either version 2
|
||||
* of the License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software Foundation,
|
||||
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
*
|
||||
* Contributor(s): Campbell Barton
|
||||
*
|
||||
* ***** END GPL LICENSE BLOCK *****
|
||||
*/
|
||||
|
||||
/** \file blender/python/intern/bpy_intern_string.h
|
||||
* \ingroup pythonintern
|
||||
*/
|
||||
|
||||
void bpy_intern_string_init(void);
|
||||
void bpy_intern_string_exit(void);
|
||||
|
||||
extern PyObject *bpy_intern_str_register;
|
||||
extern PyObject *bpy_intern_str_unregister;
|
||||
extern PyObject *bpy_intern_str_bl_rna;
|
||||
extern PyObject *bpy_intern_str_order;
|
||||
extern PyObject *bpy_intern_str_attr;
|
||||
extern PyObject *bpy_intern_str___slots__;
|
@ -39,6 +39,7 @@
|
||||
#include "bpy_props.h"
|
||||
#include "bpy_util.h"
|
||||
#include "bpy_rna_callback.h"
|
||||
#include "bpy_intern_string.h"
|
||||
|
||||
#ifdef USE_PYRNA_INVALIDATE_WEAKREF
|
||||
#include "MEM_guardedalloc.h"
|
||||
@ -5217,7 +5218,7 @@ static void pyrna_subtype_set_rna(PyObject *newclass, StructRNA *srna)
|
||||
item= pyrna_struct_CreatePyObject(&ptr);
|
||||
|
||||
/* note, must set the class not the __dict__ else the internal slots are not updated correctly */
|
||||
PyObject_SetAttrString(newclass, "bl_rna", item);
|
||||
PyObject_SetAttr(newclass, bpy_intern_str_bl_rna, item);
|
||||
Py_DECREF(item);
|
||||
|
||||
/* done with rna instance */
|
||||
@ -5279,7 +5280,7 @@ static PyObject* pyrna_srna_ExternalType(StructRNA *srna)
|
||||
//PyObject *slots= PyObject_GetAttrString(newclass, "__slots__"); // cant do this because it gets superclasses values!
|
||||
//PyObject *bases= PyObject_GetAttrString(newclass, "__bases__"); // can do this but faster not to.
|
||||
PyObject *bases= ((PyTypeObject *)newclass)->tp_bases;
|
||||
PyObject *slots= PyDict_GetItemString(((PyTypeObject *)newclass)->tp_dict, "__slots__");
|
||||
PyObject *slots= PyDict_GetItem(((PyTypeObject *)newclass)->tp_dict, bpy_intern_str___slots__);
|
||||
|
||||
if(slots==NULL) {
|
||||
fprintf(stderr, "pyrna_srna_ExternalType: expected class '%s' to have __slots__ defined\n\nSee bpy_types.py\n", idname);
|
||||
@ -5649,7 +5650,7 @@ StructRNA *pyrna_struct_as_srna(PyObject *self, int parent, const char *error_pr
|
||||
|
||||
/* ack, PyObject_GetAttrString wont look up this types tp_dict first :/ */
|
||||
if(PyType_Check(self)) {
|
||||
py_srna= (BPy_StructRNA *)PyDict_GetItemString(((PyTypeObject *)self)->tp_dict, "bl_rna");
|
||||
py_srna= (BPy_StructRNA *)PyDict_GetItem(((PyTypeObject *)self)->tp_dict, bpy_intern_str_bl_rna);
|
||||
Py_XINCREF(py_srna);
|
||||
}
|
||||
|
||||
@ -5657,7 +5658,7 @@ StructRNA *pyrna_struct_as_srna(PyObject *self, int parent, const char *error_pr
|
||||
/* be very careful with this since it will return a parent classes srna.
|
||||
* modifying this will do confusing stuff! */
|
||||
if(py_srna==NULL)
|
||||
py_srna= (BPy_StructRNA*)PyObject_GetAttrString(self, "bl_rna");
|
||||
py_srna= (BPy_StructRNA*)PyObject_GetAttr(self, bpy_intern_str_bl_rna);
|
||||
}
|
||||
|
||||
if(py_srna==NULL) {
|
||||
@ -5747,7 +5748,7 @@ static int deferred_register_prop(StructRNA *srna, PyObject *key, PyObject *item
|
||||
py_srna_cobject= PyCapsule_New(srna, NULL, NULL);
|
||||
|
||||
/* not 100% nice :/, modifies the dict passed, should be ok */
|
||||
PyDict_SetItemString(py_kw, "attr", key);
|
||||
PyDict_SetItem(py_kw, bpy_intern_str_attr, key);
|
||||
|
||||
args_fake= PyTuple_New(1);
|
||||
PyTuple_SET_ITEM(args_fake, 0, py_srna_cobject);
|
||||
@ -5794,7 +5795,7 @@ static int pyrna_deferred_register_props(StructRNA *srna, PyObject *class_dict)
|
||||
/* in both cases PyDict_CheckExact(class_dict) will be true even
|
||||
* though Operators have a metaclass dict namespace */
|
||||
|
||||
if((order= PyDict_GetItemString(class_dict, "order")) && PyList_CheckExact(order)) {
|
||||
if((order= PyDict_GetItem(class_dict, bpy_intern_str_order)) && PyList_CheckExact(order)) {
|
||||
for(pos= 0; pos<PyList_GET_SIZE(order); pos++) {
|
||||
key= PyList_GET_ITEM(order, pos);
|
||||
item= PyDict_GetItem(class_dict, key);
|
||||
@ -6299,7 +6300,7 @@ static void bpy_class_free(void *pyob_ptr)
|
||||
// PyDict_Clear(((PyTypeObject*)self)->tp_dict);
|
||||
//
|
||||
// remove the rna attribute instead.
|
||||
PyDict_DelItemString(((PyTypeObject *)self)->tp_dict, "bl_rna");
|
||||
PyDict_DelItem(((PyTypeObject *)self)->tp_dict, bpy_intern_str_bl_rna);
|
||||
if(PyErr_Occurred())
|
||||
PyErr_Clear();
|
||||
|
||||
@ -6405,7 +6406,7 @@ static PyObject *pyrna_register_class(PyObject *UNUSED(self), PyObject *py_class
|
||||
const char *identifier;
|
||||
PyObject *py_cls_meth;
|
||||
|
||||
if(PyDict_GetItemString(((PyTypeObject*)py_class)->tp_dict, "bl_rna")) {
|
||||
if(PyDict_GetItem(((PyTypeObject*)py_class)->tp_dict, bpy_intern_str_bl_rna)) {
|
||||
PyErr_SetString(PyExc_AttributeError, "register_class(...): already registered as a subclass");
|
||||
return NULL;
|
||||
}
|
||||
@ -6470,7 +6471,7 @@ static PyObject *pyrna_register_class(PyObject *UNUSED(self), PyObject *py_class
|
||||
return NULL;
|
||||
|
||||
/* call classed register method () */
|
||||
py_cls_meth= PyObject_GetAttrString(py_class, "register");
|
||||
py_cls_meth= PyObject_GetAttr(py_class, bpy_intern_str_register);
|
||||
if(py_cls_meth == NULL) {
|
||||
PyErr_Clear();
|
||||
}
|
||||
@ -6528,7 +6529,7 @@ static PyObject *pyrna_unregister_class(PyObject *UNUSED(self), PyObject *py_cla
|
||||
StructRNA *srna;
|
||||
PyObject *py_cls_meth;
|
||||
|
||||
/*if(PyDict_GetItemString(((PyTypeObject*)py_class)->tp_dict, "bl_rna")==NULL) {
|
||||
/*if(PyDict_GetItem(((PyTypeObject*)py_class)->tp_dict, bpy_intern_str_bl_rna)==NULL) {
|
||||
PWM_cursor_wait(0);
|
||||
PyErr_SetString(PyExc_ValueError, "unregister_class(): not a registered as a subclass");
|
||||
return NULL;
|
||||
@ -6547,7 +6548,7 @@ static PyObject *pyrna_unregister_class(PyObject *UNUSED(self), PyObject *py_cla
|
||||
}
|
||||
|
||||
/* call classed unregister method */
|
||||
py_cls_meth= PyObject_GetAttrString(py_class, "unregister");
|
||||
py_cls_meth= PyObject_GetAttr(py_class, bpy_intern_str_unregister);
|
||||
if(py_cls_meth == NULL) {
|
||||
PyErr_Clear();
|
||||
}
|
||||
@ -6597,7 +6598,7 @@ static PyObject *pyrna_unregister_class(PyObject *UNUSED(self), PyObject *py_cla
|
||||
/* call unregister */
|
||||
unreg(CTX_data_main(C), srna); /* calls bpy_class_free, this decref's py_class */
|
||||
|
||||
PyDict_DelItemString(((PyTypeObject *)py_class)->tp_dict, "bl_rna");
|
||||
PyDict_DelItem(((PyTypeObject *)py_class)->tp_dict, bpy_intern_str_bl_rna);
|
||||
if(PyErr_Occurred())
|
||||
PyErr_Clear(); //return NULL;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user