Hi Nicolas,
the right form for that stSizeOf: implementation is
stSizeOf: integerValue "hack around the CoInterpreter/ObjectMemory split refactoring" <doNotGenerate> ^coInterpreter stSizeOf: integerValue
On Thu, Mar 17, 2016 at 2:35 PM, commits@source.squeak.org wrote:
Nicolas Cellier uploaded a new version of VMMaker to project VM Maker: http://source.squeak.org/VMMaker/VMMaker.oscog-nice.1731.mcz
==================== Summary ====================
Name: VMMaker.oscog-nice.1731 Author: nice Time: 17 March 2016, 10:33:40.804 pm UUID: 5a57b844-0803-41bd-b772-73cf6c7dfb0a Ancestors: VMMaker.oscog-dtl.1730
Fix a shift in BitBltSimulation. The shift must be signed but the simulator incorrectly makes it unsigned leading to memory exhaustion error.
Let FilePlugin>>primitiveDirectoryDelete primitiveFail rather than raising a mustBeBoolean error.
Fix 64bits simulation of long64At:put: that would fail for negative put value.
Provide a SpurMemoryManager stSizeOf: for simulation purpose (the message is used by some plugins).
Restore a more intention revealing literal in reverseDisplayFrom:to:
=============== Diff against VMMaker.oscog-dtl.1730 ===============
Item was changed: ----- Method: BitBltSimulation>>rgbMapPixel:flags: (in category 'color mapping') ----- rgbMapPixel: sourcePixel flags: mapperFlags "Perform the RGBA conversion for the given source pixel" | val | <inline: true>
val := ((sourcePixel bitAnd: (cmMaskTable at: 0))
bitShift: (cmShiftTable at: 0) signedIntFromLong).
val := val bitOr: ((sourcePixel bitAnd: (cmMaskTable at: 1))
bitShift: (cmShiftTable at: 1) signedIntFromLong).
val := val bitOr: ((sourcePixel bitAnd: (cmMaskTable at: 2))
bitShift: (cmShiftTable at: 2) signedIntFromLong).
^val bitOr: ((sourcePixel bitAnd: (cmMaskTable at: 3))
bitShift: (cmShiftTable at: 3) signedIntFromLong).
val := ((sourcePixel bitAnd: (cmMaskTable at: 0))
bitShift: (cmShiftTable at: 0)).
val := val bitOr: ((sourcePixel bitAnd: (cmMaskTable at: 1))
bitShift: (cmShiftTable at: 1)).
val := val bitOr: ((sourcePixel bitAnd: (cmMaskTable at: 2))
bitShift: (cmShiftTable at: 2)).
^val bitOr: ((sourcePixel bitAnd: (cmMaskTable at: 3))
bitShift: (cmShiftTable at: 3)). !
Item was changed: ----- Method: FilePlugin>>primitiveDirectoryDelete (in category 'directory primitives') ----- primitiveDirectoryDelete
| dirName dirNameIndex dirNameSize okToDelete | <var: #dirNameIndex type: 'char *'> <export: true> dirName := interpreterProxy stackValue: 0. (interpreterProxy isBytes: dirName) ifFalse: [^interpreterProxy primitiveFail]. dirNameIndex := interpreterProxy firstIndexableField: dirName. dirNameSize := interpreterProxy byteSizeOf: dirName. "If the security plugin can be loaded, use it to check for
permission. If not, assume it's ok" sCDPfn ~= 0
ifTrue: [okToDelete := self cCode: ' ((sqInt (*)(char *,
sqInt))sCDPfn)(dirNameIndex, dirNameSize)' inSmalltalk: [false].
ifTrue: [okToDelete := self cCode: ' ((sqInt (*)(char *,
sqInt))sCDPfn)(dirNameIndex, dirNameSize)'. okToDelete ifFalse: [^interpreterProxy primitiveFail]]. (self cCode: 'dir_Delete(dirNameIndex, dirNameSize)' inSmalltalk: [false]) ifFalse: [^interpreterProxy primitiveFail]. interpreterProxy pop: 1!
Item was changed: ----- Method: Spur64BitMMLESimulator>>long64At:put: (in category 'memory access') ----- long64At: byteAddress put: a64BitValue byteAddress \ 8 ~= 0 ifTrue: [self unalignedAccessError]. self long32At: byteAddress put: (a64BitValue bitAnd: 16rffffffff);
long32At: byteAddress + 4 put: (a64BitValue >> 32 bitAnd:
16rffffffff).
long32At: byteAddress + 4 put: a64BitValue >> 32. ^a64BitValue!
Item was added:
- ----- Method: SpurMemoryManager>>stSizeOf: (in category 'object access')
- stSizeOf: oop
"Return the number of indexable fields in the receiver"
^oop basicSize!
Item was changed: ----- Method: StackInterpreter>>reverseDisplayFrom:to: (in category 'I/O primitive support') ----- reverseDisplayFrom: startIndex to: endIndex "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." | displayObj displayBits w wordStartIndex wordEndIndex primFailCodeValue | displayObj := objectMemory splObj: TheDisplay. ((objectMemory isPointers: displayObj) and: [(objectMemory lengthOf: displayObj) >= 4]) ifFalse: [^ nil]. w := objectMemory fetchPointer: 1 ofObject: displayObj. displayBits := objectMemory fetchPointer: 0 ofObject: displayObj. ((objectMemory isImmediate: displayBits) or: [(objectMemory isNonIntegerObject: w) or: [objectMemory isPointersNonImm: displayBits]]) ifTrue: [^ nil]. wordStartIndex := startIndex * 4. wordEndIndex := endIndex * 4 min: (objectMemory sizeBitsOf: displayBits). displayBits := displayBits + objectMemory baseHeaderSize. displayBits + wordStartIndex to: displayBits + wordEndIndex by: 4 do: [:ptr | | reversed |
reversed := (objectMemory long32At: ptr) bitXor:
16rFFFFFFFF.
reversed := (objectMemory long32At: ptr) bitXor:
4294967295. objectMemory long32At: ptr put: reversed]. primFailCodeValue := primFailCode. self initPrimCall. self displayBitsOf: displayObj Left: 0 Top: 0 Right: (objectMemory integerValueOf: w) Bottom: 1. self ioForceDisplayUpdate. primFailCode := primFailCodeValue!
Yep, I corrected in 1733
2016-03-18 21:54 GMT+01:00 Eliot Miranda eliot.miranda@gmail.com:
Hi Nicolas,
the right form for that stSizeOf: implementation is
stSizeOf: integerValue "hack around the CoInterpreter/ObjectMemory split refactoring"
<doNotGenerate> ^coInterpreter stSizeOf: integerValue
On Thu, Mar 17, 2016 at 2:35 PM, commits@source.squeak.org wrote:
Nicolas Cellier uploaded a new version of VMMaker to project VM Maker: http://source.squeak.org/VMMaker/VMMaker.oscog-nice.1731.mcz
==================== Summary ====================
Name: VMMaker.oscog-nice.1731 Author: nice Time: 17 March 2016, 10:33:40.804 pm UUID: 5a57b844-0803-41bd-b772-73cf6c7dfb0a Ancestors: VMMaker.oscog-dtl.1730
Fix a shift in BitBltSimulation. The shift must be signed but the simulator incorrectly makes it unsigned leading to memory exhaustion error.
Let FilePlugin>>primitiveDirectoryDelete primitiveFail rather than raising a mustBeBoolean error.
Fix 64bits simulation of long64At:put: that would fail for negative put value.
Provide a SpurMemoryManager stSizeOf: for simulation purpose (the message is used by some plugins).
Restore a more intention revealing literal in reverseDisplayFrom:to:
=============== Diff against VMMaker.oscog-dtl.1730 ===============
Item was changed: ----- Method: BitBltSimulation>>rgbMapPixel:flags: (in category 'color mapping') ----- rgbMapPixel: sourcePixel flags: mapperFlags "Perform the RGBA conversion for the given source pixel" | val | <inline: true>
val := ((sourcePixel bitAnd: (cmMaskTable at:
0)) bitShift: (cmShiftTable at: 0) signedIntFromLong).
val := val bitOr: ((sourcePixel bitAnd: (cmMaskTable at: 1))
bitShift: (cmShiftTable at: 1) signedIntFromLong).
val := val bitOr: ((sourcePixel bitAnd: (cmMaskTable at: 2))
bitShift: (cmShiftTable at: 2) signedIntFromLong).
^val bitOr: ((sourcePixel bitAnd: (cmMaskTable at: 3))
bitShift: (cmShiftTable at: 3) signedIntFromLong).
val := ((sourcePixel bitAnd: (cmMaskTable at:
0)) bitShift: (cmShiftTable at: 0)).
val := val bitOr: ((sourcePixel bitAnd: (cmMaskTable at: 1))
bitShift: (cmShiftTable at: 1)).
val := val bitOr: ((sourcePixel bitAnd: (cmMaskTable at: 2))
bitShift: (cmShiftTable at: 2)).
^val bitOr: ((sourcePixel bitAnd: (cmMaskTable at: 3))
bitShift: (cmShiftTable at: 3)). !
Item was changed: ----- Method: FilePlugin>>primitiveDirectoryDelete (in category 'directory primitives') ----- primitiveDirectoryDelete
| dirName dirNameIndex dirNameSize okToDelete | <var: #dirNameIndex type: 'char *'> <export: true> dirName := interpreterProxy stackValue: 0. (interpreterProxy isBytes: dirName) ifFalse: [^interpreterProxy primitiveFail]. dirNameIndex := interpreterProxy firstIndexableField: dirName. dirNameSize := interpreterProxy byteSizeOf: dirName. "If the security plugin can be loaded, use it to check for
permission. If not, assume it's ok" sCDPfn ~= 0
ifTrue: [okToDelete := self cCode: ' ((sqInt (*)(char *,
sqInt))sCDPfn)(dirNameIndex, dirNameSize)' inSmalltalk: [false].
ifTrue: [okToDelete := self cCode: ' ((sqInt (*)(char *,
sqInt))sCDPfn)(dirNameIndex, dirNameSize)'. okToDelete ifFalse: [^interpreterProxy primitiveFail]]. (self cCode: 'dir_Delete(dirNameIndex, dirNameSize)' inSmalltalk: [false]) ifFalse: [^interpreterProxy primitiveFail]. interpreterProxy pop: 1!
Item was changed: ----- Method: Spur64BitMMLESimulator>>long64At:put: (in category 'memory access') ----- long64At: byteAddress put: a64BitValue byteAddress \ 8 ~= 0 ifTrue: [self unalignedAccessError]. self long32At: byteAddress put: (a64BitValue bitAnd: 16rffffffff);
long32At: byteAddress + 4 put: (a64BitValue >> 32 bitAnd:
16rffffffff).
long32At: byteAddress + 4 put: a64BitValue >> 32. ^a64BitValue!
Item was added:
- ----- Method: SpurMemoryManager>>stSizeOf: (in category 'object
access') -----
- stSizeOf: oop
"Return the number of indexable fields in the receiver"
^oop basicSize!
Item was changed: ----- Method: StackInterpreter>>reverseDisplayFrom:to: (in category 'I/O primitive support') ----- reverseDisplayFrom: startIndex to: endIndex "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." | displayObj displayBits w wordStartIndex wordEndIndex primFailCodeValue | displayObj := objectMemory splObj: TheDisplay. ((objectMemory isPointers: displayObj) and: [(objectMemory lengthOf: displayObj) >= 4]) ifFalse: [^ nil]. w := objectMemory fetchPointer: 1 ofObject: displayObj. displayBits := objectMemory fetchPointer: 0 ofObject: displayObj. ((objectMemory isImmediate: displayBits) or: [(objectMemory isNonIntegerObject: w) or: [objectMemory isPointersNonImm: displayBits]]) ifTrue: [^ nil]. wordStartIndex := startIndex * 4. wordEndIndex := endIndex * 4 min: (objectMemory sizeBitsOf: displayBits). displayBits := displayBits + objectMemory baseHeaderSize. displayBits + wordStartIndex to: displayBits + wordEndIndex by: 4 do: [:ptr | | reversed |
reversed := (objectMemory long32At: ptr) bitXor:
16rFFFFFFFF.
reversed := (objectMemory long32At: ptr) bitXor:
4294967295. objectMemory long32At: ptr put: reversed]. primFailCodeValue := primFailCode. self initPrimCall. self displayBitsOf: displayObj Left: 0 Top: 0 Right: (objectMemory integerValueOf: w) Bottom: 1. self ioForceDisplayUpdate. primFailCode := primFailCodeValue!
-- _,,,^..^,,,_ best, Eliot
vm-dev@lists.squeakfoundation.org