David T. Lewis uploaded a new version of VMMaker to project VM Maker: http://source.squeak.org/VMMaker/VMMaker-dtl.442.mcz
==================== Summary ====================
Name: VMMaker-dtl.442 Author: dtl Time: 18 March 2024, 1:42:53.99 pm UUID: fa3530b4-3415-49e2-8448-53850dcd6005 Ancestors: VMMaker-dtl.441
VMMaker 4.20.8 - Fix bug in BMPReadWriterPlugin that caused unnecessary primitive failures. Fix provided by Juan Vuletich https://lists.cuis.st/mailman/archives/cuis-dev/2024-March/008599.html
=============== Diff against VMMaker-dtl.441 ===============
Item was changed: ----- Method: BMPReadWriterPlugin>>primitiveRead24BmpLine (in category 'primitives') ----- primitiveRead24BmpLine | width formBitsIndex formBitsOop pixelLineOop formBitsSize formBits pixelLineSize pixelLine | <export: true> <inline: false> <var: #formBits type: 'unsigned int *'> <var: #pixelLine type: 'unsigned char *'> interpreterProxy methodArgumentCount = 4 ifFalse:[^interpreterProxy primitiveFail]. width := interpreterProxy stackIntegerValue: 0. width <= 0 ifTrue:[^interpreterProxy primitiveFail]. formBitsIndex := interpreterProxy stackIntegerValue: 1. formBitsOop := interpreterProxy stackObjectValue: 2. pixelLineOop := interpreterProxy stackObjectValue: 3. interpreterProxy failed ifTrue:[^nil]. (interpreterProxy isWords: formBitsOop) ifFalse:[^interpreterProxy primitiveFail]. (interpreterProxy isBytes: pixelLineOop) ifFalse:[^interpreterProxy primitiveFail]. formBitsSize := interpreterProxy slotSizeOf: formBitsOop. formBits := interpreterProxy firstIndexableField: formBitsOop. pixelLineSize := interpreterProxy slotSizeOf: pixelLineOop. pixelLine := interpreterProxy firstIndexableField: pixelLineOop. + (formBitsIndex + width - 1 <= formBitsSize and:[width*3 <= pixelLineSize]) - (formBitsIndex + width <= formBitsSize and:[width*3 <= pixelLineSize]) ifFalse:[^interpreterProxy primitiveFail].
"do the actual work" self cCode:' formBits += formBitsIndex-1; while(width--) { unsigned int rgb; rgb = (*pixelLine++); rgb += (*pixelLine++) << 8; rgb += (*pixelLine++) << 16; if(rgb) rgb |= 0xFF000000; else rgb |= 0xFF000001; *formBits++ = rgb; } ' inSmalltalk:[formBits. pixelLine. ^interpreterProxy primitiveFail]. interpreterProxy pop: 4. "args" !
Item was changed: ----- Method: BMPReadWriterPlugin>>primitiveWrite24BmpLine (in category 'primitives') ----- primitiveWrite24BmpLine
| width formBitsIndex formBitsOop pixelLineOop formBitsSize formBits pixelLineSize pixelLine | <export: true> <inline: false> <var: #formBits type: 'unsigned int *'> <var: #pixelLine type: 'unsigned char *'> interpreterProxy methodArgumentCount = 4 ifFalse:[^interpreterProxy primitiveFail]. width := interpreterProxy stackIntegerValue: 0. width <= 0 ifTrue:[^interpreterProxy primitiveFail]. formBitsIndex := interpreterProxy stackIntegerValue: 1. formBitsOop := interpreterProxy stackObjectValue: 2. pixelLineOop := interpreterProxy stackObjectValue: 3. interpreterProxy failed ifTrue:[^nil]. (interpreterProxy isWords: formBitsOop) ifFalse:[^interpreterProxy primitiveFail]. (interpreterProxy isBytes: pixelLineOop) ifFalse:[^interpreterProxy primitiveFail]. formBitsSize := interpreterProxy slotSizeOf: formBitsOop. formBits := interpreterProxy firstIndexableField: formBitsOop. pixelLineSize := interpreterProxy slotSizeOf: pixelLineOop. pixelLine := interpreterProxy firstIndexableField: pixelLineOop.
+ (formBitsIndex + width - 1 <= formBitsSize and:[width*3 <= pixelLineSize]) - (formBitsIndex + width <= formBitsSize and:[width*3 <= pixelLineSize]) ifFalse:[^interpreterProxy primitiveFail].
"do the actual work. Read 32 bit at a time from formBits, and store the low order 24 bits or each word into pixelLine in little endian order."
self cCode:' formBits += formBitsIndex-1;
while(width--) { unsigned int rgb; rgb = *formBits++; (*pixelLine++) = (rgb ) & 0xFF; (*pixelLine++) = (rgb >> 8 ) & 0xFF; (*pixelLine++) = (rgb >> 16) & 0xFF; }
' inSmalltalk:[formBits. pixelLine. ^interpreterProxy primitiveFail]. interpreterProxy pop: 4. "args" !
Item was changed: ----- Method: VMMaker class>>versionString (in category 'version testing') ----- versionString
"VMMaker versionString"
+ ^'4.20.8'! - ^'4.20.7'!
vm-dev@lists.squeakfoundation.org