public DeclareLocal ( System.TypeSpec type, bool pinned ) : |
||
type | System.TypeSpec | |
pinned | bool | |
return |
public void ResolveVariable (EmitContext ec) { if (HoistedVariant != null) return; if (builder == null) { builder = ec.DeclareLocal (VariableType, Pinned); } }
public void CreateBuilder (EmitContext ec) { if ((flags & Flags.Used) == 0) { if (VariableInfo == null) { // Missing flow analysis or wrong variable flags throw new InternalErrorException ("VariableInfo is null and the variable `{0}' is not used", name); } if (VariableInfo.IsEverAssigned) ec.Report.Warning (219, 3, Location, "The variable `{0}' is assigned but its value is never used", Name); else ec.Report.Warning (168, 3, Location, "The variable `{0}' is declared but never used", Name); } if (HoistedVariant != null) return; if (builder != null) { if ((flags & Flags.CompilerGenerated) != 0) return; // To avoid Used warning duplicates throw new InternalErrorException ("Already created variable `{0}'", name); } // // All fixed variabled are pinned, a slot has to be alocated // builder = ec.DeclareLocal (Type, IsFixed); if (SymbolWriter.HasSymbolWriter) ec.DefineLocalVariable (name, builder); }
public void AddressOf(EmitContext ec, AddressOp mode) { if ((mode & AddressOp.Store) != 0) spec.MemberDefinition.SetIsAssigned (); if ((mode & AddressOp.Load) != 0) spec.MemberDefinition.SetIsUsed (); // // Handle initonly fields specially: make a copy and then // get the address of the copy. // bool need_copy; if (spec.IsReadOnly){ need_copy = true; if (ec.HasSet (EmitContext.Options.ConstructorScope)){ if (IsStatic){ if (ec.IsStatic) need_copy = false; } else need_copy = false; } } else need_copy = false; if (need_copy){ LocalBuilder local; Emit (ec); local = ec.DeclareLocal (type, false); ec.Emit (OpCodes.Stloc, local); ec.Emit (OpCodes.Ldloca, local); return; } if (IsStatic){ ec.Emit (OpCodes.Ldsflda, spec); } else { if (!prepared) EmitInstance (ec, false); ec.Emit (OpCodes.Ldflda, spec); } }