diff options
-rw-r--r-- | release/scripts/io/engine_render_pov.py | 1 | ||||
-rw-r--r-- | release/scripts/modules/bpy_types.py | 16 | ||||
-rw-r--r-- | source/blender/python/intern/bpy_rna.c | 20 |
3 files changed, 22 insertions, 15 deletions
diff --git a/release/scripts/io/engine_render_pov.py b/release/scripts/io/engine_render_pov.py index ddca6eb43dc..9157136475b 100644 --- a/release/scripts/io/engine_render_pov.py +++ b/release/scripts/io/engine_render_pov.py @@ -757,6 +757,7 @@ class PovrayRender(bpy.types.RenderEngine): pov_binary = winreg.QueryValueEx(regKey, 'Home')[0] + '\\bin\\pvengine' if 1: + # TODO, when povray isnt found this gives a cryptic error, would be nice to be able to detect if it exists self._process = subprocess.Popen([pov_binary, self._temp_file_ini]) # stdout=subprocess.PIPE, stderr=subprocess.PIPE else: # This works too but means we have to wait until its done diff --git a/release/scripts/modules/bpy_types.py b/release/scripts/modules/bpy_types.py index 1a3f2da2c97..9e4f3c9f836 100644 --- a/release/scripts/modules/bpy_types.py +++ b/release/scripts/modules/bpy_types.py @@ -25,6 +25,7 @@ StructRNA = bpy_types.Struct.__bases__[0] class Context(StructRNA): + __slots__ = () def copy(self): new_context = {} @@ -37,6 +38,7 @@ class Context(StructRNA): class Object(bpy_types.ID): + __slots__ = () @property def children(self): @@ -49,6 +51,7 @@ class _GenericBone: functions for bones, common between Armature/Pose/Edit bones. internal subclassing use only. ''' + __slots__ = () def translate(self, vec): self.head += vec @@ -158,15 +161,15 @@ class _GenericBone: class PoseBone(StructRNA, _GenericBone): - pass + __slots__ = () class Bone(StructRNA, _GenericBone): - pass + __slots__ = () class EditBone(StructRNA, _GenericBone): - pass + __slots__ = () def ord_ind(i1, i2): @@ -176,6 +179,7 @@ def ord_ind(i1, i2): class Mesh(bpy_types.ID): + __slots__ = () def from_pydata(self, verts, edges, faces): ''' @@ -227,6 +231,7 @@ class Mesh(bpy_types.ID): class MeshEdge(StructRNA): + __slots__ = () @property def key(self): @@ -234,6 +239,7 @@ class MeshEdge(StructRNA): class MeshFace(StructRNA): + __slots__ = () @property def edge_keys(self): @@ -259,12 +265,13 @@ class OrderedMeta(type): # Only defined so operators members can be used by accessing self.order class Operator(StructRNA, metaclass=OrderedMeta): - pass + __slots__ = () class Macro(StructRNA, metaclass=OrderedMeta): # bpy_types is imported before ops is defined # so we have to do a local import on each run + __slots__ = () @classmethod def define(self, opname): @@ -273,6 +280,7 @@ class Macro(StructRNA, metaclass=OrderedMeta): class Menu(StructRNA): + __slots__ = () def path_menu(self, searchpaths, operator): layout = self.layout diff --git a/source/blender/python/intern/bpy_rna.c b/source/blender/python/intern/bpy_rna.c index e657cfc79e2..9370ec91d37 100644 --- a/source/blender/python/intern/bpy_rna.c +++ b/source/blender/python/intern/bpy_rna.c @@ -2986,16 +2986,18 @@ static PyObject* pyrna_srna_ExternalType(StructRNA *srna) if(newclass) { PyObject *base_compare= pyrna_srna_PyBase(srna); PyObject *bases= PyObject_GetAttrString(newclass, "__bases__"); + //PyObject *slots= PyObject_GetAttrString(newclass, "__slots__"); // cant do this because it gets superclasses values! + PyObject *slots = PyDict_GetItemString(((PyTypeObject *)newclass)->tp_dict, "__slots__"); - // XXX - highly dodgy!, this stops blender from creating __dict__ in instances - ((PyTypeObject *)newclass)->tp_dictoffset = 0; - - if(PyTuple_GET_SIZE(bases)) { + if(slots==NULL) { + fprintf(stderr, "pyrna_srna_ExternalType: expected class '%s' to have __slots__ defined\n\nSee bpy_types.py\n", idname); + newclass= NULL; + } + else if(PyTuple_GET_SIZE(bases)) { PyObject *base= PyTuple_GET_ITEM(bases, 0); if(base_compare != base) { - PyLineSpit(); - fprintf(stderr, "pyrna_srna_ExternalType: incorrect subclassing of SRNA '%s'\n", idname); + fprintf(stderr, "pyrna_srna_ExternalType: incorrect subclassing of SRNA '%s'\nSee bpy_types.py\n", idname); PyObSpit("Expected! ", base_compare); newclass= NULL; } @@ -3038,16 +3040,12 @@ static PyObject* pyrna_srna_Subtype(StructRNA *srna) if(!descr) descr= "(no docs)"; /* always use O not N when calling, N causes refcount errors */ - newclass = PyObject_CallFunction( (PyObject*)&PyType_Type, "s(O){ssss}", idname, py_base, "__module__","bpy.types", "__doc__",descr); + newclass = PyObject_CallFunction( (PyObject*)&PyType_Type, "s(O){sssss()}", idname, py_base, "__module__","bpy.types", "__doc__",descr, "__slots__"); /* newclass will now have 2 ref's, ???, probably 1 is internal since decrefing here segfaults */ /* PyObSpit("new class ref", newclass); */ if (newclass) { - - // XXX - highly dodgy!, this stops blender from creating __dict__ in instances - ((PyTypeObject *)newclass)->tp_dictoffset = 0; - /* srna owns one, and the other is owned by the caller */ pyrna_subtype_set_rna(newclass, srna); |