StatementBlock TranslateInvoke(InvokeExpression e) { var function = Assert.IsType <TypeReference.FunctionTypeCase>(e.Function.Type()).Item; var args = e.Args.Select(TranslateExpression).ToArray(); if (e.Function is Expression.ParameterCase variable && this.ActiveLocalFunctions.TryGetValue(variable.Item.Id, out var localFunction)) { var call = CallLocalFunction(localFunction, args.Select(a => a.Instr())); return(StatementBlock.Concat( args.Append(StatementBlock.Expression(localFunction.Method.ReturnType, call)) )); }
/// <summary> Concatenates the effects of the specified <paramref name="blocks" />. The result values are returned separate. </summary> public static (StatementBlock effect, ImmutableArray <ILInstruction> results) CombineInstr(params StatementBlock[] blocks) { bool hasEmptyBody = true; foreach (var b in blocks) { Assert.False(b.IsVoid); hasEmptyBody &= b.Statements.IsEmpty; } if (hasEmptyBody) { return(StatementBlock.Nop, blocks.EagerSelect(r => r.Instr())); } else { var vars = blocks.EagerSelect(b => new ILVariable(VariableKind.StackSlot, b.Type)); var result = StatementBlock.Concat(blocks.Zip(vars, (r, v) => r.WithOutputInto(v))); return(result, vars.EagerSelect(v => (ILInstruction) new LdLoc(v))); } }