[vala] Fix unsafe C generated when copying array property
- From: Jürg Billeter <juergbi src gnome org>
- To: svn-commits-list gnome org
- Cc:
- Subject: [vala] Fix unsafe C generated when copying array property
- Date: Thu, 11 Feb 2010 20:46:07 +0000 (UTC)
commit ca674a7f476647fdf77e88f69497995625b16d58
Author: Marc-André Lureau <marcandre lureau gmail com>
Date: Sat Jan 23 02:57:32 2010 +0100
Fix unsafe C generated when copying array property
Argument evaluation order is not guaranteed in C.
Fixes bug 607280.
codegen/valaccodebasemodule.vala | 21 +++++++++++++++++----
1 files changed, 17 insertions(+), 4 deletions(-)
---
diff --git a/codegen/valaccodebasemodule.vala b/codegen/valaccodebasemodule.vala
index 57c990d..458f3e3 100644
--- a/codegen/valaccodebasemodule.vala
+++ b/codegen/valaccodebasemodule.vala
@@ -4892,7 +4892,7 @@ internal class Vala.CCodeBaseModule : CCodeModule {
}
}
- public CCodeFunctionCall get_property_set_call (Property prop, MemberAccess ma, CCodeExpression cexpr, Expression? rhs = null) {
+ public CCodeExpression get_property_set_call (Property prop, MemberAccess ma, CCodeExpression cexpr, Expression? rhs = null) {
if (ma.inner is BaseAccess) {
if (prop.base_property != null) {
var base_class = (Class) prop.base_property.parent_symbol;
@@ -4968,9 +4968,22 @@ internal class Vala.CCodeBaseModule : CCodeModule {
ccall.add_argument (prop.get_canonical_cconstant ());
}
- ccall.add_argument (cexpr);
-
var array_type = prop.property_type as ArrayType;
+
+ CCodeExpression rv;
+ if (array_type != null && !prop.no_array_length) {
+ var temp_var = get_temp_variable (prop.property_type, true, null, false);
+ temp_vars.insert (0, temp_var);
+ var ccomma = new CCodeCommaExpression ();
+ ccomma.append_expression (new CCodeAssignment (get_variable_cexpression (temp_var.name), cexpr));
+ ccall.add_argument (get_variable_cexpression (temp_var.name));
+ ccomma.append_expression (ccall);
+ rv = ccomma;
+ } else {
+ ccall.add_argument (cexpr);
+ rv = ccall;
+ }
+
if (array_type != null && !prop.no_array_length && rhs != null) {
for (int dim = 1; dim <= array_type.rank; dim++) {
ccall.add_argument (head.get_array_length_cexpression (rhs, dim));
@@ -4987,7 +5000,7 @@ internal class Vala.CCodeBaseModule : CCodeModule {
ccall.add_argument (new CCodeConstant ("NULL"));
}
- return ccall;
+ return rv;
}
/* indicates whether a given Expression eligable for an ADDRESS_OF operator
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]