Exemplo n.º 1
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);
            value_target.AddressOf(ec, Mode);
        }
Exemplo n.º 2
0
        public override void AddressOf(EmitContext ec, AddressOp mode)
        {
            base.AddressOf(ec, mode);

            if (mode == AddressOp.Load)
            {
                IsAvailableForReuse = true;
            }
        }
Exemplo n.º 3
0
        public override void AddressOf(EmitContext ec, AddressOp mode)
        {
            base.AddressOf(ec, mode);

            if (mode == AddressOp.Load)
            {
                var field = (Field)spec.MemberDefinition;
                field.IsAvailableForReuse = true;
            }
        }
Exemplo n.º 4
0
        public void AddressOf(EmitContext ec, AddressOp mode)
        {
            IMemoryLocation ml = expr as VariableReference;

            if (ml != null)
            {
                ml.AddressOf(ec, mode);
            }
            else
            {
                LocalVariable.AddressOf(ec, mode);
            }
        }
Exemplo n.º 5
0
        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);
        }
Exemplo n.º 6
0
        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);
            }
        }
Exemplo n.º 7
0
        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);
            }
        }
Exemplo n.º 8
0
        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);
        }
Exemplo n.º 9
0
		public void AddressOf (EmitContext ec, AddressOp mode)
		{
			HoistedVariable hv = GetHoistedVariable (ec);
			if (hv != null) {
				hv.AddressOf (ec, mode);
				return;
			}

			Variable.EmitAddressOf (ec);
		}
Exemplo n.º 10
0
		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);
			}
		}
Exemplo n.º 11
0
		public void AddressOf (EmitContext ec, AddressOp Mode)
		{
			// nothing
		}
Exemplo n.º 12
0
        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);
            }
        }
Exemplo n.º 13
0
		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 ());
			}
		}
Exemplo n.º 14
0
		public void AddressOf (EmitContext ec, AddressOp mode)
		{
			VariableInfo vi = VariableInfo;

			ec.ig.Emit (OpCodes.Ldloca, vi.LocalBuilder);
		}
Exemplo n.º 15
0
		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);
		}
Exemplo n.º 16
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);
		}
Exemplo n.º 17
0
 public void AddressOf(EmitContext ec, AddressOp mode)
 {
     unwrap.AddressOf(ec, mode);
 }
Exemplo n.º 18
0
 public void AddressOf(EmitContext ec, AddressOp mode)
 {
     throw new NotImplementedException ();
 }
Exemplo n.º 19
0
 public void AddressOf(EmitContext ec, AddressOp mode)
 {
     throw new NotImplementedException();
 }
Exemplo n.º 20
0
		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);
		}
Exemplo n.º 21
0
		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);
		}
Exemplo n.º 22
0
		public void AddressOf (EmitContext ec, AddressOp mode)
		{
			if (IsHoistedEmitRequired (ec)) {
				HoistedVariable.AddressOf (ec, mode);
				return;
			}

			Variable.EmitAddressOf (ec);
		}
Exemplo n.º 23
0
		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 ());
			}
		}
Exemplo n.º 24
0
		public void AddressOf (EmitContext ec, AddressOp mode)
		{
			EmitAddressOf (ec, mode);
		}
Exemplo n.º 25
0
		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;
		}
Exemplo n.º 26
0
		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);
		}
Exemplo n.º 27
0
		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);
			}
		}
Exemplo n.º 28
0
Arquivo: assign.cs Projeto: dyxu/vimrc
		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);
			}
		}
Exemplo n.º 29
0
		public void AddressOf (EmitContext ec, AddressOp Mode)
		{
			expr.Emit (ec);
		}
Exemplo n.º 30
0
		public void AddressOf (EmitContext ec, AddressOp mode)
		{
			IMemoryLocation ml = expr as VariableReference;
			if (ml != null)
				ml.AddressOf (ec, mode);
			else
				LocalVariable.AddressOf (ec, mode);
		}
Exemplo n.º 31
0
			public void AddressOf (EmitContext ec, AddressOp mode)
			{
				new_instance.instance.AddressOf (ec, mode);
			}
Exemplo n.º 32
0
		public void AddressOf (EmitContext ec, AddressOp mode)
		{
			unwrap.AddressOf (ec, mode);
		}
Exemplo n.º 33
0
		protected override IMemoryLocation EmitAddressOf (EmitContext ec, AddressOp Mode)
		{
			instance = base.EmitAddressOf (ec, Mode);

			if (!initializers.IsEmpty)
				initializers.Emit (ec);

			return instance;
		}
Exemplo n.º 34
0
		public void AddressOf (EmitContext ec, AddressOp mode)
		{
			GetFieldExpression (ec).AddressOf (ec, mode);
		}
Exemplo n.º 35
0
		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);
		}