void EmitFieldsCctor(Emit.PEModuleBuilder module) { // list app static fields var sflds = GetMembers().OfType <IPhpPropertySymbol>() .Where(f => f.FieldKind == PhpPropertyKind.AppStaticField) .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); lock (cctor) { using (var cg = new CodeGenerator(cctor, module, DiagnosticBag.GetInstance(), module.Compilation.Options.OptimizationLevel, false, this, null, thisPlace: null) { CallerType = this, ContainingFile = this.ContainingFile, }) { foreach (var f in sflds) { Debug.Assert(f.RequiresContext == false); Debug.Assert(f.ContainingStaticsHolder == null); 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); }
void EmitFieldsCctor(Emit.PEModuleBuilder module) { var sflds = GetMembers().OfType <SourceFieldSymbol>().Where(f => !f.IsConst && 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); } } }