diff --git a/Il2CppTests/TestExpectedResults/GameAssembly-GenericTypes-x64.cs b/Il2CppTests/TestExpectedResults/GameAssembly-GenericTypes-x64.cs index c326941..101f367 100644 --- a/Il2CppTests/TestExpectedResults/GameAssembly-GenericTypes-x64.cs +++ b/Il2CppTests/TestExpectedResults/GameAssembly-GenericTypes-x64.cs @@ -33,7 +33,7 @@ using System.Runtime.InteropServices; [assembly: StringFreezing] // 0x000000018000E500-0x000000018000E770 // [assembly: TypeLibVersion] // 0x000000018000E500-0x000000018000E770 -// Image 1: GenericTypes.dll - Assembly: GenericTypes, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null - Types 1810-1832 +// Image 1: GenericTypes.dll - Assembly: GenericTypes, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null - Types 1810-1835 // [assembly: CompilationRelaxations] // 0x000000018000C600-0x000000018000C660 // [assembly: Debuggable] // 0x000000018000C600-0x000000018000C660 [assembly: RuntimeCompatibility] // 0x000000018000C600-0x000000018000C660 @@ -41,35 +41,35 @@ using System.Runtime.InteropServices; internal static class Consts // TypeDefIndex: 100 { // Fields - public const string MonoVersion = "2.6.5.0"; // Metadata: 0x000ED0B4 - public const string MonoCompany = "MONO development team"; // Metadata: 0x000ED0BF - public const string MonoProduct = "MONO Common language infrastructure"; // Metadata: 0x000ED0D8 - public const string MonoCopyright = "(c) various MONO Authors"; // Metadata: 0x000ED0FF - public const string FxVersion = "2.0.0.0"; // Metadata: 0x000ED11B - public const string VsVersion = "8.0.0.0"; // Metadata: 0x000ED126 - public const string FxFileVersion = "2.0.50727.1433"; // Metadata: 0x000ED131 - public const string VsFileVersion = "8.0.50727.1433"; // Metadata: 0x000ED143 - public const string AssemblyI18N = "I18N, Version=2.0.0.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756"; // Metadata: 0x000ED155 - public const string AssemblyMicrosoft_VisualStudio = "Microsoft.VisualStudio, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"; // Metadata: 0x000ED1A0 - public const string AssemblyMicrosoft_VisualStudio_Web = "Microsoft.VisualStudio.Web, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"; // Metadata: 0x000ED1FD - public const string AssemblyMicrosoft_VSDesigner = "Microsoft.VSDesigner, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"; // Metadata: 0x000ED25E - public const string AssemblyMono_Http = "Mono.Http, Version=2.0.0.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756"; // Metadata: 0x000ED2B9 - public const string AssemblyMono_Posix = "Mono.Posix, Version=2.0.0.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756"; // Metadata: 0x000ED309 - public const string AssemblyMono_Security = "Mono.Security, Version=2.0.0.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756"; // Metadata: 0x000ED35A - public const string AssemblyMono_Messaging_RabbitMQ = "Mono.Messaging.RabbitMQ, Version=2.0.0.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756"; // Metadata: 0x000ED3AE - public const string AssemblyCorlib = "mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"; // Metadata: 0x000ED40C - public const string AssemblySystem = "System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"; // Metadata: 0x000ED45B - public const string AssemblySystem_Data = "System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"; // Metadata: 0x000ED4A8 - public const string AssemblySystem_Design = "System.Design, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"; // Metadata: 0x000ED4FA - public const string AssemblySystem_DirectoryServices = "System.DirectoryServices, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"; // Metadata: 0x000ED54E - public const string AssemblySystem_Drawing = "System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"; // Metadata: 0x000ED5AD - public const string AssemblySystem_Drawing_Design = "System.Drawing.Design, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"; // Metadata: 0x000ED602 - public const string AssemblySystem_Messaging = "System.Messaging, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"; // Metadata: 0x000ED65E - public const string AssemblySystem_Security = "System.Security, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"; // Metadata: 0x000ED6B5 - public const string AssemblySystem_ServiceProcess = "System.ServiceProcess, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"; // Metadata: 0x000ED70B - public const string AssemblySystem_Web = "System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"; // Metadata: 0x000ED767 - public const string AssemblySystem_Windows_Forms = "System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"; // Metadata: 0x000ED7B8 - public const string AssemblySystem_Core = "System.Core, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"; // Metadata: 0x000ED813 + public const string MonoVersion = "2.6.5.0"; // Metadata: 0x000ED2D8 + public const string MonoCompany = "MONO development team"; // Metadata: 0x000ED2E3 + public const string MonoProduct = "MONO Common language infrastructure"; // Metadata: 0x000ED2FC + public const string MonoCopyright = "(c) various MONO Authors"; // Metadata: 0x000ED323 + public const string FxVersion = "2.0.0.0"; // Metadata: 0x000ED33F + public const string VsVersion = "8.0.0.0"; // Metadata: 0x000ED34A + public const string FxFileVersion = "2.0.50727.1433"; // Metadata: 0x000ED355 + public const string VsFileVersion = "8.0.50727.1433"; // Metadata: 0x000ED367 + public const string AssemblyI18N = "I18N, Version=2.0.0.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756"; // Metadata: 0x000ED379 + public const string AssemblyMicrosoft_VisualStudio = "Microsoft.VisualStudio, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"; // Metadata: 0x000ED3C4 + public const string AssemblyMicrosoft_VisualStudio_Web = "Microsoft.VisualStudio.Web, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"; // Metadata: 0x000ED421 + public const string AssemblyMicrosoft_VSDesigner = "Microsoft.VSDesigner, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"; // Metadata: 0x000ED482 + public const string AssemblyMono_Http = "Mono.Http, Version=2.0.0.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756"; // Metadata: 0x000ED4DD + public const string AssemblyMono_Posix = "Mono.Posix, Version=2.0.0.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756"; // Metadata: 0x000ED52D + public const string AssemblyMono_Security = "Mono.Security, Version=2.0.0.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756"; // Metadata: 0x000ED57E + public const string AssemblyMono_Messaging_RabbitMQ = "Mono.Messaging.RabbitMQ, Version=2.0.0.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756"; // Metadata: 0x000ED5D2 + public const string AssemblyCorlib = "mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"; // Metadata: 0x000ED630 + public const string AssemblySystem = "System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"; // Metadata: 0x000ED67F + public const string AssemblySystem_Data = "System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"; // Metadata: 0x000ED6CC + public const string AssemblySystem_Design = "System.Design, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"; // Metadata: 0x000ED71E + public const string AssemblySystem_DirectoryServices = "System.DirectoryServices, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"; // Metadata: 0x000ED772 + public const string AssemblySystem_Drawing = "System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"; // Metadata: 0x000ED7D1 + public const string AssemblySystem_Drawing_Design = "System.Drawing.Design, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"; // Metadata: 0x000ED826 + public const string AssemblySystem_Messaging = "System.Messaging, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"; // Metadata: 0x000ED882 + public const string AssemblySystem_Security = "System.Security, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"; // Metadata: 0x000ED8D9 + public const string AssemblySystem_ServiceProcess = "System.ServiceProcess, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"; // Metadata: 0x000ED92F + public const string AssemblySystem_Web = "System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"; // Metadata: 0x000ED98B + public const string AssemblySystem_Windows_Forms = "System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"; // Metadata: 0x000ED9DC + public const string AssemblySystem_Core = "System.Core, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"; // Metadata: 0x000EDA37 } internal sealed class Locale // TypeDefIndex: 101 @@ -118,7 +118,7 @@ namespace Il2CppTests.TestSources public Test() {} // 0x00000001800E5000-0x00000001800E5010 // Methods - public void GenericTypesTest() {} // 0x0000000180408870-0x0000000180408870 + public void GenericTypesTest() {} // 0x0000000180408930-0x0000000180408930 } internal class ConstrainedValueType // TypeDefIndex: 1820 @@ -228,4 +228,34 @@ namespace Il2CppTests.TestSources // Constructors public OuterGeneric() {} } + + public class NonGeneric // TypeDefIndex: 1833 + { + // Constructors + public NonGeneric() {} // 0x00000001800E5000-0x00000001800E5010 + + // Methods + public void GenericMethodDefinitionInNonGenericClass(T a) {} + } + + public class GenericClassWithMethods // TypeDefIndex: 1834 + { + // Constructors + public GenericClassWithMethods() {} + + // Methods + public void NonGenericMethodInGenericClass(T a) {} + public void NonGenericMethodInGenericClass2() {} + public void GenericMethodDefinitionInGenericClass(U a) {} + public void GenericMethodDefinitionInGenericClass2(T a, U b) {} + } + + public class CallGenericMethods : GenericClassWithMethods // TypeDefIndex: 1835 + { + // Constructors + public CallGenericMethods() {} // 0x0000000180408870-0x00000001804088B0 + + // Methods + public void CallMethods() {} // 0x00000001804087F0-0x0000000180408870 + } } diff --git a/Il2CppTests/TestExpectedResults/GameAssembly-GenericTypes-x86.cs b/Il2CppTests/TestExpectedResults/GameAssembly-GenericTypes-x86.cs index 14e2190..e64bb04 100644 --- a/Il2CppTests/TestExpectedResults/GameAssembly-GenericTypes-x86.cs +++ b/Il2CppTests/TestExpectedResults/GameAssembly-GenericTypes-x86.cs @@ -33,7 +33,7 @@ using System.Runtime.InteropServices; [assembly: StringFreezing] // 0x1000F350-0x1000F560 // [assembly: TypeLibVersion] // 0x1000F350-0x1000F560 -// Image 1: GenericTypes.dll - Assembly: GenericTypes, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null - Types 1810-1832 +// Image 1: GenericTypes.dll - Assembly: GenericTypes, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null - Types 1810-1835 // [assembly: CompilationRelaxations] // 0x1000D800-0x1000D850 // [assembly: Debuggable] // 0x1000D800-0x1000D850 [assembly: RuntimeCompatibility] // 0x1000D800-0x1000D850 @@ -41,35 +41,35 @@ using System.Runtime.InteropServices; internal static class Consts // TypeDefIndex: 100 { // Fields - public const string MonoVersion = "2.6.5.0"; // Metadata: 0x000ED0B4 - public const string MonoCompany = "MONO development team"; // Metadata: 0x000ED0BF - public const string MonoProduct = "MONO Common language infrastructure"; // Metadata: 0x000ED0D8 - public const string MonoCopyright = "(c) various MONO Authors"; // Metadata: 0x000ED0FF - public const string FxVersion = "2.0.0.0"; // Metadata: 0x000ED11B - public const string VsVersion = "8.0.0.0"; // Metadata: 0x000ED126 - public const string FxFileVersion = "2.0.50727.1433"; // Metadata: 0x000ED131 - public const string VsFileVersion = "8.0.50727.1433"; // Metadata: 0x000ED143 - public const string AssemblyI18N = "I18N, Version=2.0.0.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756"; // Metadata: 0x000ED155 - public const string AssemblyMicrosoft_VisualStudio = "Microsoft.VisualStudio, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"; // Metadata: 0x000ED1A0 - public const string AssemblyMicrosoft_VisualStudio_Web = "Microsoft.VisualStudio.Web, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"; // Metadata: 0x000ED1FD - public const string AssemblyMicrosoft_VSDesigner = "Microsoft.VSDesigner, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"; // Metadata: 0x000ED25E - public const string AssemblyMono_Http = "Mono.Http, Version=2.0.0.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756"; // Metadata: 0x000ED2B9 - public const string AssemblyMono_Posix = "Mono.Posix, Version=2.0.0.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756"; // Metadata: 0x000ED309 - public const string AssemblyMono_Security = "Mono.Security, Version=2.0.0.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756"; // Metadata: 0x000ED35A - public const string AssemblyMono_Messaging_RabbitMQ = "Mono.Messaging.RabbitMQ, Version=2.0.0.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756"; // Metadata: 0x000ED3AE - public const string AssemblyCorlib = "mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"; // Metadata: 0x000ED40C - public const string AssemblySystem = "System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"; // Metadata: 0x000ED45B - public const string AssemblySystem_Data = "System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"; // Metadata: 0x000ED4A8 - public const string AssemblySystem_Design = "System.Design, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"; // Metadata: 0x000ED4FA - public const string AssemblySystem_DirectoryServices = "System.DirectoryServices, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"; // Metadata: 0x000ED54E - public const string AssemblySystem_Drawing = "System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"; // Metadata: 0x000ED5AD - public const string AssemblySystem_Drawing_Design = "System.Drawing.Design, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"; // Metadata: 0x000ED602 - public const string AssemblySystem_Messaging = "System.Messaging, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"; // Metadata: 0x000ED65E - public const string AssemblySystem_Security = "System.Security, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"; // Metadata: 0x000ED6B5 - public const string AssemblySystem_ServiceProcess = "System.ServiceProcess, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"; // Metadata: 0x000ED70B - public const string AssemblySystem_Web = "System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"; // Metadata: 0x000ED767 - public const string AssemblySystem_Windows_Forms = "System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"; // Metadata: 0x000ED7B8 - public const string AssemblySystem_Core = "System.Core, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"; // Metadata: 0x000ED813 + public const string MonoVersion = "2.6.5.0"; // Metadata: 0x000ED2D8 + public const string MonoCompany = "MONO development team"; // Metadata: 0x000ED2E3 + public const string MonoProduct = "MONO Common language infrastructure"; // Metadata: 0x000ED2FC + public const string MonoCopyright = "(c) various MONO Authors"; // Metadata: 0x000ED323 + public const string FxVersion = "2.0.0.0"; // Metadata: 0x000ED33F + public const string VsVersion = "8.0.0.0"; // Metadata: 0x000ED34A + public const string FxFileVersion = "2.0.50727.1433"; // Metadata: 0x000ED355 + public const string VsFileVersion = "8.0.50727.1433"; // Metadata: 0x000ED367 + public const string AssemblyI18N = "I18N, Version=2.0.0.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756"; // Metadata: 0x000ED379 + public const string AssemblyMicrosoft_VisualStudio = "Microsoft.VisualStudio, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"; // Metadata: 0x000ED3C4 + public const string AssemblyMicrosoft_VisualStudio_Web = "Microsoft.VisualStudio.Web, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"; // Metadata: 0x000ED421 + public const string AssemblyMicrosoft_VSDesigner = "Microsoft.VSDesigner, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"; // Metadata: 0x000ED482 + public const string AssemblyMono_Http = "Mono.Http, Version=2.0.0.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756"; // Metadata: 0x000ED4DD + public const string AssemblyMono_Posix = "Mono.Posix, Version=2.0.0.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756"; // Metadata: 0x000ED52D + public const string AssemblyMono_Security = "Mono.Security, Version=2.0.0.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756"; // Metadata: 0x000ED57E + public const string AssemblyMono_Messaging_RabbitMQ = "Mono.Messaging.RabbitMQ, Version=2.0.0.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756"; // Metadata: 0x000ED5D2 + public const string AssemblyCorlib = "mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"; // Metadata: 0x000ED630 + public const string AssemblySystem = "System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"; // Metadata: 0x000ED67F + public const string AssemblySystem_Data = "System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"; // Metadata: 0x000ED6CC + public const string AssemblySystem_Design = "System.Design, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"; // Metadata: 0x000ED71E + public const string AssemblySystem_DirectoryServices = "System.DirectoryServices, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"; // Metadata: 0x000ED772 + public const string AssemblySystem_Drawing = "System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"; // Metadata: 0x000ED7D1 + public const string AssemblySystem_Drawing_Design = "System.Drawing.Design, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"; // Metadata: 0x000ED826 + public const string AssemblySystem_Messaging = "System.Messaging, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"; // Metadata: 0x000ED882 + public const string AssemblySystem_Security = "System.Security, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"; // Metadata: 0x000ED8D9 + public const string AssemblySystem_ServiceProcess = "System.ServiceProcess, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"; // Metadata: 0x000ED92F + public const string AssemblySystem_Web = "System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"; // Metadata: 0x000ED98B + public const string AssemblySystem_Windows_Forms = "System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"; // Metadata: 0x000ED9DC + public const string AssemblySystem_Core = "System.Core, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"; // Metadata: 0x000EDA37 } internal sealed class Locale // TypeDefIndex: 101 @@ -118,7 +118,7 @@ namespace Il2CppTests.TestSources public Test() {} // 0x100C3000-0x100C3010 // Methods - public void GenericTypesTest() {} // 0x1036D450-0x1036D450 + public void GenericTypesTest() {} // 0x1036D4F0-0x1036D4F0 } internal class ConstrainedValueType // TypeDefIndex: 1820 @@ -228,4 +228,34 @@ namespace Il2CppTests.TestSources // Constructors public OuterGeneric() {} } + + public class NonGeneric // TypeDefIndex: 1833 + { + // Constructors + public NonGeneric() {} // 0x100C3000-0x100C3010 + + // Methods + public void GenericMethodDefinitionInNonGenericClass(T a) {} + } + + public class GenericClassWithMethods // TypeDefIndex: 1834 + { + // Constructors + public GenericClassWithMethods() {} + + // Methods + public void NonGenericMethodInGenericClass(T a) {} + public void NonGenericMethodInGenericClass2() {} + public void GenericMethodDefinitionInGenericClass(U a) {} + public void GenericMethodDefinitionInGenericClass2(T a, U b) {} + } + + public class CallGenericMethods : GenericClassWithMethods // TypeDefIndex: 1835 + { + // Constructors + public CallGenericMethods() {} // 0x1036D440-0x1036D480 + + // Methods + public void CallMethods() {} // 0x1036D3D0-0x1036D440 + } } diff --git a/Il2CppTests/TestExpectedResults/GenericTypes.cs b/Il2CppTests/TestExpectedResults/GenericTypes.cs index 7133a3d..aad651c 100644 --- a/Il2CppTests/TestExpectedResults/GenericTypes.cs +++ b/Il2CppTests/TestExpectedResults/GenericTypes.cs @@ -11,75 +11,75 @@ using System.Runtime.CompilerServices; using System.Runtime.InteropServices; // Image 0: mscorlib.dll - Assembly: mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - Types 0-1809 -// [assembly: AssemblyCompany] // 0x000A795C-0x000A7C50 -// [assembly: AssemblyCopyright] // 0x000A795C-0x000A7C50 -// [assembly: AssemblyDefaultAlias] // 0x000A795C-0x000A7C50 -// [assembly: AssemblyDelaySign] // 0x000A795C-0x000A7C50 -// [assembly: AssemblyDescription] // 0x000A795C-0x000A7C50 -// [assembly: AssemblyFileVersion] // 0x000A795C-0x000A7C50 -// [assembly: AssemblyInformationalVersion] // 0x000A795C-0x000A7C50 -// [assembly: AssemblyKeyFile] // 0x000A795C-0x000A7C50 -// [assembly: AssemblyProduct] // 0x000A795C-0x000A7C50 -// [assembly: AssemblyTitle] // 0x000A795C-0x000A7C50 -// [assembly: CLSCompliant] // 0x000A795C-0x000A7C50 -// [assembly: CompilationRelaxations] // 0x000A795C-0x000A7C50 -// [assembly: ComVisible] // 0x000A795C-0x000A7C50 -// [assembly: Debuggable] // 0x000A795C-0x000A7C50 -// [assembly: DefaultDependency] // 0x000A795C-0x000A7C50 -// [assembly: Guid] // 0x000A795C-0x000A7C50 -// [assembly: NeutralResourcesLanguage] // 0x000A795C-0x000A7C50 -[assembly: RuntimeCompatibility] // 0x000A795C-0x000A7C50 -// [assembly: SatelliteContractVersion] // 0x000A795C-0x000A7C50 -[assembly: StringFreezing] // 0x000A795C-0x000A7C50 -// [assembly: TypeLibVersion] // 0x000A795C-0x000A7C50 +// [assembly: AssemblyCompany] // 0x000A7AE4-0x000A7DD8 +// [assembly: AssemblyCopyright] // 0x000A7AE4-0x000A7DD8 +// [assembly: AssemblyDefaultAlias] // 0x000A7AE4-0x000A7DD8 +// [assembly: AssemblyDelaySign] // 0x000A7AE4-0x000A7DD8 +// [assembly: AssemblyDescription] // 0x000A7AE4-0x000A7DD8 +// [assembly: AssemblyFileVersion] // 0x000A7AE4-0x000A7DD8 +// [assembly: AssemblyInformationalVersion] // 0x000A7AE4-0x000A7DD8 +// [assembly: AssemblyKeyFile] // 0x000A7AE4-0x000A7DD8 +// [assembly: AssemblyProduct] // 0x000A7AE4-0x000A7DD8 +// [assembly: AssemblyTitle] // 0x000A7AE4-0x000A7DD8 +// [assembly: CLSCompliant] // 0x000A7AE4-0x000A7DD8 +// [assembly: CompilationRelaxations] // 0x000A7AE4-0x000A7DD8 +// [assembly: ComVisible] // 0x000A7AE4-0x000A7DD8 +// [assembly: Debuggable] // 0x000A7AE4-0x000A7DD8 +// [assembly: DefaultDependency] // 0x000A7AE4-0x000A7DD8 +// [assembly: Guid] // 0x000A7AE4-0x000A7DD8 +// [assembly: NeutralResourcesLanguage] // 0x000A7AE4-0x000A7DD8 +[assembly: RuntimeCompatibility] // 0x000A7AE4-0x000A7DD8 +// [assembly: SatelliteContractVersion] // 0x000A7AE4-0x000A7DD8 +[assembly: StringFreezing] // 0x000A7AE4-0x000A7DD8 +// [assembly: TypeLibVersion] // 0x000A7AE4-0x000A7DD8 -// Image 1: GenericTypes.dll - Assembly: GenericTypes, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null - Types 1810-1832 -// [assembly: CompilationRelaxations] // 0x000A7D64-0x000A7DB8 -// [assembly: Debuggable] // 0x000A7D64-0x000A7DB8 -[assembly: RuntimeCompatibility] // 0x000A7D64-0x000A7DB8 +// Image 1: GenericTypes.dll - Assembly: GenericTypes, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null - Types 1810-1835 +// [assembly: CompilationRelaxations] // 0x000A7EEC-0x000A7F40 +// [assembly: Debuggable] // 0x000A7EEC-0x000A7F40 +[assembly: RuntimeCompatibility] // 0x000A7EEC-0x000A7F40 internal static class Consts // TypeDefIndex: 100 { // Fields - public const string MonoVersion = "2.6.5.0"; // Metadata: 0x000ED0B4 - public const string MonoCompany = "MONO development team"; // Metadata: 0x000ED0BF - public const string MonoProduct = "MONO Common language infrastructure"; // Metadata: 0x000ED0D8 - public const string MonoCopyright = "(c) various MONO Authors"; // Metadata: 0x000ED0FF - public const string FxVersion = "2.0.0.0"; // Metadata: 0x000ED11B - public const string VsVersion = "8.0.0.0"; // Metadata: 0x000ED126 - public const string FxFileVersion = "2.0.50727.1433"; // Metadata: 0x000ED131 - public const string VsFileVersion = "8.0.50727.1433"; // Metadata: 0x000ED143 - public const string AssemblyI18N = "I18N, Version=2.0.0.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756"; // Metadata: 0x000ED155 - public const string AssemblyMicrosoft_VisualStudio = "Microsoft.VisualStudio, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"; // Metadata: 0x000ED1A0 - public const string AssemblyMicrosoft_VisualStudio_Web = "Microsoft.VisualStudio.Web, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"; // Metadata: 0x000ED1FD - public const string AssemblyMicrosoft_VSDesigner = "Microsoft.VSDesigner, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"; // Metadata: 0x000ED25E - public const string AssemblyMono_Http = "Mono.Http, Version=2.0.0.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756"; // Metadata: 0x000ED2B9 - public const string AssemblyMono_Posix = "Mono.Posix, Version=2.0.0.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756"; // Metadata: 0x000ED309 - public const string AssemblyMono_Security = "Mono.Security, Version=2.0.0.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756"; // Metadata: 0x000ED35A - public const string AssemblyMono_Messaging_RabbitMQ = "Mono.Messaging.RabbitMQ, Version=2.0.0.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756"; // Metadata: 0x000ED3AE - public const string AssemblyCorlib = "mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"; // Metadata: 0x000ED40C - public const string AssemblySystem = "System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"; // Metadata: 0x000ED45B - public const string AssemblySystem_Data = "System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"; // Metadata: 0x000ED4A8 - public const string AssemblySystem_Design = "System.Design, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"; // Metadata: 0x000ED4FA - public const string AssemblySystem_DirectoryServices = "System.DirectoryServices, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"; // Metadata: 0x000ED54E - public const string AssemblySystem_Drawing = "System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"; // Metadata: 0x000ED5AD - public const string AssemblySystem_Drawing_Design = "System.Drawing.Design, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"; // Metadata: 0x000ED602 - public const string AssemblySystem_Messaging = "System.Messaging, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"; // Metadata: 0x000ED65E - public const string AssemblySystem_Security = "System.Security, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"; // Metadata: 0x000ED6B5 - public const string AssemblySystem_ServiceProcess = "System.ServiceProcess, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"; // Metadata: 0x000ED70B - public const string AssemblySystem_Web = "System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"; // Metadata: 0x000ED767 - public const string AssemblySystem_Windows_Forms = "System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"; // Metadata: 0x000ED7B8 - public const string AssemblySystem_Core = "System.Core, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"; // Metadata: 0x000ED813 + public const string MonoVersion = "2.6.5.0"; // Metadata: 0x000ED2D8 + public const string MonoCompany = "MONO development team"; // Metadata: 0x000ED2E3 + public const string MonoProduct = "MONO Common language infrastructure"; // Metadata: 0x000ED2FC + public const string MonoCopyright = "(c) various MONO Authors"; // Metadata: 0x000ED323 + public const string FxVersion = "2.0.0.0"; // Metadata: 0x000ED33F + public const string VsVersion = "8.0.0.0"; // Metadata: 0x000ED34A + public const string FxFileVersion = "2.0.50727.1433"; // Metadata: 0x000ED355 + public const string VsFileVersion = "8.0.50727.1433"; // Metadata: 0x000ED367 + public const string AssemblyI18N = "I18N, Version=2.0.0.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756"; // Metadata: 0x000ED379 + public const string AssemblyMicrosoft_VisualStudio = "Microsoft.VisualStudio, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"; // Metadata: 0x000ED3C4 + public const string AssemblyMicrosoft_VisualStudio_Web = "Microsoft.VisualStudio.Web, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"; // Metadata: 0x000ED421 + public const string AssemblyMicrosoft_VSDesigner = "Microsoft.VSDesigner, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"; // Metadata: 0x000ED482 + public const string AssemblyMono_Http = "Mono.Http, Version=2.0.0.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756"; // Metadata: 0x000ED4DD + public const string AssemblyMono_Posix = "Mono.Posix, Version=2.0.0.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756"; // Metadata: 0x000ED52D + public const string AssemblyMono_Security = "Mono.Security, Version=2.0.0.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756"; // Metadata: 0x000ED57E + public const string AssemblyMono_Messaging_RabbitMQ = "Mono.Messaging.RabbitMQ, Version=2.0.0.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756"; // Metadata: 0x000ED5D2 + public const string AssemblyCorlib = "mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"; // Metadata: 0x000ED630 + public const string AssemblySystem = "System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"; // Metadata: 0x000ED67F + public const string AssemblySystem_Data = "System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"; // Metadata: 0x000ED6CC + public const string AssemblySystem_Design = "System.Design, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"; // Metadata: 0x000ED71E + public const string AssemblySystem_DirectoryServices = "System.DirectoryServices, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"; // Metadata: 0x000ED772 + public const string AssemblySystem_Drawing = "System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"; // Metadata: 0x000ED7D1 + public const string AssemblySystem_Drawing_Design = "System.Drawing.Design, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"; // Metadata: 0x000ED826 + public const string AssemblySystem_Messaging = "System.Messaging, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"; // Metadata: 0x000ED882 + public const string AssemblySystem_Security = "System.Security, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"; // Metadata: 0x000ED8D9 + public const string AssemblySystem_ServiceProcess = "System.ServiceProcess, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"; // Metadata: 0x000ED92F + public const string AssemblySystem_Web = "System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"; // Metadata: 0x000ED98B + public const string AssemblySystem_Windows_Forms = "System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"; // Metadata: 0x000ED9DC + public const string AssemblySystem_Core = "System.Core, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"; // Metadata: 0x000EDA37 } internal sealed class Locale // TypeDefIndex: 101 { // Constructors - private Locale() {} // 0x003ED908-0x003ED910 + private Locale() {} // 0x003EDAF8-0x003EDB00 // Methods - public static string GetText(string msg) => default; // 0x003ED910-0x003ED914 - public static string GetText(string fmt, params /* 0x000A6188-0x000A6198 */ object[] args) => default; // 0x003ED914-0x003ED9A0 + public static string GetText(string msg) => default; // 0x003EDB00-0x003EDB04 + public static string GetText(string fmt, params /* 0x000A6310-0x000A6320 */ object[] args) => default; // 0x003EDB04-0x003EDB90 } namespace Il2CppTests.TestSources @@ -115,10 +115,10 @@ namespace Il2CppTests.TestSources internal class Test // TypeDefIndex: 1819 { // Constructors - public Test() {} // 0x0057AFD8-0x0057AFE0 + public Test() {} // 0x0057B30C-0x0057B314 // Methods - public void GenericTypesTest() {} // 0x0057AE1C-0x0057AFD8 + public void GenericTypesTest() {} // 0x0057B150-0x0057B30C } internal class ConstrainedValueType // TypeDefIndex: 1820 @@ -169,7 +169,7 @@ namespace Il2CppTests.TestSources public ConstrainedRefType() {} // Methods - // [NullableContext] // 0x000A7D50-0x000A7D64 + // [NullableContext] // 0x000A7ED8-0x000A7EEC public void ConstrainedMethodNotNull(N notnullArgument, R bar) {} public void ConstrainedUnmanaged(U unmanagedArgument) where U : struct {} @@ -228,4 +228,34 @@ namespace Il2CppTests.TestSources // Constructors public OuterGeneric() {} } + + public class NonGeneric // TypeDefIndex: 1833 + { + // Constructors + public NonGeneric() {} // 0x0057B148-0x0057B150 + + // Methods + public void GenericMethodDefinitionInNonGenericClass(T a) {} + } + + public class GenericClassWithMethods // TypeDefIndex: 1834 + { + // Constructors + public GenericClassWithMethods() {} + + // Methods + public void NonGenericMethodInGenericClass(T a) {} + public void NonGenericMethodInGenericClass2() {} + public void GenericMethodDefinitionInGenericClass(U a) {} + public void GenericMethodDefinitionInGenericClass2(T a, U b) {} + } + + public class CallGenericMethods : GenericClassWithMethods // TypeDefIndex: 1835 + { + // Constructors + public CallGenericMethods() {} // 0x0057B0E4-0x0057B148 + + // Methods + public void CallMethods() {} // 0x0057B01C-0x0057B0E4 + } } diff --git a/Il2CppTests/TestGenericTypes.cs b/Il2CppTests/TestGenerics.cs similarity index 60% rename from Il2CppTests/TestGenericTypes.cs rename to Il2CppTests/TestGenerics.cs index 2c16978..692aafa 100644 --- a/Il2CppTests/TestGenericTypes.cs +++ b/Il2CppTests/TestGenerics.cs @@ -41,6 +41,17 @@ namespace Il2CppInspector TypeInfo tF = tDerived.GetField("F").FieldType; TypeInfo tNested = asm.GetType("Il2CppTests.TestSources.Derived`1+Nested"); + TypeInfo tNG = asm.GetType("Il2CppTests.TestSources.NonGeneric"); + TypeInfo tGCWM = asm.GetType("Il2CppTests.TestSources.GenericClassWithMethods`1"); + TypeInfo tCGM = asm.GetType("Il2CppTests.TestSources.CallGenericMethods"); + MethodInfo mGMDINGC = tNG.GetMethod("GenericMethodDefinitionInNonGenericClass"); + MethodInfo mNGMIGC = tGCWM.GetMethod("NonGenericMethodInGenericClass"); + MethodInfo mNGMIGC2 = tGCWM.GetMethod("NonGenericMethodInGenericClass2"); + MethodInfo mGMDIGC = tGCWM.GetMethod("GenericMethodDefinitionInGenericClass"); + MethodInfo mGMDIGC2 = tGCWM.GetMethod("GenericMethodDefinitionInGenericClass2"); + + // TODO: Test the methods in CallGenericMethodds.CallMethods (requires MethodSpec implementation) + DisplayGenericType(tBase, "Generic type definition Base"); DisplayGenericType(tDerived, "Derived"); DisplayGenericType(tDerivedBase, "Base type of Derived"); @@ -51,7 +62,7 @@ namespace Il2CppInspector DisplayGenericType(tNested, "Nested type in Derived"); // Assert - var checks = new[] { + var typeChecks = new[] { (tBase, "Base`2[T,U]", true, true, true, false, -1), (tDerived, "Derived`1[V]", true, true, true, false, -1), (tDerivedBase, "Base`2[System.String,V]", true, false, true, false, -1), @@ -62,7 +73,22 @@ namespace Il2CppInspector (tNested, "Derived`1[V]+Nested[V]", true, true, true, false, -1) }; - foreach (var check in checks) { + var methodChecks = new[] { + (mGMDINGC, "Void GenericMethodDefinitionInNonGenericClass[T](T)", true, true, true, false), + (mNGMIGC, "Void NonGenericMethodInGenericClass(T)", false, true, false, false), + (mNGMIGC2, "Void NonGenericMethodInGenericClass2()", false, true, false, false), + (mGMDIGC, "Void GenericMethodDefinitionInGenericClass[U](U)", true, true, true, false), + (mGMDIGC2, "Void GenericMethodDefinitionInGenericClass2[U](T, U)", true, true, true, false) + /* + (mGMDINGC_closed, "Void GenericMethodDefinitionInNonGenericClass[Single](Single)", true, false, false, false), + (mNGMIGC_closed, "Void NonGenericMethodInGenericClass(Int32)", false, false, false, false), + (mNGMIGC2_closed, "Void NonGenericMethodInGenericClass()", false, false, false, false), + (mGMDIGC_closed, "Void GenericMethodDefinitioninGenericClass[Int32](Int32)", true, true, false, true), + (mGMDIGC2_closed, "Void GenericMethodDefinitionInGenericClass2[String](T, System.String)", true, true, false, true) + */ + }; + + foreach (var check in typeChecks) { var t = check.Item1; Assert.That(t.ToString(), Is.EqualTo(check.Item2)); @@ -71,6 +97,16 @@ namespace Il2CppInspector Assert.That(t.ContainsGenericParameters, Is.EqualTo(check.Item5)); Assert.That(t.IsGenericParameter, Is.EqualTo(check.Item6)); } + + foreach (var check in methodChecks) { + var m = check.Item1; + + Assert.That(m.ToString(), Is.EqualTo(check.Item2)); + Assert.That(m.IsGenericMethod, Is.EqualTo(check.Item3)); + Assert.That(m.ContainsGenericParameters, Is.EqualTo(check.Item4)); + Assert.That(m.IsGenericMethodDefinition, Is.EqualTo(check.Item5)); + Assert.That(m.IsConstructedGenericMethod, Is.EqualTo(check.Item6)); + } } private void DisplayGenericType(TypeInfo t, string caption) { diff --git a/Il2CppTests/TestSources/GenericTypes.cs b/Il2CppTests/TestSources/GenericTypes.cs index d4f6f87..5dfb56c 100644 --- a/Il2CppTests/TestSources/GenericTypes.cs +++ b/Il2CppTests/TestSources/GenericTypes.cs @@ -6,6 +6,7 @@ using System; using System.Collections.Generic; +using Il2CppInspector; namespace Il2CppTests.TestSources { @@ -111,4 +112,32 @@ namespace Il2CppTests.TestSources public InnerGeneric2.SubInnerGeneric2 fieldOfSubInnerGeneric2; public InnerGeneric2.SubInnerGeneric3 fieldOfSubInnerGeneric3; } + + // Method tests + public class NonGeneric + { + public static void GenericMethodDefinitionInNonGenericClass(T a) {} // IsGenericMethod = true, ContainsGenericParameters = true, IGMD = true, ICGM = false + } + + public class GenericClassWithMethods + { + public void NonGenericMethodInGenericClass(T a) { } // IsGenericMethod = false, ContainsGenericParameters = true, IGMD = false, ICGM = false + + public void NonGenericMethodInGenericClass2() { } // IsGenericMethod = false, ContainsGenericParameters = true, IGMD = false, ICGM = false + + public void GenericMethodDefinitionInGenericClass(U a) { } // IsGenericMethod = true, ContainsGenericParameters = true, IGMD = true, ICGM = false + + public void GenericMethodDefinitionInGenericClass2(T a, U b) { } // IsGenericMethod = true, ContainsGenericParameters = true, IGMD = true, ICGM = false + } + + public class CallGenericMethods : GenericClassWithMethods + { + public void CallMethods() { + NonGeneric.GenericMethodDefinitionInNonGenericClass(1.23f); // IsGenericMethod = true, ContainsGenericParameters = false, IGMD = false, ICGM = true + NonGenericMethodInGenericClass(123); // IsGenericMethod = false, ContainsGenericParameters = false, IGMD = false, ICGM = false + NonGenericMethodInGenericClass2(); // IsGenericMethod = false, ContainsGenericParameters = false, IGMD = false, ICGM = false + GenericMethodDefinitionInGenericClass(456); // IsGenericMethod = true, ContainsGenericParameters = true, IGMD = false, ICGM = true + GenericMethodDefinitionInGenericClass2(789, "abc"); // IsGenericMethod = true, ContainsGenericParameters = true, IGMD = false, ICGM = true + } + } } \ No newline at end of file