0 | |
From: Simon McVittie <simon.mcvittie@collabora.co.uk>
|
1 | |
Date: Tue, 18 Mar 2014 13:51:16 +0000
|
2 | |
Subject: Don't leak method call results (regression in 0.23.1)
|
3 | |
|
4 | |
Commit 7ffbde3f used common code for two blocks that were not actually
|
5 | |
the same. dbus-glib method calls give the caller a new reference
|
6 | |
to the results, whereas dbus-glib signals do not. As a result,
|
7 | |
the method-call case needs to either free the results, or get them
|
8 | |
freed by giving ownership to the GValueArray. I chose to give
|
9 | |
ownership.
|
10 | |
|
11 | |
Reviewed-by: Guillaume Desmottes
|
12 | |
Origin: upstream, 0.23.4, commit:164cf33347e03e3d04f013ec7f710d991825cd66
|
13 | |
---
|
14 | |
tools/glib-client-gen.py | 6 +++---
|
15 | |
tools/libglibcodegen.py | 21 +++++++++++++++++++++
|
16 | |
2 files changed, 24 insertions(+), 3 deletions(-)
|
17 | |
|
18 | |
diff --git a/tools/glib-client-gen.py b/tools/glib-client-gen.py
|
19 | |
index a0fecf0..b7edbc0 100644
|
20 | |
--- a/tools/glib-client-gen.py
|
21 | |
+++ b/tools/glib-client-gen.py
|
22 | |
@@ -29,8 +29,8 @@ from getopt import gnu_getopt
|
23 | |
|
24 | |
from libtpcodegen import file_set_contents, key_by_name, u
|
25 | |
from libglibcodegen import (Signature, type_to_gtype,
|
26 | |
- get_docstring, xml_escape, get_deprecated, copy_into_gvalue)
|
27 | |
-
|
28 | |
+ get_docstring, xml_escape, get_deprecated, copy_into_gvalue,
|
29 | |
+ move_into_gvalue)
|
30 | |
|
31 | |
NS_TP = "http://telepathy.freedesktop.org/wiki/DbusSpec#extensions-v0"
|
32 | |
|
33 | |
@@ -545,7 +545,7 @@ class Generator(object):
|
34 | |
self.b(' g_value_unset (args->values + %d);' % i)
|
35 | |
self.b(' g_value_init (args->values + %d, %s);' % (i, gtype))
|
36 | |
|
37 | |
- self.b(' ' + copy_into_gvalue('args->values + %d' % i,
|
38 | |
+ self.b(' ' + move_into_gvalue('args->values + %d' % i,
|
39 | |
gtype, marshaller, name))
|
40 | |
|
41 | |
self.b(' tp_proxy_pending_call_v0_take_results (user_data, '
|
42 | |
diff --git a/tools/libglibcodegen.py b/tools/libglibcodegen.py
|
43 | |
index 0b703a5..5c76f07 100644
|
44 | |
--- a/tools/libglibcodegen.py
|
45 | |
+++ b/tools/libglibcodegen.py
|
46 | |
@@ -171,6 +171,27 @@ def type_to_gtype(s):
|
47 | |
# we just don't know ..
|
48 | |
raise Exception("don't know the GType for " + s)
|
49 | |
|
50 | |
+def move_into_gvalue(gvaluep, gtype, marshaller, name):
|
51 | |
+ if gtype == 'G_TYPE_STRING':
|
52 | |
+ return 'g_value_take_string (%s, %s);' % (gvaluep, name)
|
53 | |
+ elif marshaller == 'BOXED':
|
54 | |
+ return 'g_value_take_boxed (%s, %s);' % (gvaluep, name)
|
55 | |
+ elif gtype == 'G_TYPE_UCHAR':
|
56 | |
+ return 'g_value_set_uchar (%s, %s);' % (gvaluep, name)
|
57 | |
+ elif gtype == 'G_TYPE_BOOLEAN':
|
58 | |
+ return 'g_value_set_boolean (%s, %s);' % (gvaluep, name)
|
59 | |
+ elif gtype == 'G_TYPE_INT':
|
60 | |
+ return 'g_value_set_int (%s, %s);' % (gvaluep, name)
|
61 | |
+ elif gtype == 'G_TYPE_UINT':
|
62 | |
+ return 'g_value_set_uint (%s, %s);' % (gvaluep, name)
|
63 | |
+ elif gtype == 'G_TYPE_INT64':
|
64 | |
+ return 'g_value_set_int (%s, %s);' % (gvaluep, name)
|
65 | |
+ elif gtype == 'G_TYPE_UINT64':
|
66 | |
+ return 'g_value_set_uint64 (%s, %s);' % (gvaluep, name)
|
67 | |
+ elif gtype == 'G_TYPE_DOUBLE':
|
68 | |
+ return 'g_value_set_double (%s, %s);' % (gvaluep, name)
|
69 | |
+ else:
|
70 | |
+ raise AssertionError("Don't know how to put %s in a GValue" % gtype)
|
71 | |
|
72 | |
def copy_into_gvalue(gvaluep, gtype, marshaller, name):
|
73 | |
if gtype == 'G_TYPE_STRING':
|