while not todo.is_empty do
var mr = todo.shift
+
+ var vararg_rank = mr.mmethoddef.msignature.vararg_rank
+ if vararg_rank > -1 then
+ var node = self.modelbuilder.mpropdef2npropdef[mr.mmethoddef]
+ var elttype = mr.mmethoddef.msignature.mparameters[vararg_rank].mtype
+ elttype = elttype.anchor_to(self.mainmodule, mr.receiver)
+ var vararg = self.mainmodule.get_primitive_class("Array").get_mtype([elttype])
+ self.add_type(vararg)
+ self.add_monomorphic_send(vararg, self.modelbuilder.force_get_primitive_method(node, "with_native", vararg, self.mainmodule))
+ var native = self.mainmodule.get_primitive_class("NativeArray").get_mtype([elttype])
+ self.add_type(native)
+ end
+
if not self.modelbuilder.mpropdef2npropdef.has_key(mr.mmethoddef) then
# It is an init for a class?
if mr.mmethoddef.mproperty.name == "init" then
var rapidtype = cleanup_type(recv)
if rapidtype == null then abort
- return self.analysis.mainmodule.force_get_primitive_method(name, rapidtype)
+ return self.analysis.modelbuilder.force_get_primitive_method(self.current_node.as(not null), name, rapidtype, self.analysis.mainmodule)
end
end
redef fun accept_rapid_type_vistor(v)
do
var recvtype = self.n_expr.mtype.as(not null)
- var colltype = v.get_class("Collection").mclassdefs.first.bound_mtype
- v.add_send(recvtype, v.get_method(colltype, "iterator"))
- var iteratortype = v.get_class("Iterator").mclassdefs.first.bound_mtype
+ var colltype = self.coltype.as(not null)
+ var itmeth = v.get_method(colltype, "iterator")
+ v.add_send(recvtype, itmeth)
+ var iteratortype = itmeth.intro.msignature.return_mtype.as(MClassType).mclass.mclassdefs.first.bound_mtype
var objtype = v.get_class("Object").mclass_type
v.add_send(objtype, v.get_method(iteratortype, "is_ok"))
- v.add_send(objtype, v.get_method(iteratortype, "item"))
+ if self.variables.length == 1 then
+ v.add_send(objtype, v.get_method(iteratortype, "item"))
+ else if self.variables.length == 2 then
+ v.add_send(objtype, v.get_method(iteratortype, "key"))
+ v.add_send(objtype, v.get_method(iteratortype, "item"))
+ else
+ abort
+ end
v.add_send(objtype, v.get_method(iteratortype, "next"))
end
end