public void AddressOf(EmitContext ec, AddressOp Mode) { LocalTemporary value_target = new LocalTemporary(type); value_target.AddressOf(ec, AddressOp.Store); ec.Emit(OpCodes.Initobj, type); value_target.AddressOf(ec, Mode); }
public override void AddressOf(EmitContext ec, AddressOp mode) { base.AddressOf(ec, mode); if (mode == AddressOp.Load) { IsAvailableForReuse = true; } }
public override void AddressOf(EmitContext ec, AddressOp mode) { base.AddressOf(ec, mode); if (mode == AddressOp.Load) { var field = (Field)spec.MemberDefinition; field.IsAvailableForReuse = true; } }
public void AddressOf(EmitContext ec, AddressOp mode) { IMemoryLocation ml = expr as VariableReference; if (ml != null) { ml.AddressOf(ec, mode); } else { LocalVariable.AddressOf(ec, mode); } }
public virtual void Emit(EmitContext ec) { if (!IsByRef) { Expr.Emit(ec); return; } AddressOp mode = AddressOp.Store; if (ArgType == AType.Ref) { mode |= AddressOp.Load; } IMemoryLocation ml = (IMemoryLocation)Expr; ml.AddressOf(ec, mode); }
public void AddressOf(EmitContext ec, AddressOp mode) { if (builder == null) { builder = ec.GetTemporaryLocal(is_address ? TypeManager.GetReferenceType(type): type); } // if is_address, than this is just the address anyways, // so we just return this. ILGenerator ig = ec.ig; if (is_address) { ig.Emit(OpCodes.Ldloc, builder); } else { ig.Emit(OpCodes.Ldloca, builder); } }
public void AddressOf(EmitContext ec, AddressOp mode) { if (builder == null) { builder = ec.GetTemporaryLocal(type); } if (builder.LocalType.IsByRef) { // // if is_address, than this is just the address anyways, // so we just return this. // ec.Emit(OpCodes.Ldloc, builder); } else { ec.Emit(OpCodes.Ldloca, builder); } }
public void AddressOf(EmitContext ec, AddressOp mode) { IMemoryLocation ml; if (temp_field != null) { ml = temp_field as IMemoryLocation; if (ml == null) { var lt = new LocalTemporary (temp_field.Type); temp_field.Emit (ec); lt.Store (ec); ml = lt; } } else { ml = expr as VariableReference; } if (ml != null) ml.AddressOf (ec, mode); else LocalVariable.AddressOf (ec, mode); }
public void AddressOf (EmitContext ec, AddressOp mode) { HoistedVariable hv = GetHoistedVariable (ec); if (hv != null) { hv.AddressOf (ec, mode); return; } Variable.EmitAddressOf (ec); }
public void AddressOf (EmitContext ec, AddressOp mode) { int arg_idx = idx; if (!ec.IsStatic) arg_idx++; if (is_ref){ if (arg_idx <= 255) ec.ig.Emit (OpCodes.Ldarg_S, (byte) arg_idx); else ec.ig.Emit (OpCodes.Ldarg, arg_idx); } else { if (arg_idx <= 255) ec.ig.Emit (OpCodes.Ldarga_S, (byte) arg_idx); else ec.ig.Emit (OpCodes.Ldarga, arg_idx); } }
public void AddressOf (EmitContext ec, AddressOp Mode) { // nothing }
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); } }
public void AddressOf (EmitContext ec, AddressOp mode) { ILGenerator ig = ec.ig; FieldBase f = TypeManager.GetField (FieldInfo); if (f != null){ if ((f.ModFlags & Modifiers.VOLATILE) != 0){ Report.Warning (420, 1, loc, "`{0}': A volatile field references will not be treated as volatile", f.GetSignatureForError ()); } if ((mode & AddressOp.Store) != 0) f.SetAssigned (); if ((mode & AddressOp.Load) != 0) f.SetMemberIsUsed (); } // // Handle initonly fields specially: make a copy and then // get the address of the copy. // bool need_copy; if (FieldInfo.IsInitOnly){ need_copy = true; if (ec.IsConstructor){ if (FieldInfo.IsStatic){ if (ec.IsStatic) need_copy = false; } else need_copy = false; } } else need_copy = false; if (need_copy){ LocalBuilder local; Emit (ec); local = ig.DeclareLocal (type); ig.Emit (OpCodes.Stloc, local); ig.Emit (OpCodes.Ldloca, local); return; } if (FieldInfo.IsStatic){ ig.Emit (OpCodes.Ldsflda, GetConstructedFieldInfo ()); } else { if (!prepared) EmitInstance (ec, false); ig.Emit (OpCodes.Ldflda, GetConstructedFieldInfo ()); } }
public void AddressOf (EmitContext ec, AddressOp mode) { VariableInfo vi = VariableInfo; ec.ig.Emit (OpCodes.Ldloca, vi.LocalBuilder); }
public void AddressOf (EmitContext ec, AddressOp mode) { ec.ig.Emit (OpCodes.Ldarg_0); // FIMXE // FIGURE OUT WHY LDARG_S does not work // // consider: struct X { int val; int P { set { val = value; }}} // // Yes, this looks very bad. Look at `NOTAS' for // an explanation. // ec.ig.Emit (OpCodes.Ldarga_S, (byte) 0); }
public void AddressOf (EmitContext ec, AddressOp Mode) { LocalTemporary value_target = new LocalTemporary (type); value_target.AddressOf (ec, AddressOp.Store); ec.Emit (OpCodes.Initobj, type); ((IMemoryLocation) value_target).AddressOf (ec, Mode); }
public void AddressOf(EmitContext ec, AddressOp mode) { unwrap.AddressOf(ec, mode); }
public void AddressOf(EmitContext ec, AddressOp mode) { throw new NotImplementedException (); }
public void AddressOf(EmitContext ec, AddressOp mode) { throw new NotImplementedException(); }
public void AddressOf (EmitContext ec, AddressOp Mode) { if (temporary != null){ if (have_temporary){ temporary.Emit (ec); return; } expr.Emit (ec); ec.ig.Emit (OpCodes.Dup); temporary.Store (ec); have_temporary = true; } else expr.Emit (ec); }
public void AddressOf (EmitContext ec, AddressOp Mode) { if (is_type_parameter) { LocalTemporary temp = new LocalTemporary (type); DoEmitTypeParameter (ec); temp.Store (ec); temp.AddressOf (ec, Mode); return; } if (!type.IsValueType){ // // We throw an exception. So far, I believe we only need to support // value types: // foreach (int j in new StructType ()) // see bug 42390 // throw new Exception ("AddressOf should not be used for classes"); } LocalTemporary value_target = new LocalTemporary (type); IMemoryLocation ml = (IMemoryLocation) value_target; ml.AddressOf (ec, AddressOp.Store); if (method == null) { ec.ig.Emit (OpCodes.Initobj, type); } else { method.EmitArguments (ec, Arguments); ec.ig.Emit (OpCodes.Call, (ConstructorInfo) method); } ((IMemoryLocation) value_target).AddressOf (ec, Mode); }
public void AddressOf (EmitContext ec, AddressOp mode) { if (IsHoistedEmitRequired (ec)) { HoistedVariable.AddressOf (ec, mode); return; } Variable.EmitAddressOf (ec); }
public void AddressOf (EmitContext ec, AddressOp mode) { ILGenerator ig = ec.ig; FieldBase f = TypeManager.GetField (FieldInfo); if (f != null){ if ((mode & AddressOp.Store) != 0) f.SetAssigned (); if ((mode & AddressOp.Load) != 0) f.SetMemberIsUsed (); } // // Handle initonly fields specially: make a copy and then // get the address of the copy. // bool need_copy; if (FieldInfo.IsInitOnly){ need_copy = true; if (ec.HasSet (EmitContext.Options.ConstructorScope)){ if (FieldInfo.IsStatic){ if (ec.IsStatic) need_copy = false; } else need_copy = false; } } else need_copy = false; if (need_copy){ LocalBuilder local; Emit (ec); local = ig.DeclareLocal (type); ig.Emit (OpCodes.Stloc, local); ig.Emit (OpCodes.Ldloca, local); return; } if (FieldInfo.IsStatic){ ig.Emit (OpCodes.Ldsflda, GetConstructedFieldInfo ()); } else { if (!prepared) EmitInstance (ec, false); ig.Emit (OpCodes.Ldflda, GetConstructedFieldInfo ()); } }
public void AddressOf (EmitContext ec, AddressOp mode) { EmitAddressOf (ec, mode); }
protected virtual IMemoryLocation EmitAddressOf (EmitContext ec, AddressOp mode) { LocalTemporary value_target = new LocalTemporary (type); if (is_type_parameter) { DoEmitTypeParameter (ec); value_target.Store (ec); value_target.AddressOf (ec, mode); return value_target; } if (!TypeManager.IsStruct (type)){ // // We throw an exception. So far, I believe we only need to support // value types: // foreach (int j in new StructType ()) // see bug 42390 // throw new Exception ("AddressOf should not be used for classes"); } value_target.AddressOf (ec, AddressOp.Store); if (method == null) { ec.ig.Emit (OpCodes.Initobj, type); } else { if (Arguments != null) Arguments.Emit (ec); ec.ig.Emit (OpCodes.Call, (ConstructorInfo) method); } value_target.AddressOf (ec, mode); return value_target; }
public void AddressOf (EmitContext ec, AddressOp mode) { IMemoryLocation ml; if (temp_field != null) { ml = temp_field as IMemoryLocation; if (ml == null) { var lt = new LocalTemporary (temp_field.Type); temp_field.Emit (ec); lt.Store (ec); ml = lt; } } else { ml = expr as VariableReference; } if (ml != null) ml.AddressOf (ec, mode); else LocalVariable.AddressOf (ec, mode); }
public void AddressOf (EmitContext ec, AddressOp mode) { int rank = ea.Expr.Type.GetArrayRank (); ILGenerator ig = ec.ig; LoadArrayAndArguments (ec); if (rank == 1){ ig.Emit (OpCodes.Ldelema, type); } else { MethodInfo address = FetchAddressMethod (); ig.Emit (OpCodes.Call, address); } }
public void AddressOf (EmitContext ec, AddressOp mode) { if (builder == null) builder = ec.GetTemporaryLocal (type); if (builder.LocalType.IsByRef) { // // if is_address, than this is just the address anyways, // so we just return this. // ec.Emit (OpCodes.Ldloc, builder); } else { ec.Emit (OpCodes.Ldloca, builder); } }
public void AddressOf (EmitContext ec, AddressOp Mode) { expr.Emit (ec); }
public void AddressOf (EmitContext ec, AddressOp mode) { IMemoryLocation ml = expr as VariableReference; if (ml != null) ml.AddressOf (ec, mode); else LocalVariable.AddressOf (ec, mode); }
public void AddressOf (EmitContext ec, AddressOp mode) { new_instance.instance.AddressOf (ec, mode); }
public void AddressOf (EmitContext ec, AddressOp mode) { unwrap.AddressOf (ec, mode); }
protected override IMemoryLocation EmitAddressOf (EmitContext ec, AddressOp Mode) { instance = base.EmitAddressOf (ec, Mode); if (!initializers.IsEmpty) initializers.Emit (ec); return instance; }
public void AddressOf (EmitContext ec, AddressOp mode) { GetFieldExpression (ec).AddressOf (ec, mode); }
public void AddressOf (EmitContext ec, AddressOp mode) { if (builder == null) builder = ec.GetTemporaryLocal (is_address ? TypeManager.GetReferenceType (type): type); // if is_address, than this is just the address anyways, // so we just return this. ILGenerator ig = ec.ig; if (is_address) ig.Emit (OpCodes.Ldloc, builder); else ig.Emit (OpCodes.Ldloca, builder); }