From: Luca Bruno Date: Tue, 3 Jan 2012 10:22:18 +0000 (+0100) Subject: Wrapper methods X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=a90d9d5ab12e26594363cd4f50b7fef0cae3ead8;p=thirdparty%2Fvala.git Wrapper methods --- diff --git a/codegen/valagvarianttransformer.vala b/codegen/valagvarianttransformer.vala index 680f4967a..80bb8126a 100644 --- a/codegen/valagvarianttransformer.vala +++ b/codegen/valagvarianttransformer.vala @@ -157,14 +157,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) { @@ -449,9 +466,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); } @@ -472,9 +487,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 1b40f3966..cf2058e70 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_stack = new ArrayList (); + public ArrayList check_nodes = new ArrayList (); + } + + BuildContext build_context; + ArrayList context_stack = new ArrayList (); public SourceReference source_reference; - ArrayList statement_stack = new ArrayList (); - public ArrayList check_nodes = new ArrayList (); 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 = null) { 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); } }