VM Maker: VMMaker.oscog-eem.284.mcz

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
2 messages Options
Reply | Threaded
Open this post in threaded view
|

VM Maker: VMMaker.oscog-eem.284.mcz

commits-2
 
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!

Reply | Threaded
Open this post in threaded view
|

Re: VM Maker: VMMaker.oscog-eem.284.mcz

timrowledge
 

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