[vala] dova: Fix assignment to variables of generic type
- From: Jürg Billeter <juergbi src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [vala] dova: Fix assignment to variables of generic type
- Date: Thu, 7 Apr 2011 20:27:57 +0000 (UTC)
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]