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! |
On 10-04-2013, at 11:03 PM, [hidden email] wrote: > Fix typos in RiscOSVMMaker Oh, dash it! tim -- tim Rowledge; [hidden email]; http://www.rowledge.org/tim If at first you don't succeed, call it version 1.0 |
Free forum by Nabble | Edit this page |