using System; namespace Cosmos.IL2CPU.ILOpCodes { [Cosmos.IL2CPU.OpCode(ILOp.Code.Stsfld)] public class Stsfld: ILOpCode { #region Old code // using System; // using System.Collections.Generic; // using Indy.IL2CPU.Assembler; // // // using CPUx86 = Indy.IL2CPU.Assembler.X86; // using System.Reflection; // using Indy.IL2CPU.Compiler; // // namespace Indy.IL2CPU.IL.X86 { // [Cosmos.IL2CPU.OpCode(ILOp.Code.Stsfld)] // public class Stsfld: ILOpCode { // private string mDataName; // private Type mDataType; // private bool mNeedsGC; // private string mBaseLabel; // private string mNextLabel; // private string mCurLabel; // private uint mCurOffset; // private MethodInformation mMethodInformation; // // //public static void ScanOp(ILReader aReader, MethodInformation aMethodInfo, SortedList aMethodData) { // // FieldInfo xField = aReader.OperandValueField; // // Engine.QueueStaticField(xField); // //} // private FieldInfo mField; // public Stsfld(ILReader aReader, MethodInformation aMethodInfo) // : base(aReader, aMethodInfo) { // mField = aReader.OperandValueField; // mDataName = DataMember.GetStaticFieldName(mField); // mNeedsGC = !mField.FieldType.IsValueType; // mDataType = mField.FieldType; // mBaseLabel = GetInstructionLabel(aReader); // mMethodInformation = aMethodInfo; // mCurOffset = aReader.Position; // mCurLabel = IL.Op.GetInstructionLabel(aReader); // mNextLabel = IL.Op.GetInstructionLabel(aReader.NextPosition); // } // // public override void DoAssemble() { // var xSize = GetService().GetFieldStorageSize(mField.FieldType); // var xDecRefMethodInfo = GetService().GetMethodInfo(GCImplementationRefs.DecRefCountRef, // false); // // // if (mNeedsGC) { // new CPUx86.Push { DestinationRef = ElementReference.New(mDataName), DestinationIsIndirect = true }; // new CPUx86.Call { DestinationLabel = xDecRefMethodInfo.LabelName}; // } // for (int i = 0; i < (xSize / 4); i++) // { // new CPUx86.Pop { DestinationReg = CPUx86.Registers.EAX }; // new CPUx86.Move { DestinationRef = ElementReference.New(mDataName, i * 4), DestinationIsIndirect = true, SourceReg = CPUx86.Registers.EAX }; // } // switch (xSize % 4) // { // case 1: { // new CPUx86.Pop { DestinationReg = CPUx86.Registers.EAX }; // new CPUx86.Move { DestinationRef = ElementReference.New(mDataName, (int)((xSize / 4) * 4)), DestinationIsIndirect = true, SourceReg = CPUx86.Registers.AL }; // break; // } // case 2: { // new CPUx86.Pop { DestinationReg = CPUx86.Registers.EAX }; // new CPUx86.Move { DestinationRef = ElementReference.New(mDataName, (int)((xSize / 4) * 4)), DestinationIsIndirect = true, SourceReg = CPUx86.Registers.AX }; // break; // } // case 0: { // break; // } // default: // EmitNotImplementedException(Assembler, GetServiceProvider(), "Ldsfld: Remainder size " + (xSize % 4) + " not supported!", mCurLabel, mMethodInformation, mCurOffset, mNextLabel); // break; // // } // Assembler.StackContents.Pop(); // } // } // } #endregion } }