internal SynthesizedStaticLocHolder DeclareStaticLocalHolder(string locName, TypeSymbol locType) { var holder = new SynthesizedStaticLocHolder(_cg.Routine, locName, locType); _cg.Module.SynthesizedManager.AddNestedType(_container, holder); return(holder); }
internal SynthesizedStaticLocHolder DeclareStaticLocalHolder(string locName, TypeSymbol locType) { var holder = new SynthesizedStaticLocHolder(_cg.Routine, locName, locType); ((IWithSynthesized)_container).AddTypeMember(holder); return(holder); }
internal SynthesizedStaticLocHolder DeclareStaticLocalHolder(string locName, TypeSymbol locType) { //// TODO: check the holder for static 'locName' isn't defined already //var holders = _cg.Module.SynthesizedManager.GetMembers<SynthesizedStaticLocHolder>(_container); //var holder = holders.FirstOrDefault(h => ReferenceEquals(h.DeclaringMethod, _cg.Routine) && h.VariableName == locName && h.ValueType == locType); //if (holder == null) //{ var holder = new SynthesizedStaticLocHolder(_cg.Routine, locName, locType); _cg.Module.SynthesizedManager.AddNestedType(_container, holder); //} return(holder); }
internal override void EmitInit(CodeGenerator cg) { // variable holder class _holder = cg.Factory.DeclareStaticLocalHolder(this.Name, (TypeSymbol)this.Variable.Type); // local with its instance var symbol = new SynthesizedLocalSymbol(cg.Routine, this.Name, _holder); var loc = cg.Builder.LocalSlotManager.DeclareLocal(_holder, symbol, symbol.Name, SynthesizedLocalKind.OptimizerTemp, LocalDebugId.None, 0, LocalSlotConstraints.None, false, default(ImmutableArray <TypedConstant>), false); _holderPlace = new LocalPlace(loc); // place = holder.value _place = new FieldPlace(_holderPlace, _holder.ValueField); if (cg.HasUnoptimizedLocals) { // TODO reference to <locals> } }
void EmitInit(Emit.PEModuleBuilder module, DiagnosticBag diagnostic, PhpCompilation compilation, SynthesizedStaticLocHolder holder, BoundExpression initializer) { var requiresContext = initializer != null && initializer.RequiresContext; if (requiresContext) { // emit Init only if it needs Context holder.EmitInit(module, (il) => { var cg = new CodeGenerator(il, module, diagnostic, compilation.Options.OptimizationLevel, false, holder.ContainingType, new ArgPlace(compilation.CoreTypes.Context, 1), new ArgPlace(holder, 0)); var valuePlace = new FieldPlace(cg.ThisPlaceOpt, holder.ValueField, module); // Template: this.value = <initilizer>; valuePlace.EmitStorePrepare(il); cg.EmitConvert(initializer, valuePlace.TypeOpt); valuePlace.EmitStore(il); // il.EmitRet(true); }); } // default .ctor holder.EmitCtor(module, (il) => { // base..ctor() var ctor = holder.BaseType.InstanceConstructors.Single(); il.EmitLoadArgumentOpcode(0); // this il.EmitCall(module, diagnostic, ILOpCode.Call, ctor); // .ctor() if (!requiresContext) { // emit default value only if it won't be initialized by Init above var cg = new CodeGenerator(il, module, diagnostic, compilation.Options.OptimizationLevel, false, holder.ContainingType, null, new ArgPlace(holder, 0)); var valuePlace = new FieldPlace(cg.ThisPlaceOpt, holder.ValueField, module); // Template: this.value = default(T); valuePlace.EmitStorePrepare(il); if (initializer != null) { cg.EmitConvert(initializer, valuePlace.TypeOpt); } else { cg.EmitLoadDefault(valuePlace.TypeOpt, 0); } valuePlace.EmitStore(il); } // il.EmitRet(true); }); }
internal BoundStaticVariableStatement(StaticVarDecl variable, SynthesizedStaticLocHolder holder) { _variable = variable; _holderClass = holder ?? throw ExceptionUtilities.ArgumentNull(nameof(holder)); }
void EmitInit(Emit.PEModuleBuilder module, DiagnosticBag diagnostic, PhpCompilation compilation, SynthesizedStaticLocHolder holder, BoundExpression initializer) { var loctype = holder.ValueField.Type; bool requiresContext = initializer != null && initializer.RequiresContext; if (requiresContext) { // emit Init only if it needs Context holder.EmitInit(module, (il) => { var cg = new CodeGenerator(il, module, diagnostic, OptimizationLevel.Release, false, holder.ContainingType, new ArgPlace(compilation.CoreTypes.Context, 1), new ArgPlace(holder, 0)); var valuePlace = new FieldPlace(cg.ThisPlaceOpt, holder.ValueField); // Template: this.value = <initilizer>; valuePlace.EmitStorePrepare(il); cg.EmitConvert(initializer, valuePlace.TypeOpt); valuePlace.EmitStore(il); // il.EmitRet(true); }); } // default .ctor holder.EmitCtor(module, (il) => { if (!requiresContext) { // emit default value only if it won't be initialized by Init above var cg = new CodeGenerator(il, module, diagnostic, OptimizationLevel.Release, false, holder.ContainingType, null, new ArgPlace(holder, 0)); var valuePlace = new FieldPlace(cg.ThisPlaceOpt, holder.ValueField); // Template: this.value = default(T); valuePlace.EmitStorePrepare(il); if (initializer != null) { cg.EmitConvert(initializer, valuePlace.TypeOpt); } else { cg.EmitLoadDefault(valuePlace.TypeOpt, 0); } valuePlace.EmitStore(il); } // il.EmitRet(true); }); }