[vala] Improve flow analysis of catch clauses
- From: Jürg Billeter <juergbi src gnome org>
- To: svn-commits-list gnome org
- Subject: [vala] Improve flow analysis of catch clauses
- Date: Mon, 30 Mar 2009 17:44:43 -0400 (EDT)
commit 0390e89c3151bdbfe48444c0e9ee8fdb006aafd7
Author: Thijs Vermeir <thijsvermeir gmail com>
Date: Tue Mar 17 20:33:38 2009 +0100
Improve flow analysis of catch clauses
Duplicated catch clauses for the same error are detected as an error
and unreachable catch clauses due to preceding catch clauses are
reported with a warning.
---
vala/valaflowanalyzer.vala | 26 +++++++++++++++++++++++---
1 files changed, 23 insertions(+), 3 deletions(-)
diff --git a/vala/valaflowanalyzer.vala b/vala/valaflowanalyzer.vala
index 06b79f8..621ce4b 100644
--- a/vala/valaflowanalyzer.vala
+++ b/vala/valaflowanalyzer.vala
@@ -130,8 +130,8 @@ public class Vala.FlowAnalyzer : CodeVisitor {
public override void visit_method (Method m) {
if (m.is_library_internal_symbol () && !m.used && !m.entry_point
- && !m.overrides && (m.base_interface_method == null || m.base_interface_method == m)
- && !(m is CreationMethod)) {
+ && !m.overrides && (m.base_interface_method == null || m.base_interface_method == m)
+ && !(m is CreationMethod)) {
Report.warning (m.source_reference, "method `%s' never used".printf (m.get_full_name ()));
}
@@ -1014,7 +1014,8 @@ public class Vala.FlowAnalyzer : CodeVisitor {
for (int i = catch_clauses.size - 1; i >= 0; i--) {
var catch_clause = catch_clauses[i];
if (catch_clause.error_type != null) {
- jump_stack.add (new JumpTarget.error_target (new BasicBlock (), catch_clause, catch_clause.error_type.data_type as ErrorDomain, null));
+ var error_type = catch_clause.error_type as ErrorType;
+ jump_stack.add (new JumpTarget.error_target (new BasicBlock (), catch_clause, catch_clause.error_type.data_type as ErrorDomain, error_type.error_code));
} else {
jump_stack.add (new JumpTarget.error_target (new BasicBlock (), catch_clause, null, null));
}
@@ -1041,6 +1042,25 @@ public class Vala.FlowAnalyzer : CodeVisitor {
}
foreach (JumpTarget jump_target in catch_stack) {
+
+ foreach (JumpTarget prev_target in catch_stack) {
+ if (prev_target == jump_target)
+ break;
+
+ if (prev_target.error_domain == jump_target.error_domain &&
+ prev_target.error_code == jump_target.error_code) {
+ Report.error (stmt.source_reference, "double catch clause of same error detected");
+ stmt.error = true;
+ return;
+ }
+
+ if ((prev_target.error_domain == null) ||
+ ((prev_target.error_domain != jump_target.error_domain) &&
+ (prev_target.error_code == null))) {
+ Report.warning (jump_target.catch_clause.source_reference, "unreachable catch clause detected");
+ }
+ }
+
if (jump_target.basic_block.get_predecessors ().size == 0) {
// unreachable
Report.warning (jump_target.catch_clause.source_reference, "unreachable catch clause detected");
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]