[vala/wip/transform] Use wrapper method for serializing hash table and structs
- From: Luca Bruno <lucabru src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [vala/wip/transform] Use wrapper method for serializing hash table and structs
- Date: Tue, 3 Jan 2012 12:27:46 +0000 (UTC)
commit d099f9dc8422750099d429e95f73900e8b703f39
Author: Luca Bruno <lucabru src gnome org>
Date: Tue Jan 3 11:46:23 2012 +0100
Use wrapper method for serializing hash table and structs
codegen/valagvarianttransformer.vala | 68 ++++++++++++++++++++++------------
1 files changed, 44 insertions(+), 24 deletions(-)
---
diff --git a/codegen/valagvarianttransformer.vala b/codegen/valagvarianttransformer.vala
index 84a9cf5..735779e 100644
--- a/codegen/valagvarianttransformer.vala
+++ b/codegen/valagvarianttransformer.vala
@@ -237,43 +237,63 @@ public class Vala.GVariantTransformer : CodeTransformer {
}
Expression? serialize_struct (Struct st, Expression expr) {
- string temp = b.add_temp_declaration (expr.value_type, expr);
-
- var builderinit = expression ("new GLib.VariantBuilder (GLib.VariantType.TUPLE)");
- var builder = b.add_temp_declaration (null, builderinit);
-
- bool field_found = false;
-
+ bool has_instance_field = false;
foreach (Field f in st.get_fields ()) {
- if (f.binding != MemberBinding.INSTANCE) {
- continue;
+ if (f.binding == MemberBinding.INSTANCE) {
+ has_instance_field = true;
+ break;
}
+ }
+ if (!has_instance_field) {
+ return null;
+ }
- field_found = true;
+ Method m;
+ var type = context.analyzer.get_data_type_for_symbol (st);
+ if (!wrapper_method (data_type ("GLib.Variant", true), "gvariant_serialize_struct "+type.to_string(), out m)) {
+ m.add_parameter (new Parameter ("st", type, b.source_reference));
+ b.push_method (m);
- var serialized_field = serialize_expression (copy_type (f.variable_type, false), expression (@"$temp.$(f.name)"));
- MethodCall call = (MethodCall) expression (@"$builder.add_value ()");
- call.add_argument (serialized_field);
- b.add_expression (call);
- }
+ var builderinit = expression ("new GLib.VariantBuilder (GLib.VariantType.TUPLE)");
+ var builder = b.add_temp_declaration (null, builderinit);
- if (!field_found) {
- return null;
+ foreach (Field f in st.get_fields ()) {
+ if (f.binding != MemberBinding.INSTANCE) {
+ continue;
+ }
+
+ var serialized_field = serialize_expression (copy_type (f.variable_type, false), expression (@"st.$(f.name)"));
+ MethodCall call = (MethodCall) expression (@"$builder.add_value ()");
+ call.add_argument (serialized_field);
+ b.add_expression (call);
+ }
+ b.add_return (expression (@"$builder.end ()"));
}
- return expression (@"$builder.end ()");
+ var call = (MethodCall) expression (m.name+"()");
+ call.add_argument (expr);
+ return call;
}
Expression? serialize_hash_table (ObjectType type, Expression expr) {
- string temp = b.add_temp_declaration (expr.value_type, expr);
+ Method m;
+ if (!wrapper_method (data_type ("GLib.Variant", true), "gvariant_serialize_hash_table "+type.to_string(), out m)) {
+ m.add_parameter (new Parameter ("ht", copy_type (type, false), b.source_reference));
+ b.push_method (m);
- var builderinit = expression (@"new GLib.VariantBuilder (new GLib.VariantType (\"$(get_type_signature (type))\"))");
- var builder = b.add_temp_declaration (null, builderinit);
+ var builderinit = expression (@"new GLib.VariantBuilder (new GLib.VariantType (\"$(get_type_signature (type))\"))");
+ var builder = b.add_temp_declaration (null, builderinit);
- var for_each = expression (@"$temp.for_each ((k,v) => $builder.add (\"{?*}\", k, v))");
- b.add_expression (for_each);
+ var for_each = expression (@"ht.for_each ((k,v) => $builder.add (\"{?*}\", k, v))");
+ b.add_expression (for_each);
+ b.add_return (expression (@"$builder.end ()"));
- return expression (@"$builder.end ()");
+ b.pop_method ();
+ check (m);
+ }
+ var call = (MethodCall) expression (m.name+"()");
+ call.add_argument (expr);
+ return call;
}
Expression? serialize_expression (DataType type, Expression expr) {
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]