[vala/wip/transform: 18/43] Deserialize structs
- From: Luca Bruno <lucabru src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [vala/wip/transform: 18/43] Deserialize structs
- Date: Thu, 5 Jan 2012 14:59:48 +0000 (UTC)
commit ae0de033e8f37a15c5761d0cf2cee9f48c1a567d
Author: Luca Bruno <lucabru src gnome org>
Date: Fri Dec 30 17:56:43 2011 +0100
Deserialize structs
codegen/valagvarianttransformer.vala | 30 ++++++++++++++++++++++++++++++
1 files changed, 30 insertions(+), 0 deletions(-)
---
diff --git a/codegen/valagvarianttransformer.vala b/codegen/valagvarianttransformer.vala
index 8e18c5d..0961dd2 100644
--- a/codegen/valagvarianttransformer.vala
+++ b/codegen/valagvarianttransformer.vala
@@ -316,6 +316,34 @@ public class Vala.GVariantTransformer : CodeTransformer {
b.close ();
}
+ Expression? deserialize_struct (Struct st, Expression expr) {
+ var variant = b.add_temp_declaration (data_type ("GLib.Variant", true), null);
+ var iterator = b.add_temp_declaration (data_type ("GLib.VariantIter", true), null);
+ b.add_assignment (expression (variant), expr);
+ b.add_assignment (expression (iterator), expression (@"$variant.iterator ()"));
+ var type = context.analyzer.get_data_type_for_symbol (st);
+ type.value_owned = true;
+ var result = b.add_temp_declaration (type, expression ("{}"));
+
+ bool field_found = false;
+
+ foreach (var f in st.get_fields ()) {
+ if (f.binding != MemberBinding.INSTANCE) {
+ continue;
+ }
+
+ field_found = true;
+
+ b.add_assignment (expression (@"$result.$(f.name)"), deserialize_expression (f.variable_type, expression (@"$iterator.next_value ()")));
+ }
+
+ if (!field_found) {
+ return null;
+ }
+
+ return expression (result);
+ }
+
Expression? deserialize_expression (DataType type, Expression expr) {
BasicTypeInfo basic_type;
Expression result = null;
@@ -323,6 +351,8 @@ public class Vala.GVariantTransformer : CodeTransformer {
result = deserialize_basic (basic_type, expr);
} else if (type is ArrayType) {
result = deserialize_array ((ArrayType) type, expr);
+ } else if (type.data_type is Struct) {
+ result = deserialize_struct ((Struct) type.data_type, expr);
}
return result;
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]