/// <summary> /// Link time code generator used to compile dynamically created methods during link time. /// </summary> /// <param name="compiler">The assembly compiler used to compile this method.</param> /// <param name="methodName">The name of the created method.</param> /// <param name="instructionSet">The instruction set.</param> /// <returns></returns> /// <exception cref="System.ArgumentNullException"><paramref name="compiler"/>, <paramref name="methodName"/> or <paramref name="instructionSet"/> is null.</exception> /// <exception cref="System.ArgumentException"><paramref name="methodName"/> is invalid.</exception> public static CompilerGeneratedMethod Compile(AssemblyCompiler compiler, string methodName, InstructionSet instructionSet) { if (compiler == null) { throw new ArgumentNullException(@"compiler"); } if (methodName == null) { throw new ArgumentNullException(@"methodName"); } if (methodName.Length == 0) { throw new ArgumentException(@"Invalid method name."); } // Create the type if we need to. CompilerGeneratedType type = compilerGeneratedType; if (type == null) { type = compilerGeneratedType = new CompilerGeneratedType(compiler.Assembly, @"Mosa.Tools.Compiler", @"LinkerGenerated"); } // Create the method // HACK: <$> prevents the method from being called from CIL CompilerGeneratedMethod method = new CompilerGeneratedMethod(compiler.Assembly, "<$>" + methodName, type); type.Methods.Add(method); LinkerMethodCompiler methodCompiler = new LinkerMethodCompiler(compiler, method, instructionSet); methodCompiler.Compile(); return(method); }
private void CompileObjectEquals(string typeName) { var type = new CompilerGeneratedType(compiler.Assembly, @"System", typeName); // Create the method CompilerGeneratedMethod method = new CompilerGeneratedMethod(compiler.Assembly, @"Equals", type); method.Parameters.Add(new RuntimeParameter(null, @"obj", 0, ParameterAttributes.In)); method.SetSignature(new MethodSignature(BuiltInSigType.Boolean, new SigType[] { BuiltInSigType.Object })); type.AddMethod(method); this.Compile(method); }
/// <summary> /// Link time code generator used to compile dynamically created methods during link time. /// </summary> /// <param name="compiler">The assembly compiler used to compile this method.</param> /// <param name="methodName">The name of the created method.</param> /// <param name="instructionSet">The instruction set.</param> /// <returns></returns> /// <exception cref="System.ArgumentNullException"><paramref name="compiler"/>, <paramref name="methodName"/> or <paramref name="instructionSet"/> is null.</exception> /// <exception cref="System.ArgumentException"><paramref name="methodName"/> is invalid.</exception> public static CompilerGeneratedMethod Compile(AssemblyCompiler compiler, string methodName, InstructionSet instructionSet) { if (compiler == null) throw new ArgumentNullException(@"compiler"); if (methodName == null) throw new ArgumentNullException(@"methodName"); if (methodName.Length == 0) throw new ArgumentException(@"Invalid method name."); // Create the type if we need to. if (compilerGeneratedType == null) compilerGeneratedType = new CompilerGeneratedType(compiler.Assembly, @"Mosa.Tools.Compiler", @"LinkerGenerated"); // Create the method // HACK: <$> prevents the method from being called from CIL CompilerGeneratedMethod method = new CompilerGeneratedMethod(compiler.Assembly, "<$>" + methodName, compilerGeneratedType); compilerGeneratedType.AddMethod(method); LinkerMethodCompiler methodCompiler = new LinkerMethodCompiler(compiler, compiler.Pipeline.FindFirst<ICompilationSchedulerStage>(), method, instructionSet); methodCompiler.Compile(); return method; }
private RuntimeMethod GenerateMethod(string @namespace, string typeName, string methodName) { var type = new CompilerGeneratedType(compiler.Assembly, @namespace, typeName); // Create the method CompilerGeneratedMethod method = new CompilerGeneratedMethod(compiler.Assembly, methodName, type); type.AddMethod(method); return method; }