Using monomerge.exe I found occasions when Cecil would attempt to set
MethodReturnType's MetadataToken, Constant & MarshalSpec values where
the background ParameterDefinition storage object didn't exist. These
setters would dereference a null and throw an exception.

There is code in MethodReturnType to create this empty
ParameterDefinition, but relied on CustomAttributes getter being
called.

Without having too much background in Cecil, I found it made sense to
move this into the Parameter property and reference its getter.
This appeared to fix my problem (at least in initial testing).

diff -u3 -r org\Mono.Cecil/Mono.Cecil/MethodReturnType.cs Mono.Cecil/
Mono.Cecil/MethodReturnType.cs
--- org\Mono.Cecil/Mono.Cecil/MethodReturnType.cs       2007-07-13
08:28:50.000000000 +1000
+++ Mono.Cecil/Mono.Cecil/MethodReturnType.cs   2007-09-18
15:48:14.154426600 +1000
@@ -50,25 +50,25 @@
                }

                internal ParameterDefinition Parameter {
-                       get { return m_param; }
+                       get {
+                               if (m_param == null)
+                               {
+                                       m_param = new ParameterDefinition(
+                                               string.Empty, 0, 
(ParameterAttributes)0, m_returnType);
+                                       m_param.Method = m_method;
+                               }
+                               return m_param;
+                       }
                        set { m_param = value; }
                }

                public MetadataToken MetadataToken {
                        get { return m_param.MetadataToken; }
-                       set { m_param.MetadataToken = value; }
+                       set { Parameter.MetadataToken = value; }
                }

                public CustomAttributeCollection CustomAttributes {
-                       get {
-                               if (m_param == null) {
-                                       m_param = new ParameterDefinition (
-                                               string.Empty, 0, 
(ParameterAttributes) 0, m_returnType);
-                                       m_param.Method = m_method;
-                               }
-
-                               return m_param.CustomAttributes;
-                       }
+                       get { return Parameter.CustomAttributes; }
                }

                public bool HasConstant {
@@ -87,9 +87,7 @@

                                return m_param.Constant;
                        }
-                       set {
-                               m_param.Constant = value;
-                       }
+                       set { Parameter.Constant = value; }
                }

                public MarshalSpec MarshalSpec {
@@ -99,7 +97,7 @@

                                return m_param.MarshalSpec;
                        }
-                       set { m_param.MarshalSpec = value; }
+                       set { Parameter.MarshalSpec = value; }
                }

                public MethodReturnType (TypeReference retType)


--~--~---------~--~----~------------~-------~--~----~
--
mono-cecil
-~----------~----~----~----~------~----~------~--~---

Reply via email to