/// <summary> /// メソッド呼び出し式をコンパイル /// </summary> /// <param name="ilgen">IL Generator</param> /// <param name="expr">メソッド呼び出し式</param> static void CompileInvokeExpr(ILGenerator ilgen, MInvokeExpr expr) { CompileExpr(ilgen, expr.Expr); foreach (var arg in expr.Args) { CompileExpr(ilgen, arg); } ilgen.Emit(OpCodes.Call, expr.MethodInfo); }
/// <summary> /// 関数呼び出しの構文解析 /// </summary> /// <returns>式</returns> MExpr ParseCallExpr() { var expr = ParseSimpleExpr(); for ( ; ; ) { var pos = _tkn.Pos; if (_tkn.Type == TokenType.LP) { ReadToken(TokenType.LP); var args = ParseExprList(); ReadToken(TokenType.RP); expr = new MCallExpr(pos, expr, args); } else if (_tkn.Type == TokenType.DOT) { ReadToken(TokenType.DOT); var name = ReadStrToken(TokenType.ID); ReadToken(TokenType.LP); var args = ParseExprList(); ReadToken(TokenType.RP); expr = new MInvokeExpr(pos, expr, name, args); } else { break; } } return expr; }
/// <summary> /// メソッド呼び出し式の型推論 /// </summary> /// <param name="expr">メソッド呼び出し式</param> static void TypeinfInvokeExpr(MInvokeExpr expr) { TypeinfExpr(expr.Expr); foreach (var arg in expr.Args) { TypeinfExpr(arg); } var arg_types = new List<Type>(); foreach (var arg in expr.Args) { arg_types.Add(arg.Type.Reduce()); } var type = expr.Expr.Type.Reduce(); var method = type.GetMethod(expr.MethodName, arg_types.ToArray()); expr.MethodInfo = method; expr.Type = new DotNetType(method.ReturnType); }