void EmitFieldsCctor(Emit.PEModuleBuilder module) { var sflds = GetMembers().OfType<SourceFieldSymbol>().Where(f => f.IsStatic && !f.RequiresHolder).ToList(); if (sflds.Count != 0) { // emit initialization of app static fields // note, their initializers do not have Context available, since they are not bound to a Context var cctor = module.GetStaticCtorBuilder(this); var cg = new CodeGenerator(cctor, module, DiagnosticBag.GetInstance(), OptimizationLevel.Release, false, this, null, null); foreach (var f in sflds) { f.EmitInit(cg); } } }
internal void EmitInit(Emit.PEModuleBuilder module) { var cctor = module.GetStaticCtorBuilder(_file); var field = new FieldPlace(null, this.EnsureRoutineInfoField(module)); // {RoutineInfoField} = RoutineInfo.CreateUserRoutine(name, handle) field.EmitStorePrepare(cctor); cctor.EmitStringConstant(this.QualifiedName.ToString()); cctor.EmitLoadToken(module, DiagnosticBag.GetInstance(), this, null); cctor.EmitCall(module, DiagnosticBag.GetInstance(), System.Reflection.Metadata.ILOpCode.Call, module.Compilation.CoreMethods.Reflection.CreateUserRoutine_string_RuntimeMethodHandle); field.EmitStore(cctor); }