<commit_before>using System;
// using System.Collections.Generic;
// using System.IO;
// 
// using CPU = Indy.IL2CPU.Assembler;
// using System.Reflection;
// using Indy.IL2CPU.Compiler;
using CPUx86 = Indy.IL2CPU.Assembler.X86;
namespace Cosmos.IL2CPU.X86.IL
{
    [Cosmos.IL2CPU.OpCode( ILOpCode.Code.Ldfld )]
    public class Ldfld : ILOp
    {
        public Ldfld( Cosmos.IL2CPU.Assembler aAsmblr )
            : base( aAsmblr )
        {
        }

        public override void Execute( MethodInfo aMethod, ILOpCode aOpCode )
        {
            var xType = aMethod.MethodBase.DeclaringType;
            var xOpCode = ( ILOpCodes.OpField )aOpCode;

            //             if (!xType.Fields.ContainsKey(mFieldId))
            //             {
            //                 Console.Write("");
            //                 xType = GetService<IMetaDataInfoService>().GetTypeInfo(mDeclaringType);
            //                 xType = GetService<IMetaDataInfoService>().GetTypeInfo(mDeclaringType);
            //                 xType = GetService<IMetaDataInfoService>().GetTypeInfo(mDeclaringType);
            //                 xType = GetService<IMetaDataInfoService>().GetTypeInfo(mDeclaringType);
            //             }
            //             mFieldInfo = xType.Fields[mFieldId];
            // 			Ldfld(Assembler, xType, mFieldId);
            Assembler.Stack.Pop();
            int aExtraOffset = 0;
            if( aType.NeedsGC )
            {
                aExtraOffset = 12;
            }
            new Comment( "Type = '" + aType.TypeDef.FullName + "', NeedsGC = " + aType.NeedsGC );
            new CPUx86.Pop { DestinationReg = CPUx86.Registers.ECX };
            new CPUx86.Add { DestinationReg = CPUx86.Registers.ECX, SourceValue = ( uint )( aField.Offset + aExtraOffset ) };
            if( aField.IsExternalField && aDerefExternalField )
            {
                new CPUx86.Move { DestinationReg = CPUx86.Registers.ECX, SourceReg = CPUx86.Registers.ECX, SourceIsIndirect = true };
            }
            for( int i = 1; i <= ( aField.Size / 4 ); i++ )
            {
                new CPUx86.Move { DestinationReg = CPUx86.Registers.EAX, SourceReg = CPUx86.Registers.ECX, SourceIsIndirect = true, SourceDisplacement = ( aField.Size - ( i * 4 ) ) };
                new CPUx86.Push { DestinationReg = CPUx86.Registers.EAX };
            }
            switch( aField.Size % 4 )
            {
                case 1:
                    {
                        new CPUx86.Move { DestinationReg = CPUx86.Registers.EAX, SourceValue = 0 };
                        new CPUx86.Move { DestinationReg = CPUx86.Registers.AL, SourceReg = CPUx86.Registers.ECX, SourceIsIndirect = true };
                        new CPUx86.Push { DestinationReg = CPUx86.Registers.EAX };
                        break;
                    }
                case 2:
                    {
                        new CPUx86.Move { DestinationReg = CPUx86.Registers.EAX, SourceValue = 0 };
                        new CPUx86.Move { DestinationReg = CPUx86.Registers.AX, SourceReg = CPUx86.Registers.ECX, SourceIsIndirect = true };
                        new CPUx86.Push { DestinationReg = CPUx86.Registers.EAX };
                        break;
                    }

                case 3: //For Release
                    {
                        new CPUx86.Move { DestinationReg = CPUx86.Registers.EAX, SourceValue = 0 };
                        new CPUx86.Move { DestinationReg = CPUx86.Registers.EAX, SourceReg = CPUx86.Registers.ECX, SourceIsIndirect = true };
                        new CPUx86.ShiftRight { DestinationReg = CPUx86.Registers.EAX, SourceValue = 8 };
                        new CPUx86.Push { DestinationReg = CPUx86.Registers.EAX };
                        break;
                    }
                case 0:
                    {
                        break;
                    }
                default:
                    throw new Exception( "Remainder size " + aField.FieldType.ToString() + ( aField.Size ) + " not supported!" );
            }
            if( aAddGCCode && aField.NeedsGC )
            {
                new CPUx86.Push { DestinationReg = CPUx86.Registers.ESP, DestinationIsIndirect = true };
                new CPUx86.Call { DestinationLabel = MethodInfoLabelGenerator.GenerateLabelName( GCImplementationRefs.IncRefCountRef ) };
            }
            Assembler.Stack.Push( new StackContents.Item( aField.Size, aField.FieldType ) );
        }

