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

commits at source.squeak.org commits at source.squeak.org
Wed Apr 10 23:05:39 UTC 2013


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

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

Name: VMMaker.oscog-eem.284
Author: eem
Time: 10 April 2013, 4:03:06.024 pm
UUID: 4f939b96-e07b-4888-9880-d2e9465edbe3
Ancestors: VMMaker.oscog-tpr.283

Add Callback LIFO ordering support to the new-style Callback return
primitives.  Fix some compiler warnings.

Fix typos in RiscOSVMMaker

=============== Diff against VMMaker.oscog-tpr.283 ===============

Item was changed:
  ----- Method: IA32ABIPlugin>>primInLibraryFindSymbol (in category 'primitives-library loading') -----
  primInLibraryFindSymbol
  	"Attempt to find the address of a symbol in a loaded library.
  	 The primitive can have a signature  either of the form:
  		<Anywhere> primInLibrary: libraryHandle <Alien> findSymbol: symbolName <String> ^<Integer>
  			<primitive: 'primInLibraryFindSymbol' error: errorCode module: 'IA32ABI'>
  	 or:
  		libraryHandle <Alien>  primFindSymbol: symbolName <String> ^<Integer>
  			<primitive: 'primInLibraryFindSymbol' error: errorCode module: 'IA32ABI'>"
- 	| functionName libraryProxy address |
  	<export: true>
+ 	| functionName libraryProxy address |
+ 	<var: #address type: #'void *'>
  	functionName := interpreterProxy stackValue: 0.
  	libraryProxy := interpreterProxy stackValue: 1.
  	((self isAlien: libraryProxy)
  	 and: [(interpreterProxy byteSizeOf: libraryProxy) >= 2 * BytesPerOop
  	 and: [interpreterProxy isBytes: functionName]]) ifFalse:
  		[^interpreterProxy primitiveFailFor: PrimErrBadArgument].
  	address := interpreterProxy
  					ioLoadSymbol: (self cCoerce: (interpreterProxy firstIndexableField: functionName)
+ 										to: #sqInt)
- 										to: 'sqInt')
  					OfLength: (interpreterProxy byteSizeOf: functionName)
  					FromModule: (self longAt: libraryProxy + BaseHeaderSize + BytesPerOop).
  	(interpreterProxy failed
  	 or: [address = 0]) ifTrue:
  		[^interpreterProxy primitiveFailFor: PrimErrNotFound].
+ 	interpreterProxy methodReturnValue: (interpreterProxy positive32BitIntegerFor: address asUnsignedInteger)!
- 	interpreterProxy methodReturnValue: (interpreterProxy positive32BitIntegerFor: address)!

Item was changed:
  ----- Method: IA32ABIPlugin>>primLoadLibrary (in category 'primitives-library loading') -----
  primLoadLibrary
  	"Attempt to load a library of the given name.  The primitive will have a signature
  	 of the form:
  		<Anywhere>  primLoadLibrary: libraryName <String> ^<Integer>
  			<primitive: 'primLoadLibrary' error: errorCode module: 'IA32ABI'>"
- 	| libraryName libraryHandle |
  	<export: true>
+ 	| libraryName libraryHandle |
+ 	<var: #libraryHandle type: #'void *'>
  	libraryName := interpreterProxy stackValue: 0.
  	(interpreterProxy isBytes: libraryName)
  		ifFalse: [^ interpreterProxy primitiveFailFor: PrimErrBadArgument].
  	libraryHandle := interpreterProxy
  					ioLoadModule: (self cCoerce: (interpreterProxy firstIndexableField: libraryName) to: 'sqInt')
  					OfLength: (interpreterProxy byteSizeOf: libraryName).
  	libraryHandle = 0 ifTrue:
  		[^interpreterProxy primitiveFailFor: PrimErrNotFound].
+ 	interpreterProxy methodReturnValue: (interpreterProxy positive32BitIntegerFor: libraryHandle asUnsignedInteger)!
- 	interpreterProxy methodReturnValue: (interpreterProxy positive32BitIntegerFor: libraryHandle)!

