X-Git-Url: http://nitlanguage.org diff --git a/src/semantize/flow.nit b/src/semantize/flow.nit index ccc36b7..8dad3b7 100644 --- a/src/semantize/flow.nit +++ b/src/semantize/flow.nit @@ -20,6 +20,7 @@ module flow import scope redef class ToolContext + # Run `APropdef::do_flow` on each propdef var flow_phase: Phase = new FlowPhase(self, [scope_phase]) end @@ -33,19 +34,17 @@ end private class FlowVisitor super Visitor - var current_flow_context: FlowContext + var current_flow_context = new FlowContext var toolcontext: ToolContext - init(toolcontext: ToolContext) + init do - self.toolcontext = toolcontext - current_flow_context = new FlowContext flows.add(current_flow_context) current_flow_context.is_start = true end - var first: nullable ANode + var first: nullable ANode = null redef fun visit(node) do @@ -78,7 +77,7 @@ private class FlowVisitor fun printflow do - var file = new OFStream.open("flow.dot") + var file = new FileWriter.open("flow.dot") file.write("digraph \{\n") for f in flows do var s = "" @@ -165,7 +164,7 @@ private class FlowVisitor fun merge_continues_to(before_loop: FlowContext, escapemark: nullable EscapeMark) do if escapemark == null then return - for b in escapemark.continues do + for b in escapemark.escapes do var before = b.before_flow_context if before == null then continue # Forward error before_loop.add_loop(before) @@ -175,7 +174,7 @@ private class FlowVisitor fun merge_breaks(escapemark: nullable EscapeMark) do if escapemark == null then return - for b in escapemark.breaks do + for b in escapemark.escapes do var before = b.before_flow_context if before == null then continue # Forward error self.make_merge_flow(self.current_flow_context, before) @@ -319,22 +318,7 @@ redef class AReturnExpr end end -redef class AContinueExpr - # The flow just before it become unreachable - fun before_flow_context: nullable FlowContext - do - var after = self.after_flow_context - if after == null then return null - return after.previous.first - end - redef fun accept_flow_visitor(v) - do - super - v.make_unreachable_flow - end -end - -redef class ABreakExpr +redef class AEscapeExpr # The flow just before it become unreachable fun before_flow_context: nullable FlowContext do @@ -361,7 +345,7 @@ redef class ADoExpr redef fun accept_flow_visitor(v) do super - v.merge_breaks(self.escapemark) + v.merge_breaks(self.break_mark) end end @@ -411,10 +395,10 @@ redef class AWhileExpr var after_block = v.current_flow_context before_loop.add_loop(after_block) - v.merge_continues_to(after_block, self.escapemark) + v.merge_continues_to(after_block, self.continue_mark) v.current_flow_context = after_expr.when_false - v.merge_breaks(self.escapemark) + v.merge_breaks(self.break_mark) end end @@ -428,10 +412,10 @@ redef class ALoopExpr var after_block = v.current_flow_context before_loop.add_loop(after_block) - v.merge_continues_to(after_block, self.escapemark) + v.merge_continues_to(after_block, self.continue_mark) v.make_unreachable_flow - v.merge_breaks(self.escapemark) + v.merge_breaks(self.break_mark) end end @@ -447,10 +431,18 @@ redef class AForExpr var after_block = v.current_flow_context before_loop.add_loop(after_block) - v.merge_continues_to(after_block, self.escapemark) + v.merge_continues_to(after_block, self.continue_mark) v.make_merge_flow(v.current_flow_context, before_loop) - v.merge_breaks(self.escapemark) + v.merge_breaks(self.break_mark) + end +end + +redef class AWithExpr + redef fun accept_flow_visitor(v) + do + super + v.merge_breaks(self.break_mark) end end @@ -553,7 +545,15 @@ redef class AIsaExpr end end -redef class AProxyExpr +redef class AParExpr + redef fun accept_flow_visitor(v) + do + var after_expr = v.visit_expr(self.n_expr) + v.current_flow_context = after_expr + end +end + +redef class AOnceExpr redef fun accept_flow_visitor(v) do var after_expr = v.visit_expr(self.n_expr)