[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