Skip to content

Commit 5c7e832

Browse files
authored
sigPtrGetZIn32 returns a struct tuple (#9220)
1 parent 4c1eb72 commit 5c7e832

File tree

1 file changed

+37
-29
lines changed

1 file changed

+37
-29
lines changed

src/absil/ilread.fs

Lines changed: 37 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -304,17 +304,17 @@ let sigptrGetDouble bytes sigptr =
304304

305305
let sigptrGetZInt32 bytes sigptr =
306306
let b0, sigptr = sigptrGetByte bytes sigptr
307-
if b0 <= 0x7Fuy then int b0, sigptr
307+
if b0 <= 0x7Fuy then struct (int b0, sigptr)
308308
elif b0 <= 0xBFuy then
309309
let b0 = b0 &&& 0x7Fuy
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 &&& 0x3Fuy
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

319319
let 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 =
326326
let 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

330338
let 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

18271835
and 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 &&& 0x0Fuy)
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 = 0x0uy 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

Comments
 (0)