svn merge ^/trunk/blender -r48313:48321

This commit is contained in:
Campbell Barton
2012-06-26 20:36:19 +00:00
3 changed files with 23 additions and 26 deletions

View File

@@ -457,6 +457,7 @@ static PyObject *bpy_bm_utils_face_split(PyObject *UNUSED(self), PyObject *args,
py_vert_a->v, py_vert_b->v,
(float (*)[3])coords, ncoords,
&l_new, py_edge_example ? py_edge_example->e : NULL);
PyMem_Free(coords);
}
else {
f_new = BM_face_split(bm, py_face->f,

View File

@@ -133,6 +133,7 @@ int mathutils_array_parse(float *array, int array_min, int array_max, PyObject *
}
}
/* on error, -1 is returned and no allocation is made */
int mathutils_array_parse_alloc(float **array, int array_min, PyObject *value, const char *error_prefix)
{
int size;
@@ -164,6 +165,7 @@ int mathutils_array_parse_alloc(float **array, int array_min, PyObject *value, c
{
PyObject *value_fast = NULL;
// *array = NULL;
int ret;
/* non list/tuple cases */
if (!(value_fast = PySequence_Fast(value, error_prefix))) {
@@ -182,7 +184,13 @@ int mathutils_array_parse_alloc(float **array, int array_min, PyObject *value, c
*array = PyMem_Malloc(size * sizeof(float));
return mathutils_array_parse_fast(*array, size, value_fast, error_prefix);
ret = mathutils_array_parse_fast(*array, size, value_fast, error_prefix);
if (ret == -1) {
PyMem_Free(*array);
}
return ret;
}
}

View File

@@ -81,9 +81,6 @@ static PyObject *Vector_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
break;
case 1:
if ((size = mathutils_array_parse_alloc(&vec, 2, PyTuple_GET_ITEM(args, 0), "mathutils.Vector()")) == -1) {
if (vec) {
PyMem_Free(vec);
}
return NULL;
}
break;
@@ -93,7 +90,7 @@ static PyObject *Vector_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
"more then a single arg given");
return NULL;
}
return Vector_CreatePyObject(vec, size, Py_NEW, type);
return Vector_CreatePyObject_alloc(vec, size, type);
}
static PyObject *vec__apply_to_copy(PyNoArgsFunction vec_func, VectorObject *self)
@@ -301,7 +298,6 @@ static PyObject *C_Vector_Repeat(PyObject *cls, PyObject *args)
if ((value_size = mathutils_array_parse_alloc(&iter_vec, 2, value,
"Vector.Repeat(vector, size), invalid 'vector' arg")) == -1)
{
PyMem_Free(iter_vec);
return NULL;
}
@@ -315,6 +311,7 @@ static PyObject *C_Vector_Repeat(PyObject *cls, PyObject *args)
vec = PyMem_Malloc(size * sizeof(float));
if (vec == NULL) {
PyMem_Free(iter_vec);
PyErr_SetString(PyExc_MemoryError,
"Vector.Repeat(): "
"problem allocating pointer space");
@@ -898,19 +895,18 @@ PyDoc_STRVAR(Vector_dot_doc,
static PyObject *Vector_dot(VectorObject *self, PyObject *value)
{
float *tvec;
PyObject *ret;
if (BaseMath_ReadCallback(self) == -1)
return NULL;
if (mathutils_array_parse_alloc(&tvec, self->size, value, "Vector.dot(other), invalid 'other' arg") == -1) {
goto cleanup;
return NULL;
}
return PyFloat_FromDouble(dot_vn_vn(self->vec, tvec, self->size));
cleanup:
ret = PyFloat_FromDouble(dot_vn_vn(self->vec, tvec, self->size));
PyMem_Free(tvec);
return NULL;
return ret;
}
PyDoc_STRVAR(Vector_angle_doc,
@@ -1140,12 +1136,12 @@ static PyObject *Vector_lerp(VectorObject *self, PyObject *args)
if (!PyArg_ParseTuple(args, "Of:lerp", &value, &fac))
return NULL;
if (mathutils_array_parse_alloc(&tvec, size, value, "Vector.lerp(other), invalid 'other' arg") == -1) {
goto cleanup;
if (BaseMath_ReadCallback(self) == -1) {
return NULL;
}
if (BaseMath_ReadCallback(self) == -1) {
goto cleanup;
if (mathutils_array_parse_alloc(&tvec, size, value, "Vector.lerp(other), invalid 'other' arg") == -1) {
return NULL;
}
vec = PyMem_Malloc(size * sizeof(float));
@@ -1165,10 +1161,6 @@ static PyObject *Vector_lerp(VectorObject *self, PyObject *args)
PyMem_Free(tvec);
return Vector_CreatePyObject_alloc(vec, size, Py_TYPE(self));
cleanup:
PyMem_Free(tvec);
return NULL;
}
PyDoc_STRVAR(Vector_rotate_doc,
@@ -1370,7 +1362,7 @@ static int Vector_ass_slice(VectorObject *self, int begin, int end, PyObject *se
size = (end - begin);
if (mathutils_array_parse_alloc(&vec, size, seq, "vector[begin:end] = [...]") == -1) {
goto cleanup;
return -1;
}
if (vec == NULL) {
@@ -1383,16 +1375,12 @@ static int Vector_ass_slice(VectorObject *self, int begin, int end, PyObject *se
/*parsed well - now set in vector*/
memcpy(self->vec + begin, vec, size * sizeof(float));
PyMem_Free(vec);
if (BaseMath_WriteCallback(self) == -1)
return -1;
PyMem_Free(vec);
return 0;
cleanup:
PyMem_Free(vec);
return -1;
}
/* Numeric Protocols */