private static InstructionImpl ImplementAsCall(MethodInfo callee) { return((context, gen) => { var parameterTypes = callee.GetParameters().Select(p => ValueHelpers.ToWasmValueType(p.ParameterType)).ToArray(); var paramTypesOnStack = context.Pop(parameterTypes.Length); for (int i = 0; i < parameterTypes.Length; i++) { if (parameterTypes[i] != paramTypesOnStack[i]) { throw new InvalidOperationException($"Expected type '{parameterTypes[i]}' on stack for argument {i} of method '{callee}', but got type '{paramTypesOnStack[i]}' instead."); } } gen.Emit(OpCodes.Call, callee); if (callee.ReturnType != null && callee.ReturnType != typeof(void)) { context.Push(ValueHelpers.ToWasmValueType(callee.ReturnType)); } }); }
private object EvaluateConstExpr(SExpression expression, Type resultType) { return(EvaluateConstExpr(expression, ValueHelpers.ToWasmValueType(resultType))); }