        // 	public class Ldfld: Op {
        //         private Type mDeclaringType;
        // 		private TypeInformation.Field mFieldInfo;
        // 		private readonly TypeInformation mTypeInfo;
        //         private string mFieldId;
        // 
        // 		public Ldfld(ILReader aReader, MethodInformation aMethodInfo)
        // 			: base(aReader, aMethodInfo) {
        // 			FieldInfo xField = aReader.OperandValueField;
        // 			if (xField == null) {
        // 					throw new Exception("Field not found!");
        // 			}
        // 			mFieldId = xField.GetFullName();
        //             mDeclaringType = xField.DeclaringType;
        // 		}

    }
}<commit_msg>Ported code<commit_after>using System;
// using System.Collections.Generic;
// using System.IO;
// 
// using CPU = Indy.IL2CPU.Assembler;
// using System.Reflection;
using Indy.IL2CPU;
using Cosmos.IL2CPU.ILOpCodes;
using CPUx86 = Indy.IL2CPU.Assembler.X86;
namespace Cosmos.IL2CPU.X86.IL
{
    /// <summary>
    /// Finds the value of a field in the object whose reference is currently on the evaluation stack.
    /// </summary>
    /// <remarks>
    /// MSDN:
    /// The stack transitional behavior, in sequential order, is:
    /// 1. An object reference (or pointer) is pushed onto the stack.
    /// 2. The object reference (or pointer) is popped from the stack; the value of the specified field in the object is found.
    /// 3. The value stored in the field is pushed onto the stack.
    /// The ldfld instruction pushes the value of a field located in an object onto the stack. 
    /// The object must be on the stack as an object reference (type O), a managed pointer (type &), 
    /// an unmanaged pointer (type native int), a transient pointer (type *), or an instance of a value type. 
    /// The use of an unmanaged pointer is not permitted in verifiable code. 
    /// The object's field is specified by a metadata token that must refer to a field member. 
    /// The return type is the same as the one associated with the field. The field may be either an instance field 
    /// (in which case the object must not be a null reference) or a static field.
    /// 
    /// The ldfld instruction can be preceded by either or both of the Unaligned and Volatile prefixes.
    /// 
    /// NullReferenceException is thrown if the object is null and the field is not static.
    /// 
    /// MissingFieldException is thrown if the specified field is not found in the metadata. 
    /// 
    /// This is typically checked when Microsoft Intermediate Language (MSIL) instructions are converted to native code, not at run time.
    /// </remarks> 
    [Cosmos.IL2CPU.OpCode( ILOpCode.Code.Ldfld )]
    public class Ldfld : ILOp
    {
        public Ldfld( Cosmos.IL2CPU.Assembler aAsmblr )
            : base( aAsmblr )
        {
        }

