X-Git-Url: http://nitlanguage.org diff --git a/src/transform.nit b/src/transform.nit index f3200fa..6bd37b0 100644 --- a/src/transform.nit +++ b/src/transform.nit @@ -88,13 +88,14 @@ redef class AVardeclExpr # # Declarations are only useful for scope rules # Once names are associated with real objects, ther declaration become useless - # Therefore, if there is no initial value, then just detach it + # Therefore, if there is no initial value, then just ignore it # Else, replace it with a simple assignment redef fun accept_transform_visitor(v) do var nexpr = n_expr if nexpr == null then - detach + # do nothing + # note: not detached because the collection is currently under iteration else var nvar = v.builder.make_var_assign(self.variable.as(not null), nexpr) replace_with(nvar) @@ -170,16 +171,13 @@ redef class AArrayExpr # t redef fun accept_transform_visitor(v) do - var mtype = self.mtype.as(MClassType) var nblock = v.builder.make_block - var meth = v.get_method(self, "with_capacity", mtype.mclass) - var nnew = v.builder.make_new(mtype, meth, [v.builder.make_int(n_exprs.n_exprs.length)]) + var nnew = v.builder.make_new(with_capacity_callsite.as(not null), [v.builder.make_int(n_exprs.n_exprs.length)]) nblock.add nnew - var madd = v.get_method(self, "push", mtype.mclass) for nexpr in self.n_exprs.n_exprs do - var nadd = v.builder.make_call(nnew.make_var_read, madd, [nexpr]) + var nadd = v.builder.make_call(nnew.make_var_read, push_callsite.as(not null), [nexpr]) nblock.add nadd end var nres = nnew.make_var_read @@ -189,45 +187,11 @@ redef class AArrayExpr end end -redef class ASuperstringExpr - # `"x{y}z"` is replaced with - # - # var t = new Array[Object].with_capacity(3) - # t.add("x") - # t.add(y) - # t.add("z") - # t.to_s - redef fun accept_transform_visitor(v) - do - var nblock = v.builder.make_block - - var arraytype = v.get_class(self, "Array").get_mtype([v.get_class(self, "Object").mclass_type]) - var meth = v.get_method(self, "with_capacity", arraytype.mclass) - var nnew = v.builder.make_new(arraytype, meth, [v.builder.make_int(n_exprs.length)]) - nblock.add nnew - - var madd = v.get_method(self, "add", arraytype.mclass) - for nexpr in self.n_exprs do - var nadd = v.builder.make_call(nnew.make_var_read, madd, [nexpr]) - nblock.add nadd - end - - var mtos = v.get_method(self, "to_s", arraytype.mclass) - var ntos = v.builder.make_call(nnew.make_var_read, mtos, null) - nblock.add ntos - - replace_with(nblock) - end -end - redef class ACrangeExpr # `[x..y]` is replaced with `new Range[X](x,y)` redef fun accept_transform_visitor(v) do - var mtype = self.mtype.as(MClassType) - var meth = v.get_method(self, "init", mtype.mclass) - - replace_with(v.builder.make_new(mtype, meth, [n_expr, n_expr2])) + replace_with(v.builder.make_new(init_callsite.as(not null), [n_expr, n_expr2])) end end @@ -235,10 +199,7 @@ redef class AOrangeExpr # `[x..y[` is replaced with `new Range[X].without_last(x,y)` redef fun accept_transform_visitor(v) do - var mtype = self.mtype.as(MClassType) - var meth = v.get_method(self, "without_last", mtype.mclass) - - replace_with(v.builder.make_new(mtype, meth, [n_expr, n_expr2])) + replace_with(v.builder.make_new(init_callsite.as(not null), [n_expr, n_expr2])) end end @@ -271,12 +232,12 @@ redef class ASendReassignFormExpr write_args.add(a.make_var_read) end - var nread = v.builder.make_call(n_expr.make_var_read, callsite.mproperty, read_args) + var nread = v.builder.make_call(n_expr.make_var_read, callsite.as(not null), read_args) - var nnewvalue = v.builder.make_call(nread, reassign_callsite.mproperty, [n_value]) + var nnewvalue = v.builder.make_call(nread, reassign_callsite.as(not null), [n_value]) write_args.add(nnewvalue) - var nwrite = v.builder.make_call(n_expr.make_var_read, write_callsite.mproperty, write_args) + var nwrite = v.builder.make_call(n_expr.make_var_read, write_callsite.as(not null), write_args) nblock.add(nwrite) replace_with(nblock) @@ -289,8 +250,9 @@ redef class AVarReassignExpr do var variable = self.variable.as(not null) - var nread = v.builder.make_var_read(variable) - var nnewvalue = v.builder.make_call(nread, reassign_callsite.mproperty, [n_value]) + var nread = v.builder.make_var_read(variable, read_type.as(not null)) + + var nnewvalue = v.builder.make_call(nread, reassign_callsite.as(not null), [n_value]) var nwrite = v.builder.make_var_assign(variable, nnewvalue) replace_with(nwrite) @@ -306,7 +268,7 @@ redef class AAttrReassignExpr var attribute = self.mproperty.as(not null) var nread = v.builder.make_attr_read(n_expr.make_var_read, attribute) - var nnewvalue = v.builder.make_call(nread, reassign_callsite.mproperty, [n_value]) + var nnewvalue = v.builder.make_call(nread, reassign_callsite.as(not null), [n_value]) var nwrite = v.builder.make_attr_assign(n_expr.make_var_read, attribute, nnewvalue) nblock.add(nwrite)