[Date Prev][Date Next] [Thread Prev][Thread Next]
[Thread Index]
[Date Index]
[Author Index]
[Vala] improved static exception checking
- From: "Jared Moore" <jaredm gmx com>
- To: vala-list gnome org
- Subject: [Vala] improved static exception checking
- Date: Mon, 26 May 2008 17:47:31 +1000
Hi,
I had a few ideas about how to improve on the exception checking in
semanticanalyser.vala.
1) Finish adding exception propagation to more AST node types, e.g.
SwitchSection, try/catch blocks, etc
2) Separate all exception checking into a new code visitor, and run
exception checking after the semantic analyzer. This would allow for
better separation of concerns and make the code easier to read.
3) Report unhandled exceptions at the source, rather than at the top
of the containing method. This can be implemented as follows (or
something similar):
public ErrorChecker : CodeVisitor {
private ArrayList<DataType> expected_errors = new ArrayList<DataType>();
...
public void visit_method (Method m) {
var old_expected_errors = expected_errors;
expected_errors = m.get_expected_errors ();
m.accept_children (this);
expected_errors = old_expected_errors;
}
...
private boolean error_is_expected (DataType err_type) {
foreach (DataType expected_type in expected_errors) {
if (error_type.compatible (expected_type)) {
return true;
}
}
return false;
}
....
public void visit_expression (Expression e) {
if (e.tree_can_fail) {
foreach (DataType err in e.get_error_types ()) {
if (!error_is_expected(err)) {
Report.error (e.source_reference, "unhandled
error: %s", err.to_string());
}
}
}
...
}
Thoughts> If there is positive feedback on these ideas, I'll start
work on implementing them.
Also, attached is a patch that does some minor refactoring.
Cheers,
Jared Moore
=== modified file 'gobject/valaccodegenerator.vala'
--- gobject/valaccodegenerator.vala 2008-05-26 05:00:43 +0000
+++ gobject/valaccodegenerator.vala 2008-05-26 07:19:59 +0000
@@ -1559,7 +1559,7 @@
var ccond = new CCodeBinaryExpression (CCodeBinaryOperator.INEQUALITY, new CCodeIdentifier ("inner_error"), new CCodeConstant ("NULL"));
cfrag.append (new CCodeIfStatement (ccond, cerror_block));
- } else if (current_method != null && current_method.get_error_types ().size > 0) {
+ } else if (current_method != null && current_method.tree_can_fail) {
// current method can fail, propagate error
// TODO ensure one of the error domains matches
@@ -3511,7 +3511,7 @@
}
- if (m.get_error_types ().size > 0) {
+ if (m.tree_can_fail) {
var cparam = new CCodeFormalParameter ("error", "GError**");
cparam_map.set (get_param_pos (-1), cparam);
}
@@ -3573,7 +3573,7 @@
i++;
}
- if (m.get_error_types ().size > 0) {
+ if (m.tree_can_fail) {
carg_map.set (get_param_pos (-1), new CCodeIdentifier ("error"));
}
=== modified file 'gobject/valaccodemethodbinding.vala'
--- gobject/valaccodemethodbinding.vala 2008-05-26 05:00:43 +0000
+++ gobject/valaccodemethodbinding.vala 2008-05-26 07:19:13 +0000
@@ -452,7 +452,7 @@
}
}
- if (m.get_error_types ().size > 0) {
+ if (m.tree_can_fail) {
var cparam = new CCodeFormalParameter ("error", "GError**");
cparam_map.set (codegen.get_param_pos (-1), cparam);
carg_map.set (codegen.get_param_pos (-1), new CCodeIdentifier (cparam.name));
@@ -635,7 +635,7 @@
}
}
- if (m.get_error_types ().size > 0) {
+ if (m.tree_can_fail) {
var cparam = new CCodeFormalParameter ("error", "GError**");
cparam_map.set (codegen.get_param_pos (-1), cparam);
}
=== modified file 'gobject/valaccodeobjecttypesymbolbinding.vala'
--- gobject/valaccodeobjecttypesymbolbinding.vala 2008-05-26 05:00:43 +0000
+++ gobject/valaccodeobjecttypesymbolbinding.vala 2008-05-26 07:15:58 +0000
@@ -238,7 +238,7 @@
ccall.add_argument (new CCodeIdentifier (param.name));
}
- if (m.get_error_types ().size > 0) {
+ if (m.tree_can_fail) {
ccall.add_argument (new CCodeIdentifier ("error"));
}
[Date Prev][Date Next] [Thread Prev][Thread Next]
[Thread Index]
[Date Index]
[Author Index]