summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLuca Bruno <luca.bruno@immobiliare.it>2014-02-03 14:30:02 +0100
committerRico Tzschichholz <ricotz@ubuntu.com>2019-03-11 13:52:38 +0100
commit701546f33bd5dfb2bb76ffe4869a72e5a62e64eb (patch)
treed587c44f8774018c0f1379437cd0c8a81e009c2b
parent9c77fcac909fdde148373c96d932fd703c743691 (diff)
downloadvala-701546f33bd5dfb2bb76ffe4869a72e5a62e64eb.tar.gz
Use %? in the parser rather than stringifying expressions
-rw-r--r--codegen/valaccodetransformer.vala26
-rw-r--r--codegen/valagvarianttransformer.vala4
-rw-r--r--vala/valacodebuilder.vala8
-rw-r--r--vala/valacodetransformer.vala8
-rw-r--r--vala/valaparser.vala23
5 files changed, 42 insertions, 27 deletions
diff --git a/codegen/valaccodetransformer.vala b/codegen/valaccodetransformer.vala
index 18f64e8e7..d1f3e095e 100644
--- a/codegen/valaccodetransformer.vala
+++ b/codegen/valaccodetransformer.vala
@@ -174,7 +174,7 @@ public class Vala.CCodeTransformer : CodeTransformer {
if (!always_false (stmt.condition)) {
b.open_loop ();
if (!always_true (stmt.condition)) {
- var cond = expression (@"!$(stmt.condition)");
+ var cond = expression ("!%?", {stmt.condition});
b.open_if (cond);
b.add_break ();
b.close ();
@@ -231,7 +231,7 @@ public class Vala.CCodeTransformer : CodeTransformer {
b.close ();
if (stmt.condition != null && !always_true (stmt.condition)) {
- statements (@"if (!$(stmt.condition)) break;");
+ statements ("if (!%?) break;", {stmt.condition});
}
b.add_statement (stmt.body);
@@ -378,11 +378,11 @@ public class Vala.CCodeTransformer : CodeTransformer {
begin_replace_expression (expr);
var result = b.add_temp_declaration (expr.value_type);
- statements (@"if ($(expr.condition)) {
- $result = $(expr.true_expression);
+ statements (@"if (%?) {
+ $result = %?;
} else {
- $result = $(expr.false_expression);
- }");
+ $result = %?;
+ }", {expr.condition, expr.true_expression, expr.false_expression});
replacement = return_temp_access (result, expr.value_type, target_type, formal_target_type);
end_replace_expression (replacement);
@@ -407,11 +407,11 @@ public class Vala.CCodeTransformer : CodeTransformer {
if (is_and) {
b.add_assignment (expression (result), expr.right);
} else {
- b.add_expression (expression (@"$result = true"));
+ statements (@"$result = true;");
}
b.add_else ();
if (is_and) {
- b.add_expression (expression (@"$result = false"));
+ statements (@"$result = false;");
} else {
b.add_assignment (expression (result), expr.right);
}
@@ -420,9 +420,7 @@ public class Vala.CCodeTransformer : CodeTransformer {
} else if (expr.operator == BinaryOperator.COALESCE) {
var result = b.add_temp_declaration (copy_type (expr.value_type), expr.left);
- b.open_if (expression (@"$result == null"));
- b.add_assignment (expression (result), expr.right);
- b.close ();
+ statements (@"if ($result == null) { $result = %?; }", {expr.right});
replacement = return_temp_access (result, expr.value_type, target_type);
} 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)) {
@@ -494,7 +492,7 @@ public class Vala.CCodeTransformer : CodeTransformer {
if (expr.value_type.data_type != null && expr.value_type.data_type.is_subtype_of (context.analyzer.string_type.data_type)) {
return expr;
} else {
- return expression (@"$expr.to_string ()");
+ return expression (@"%?.to_string ()", {expr});
}
}
@@ -509,7 +507,7 @@ public class Vala.CCodeTransformer : CodeTransformer {
} else {
replacement = stringify (expression_list[0]);
if (expression_list.size > 1) {
- var concat = (MethodCall) expression (@"$replacement.concat()");
+ var concat = (MethodCall) expression ("%?.concat()", {replacement});
for (int i = 1; i < expression_list.size; i++) {
concat.add_argument (stringify (expression_list[i]));
}
@@ -526,7 +524,7 @@ public class Vala.CCodeTransformer : CodeTransformer {
var result = b.add_temp_declaration (copy_type (expr.value_type), expr.inner);
var op = expr.increment ? "+ 1" : "- 1";
- b.add_expression (expression (@"$(expr.inner) = $result $op"));
+ statements (@"$(expr.inner) = $result $op;");
var replacement = return_temp_access (result, expr.value_type, expr.target_type);
diff --git a/codegen/valagvarianttransformer.vala b/codegen/valagvarianttransformer.vala
index 6a77ea22d..30fe2be7d 100644
--- a/codegen/valagvarianttransformer.vala
+++ b/codegen/valagvarianttransformer.vala
@@ -367,7 +367,7 @@ public class Vala.GVariantTransformer : CCodeTransformer {
m.add_parameter (new Parameter ("variant", data_type ("GLib.Variant", false), b.source_reference));
push_builder (new CodeBuilder.for_subroutine (m));
- var iterator = b.add_temp_declaration (data_type ("GLib.VariantIter"), expression (@"variant.iterator ()"));
+ var iterator = b.add_temp_declaration (data_type ("GLib.VariantIter"), expression ("variant.iterator ()"));
var result = b.add_temp_declaration (type, expression ("{}"));
@@ -397,7 +397,7 @@ public class Vala.GVariantTransformer : CCodeTransformer {
m.add_parameter (new Parameter ("variant", data_type ("GLib.Variant", false), b.source_reference));
push_builder (new CodeBuilder.for_subroutine (m));
- var iterator = b.add_temp_declaration (data_type ("GLib.VariantIter"), expression (@"variant.iterator ()"));
+ var iterator = b.add_temp_declaration (data_type ("GLib.VariantIter"), expression ("variant.iterator ()"));
var type_args = type.get_type_arguments ();
assert (type_args.size == 2);
diff --git a/vala/valacodebuilder.vala b/vala/valacodebuilder.vala
index 036303cb9..a79abd53f 100644
--- a/vala/valacodebuilder.vala
+++ b/vala/valacodebuilder.vala
@@ -268,12 +268,12 @@ public class Vala.CodeBuilder {
/* Utilities for building the code */
- public Expression expression (string str) {
- return new Parser().parse_expression_string (str, source_reference);
+ public Expression expression (string str, owned Expression[]? replacements = null) {
+ return new Parser().parse_expression_string (str, (owned) replacements, source_reference);
}
- public void statements (string str) {
- new Parser().parse_statements_string (str, current_block, source_reference);
+ public void statements (string str, owned Expression[]? replacements = null) {
+ new Parser().parse_statements_string (str, current_block, (owned) replacements, source_reference);
}
// only qualified types, will slightly simplify the work of SymbolResolver
diff --git a/vala/valacodetransformer.vala b/vala/valacodetransformer.vala
index f6444b8e9..0f5333dcf 100644
--- a/vala/valacodetransformer.vala
+++ b/vala/valacodetransformer.vala
@@ -180,12 +180,12 @@ public class Vala.CodeTransformer : CodeVisitor {
return CodeBuilder.data_type (s, value_owned, nullable);
}
- public Expression expression (string str) {
- return b.expression (str);
+ public Expression expression (string str, Expression[]? replacements = null) {
+ return b.expression (str, replacements);
}
- public void statements (string str) {
- b.statements (str);
+ public void statements (string str, owned Expression[]? replacements = null) {
+ b.statements (str, (owned) replacements);
}
public void check (CodeNode node) {
diff --git a/vala/valaparser.vala b/vala/valaparser.vala
index fdeedb7dc..dc10c33d5 100644
--- a/vala/valaparser.vala
+++ b/vala/valaparser.vala
@@ -31,6 +31,8 @@ public class Vala.Parser : CodeVisitor {
CodeContext context;
bool compiler_code = false;
SourceReference? from_string_reference = null;
+ Expression[]? replacements = null;
+ int replacement_index = 0;
// token buffer
TokenInfo[] tokens;
@@ -337,10 +339,12 @@ public class Vala.Parser : CodeVisitor {
}
}
- public Expression? parse_expression_string (string str, SourceReference source_reference) {
+ public Expression? parse_expression_string (string str, owned Expression[]? replacements, SourceReference source_reference) {
compiler_code = true;
context = source_reference.file.context;
from_string_reference = source_reference;
+ this.replacements = (owned) replacements;
+ replacement_index = 0;
scanner = new Scanner.from_string (str, source_reference.file);
index = -1;
@@ -358,10 +362,12 @@ public class Vala.Parser : CodeVisitor {
return null;
}
- public void parse_statements_string (string str, Block block, SourceReference source_reference) {
+ public void parse_statements_string (string str, Block block, owned Expression[]? replacements, SourceReference source_reference) {
compiler_code = true;
context = source_reference.file.context;
from_string_reference = source_reference;
+ this.replacements = (owned) replacements;
+ replacement_index = 0;
scanner = new Scanner.from_string (str, source_reference.file);
index = -1;
@@ -704,7 +710,18 @@ public class Vala.Parser : CodeVisitor {
expr = parse_typeof_expression ();
break;
default:
- expr = parse_simple_name ();
+ if (compiler_code && current () == TokenType.PERCENT) {
+ var begin2 = get_location ();
+ next ();
+ if (accept (TokenType.INTERR)) {
+ expr = replacements[replacement_index++];
+ } else {
+ rollback (begin2);
+ expr = parse_simple_name ();
+ }
+ } else {
+ expr = parse_simple_name ();
+ }
break;
}