Ryan Macnak uploaded a new version of VMMaker to project VM Maker: http://source.squeak.org/VMMaker/VMMaker.oscog-rmacnak.1495.mcz
==================== Summary ====================
Name: VMMaker.oscog-rmacnak.1495 Author: rmacnak Time: 19 October 2015, 9:15:56.71 pm UUID: 1bac6ffc-4f19-447a-9236-c8b9be3b7936 Ancestors: VMMaker.oscog-rmacnak.1494
Sync NewsqueakIA32ABIPlugin with IA32ABIPlugin.
=============== Diff against VMMaker.oscog-rmacnak.1494 ===============
Item was changed: ----- Method: NewsqueakIA32ABIPlugin>>primAllocateExecutablePage (in category 'primitives-memory management') ----- primAllocateExecutablePage "Answer an Alien for an executable page; for thunks" "primAllocateExecutablePage ^<Alien> <primitive: 'primAllocateExecutablePage' error: errorCode module: 'IA32ABI'>" | byteSize ptr mem alien | <export: true> <var: #byteSize type: 'long'> <var: #ptr type: 'long *'> <var: #mem type: 'void *'>
self cCode: 'mem = allocateExecutablePage(&byteSize)' inSmalltalk: [self error: 'not yet implemented'. mem := 0. byteSize := 0]. mem = 0 ifTrue: [^interpreterProxy primitiveFailFor: PrimErrNoCMemory]. alien := interpreterProxy instantiateClass: interpreterProxy classAlien + indexableSize: 2 * interpreterProxy bytesPerOop. - indexableSize: 8. interpreterProxy failed ifTrue: [^interpreterProxy primitiveFailFor: PrimErrNoMemory]. ptr := interpreterProxy firstIndexableField: alien. ptr at: 0 put: 0 - byteSize. "indirect mem indicated by negative size. Slang doesn't grok negated" ptr at: 1 put: (self cCoerce: mem to: 'long'). interpreterProxy methodReturnValue: alien!
Item was changed: ----- Method: NewsqueakIA32ABIPlugin>>primSignedLongAt (in category 'primitives-accessing') ----- primSignedLongAt "Answer the signed 32-bit integer starting at the given byte offset (little endian)." "<Alien> signedLongAt: index <Integer> ^<Integer> <primitive: 'primSignedLongAt' error: errorCode module: 'IA32ABI'>" | byteOffset rcvr startAddr addr value valueOop | <export: true>
byteOffset := (interpreterProxy stackPositiveMachineIntegerValue: 0) - 1. rcvr := interpreterProxy stackObjectValue: 1. interpreterProxy failed ifTrue: [^interpreterProxy primitiveFailFor: PrimErrBadArgument]. (self index: byteOffset length: 4 inRange: rcvr) ifFalse: [^interpreterProxy primitiveFailFor: PrimErrBadIndex]. (startAddr := self startOfData: rcvr) = 0 ifTrue: [^interpreterProxy primitiveFailFor: PrimErrBadReceiver]. addr := startAddr + byteOffset. + value := self long32At: addr. - value := self longAt: addr. valueOop := interpreterProxy signed32BitIntegerFor: value. ^interpreterProxy methodReturnValue: valueOop!
Item was changed: ----- Method: NewsqueakIA32ABIPlugin>>primSignedLongAtPut (in category 'primitives-accessing') ----- primSignedLongAtPut "Store a signed integer into 32 bits starting at the given byte offset (little endian)." "<Alien> signedLongAt: index <Integer> put: value <Integer> ^<Integer> <primitive: 'primSignedLongAtPut' error: errorCode module: 'IA32ABI'>" | byteOffset rcvr startAddr addr value valueOop | <export: true>
valueOop := interpreterProxy stackValue: 0. byteOffset := (interpreterProxy stackPositiveMachineIntegerValue: 1) - 1. rcvr := interpreterProxy stackObjectValue: 2. value := interpreterProxy signed32BitValueOf: valueOop. interpreterProxy failed ifTrue: [^interpreterProxy primitiveFailFor: PrimErrBadArgument]. (self index: byteOffset length: 4 inRange: rcvr) ifFalse: [^interpreterProxy primitiveFailFor: PrimErrBadIndex]. (interpreterProxy isOopImmutable: rcvr) ifTrue: [^interpreterProxy primitiveFailFor: PrimErrNoModification]. (startAddr := self startOfData: rcvr) = 0 ifTrue: [^interpreterProxy primitiveFailFor: PrimErrBadReceiver]. addr := startAddr + byteOffset. + self long32At: addr put: value. - self longAt: addr put: value. ^interpreterProxy methodReturnValue: valueOop!
Item was added: + ----- Method: NewsqueakIA32ABIPlugin>>primSignedWordAt (in category 'primitives-accessing') ----- + primSignedWordAt + "Answer the signed word starting at the given byte offset (little endian)." + "<Alien> signedWordAt: index <Integer> ^<Integer> + <primitive: 'primSignedWordAt' error: errorCode module: 'IA32ABI'>" + | byteOffset rcvr startAddr addr value valueOop | + <export: true> + + byteOffset := (interpreterProxy stackPositiveMachineIntegerValue: 0) - 1. + rcvr := interpreterProxy stackObjectValue: 1. + interpreterProxy failed ifTrue: + [^interpreterProxy primitiveFailFor: PrimErrBadArgument]. + (self index: byteOffset length: interpreterProxy bytesPerOop inRange: rcvr) ifFalse: + [^interpreterProxy primitiveFailFor: PrimErrBadIndex]. + (startAddr := self startOfData: rcvr) = 0 ifTrue: + [^interpreterProxy primitiveFailFor: PrimErrBadReceiver]. + addr := startAddr + byteOffset. + value := self longAt: addr. + valueOop := interpreterProxy signedMachineIntegerValueOf: value. + ^interpreterProxy methodReturnValue: valueOop!
Item was added: + ----- Method: NewsqueakIA32ABIPlugin>>primSignedWordAtPut (in category 'primitives-accessing') ----- + primSignedWordAtPut + "Store a signed integer into the word starting at the given byte offset (little endian)." + "<Alien> signedWordAt: index <Integer> put: value <Integer> ^<Integer> + <primitive: 'primSignedWordAtPut' error: errorCode module: 'IA32ABI'>" + | byteOffset rcvr startAddr addr value valueOop | + <export: true> + + valueOop := interpreterProxy stackValue: 0. + byteOffset := (interpreterProxy stackPositiveMachineIntegerValue: 1) - 1. + rcvr := interpreterProxy stackObjectValue: 2. + value := interpreterProxy signedMachineIntegerValueOf: valueOop. + interpreterProxy failed ifTrue: + [^interpreterProxy primitiveFailFor: PrimErrBadArgument]. + (self index: byteOffset length: interpreterProxy bytesPerOop inRange: rcvr) ifFalse: + [^interpreterProxy primitiveFailFor: PrimErrBadIndex]. + (interpreterProxy isOopImmutable: rcvr) ifTrue: + [^interpreterProxy primitiveFailFor: PrimErrNoModification]. + (startAddr := self startOfData: rcvr) = 0 ifTrue: + [^interpreterProxy primitiveFailFor: PrimErrBadReceiver]. + addr := startAddr + byteOffset. + self longAt: addr put: value. + ^interpreterProxy methodReturnValue: valueOop!
Item was changed: ----- Method: NewsqueakIA32ABIPlugin>>primStrlenThroughPointerAtIndex (in category 'primitives-accessing') ----- primStrlenThroughPointerAtIndex "Answer the number of non-null bytes starting at the byte addressed by the 4-byte pointer at index." "<Alien> strlenThroughPointerAt: index <Integer> ^<Integer> <primitive: 'primStrlenThroughPointerAtIndex' error: errorCode module: 'IA32ABI'>" | byteOffset rcvr ptr addr | <export: true> <var: #ptr type: #'char *'>
byteOffset := (interpreterProxy stackPositiveMachineIntegerValue: 0) - 1. rcvr := interpreterProxy stackObjectValue: 1. interpreterProxy failed ifTrue: [^interpreterProxy primitiveFailFor: PrimErrBadArgument]. + (self index: byteOffset length: interpreterProxy bytesPerOop inRange: rcvr) ifFalse: - (self index: byteOffset length: 4 inRange: rcvr) ifFalse: [^interpreterProxy primitiveFailFor: PrimErrBadIndex]. addr := (self startOfData: rcvr) + byteOffset. ptr := self cCoerce: (self longAt: addr) to: #'char *'. ^interpreterProxy methodReturnValue: (interpreterProxy positive32BitIntegerFor: (self strlen: ptr))!
Item was changed: ----- Method: NewsqueakIA32ABIPlugin>>primUnsignedLongAt (in category 'primitives-accessing') ----- primUnsignedLongAt "Answer the unsigned 32-bit integer starting at the given byte offset (little endian)." "<Alien> unsignedLongAt: index <Integer> ^<Integer> <primitive: 'primUnsignedLongAt' error: errorCode module: 'IA32ABI'>" | byteOffset rcvr startAddr addr value valueOop | <export: true>
byteOffset := (interpreterProxy stackPositiveMachineIntegerValue: 0) - 1. rcvr := interpreterProxy stackObjectValue: 1. interpreterProxy failed ifTrue: [^interpreterProxy primitiveFailFor: PrimErrBadArgument]. (self index: byteOffset length: 4 inRange: rcvr) ifFalse: [^interpreterProxy primitiveFailFor: PrimErrBadIndex]. (startAddr := self startOfData: rcvr) = 0 ifTrue: [^interpreterProxy primitiveFailFor: PrimErrBadReceiver]. addr := startAddr + byteOffset. + value := self long32At: addr. - value := self longAt: addr. valueOop := interpreterProxy positive32BitIntegerFor: value. ^interpreterProxy methodReturnValue: valueOop!
Item was changed: ----- Method: NewsqueakIA32ABIPlugin>>primUnsignedLongAtPut (in category 'primitives-accessing') ----- primUnsignedLongAtPut "Store an unsigned integer into 32 bits starting at the given byte offset (little endian)." "<Alien> unsignedLongAt: index <Integer> put: value <Integer> ^<Integer> <primitive: 'primUnsignedLongAtPut' error: errorCode module: 'IA32ABI'>" | byteOffset rcvr startAddr addr value valueOop | <export: true>
valueOop := interpreterProxy stackValue: 0. byteOffset := (interpreterProxy stackPositiveMachineIntegerValue: 1) - 1. rcvr := interpreterProxy stackObjectValue: 2. value := interpreterProxy positive32BitValueOf: valueOop. interpreterProxy failed ifTrue: [^interpreterProxy primitiveFailFor: PrimErrBadArgument]. (self index: byteOffset length: 4 inRange: rcvr) ifFalse: [^interpreterProxy primitiveFailFor: PrimErrBadIndex]. (interpreterProxy isOopImmutable: rcvr) ifTrue: [^interpreterProxy primitiveFailFor: PrimErrNoModification]. (startAddr := self startOfData: rcvr) = 0 ifTrue: [^interpreterProxy primitiveFailFor: PrimErrBadReceiver]. addr := startAddr + byteOffset. + self long32At: addr put: value. - self longAt: addr put: value. ^interpreterProxy methodReturnValue: valueOop!
Item was added: + ----- Method: NewsqueakIA32ABIPlugin>>primUnsignedWordAt (in category 'primitives-accessing') ----- + primUnsignedWordAt + "Answer the unsigned word starting at the given byte offset (little endian)." + "<Alien> unsignedWordAt: index <Integer> ^<Integer> + <primitive: 'primUnsignedWordAt' error: errorCode module: 'IA32ABI'>" + | byteOffset rcvr startAddr addr value valueOop | + <export: true> + + byteOffset := (interpreterProxy stackPositiveMachineIntegerValue: 0) - 1. + rcvr := interpreterProxy stackObjectValue: 1. + interpreterProxy failed ifTrue: + [^interpreterProxy primitiveFailFor: PrimErrBadArgument]. + (self index: byteOffset length: interpreterProxy bytesPerOop inRange: rcvr) ifFalse: + [^interpreterProxy primitiveFailFor: PrimErrBadIndex]. + (startAddr := self startOfData: rcvr) = 0 ifTrue: + [^interpreterProxy primitiveFailFor: PrimErrBadReceiver]. + addr := startAddr + byteOffset. + value := self longAt: addr. + valueOop := interpreterProxy positiveMachineIntegerFor: value. + ^interpreterProxy methodReturnValue: valueOop!
Item was added: + ----- Method: NewsqueakIA32ABIPlugin>>primUnsignedWordAtPut (in category 'primitives-accessing') ----- + primUnsignedWordAtPut + "Store an unsigned integer into 32 bits starting at the given byte offset (little endian)." + "<Alien> unsignedWordAt: index <Integer> put: value <Integer> ^<Integer> + <primitive: 'primUnsignedWordAtPut' error: errorCode module: 'IA32ABI'>" + | byteOffset rcvr startAddr addr value valueOop | + <export: true> + + valueOop := interpreterProxy stackValue: 0. + byteOffset := (interpreterProxy stackPositiveMachineIntegerValue: 1) - 1. + rcvr := interpreterProxy stackObjectValue: 2. + value := interpreterProxy positiveMachineIntegerValueOf: valueOop. + interpreterProxy failed ifTrue: + [^interpreterProxy primitiveFailFor: PrimErrBadArgument]. + (self index: byteOffset length: interpreterProxy bytesPerOop inRange: rcvr) ifFalse: + [^interpreterProxy primitiveFailFor: PrimErrBadIndex]. + (interpreterProxy isOopImmutable: rcvr) ifTrue: + [^interpreterProxy primitiveFailFor: PrimErrNoModification]. + (startAddr := self startOfData: rcvr) = 0 ifTrue: + [^interpreterProxy primitiveFailFor: PrimErrBadReceiver]. + addr := startAddr + byteOffset. + self longAt: addr put: value. + ^interpreterProxy methodReturnValue: valueOop!
vm-dev@lists.squeakfoundation.org