end
redef class ASignature
- fun fill_iroutine_parameters(v: A2IContext, orig_sig: MMSignature, params: IndexedCollection[IRegister], closdecls: nullable IndexedCollection[IClosureDecl])
+ fun fill_iroutine_parameters(v: A2IContext, orig_sig: MMSignature, params: Sequence[IRegister], closdecls: nullable Sequence[IClosureDecl])
do
for ap in n_params do
var reg = v.variable(ap.variable)
redef class AAbsAbsSendExpr
# Compile each argument and add them to the array
- fun generate_icode_for_arguments_in(v: A2IContext, args: Array[IRegister])
- do
- for a in arguments do
- args.add(v.generate_expr(a))
+ fun generate_icode_for_arguments_in(v: A2IContext, args: Array[IRegister], signature: MMSignature)
+ do
+ var par_arity = signature.arity
+ var par_vararg = signature.vararg_rank
+ var raw_args = raw_arguments
+ var raw_arity = raw_args.length
+ var arg_idx = 0
+ for par_idx in [0..par_arity[ do
+ var a: AExpr
+ var par_type = signature[par_idx]
+ if par_idx == par_vararg then
+ var arr = v.add_new_array(v.visitor.type_array(par_type), raw_arity-par_arity)
+ for i in [0..(raw_arity-par_arity)] do
+ a = raw_args[arg_idx]
+ v.add_call_array_add(arr, v.generate_expr(a))
+ arg_idx = arg_idx + 1
+ end
+ args.add(arr)
+ else
+ a = raw_args[arg_idx]
+ args.add(v.generate_expr(a))
+ arg_idx = arg_idx + 1
+ end
end
end
end
var recv = v.generate_expr(n_expr)
var args = new Array[IRegister]
args.add(recv)
- generate_icode_for_arguments_in(v, args)
var prop = prop
+ generate_icode_for_arguments_in(v, args, prop.signature.as(not null))
var r: nullable IRegister = null # The full result of the send (raw call + breaks)
var r2: nullable IRegister # The raw result of the call
closcns = new Array[nullable IClosureDef]
var cdarity = 0
if closure_defs != null then cdarity = closure_defs.length
- for i in [0..cdarity[ do
- closure_defs[i].escapable.break_seq = seq
- closure_defs[i].escapable.break_value = r
- var cn = closure_defs[i].generate_iclosuredef(v)
- closcns.add(cn)
- end
- for i in [cdarity..prop_signature.closures.length[ do
- closcns.add(null)
+ var closure_defs = closure_defs
+ for mmc in prop_signature.closures do
+ var found = false
+ var name = mmc.name
+ if closure_defs != null then
+ for cd in closure_defs do
+ if cd.n_id.to_symbol != name then continue
+ assert found == false
+ found = true
+ cd.escapable.break_seq = seq
+ cd.escapable.break_value = r
+ var cn = cd.generate_iclosuredef(v)
+ closcns.add(cn)
+ end
+ end
+ if not found then
+ closcns.add(null)
+ end
end
end
if n_expr.stype.is_nullable then v.add_null_reciever_check(recv)
var args = new Array[IRegister]
args.add(recv)
- generate_icode_for_arguments_in(v, args)
+ generate_icode_for_arguments_in(v, args, read_prop.signature.as(not null))
var e2 = v.expr(new ICall(read_prop, args), read_prop.signature.return_type.as(not null))
var e3 = v.generate_expr(n_value)
redef fun generate_icode(v)
do
var args = new Array[IRegister]
- generate_icode_for_arguments_in(v, args)
+ generate_icode_for_arguments_in(v, args, prop.signature.as(not null))
return v.expr(new INew(stype, prop, args), stype)
end
end
do
# Geneate arguments
var args = new Array[IRegister]
- generate_icode_for_arguments_in(v, args)
+ generate_icode_for_arguments_in(v, args, variable.closure.signature)
# Prepare icall
var closdecl = v.closurevariables[variable]