[Vm-dev] VM Maker: VMMaker.oscog-nice.2220.mcz
commits at source.squeak.org
commits at source.squeak.org
Wed May 24 17:21:07 UTC 2017
Nicolas Cellier uploaded a new version of VMMaker to project VM Maker:
==================== Summary ====================
Time: 24 May 2017, 7:19:44.72644 pm
Fix display pixel reversal (for debug).
Modern implementation of displayBits is (void *).
We can't calculate an offset (dispalyBits + n) because we don't know the size of void! At least it fails on MSVC compiler.
So it's necessary to convert it to char *, int *, or just sqInt.
While at it, as calculated, the range is a pixel range (assumed on the first display line) not a word range, but this range will be rounded to a whole word boundary.
The formulation now explicitely uses word indices, not word indices disguised in byte offsets.
It should avoid bad alignment cases where word(byte)StartIndex could eventually not be a proper multiple of 4.
It should also now work for any depth.
It might overflow for a pixel range highBit > 26 if sqInt were only 32 bits, that is over 64 million pixel width, but since our screens are not yet that wide, and will never be that wide in a 32 bits addressable space, we're safe.
=============== Diff against VMMaker.oscog-cb.2219 ===============
Item was changed:
----- Method: StackInterpreter>>reverseDisplayFrom:to: (in category 'I/O primitive support') -----
reverseDisplayFrom: startIndex to: endIndex
+ "Reverse the given range of Display pixels, rounded to whole word boundary.
+ Used to give feedback during VM activities such as garbage collection when debugging.
- "Reverse the given range of Display words (at different bit depths, this will reverse different numbers
- of pixels). Used to give feedback during VM activities such as garbage collection when debugging.
It is assumed that the given word range falls entirely within the first line of the Display."
| wordStartIndex wordEndIndex primFailCodeValue |
(displayBits = 0 or: [(objectMemory isImmediate: displayBits asInteger) or: [displayDepth = 0]]) ifTrue: [^nil].
+ wordStartIndex := (startIndex max: 0) * displayDepth // 32.
+ wordEndIndex := (endIndex min: displayWidth) * displayDepth // 32.
+ wordStartIndex * 4 to: wordEndIndex * 4 do:
+ [:byteOffset | | reversed |
+ reversed := (objectMemory long32At: displayBits asInteger + byteOffset) bitXor: 16rFFFFFFFF.
+ objectMemory long32At: displayBits asInteger + byteOffset put: reversed].
- wordStartIndex := startIndex * (displayDepth // 8).
- wordEndIndex := endIndex * (displayDepth // 8) min: displayWidth * (displayDepth // 8).
- displayBits + wordStartIndex to: displayBits + wordEndIndex by: 4 do:
- [:ptr | | reversed |
- reversed := (objectMemory long32At: ptr) bitXor: 16rFFFFFFFF.
- objectMemory long32At: ptr put: reversed].
primFailCodeValue := primFailCode.
self updateDisplayLeft: 0 Top: 0 Right: displayWidth Bottom: 1.
primFailCode := primFailCodeValue!
More information about the Vm-dev