David T. Lewis uploaded a new version of VMMaker to project VM Maker: http://source.squeak.org/VMMaker/VMMaker-dtl.263.mcz
==================== Summary ====================
Name: VMMaker-dtl.263 Author: dtl Time: 8 January 2012, 10:15:49.82 am UUID: d27692ee-cbe0-4f61-8c3d-6bec64b30df8 Ancestors: VMMaker-dtl.262
VMMaker 4.7.20
Define HAVE_INTERP_H in the generated interp.h file to enable check for included file, e.g. from sqMemoryAccess.h.
Check argument count in primitivePerformInSuperclass, fail primitive if not 3 or 4.
=============== Diff against VMMaker-dtl.262 ===============
Item was changed: ----- Method: CCodeGenerator>>storeHeaderFor:onFile: (in category 'public') ----- storeHeaderFor: interpreterClassName onFile: fileName "Store C header code for this interpreter on the given file."
| aStream | aStream := CrLfFileStream forceNewFileNamed: fileName. aStream ifNil: [Error signal: 'Could not open C header file: ', fileName]. aStream nextPutAll: '/* '; nextPutAll: VMMaker headerNotice; + nextPutAll: ' */'; cr; cr; + nextPutAll: '#ifndef HAVE_INTERP_H'; cr; + nextPutAll: '#define HAVE_INTERP_H'; cr; + nextPutAll: '#endif'; cr; cr. - nextPutAll: ' */'; cr; cr. self emitVmmVersionOn: aStream. (Smalltalk classNamed: interpreterClassName) emitInterpreterProxyVersionOn: aStream. self emitDefineBytesPerWordOn: aStream. self emitDefineMemoryAccessInImageOn: aStream. aStream cr. aStream close !
Item was changed: ----- Method: Interpreter>>primitivePerformInSuperclass (in category 'control primitives') ----- primitivePerformInSuperclass | lookupClass rcvr currentClass | lookupClass := self stackTop. rcvr := self stackValue: 3. currentClass := self fetchClassOf: rcvr. [currentClass ~= lookupClass] whileTrue: [currentClass := self superclassOf: currentClass. + currentClass = nilObj ifTrue: [^self primitiveFailFor: PrimErrBadArgument]]. - currentClass = nilObj ifTrue: [^ self primitiveFail]].
argumentCount = 3 ifTrue: ["normal primitive call with 3 arguments expected on the stack" self popStack. self primitivePerformAt: lookupClass. self successful ifFalse: [self push: lookupClass]] + ifFalse: [argumentCount = 4 + ifTrue: ["mirror primitive call with extra argument specifying object to serve as receiver" + | s1 s2 s3 s4 s5 | + "save stack contents" + s1 := self popStack. "lookupClass" + s2 := self popStack. "args" + s3 := self popStack. "selector" + s4 := self popStack. "mirror receiver" + s5 := self popStack. "actual receiver" + "slide stack up one, omitting the actual receiver parameter" + self push: s4. "mirror receiver" - ifFalse: ["mirror primitive call with extra argument specifying object to serve as receiver" - | s1 s2 s3 s4 s5 | - "save stack contents" - s1 := self popStack. "lookupClass" - s2 := self popStack. "args" - s3 := self popStack. "selector" - s4 := self popStack. "mirror receiver" - s5 := self popStack. "actual receiver" - "slide stack up one, omitting the actual receiver parameter" - self push: s4. "mirror receiver" - self push: s3. "selector" - self push: s2. "args" - "perform as if mirror receiver had been the actual receiver" - self primitivePerformAt: lookupClass. - self successful ifFalse: - ["restore original stack" - self pop: 3. "args, selector, mirror receiver" - self push: s5. "actual receiver" - self push: s4. "mirror receiver" self push: s3. "selector" self push: s2. "args" + "perform as if mirror receiver had been the actual receiver" + self primitivePerformAt: lookupClass. + self successful ifFalse: + ["restore original stack" + self pop: 3. "args, selector, mirror receiver" + self push: s5. "actual receiver" + self push: s4. "mirror receiver" + self push: s3. "selector" + self push: s2. "args" + self push: s1. "lookup class" ]] + ifFalse: ["wrong number of arguments" + ^self primitiveFailFor: PrimErrBadNumArgs]] - self push: s1. "lookup class" ]] !
Item was changed: ----- Method: VMMaker class>>versionString (in category 'version testing') ----- versionString
"VMMaker versionString"
+ ^'4.7.20'! - ^'4.7.19'!
vm-dev@lists.squeakfoundation.org