private PERWAPI.ClassDef GenerateClassForFile(CodeGenContext context, string file_name, bool autoLoad, List<SOURCEFILE> files) { if (fileClass == null) CreateClassForFile(context, file_name); // internal static object Load(object recv, Caller caller, Proc block) LoadMethod = context.CreateMethod(fileClass, MethAttr.PublicStatic, "Load", PrimitiveType.Object, new Param[] { new Param(ParamAttr.Default, "recv", PrimitiveType.Object), new Param(ParamAttr.Default, "caller", Runtime.FrameRef) }); LoadMethod.startMethod(location); AddScopeLocals(LoadMethod); AddScopeBody(LoadMethod); LoadMethod.ReleaseLocal(0, true); // } LoadMethod.Close(); if (autoLoad) { // accessing this field should trigger the .cctor to load the main source file CodeGenContext.AddField(fileClass, FieldAttr.PublicStatic, "loaded", PrimitiveType.Boolean); // public static .cctor() { CodeGenContext cctor = context.CreateStaticConstructor(fileClass); // register other ruby source files in assembly so that they can be loaded if requested foreach (SOURCEFILE f in files) { if (f.fileClass == null) f.CreateClassForFile(context, File.stripExtension(f.location.file)); // Ruby.Runtime.Program.AddProgram(filename, fileClass); cctor.ldstr(File.stripExtension(f.location.file)); cctor.ldtoken(f.fileClass); cctor.call(Runtime.SystemType.GetTypeFromHandle); cctor.call(Runtime.Program.AddProgram); } // Load(Object.ruby_top_self, null); cctor.ldsfld(Runtime.Object.ruby_top_self); cctor.ldnull(); cctor.call(LoadMethod.Method); cctor.pop(); cctor.ret(); // } cctor.Close(); } return fileClass; }