From f67df778726245ca7158097e62bc84821ac1f6c9 Mon Sep 17 00:00:00 2001 From: Jean Privat Date: Fri, 3 Apr 2015 14:59:12 +0700 Subject: [PATCH] transform: transform the `with` statement Signed-off-by: Jean Privat --- src/transform.nit | 51 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) diff --git a/src/transform.nit b/src/transform.nit index dac3c4f..118142a 100644 --- a/src/transform.nit +++ b/src/transform.nit @@ -285,6 +285,57 @@ redef class AForExpr end end +redef class AWithExpr + # is replaced with a do/end and injected calls to `start` and `finish` + # + # Basically, the following + # + # ~~~nitish + # with expr do + # block + # end label l + # ~~~ + # + # is transformed into + # + # ~~~nitish + # var x = expr + # do + # x.start + # block + # end label l + # x.finish + # ~~~ + # + # The point is that `finish` is called even if the block is escaped. + redef fun accept_transform_visitor(v) + do + var escapemark = self.break_mark + assert escapemark != null + + var nblock = v.builder.make_block + + var nexpr = n_expr + + nblock.add nexpr + + var ndo = v.builder.make_do + ndo.break_mark = escapemark + + var start = v.builder.make_call(nexpr.make_var_read, method_start.as(not null), null) + + ndo.add start + + ndo.add self.n_block.as(not null) + + nblock.add ndo + + nblock.add v.builder.make_call(nexpr.make_var_read, method_finish.as(not null), null) + + replace_with(nblock) + end +end + redef class AArrayExpr # `[x,y]` is replaced with # -- 1.7.9.5