Issue decoding source file

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
1 message Options
Reply | Threaded
Open this post in threaded view
|

Issue decoding source file

AndrewBlack
I’m getting a walkback while attempting to look at the prior versions of certain methods.    It happens on some methods, but not all.
I think the the issue may be related to having characters in the method body that are represented as multi-byte sequences in UTF-8.
The error is 'Illegal leading byte for utf-8 encoding’ from ZnUTF8Encoder

Here are the top few stack frames:

ZnUTF8Encoder>>error:
ZnUTF8Encoder>>errorIllegalLeadingByte
ZnUTF8Encoder>>nextCodePointFromStream:
ZnUTF8Encoder(ZnCharacterEncoder)>>nextFromStream:
ZnCharacterReadStream>>nextElement
ZnCharacterReadStream(ZnEncodedReadStream)>>peek
SourceFile>>peek
ChunkReadStream(DecoratorStream)>>peek
ChunkReadStream>>skipSeparators
ChunkReadStream>>basicNextChunk
ChunkReadStream>>next
SourceFileArray>>readOnlyDo:
BlockClosure>>ensure:
SourceFileArray>>readOnlyDo:
SourceFileArray>>changeRecordsFrom:className:isMeta:do:
SourceFileArray>>changeRecordsFrom:className:isMeta:
VersionBrowser>>buildChangeList
VersionBrowser>>buildBrowser
VersionBrowser>>browseVersionsOf:


Everything looks reasonable.  The underlying ZnBufferedReadStream is at position 2, and the first few bytes are

159 166 34 39 46

or, in hex:

9F A6 22 27 2E

That first byte, 9F or 10011111, is not valid as the first byte in a UTF-8 sequence (it’s a valid continuing byte) — which presumably is why ZnUTF8Encoder is complaining.

So, why is the VersionBrowser starting to look at that particular place in the source file?  

VersionBrowser >> buildChangeList looks like this:

buildChangeList
        rgMethod sourcePointer ifNil:[ ^ #() ].
       
        ^ (SourceFiles
                changeRecordsFrom: rgMethod sourcePointer
                className: rgMethod instanceSideParentName
                isMeta: rgMethod isMetaSide)
                collectWithIndex: [ :c :i | | rg |
                        rg := c asRingDefinition.
                        rg annotationNamed: #versionIndex put: i ]

and rgMethod sourcePointer is the value of the sourcePointer attribute in the attributes dictionary in rgMehod.

What can be done to fix this?

        Andrew