[Vm-dev] VM Maker: VMMaker-dtl.423.mcz

commits at source.squeak.org commits at source.squeak.org
Sat Mar 20 17:32:31 UTC 2021


David T. Lewis uploaded a new version of VMMaker to project VM Maker:
http://source.squeak.org/VMMaker/VMMaker-dtl.423.mcz

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

Name: VMMaker-dtl.423
Author: dtl
Time: 20 March 2021, 12:27:52.291 pm
UUID: b744c4a9-0a90-4104-8680-6e815df0f064
Ancestors: VMMaker-dtl.422

VMMaker 4.19.6 restore support for objects as methods.
Extend the internal size of primitiveTable beyond MaxPrimitiveIndex and reinstall primitiveInvokeObjectAsMethod in the protected region. Allows invocation from lookupMethodInDictionary without exposing the method to the image as a numbered primitive. Also clean up a duplicate currentByteCode in class Interpreter declaration, not sure how that happened.

=============== Diff against VMMaker-dtl.422 ===============

Item was changed:
  ----- Method: ContextInterpreter class>>declareCVarsIn: (in category 'translation') -----
  declareCVarsIn: aCCodeGenerator 
  	aCCodeGenerator addHeaderFile: '<setjmp.h>'.
  	aCCodeGenerator var: #statGCTime type: #sqLong.
  	aCCodeGenerator var: #statFullGCMSecs type: #sqLong.
  	aCCodeGenerator var: #statIGCDeltaTime type: #sqLong.
  	aCCodeGenerator var: #statIncrGCMSecs type: #sqLong.
  	aCCodeGenerator var: #compilerHooks declareC: 'sqInt (*compilerHooks[' , (CompilerHooksSize + 1) printString , '])()'.
  	aCCodeGenerator var: #interpreterVersion declareC: 'const char *interpreterVersion = "' , SmalltalkImage current datedVersion , ' [' , SmalltalkImage current lastUpdateString , ']"'.
  	self declareCAsOop: {#newMethod. #activeContext. #theHomeContext} in: aCCodeGenerator.
  	"Reinitialized at interpreter entry by #initializeImageFormatVersion"
  	aCCodeGenerator var: #imageFormatVersionNumber declareC: 'sqInt imageFormatVersionNumber = 0'.
  	"Declared here to prevent inclusion in foo struct by
  	CCodeGeneratorGlobalStructure"
  	aCCodeGenerator var: #imageFormatInitialVersion declareC: 'sqInt imageFormatInitialVersion = 0'.
+ 	aCCodeGenerator var: #primitiveTable declareC: 'void (*primitiveTable[', (MaxPrimitiveIndex + ProtectedPrimitiveCount + 1) asString, '])(void)'.
- 	aCCodeGenerator var: #primitiveTable declareC: 'void (*primitiveTable[', MaxPrimitiveIndex asString, '])(void)'.
  	aCCodeGenerator var: #primitiveTableDefaults declareC: 'void (*primitiveTableDefaults[' , (MaxPrimitiveIndex + 2) printString , '] )(void)= ' , self primitiveTableString.
  !

Item was changed:
  ----- Method: ContextInterpreter>>installPrimitiveTable (in category 'primitive table') -----
  installPrimitiveTable
  	<inline: false>
+ 	0 to: MaxPrimitiveIndex + ProtectedPrimitiveCount do: [ :i |
- 	0 to: MaxPrimitiveIndex do: [ :i |
  		primitiveTable at: i put: (primitiveTableDefaults at: i) ].
  	self updatePrimitiveTable.
  !

Item was changed:
  ----- Method: ContextInterpreter>>lookupMethodInDictionary: (in category 'message sending') -----
  lookupMethodInDictionary: dictionary 
  	"This method lookup tolerates integers as Dictionary keys to 
  	support execution of images in which Symbols have been 
  	compacted out"
  	| length index mask wrapAround nextSelector methodArray |
  	<inline: true>
  	length := objectMemory fetchWordLengthOf: dictionary.
  	mask := length - SelectorStart - 1.
  	(objectMemory isIntegerObject: messageSelector)
  		ifTrue: [index := (mask bitAnd: (objectMemory integerValueOf: messageSelector)) + SelectorStart]
  		ifFalse: [index := (mask bitAnd: (objectMemory hashBitsOf: messageSelector)) + SelectorStart].
  
  	"It is assumed that there are some nils in this dictionary, and search will 
  	stop when one is encountered. However, if there are no nils, then wrapAround 
  	will be detected the second time the loop gets to the end of the table."
  	wrapAround := false.
  	[true]
  		whileTrue: [nextSelector := objectMemory fetchPointer: index ofObject: dictionary.
  			nextSelector = objectMemory getNilObj ifTrue: [^ false].
  			nextSelector = messageSelector
  				ifTrue: [methodArray := objectMemory fetchPointer: MethodArrayIndex ofObject: dictionary.
  					newMethod := objectMemory fetchPointer: index - SelectorStart ofObject: methodArray.
  					"Check if newMethod is a CompiledMethod."
  					(objectMemory isCompiledMethod: newMethod)
  						ifTrue: [primitiveIndex := self primitiveIndexOf: newMethod.
  							primitiveIndex > MaxPrimitiveIndex
  								ifTrue: ["If primitiveIndex is out of range, set to zero before putting in 
  									cache. This is equiv to primFail, and avoids the need to check on 
  									every send."
  									primitiveIndex := 0]]
  						ifFalse: ["indicate that this is no compiled method - use primitiveInvokeObjectAsMethod"
+ 							self flag: #primitiveInvokeObjectAsMethod.
+ 							primitiveIndex := MaxPrimitiveIndex + 1].
- 							primitiveIndex := 248].
  					^ true].
  			index := index + 1.
  			index = length
  				ifTrue: [wrapAround
  						ifTrue: [^ false].
  					wrapAround := true.
  					index := SelectorStart]]!

Item was changed:
  InterpreterPrimitives subclass: #Interpreter
+ 	instanceVariableNames: 'currentBytecode semaphoresUseBufferA semaphoresToSignalA semaphoresToSignalCountA semaphoresToSignalB semaphoresToSignalCountB extraVMMemory globalSessionID method instructionPointer stackPointer localIP localSP localReturnValue messageSelector primitiveFunctionPointer methodCache atCache lkupClass interruptPending savedWindowSize deferDisplayUpdates pendingFinalizationSignals interpreterProxy showSurfaceFn externalPrimitiveTable jmpBuf jmpDepth suspendedCallbacks suspendedMethods'
+ 	classVariableNames: 'AtCacheEntries AtCacheFixedFields AtCacheFmt AtCacheMask AtCacheOop AtCacheSize AtCacheTotalSize AtPutBase MaxExternalPrimitiveTableSize MaxJumpBuf MaxPrimitiveIndex ProtectedPrimitiveCount SemaphoresToSignalSize'
- 	instanceVariableNames: 'currentBytecode semaphoresUseBufferA semaphoresToSignalA semaphoresToSignalCountA semaphoresToSignalB semaphoresToSignalCountB extraVMMemory globalSessionID method instructionPointer stackPointer localIP localSP localReturnValue messageSelector currentByteCode primitiveFunctionPointer methodCache atCache lkupClass interruptPending savedWindowSize deferDisplayUpdates pendingFinalizationSignals interpreterProxy showSurfaceFn externalPrimitiveTable jmpBuf jmpDepth suspendedCallbacks suspendedMethods'
- 	classVariableNames: 'AtCacheEntries AtCacheFixedFields AtCacheFmt AtCacheMask AtCacheOop AtCacheSize AtCacheTotalSize AtPutBase MaxExternalPrimitiveTableSize MaxJumpBuf MaxPrimitiveIndex SemaphoresToSignalSize'
  	poolDictionaries: 'VMMethodCacheConstants'
  	category: 'VMMaker-Interpreter'!
  
  !Interpreter commentStamp: 'dtl 4/22/2016 22:14' prior: 0!
  This class is a complete implementation of the Smalltalk-80 virtual machine, derived originally from the Blue Book specification but quite different in some areas.
  
  ContextInterpreter is the Squeak interpreter VM as originally implemented by Dan Ingalls.
  
  StackInterpreter is the stack mapped interpreter by Eliot Miranda, which provides the basis for later Cog and Spur VMs.!

Item was changed:
  ----- Method: Interpreter class>>declareCVarsIn: (in category 'translation') -----
  declareCVarsIn: aCCodeGenerator
  
  	aCCodeGenerator
  		var: #interpreterProxy  type: #'struct VirtualMachine*'.
  	aCCodeGenerator var: 'semaphoresToSignalA' declareC: 'sqInt semaphoresToSignalA[' , (SemaphoresToSignalSize + 1) printString , ']'.
  	aCCodeGenerator var: 'semaphoresToSignalB' declareC: 'sqInt semaphoresToSignalB[' , (SemaphoresToSignalSize + 1) printString , ']'.
+ 	self declareC: #(stackPointer instructionPointer method)
- 	self declareC: #(instructionPointer method)
  		as: #usqInt
  		in: aCCodeGenerator.
+ 	self declareC: #(localIP localSP)
- 	self declareC: #(stackPointer localIP localSP)
  		as: #'char *'
  		in: aCCodeGenerator.
  	aCCodeGenerator
  		var: #primitiveFunctionPointer
  		declareC: 'void (*primitiveFunctionPointer)()'.
  	aCCodeGenerator
  		var: #methodCache
  		declareC: 'long methodCache[MethodCacheSize + 1 /* ', (MethodCacheSize + 1) printString, ' */]'.
  	aCCodeGenerator
  		var: #atCache
  		declareC: 'sqInt atCache[AtCacheTotalSize + 1 /* ', (AtCacheTotalSize + 1) printString, ' */]'.
  	aCCodeGenerator
  		var: #showSurfaceFn
  		type: #'void *'.
  	aCCodeGenerator
  		var: #externalPrimitiveTable
  		declareC: 'void (*externalPrimitiveTable[' , (MaxExternalPrimitiveTableSize + 1) printString , '])(void)'.
  	aCCodeGenerator
  		var: #jmpBuf
  		declareC: 'jmp_buf jmpBuf[MaxJumpBuf + 1 /* ', (MaxJumpBuf + 1) printString, ' */]'.
  	aCCodeGenerator
  		var: #suspendedCallbacks
  		declareC: 'usqInt suspendedCallbacks[MaxJumpBuf + 1 /* ', (MaxJumpBuf + 1) printString, ' */]'.
  	aCCodeGenerator
  		var: #suspendedMethods
  		declareC: 'usqInt suspendedMethods[MaxJumpBuf + 1 /* ', (MaxJumpBuf + 1) printString, ' */]'.
  
  
  
  !

Item was changed:
  ----- Method: Interpreter class>>initializePrimitiveTable (in category 'initialization') -----
(excessive size, no diff calculated)

Item was changed:
  ----- Method: VMMaker class>>versionString (in category 'version testing') -----
  versionString
  
  	"VMMaker versionString"
  
+ 	^'4.19.6'!
- 	^'4.19.5'!



More information about the Vm-dev mailing list