        public override void Execute( MethodInfo aMethod, ILOpCode aOpCode )
        {
            var xType = aMethod.MethodBase.DeclaringType;
            var xOpCode = ( ILOpCodes.OpField )aOpCode;
            System.Reflection.FieldInfo xField = xOpCode.Value;

            Assembler.Stack.Pop();
            int aExtraOffset = 0;
            bool xNeedsGC = xField.FieldType.IsClass && !xField.FieldType.IsValueType;
            uint xSize = SizeOfType( xField.FieldType ); 
            if( xNeedsGC )
            {
                aExtraOffset = 12;
            }
            new Comment( "Type = '" + xField.FieldType.FullName + "', NeedsGC = " + xNeedsGC );
            new CPUx86.Pop { DestinationReg = CPUx86.Registers.ECX };
            new CPUx86.Add { DestinationReg = CPUx86.Registers.ECX, SourceValue = ( uint )( aField.Offset + aExtraOffset ) };
            if( aField.IsExternalField && aDerefExternalField )
            {
                new CPUx86.Move { DestinationReg = CPUx86.Registers.ECX, SourceReg = CPUx86.Registers.ECX, SourceIsIndirect = true };
            }
            for( int i = 1; i <= ( xSize / 4 ); i++ )
            {
                new CPUx86.Move { DestinationReg = CPUx86.Registers.EAX, SourceReg = CPUx86.Registers.ECX, SourceIsIndirect = true, SourceDisplacement = ( aField.Size - ( i * 4 ) ) };
                new CPUx86.Push { DestinationReg = CPUx86.Registers.EAX };
            }
            switch( xSize % 4 )
            {
                case 1:
                    {
                        new CPUx86.Move { DestinationReg = CPUx86.Registers.EAX, SourceValue = 0 };
                        new CPUx86.Move { DestinationReg = CPUx86.Registers.AL, SourceReg = CPUx86.Registers.ECX, SourceIsIndirect = true };
                        new CPUx86.Push { DestinationReg = CPUx86.Registers.EAX };
                        break;
                    }
                case 2:
                    {
                        new CPUx86.Move { DestinationReg = CPUx86.Registers.EAX, SourceValue = 0 };
                        new CPUx86.Move { DestinationReg = CPUx86.Registers.AX, SourceReg = CPUx86.Registers.ECX, SourceIsIndirect = true };
                        new CPUx86.Push { DestinationReg = CPUx86.Registers.EAX };
                        break;
                    }

                case 3: //For Release
                    {
                        new CPUx86.Move { DestinationReg = CPUx86.Registers.EAX, SourceValue = 0 };
                        new CPUx86.Move { DestinationReg = CPUx86.Registers.EAX, SourceReg = CPUx86.Registers.ECX, SourceIsIndirect = true };
                        new CPUx86.ShiftRight { DestinationReg = CPUx86.Registers.EAX, SourceValue = 8 };
                        new CPUx86.Push { DestinationReg = CPUx86.Registers.EAX };
                        break;
                    }
                case 0:
                    {
                        break;
                    }
                default:
                    throw new Exception( "Remainder size " + xField.FieldType.ToString() + ( xSize ) + " not supported!" );
            }
            if( xNeedsGC )
            {
                new CPUx86.Push { DestinationReg = CPUx86.Registers.ESP, DestinationIsIndirect = true };
                new CPUx86.Call { DestinationLabel = MethodInfoLabelGenerator.GenerateLabelName( GCImplementationRefs.IncRefCountRef ) };
            }
            Assembler.Stack.Push( new StackContents.Item( (int)xSize, xField.FieldType ) );
        }

        // 	public class Ldfld: Op {
        //         private Type mDeclaringType;
        // 		private TypeInformation.Field mFieldInfo;
        // 		private readonly TypeInformation mTypeInfo;
        //         private string mFieldId;
        // 
        // 		public Ldfld(ILReader aReader, MethodInformation aMethodInfo)
        // 			: base(aReader, aMethodInfo) {
        // 			FieldInfo xField = aReader.OperandValueField;
        // 			if (xField == null) {
        // 					throw new Exception("Field not found!");
        // 			}
        // 			mFieldId = xField.GetFullName();
        //             mDeclaringType = xField.DeclaringType;
        // 		}

    }
}
{'fraction_non_alphanumeric': 0.0947359322326908, 'fraction_numerical': 0.018151957818307547, 'mean_word_length': 1.5848972296693475, 'pattern_counts': {'":': 0, '<': 13, '<?xml version=': 0, '>': 11, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '518528', 'n_tokens_mistral': 3474, 'n_tokens_neox': 3217, 'n_words': 782}