@@ -304,17 +304,17 @@ let sigptrGetDouble bytes sigptr =
304304
305305let sigptrGetZInt32 bytes sigptr =
306306 let b0 , sigptr = sigptrGetByte bytes sigptr
307- if b0 <= 0x7F uy then int b0, sigptr
307+ if b0 <= 0x7F uy then struct ( int b0, sigptr)
308308 elif b0 <= 0xBF uy then
309309 let b0 = b0 &&& 0x7F uy
310310 let b1 , sigptr = sigptrGetByte bytes sigptr
311- ( int b0 <<< 8 ) ||| int b1, sigptr
311+ struct (( int b0 <<< 8 ) ||| int b1, sigptr)
312312 else
313313 let b0 = b0 &&& 0x3F uy
314314 let b1 , sigptr = sigptrGetByte bytes sigptr
315315 let b2 , sigptr = sigptrGetByte bytes sigptr
316316 let b3 , sigptr = sigptrGetByte bytes sigptr
317- ( int b0 <<< 24 ) ||| ( int b1 <<< 16 ) ||| ( int b2 <<< 8 ) ||| int b3, sigptr
317+ struct (( int b0 <<< 24 ) ||| ( int b1 <<< 16 ) ||| ( int b2 <<< 8 ) ||| int b3, sigptr)
318318
319319let rec sigptrFoldAcc f n ( bytes : byte []) ( sigptr : int ) i acc =
320320 if i < n then
@@ -326,6 +326,14 @@ let rec sigptrFoldAcc f n (bytes: byte[]) (sigptr: int) i acc =
326326let sigptrFold f n ( bytes : byte []) ( sigptr : int ) =
327327 sigptrFoldAcc f n bytes sigptr 0 []
328328
329+ let sigptrFoldStruct f n ( bytes : byte []) ( sigptr : int ) =
330+ let rec sigptrFoldAcc f n ( bytes : byte []) ( sigptr : int ) i acc =
331+ if i < n then
332+ let struct ( x , sp ) = f bytes sigptr
333+ sigptrFoldAcc f n bytes sp ( i+ 1 ) ( x :: acc)
334+ else
335+ struct ( List.rev acc, sigptr)
336+ sigptrFoldAcc f n bytes sigptr 0 []
329337
330338let sigptrGetBytes n ( bytes : byte []) sigptr =
331339 if checking && sigptr + n >= bytes.Length then
@@ -1825,7 +1833,7 @@ and seekReadMethods (ctxt: ILMetadataReader) numtypars midx1 midx2 =
18251833 yield seekReadMethod ctxt mdv numtypars i |])
18261834
18271835and sigptrGetTypeDefOrRefOrSpecIdx bytes sigptr =
1828- let n , sigptr = sigptrGetZInt32 bytes sigptr
1836+ let struct ( n , sigptr ) = sigptrGetZInt32 bytes sigptr
18291837 if ( n &&& 0x01 ) = 0x0 then (* Type Def *)
18301838 TaggedIndex( tdor_ TypeDef, ( n >>>& 2 )), sigptr
18311839 else (* Type Ref *)
@@ -1852,7 +1860,7 @@ and sigptrGetTy (ctxt: ILMetadataReader) numtypars bytes sigptr =
18521860 elif b0 = et_ WITH then
18531861 let b0 , sigptr = sigptrGetByte bytes sigptr
18541862 let tdorIdx , sigptr = sigptrGetTypeDefOrRefOrSpecIdx bytes sigptr
1855- let n , sigptr = sigptrGetZInt32 bytes sigptr
1863+ let struct ( n , sigptr ) = sigptrGetZInt32 bytes sigptr
18561864 let argtys , sigptr = sigptrFold ( sigptrGetTy ctxt numtypars) n bytes sigptr
18571865 seekReadTypeDefOrRef ctxt numtypars ( if b0 = et_ CLASS then AsObject else AsValue) argtys tdorIdx,
18581866 sigptr
@@ -1864,10 +1872,10 @@ and sigptrGetTy (ctxt: ILMetadataReader) numtypars bytes sigptr =
18641872 let tdorIdx , sigptr = sigptrGetTypeDefOrRefOrSpecIdx bytes sigptr
18651873 seekReadTypeDefOrRef ctxt numtypars AsValue List.empty tdorIdx, sigptr
18661874 elif b0 = et_ VAR then
1867- let n , sigptr = sigptrGetZInt32 bytes sigptr
1875+ let struct ( n , sigptr ) = sigptrGetZInt32 bytes sigptr
18681876 ILType.TypeVar ( uint16 n), sigptr
18691877 elif b0 = et_ MVAR then
1870- let n , sigptr = sigptrGetZInt32 bytes sigptr
1878+ let struct ( n , sigptr ) = sigptrGetZInt32 bytes sigptr
18711879 ILType.TypeVar ( uint16 ( n + numtypars)), sigptr
18721880 elif b0 = et_ BYREF then
18731881 let ty , sigptr = sigptrGetTy ctxt numtypars bytes sigptr
@@ -1880,11 +1888,11 @@ and sigptrGetTy (ctxt: ILMetadataReader) numtypars bytes sigptr =
18801888 mkILArr1DTy ty, sigptr
18811889 elif b0 = et_ ARRAY then
18821890 let ty , sigptr = sigptrGetTy ctxt numtypars bytes sigptr
1883- let rank , sigptr = sigptrGetZInt32 bytes sigptr
1884- let numSized , sigptr = sigptrGetZInt32 bytes sigptr
1885- let sizes , sigptr = sigptrFold sigptrGetZInt32 numSized bytes sigptr
1886- let numLoBounded , sigptr = sigptrGetZInt32 bytes sigptr
1887- let lobounds , sigptr = sigptrFold sigptrGetZInt32 numLoBounded bytes sigptr
1891+ let struct ( rank , sigptr ) = sigptrGetZInt32 bytes sigptr
1892+ let struct ( numSized , sigptr ) = sigptrGetZInt32 bytes sigptr
1893+ let struct ( sizes , sigptr ) = sigptrFoldStruct sigptrGetZInt32 numSized bytes sigptr
1894+ let struct ( numLoBounded , sigptr ) = sigptrGetZInt32 bytes sigptr
1895+ let struct ( lobounds , sigptr ) = sigptrFoldStruct sigptrGetZInt32 numLoBounded bytes sigptr
18881896 let shape =
18891897 let dim i =
18901898 ( if i < numLoBounded then Some ( List.item i lobounds) else None),
@@ -1903,7 +1911,7 @@ and sigptrGetTy (ctxt: ILMetadataReader) numtypars bytes sigptr =
19031911 let ccByte , sigptr = sigptrGetByte bytes sigptr
19041912 let generic , cc = byteAsCallConv ccByte
19051913 if generic then failwith " fptr sig may not be generic"
1906- let numparams , sigptr = sigptrGetZInt32 bytes sigptr
1914+ let struct ( numparams , sigptr ) = sigptrGetZInt32 bytes sigptr
19071915 let retty , sigptr = sigptrGetTy ctxt numtypars bytes sigptr
19081916 let argtys , sigptr = sigptrFold ( sigptrGetTy ctxt numtypars) ( numparams) bytes sigptr
19091917 let typ =
@@ -1949,8 +1957,8 @@ and readBlobHeapAsMethodSigUncached ctxtH (BlobAsMethodSigIdx (numtypars, blobId
19491957 let sigptr = 0
19501958 let ccByte , sigptr = sigptrGetByte bytes sigptr
19511959 let generic , cc = byteAsCallConv ccByte
1952- let genarity , sigptr = if generic then sigptrGetZInt32 bytes sigptr else 0x0 , sigptr
1953- let numparams , sigptr = sigptrGetZInt32 bytes sigptr
1960+ let struct ( genarity , sigptr ) = if generic then sigptrGetZInt32 bytes sigptr else 0x0 , sigptr
1961+ let struct ( numparams , sigptr ) = sigptrGetZInt32 bytes sigptr
19541962 let retty , sigptr = sigptrGetTy ctxt numtypars bytes sigptr
19551963 let ( argtys , varargs ), _sigptr = sigptrGetArgTys ctxt numparams numtypars bytes sigptr []
19561964 generic, genarity, cc, retty, argtys, varargs
@@ -1984,7 +1992,7 @@ and readBlobHeapAsPropertySigUncached ctxtH (BlobAsPropSigIdx (numtypars, blobId
19841992 let hasthis = byteAsHasThis ccByte
19851993 let ccMaxked = ( ccByte &&& 0x0F uy)
19861994 if ccMaxked <> e_ IMAGE_ CEE_ CS_ CALLCONV_ PROPERTY then dprintn ( " warning: property sig was " + string ccMaxked+ " instead of CC_PROPERTY" )
1987- let numparams , sigptr = sigptrGetZInt32 bytes sigptr
1995+ let struct ( numparams , sigptr ) = sigptrGetZInt32 bytes sigptr
19881996 let retty , sigptr = sigptrGetTy ctxt numtypars bytes sigptr
19891997 let argtys , _sigptr = sigptrFold ( sigptrGetTy ctxt numtypars) ( numparams) bytes sigptr
19901998 hasthis, retty, argtys
@@ -1998,7 +2006,7 @@ and readBlobHeapAsLocalsSigUncached ctxtH (BlobAsLocalSigIdx (numtypars, blobIdx
19982006 let sigptr = 0
19992007 let ccByte , sigptr = sigptrGetByte bytes sigptr
20002008 if ccByte <> e_ IMAGE_ CEE_ CS_ CALLCONV_ LOCAL_ SIG then dprintn " warning: local sig was not CC_LOCAL"
2001- let numlocals , sigptr = sigptrGetZInt32 bytes sigptr
2009+ let struct ( numlocals , sigptr ) = sigptrGetZInt32 bytes sigptr
20022010 let localtys , _sigptr = sigptrFold ( sigptrGetLocal ctxt numtypars) ( numlocals) bytes sigptr
20032011 localtys
20042012
@@ -2051,7 +2059,7 @@ and seekReadMethodSpecAsMethodDataUncached ctxtH (MethodSpecAsMspecIdx (numtypar
20512059 let sigptr = 0
20522060 let ccByte , sigptr = sigptrGetByte bytes sigptr
20532061 if ccByte <> e_ IMAGE_ CEE_ CS_ CALLCONV_ GENERICINST then dprintn ( " warning: method inst ILCallingConv was " + string ccByte+ " instead of CC_GENERICINST" )
2054- let numgpars , sigptr = sigptrGetZInt32 bytes sigptr
2062+ let struct ( numgpars , sigptr ) = sigptrGetZInt32 bytes sigptr
20552063 let argtys , _sigptr = sigptrFold ( sigptrGetTy ctxt numtypars) numgpars bytes sigptr
20562064 argtys
20572065 VarArgMethodData( enclTy, cc, nm, argtys, varargs, retty, minst)
@@ -2950,47 +2958,47 @@ and sigptrGetILNativeType ctxt bytes sigptr =
29502958 elif ntbyte = 0x0 uy then ILNativeType.Empty, sigptr
29512959 elif ntbyte = nt_ CUSTOMMARSHALER then
29522960 // reading native type blob CM1, sigptr= "+string sigptr+ ", bytes.Length = "+string bytes.Length)
2953- let guidLen , sigptr = sigptrGetZInt32 bytes sigptr
2961+ let struct ( guidLen , sigptr ) = sigptrGetZInt32 bytes sigptr
29542962 // reading native type blob CM2, sigptr= "+string sigptr+", guidLen = "+string ( guidLen))
29552963 let guid , sigptr = sigptrGetBytes ( guidLen) bytes sigptr
29562964 // reading native type blob CM3, sigptr= "+string sigptr)
2957- let nativeTypeNameLen , sigptr = sigptrGetZInt32 bytes sigptr
2965+ let struct ( nativeTypeNameLen , sigptr ) = sigptrGetZInt32 bytes sigptr
29582966 // reading native type blob CM4, sigptr= "+string sigptr+", nativeTypeNameLen = "+string ( nativeTypeNameLen))
29592967 let nativeTypeName , sigptr = sigptrGetString ( nativeTypeNameLen) bytes sigptr
29602968 // reading native type blob CM4, sigptr= "+string sigptr+", nativeTypeName = "+nativeTypeName)
29612969 // reading native type blob CM5, sigptr= "+string sigptr)
2962- let custMarshallerNameLen , sigptr = sigptrGetZInt32 bytes sigptr
2970+ let struct ( custMarshallerNameLen , sigptr ) = sigptrGetZInt32 bytes sigptr
29632971 // reading native type blob CM6, sigptr= "+string sigptr+", custMarshallerNameLen = "+string ( custMarshallerNameLen))
29642972 let custMarshallerName , sigptr = sigptrGetString ( custMarshallerNameLen) bytes sigptr
29652973 // reading native type blob CM7, sigptr= "+string sigptr+", custMarshallerName = "+custMarshallerName)
2966- let cookieStringLen , sigptr = sigptrGetZInt32 bytes sigptr
2974+ let struct ( cookieStringLen , sigptr ) = sigptrGetZInt32 bytes sigptr
29672975 // reading native type blob CM8, sigptr= "+string sigptr+", cookieStringLen = "+string ( cookieStringLen))
29682976 let cookieString , sigptr = sigptrGetBytes ( cookieStringLen) bytes sigptr
29692977 // reading native type blob CM9, sigptr= "+string sigptr)
29702978 ILNativeType.Custom ( guid, nativeTypeName, custMarshallerName, cookieString), sigptr
29712979 elif ntbyte = nt_ FIXEDSYSSTRING then
2972- let i , sigptr = sigptrGetZInt32 bytes sigptr
2980+ let struct ( i , sigptr ) = sigptrGetZInt32 bytes sigptr
29732981 ILNativeType.FixedSysString i, sigptr
29742982 elif ntbyte = nt_ FIXEDARRAY then
2975- let i , sigptr = sigptrGetZInt32 bytes sigptr
2983+ let struct ( i , sigptr ) = sigptrGetZInt32 bytes sigptr
29762984 ILNativeType.FixedArray i, sigptr
29772985 elif ntbyte = nt_ SAFEARRAY then
29782986 ( if sigptr >= bytes.Length then
29792987 ILNativeType.SafeArray( ILNativeVariant.Empty, None), sigptr
29802988 else
2981- let i , sigptr = sigptrGetZInt32 bytes sigptr
2989+ let struct ( i , sigptr ) = sigptrGetZInt32 bytes sigptr
29822990 if sigptr >= bytes.Length then
29832991 ILNativeType.SafeArray ( int32AsILVariantType ctxt i, None), sigptr
29842992 else
2985- let len , sigptr = sigptrGetZInt32 bytes sigptr
2993+ let struct ( len , sigptr ) = sigptrGetZInt32 bytes sigptr
29862994 let s , sigptr = sigptrGetString ( len) bytes sigptr
29872995 ILNativeType.SafeArray ( int32AsILVariantType ctxt i, Some s), sigptr)
29882996 elif ntbyte = nt_ ARRAY then
29892997 if sigptr >= bytes.Length then
29902998 ILNativeType.Array( None, None), sigptr
29912999 else
29923000 let nt , sigptr =
2993- let u , sigptr' = sigptrGetZInt32 bytes sigptr
3001+ let struct ( u , sigptr' ) = sigptrGetZInt32 bytes sigptr
29943002 if ( u = int nt_ MAX) then
29953003 ILNativeType.Empty, sigptr'
29963004 else
@@ -2999,11 +3007,11 @@ and sigptrGetILNativeType ctxt bytes sigptr =
29993007 if sigptr >= bytes.Length then
30003008 ILNativeType.Array ( Some nt, None), sigptr
30013009 else
3002- let pnum , sigptr = sigptrGetZInt32 bytes sigptr
3010+ let struct ( pnum , sigptr ) = sigptrGetZInt32 bytes sigptr
30033011 if sigptr >= bytes.Length then
30043012 ILNativeType.Array ( Some nt, Some( pnum, None)), sigptr
30053013 else
3006- let additive , sigptr =
3014+ let struct ( additive , sigptr ) =
30073015 if sigptr >= bytes.Length then 0 , sigptr
30083016 else sigptrGetZInt32 bytes sigptr
30093017 ILNativeType.Array ( Some nt, Some( pnum, Some additive)), sigptr
0 commit comments