On Friday, January 6, 2017 at 10:12:05 PM UTC+3, Jb Evain wrote:
>
> On Thu, Jan 5, 2017 at 8:58 PM, LRN wrote:
>
>> AFAIU, cecil insists that ByReferenceType and ArrayType are mutually
>> exclusive.
>> Because of that, some methods have by-reference arguments that are
>> arrays, but cecil denies that (IsArray is false). Here's the list of
>> methods:
>> Method System.Void Windows.Foundation.IPropertyValue::GetUInt8Array(
>> System.Byte[]&)
>> Method System.Void Windows.Foundation.IPropertyValue::GetInt16Array(
>> System.Int16[]&)
>> Method System.Void Windows.Foundation.IPropertyValue::GetUInt16Array(
>> System.UInt16[]&)
>> Method System.Void Windows.Foundation.IPropertyValue::GetInt32Array(
>> System.Int32[]&)
>> Method System.Void Windows.Foundation.IPropertyValue::GetUInt32Array(
>> System.UInt32[]&)
>> Method System.Void Windows.Foundation.IPropertyValue::GetInt64Array(
>> System.Int64[]&)
>> Method System.Void Windows.Foundation.IPropertyValue::GetUInt64Array(
>> System.UInt64[]&)
>> Method System.Void Windows.Foundation.IPropertyValue::GetSingleArray(
>> System.Single[]&)
>> Method System.Void Windows.Foundation.IPropertyValue::GetDoubleArray(
>> System.Double[]&)
>> Method System.Void Windows.Foundation.IPropertyValue::GetChar16Array(
>> System.Char[]&)
>> Method System.Void Windows.Foundation.IPropertyValue::GetBooleanArray(
>> System.Boolean[]&)
>> Method System.Void Windows.Foundation.IPropertyValue::GetStringArray(
>> System.String[]&)
>> Method System.Void Windows.Foundation.IPropertyValue::GetInspectableArray
>> (System.Object[]&)
>> Method System.Void Windows.Foundation.IPropertyValue::GetGuidArray(System
>> .Guid[]&)
>> Method System.Void Windows.Foundation.IPropertyValue::GetDateTimeArray(
>> Windows.Foundation.DateTime[]&)
>> Method System.Void Windows.Foundation.IPropertyValue::GetTimeSpanArray(
>> Windows.Foundation.TimeSpan[]&)
>> Method System.Void Windows.Foundation.IPropertyValue::GetPointArray(
>> Windows.Foundation.Point[]&)
>> Method System.Void Windows.Foundation.IPropertyValue::GetSizeArray(
>> Windows.Foundation.Size[]&)
>> Method System.Void Windows.Foundation.IPropertyValue::GetRectArray(
>> Windows.Foundation.Rect[]&)
>> Method System.Void Windows.Media.MediaProperties.
>> IAudioEncodingPropertiesWithFormatUserData::GetFormatUserData(System.Byte
>> []&)
>> Method System.Void Windows.Media.MediaProperties.
>> IVideoEncodingProperties2::GetFormatUserData(System.Byte[]&)
>> Method System.Void Windows.Media.Core.
>> IMediaStreamSampleProtectionProperties::GetKeyIdentifier(System.Byte[]&)
>> Method System.Void Windows.Media.Core.
>> IMediaStreamSampleProtectionProperties::GetInitializationVector(System.
>> Byte[]&)
>> Method System.Void Windows.Media.Core.
>> IMediaStreamSampleProtectionProperties::GetSubSampleMapping(System.Byte
>> []&)
>> Method System.Void Windows.Networking.Vpn.IVpnInterfaceId::GetAddressInfo
>> (System.Byte[]&)
>> Method System.Void Windows.Security.Cryptography.
>> ICryptographicBufferStatics::CopyToByteArray(Windows.Storage.Streams.
>> IBuffer,System.Byte[]&)
>> Method System.Void Windows.UI.Xaml.Automation.Provider.ITextRangeProvider
>> ::GetBoundingRectangles(System.Double[]&)
>>
>>
> Typespecs are composed.
>
> In that case you'll have a ByReferenceType instance whose ElementType will
> be an ArrayType, whose ElementType will be System.Byte.
>
That doesn't seem to match my observations.
Here's roughly what i'm doing:
foreach (TypeDefinition type in module.Types)
{
if (!type.IsInterface)
continue;
foreach (MethodDefinition method in type.Methods)
{
foreach (ParameterDefinition param in method.Parameters)
{
string param_type = param.ParameterType.FullName;
int amp = param_type.LastIndexOf ('&');
int lbrace = param_type.LastIndexOf ('[');
int rbrace = param_type.LastIndexOf (']');
if (param.ParameterType.IsByReference && !param.ParameterType.
IsArray && amp > 0 && rbrace > lbrace && lbrace > 0)
{
TypeReference eltype = param.ParameterType.GetElementType ();
Console.WriteLine ("Parameter {0} of method {1} is by
reference", param.Name, method.FullName);
Console.WriteLine ("Its element type is {0} and it {1}",
eltype, eltype.IsArray ? "is an array" : "is not an array");
if (eltype.GetElementType () != eltype)
Console.WriteLine ("Subelement type is {0}", eltype.
GetElementType ());
}
}
}
}
and the output is like this:
Parameter value of method System.Void Windows.Foundation.IPropertyValue::
GetUInt8Array(System.Byte[]&) is by reference
Its element type is System.Byte and it is not an array
What am i doing wrong?
--
--
--
mono-cecil
---
You received this message because you are subscribed to the Google Groups
"mono-cecil" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/d/optout.