public static object Compile(GenContext context,TextReader rdr, string sourceDirectory, string sourceName, string relativePath) { object eofVal = new object(); object form; string sourcePath = relativePath; // generate loader class ObjExpr objx = new ObjExpr(null); var internalName = sourcePath.Replace(Path.PathSeparator, '/').Substring(0, sourcePath.LastIndexOf('.')); objx.InternalName = internalName + "__init"; TypeBuilder initTB = context.AssemblyGen.DefinePublicType(InitClassName(internalName), typeof(object), true); context = context.WithTypeBuilder(initTB); // static load method MethodBuilder initMB = initTB.DefineMethod("Initialize", MethodAttributes.Public | MethodAttributes.Static, typeof(void), Type.EmptyTypes); CljILGen ilg = new CljILGen(initMB.GetILGenerator()); LineNumberingTextReader lntr = rdr as LineNumberingTextReader ?? new LineNumberingTextReader(rdr); Var.pushThreadBindings(RT.mapUniqueKeys( SourcePathVar, sourcePath, SourceVar, sourceName, MethodVar, null, LocalEnvVar, null, LoopLocalsVar, null, NextLocalNumVar, 0, RT.ReadEvalVar, true /* RT.T */, RT.CurrentNSVar, RT.CurrentNSVar.deref(), ConstantsVar, PersistentVector.EMPTY, ConstantIdsVar, new IdentityHashMap(), KeywordsVar, PersistentHashMap.EMPTY, VarsVar, PersistentHashMap.EMPTY, RT.UncheckedMathVar, RT.UncheckedMathVar.deref(), RT.WarnOnReflectionVar, RT.WarnOnReflectionVar.deref(), RT.DataReadersVar, RT.DataReadersVar.deref(), CompilerContextVar, context, CompilerActiveVar, true )); try { Object readerOpts = ReaderOpts(sourceName); while ((form = LispReader.read(lntr, false, eofVal, false, readerOpts)) != eofVal) { Compile1(initTB, ilg, objx, form); } initMB.GetILGenerator().Emit(OpCodes.Ret); // static fields for constants objx.EmitConstantFieldDefs(initTB); MethodBuilder constInitsMB = objx.EmitConstants(initTB); // Static init for constants, keywords, vars ConstructorBuilder cb = initTB.DefineConstructor(MethodAttributes.Static, CallingConventions.Standard, Type.EmptyTypes); ILGenerator cbGen = cb.GetILGenerator(); cbGen.BeginExceptionBlock(); cbGen.Emit(OpCodes.Call,Method_Compiler_PushNS); cbGen.Emit(OpCodes.Call, constInitsMB); cbGen.BeginFinallyBlock(); cbGen.Emit(OpCodes.Call, Method_Var_popThreadBindings); cbGen.EndExceptionBlock(); cbGen.Emit(OpCodes.Ret); var descAttrBuilder = new CustomAttributeBuilder(typeof (DescriptionAttribute).GetConstructor(new[] {typeof (String)}), new [] {String.Format("{{:clojure-namespace {0}}}", CurrentNamespace)}); initTB.SetCustomAttribute(descAttrBuilder); initTB.CreateType(); } catch (LispReader.ReaderException e) { throw new CompilerException(sourcePath, e.Line, e.Column, e.InnerException); } finally { Var.popThreadBindings(); } return null; }
public static object Compile(TextReader rdr, string sourceDirectory, string sourceName, string relativePath) { if (CompilePathVar.deref() == null) throw new InvalidOperationException("*compile-path* not set"); object eofVal = new object(); object form; string sourcePath = relativePath; GenContext context = GenContext.CreateWithExternalAssembly(sourceName, sourcePath, ".dll", true); // generate loader class ObjExpr objx = new ObjExpr(null); objx.InternalName = sourcePath.Replace(Path.PathSeparator, '/').Substring(0, sourcePath.LastIndexOf('.')) + "__init"; TypeBuilder initTB = context.AssemblyGen.DefinePublicType("__Init__", typeof(object), true); context = context.WithTypeBuilder(initTB); // static load method MethodBuilder initMB = initTB.DefineMethod("Initialize", MethodAttributes.Public | MethodAttributes.Static, typeof(void), Type.EmptyTypes); CljILGen ilg = new CljILGen(initMB.GetILGenerator()); LineNumberingTextReader lntr = rdr as LineNumberingTextReader ?? new LineNumberingTextReader(rdr); Var.pushThreadBindings(RT.map( SourcePathVar, sourcePath, SourceVar, sourceName, MethodVar, null, LocalEnvVar, null, LoopLocalsVar, null, NextLocalNumVar, 0, RT.CurrentNSVar, RT.CurrentNSVar.deref(), ConstantsVar, PersistentVector.EMPTY, ConstantIdsVar, new IdentityHashMap(), KeywordsVar, PersistentHashMap.EMPTY, VarsVar, PersistentHashMap.EMPTY, RT.UncheckedMathVar, RT.UncheckedMathVar.deref(), RT.WarnOnReflectionVar, RT.WarnOnReflectionVar.deref(), RT.DataReadersVar, RT.DataReadersVar.deref(), CompilerContextVar, context, CompilerActiveVar, true )); try { while ((form = LispReader.read(lntr, false, eofVal, false)) != eofVal) { Compile1(initTB, ilg, objx, form); } initMB.GetILGenerator().Emit(OpCodes.Ret); // static fields for constants objx.EmitConstantFieldDefs(initTB); MethodBuilder constInitsMB = objx.EmitConstants(initTB); // Static init for constants, keywords, vars ConstructorBuilder cb = initTB.DefineConstructor(MethodAttributes.Static, CallingConventions.Standard, Type.EmptyTypes); ILGenerator cbGen = cb.GetILGenerator(); cbGen.BeginExceptionBlock(); cbGen.Emit(OpCodes.Call,Method_Compiler_PushNS); cbGen.Emit(OpCodes.Call, constInitsMB); cbGen.BeginFinallyBlock(); cbGen.Emit(OpCodes.Call, Method_Var_popThreadBindings); cbGen.EndExceptionBlock(); cbGen.Emit(OpCodes.Ret); initTB.CreateType(); context.SaveAssembly(); } catch (LispReader.ReaderException e) { throw new CompilerException(sourcePath, e.Line, e.InnerException); } finally { Var.popThreadBindings(); } return null; }