From: Jürg Billeter Date: Fri, 29 Oct 2010 06:01:32 +0000 (+0200) Subject: Add Subroutine class X-Git-Tag: 0.11.2~62 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=d540dfd41156d01f530bfaa9121c19fdc6b25421;p=thirdparty%2Fvala.git Add Subroutine class --- diff --git a/vala/Makefile.am b/vala/Makefile.am index e66e992eb..b20c8328e 100644 --- a/vala/Makefile.am +++ b/vala/Makefile.am @@ -136,6 +136,7 @@ libvalacore_la_VALASOURCES = \ valastringliteral.vala \ valastruct.vala \ valastructvaluetype.vala \ + valasubroutine.vala \ valaswitchlabel.vala \ valaswitchsection.vala \ valaswitchstatement.vala \ diff --git a/vala/valaconstructor.vala b/vala/valaconstructor.vala index 05a86711c..6c6d9ddec 100644 --- a/vala/valaconstructor.vala +++ b/vala/valaconstructor.vala @@ -25,12 +25,7 @@ using GLib; /** * Represents a class or instance constructor. */ -public class Vala.Constructor : Symbol { - /** - * The body of this constructor. - */ - public Block body { get; set; } - +public class Vala.Constructor : Subroutine { /** * Specifies the generated `this` parameter for instance methods. */ diff --git a/vala/valadestructor.vala b/vala/valadestructor.vala index 79b93b5b7..b051ca5a0 100644 --- a/vala/valadestructor.vala +++ b/vala/valadestructor.vala @@ -25,12 +25,7 @@ using GLib; /** * Represents a class or instance destructor. */ -public class Vala.Destructor : Symbol { - /** - * The body of this constructor. - */ - public Block body { get; set; } - +public class Vala.Destructor : Subroutine { /** * Specifies the generated `this` parameter for instance methods. */ diff --git a/vala/valaflowanalyzer.vala b/vala/valaflowanalyzer.vala index 148cc9c68..da9c33500 100644 --- a/vala/valaflowanalyzer.vala +++ b/vala/valaflowanalyzer.vala @@ -173,6 +173,10 @@ public class Vala.FlowAnalyzer : CodeVisitor { } } + visit_subroutine (m); + } + + void visit_subroutine (Subroutine m) { if (m.body == null) { return; } @@ -183,7 +187,7 @@ public class Vala.FlowAnalyzer : CodeVisitor { m.return_block.connect (m.exit_block); - if (context.profile == Profile.DOVA && !(m.return_type is VoidType)) { + if (context.profile == Profile.DOVA && m.result_var != null) { // ensure result is defined at end of method var result_ma = new MemberAccess.simple ("result", m.source_reference); result_ma.symbol_reference = m.result_var; @@ -204,8 +208,8 @@ public class Vala.FlowAnalyzer : CodeVisitor { if (current_block != null) { // end of method body reachable - if (context.profile != Profile.DOVA && !(m.return_type is VoidType)) { - Report.error (m.source_reference, "missing return statement at end of method or lambda body"); + if (context.profile != Profile.DOVA && m.result_var != null) { + Report.error (m.source_reference, "missing return statement at end of subroutine body"); m.error = true; } @@ -499,45 +503,7 @@ public class Vala.FlowAnalyzer : CodeVisitor { } public override void visit_property_accessor (PropertyAccessor acc) { - if (acc.body == null) { - return; - } - - acc.entry_block = new BasicBlock.entry (); - acc.return_block = new BasicBlock (); - acc.exit_block = new BasicBlock.exit (); - - acc.return_block.connect (acc.exit_block); - - if (context.profile == Profile.DOVA && acc.readable) { - // ensure result is defined at end of method - var result_ma = new MemberAccess.simple ("result", acc.source_reference); - result_ma.symbol_reference = acc.result_var; - acc.return_block.add_node (result_ma); - } - - current_block = new BasicBlock (); - acc.entry_block.connect (current_block); - - jump_stack.add (new JumpTarget.return_target (acc.return_block)); - jump_stack.add (new JumpTarget.exit_target (acc.exit_block)); - - acc.accept_children (this); - - jump_stack.remove_at (jump_stack.size - 1); - - if (current_block != null) { - // end of property accessor body reachable - - if (context.profile != Profile.DOVA && acc.readable) { - Report.error (acc.source_reference, "missing return statement at end of property getter body"); - acc.error = true; - } - - current_block.connect (acc.return_block); - } - - analyze_body (acc.entry_block); + visit_subroutine (acc); } public override void visit_block (Block b) { diff --git a/vala/valamethod.vala b/vala/valamethod.vala index f8fe91633..e86741c01 100644 --- a/vala/valamethod.vala +++ b/vala/valamethod.vala @@ -27,7 +27,7 @@ using GLib; /** * Represents a type or namespace method. */ -public class Vala.Method : Symbol { +public class Vala.Method : Subroutine { List type_parameters; public const string DEFAULT_SENTINEL = "NULL"; @@ -42,22 +42,6 @@ public class Vala.Method : Symbol { _return_type.parent_node = this; } } - - public Block body { - get { return _body; } - set { - _body = value; - if (_body != null) { - _body.owner = scope; - } - } - } - - public BasicBlock entry_block { get; set; } - - public BasicBlock return_block { get; set; } - - public BasicBlock exit_block { get; set; } /** * Specifies whether this method may only be called with an instance of @@ -159,11 +143,6 @@ public class Vala.Method : Symbol { */ public Parameter this_parameter { get; set; } - /** - * Specifies the generated `result` variable for postconditions. - */ - public LocalVariable result_var { get; set; } - /** * Specifies the position of the instance parameter in the C function. */ @@ -243,7 +222,6 @@ public class Vala.Method : Symbol { private List preconditions; private List postconditions; private DataType _return_type; - private Block _body; private weak Method _base_method; private Method _base_interface_method; diff --git a/vala/valapropertyaccessor.vala b/vala/valapropertyaccessor.vala index 5579e8bd9..678eb4cf9 100644 --- a/vala/valapropertyaccessor.vala +++ b/vala/valapropertyaccessor.vala @@ -25,7 +25,7 @@ using GLib; /** * Represents a get or set accessor of a property in the source code. */ -public class Vala.PropertyAccessor : Symbol { +public class Vala.PropertyAccessor : Subroutine { /** * The corresponding property. */ @@ -62,25 +62,6 @@ public class Vala.PropertyAccessor : Symbol { */ public bool construction { get; set; } - /** - * The accessor body. - */ - public Block? body { - get { return _body; } - set { - _body = value; - if (_body != null) { - _body.owner = scope; - } - } - } - - public BasicBlock entry_block { get; set; } - - public BasicBlock return_block { get; set; } - - public BasicBlock exit_block { get; set; } - /** * True if the body was automatically generated */ @@ -91,11 +72,6 @@ public class Vala.PropertyAccessor : Symbol { */ public Parameter value_parameter { get; set; } - /** - * Specifies the generated `result' variable in a get accessor. - */ - public LocalVariable? result_var { get; set; } - public virtual string get_default_cname () { var t = (TypeSymbol) prop.parent_symbol; @@ -119,7 +95,6 @@ public class Vala.PropertyAccessor : Symbol { private DataType _value_type; private string? _cname; - private Block _body; /** * Creates a new property accessor. diff --git a/vala/valasubroutine.vala b/vala/valasubroutine.vala new file mode 100644 index 000000000..c481d1594 --- /dev/null +++ b/vala/valasubroutine.vala @@ -0,0 +1,50 @@ +/* valasubroutine.vala + * + * Copyright (C) 2010 Jürg Billeter + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * Author: + * Jürg Billeter + */ + +public abstract class Vala.Subroutine : Symbol { + Block _body; + + public BasicBlock entry_block { get; set; } + + public BasicBlock return_block { get; set; } + + public BasicBlock exit_block { get; set; } + + /** + * Specifies the generated `result` variable for postconditions. + */ + public LocalVariable result_var { get; set; } + + protected Subroutine (string? name, SourceReference? source_reference, Comment? comment = null) { + base (name, source_reference, comment); + } + + public Block body { + get { return _body; } + set { + _body = value; + if (_body != null) { + _body.owner = scope; + } + } + } +}