[vala/wip/transform] Fix coalescing operator
- From: Luca Bruno <lucabru src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [vala/wip/transform] Fix coalescing operator
- Date: Sat, 1 Feb 2014 09:22:58 +0000 (UTC)
commit 95c0c83ba0ef6aa086a8ff266939729c9ca83539
Author: Luca Bruno <lucabru src gnome org>
Date: Fri Jan 31 00:10:57 2014 +0100
Fix coalescing operator
codegen/valaccodetransformer.vala | 26 ++++++++++++++++++--------
vala/valabinaryexpression.vala | 2 +-
vala/valacodetransformer.vala | 6 +++++-
vala/valaconditionalexpression.vala | 2 +-
4 files changed, 25 insertions(+), 11 deletions(-)
---
diff --git a/codegen/valaccodetransformer.vala b/codegen/valaccodetransformer.vala
index 6473a99..8e28b1f 100644
--- a/codegen/valaccodetransformer.vala
+++ b/codegen/valaccodetransformer.vala
@@ -369,15 +369,15 @@ public class Vala.CCodeTransformer : CodeTransformer {
} else {
// store parent_node as we need to replace the expression in the old parent
node later on
var old_parent_node = expr.parent_node;
- var formal_target_type = expr.target_type != null ? expr.target_type.copy ()
: null;
- var target_type = expr.target_type != null ? expr.target_type.copy () : null;
+ var formal_target_type = copy_type (expr.target_type);
+ var target_type = copy_type (expr.target_type);
push_builder (new CodeBuilder (context, expr.parent_statement,
expr.source_reference));
// FIXME: use create_temp_access behavior
- var replacement = expression (b.add_temp_declaration (expr.value_type.copy
(), expr, true));
+ var replacement = expression (b.add_temp_declaration (copy_type
(expr.value_type), expr, true));
- replacement.target_type = target_type.copy ();
- replacement.formal_target_type = formal_target_type.copy ();
+ replacement.target_type = copy_type (target_type);
+ replacement.formal_target_type = copy_type (formal_target_type);
context.analyzer.replaced_nodes.add (expr);
old_parent_node.replace_expression (expr, replacement);
b.check (this);
@@ -391,8 +391,8 @@ public class Vala.CCodeTransformer : CodeTransformer {
// convert to if statement
Expression replacement = null;
var old_parent_node = expr.parent_node;
- var formal_target_type = expr.target_type != null ? expr.target_type.copy () : null;
- var target_type = expr.target_type != null ? expr.target_type.copy () : null;
+ var formal_target_type = copy_type (expr.target_type);
+ var target_type = copy_type (expr.target_type);
push_builder (new CodeBuilder (context, expr.parent_statement, expr.source_reference));
var result = b.add_temp_declaration (expr.value_type);
@@ -443,7 +443,13 @@ public class Vala.CCodeTransformer : CodeTransformer {
b.close ();
replacement = expression (result);
} else if (expr.operator == BinaryOperator.COALESCE) {
- replacement = new ConditionalExpression (new BinaryExpression
(BinaryOperator.EQUALITY, expr.left, new NullLiteral (expr.source_reference), expr.source_reference),
expr.right, expr.left, expr.source_reference);
+ var is_owned = expr.left.value_type.value_owned || expr.right.value_type.value_owned;
+ var result = b.add_temp_declaration (copy_type (expr.value_type, is_owned, true),
expr.left);
+
+ b.open_if (expression (@"$result == null"));
+ b.add_assignment (expression (result), expr.right);
+ b.close ();
+ replacement = expression (result);
} else if (expr.operator == BinaryOperator.IN && !(expr.left.value_type.compatible
(context.analyzer.int_type) && expr.right.value_type.compatible (context.analyzer.int_type)) &&
!(expr.right.value_type is ArrayType)) {
// neither enums nor array, it's contains()
var call = new MethodCall (new MemberAccess (expr.right, "contains",
expr.source_reference), expr.source_reference);
@@ -519,4 +525,8 @@ public class Vala.CCodeTransformer : CodeTransformer {
}
}
}
+
+ public override void visit_assignment (Assignment a) {
+ a.accept_children (this);
+ }
}
diff --git a/vala/valabinaryexpression.vala b/vala/valabinaryexpression.vala
index a64c074..2ad874a 100644
--- a/vala/valabinaryexpression.vala
+++ b/vala/valabinaryexpression.vala
@@ -126,7 +126,7 @@ public class Vala.BinaryExpression : Expression {
}
public override string to_string () {
- return _left.to_string () + get_operator_string () + _right.to_string ();
+ return "(" + _left.to_string () + " " + get_operator_string () + " " + _right.to_string () +
")";
}
public override bool is_constant () {
diff --git a/vala/valacodetransformer.vala b/vala/valacodetransformer.vala
index 1c559a6..8726552 100644
--- a/vala/valacodetransformer.vala
+++ b/vala/valacodetransformer.vala
@@ -63,7 +63,11 @@ public class Vala.CodeTransformer : CodeVisitor {
}
}
- public static DataType copy_type (DataType type, bool? value_owned = null, bool? nullable = null) {
+ public static DataType? copy_type (DataType? type, bool? value_owned = null, bool? nullable = null) {
+ if (type == null) {
+ return null;
+ }
+
var ret = type.copy ();
if (value_owned != null) {
ret.value_owned = value_owned;
diff --git a/vala/valaconditionalexpression.vala b/vala/valaconditionalexpression.vala
index f3da484..5658373 100644
--- a/vala/valaconditionalexpression.vala
+++ b/vala/valaconditionalexpression.vala
@@ -101,7 +101,7 @@ public class Vala.ConditionalExpression : Expression {
}
public override string to_string () {
- return "%s ? %s : %s".printf (condition.to_string (), true_expression.to_string (),
false_expression.to_string ());
+ return "(%s ? %s : %s)".printf (condition.to_string (), true_expression.to_string (),
false_expression.to_string ());
}
public override void replace_expression (Expression old_node, Expression new_node) {
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]