예제 #1
0
        /// <summary>
        /// トップレベル関数のコンパイル
        /// </summary>
        /// <param name="type_builder">Type Builer</param>
        /// <param name="topfun">トップレベル関数</param>
        static void CompileTopFun(TypeBuilder type_builder, MTopFun topfun)
        {
            // 引数型の決定
            var arg_types = new List<Type>();
            foreach (var arg in topfun.Args)
            {
                arg_types.Add(arg.Type.Reduce());
            }

            // メソッドの定義
            var builder = type_builder.DefineMethod(
                topfun.Name,
                MethodAttributes.Static,
                topfun.RetType.Reduce(),
                arg_types.ToArray());
            _function_table.Add(topfun.Name, builder);

            // コード生成
            var ilgen = builder.GetILGenerator();
            _scope_manager.StartScope();
            var index = 0;
            foreach (var arg in topfun.Args)
            {
                _scope_manager.Add(
                    topfun.Pos, arg.Name, new ParamVar(index));
                index++;
            }
            CompileStmt(ilgen, topfun.Body);
            ilgen.Emit(OpCodes.Ret);
            _scope_manager.EndScope();
        }
예제 #2
0
 /// <summary>
 /// トップレベル関数の型推論
 /// </summary>
 /// <param name="stmt">トップレベル関数</param>
 static void TypeinfTopFun(MTopFun stmt)
 {
     var ret_type = new TypeVar();
     var func = new FunctionInfo(stmt.Args, ret_type);
     function_table.Add(stmt.Name, func);
     current_function = func;
     env.StartScope();
     foreach (var arg in stmt.Args)
     {
         env.Add(stmt.Pos, arg.Name, arg.Type);
     }
     TypeinfStmt(stmt.Body);
     env.EndScope();
     if (func.RetType.Reduce() == null)
     {
         Unification(stmt.Pos, new DotNetType(typeof(void)), stmt.RetType);
     }
     else
     {
         Unification(stmt.Pos, func.RetType, stmt.RetType);
     }
 }