Esempio n. 1
0
        /// <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);
        }
Esempio n. 2
0
 /// <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;
 }
Esempio n. 3
0
        /// <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);
        }