[vala] dova: Fix assignment to variables of generic type



commit 7f5ac28b68b0fa6e88d9e012b31c0d77ac219e6e
Author: Jürg Billeter <j bitron ch>
Date:   Thu Apr 7 22:25:49 2011 +0200

    dova: Fix assignment to variables of generic type

 codegen/valadovaassignmentmodule.vala |    4 ++--
 codegen/valadovaobjectmodule.vala     |   10 +++++++++-
 codegen/valadovavaluemodule.vala      |   25 ++++++++++++++++++++++++-
 3 files changed, 35 insertions(+), 4 deletions(-)
---
diff --git a/codegen/valadovaassignmentmodule.vala b/codegen/valadovaassignmentmodule.vala
index 831baa6..857c30e 100644
--- a/codegen/valadovaassignmentmodule.vala
+++ b/codegen/valadovaassignmentmodule.vala
@@ -1,6 +1,6 @@
 /* valadovaassignmentmodule.vala
  *
- * Copyright (C) 2006-2010  Jürg Billeter
+ * Copyright (C) 2006-2011  Jürg Billeter
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
@@ -132,7 +132,7 @@ public class Vala.DovaAssignmentModule : DovaMemberAccessModule {
 		}
 	}
 
-	void store_variable (Variable variable, TargetValue lvalue, TargetValue value, bool initializer) {
+	public virtual void store_variable (Variable variable, TargetValue lvalue, TargetValue value, bool initializer) {
 		if (!initializer && requires_destroy (variable.variable_type)) {
 			/* unref old value */
 			ccode.add_expression (destroy_value (lvalue));
diff --git a/codegen/valadovaobjectmodule.vala b/codegen/valadovaobjectmodule.vala
index 6646897..65f17b8 100644
--- a/codegen/valadovaobjectmodule.vala
+++ b/codegen/valadovaobjectmodule.vala
@@ -1952,7 +1952,15 @@ public class Vala.DovaObjectModule : DovaArrayModule {
 			var cindex = get_cvalue (indices[0]);
 
 			if (array_type.inline_allocated) {
-				set_cvalue (expr, new CCodeElementAccess (get_cvalue (expr.container), cindex));
+				if (array_type.element_type is GenericType) {
+					// generic array
+					// calculate offset in bytes based on value size
+					var value_size = new CCodeFunctionCall (new CCodeIdentifier ("dova_type_get_value_size"));
+					value_size.add_argument (get_type_id_expression (array_type.element_type));
+					set_cvalue (expr, new CCodeBinaryExpression (CCodeBinaryOperator.PLUS, new CCodeCastExpression (get_cvalue (expr.container), "char*"), new CCodeBinaryExpression (CCodeBinaryOperator.MUL, value_size, cindex)));
+				} else {
+					set_cvalue (expr, new CCodeElementAccess (get_cvalue (expr.container), cindex));
+				}
 			} else {
 				generate_property_accessor_declaration (((Property) array_class.scope.lookup ("data")).get_accessor, cfile);
 
diff --git a/codegen/valadovavaluemodule.vala b/codegen/valadovavaluemodule.vala
index 0b6d36e..3f0d287 100644
--- a/codegen/valadovavaluemodule.vala
+++ b/codegen/valadovavaluemodule.vala
@@ -1,6 +1,6 @@
 /* valadovavaluemodule.vala
  *
- * Copyright (C) 2009-2010  Jürg Billeter
+ * Copyright (C) 2009-2011  Jürg Billeter
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
@@ -441,6 +441,29 @@ public class Vala.DovaValueModule : DovaObjectModule {
 		set_cvalue (assignment, ccall);
 	}
 
+	public override void store_variable (Variable variable, TargetValue lvalue, TargetValue value, bool initializer) {
+		var generic_type = lvalue.value_type as GenericType;
+		if (generic_type == null) {
+			base.store_variable (variable, lvalue, value, initializer);
+			return;
+		}
+
+		var ccall = new CCodeFunctionCall (new CCodeIdentifier ("dova_type_value_copy"));
+		if (generic_type.type_parameter.parent_symbol is TypeSymbol) {
+			// generic type
+			ccall.add_argument (new CCodeMemberAccess.pointer (get_type_private_from_type ((ObjectTypeSymbol) generic_type.type_parameter.parent_symbol, new CCodeMemberAccess.pointer (new CCodeIdentifier ("this"), "type")), "%s_type".printf (generic_type.type_parameter.name.down ())));
+		} else {
+			// generic method
+			ccall.add_argument (new CCodeIdentifier ("%s_type".printf (generic_type.type_parameter.name.down ())));
+		}
+		ccall.add_argument (get_cvalue_ (lvalue));
+		ccall.add_argument (new CCodeConstant ("0"));
+		ccall.add_argument (get_cvalue_ (value));
+		ccall.add_argument (new CCodeConstant ("0"));
+
+		ccode.add_expression (ccall);
+	}
+
 	public override void visit_binary_expression (BinaryExpression expr) {
 		var generic_type = expr.left.value_type as GenericType;
 		if (generic_type == null) {



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]