[Vm-dev] VM Maker: VMMaker.oscog-rmacnak.1495.mcz
commits at source.squeak.org
commits at source.squeak.org
Tue Oct 20 04:17:09 UTC 2015
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!
More information about the Vm-dev
mailing list