[Vm-dev] VM Maker: VMMaker.oscog-eem.1130.mcz

commits at source.squeak.org commits at source.squeak.org
Tue Mar 31 00:22:14 UTC 2015


Eliot Miranda uploaded a new version of VMMaker to project VM Maker:
http://source.squeak.org/VMMaker/VMMaker.oscog-eem.1130.mcz

==================== Summary ====================

Name: VMMaker.oscog-eem.1130
Author: eem
Time: 30 March 2015, 5:20:24.731 pm
UUID: 7d87dac8-7e00-47ba-86da-1180507647a6
Ancestors: VMMaker.oscog-eem.1129

Integrate Nicolas' safer primitiveScanCharacters

=============== Diff against VMMaker.oscog-eem.1129 ===============

Item was changed:
  ----- Method: InterpreterPrimitives>>primitiveScanCharacters (in category 'I/O primitives') -----
  primitiveScanCharacters
  	"The character scanner primitive."
  	| kernDelta stops sourceString scanStopIndex scanStartIndex rcvr scanDestX scanLastIndex scanXTable scanMap maxGlyph ascii stopReason glyphIndex sourceX sourceX2 nextDestX scanRightX nilOop |
  
  	self methodArgumentCount = 6
  		ifFalse: [^ self primitiveFail].
  
+ 	"Load the receiver and arguments"
- 	"Load the arguments"
  	kernDelta := self stackIntegerValue: 0.
  	stops := self stackObjectValue: 1.
- 	(objectMemory isArray: stops) ifFalse: [^ self primitiveFail].
- 	(objectMemory slotSizeOf: stops) >= 258 ifFalse: [^ self primitiveFail].
  	scanRightX := self stackIntegerValue: 2.
  	sourceString := self stackObjectValue: 3.
- 	(objectMemory isBytes: sourceString) ifFalse: [^ self primitiveFail].
  	scanStopIndex := self stackIntegerValue: 4.
  	scanStartIndex := self stackIntegerValue: 5.
+ 	rcvr := self stackObjectValue: 6.
+ 	self successful ifFalse: [^ nil].
+ 	
+ 	"check argument type and range"
+ 	(objectMemory isArray: stops) ifFalse: [^ self primitiveFail].
+ 	(objectMemory slotSizeOf: stops) >= 258 ifFalse: [^ self primitiveFail].
+ 	(objectMemory isBytes: sourceString) ifFalse: [^ self primitiveFail].
  	(scanStartIndex > 0 and: [scanStopIndex > 0 and: [scanStopIndex <= (objectMemory byteSizeOf: sourceString)]])
  		ifFalse: [^ self primitiveFail].
  
+ 	"Check receiver and required instVars"
- 	"Load receiver and required instVars"
- 	rcvr := self stackObjectValue: 6.
  	((objectMemory isPointers: rcvr) and: [(objectMemory slotSizeOf: rcvr) >= 4]) ifFalse: [^ self primitiveFail].
  	scanDestX := self fetchInteger: 0 ofObject: rcvr.
  	scanLastIndex := self fetchInteger: 1 ofObject: rcvr.
  	scanXTable := objectMemory fetchPointer: 2 ofObject: rcvr.
  	scanMap := objectMemory fetchPointer: 3 ofObject: rcvr.
  	((objectMemory isArray: scanXTable) and: [objectMemory isArray: scanMap]) ifFalse: [^ self primitiveFail].
  	(objectMemory slotSizeOf: scanMap) = 256 ifFalse: [^ self primitiveFail].
  	self successful ifFalse: [^ nil].
  	maxGlyph := (objectMemory slotSizeOf: scanXTable) - 2.
  
  	"Okay, here we go. We have eliminated nearly all failure 
  	conditions, to optimize the inner fetches."
  	scanLastIndex := scanStartIndex.
  	nilOop := objectMemory nilObject.
  	[scanLastIndex <= scanStopIndex]
  		whileTrue: [
  			"Known to be okay since scanStartIndex > 0 and scanStopIndex <= sourceString size"
  			ascii := objectMemory fetchByte: scanLastIndex - 1 ofObject: sourceString.
  			"Known to be okay since stops size >= 258"
  			(stopReason := objectMemory fetchPointer: ascii ofObject: stops) = nilOop
  				ifFalse: ["Store everything back and get out of here since some stop conditionn needs to be checked"
  					(objectMemory isIntegerValue: scanDestX) ifFalse: [^ self primitiveFail].
  					self storeInteger: 0 ofObject: rcvr withValue: scanDestX.
  					self storeInteger: 1 ofObject: rcvr withValue: scanLastIndex.
  					self pop: 7. "args+rcvr"
  					^ self push: stopReason].
  			"Known to be okay since scanMap size = 256"
  			glyphIndex := self fetchInteger: ascii ofObject: scanMap.
  			"fail if the glyphIndex is out of range"
  			(self failed or: [glyphIndex < 0 	or: [glyphIndex > maxGlyph]]) ifTrue: [^ self primitiveFail].
  			sourceX := self fetchInteger: glyphIndex ofObject: scanXTable.
  			sourceX2 := self fetchInteger: glyphIndex + 1 ofObject: scanXTable.
  			"Above may fail if non-integer entries in scanXTable"
  			self failed ifTrue: [^ nil].
  			nextDestX := scanDestX + sourceX2 - sourceX.
  			nextDestX > scanRightX ifTrue:
  				["Store everything back and get out of here since we got to the right edge"
  				(objectMemory isIntegerValue: scanDestX) ifFalse: [^ self primitiveFail].
  				self storeInteger: 0 ofObject: rcvr withValue: scanDestX.
  				self storeInteger: 1 ofObject: rcvr withValue: scanLastIndex.
  				self pop: 7 "args+rcvr" thenPush: (objectMemory fetchPointer: CrossedX - 1 ofObject: stops).
  				^nil].
  			scanDestX := nextDestX + kernDelta.
  			scanLastIndex := scanLastIndex + 1].
  	(objectMemory isIntegerValue: scanDestX) ifFalse: [^ self primitiveFail].
  	self storeInteger: 0 ofObject: rcvr withValue: scanDestX.
  	self storeInteger: 1 ofObject: rcvr withValue: scanStopIndex.
  	self pop: 7 "args+rcvr" thenPush: (objectMemory fetchPointer: EndOfRun - 1 ofObject: stops)!



More information about the Vm-dev mailing list