[Vm-dev] VM Maker: VMMaker.oscog-nice.1731.mcz

commits at source.squeak.org commits at source.squeak.org
Thu Mar 17 21:36:21 UTC 2016

Nicolas Cellier uploaded a new version of VMMaker to project VM Maker:

==================== 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') -----
  	| 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)'.
  				ifFalse: [^interpreterProxy primitiveFail]].
  			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].
  		long32At: byteAddress put: (a64BitValue bitAnd: 16rffffffff);
+ 		long32At: byteAddress + 4 put: (a64BitValue >> 32 bitAnd: 16rffffffff).
- 		long32At: byteAddress + 4 put: a64BitValue >> 32.

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!

More information about the Vm-dev mailing list