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> } }
IPlace GetLocalsPlace(SourceRoutineSymbol routine) { if (routine is SourceGlobalMethodSymbol) { // second parameter Debug.Assert(routine.ParameterCount >= 2 && routine.Parameters[1].Name == SpecialParameterSymbol.LocalsName); return(new ParamPlace(routine.Parameters[1])); } else if ((routine.Flags & RoutineFlags.RequiresLocalsArray) != 0) { // declare PhpArray <locals> var symbol = new SynthesizedLocalSymbol(Routine, "<locals>", CoreTypes.PhpArray); var localsDef = this.Builder.LocalSlotManager.DeclareLocal((Cci.ITypeReference)symbol.Type, symbol, symbol.Name, SynthesizedLocalKind.OptimizerTemp, LocalDebugId.None, 0, LocalSlotConstraints.None, false, default(ImmutableArray <TypedConstant>), false); return(new LocalPlace(localsDef)); } // return(null); }
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> } }