From fd8e507d25fee5bfba82c39ef8aedea2ebabcd4b Mon Sep 17 00:00:00 2001 From: Jean Privat Date: Wed, 17 Dec 2014 11:50:55 -0500 Subject: [PATCH] transform: transform array comprehension in simpler statements Signed-off-by: Jean Privat --- src/transform.nit | 27 ++++++++++++++++++++++++--- 1 file changed, 24 insertions(+), 3 deletions(-) diff --git a/src/transform.nit b/src/transform.nit index 2c0fb02..2fda94e 100644 --- a/src/transform.nit +++ b/src/transform.nit @@ -95,6 +95,22 @@ redef class ANode end end +redef class AExpr + redef fun full_transform_visitor(v: TransformVisitor) + do + var na = comprehension + if na != null then + # We are building a comprehension array `array` + # Replace `self` with `array.push(self)` + var place = detach_with_placeholder + var recv = na.nnew.make_var_read + var nadd = v.builder.make_call(recv, na.push_callsite.as(not null), [self]) + place.replace_with(nadd) + end + super + end +end + redef class AVardeclExpr # `var x = y` is replaced with `x = y` # @@ -282,22 +298,27 @@ redef class AArrayExpr # t.add(y) # t # ~~~ - redef fun accept_transform_visitor(v) + redef fun full_transform_visitor(v) do var nblock = v.builder.make_block var nnew = v.builder.make_new(with_capacity_callsite.as(not null), [v.builder.make_int(n_exprs.length)]) + self.nnew = nnew + nblock.add nnew + super + for nexpr in self.n_exprs do - var nadd = v.builder.make_call(nnew.make_var_read, push_callsite.as(not null), [nexpr]) - nblock.add nadd + nblock.add nexpr end var nres = nnew.make_var_read nblock.add nres replace_with(nblock) end + + private var nnew: ANewExpr is noinit end redef class ACrangeExpr -- 1.7.9.5