[squeak-dev] Squeak 4.6: Graphics-mt.316.mcz
Levente Uzonyi
leves at elte.hu
Tue Oct 20 09:51:01 UTC 2015
I don't think it's a good idea to change any code to work around a
temporary VM bug.
I have seen this error in other cases as well (sockets) and I decided to
revert the VM to 3397.
I haven't reported the bug yet, because I don't have a reproducible case.
The only symptom I saw is that the instance variables get mixed with
temporaries (including method arguments).
Levente
On Tue, 20 Oct 2015, commits at source.squeak.org wrote:
> Marcel Taeumel uploaded a new version of Graphics to project Squeak 4.6:
> http://source.squeak.org/squeak46/Graphics-mt.316.mcz
>
> ==================== Summary ====================
>
> Name: Graphics-mt.316
> Author: mt
> Time: 20 October 2015, 11:40:19.755 am
> UUID: 41cf59e1-6149-7e4b-9d40-485a1f4798ef
> Ancestors: Graphics-mt.313
>
> Fixes loading of PNG files for recent (> #3397) v3 CogVMs.
>
> There seems to be a bug in the VM that, at some point, manifests itself by replacing z, which is the current ZLib stream, with self, which is the PNGReadWriter. Any indirection with a BlockClosure will do. I chose to create an interval and then calling #do: on that interval. Another way would be to wrap the body/argument of #to:do: into another block like this:
>
> 0 to: height-1 do: [:y | [ ... ] value ].
>
> This fix might affect performance a tiny little bit and might be removed as soon as the VM bug gets fixed.
>
> Note that there might be other places in the code affected by this bug.
>
> =============== Diff against Graphics-mt.313 ===============
>
> Item was changed:
> ----- Method: PNGReadWriter>>processNonInterlaced (in category 'chunks') -----
> processNonInterlaced
> | z filter temp copyMethod debug |
> debug := self debugging.
> copyMethod := #(copyPixelsGray: nil copyPixelsRGB: copyPixelsIndexed:
> copyPixelsGrayAlpha: nil copyPixelsRGBA:) at: colorType+1.
> debug ifTrue: [ Transcript cr; nextPutAll: 'NI chunk size='; print: idatChunkStream position ].
> z := ZLibReadStream
> on: idatChunkStream originalContents
> from: 1
> to: idatChunkStream position.
> prevScanline := ByteArray new: bytesPerScanline.
> thisScanline := ByteArray new: bytesPerScanline.
> + (0 to: height-1) do: [ :y |
> - 0 to: height-1 do: [ :y |
> filter := z next.
> debug ifTrue:[filtersSeen add: filter].
> thisScanline := z next: bytesPerScanline into: thisScanline startingAt: 1.
> (debug and: [ thisScanline size < bytesPerScanline ]) ifTrue: [ Transcript nextPutAll: ('wanted {1} but only got {2}' format: { bytesPerScanline. thisScanline size }); cr ].
> filter = 0 ifFalse:[self filterScanline: filter count: bytesPerScanline].
> self perform: copyMethod with: y.
> temp := prevScanline.
> prevScanline := thisScanline.
> thisScanline := temp.
> ].
> z atEnd ifFalse:[self error:'Unexpected data'].
> debug ifTrue: [Transcript nextPutAll: ' compressed size='; print: z position ].
> !
>
>
>
More information about the Squeak-dev
mailing list
|