[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [25147] trunk/blender: remove nasty hack which made StructRNA class instaces have no __dict__,

Campbell Barton ideasman42 at gmail.com
Sun Dec 6 00:41:45 CET 2009


Revision: 25147
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=25147
Author:   campbellbarton
Date:     2009-12-06 00:41:45 +0100 (Sun, 06 Dec 2009)

Log Message:
-----------
remove nasty hack which made StructRNA class instaces have no __dict__,
use __slots__, it seems all the parent classes need to have slots as well for this to work.
all python defined srna classes are checked for this too

Modified Paths:
--------------
    trunk/blender/release/scripts/io/engine_render_pov.py
    trunk/blender/release/scripts/modules/bpy_types.py
    trunk/blender/source/blender/python/intern/bpy_rna.c

Modified: trunk/blender/release/scripts/io/engine_render_pov.py
===================================================================
--- trunk/blender/release/scripts/io/engine_render_pov.py	2009-12-05 22:03:07 UTC (rev 25146)
+++ trunk/blender/release/scripts/io/engine_render_pov.py	2009-12-05 23:41:45 UTC (rev 25147)
@@ -757,6 +757,7 @@
 				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

Modified: trunk/blender/release/scripts/modules/bpy_types.py
===================================================================
--- trunk/blender/release/scripts/modules/bpy_types.py	2009-12-05 22:03:07 UTC (rev 25146)
+++ trunk/blender/release/scripts/modules/bpy_types.py	2009-12-05 23:41:45 UTC (rev 25147)
@@ -25,6 +25,7 @@
 
 
 class Context(StructRNA):
+    __slots__ = ()
 
     def copy(self):
         new_context = {}
@@ -37,6 +38,7 @@
 
 
 class Object(bpy_types.ID):
+    __slots__ = ()
 
     @property
     def children(self):
@@ -49,6 +51,7 @@
     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 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 @@
 
 
 class Mesh(bpy_types.ID):
+    __slots__ = ()
 
     def from_pydata(self, verts, edges, faces):
         '''
@@ -227,6 +231,7 @@
 
 
 class MeshEdge(StructRNA):
+    __slots__ = ()
 
     @property
     def key(self):
@@ -234,6 +239,7 @@
 
 
 class MeshFace(StructRNA):
+    __slots__ = ()
 
     @property
     def edge_keys(self):
@@ -259,12 +265,13 @@
 
 # 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 Menu(StructRNA):
+    __slots__ = ()
 
     def path_menu(self, searchpaths, operator):
         layout = self.layout

Modified: trunk/blender/source/blender/python/intern/bpy_rna.c
===================================================================
--- trunk/blender/source/blender/python/intern/bpy_rna.c	2009-12-05 22:03:07 UTC (rev 25146)
+++ trunk/blender/source/blender/python/intern/bpy_rna.c	2009-12-05 23:41:45 UTC (rev 25147)
@@ -2986,16 +2986,18 @@
 	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 @@
 		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);
 





More information about the Bf-blender-cvs mailing list