Item was changed:
  ----- Method: IA32ABIPlugin>>primReturnAsFromContextThrough (in category 'primitives-callbacks') -----
  primReturnAsFromContextThrough
  	"Return a result from a callback to the callback's callee.  The primitive
+ 	 has a signature of either of the forms:
- 	has a signature of the form:
  		result <VMCallbackContext32/64>
  				primReturnAs: returnTypeCode <Integer>
  				FromContext: callbackContext <Context>
+ 		result <VMCallbackContext32/64>
+ 				primSignal: aSemaphore <Semaphore>
+ 				andReturnAs: returnTypeCode <Integer>
+ 				FromContext: callbackContext <Context>
+ 			<primitive: 'primReturnAsFromContextThrough' error: errorCode module: 'IA32ABI'>.
+ 	 If of the second form answer false if this is not the most recent callback, and signal aSemaphore
+ 	 if it is, so as to implement LIFO ordering of callbacks."
- 			<primitive: 'primReturnAsFromContextThrough' error: errorCode module: 'IA32ABI'>"
  	<export: true>
+ 	| vmCallbackContext isMostRecent |
+ 	<var: #vmCallbackContext type: #'VMCallbackContext *'>
+ 	interpreterProxy methodArgumentCount = 3
+ 		ifTrue:
+ 			[vmCallbackContext := self cCoerceSimple: (self startOfData: (interpreterProxy stackValue: 3))
+ 										to: #'VMCallbackContext *'.
+ 			 isMostRecent := vmCallbackContext = self getMostRecentCallbackContext.
+ 			 isMostRecent ifFalse:
+ 				[^interpreterProxy methodReturnValue: interpreterProxy falseObject].
+ 			(interpreterProxy fetchClassOf: (interpreterProxy stackValue: 2)) = interpreterProxy classSemaphore ifFalse:
+ 				[^interpreterProxy primitiveFailFor: PrimErrBadArgument].
+ 			[interpreterProxy signalNoResume: (interpreterProxy stackValue: 2)] whileFalse]
+ 		ifFalse:
+ 			[vmCallbackContext := self cCoerceSimple: (self startOfData: (interpreterProxy stackValue: 2))
+ 										to: #'VMCallbackContext *'].
  	(interpreterProxy
  		returnAs: (interpreterProxy stackValue: 1)
+ 		ThroughCallback: vmCallbackContext
- 		ThroughCallback: (self cCoerceSimple: (self startOfData: (interpreterProxy stackValue: 2))
- 								to: #'VMCallbackContext *')
  		Context: (interpreterProxy stackValue: 0)) ifFalse:
  			[^interpreterProxy primitiveFailFor: PrimErrBadArgument].
  	"NOTREACHED"!

Item was changed:
  ----- Method: IA32ABIPlugin>>primReturnFromContextThrough (in category 'primitives-callbacks') -----
  primReturnFromContextThrough
  	"Return a result from a callback to the callback's callee.  The primitive
+ 	 has a signature of either of the forms:
+ 		result <FFICallbackResult> primReturnFromContext: callbackContext <MethodContext> through: jmpBuf <Integer>
+ 		result <FFICallbackResult> primSignal: aSemaphore <Semaphore> andReturnFromContext: callbackContext <MethodContext> through: jmpBuf <Integer>
+ 			<primitive: 'primReturnFromContextThrough' error: errorCode module: 'IA32ABI'>.
+ 	 If of the second form answer true if this is not the most recent callback, and signal aSemaphore
+ 	 if it is, so as to implement LIFO ordering of callbacks."
- 	has a signature of the form:
- 		result <FFICallbackResult> primReturnFromContext: callbackContext <Context> through: jmpBuf <Integer>
- 			<primitive: 'primReturnFromContextThrough' error: errorCode module: 'IA32ABI'>"
  	<export: true>
  	<legacy>
  	| mac vmCallbackContext vmCallbackReturnValue isMostRecent |
  	<var: #vmCallbackContext type: #'VMCallbackContext *'>
  	<var: #vmCallbackReturnValue type: #'VMCallbackReturnValue *'>
  	vmCallbackContext := self cCoerceSimple: (interpreterProxy positive32BitValueOf: (interpreterProxy stackValue: 0))
  								to: #'VMCallbackContext *'.
  	(interpreterProxy failed or: [vmCallbackContext = 0]) ifTrue:
  		[^interpreterProxy primitiveFailFor: PrimErrBadArgument].
  
  	(mac := interpreterProxy methodArgumentCount) = 3 ifTrue:
  		[isMostRecent := vmCallbackContext = self getMostRecentCallbackContext.
  		isMostRecent ifFalse:
  			[interpreterProxy methodReturnValue: interpreterProxy trueObject.
  			^nil].
+ 		(interpreterProxy fetchClassOf: (interpreterProxy stackValue: 2)) = interpreterProxy classSemaphore
- 		(interpreterProxy fetchClassOf: (interpreterProxy stackValue: 2)) == interpreterProxy classSemaphore
  			ifFalse: [^interpreterProxy primitiveFailFor: PrimErrBadArgument].
  		[interpreterProxy signalNoResume: (interpreterProxy stackValue: 2)] whileFalse].
  	vmCallbackReturnValue := self cCoerceSimple: (self startOfData: (interpreterProxy stackValue: mac))
  									to: #'VMCallbackReturnValue *'..
  	self cCode: "C needs a typedef for structs to be assigned, but that implies a struct class for just one assignment."
  		[self mem: (self addressOf: vmCallbackContext rvs)
  			cp: (self addressOf: vmCallbackReturnValue crvrvs)
  			y: (self sizeof: vmCallbackContext rvs)]
  		inSmalltalk: [vmCallbackContext rvs: vmCallbackReturnValue crvrvs].
  	(interpreterProxy
  		returnAs: (interpreterProxy integerObjectOf: vmCallbackReturnValue type + 1)
  		ThroughCallback: vmCallbackContext
  		Context: (interpreterProxy stackValue: 1)) ifFalse:
  			[^interpreterProxy primitiveFailFor: PrimErrBadArgument].
  	"NOTREACHED"!

Item was changed:
  ----- Method: NewsqueakIA32ABIPlugin>>primInLibraryFindSymbol (in category 'primitives-library loading') -----
  primInLibraryFindSymbol
  	"Attempt to find the address of a symbol in a loaded library.
  	 The primitive can have a signature  either of the form:
  		<Anywhere> primInLibrary: libraryHandle <Alien> findSymbol: symbolName <String> ^<Integer>
  			<primitive: 'primInLibraryFindSymbol' error: errorCode module: 'IA32ABI'>
  	 or:
  		libraryHandle <Alien>  primFindSymbol: symbolName <String> ^<Integer>
  			<primitive: 'primInLibraryFindSymbol' error: errorCode module: 'IA32ABI'>"
- 	| functionName libraryProxy address |
  	<export: true>
+ 	| functionName libraryProxy address |
+ 	<var: #address type: #'void *'>
  	functionName := interpreterProxy stackValue: 0.
  	libraryProxy := interpreterProxy stackValue: 1.
  	((self isAlien: libraryProxy)
  	 and: [(interpreterProxy byteSizeOf: libraryProxy) >= 2 * BytesPerOop
  	 and: [interpreterProxy isBytes: functionName]]) ifFalse:
  		[^interpreterProxy primitiveFailFor: PrimErrBadArgument].
  	address := interpreterProxy
  					ioLoadSymbol: (self cCoerce: (interpreterProxy firstIndexableField: functionName)
+ 										to: #sqInt)
- 										to: 'sqInt')
  					OfLength: (interpreterProxy byteSizeOf: functionName)
  					FromModule: (self longAt: libraryProxy + BaseHeaderSize + BytesPerOop).
  	(interpreterProxy failed
  	 or: [address = 0]) ifTrue:
  		[^interpreterProxy primitiveFailFor: PrimErrNotFound].
+ 	interpreterProxy methodReturnValue: (interpreterProxy positive32BitIntegerFor: address asUnsignedInteger)!
- 	interpreterProxy methodReturnValue: (interpreterProxy positive32BitIntegerFor: address)!

Item was changed:
  ----- Method: NewsqueakIA32ABIPlugin>>primLoadLibrary (in category 'primitives-library loading') -----
  primLoadLibrary
  	"Attempt to load a library of the given name.  The primitive will have a signature
  	 of the form:
  		<Anywhere>  primLoadLibrary: libraryName <String> ^<Integer>
  			<primitive: 'primLoadLibrary' error: errorCode module: 'IA32ABI'>"
- 	| libraryName libraryHandle |
  	<export: true>
+ 	| libraryName libraryHandle |
+ 	<var: #libraryHandle type: #'void *'>
  	libraryName := interpreterProxy stackValue: 0.
  	(interpreterProxy isBytes: libraryName)
  		ifFalse: [^ interpreterProxy primitiveFailFor: PrimErrBadArgument].
  	libraryHandle := interpreterProxy
  					ioLoadModule: (self cCoerce: (interpreterProxy firstIndexableField: libraryName) to: 'sqInt')
  					OfLength: (interpreterProxy byteSizeOf: libraryName).
  	libraryHandle = 0 ifTrue:
  		[^interpreterProxy primitiveFailFor: PrimErrNotFound].
+ 	interpreterProxy methodReturnValue: (interpreterProxy positive32BitIntegerFor: libraryHandle asUnsignedInteger)!
- 	interpreterProxy methodReturnValue: (interpreterProxy positive32BitIntegerFor: libraryHandle)!

Item was changed:
  ----- Method: NewsqueakIA32ABIPlugin>>primReturnAsFromContextThrough (in category 'primitives-callbacks') -----
  primReturnAsFromContextThrough
  	"Return a result from a callback to the callback's callee.  The primitive
+ 	 has a signature of either of the forms:
- 	has a signature of the form:
  		result <VMCallbackContext32/64>
  				primReturnAs: returnTypeCode <Integer>
  				FromContext: callbackContext <Context>
+ 		result <VMCallbackContext32/64>
+ 				primSignal: aSemaphore <Semaphore>
+ 				andReturnAs: returnTypeCode <Integer>
+ 				FromContext: callbackContext <Context>
+ 			<primitive: 'primReturnAsFromContextThrough' error: errorCode module: 'IA32ABI'>.
+ 	 If of the second form answer false if this is not the most recent callback, and signal aSemaphore
+ 	 if it is, so as to implement LIFO ordering of callbacks."
- 			<primitive: 'primReturnAsFromContextThrough' error: errorCode module: 'IA32ABI'>"
  	<export: true>
+ 	| vmCallbackContext isMostRecent |
+ 	<var: #vmCallbackContext type: #'VMCallbackContext *'>
+ 	interpreterProxy methodArgumentCount = 3
+ 		ifTrue:
+ 			[vmCallbackContext := self cCoerceSimple: (self startOfData: (interpreterProxy stackValue: 3))
+ 										to: #'VMCallbackContext *'.
+ 			 isMostRecent := vmCallbackContext = self getMostRecentCallbackContext.
+ 			 isMostRecent ifFalse:
+ 				[^interpreterProxy methodReturnValue: interpreterProxy falseObject].
+ 			(interpreterProxy fetchClassOf: (interpreterProxy stackValue: 2)) = interpreterProxy classSemaphore ifFalse:
+ 				[^interpreterProxy primitiveFailFor: PrimErrBadArgument].
+ 			[interpreterProxy signalNoResume: (interpreterProxy stackValue: 2)] whileFalse]
+ 		ifFalse:
+ 			[vmCallbackContext := self cCoerceSimple: (self startOfData: (interpreterProxy stackValue: 2))
+ 										to: #'VMCallbackContext *'].
  	(interpreterProxy
  		returnAs: (interpreterProxy stackValue: 1)
+ 		ThroughCallback: vmCallbackContext
- 		ThroughCallback: (self cCoerceSimple: (self startOfData: (interpreterProxy stackValue: 2))
- 								to: #'VMCallbackContext *')
  		Context: (interpreterProxy stackValue: 0)) ifFalse:
  			[^interpreterProxy primitiveFailFor: PrimErrBadArgument].
  	"NOTREACHED"!

Item was changed:
  ----- Method: NewsqueakIA32ABIPlugin>>primReturnFromContextThrough (in category 'primitives-callbacks') -----
  primReturnFromContextThrough
  	"Return a result from a callback to the callback's callee.  The primitive
+ 	 has a signature of either of the forms:
+ 		result <FFICallbackResult> primReturnFromContext: callbackContext <MethodContext> through: jmpBuf <Integer>
+ 		result <FFICallbackResult> primSignal: aSemaphore <Semaphore> andReturnFromContext: callbackContext <MethodContext> through: jmpBuf <Integer>
+ 			<primitive: 'primReturnFromContextThrough' error: errorCode module: 'IA32ABI'>.
+ 	 If of the second form answer true if this is not the most recent callback, and signal aSemaphore
+ 	 if it is, so as to implement LIFO ordering of callbacks."
- 	has a signature of the form:
- 		result <FFICallbackResult> primReturnFromContext: callbackContext <Context> through: jmpBuf <Integer>
- 			<primitive: 'primReturnFromContextThrough' error: errorCode module: 'IA32ABI'>"
  	<export: true>
  	<legacy>
  	| mac vmCallbackContext vmCallbackReturnValue isMostRecent |
  	<var: #vmCallbackContext type: #'VMCallbackContext *'>
  	<var: #vmCallbackReturnValue type: #'VMCallbackReturnValue *'>
  	vmCallbackContext := self cCoerceSimple: (interpreterProxy positive32BitValueOf: (interpreterProxy stackValue: 0))
  								to: #'VMCallbackContext *'.
  	(interpreterProxy failed or: [vmCallbackContext = 0]) ifTrue:
  		[^interpreterProxy primitiveFailFor: PrimErrBadArgument].
  
  	(mac := interpreterProxy methodArgumentCount) = 3 ifTrue:
  		[isMostRecent := vmCallbackContext = self getMostRecentCallbackContext.
  		isMostRecent ifFalse:
  			[interpreterProxy methodReturnValue: interpreterProxy trueObject.
  			^nil].
+ 		(interpreterProxy fetchClassOf: (interpreterProxy stackValue: 2)) = interpreterProxy classSemaphore
- 		(interpreterProxy fetchClassOf: (interpreterProxy stackValue: 2)) == interpreterProxy classSemaphore
  			ifFalse: [^interpreterProxy primitiveFailFor: PrimErrBadArgument].
  		[interpreterProxy signalNoResume: (interpreterProxy stackValue: 2)] whileFalse].
  	vmCallbackReturnValue := self cCoerceSimple: (self startOfData: (interpreterProxy stackValue: mac))
  									to: #'VMCallbackReturnValue *'..
  	self cCode: "C needs a typedef for structs to be assigned, but that implies a struct class for just one assignment."
  		[self mem: (self addressOf: vmCallbackContext rvs)
  			cp: (self addressOf: vmCallbackReturnValue crvrvs)
  			y: (self sizeof: vmCallbackContext rvs)]
  		inSmalltalk: [vmCallbackContext rvs: vmCallbackReturnValue crvrvs].
  	(interpreterProxy
  		returnAs: (interpreterProxy integerObjectOf: vmCallbackReturnValue type + 1)
  		ThroughCallback: vmCallbackContext
  		Context: (interpreterProxy stackValue: 1)) ifFalse:
  			[^interpreterProxy primitiveFailFor: PrimErrBadArgument].
  	"NOTREACHED"!

Item was changed:
  ----- Method: RiscOSVMMaker class>>forPlatform: (in category 'initialisation') -----
+ forPlatform: ignored
+ 	"override to keep a RiscOSVMMaker in charge instead of a CrossPlatformVMMaker"
+ 	^self new initialize setPlatName: self name!
- forPlatform: ignired
- 	"over-ride to keep a RiscOSVMMaker in charge instead of a CrossPlatormVMMaker"
- 		^self new initialize setPlatName: self name!



More information about the Vm-dev mailing list