David T. Lewis uploaded a new version of VMMaker to project VM Maker: http://source.squeak.org/VMMaker/VMMaker.oscog-dtl.3352.mcz
==================== Summary ====================
Name: VMMaker.oscog-dtl.3352 Author: dtl Time: 18 March 2024, 1:47:49.34839 pm UUID: 3f1e452d-7dfd-4f60-9bc2-2d930e0a28eb Ancestors: VMMaker.oscog-eem.3351
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.oscog-eem.3351 ===============
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" !
vm-dev@lists.squeakfoundation.org