@@ -369,36 +369,63 @@ let generatePortablePdb (embedAllSource: bool) (embedSourceList: string list) (s
369
369
builder.WriteCompressedInteger( 0 )
370
370
builder.WriteCompressedInteger( MetadataTokens.GetRowNumber( DocumentHandle.op_ Implicit( getDocumentHandle ( sps.[ i]. Document))) )
371
371
else
372
+ //=============================================================================================================================================
372
373
// Sequence-point-record
373
- let offsetDelta =
374
- if i > 0 then sps.[ i]. Offset - sps.[ i - 1 ]. Offset // delta from previous offset
375
- else sps.[ i]. Offset // delta IL offset
376
-
377
- if i < 1 || offsetDelta <> 0 then // ILOffset must not be 0
374
+ // Validate these with magic numbers according to the portable pdb spec Sequence point dexcription:
375
+ // https://github.com/dotnet/corefx/blob/master/src/System.Reflection.Metadata/specs/PortablePdb-Metadata.md#methoddebuginformation-table-0x31
376
+ //
377
+ // So the spec is actually bit iffy!!!!! (More like guidelines really. )
378
+ // It uses code similar to this to validate the values
379
+ // if (result < 0 || result >= ushort.MaxValue) // be errorfull
380
+ // Spec Says 0x10000 and value max = 0xFFFF but it can't even be = to maxvalue, and so the range is 0 .. 0xfffe inclusive
381
+ //=============================================================================================================================================
382
+
383
+ let capValue v maxValue =
384
+ if v < 0 then 0
385
+ elif v > maxValue then maxValue
386
+ else v
387
+
388
+ let capOffset v = capValue v 0xfffe
389
+ let capLine v = capValue v 0x1ffffffe
390
+ let capColumn v = capValue v 0xfffe
391
+
392
+ let offset = capOffset sps.[ i]. Offset
393
+ let startLine = capLine sps.[ i]. Line
394
+ let endLine = capLine sps.[ i]. EndLine
395
+ let startColumn = capColumn sps.[ i]. Column
396
+ let endColumn = capColumn sps.[ i]. EndColumn
397
+
398
+ let offsetDelta = // delta from previous offset
399
+ if i > 0 then offset - capOffset sps.[ i - 1 ]. Offset
400
+ else offset
401
+
402
+ if i < 1 || offsetDelta > 0 then
378
403
builder.WriteCompressedInteger( offsetDelta)
379
404
380
- if sps.[ i]. Line = 0xfeefee && sps.[ i]. EndLine = 0xfeefee then // Hidden-sequence-point-record
405
+ // Hidden-sequence-point-record
406
+ if startLine = 0xfeefee || endLine = 0xfeefee || ( startColumn = 0 && endColumn = 0 )
407
+ then
381
408
builder.WriteCompressedInteger( 0 )
382
409
builder.WriteCompressedInteger( 0 )
383
410
else // Non-hidden-sequence-point-record
384
- let deltaLines = sps .[ i ]. EndLine - sps .[ i ]. Line // lines
411
+ let deltaLines = endLine - startLine // lines
385
412
builder.WriteCompressedInteger( deltaLines)
386
413
387
- let deltaColumns = sps .[ i ]. EndColumn - sps .[ i ]. Column // Columns
414
+ let deltaColumns = endColumn - startColumn // Columns
388
415
if deltaLines = 0 then
389
416
builder.WriteCompressedInteger( deltaColumns)
390
417
else
391
418
builder.WriteCompressedSignedInteger( deltaColumns)
392
419
393
420
if previousNonHiddenStartLine < 0 then // delta Start Line & Column:
394
- builder.WriteCompressedInteger( sps .[ i ]. Line )
395
- builder.WriteCompressedInteger( sps .[ i ]. Column )
421
+ builder.WriteCompressedInteger( startLine )
422
+ builder.WriteCompressedInteger( startColumn )
396
423
else
397
- builder.WriteCompressedSignedInteger( sps .[ i ]. Line - previousNonHiddenStartLine)
398
- builder.WriteCompressedSignedInteger( sps .[ i ]. Column - previousNonHiddenStartColumn)
424
+ builder.WriteCompressedSignedInteger( startLine - previousNonHiddenStartLine)
425
+ builder.WriteCompressedSignedInteger( startColumn - previousNonHiddenStartColumn)
399
426
400
- previousNonHiddenStartLine <- sps .[ i ]. Line
401
- previousNonHiddenStartColumn <- sps .[ i ]. Column
427
+ previousNonHiddenStartLine <- startLine
428
+ previousNonHiddenStartColumn <- startColumn
402
429
403
430
getDocumentHandle singleDocumentIndex, metadata.GetOrAddBlob( builder)
404
431
0 commit comments