[vala/wip/transform: 23/100] Wrapper methods
- From: Luca Bruno <lucabru src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [vala/wip/transform: 23/100] Wrapper methods
- Date: Sun, 9 Feb 2014 10:42:52 +0000 (UTC)
commit 998e0ccd3d8a559483e79022a1cbd3a23bdcd4ed
Author: Luca Bruno <lucabru src gnome org>
Date: Tue Jan 3 11:22:18 2012 +0100
Wrapper methods
codegen/valagvarianttransformer.vala | 29 +++++++---
vala/valacodebuilder.vala | 110 ++++++++++++++++++++-------------
vala/valastatementlist.vala | 9 +++
3 files changed, 97 insertions(+), 51 deletions(-)
---
diff --git a/codegen/valagvarianttransformer.vala b/codegen/valagvarianttransformer.vala
index 32377c1..e2b71c7 100644
--- a/codegen/valagvarianttransformer.vala
+++ b/codegen/valagvarianttransformer.vala
@@ -155,14 +155,31 @@ public class Vala.GVariantTransformer : CodeTransformer {
return ret;
}
+ Method wrapper_method (DataType return_type) {
+ var name = CodeNode.get_temp_name ().replace (".", "");
+ name = "_vala_func_"+name;
+ var m = new Method (name, return_type, b.source_reference);
+ context.root.add_method (m);
+ m.access = SymbolAccessibility.PRIVATE;
+ return m;
+ }
+
Expression serialize_array (ArrayType array_type, Expression array_expr) {
- string temp = b.add_temp_declaration (array_type, array_expr);
+ var m = wrapper_method (data_type ("GLib.Variant", true));
+ m.add_parameter (new Parameter ("array", copy_type (array_type, false), b.source_reference));
+ b.push_method (m);
string[] indices = new string[array_type.rank];
for (int dim=1; dim <= array_type.rank; dim++) {
indices[dim-1] = b.add_temp_declaration (null, new IntegerLiteral ("0"));
}
- return serialize_array_dim (array_type, 1, indices, temp);
+ b.add_return (serialize_array_dim (array_type, 1, indices, "array"));
+
+ b.pop_method ();
+ check (m);
+ var call = (MethodCall) expression (m.name+"()");
+ call.add_argument (array_expr);
+ return call;
}
Expression serialize_array_dim (ArrayType array_type, int dim, string[] indices, string array_var) {
@@ -447,9 +464,7 @@ public class Vala.GVariantTransformer : CodeTransformer {
result.target_type = target_type;
context.analyzer.replaced_nodes.add (expr);
old_parent_node.replace_expression (expr, result);
- foreach (var node in b.check_nodes) {
- check (node);
- }
+ b.check (this);
check (result);
}
@@ -470,9 +485,7 @@ public class Vala.GVariantTransformer : CodeTransformer {
result.target_type = target_type;
context.analyzer.replaced_nodes.add (expr);
old_parent_node.replace_expression (expr, result);
- foreach (var node in b.check_nodes) {
- check (node);
- }
+ b.check (this);
check (result);
}
}
diff --git a/vala/valacodebuilder.vala b/vala/valacodebuilder.vala
index c15fc05..c04bf28 100644
--- a/vala/valacodebuilder.vala
+++ b/vala/valacodebuilder.vala
@@ -23,87 +23,111 @@
using GLib;
public class Vala.CodeBuilder {
- Block current_block;
- Statement insert_statement;
- Block insert_block;
+ class BuildContext {
+ public Block current_block;
+ public Statement insert_statement;
+ public Block insert_block;
+ public ArrayList<Statement> statement_stack = new ArrayList<Statement> ();
+ public ArrayList<CodeNode> check_nodes = new ArrayList<CodeNode> ();
+ }
+
+ BuildContext build_context;
+ ArrayList<BuildContext> context_stack = new ArrayList<BuildContext> ();
public SourceReference source_reference;
- ArrayList<Statement> statement_stack = new ArrayList<Statement> ();
- public ArrayList<CodeNode> check_nodes = new ArrayList<CodeNode> ();
public CodeBuilder (CodeContext context, Statement insert_statement, SourceReference
source_reference) {
- this.current_block = new Block (source_reference);
- this.insert_statement = insert_statement;
- this.insert_block = context.analyzer.get_insert_block (insert_statement);
+ build_context = new BuildContext ();
+ build_context.current_block = new Block (source_reference);
+ build_context.insert_statement = insert_statement;
+ build_context.insert_block = context.analyzer.get_insert_block (insert_statement);
this.source_reference = source_reference;
var statement_block = context.analyzer.get_current_block (insert_statement);
- statement_block.insert_before (insert_statement, current_block);
- this.insert_statement = current_block;
+ statement_block.insert_before (build_context.insert_statement, build_context.current_block);
+ build_context.insert_statement = build_context.current_block;
+ build_context.check_nodes.add (build_context.current_block);
+ }
+
+ public void check (CodeTransformer transformer) {
+ foreach (var node in build_context.check_nodes) {
+ transformer.check (node);
+ }
+ }
+
+ public void push_method (Method m) {
+ context_stack.add (build_context);
+ build_context = new BuildContext ();
+ build_context.insert_block = m.body = new Block (source_reference);
+ build_context.insert_statement = build_context.current_block = new Block (source_reference);
+ m.body.add_statement (build_context.current_block);
+ }
- check_nodes.add (current_block);
+ public void pop_method () {
+ build_context = context_stack[context_stack.size - 1];
+ context_stack.remove_at (context_stack.size - 1);
}
public void open_block () {
- statement_stack.add (current_block);
- var parent_block = current_block;
+ build_context.statement_stack.add (build_context.current_block);
+ var parent_block = build_context.current_block;
- current_block = new Block (source_reference);
+ build_context.current_block = new Block (source_reference);
- parent_block.add_statement (current_block);
+ parent_block.add_statement (build_context.current_block);
}
public void open_if (Expression condition) {
- statement_stack.add (current_block);
- var parent_block = current_block;
+ build_context.statement_stack.add (build_context.current_block);
+ var parent_block = build_context.current_block;
- current_block = new Block (source_reference);
+ build_context.current_block = new Block (source_reference);
- var stmt = new IfStatement (condition, current_block, null, source_reference);
- statement_stack.add (stmt);
+ var stmt = new IfStatement (condition, build_context.current_block, null, source_reference);
+ build_context.statement_stack.add (stmt);
parent_block.add_statement (stmt);
}
public void add_else () {
- current_block = new Block (source_reference);
+ build_context.current_block = new Block (source_reference);
- var stmt = (IfStatement) statement_stack[statement_stack.size-1];
+ var stmt = (IfStatement) build_context.statement_stack[build_context.statement_stack.size-1];
assert (stmt.false_statement == null);
- stmt.false_statement = current_block;
+ stmt.false_statement = build_context.current_block;
}
public void else_if (Expression condition) {
- var parent_if = (IfStatement) statement_stack[statement_stack.size - 1];
+ var parent_if = (IfStatement)
build_context.statement_stack[build_context.statement_stack.size - 1];
assert (parent_if.false_statement == null);
- statement_stack.remove_at (statement_stack.size - 1);
+ build_context.statement_stack.remove_at (build_context.statement_stack.size - 1);
- current_block = new Block (source_reference);
+ build_context.current_block = new Block (source_reference);
- var stmt = new IfStatement (condition, current_block, null, source_reference);
+ var stmt = new IfStatement (condition, build_context.current_block, null, source_reference);
var block = new Block (source_reference);
block.add_statement (stmt);
parent_if.false_statement = block;
- statement_stack.add (stmt);
+ build_context.statement_stack.add (stmt);
}
public void open_while (Expression condition) {
- statement_stack.add (current_block);
- var parent_block = current_block;
+ build_context.statement_stack.add (build_context.current_block);
+ var parent_block = build_context.current_block;
- current_block = new Block (source_reference);
+ build_context.current_block = new Block (source_reference);
- var stmt = new WhileStatement (condition, current_block, source_reference);
+ var stmt = new WhileStatement (condition, build_context.current_block, source_reference);
parent_block.add_statement (stmt);
}
public void open_for (Expression? initializer, Expression condition, Expression? iterator) {
- statement_stack.add (current_block);
- var parent_block = current_block;
+ build_context.statement_stack.add (build_context.current_block);
+ var parent_block = build_context.current_block;
- current_block = new Block (source_reference);
+ build_context.current_block = new Block (source_reference);
- var stmt = new ForStatement (condition, current_block, source_reference);
+ var stmt = new ForStatement (condition, build_context.current_block, source_reference);
if (initializer != null) {
stmt.add_initializer (initializer);
}
@@ -115,7 +139,7 @@ public class Vala.CodeBuilder {
}
public void add_statement (Statement statement) {
- current_block.add_statement (statement);
+ build_context.current_block.add_statement (statement);
}
public void add_expression (Expression expression) {
@@ -141,16 +165,16 @@ public class Vala.CodeBuilder {
public string add_temp_declaration (DataType? type, Expression? initializer) {
var local = new LocalVariable (type, CodeNode.get_temp_name (), initializer,
source_reference);
var stmt = new DeclarationStatement (local, source_reference);
- insert_block.insert_before (insert_statement, stmt);
- check_nodes.insert (0, stmt);
+ build_context.insert_block.insert_before (build_context.insert_statement, stmt);
+ build_context.check_nodes.insert (0, stmt);
return local.name;
}
public void close () {
do {
- var top = statement_stack[statement_stack.size - 1];
- statement_stack.remove_at (statement_stack.size - 1);
- current_block = top as Block;
- } while (current_block == null);
+ var top = build_context.statement_stack[build_context.statement_stack.size - 1];
+ build_context.statement_stack.remove_at (build_context.statement_stack.size - 1);
+ build_context.current_block = top as Block;
+ } while (build_context.current_block == null);
}
}
diff --git a/vala/valastatementlist.vala b/vala/valastatementlist.vala
index 5159598..f773a5c 100644
--- a/vala/valastatementlist.vala
+++ b/vala/valastatementlist.vala
@@ -60,6 +60,15 @@ public class Vala.StatementList : CodeNode, Statement {
}
}
+ public override bool check (CodeContext context) {
+ foreach (Statement stmt in list) {
+ if (!stmt.check (context)) {
+ return false;
+ }
+ }
+ return true;
+ }
+
public override void emit (CodeGenerator codegen) {
foreach (Statement stmt in list) {
stmt.emit (codegen);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]