[Vm-dev] VM Maker: Cog-eem.406.mcz
commits at source.squeak.org
commits at source.squeak.org
Sun Sep 6 21:21:18 UTC 2020
Eliot Miranda uploaded a new version of Cog to project VM Maker:
http://source.squeak.org/VMMaker/Cog-eem.406.mcz
==================== Summary ====================
Name: Cog-eem.406
Author: eem
Time: 6 September 2020, 2:21:17.20077 pm
UUID: 907886af-dbe6-4d02-afb2-07c0b1e1754b
Ancestors: Cog-eem.405
Modernize the CogProcessorAlien disassembly and error and log primitives.
=============== Diff against Cog-eem.405 ===============
Item was changed:
----- Method: ProcessorSimulatorPlugin>>primitiveDisassembleAt:InMemory: (in category 'primitives') -----
+ "cpuAlien <CogProcessorAlien>" primitiveDisassembleAt: address "<Integer>" InMemory: memory "<Bitmap|ByteArray|WordArray|DoubleWordArray>"
- "cpuAlien <BochsIA32|X86Alien>" primitiveDisassembleAt: address "<Integer>" InMemory: memory "<Bitmap|ByteArray|WordArray>"
"Return an Array of the instruction length and its decompilation as a string for the instruction at address in memory."
+ | cpuAlien cpu instrLenOrErr resultObj log logLen logObj |
- | cpuAlien cpu instrLenOrErr resultObj log logLen logObj logObjData |
<var: #cpu type: #'void *'>
<var: #log type: #'char *'>
<var: #logLen type: #long>
- <var: #logObjData type: #'char *'>
cpuAlien := self primitive: #primitiveDisassembleAtInMemory
parameters: #(SmallInteger WordsOrBytes)
receiver: #Oop.
(cpu := self cCoerceSimple: (self startOfData: cpuAlien) to: #'void *') = 0 ifTrue:
[^interpreterProxy primitiveFailFor: PrimErrBadReceiver].
instrLenOrErr := self disassembleFor: cpu
At: address
In: memory
Size: (interpreterProxy byteSizeOf: memory cPtrAsOop).
instrLenOrErr < 0 ifTrue:
[^interpreterProxy primitiveFailForOSError: instrLenOrErr negated].
+ log := self getlog: (self addressOf: logLen put: [:v| logLen := v]).
- log := self getlog: (self cCode: [self addressOf: logLen] inSmalltalk: [logLen := 0]).
resultObj := interpreterProxy instantiateClass: interpreterProxy classArray indexableSize: 2.
+ resultObj ifNil:
- resultObj = 0 ifTrue:
[^interpreterProxy primitiveFailFor: PrimErrNoMemory].
"Easier keeping the damn thing on the stack than using pushRemappableOop:/popRemappableOop.
Where is topRemappableOop when you need it?"
interpreterProxy pushRemappableOop: resultObj.
logObj := interpreterProxy
instantiateClass: interpreterProxy classString
indexableSize: logLen.
- interpreterProxy failed ifTrue:
- [interpreterProxy popRemappableOop.
- ^interpreterProxy primitiveFailFor: PrimErrNoMemory].
- logObjData := interpreterProxy arrayValueOf: logObj.
- self mem: logObjData cp: log y: logLen.
resultObj := interpreterProxy popRemappableOop.
+ logObj ifNil:
+ [^interpreterProxy primitiveFailFor: PrimErrNoMemory].
+ self mem: (interpreterProxy firstIndexableField: logObj) cp: log y: logLen.
interpreterProxy
+ storeInteger: 0 ofObject: resultObj withValue: instrLenOrErr;
+ storePointer: 1 ofObject: resultObj withValue: logObj.
- storePointer: 0
- ofObject: resultObj
- withValue: (interpreterProxy integerObjectOf: instrLenOrErr).
- interpreterProxy storePointer: 1 ofObject: resultObj withValue: logObj.
^resultObj!
Item was changed:
----- Method: ProcessorSimulatorPlugin>>primitiveErrorAndLog (in category 'primitives') -----
primitiveErrorAndLog
+ | log logLen resultObj logObj |
- | log logLen resultObj logObj logObjData |
<var: #log type: #'char *'>
<var: #logLen type: #long>
- <var: #logObjData type: #'char *'>
self primitive: #primitiveErrorAndLog parameters: #().
+ log := self getlog: (self addressOf: logLen put: [:v| logLen := v]).
- log := self getlog: (self cCode: [self addressOf: logLen] inSmalltalk: [logLen := 0]).
resultObj := interpreterProxy instantiateClass: interpreterProxy classArray indexableSize: 2.
+ resultObj ifNil:
- resultObj = 0 ifTrue:
[^interpreterProxy primitiveFailFor: PrimErrNoMemory].
+ interpreterProxy storeInteger: 0 ofObject: resultObj withValue: self errorAcorn.
- interpreterProxy
- storePointer: 0
- ofObject: resultObj
- withValue: (interpreterProxy integerObjectOf: self errorAcorn).
logLen > 0 ifTrue:
[interpreterProxy pushRemappableOop: resultObj.
logObj := interpreterProxy
instantiateClass: interpreterProxy classString
indexableSize: logLen.
- interpreterProxy failed ifTrue:
- [interpreterProxy popRemappableOop.
- ^interpreterProxy primitiveFailFor: PrimErrNoMemory].
-
resultObj := interpreterProxy popRemappableOop.
+ logObj ifNil:
+ [^interpreterProxy primitiveFailFor: PrimErrNoMemory].
+ self mem: (interpreterProxy firstIndexableField: logObj) cp: log y: logLen.
- logObjData := interpreterProxy arrayValueOf: logObj.
- self mem: logObjData cp: log y: logLen.
interpreterProxy storePointer: 1 ofObject: resultObj withValue: logObj].
+ interpreterProxy methodReturnValue: resultObj!
- interpreterProxy pop: 1 thenPush: resultObj!
More information about the Vm-dev
mailing list