[dia] PyDia leaks with render parameters fixed
- From: Hans Breuer <hans src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [dia] PyDia leaks with render parameters fixed
- Date: Sun, 30 Jan 2011 15:44:29 +0000 (UTC)
commit d03c0cb5862d1bddf1d3226feab93a1371eeb56b
Author: Hans Breuer <hans breuer org>
Date: Sun Jan 30 16:25:09 2011 +0100
PyDia leaks with render parameters fixed
The parameters on the C site where not properly unref'd after use.
plug-ins/python/pydia-render.c | 146 ++++++++++++++++++++++++++++------------
1 files changed, 104 insertions(+), 42 deletions(-)
---
diff --git a/plug-ins/python/pydia-render.c b/plug-ins/python/pydia-render.c
index 0dcc643..c094c6d 100644
--- a/plug-ins/python/pydia-render.c
+++ b/plug-ins/python/pydia-render.c
@@ -311,14 +311,17 @@ set_font(DiaRenderer *renderer, DiaFont *font, real height)
func = PyObject_GetAttrString (self, "set_font");
if (func && PyCallable_Check(func)) {
+ PyObject *ofont = PyDiaFont_New (font);
+
Py_INCREF(self);
Py_INCREF(func);
- arg = Py_BuildValue ("(Od)", PyDiaFont_New (font), height);
+ arg = Py_BuildValue ("(Od)", ofont, height);
if (arg) {
res = PyEval_CallObject (func, arg);
ON_RES(res, FALSE);
}
Py_XDECREF (arg);
+ Py_XDECREF (ofont);
Py_DECREF(func);
Py_DECREF(self);
}
@@ -335,6 +338,7 @@ draw_object (DiaRenderer *renderer, DiaObject *object, DiaMatrix *matrix)
func = PyObject_GetAttrString (self, "draw_object");
if (func && PyCallable_Check(func)) {
+ PyObject *oobj = PyDiaObject_New (object);
PyObject *mat = NULL;
Py_INCREF(self);
@@ -345,12 +349,13 @@ draw_object (DiaRenderer *renderer, DiaObject *object, DiaMatrix *matrix)
Py_INCREF(Py_None);
mat = Py_None;
}
- arg = Py_BuildValue ("(OO)", PyDiaObject_New (object), mat );
+ arg = Py_BuildValue ("(OO)", oobj, mat);
if (arg) {
res = PyEval_CallObject (func, arg);
ON_RES(res, FALSE);
}
Py_XDECREF (arg);
+ Py_XDECREF (oobj);
Py_XDECREF (mat);
Py_DECREF(func);
Py_DECREF(self);
@@ -370,16 +375,21 @@ draw_line(DiaRenderer *renderer,
func = PyObject_GetAttrString (self, "draw_line");
if (func && PyCallable_Check(func)) {
+ PyObject *ostart = PyDiaPoint_New (start);
+ PyObject *oend = PyDiaPoint_New (end);
+ PyObject *ocolor = PyDiaColor_New (line_colour);
+
Py_INCREF(self);
Py_INCREF(func);
- arg = Py_BuildValue ("(OOO)", PyDiaPoint_New (start),
- PyDiaPoint_New (end),
- PyDiaColor_New (line_colour));
+ arg = Py_BuildValue ("(OOO)", ostart, oend, ocolor);
if (arg) {
res = PyEval_CallObject (func, arg);
ON_RES(res, FALSE);
}
Py_XDECREF (arg);
+ Py_XDECREF (ostart);
+ Py_XDECREF (oend);
+ Py_XDECREF (ocolor);
Py_DECREF(func);
Py_DECREF(self);
}
@@ -401,15 +411,19 @@ draw_polyline(DiaRenderer *renderer,
func = PyObject_GetAttrString (self, "draw_polyline");
if (func && PyCallable_Check(func)) {
+ PyObject *optt = PyDiaPointTuple_New (points, num_points);
+ PyObject *ocolor = PyDiaColor_New (line_colour);
+
Py_INCREF(self);
Py_INCREF(func);
- arg = Py_BuildValue ("(OO)", PyDiaPointTuple_New (points, num_points),
- PyDiaColor_New (line_colour));
+ arg = Py_BuildValue ("(OO)", optt, ocolor);
if (arg) {
res = PyEval_CallObject (func, arg);
ON_RES(res, FALSE);
}
Py_XDECREF (arg);
+ Py_XDECREF (optt);
+ Py_XDECREF (ocolor);
Py_DECREF(func);
Py_DECREF(self);
}
@@ -429,15 +443,19 @@ draw_polygon(DiaRenderer *renderer,
func = PyObject_GetAttrString (self, "draw_polygon");
if (func && PyCallable_Check(func)) {
+ PyObject *optt = PyDiaPointTuple_New (points, num_points);
+ PyObject *ocolor = PyDiaColor_New (line_colour);
+
Py_INCREF(self);
Py_INCREF(func);
- arg = Py_BuildValue ("(OO)", PyDiaPointTuple_New (points, num_points),
- PyDiaColor_New (line_colour));
+ arg = Py_BuildValue ("(OO)", optt, ocolor);
if (arg) {
res = PyEval_CallObject (func, arg);
ON_RES(res, FALSE);
}
Py_XDECREF (arg);
+ Py_XDECREF (optt);
+ Py_XDECREF (ocolor);
Py_DECREF(func);
Py_DECREF(self);
}
@@ -457,15 +475,19 @@ fill_polygon(DiaRenderer *renderer,
func = PyObject_GetAttrString (self, "fill_polygon");
if (func && PyCallable_Check(func)) {
+ PyObject *optt = PyDiaPointTuple_New (points, num_points);
+ PyObject *ocolor = PyDiaColor_New (colour);
+
Py_INCREF(self);
Py_INCREF(func);
- arg = Py_BuildValue ("(OO)", PyDiaPointTuple_New (points, num_points),
- PyDiaColor_New (colour));
+ arg = Py_BuildValue ("(OO)", optt, ocolor);
if (arg) {
res = PyEval_CallObject (func, arg);
ON_RES(res, FALSE);
}
Py_XDECREF (arg);
+ Py_XDECREF (optt);
+ Py_XDECREF (ocolor);
Py_DECREF(func);
Py_DECREF(self);
}
@@ -487,15 +509,18 @@ draw_rect(DiaRenderer *renderer,
func = PyObject_GetAttrString (self, "draw_rect");
if (func && PyCallable_Check(func)) {
+ PyObject *orect = PyDiaRectangle_New_FromPoints (ul_corner, lr_corner);
+ PyObject *ocolor = PyDiaColor_New (colour);
Py_INCREF(self);
Py_INCREF(func);
- arg = Py_BuildValue ("(OO)", PyDiaRectangle_New_FromPoints (ul_corner, lr_corner),
- PyDiaColor_New (colour));
+ arg = Py_BuildValue ("(OO)", orect, ocolor);
if (arg) {
res = PyEval_CallObject (func, arg);
ON_RES(res, FALSE);
}
Py_XDECREF (arg);
+ Py_XDECREF (orect);
+ Py_XDECREF (ocolor);
Py_DECREF(func);
Py_DECREF(self);
}
@@ -506,7 +531,6 @@ draw_rect(DiaRenderer *renderer,
}
}
-
static void
draw_rounded_rect(DiaRenderer *renderer,
Point *ul_corner, Point *lr_corner,
@@ -516,15 +540,19 @@ draw_rounded_rect(DiaRenderer *renderer,
func = PyObject_GetAttrString (self, "draw_rounded_rect");
if (func && PyCallable_Check(func)) {
+ PyObject *orect = PyDiaRectangle_New_FromPoints (ul_corner, lr_corner);
+ PyObject *ocolor = PyDiaColor_New (colour);
+
Py_INCREF(self);
Py_INCREF(func);
- arg = Py_BuildValue ("(OOd)", PyDiaRectangle_New_FromPoints (ul_corner, lr_corner),
- PyDiaColor_New (colour), rounding);
+ arg = Py_BuildValue ("(OOd)", orect, ocolor, rounding);
if (arg) {
res = PyEval_CallObject (func, arg);
ON_RES(res, FALSE);
}
Py_XDECREF (arg);
+ Py_XDECREF (ocolor);
+ Py_XDECREF (orect);
Py_DECREF(func);
Py_DECREF(self);
}
@@ -545,15 +573,19 @@ fill_rect(DiaRenderer *renderer,
func = PyObject_GetAttrString (self, "fill_rect");
if (func && PyCallable_Check(func)) {
+ PyObject *orect = PyDiaRectangle_New_FromPoints (ul_corner, lr_corner);
+ PyObject *ocolor = PyDiaColor_New (colour);
+
Py_INCREF(self);
Py_INCREF(func);
- arg = Py_BuildValue ("(OO)", PyDiaRectangle_New_FromPoints (ul_corner, lr_corner),
- PyDiaColor_New (colour));
+ arg = Py_BuildValue ("(OO)", orect, ocolor);
if (arg) {
res = PyEval_CallObject (func, arg);
ON_RES(res, FALSE);
}
Py_XDECREF (arg);
+ Py_XDECREF (orect);
+ Py_XDECREF (ocolor);
Py_DECREF(func);
Py_DECREF(self);
}
@@ -575,15 +607,19 @@ fill_rounded_rect(DiaRenderer *renderer,
func = PyObject_GetAttrString (self, "fill_rounded_rect");
if (func && PyCallable_Check(func)) {
+ PyObject *orect = PyDiaRectangle_New_FromPoints (ul_corner, lr_corner);
+ PyObject *ocolor = PyDiaColor_New (colour);
+
Py_INCREF(self);
Py_INCREF(func);
- arg = Py_BuildValue ("(OOd)", PyDiaRectangle_New_FromPoints (ul_corner, lr_corner),
- PyDiaColor_New (colour), rounding);
+ arg = Py_BuildValue ("(OOd)", orect, ocolor, rounding);
if (arg) {
res = PyEval_CallObject (func, arg);
ON_RES(res, FALSE);
}
Py_XDECREF (arg);
+ Py_XDECREF (orect);
+ Py_XDECREF (ocolor);
Py_DECREF(func);
Py_DECREF(self);
}
@@ -605,16 +641,21 @@ draw_arc(DiaRenderer *renderer,
func = PyObject_GetAttrString (self, "draw_arc");
if (func && PyCallable_Check(func)) {
+ PyObject *opoint = PyDiaPoint_New (center);
+ PyObject *ocolor = PyDiaColor_New (colour);
+
Py_INCREF(self);
Py_INCREF(func);
- arg = Py_BuildValue ("(OddddO)", PyDiaPoint_New (center),
+ arg = Py_BuildValue ("(OddddO)", opoint,
width, height, angle1, angle2,
- PyDiaColor_New (colour));
+ ocolor);
if (arg) {
res = PyEval_CallObject (func, arg);
ON_RES(res, FALSE);
}
Py_XDECREF (arg);
+ Py_XDECREF (opoint);
+ Py_XDECREF (ocolor);
Py_DECREF(func);
Py_DECREF(self);
}
@@ -638,16 +679,21 @@ fill_arc(DiaRenderer *renderer,
func = PyObject_GetAttrString (self, "fill_arc");
if (func && PyCallable_Check(func)) {
+ PyObject *opoint = PyDiaPoint_New (center);
+ PyObject *ocolor = PyDiaColor_New (colour);
+
Py_INCREF(self);
Py_INCREF(func);
- arg = Py_BuildValue ("(OddddO)", PyDiaPoint_New (center),
+ arg = Py_BuildValue ("(OddddO)", opoint,
width, height, angle1, angle2,
- PyDiaColor_New (colour));
+ ocolor);
if (arg) {
res = PyEval_CallObject (func, arg);
ON_RES(res, FALSE);
}
Py_XDECREF (arg);
+ Py_XDECREF (opoint);
+ Py_XDECREF (ocolor);
Py_DECREF(func);
Py_DECREF(self);
}
@@ -670,16 +716,19 @@ draw_ellipse(DiaRenderer *renderer,
func = PyObject_GetAttrString (self, "draw_ellipse");
if (func && PyCallable_Check(func)) {
+ PyObject *opoint = PyDiaPoint_New (center);
+ PyObject *ocolor = PyDiaColor_New (colour);
+
Py_INCREF(self);
Py_INCREF(func);
- arg = Py_BuildValue ("(OddO)", PyDiaPoint_New (center),
- width, height,
- PyDiaColor_New (colour));
+ arg = Py_BuildValue ("(OddO)", opoint, width, height, ocolor);
if (arg) {
res = PyEval_CallObject (func, arg);
ON_RES(res, FALSE);
}
Py_XDECREF (arg);
+ Py_XDECREF (opoint);
+ Py_XDECREF (ocolor);
Py_DECREF(func);
Py_DECREF(self);
}
@@ -702,16 +751,18 @@ fill_ellipse(DiaRenderer *renderer,
func = PyObject_GetAttrString (self, "fill_ellipse");
if (func && PyCallable_Check(func)) {
+ PyObject *opoint = PyDiaPoint_New (center);
+ PyObject *ocolor = PyDiaColor_New (colour);
Py_INCREF(self);
Py_INCREF(func);
- arg = Py_BuildValue ("(OddO)", PyDiaPoint_New (center),
- width, height,
- PyDiaColor_New (colour));
+ arg = Py_BuildValue ("(OddO)", opoint, width, height, ocolor);
if (arg) {
res = PyEval_CallObject (func, arg);
ON_RES(res, FALSE);
}
Py_XDECREF (arg);
+ Py_XDECREF (opoint);
+ Py_XDECREF (ocolor);
Py_DECREF(func);
Py_DECREF(self);
}
@@ -734,15 +785,18 @@ draw_bezier(DiaRenderer *renderer,
func = PyObject_GetAttrString (self, "draw_bezier");
if (func && PyCallable_Check(func)) {
+ PyObject *obt = PyDiaBezPointTuple_New (points, num_points);
+ PyObject *ocolor = PyDiaColor_New (colour);
Py_INCREF(self);
Py_INCREF(func);
- arg = Py_BuildValue ("(OO)", PyDiaBezPointTuple_New (points, num_points),
- PyDiaColor_New (colour));
+ arg = Py_BuildValue ("(OO)", obt, ocolor);
if (arg) {
res = PyEval_CallObject (func, arg);
ON_RES(res, FALSE);
}
Py_XDECREF (arg);
+ Py_XDECREF (obt);
+ Py_XDECREF (ocolor);
Py_DECREF(func);
Py_DECREF(self);
}
@@ -763,15 +817,18 @@ fill_bezier(DiaRenderer *renderer,
func = PyObject_GetAttrString (self, "fill_bezier");
if (func && PyCallable_Check(func)) {
+ PyObject *obt = PyDiaBezPointTuple_New (points, num_points);
+ PyObject *ocolor = PyDiaColor_New (colour);
Py_INCREF(self);
Py_INCREF(func);
- arg = Py_BuildValue ("(OO)", PyDiaBezPointTuple_New (points, num_points),
- PyDiaColor_New (colour));
+ arg = Py_BuildValue ("(OO)", obt, ocolor);
if (arg) {
res = PyEval_CallObject (func, arg);
ON_RES(res, FALSE);
}
Py_XDECREF (arg);
+ Py_XDECREF (obt);
+ Py_XDECREF (ocolor);
Py_DECREF(func);
Py_DECREF(self);
}
@@ -804,17 +861,19 @@ draw_string(DiaRenderer *renderer,
func = PyObject_GetAttrString (self, "draw_string");
if (func && PyCallable_Check(func)) {
+ PyObject *opoint = PyDiaPoint_New (pos);
+ PyObject *ocolor = PyDiaColor_New (colour);
+
Py_INCREF(self);
Py_INCREF(func);
- arg = Py_BuildValue ("(sOiO)", text,
- PyDiaPoint_New (pos),
- alignment,
- PyDiaColor_New (colour));
+ arg = Py_BuildValue ("(sOiO)", text, opoint, alignment, ocolor);
if (arg) {
res = PyEval_CallObject (func, arg);
ON_RES(res, FALSE);
}
Py_XDECREF (arg);
+ Py_XDECREF (opoint);
+ Py_XDECREF (ocolor);
Py_DECREF(func);
Py_DECREF(self);
} else { /* member not optional */
@@ -836,20 +895,23 @@ draw_image(DiaRenderer *renderer,
func = PyObject_GetAttrString (self, "draw_image");
if (func && PyCallable_Check(func)) {
+ PyObject *opoint = PyDiaPoint_New (point);
+ PyObject *oimage = PyDiaImage_New (image);
+
Py_INCREF(self);
Py_INCREF(func);
- arg = Py_BuildValue ("(OddO)", PyDiaPoint_New (point),
- width, height,
- PyDiaImage_New (image));
+ arg = Py_BuildValue ("(OddO)", opoint, width, height, oimage);
if (arg) {
res = PyEval_CallObject (func, arg);
ON_RES(res, FALSE);
}
Py_XDECREF (arg);
+ Py_XDECREF (opoint);
+ Py_XDECREF (oimage);
Py_DECREF(func);
Py_DECREF(self);
} else { /* member not optional */
- gchar *msg = g_strdup_printf ("%s.draw_string() implmentation missing.",
+ gchar *msg = g_strdup_printf ("%s.draw_image() implmentation missing.",
G_OBJECT_CLASS_NAME (G_OBJECT_GET_CLASS (renderer)));
PyErr_Clear();
PyErr_Warn (PyExc_RuntimeWarning, msg);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]