From b9895f6d843d2df8fac8dc1d3d6fd6cbf9a9631f Mon Sep 17 00:00:00 2001 From: Raffaele Sandrini Date: Thu, 16 Aug 2007 09:21:55 +0000 Subject: [PATCH] adapt visit initializer and visit array creation to external visitor check 2007-08-16 Raffaele Sandrini * gobject/valacodegenerator.vala, vala/valacodevisitor.vala, vala/valasemanticanalyzer.vala, vala/valasymbolresolver.vala: adapt visit initializer and visit array creation to external visitor * vala/valamemorymanager.vala: check initializers of array creation expressions for missing ref * vala/valaarraycreationexpression.vala, vala/valainitializerlist.vala: change to external visitor svn path=/trunk/; revision=469 --- ChangeLog | 10 ++++++ gobject/valacodegenerator.vala | 8 +++-- vala/valaarraycreationexpression.vala | 22 ++++++------- vala/valacodevisitor.vala | 22 ++----------- vala/valainitializerlist.vala | 15 ++++----- vala/valamemorymanager.vala | 12 +++++++ vala/valasemanticanalyzer.vala | 59 ++++++++++++++++++----------------- vala/valasymbolresolver.vala | 11 ++++++- 8 files changed, 89 insertions(+), 70 deletions(-) diff --git a/ChangeLog b/ChangeLog index b16b2db..aefac7d 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,13 @@ +2007-08-16 Raffaele Sandrini + + * gobject/valacodegenerator.vala, vala/valacodevisitor.vala, + vala/valasemanticanalyzer.vala, vala/valasymbolresolver.vala: + adapt visit initializer and visit array creation to external visitor + * vala/valamemorymanager.vala: check initializers of array creation + expressions for missing ref + * vala/valaarraycreationexpression.vala, vala/valainitializerlist.vala: + change to external visitor + 2007-08-15 Raffaele Sandrini * vapi/Makefile.am: create gee-1.0 vapi; this makes it possible to diff --git a/gobject/valacodegenerator.vala b/gobject/valacodegenerator.vala index 7ac583b..5b5f67f 100644 --- a/gobject/valacodegenerator.vala +++ b/gobject/valacodegenerator.vala @@ -870,7 +870,9 @@ public class Vala.CodeGenerator : CodeVisitor { decl.active = true; } - public override void visit_end_initializer_list (InitializerList! list) { + public override void visit_initializer_list (InitializerList! list) { + list.accept_children (this); + if (list.expected_type != null && list.expected_type.data_type is Array) { /* TODO */ } else { @@ -1850,7 +1852,9 @@ public class Vala.CodeGenerator : CodeVisitor { * * @param expr an array creation expression */ - public override void visit_end_array_creation_expression (ArrayCreationExpression! expr) { + public override void visit_array_creation_expression (ArrayCreationExpression! expr) { + expr.accept_children (this); + var gnew = new CCodeFunctionCall (new CCodeIdentifier ("g_new0")); gnew.add_argument (new CCodeIdentifier (expr.element_type.get_cname ())); bool first = true; diff --git a/vala/valaarraycreationexpression.vala b/vala/valaarraycreationexpression.vala index 6c6d629..c92ee30 100644 --- a/vala/valaarraycreationexpression.vala +++ b/vala/valaarraycreationexpression.vala @@ -64,24 +64,22 @@ public class Vala.ArrayCreationExpression : Expression { public ArrayCreationExpression (construct TypeReference element_type, construct int rank, construct InitializerList initializer_list, construct SourceReference source_reference) { } - - public override void accept (CodeVisitor! visitor) { + + public override void accept_children (CodeVisitor! visitor) { if (element_type != null) { element_type.accept (visitor); } - - if (sizes != null) { - foreach (Expression e in sizes) { - e.accept (visitor); - } + + foreach (Expression e in sizes) { + e.accept (visitor); } - - visitor.visit_begin_array_creation_expression (this); - + if (initializer_list != null) { initializer_list.accept (visitor); } - - visitor.visit_end_array_creation_expression (this); + } + + public override void accept (CodeVisitor! visitor) { + visitor.visit_array_creation_expression (this); } } diff --git a/vala/valacodevisitor.vala b/vala/valacodevisitor.vala index 9a92c4d..809fa39 100644 --- a/vala/valacodevisitor.vala +++ b/vala/valacodevisitor.vala @@ -264,15 +264,7 @@ public abstract class Vala.CodeVisitor { * * @param list an initializer list */ - public virtual void visit_begin_initializer_list (InitializerList! list) { - } - - /** - * Visit operation called for initializer lists - * - * @param list an initializer list - */ - public virtual void visit_end_initializer_list (InitializerList! list) { + public virtual void visit_initializer_list (InitializerList! list) { } /** @@ -418,21 +410,13 @@ public abstract class Vala.CodeVisitor { */ public virtual void visit_lock_statement (LockStatement! stmt) { } - - /** - * Visit operations called for array creation expresions. - * - * @param expr an array creation expression - */ - public virtual void visit_begin_array_creation_expression (ArrayCreationExpression! expr) { - } - + /** * Visit operations called for array creation expresions. * * @param expr an array creation expression */ - public virtual void visit_end_array_creation_expression (ArrayCreationExpression! expr) { + public virtual void visit_array_creation_expression (ArrayCreationExpression! expr) { } /** diff --git a/vala/valainitializerlist.vala b/vala/valainitializerlist.vala index 6793c10..2cfe088 100644 --- a/vala/valainitializerlist.vala +++ b/vala/valainitializerlist.vala @@ -1,6 +1,6 @@ /* valainitializerlist.vala * - * Copyright (C) 2006-2007 Jürg Billeter + * Copyright (C) 2006-2007 Jürg Billeter, Raffaele Sandrini * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -18,6 +18,7 @@ * * Author: * Jürg Billeter + * Raffaele Sandrini */ using GLib; @@ -55,14 +56,14 @@ public class Vala.InitializerList : Expression { */ public InitializerList (construct SourceReference source_reference) { } - - public override void accept (CodeVisitor! visitor) { - visitor.visit_begin_initializer_list (this); - + + public override void accept_children (CodeVisitor! visitor) { foreach (Expression expr in initializers) { expr.accept (visitor); } - - visitor.visit_end_initializer_list (this); + } + + public override void accept (CodeVisitor! visitor) { + visitor.visit_initializer_list (this); } } diff --git a/vala/valamemorymanager.vala b/vala/valamemorymanager.vala index 7cf7e9f..afd0212 100644 --- a/vala/valamemorymanager.vala +++ b/vala/valamemorymanager.vala @@ -134,6 +134,10 @@ public class Vala.MemoryManager : CodeVisitor { } } + public override void visit_initializer_list (InitializerList! list) { + list.accept_children (this); + } + public override void visit_expression_statement (ExpressionStatement! stmt) { visit_possibly_leaked_expression (stmt.expression); } @@ -167,6 +171,14 @@ public class Vala.MemoryManager : CodeVisitor { clause.accept_children (this); } + public override void visit_array_creation_expression (ArrayCreationExpression! e) { + if (e.initializer_list != null) { + foreach (Expression init in e.initializer_list.get_initializers ()) { + visit_possibly_missing_copy_expression (init); + } + } + } + public override void visit_member_access (MemberAccess! expr) { if (expr.inner != null) { visit_possibly_leaked_expression (expr.inner); diff --git a/vala/valasemanticanalyzer.vala b/vala/valasemanticanalyzer.vala index c474f9b..50ba064 100644 --- a/vala/valasemanticanalyzer.vala +++ b/vala/valasemanticanalyzer.vala @@ -750,7 +750,7 @@ public class Vala.SemanticAnalyzer : CodeVisitor { * * @param list an initializer list */ - public override void visit_begin_initializer_list (InitializerList! list) { + public override void visit_initializer_list (InitializerList! list) { if (list.expected_type != null && list.expected_type.data_type is Array) { /* initializer is used as array initializer */ Array edt = (Array)list.expected_type.data_type; @@ -768,14 +768,9 @@ public class Vala.SemanticAnalyzer : CodeVisitor { e.expected_type = child_type.copy (); } } - } - /** - * Visit operation called for initializer lists - * - * @param list an initializer list - */ - public override void visit_end_initializer_list (InitializerList! list) { + list.accept_children (this); + if (list.expected_type != null && list.expected_type.data_type is Array) { Array edt = (Array)list.expected_type.data_type; var inits = list.get_initializers (); @@ -993,39 +988,45 @@ public class Vala.SemanticAnalyzer : CodeVisitor { ((Lockable) stmt.resource.symbol_reference).set_lock_used (true); } - public override void visit_begin_array_creation_expression (ArrayCreationExpression! expr) { - if (expr.initializer_list != null) { - expr.initializer_list.expected_type = expr.element_type.copy (); - expr.initializer_list.expected_type.data_type = expr.initializer_list.expected_type.data_type.get_array (expr.rank); - // FIXME: add element type to type_argument - } - } - /** * Visit operations called for array creation expresions. * * @param expr an array creation expression */ - public override void visit_end_array_creation_expression (ArrayCreationExpression! expr) { + public override void visit_array_creation_expression (ArrayCreationExpression! expr) { Collection size = expr.get_sizes (); - /* check for errors in the size list */ - if (size != null) { - foreach (Expression e in size) { - if (e.static_type == null) { - /* return on previous error */ - return; - } else if (!(e.static_type.data_type is Struct) || !((Struct) e.static_type.data_type).is_integer_type ()) { - expr.error = true; - Report.error (e.source_reference, "Expression of integer type expected"); - } - } + if (expr.element_type != null) { + expr.element_type.accept (this); + } + + foreach (Expression e in size) { + e.accept (this); + } + + if (expr.initializer_list != null) { + expr.initializer_list.expected_type = expr.element_type.copy (); + expr.initializer_list.expected_type.data_type = expr.initializer_list.expected_type.data_type.get_array (expr.rank); + // FIXME: add element type to type_argument + + expr.initializer_list.accept (this); + } - if (expr.error) { + /* check for errors in the size list */ + foreach (Expression e in size) { + if (e.static_type == null) { + /* return on previous error */ return; + } else if (!(e.static_type.data_type is Struct) || !((Struct) e.static_type.data_type).is_integer_type ()) { + expr.error = true; + Report.error (e.source_reference, "Expression of integer type expected"); } } + if (expr.error) { + return; + } + /* check for wrong elements inside the initializer */ if (expr.initializer_list != null && expr.initializer_list.static_type == null) { return; diff --git a/vala/valasymbolresolver.vala b/vala/valasymbolresolver.vala index e16c2d4..598ee01 100644 --- a/vala/valasymbolresolver.vala +++ b/vala/valasymbolresolver.vala @@ -1,6 +1,6 @@ /* valasymbolresolver.vala * - * Copyright (C) 2006-2007 Jürg Billeter + * Copyright (C) 2006-2007 Jürg Billeter, Raffaele Sandrini * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -18,6 +18,7 @@ * * Author: * Jürg Billeter + * Raffaele Sandrini */ using GLib; @@ -290,6 +291,10 @@ public class Vala.SymbolResolver : CodeVisitor { decl.accept_children (this); } + public override void visit_initializer_list (InitializerList! list) { + list.accept_children (this); + } + public override void visit_throw_statement (ThrowStatement! stmt) { stmt.accept_children (this); } @@ -301,4 +306,8 @@ public class Vala.SymbolResolver : CodeVisitor { public override void visit_catch_clause (CatchClause! clause) { clause.accept_children (this); } + + public override void visit_array_creation_expression (ArrayCreationExpression! e) { + e.accept_children (this); + } } -- 2.7.4