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); }
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); }