@@ -369,36 +369,63 @@ let generatePortablePdb (embedAllSource: bool) (embedSourceList: string list) (s
369369 builder.WriteCompressedInteger( 0 )
370370 builder.WriteCompressedInteger( MetadataTokens.GetRowNumber( DocumentHandle.op_ Implicit( getDocumentHandle ( sps.[ i]. Document))) )
371371 else
372+ //=============================================================================================================================================
372373 // 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
378403 builder.WriteCompressedInteger( offsetDelta)
379404
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
381408 builder.WriteCompressedInteger( 0 )
382409 builder.WriteCompressedInteger( 0 )
383410 else // Non-hidden-sequence-point-record
384- let deltaLines = sps .[ i ]. EndLine - sps .[ i ]. Line // lines
411+ let deltaLines = endLine - startLine // lines
385412 builder.WriteCompressedInteger( deltaLines)
386413
387- let deltaColumns = sps .[ i ]. EndColumn - sps .[ i ]. Column // Columns
414+ let deltaColumns = endColumn - startColumn // Columns
388415 if deltaLines = 0 then
389416 builder.WriteCompressedInteger( deltaColumns)
390417 else
391418 builder.WriteCompressedSignedInteger( deltaColumns)
392419
393420 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 )
396423 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)
399426
400- previousNonHiddenStartLine <- sps .[ i ]. Line
401- previousNonHiddenStartColumn <- sps .[ i ]. Column
427+ previousNonHiddenStartLine <- startLine
428+ previousNonHiddenStartColumn <- startColumn
402429
403430 getDocumentHandle singleDocumentIndex, metadata.GetOrAddBlob( builder)
404431
0 commit comments