コード例 #1
0
ファイル: MethodCompiler.cs プロジェクト: paf31/Purity
        public static void Compile(string name, TypeBuilder dataClass, ConstructorInfo ctor, IType type, 
            string[] typeParameters, IMetadataContainer container, IRuntimeContainer runtimeContainer)
        {
            var method = dataClass.DefineMethod(name,
                 MethodAttributes.Public | MethodAttributes.Static, null, Type.EmptyTypes);

            if (typeParameters.Any())
            {
                method.DefineGenericParameters(typeParameters.ToArray());
            }

            var converter = new TypeConverter(runtimeContainer, method.GetGenericArguments());
            var converted = converter.Convert(type);
            method.SetReturnType(converted);

            var body = method.GetILGenerator();

            if (typeParameters.Any())
            {
                body.Emit(OpCodes.Newobj, TypeBuilder.GetConstructor(ctor.DeclaringType.MakeGenericType(method.GetGenericArguments()), ctor));
            }
            else
            {
                body.Emit(OpCodes.Newobj, ctor);
            }

            body.Emit(OpCodes.Ret);

            runtimeContainer.Add(name, method);

            var dataDecl = new DataDeclaration(type, null);
            dataDecl.TypeParameters = typeParameters;
            container.Add(name, dataDecl);

            RemoveFirstParameter(name, dataClass, method, new IType[0], type, typeParameters, runtimeContainer);
        }
コード例 #2
0
ファイル: MethodCompiler.cs プロジェクト: paf31/Purity
        public static void Compile(string name, TypeBuilder dataClass, ITypedExpression typedExpression,
            DataDeclaration data, IMetadataContainer container, IRuntimeContainer runtimeContainer)
        {
            var method = dataClass.DefineMethod(name,
                MethodAttributes.Public | MethodAttributes.Static, null, Type.EmptyTypes);

            if (data.TypeParameters.Any())
            {
                method.DefineGenericParameters(data.TypeParameters.ToArray());
            }

            var converter = new TypeConverter(runtimeContainer, method.GetGenericArguments());
            var converted = converter.Convert(data.Type);
            method.SetReturnType(converted);

            var body = method.GetILGenerator();
            typedExpression.AcceptVisitor(new DataCompiler(body, method.GetGenericArguments(), runtimeContainer));
            body.Emit(OpCodes.Ret);

            container.Add(name, data);
            runtimeContainer.Add(name, method);

            RemoveFirstParameter(name, dataClass, method, new IType[0], data.Type, data.TypeParameters, runtimeContainer);
        }