summaryrefslogtreecommitdiff
path: root/vala
diff options
context:
space:
mode:
authorJürg Billeter <j@bitron.ch>2010-10-29 08:01:32 +0200
committerJürg Billeter <j@bitron.ch>2010-10-29 08:01:32 +0200
commitd540dfd41156d01f530bfaa9121c19fdc6b25421 (patch)
tree2f2ec2f76ae5a2378e490b9e067df18d9952f1d8 /vala
parentfb3a31632feda7c36473037dd2e513850e7210de (diff)
downloadvala-d540dfd41156d01f530bfaa9121c19fdc6b25421.tar.gz
Add Subroutine class
Diffstat (limited to 'vala')
-rw-r--r--vala/Makefile.am1
-rw-r--r--vala/valaconstructor.vala7
-rw-r--r--vala/valadestructor.vala7
-rw-r--r--vala/valaflowanalyzer.vala50
-rw-r--r--vala/valamethod.vala24
-rw-r--r--vala/valapropertyaccessor.vala27
-rw-r--r--vala/valasubroutine.vala50
7 files changed, 63 insertions, 103 deletions
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<TypeParameter> 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
@@ -160,11 +144,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.
*/
public double cinstance_parameter_position { get; set; }
@@ -243,7 +222,6 @@ public class Vala.Method : Symbol {
private List<Expression> preconditions;
private List<Expression> 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.
*/
@@ -63,25 +63,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
*/
public bool automatic_body { get; set; }
@@ -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 <j@bitron.ch>
+ */
+
+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;
+ }
+ }
+ }
+}