From: Luca Bruno Date: Fri, 30 Dec 2011 10:27:19 +0000 (+0100) Subject: Serialize hash table X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=eb002287ca23d759220be72d985b04f6e468276b;p=thirdparty%2Fvala.git Serialize hash table --- diff --git a/codegen/valagvarianttransformer.vala b/codegen/valagvarianttransformer.vala index 211117b81..c2f09eb49 100644 --- a/codegen/valagvarianttransformer.vala +++ b/codegen/valagvarianttransformer.vala @@ -231,11 +231,19 @@ public class Vala.GVariantTransformer : CodeTransformer { return expression (@"$builder.end ()"); } - Expression? serialize_expression (DataType type, Expression expr) { - if (type.data_type == context.analyzer.gvariant_type.data_type) { - return expr; - } + Expression? serialize_hash_table (ObjectType type, Expression expr) { + string temp = b.add_temp_declaration (expr.value_type, expr); + + 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); + return expression (@"$builder.end ()"); + } + + Expression? serialize_expression (DataType type, Expression expr) { BasicTypeInfo basic_type; Expression result = null; if (get_basic_type_info (get_type_signature (type), out basic_type)) { @@ -244,6 +252,14 @@ public class Vala.GVariantTransformer : CodeTransformer { result = serialize_array ((ArrayType) type, expr); } else if (type.data_type is Struct) { result = serialize_struct ((Struct) type.data_type, expr); + } else if (type is ObjectType) { + if (type.data_type == context.analyzer.gvariant_type.data_type) { + var variant_new = (ObjectCreationExpression) expression ("new GLib.Variant.variant ()"); + variant_new.add_argument (expr); + result = variant_new; + } else if (type.data_type.get_full_name () == "GLib.HashTable") { + result = serialize_hash_table ((ObjectType) type, expr); + } } return result; }