[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [44284] trunk/blender/source/blender: fix for leak in gpu.export_shader(), wasnt freeing the function.
Campbell Barton
ideasman42 at gmail.com
Mon Feb 20 23:04:39 CET 2012
Revision: 44284
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=44284
Author: campbellbarton
Date: 2012-02-20 22:04:29 +0000 (Mon, 20 Feb 2012)
Log Message:
-----------
fix for leak in gpu.export_shader(), wasnt freeing the function.
also change the bmesh iterator so its possible to initialize without stepping.
Modified Paths:
--------------
trunk/blender/source/blender/bmesh/bmesh_iterators.h
trunk/blender/source/blender/bmesh/bmesh_operator_api.h
trunk/blender/source/blender/bmesh/intern/bmesh_iterators_inline.c
trunk/blender/source/blender/bmesh/intern/bmesh_operators.c
trunk/blender/source/blender/python/generic/py_capi_utils.c
trunk/blender/source/blender/python/generic/py_capi_utils.h
trunk/blender/source/blender/python/intern/gpu.c
Modified: trunk/blender/source/blender/bmesh/bmesh_iterators.h
===================================================================
--- trunk/blender/source/blender/bmesh/bmesh_iterators.h 2012-02-20 21:25:24 UTC (rev 44283)
+++ trunk/blender/source/blender/bmesh/bmesh_iterators.h 2012-02-20 22:04:29 UTC (rev 44284)
@@ -102,8 +102,8 @@
char itype;
} BMIter;
-void *BM_iter_at_index(struct BMesh *bm, const char htype, void *data, int index);
-int BM_iter_as_array(struct BMesh *bm, const char htype, void *data, void **array, const int len);
+void *BM_iter_at_index(struct BMesh *bm, const char itype, void *data, int index);
+int BM_iter_as_array(struct BMesh *bm, const char itype, void *data, void **array, const int len);
/* private for bmesh_iterators_inline.c */
void bmiter__vert_of_mesh_begin(struct BMIter *iter);
Modified: trunk/blender/source/blender/bmesh/bmesh_operator_api.h
===================================================================
--- trunk/blender/source/blender/bmesh/bmesh_operator_api.h 2012-02-20 21:25:24 UTC (rev 44283)
+++ trunk/blender/source/blender/bmesh/bmesh_operator_api.h 2012-02-20 22:04:29 UTC (rev 44284)
@@ -272,7 +272,7 @@
DEL_ONLYFACES,
DEL_EDGESFACES,
DEL_FACES,
- DEL_ALL ,
+ DEL_ALL,
DEL_ONLYTAGGED
};
@@ -313,10 +313,10 @@
/* tool-flags all elements inside an element slot array with flag flag. */
void BMO_slot_buffer_flag_enable(struct BMesh *bm, struct BMOperator *op, const char *slotname,
- const short oflag, const char htype);
+ const short oflag, const char htype);
/* clears tool-flag flag from all elements inside a slot array. */
void BMO_slot_buffer_flag_disable(struct BMesh *bm, struct BMOperator *op, const char *slotname,
- const short oflag, const char htype);
+ const short oflag, const char htype);
/* tool-flags all elements inside an element slot array with flag flag. */
void BMO_slot_buffer_hflag_enable(struct BMesh *bm, struct BMOperator *op, const char *slotname,
Modified: trunk/blender/source/blender/bmesh/intern/bmesh_iterators_inline.c
===================================================================
--- trunk/blender/source/blender/bmesh/intern/bmesh_iterators_inline.c 2012-02-20 21:25:24 UTC (rev 44283)
+++ trunk/blender/source/blender/bmesh/intern/bmesh_iterators_inline.c 2012-02-20 22:04:29 UTC (rev 44284)
@@ -52,11 +52,10 @@
*
* Takes a bmesh iterator structure and fills
* it with the appropriate function pointers based
- * upon its type and then calls BMeshIter_step()
- * to return the first element of the iterator.
+ * upon its type.
*
*/
-BM_INLINE void *BM_iter_new(BMIter *iter, BMesh *bm, const char itype, void *data)
+BM_INLINE int BM_iter_init(BMIter *iter, BMesh *bm, const char itype, void *data)
{
/* int argtype; */
iter->itype = itype;
@@ -78,7 +77,7 @@
break;
case BM_EDGES_OF_VERT:
if (!data)
- return NULL;
+ return FALSE;
iter->begin = bmiter__edge_of_vert_begin;
iter->step = bmiter__edge_of_vert_step;
@@ -86,7 +85,7 @@
break;
case BM_FACES_OF_VERT:
if (!data)
- return NULL;
+ return FALSE;
iter->begin = bmiter__face_of_vert_begin;
iter->step = bmiter__face_of_vert_step;
@@ -94,7 +93,7 @@
break;
case BM_LOOPS_OF_VERT:
if (!data)
- return NULL;
+ return FALSE;
iter->begin = bmiter__loop_of_vert_begin;
iter->step = bmiter__loop_of_vert_step;
@@ -102,7 +101,7 @@
break;
case BM_FACES_OF_EDGE:
if (!data)
- return NULL;
+ return FALSE;
iter->begin = bmiter__face_of_edge_begin;
iter->step = bmiter__face_of_edge_step;
@@ -110,7 +109,7 @@
break;
case BM_VERTS_OF_FACE:
if (!data)
- return NULL;
+ return FALSE;
iter->begin = bmiter__vert_of_face_begin;
iter->step = bmiter__vert_of_face_step;
@@ -118,7 +117,7 @@
break;
case BM_EDGES_OF_FACE:
if (!data)
- return NULL;
+ return FALSE;
iter->begin = bmiter__edge_of_face_begin;
iter->step = bmiter__edge_of_face_step;
@@ -126,7 +125,7 @@
break;
case BM_LOOPS_OF_FACE:
if (!data)
- return NULL;
+ return FALSE;
iter->begin = bmiter__loop_of_face_begin;
iter->step = bmiter__loop_of_face_step;
@@ -134,7 +133,7 @@
break;
case BM_LOOPS_OF_LOOP:
if (!data)
- return NULL;
+ return FALSE;
iter->begin = bmiter__loops_of_loop_begin;
iter->step = bmiter__loops_of_loop_step;
@@ -142,7 +141,7 @@
break;
case BM_LOOPS_OF_EDGE:
if (!data)
- return NULL;
+ return FALSE;
iter->begin = bmiter__loops_of_edge_begin;
iter->step = bmiter__loops_of_edge_step;
@@ -153,8 +152,26 @@
}
iter->begin(iter);
- return BM_iter_step(iter);
+ return TRUE;
}
+/*
+ * BMESH ITERATOR NEW
+ *
+ * Takes a bmesh iterator structure and fills
+ * it with the appropriate function pointers based
+ * upon its type and then calls BMeshIter_step()
+ * to return the first element of the iterator.
+ *
+ */
+BM_INLINE void *BM_iter_new(BMIter *iter, BMesh *bm, const char itype, void *data)
+{
+ if (BM_iter_init(iter, bm, itype, data)) {
+ return BM_iter_step(iter);
+ }
+ else {
+ return NULL;
+ }
+}
#endif /* __BMESH_ITERATORS_INLINE_C__ */
Modified: trunk/blender/source/blender/bmesh/intern/bmesh_operators.c
===================================================================
--- trunk/blender/source/blender/bmesh/intern/bmesh_operators.c 2012-02-20 21:25:24 UTC (rev 44283)
+++ trunk/blender/source/blender/bmesh/intern/bmesh_operators.c 2012-02-20 22:04:29 UTC (rev 44284)
@@ -65,8 +65,8 @@
/* operator slot type information - size of one element of the type given. */
const int BMO_OPSLOT_TYPEINFO[BMO_OP_SLOT_TOTAL_TYPES] = {
0,
- sizeof(int),
sizeof(int),
+ sizeof(int),
sizeof(float),
sizeof(void *),
0, /* unused */
@@ -837,7 +837,7 @@
* Flags elements in a slots buffer
*/
void BMO_slot_buffer_flag_enable(BMesh *bm, BMOperator *op, const char *slotname,
- const short oflag, const char htype)
+ const short oflag, const char htype)
{
BMOpSlot *slot = BMO_slot_get(op, slotname);
BMHeader **data = slot->data.p;
@@ -860,7 +860,7 @@
* Removes flags from elements in a slots buffer
*/
void BMO_slot_buffer_flag_disable(BMesh *bm, BMOperator *op, const char *slotname,
- const short oflag, const char htype)
+ const short oflag, const char htype)
{
BMOpSlot *slot = BMO_slot_get(op, slotname);
BMHeader **data = slot->data.p;
Modified: trunk/blender/source/blender/python/generic/py_capi_utils.c
===================================================================
--- trunk/blender/source/blender/python/generic/py_capi_utils.c 2012-02-20 21:25:24 UTC (rev 44283)
+++ trunk/blender/source/blender/python/generic/py_capi_utils.c 2012-02-20 22:04:29 UTC (rev 44284)
@@ -646,3 +646,39 @@
PyGILState_Release(gilstate);
}
}
+
+/* generic function to avoid depending on RNA */
+void *PyC_RNA_AsPointer(PyObject *value, const char *type_name)
+{
+ PyObject* as_pointer;
+ PyObject* pointer;
+
+ if (!strcmp(Py_TYPE(value)->tp_name, type_name) &&
+ (as_pointer = PyObject_GetAttrString(value, "as_pointer")) != NULL &&
+ PyCallable_Check(as_pointer))
+ {
+ void *result = NULL;
+
+ /* must be a 'type_name' object */
+ pointer = PyObject_CallObject(as_pointer, NULL);
+ Py_DECREF(as_pointer);
+
+ if (!pointer) {
+ PyErr_SetString(PyExc_SystemError, "value.as_pointer() failed");
+ return NULL;
+ }
+ result = PyLong_AsVoidPtr(pointer);
+ Py_DECREF(pointer);
+ if (!result) {
+ PyErr_SetString(PyExc_SystemError, "value.as_pointer() failed");
+ }
+
+ return result;
+ }
+ else {
+ PyErr_Format(PyExc_TypeError,
+ "expected '%.200s' type found '%.200s' instead",
+ type_name, Py_TYPE(value)->tp_name);
+ return NULL;
+ }
+}
Modified: trunk/blender/source/blender/python/generic/py_capi_utils.h
===================================================================
--- trunk/blender/source/blender/python/generic/py_capi_utils.h 2012-02-20 21:25:24 UTC (rev 44283)
+++ trunk/blender/source/blender/python/generic/py_capi_utils.h 2012-02-20 22:04:29 UTC (rev 44284)
@@ -54,4 +54,6 @@
#define PYC_INTERPRETER_ACTIVE (((PyThreadState*)_Py_atomic_load_relaxed(&_PyThreadState_Current)) != NULL)
+void *PyC_RNA_AsPointer(PyObject *value, const char *type_name);
+
#endif // __PY_CAPI_UTILS_H__
Modified: trunk/blender/source/blender/python/intern/gpu.c
===================================================================
--- trunk/blender/source/blender/python/intern/gpu.c 2012-02-20 21:25:24 UTC (rev 44283)
+++ trunk/blender/source/blender/python/intern/gpu.c 2012-02-20 22:04:29 UTC (rev 44284)
@@ -56,6 +56,8 @@
#include "bpy_rna.h"
+#include "../generic/py_capi_utils.h"
+
#include "gpu.h"
#define PY_MODULE_ADD_CONSTANT(module, name) PyModule_AddIntConstant(module, #name, name)
@@ -157,8 +159,6 @@
{
PyObject* pyscene;
PyObject* pymat;
- PyObject* as_pointer;
- PyObject* pointer;
PyObject* result;
PyObject* dict;
PyObject* val;
@@ -177,47 +177,16 @@
if (!PyArg_ParseTupleAndKeywords(args, kwds, "OO:export_shader", (char**)(kwlist), &pyscene, &pymat))
return NULL;
- if (!strcmp(Py_TYPE(pyscene)->tp_name, "Scene") &&
- (as_pointer = PyObject_GetAttrString(pyscene, "as_pointer")) != NULL &&
- PyCallable_Check(as_pointer)) {
- // must be a scene object
- pointer = PyObject_CallObject(as_pointer, NULL);
- if (!pointer) {
- PyErr_SetString(PyExc_SystemError, "scene.as_pointer() failed");
- return NULL;
- }
- scene = (Scene*)PyLong_AsVoidPtr(pointer);
- Py_DECREF(pointer);
- if (!scene) {
- PyErr_SetString(PyExc_SystemError, "scene.as_pointer() failed");
- return NULL;
- }
- }
- else {
- PyErr_SetString(PyExc_TypeError, "gpu.export_shader() first argument should be of Scene type");
+ scene = (Scene *)PyC_RNA_AsPointer(pyscene, "Scene");
+ if (scene == NULL) {
return NULL;
}
- if (!strcmp(Py_TYPE(pymat)->tp_name, "Material") &&
- (as_pointer = PyObject_GetAttrString(pymat, "as_pointer")) != NULL &&
- PyCallable_Check(as_pointer)) {
- // must be a material object
- pointer = PyObject_CallObject(as_pointer, NULL);
- if (!pointer) {
- PyErr_SetString(PyExc_SystemError, "scene.as_pointer() failed");
- return NULL;
- }
- material = (Material*)PyLong_AsVoidPtr(pointer);
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list