[vala/wip/transform: 102/102] Fix raw variants
- From: Rico Tzschichholz <ricotz src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [vala/wip/transform: 102/102] Fix raw variants
- Date: Sun, 19 Mar 2017 20:27:12 +0000 (UTC)
commit 31578d3173e4ea47ac6d598a63d7283a9e3919cd
Author: Rico Tzschichholz <ricotz ubuntu com>
Date: Sun Mar 19 19:19:33 2017 +0100
Fix raw variants
codegen/valagdbusclienttransformer.vala | 35 ++++++++++++++++++++++--------
codegen/valagdbusservertransformer.vala | 13 ++++++++---
codegen/valagvarianttransformer.vala | 10 ++++++++
3 files changed, 44 insertions(+), 14 deletions(-)
---
diff --git a/codegen/valagdbusclienttransformer.vala b/codegen/valagdbusclienttransformer.vala
index da2d66a..650158d 100644
--- a/codegen/valagdbusclienttransformer.vala
+++ b/codegen/valagdbusclienttransformer.vala
@@ -41,7 +41,7 @@ public class Vala.GDBusClientTransformer : GVariantTransformer {
return Symbol.lower_case_to_camel_case (symbol.name);
}
- public Expression read_dbus_value (DataType type, string iter, string message, ref string? fd_list,
ref string? fd_index) {
+ public Expression read_dbus_value (Symbol? symbol, DataType type, string iter, string message, ref
string? fd_list, ref string? fd_index) {
string? type_name = null;
if (type.data_type != null) {
type_name = type.data_type.get_full_name ();
@@ -61,14 +61,19 @@ public class Vala.GDBusClientTransformer : GVariantTransformer {
// socket
return expression (@"new GLib.Socket.from_fd ($fd_list.get ($fd_index))");
}
- } else if (type_name == "GLib.Variant") {
- return expression (@"$iter.next_value ().get_variant ()");
+ } else if (is_gvariant_type (type)) {
+ string? signature = (symbol != null ? get_dbus_signature (symbol) : null);
+ if (signature != null) {
+ return expression (@"$iter.next_value ().get_$(get_typename_for_signature
(get_dbus_signature (symbol))) ()");
+ } else {
+ return expression (@"$iter.next_value ().get_variant ()");
+ }
} else {
return expression (@"($type) ($iter.next_value ())");
}
}
- public void write_dbus_value (DataType type, string builder, string value, ref string? fd_list) {
+ public void write_dbus_value (Symbol? symbol, DataType type, string builder, string value, ref
string? fd_list) {
string? type_name = null;
if (type is ObjectType) {
type_name = type.data_type.get_full_name ();
@@ -81,8 +86,13 @@ public class Vala.GDBusClientTransformer : GVariantTransformer {
fd_list = b.add_temp_declaration (null, expression ("new GLib.UnixFDList
()"));
}
statements (@"$builder.add (\"h\", $fd_list.append ($value.get_fd ()));");
- } else if (type_name == "GLib.Variant") {
- statements (@"$builder.add (\"v\", $value);");
+ } else if (is_gvariant_type (type)) {
+ string? signature = (symbol != null ? get_dbus_signature (symbol) : null);
+ if (signature != null) {
+ statements (@"$builder.add (\"$signature\",
$value.get_$(get_typename_for_signature (signature)) ());");
+ } else {
+ statements (@"$builder.add (\"v\", $value);");
+ }
} else {
statements (@"$builder.add_value ($value);");
}
@@ -105,7 +115,7 @@ public class Vala.GDBusClientTransformer : GVariantTransformer {
if (param.variable_type is ObjectType &&
param.variable_type.data_type.get_full_name () == "GLib.Cancellable") {
cancellable = param.name;
}
- write_dbus_value (param.variable_type, builder, param.name, ref fd_list);
+ write_dbus_value (param, param.variable_type, builder, param.name, ref
fd_list);
} else if (param.direction == ParameterDirection.OUT) {
has_result = true;
}
@@ -135,11 +145,11 @@ public class Vala.GDBusClientTransformer : GVariantTransformer {
statements (@"$iter = $reply.get_body ().iterator ();");
foreach (var param in m.get_parameters ()) {
if (param.direction == ParameterDirection.OUT) {
- b.add_assignment (expression (param.name), read_dbus_value
(param.variable_type, iter, reply, ref fd_list, ref fd_index));
+ b.add_assignment (expression (param.name), read_dbus_value (param,
param.variable_type, iter, reply, ref fd_list, ref fd_index));
}
}
if (m.has_result) {
- b.add_return (read_dbus_value (m.return_type, iter, reply, ref fd_list, ref
fd_index));
+ b.add_return (read_dbus_value (m, m.return_type, iter, reply, ref fd_list,
ref fd_index));
}
}
}
@@ -194,7 +204,12 @@ public class Vala.GDBusClientTransformer : GVariantTransformer {
foreach (var param in sig.get_parameters ()) {
var temp = b.add_temp_declaration (copy_type (param.variable_type, true));
if (is_gvariant_type (param.variable_type)) {
- statements (@"$temp = $iter.next_value ().get_variant ();");
+ string? signature = get_dbus_signature (param);
+ if (signature != null) {
+ statements (@"$temp = $iter.next_value
().get_$(get_typename_for_signature (get_dbus_signature (param))) ();");
+ } else {
+ statements (@"$temp = $iter.next_value ().get_variant ();");
+ }
} else {
statements (@"$temp = ($(param.variable_type)) ($iter.next_value ());");
}
diff --git a/codegen/valagdbusservertransformer.vala b/codegen/valagdbusservertransformer.vala
index 0e745eb..4a98e3a 100644
--- a/codegen/valagdbusservertransformer.vala
+++ b/codegen/valagdbusservertransformer.vala
@@ -85,7 +85,7 @@ public class Vala.GDBusServerTransformer : GDBusClientTransformer {
if (param.direction == ParameterDirection.IN) {
var arg = b.add_temp_declaration (copy_type (param.variable_type, true));
- b.add_assignment (expression (arg), read_dbus_value (param.variable_type,
iter, "invocation.get_message ()", ref fd_list, ref fd_index));
+ b.add_assignment (expression (arg), read_dbus_value (param,
param.variable_type, iter, "invocation.get_message ()", ref fd_list, ref fd_index));
call.add_argument (expression (arg));
} else if (param.direction == ParameterDirection.OUT) {
if (m.coroutine) {
@@ -124,10 +124,10 @@ public class Vala.GDBusServerTransformer : GDBusClientTransformer {
var reply = b.add_temp_declaration (null, expression ("new GLib.DBusMessage.method_reply
(invocation.get_message ())"));
var builder = b.add_temp_declaration (null, expression ("new GLib.VariantBuilder
(GLib.VariantType.TUPLE)"));
for (int i = 0; i < out_args.length; i++) {
- write_dbus_value (out_types[i], builder, out_args[i], ref fd_list);
+ write_dbus_value (null, out_types[i], builder, out_args[i], ref fd_list);
}
if (result != null) {
- write_dbus_value (m.return_type.copy (), builder, result, ref fd_list);
+ write_dbus_value (m, m.return_type.copy (), builder, result, ref fd_list);
}
statements (@"$reply.set_body ($builder.end ());");
if (fd_list != null) {
@@ -292,7 +292,12 @@ public class Vala.GDBusServerTransformer : GDBusClientTransformer {
var builder = b.add_temp_declaration (null, expression ("new GLib.VariantBuilder
(GLib.VariantType.TUPLE)"));
foreach (var param in sig.get_parameters ()) {
if (is_gvariant_type (param.variable_type)) {
- statements (@"$builder.add (\"v\", $(param.name));");
+ string? signature = get_dbus_signature (param);
+ if (signature != null) {
+ statements (@"$builder.add (\"$signature\",
$(param.name).get_$(get_typename_for_signature (signature)) ());");
+ } else {
+ statements (@"$builder.add (\"v\", $(param.name));");
+ }
} else {
statements (@"$builder.add_value ($(param.name));");
}
diff --git a/codegen/valagvarianttransformer.vala b/codegen/valagvarianttransformer.vala
index aaeba8b..7c09c59 100644
--- a/codegen/valagvarianttransformer.vala
+++ b/codegen/valagvarianttransformer.vala
@@ -56,6 +56,16 @@ public class Vala.GVariantTransformer : CCodeTransformer {
return type.data_type == context.analyzer.gvariant_type.data_type;
}
+ public unowned string get_typename_for_signature (string signature) {
+ BasicTypeInfo basic_type;
+ if (get_basic_type_info (signature, out basic_type)) {
+ return basic_type.type_name;
+ }
+
+ Report.error (null, "Unsupported variant-type: '%s'".printf (signature));
+ assert_not_reached ();
+ }
+
bool get_basic_type_info (string signature, out BasicTypeInfo basic_type) {
foreach (BasicTypeInfo info in basic_types) {
if (info.signature == signature) {
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]