Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mono/cecil.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJb Evain <jb@evain.net>2019-12-10 06:38:07 +0300
committerJb Evain <jb@evain.net>2019-12-10 06:38:07 +0300
commit517467371a929c4d4c4ab93b9ef5d9596a89787a (patch)
tree94083df909416f148b76f8646aa4c2ecc0e32588 /Mono.Cecil
parent797ee891ba9006e442a500b79ad13eb1d68eef39 (diff)
Allocate GenericArguments collections with the right sizes
Diffstat (limited to 'Mono.Cecil')
-rw-r--r--Mono.Cecil/AssemblyReader.cs16
-rw-r--r--Mono.Cecil/GenericInstanceMethod.cs6
-rw-r--r--Mono.Cecil/GenericInstanceType.cs6
-rw-r--r--Mono.Cecil/Import.cs5
-rw-r--r--Mono.Cecil/TypeParser.cs2
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++)