diff options
author | Jb Evain <jb@evain.net> | 2019-12-10 06:38:07 +0300 |
---|---|---|
committer | Jb Evain <jb@evain.net> | 2019-12-10 06:38:07 +0300 |
commit | 517467371a929c4d4c4ab93b9ef5d9596a89787a (patch) | |
tree | 94083df909416f148b76f8646aa4c2ecc0e32588 /Mono.Cecil | |
parent | 797ee891ba9006e442a500b79ad13eb1d68eef39 (diff) |
Allocate GenericArguments collections with the right sizes
Diffstat (limited to 'Mono.Cecil')
-rw-r--r-- | Mono.Cecil/AssemblyReader.cs | 16 | ||||
-rw-r--r-- | Mono.Cecil/GenericInstanceMethod.cs | 6 | ||||
-rw-r--r-- | Mono.Cecil/GenericInstanceType.cs | 6 | ||||
-rw-r--r-- | Mono.Cecil/Import.cs | 5 | ||||
-rw-r--r-- | Mono.Cecil/TypeParser.cs | 2 |
5 files changed, 24 insertions, 11 deletions
diff --git a/Mono.Cecil/AssemblyReader.cs b/Mono.Cecil/AssemblyReader.cs index 1f877ca..b648463 100644 --- a/Mono.Cecil/AssemblyReader.cs +++ b/Mono.Cecil/AssemblyReader.cs @@ -2278,9 +2278,11 @@ namespace Mono.Cecil { if (call_conv != methodspec_sig) throw new NotSupportedException (); - var instance = new GenericInstanceMethod (method); + var arity = reader.ReadCompressedUInt32 (); - reader.ReadGenericInstanceSignature (method, instance); + var instance = new GenericInstanceMethod (method, (int) arity); + + reader.ReadGenericInstanceSignature (method, instance, arity); return instance; } @@ -3324,10 +3326,8 @@ namespace Mono.Cecil { owner_parameters.Add (new GenericParameter (owner)); } - public void ReadGenericInstanceSignature (IGenericParameterProvider provider, IGenericInstance instance) + public void ReadGenericInstanceSignature (IGenericParameterProvider provider, IGenericInstance instance, uint arity) { - var arity = ReadCompressedUInt32 (); - if (!provider.IsDefinition) CheckGenericContext (provider, (int) arity - 1); @@ -3423,9 +3423,11 @@ namespace Mono.Cecil { case ElementType.GenericInst: { var is_value_type = ReadByte () == (byte) ElementType.ValueType; var element_type = GetTypeDefOrRef (ReadTypeTokenSignature ()); - var generic_instance = new GenericInstanceType (element_type); - ReadGenericInstanceSignature (element_type, generic_instance); + var arity = ReadCompressedUInt32 (); + var generic_instance = new GenericInstanceType (element_type, (int) arity); + + ReadGenericInstanceSignature (element_type, generic_instance, arity); if (is_value_type) { generic_instance.KnownValueType (); diff --git a/Mono.Cecil/GenericInstanceMethod.cs b/Mono.Cecil/GenericInstanceMethod.cs index 00de03a..e86a263 100644 --- a/Mono.Cecil/GenericInstanceMethod.cs +++ b/Mono.Cecil/GenericInstanceMethod.cs @@ -63,5 +63,11 @@ namespace Mono.Cecil { : base (method) { } + + internal GenericInstanceMethod (MethodReference method, int arity) + : this (method) + { + this.arguments = new Collection<TypeReference> (arity); + } } } diff --git a/Mono.Cecil/GenericInstanceType.cs b/Mono.Cecil/GenericInstanceType.cs index 0e683e7..8885850 100644 --- a/Mono.Cecil/GenericInstanceType.cs +++ b/Mono.Cecil/GenericInstanceType.cs @@ -61,5 +61,11 @@ namespace Mono.Cecil { base.IsValueType = type.IsValueType; this.etype = MD.ElementType.GenericInst; } + + internal GenericInstanceType (TypeReference type, int arity) + : this (type) + { + this.arguments = new Collection<TypeReference> (arity); + } } } diff --git a/Mono.Cecil/Import.cs b/Mono.Cecil/Import.cs index 550e213..272e960 100644 --- a/Mono.Cecil/Import.cs +++ b/Mono.Cecil/Import.cs @@ -259,8 +259,8 @@ namespace Mono.Cecil { TypeReference ImportGenericInstance (Type type, ImportGenericContext context) { var element_type = ImportType (type.GetGenericTypeDefinition (), context, ImportGenericKind.Definition); - var instance = new GenericInstanceType (element_type); var arguments = type.GetGenericArguments (); + var instance = new GenericInstanceType (element_type, arguments.Length); var instance_arguments = instance.GenericArguments; context.Push (element_type); @@ -633,9 +633,8 @@ namespace Mono.Cecil { case ElementType.GenericInst: var instance = (GenericInstanceType) type; var element_type = ImportType (instance.ElementType, context); - var imported_instance = new GenericInstanceType (element_type); - var arguments = instance.GenericArguments; + var imported_instance = new GenericInstanceType (element_type, arguments.Count); var imported_arguments = imported_instance.GenericArguments; for (int i = 0; i < arguments.Count; i++) diff --git a/Mono.Cecil/TypeParser.cs b/Mono.Cecil/TypeParser.cs index 07854cd..a4ebd69 100644 --- a/Mono.Cecil/TypeParser.cs +++ b/Mono.Cecil/TypeParser.cs @@ -296,7 +296,7 @@ namespace Mono.Cecil { if (generic_arguments.IsNullOrEmpty ()) return type; - var instance = new GenericInstanceType (type); + var instance = new GenericInstanceType (type, generic_arguments.Length); var instance_arguments = instance.GenericArguments; for (int i = 0; i < generic_arguments.Length; i++) |