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
parent797ee891ba9006e442a500b79ad13eb1d68eef39 (diff)
Allocate GenericArguments collections with the right sizes
-rw-r--r--Mono.Cecil.Cil/MethodBody.cs2
-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
-rw-r--r--Test/Mono.Cecil.Tests/Extensions.cs2
-rw-r--r--rocks/Mono.Cecil.Rocks/TypeReferenceRocks.cs2
8 files changed, 27 insertions, 14 deletions
diff --git a/Mono.Cecil.Cil/MethodBody.cs b/Mono.Cecil.Cil/MethodBody.cs
index eb8baf5..579f7f9 100644
--- a/Mono.Cecil.Cil/MethodBody.cs
+++ b/Mono.Cecil.Cil/MethodBody.cs
@@ -92,7 +92,7 @@ namespace Mono.Cecil.Cil {
var parameter_type = method.DeclaringType as TypeReference;
if (parameter_type.HasGenericParameters) {
- var instance = new GenericInstanceType (parameter_type);
+ var instance = new GenericInstanceType (parameter_type, parameter_type.GenericParameters.Count);
for (int i = 0; i < parameter_type.GenericParameters.Count; i++)
instance.GenericArguments.Add (parameter_type.GenericParameters [i]);
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++)
diff --git a/Test/Mono.Cecil.Tests/Extensions.cs b/Test/Mono.Cecil.Tests/Extensions.cs
index ab27e9b..b51e545 100644
--- a/Test/Mono.Cecil.Tests/Extensions.cs
+++ b/Test/Mono.Cecil.Tests/Extensions.cs
@@ -42,7 +42,7 @@ namespace Mono.Cecil.Tests {
if (self.GenericParameters.Count != arguments.Length)
throw new ArgumentException ();
- var instance = new GenericInstanceType (self);
+ var instance = new GenericInstanceType (self, arguments.Length);
foreach (var argument in arguments)
instance.GenericArguments.Add (argument);
diff --git a/rocks/Mono.Cecil.Rocks/TypeReferenceRocks.cs b/rocks/Mono.Cecil.Rocks/TypeReferenceRocks.cs
index c395236..1e60951 100644
--- a/rocks/Mono.Cecil.Rocks/TypeReferenceRocks.cs
+++ b/rocks/Mono.Cecil.Rocks/TypeReferenceRocks.cs
@@ -68,7 +68,7 @@ namespace Mono.Cecil.Rocks {
if (self.GenericParameters.Count != arguments.Length)
throw new ArgumentException ();
- var instance = new GenericInstanceType (self);
+ var instance = new GenericInstanceType (self, arguments.Length);
foreach (var argument in arguments)
instance.GenericArguments.Add (argument);