[Vm-dev] VM Maker: VMMaker.oscog-eem.1561.mcz
commits at source.squeak.org
commits at source.squeak.org
Mon Dec 7 00:14:52 UTC 2015
Eliot Miranda uploaded a new version of VMMaker to project VM Maker:
http://source.squeak.org/VMMaker/VMMaker.oscog-eem.1561.mcz
==================== Summary ====================
Name: VMMaker.oscog-eem.1561
Author: eem
Time: 6 December 2015, 4:13:03.829 pm
UUID: 2ba95ccf-0c2f-4801-ba84-847742ce246b
Ancestors: VMMaker.oscog-rmacnak.1560
x64 Cogit:
Simplify Spur's Object>>at: and fix it for x64 (no byte read zero extend).
Add a simple way to prevent methods from being jitted to allow JIT bugs to be located.
Fix genInnerPrimitiveObjectAt: for 64-bit Spur.
Add x64's stop.
Fix slip in maybeSelectorOfMethod:
=============== Diff against VMMaker.oscog-rmacnak.1560 ===============
Item was changed:
----- Method: CogObjectRepresentationFor32BitSpur>>genInnerPrimitiveAt: (in category 'primitive generators') -----
genInnerPrimitiveAt: retNoffset
"Implement the guts of primitiveAt"
+ | formatReg convertToIntAndReturn
+ jumpNotIndexable jumpImmediate jumpBadIndex
- | formatReg jumpNotIndexable jumpImmediate jumpBadIndex
- jumpBytesDone jumpShortsDone jumpWordsDone jumpFixedFieldsDone
jumpIsBytes jumpIsShorts jumpIsWords jumpWordTooBig jumpIsArray jumpHasFixedFields jumpIsContext
jumpBytesOutOfBounds jumpShortsOutOfBounds jumpWordsOutOfBounds jumpArrayOutOfBounds jumpFixedFieldsOutOfBounds |
<inline: true>
"c.f. StackInterpreter>>stSizeOf: SpurMemoryManager>>lengthOf:format: fixedFieldsOf:format:length:"
<var: #jumpIsBytes type: #'AbstractInstruction *'>
<var: #jumpIsShorts type: #'AbstractInstruction *'>
<var: #jumpBadIndex type: #'AbstractInstruction *'>
<var: #jumpIsContext type: #'AbstractInstruction *'>
<var: #jumpImmediate type: #'AbstractInstruction *'>
- <var: #jumpBytesDone type: #'AbstractInstruction *'>
- <var: #jumpShortsDone type: #'AbstractInstruction *'>
- <var: #jumpWordsDone type: #'AbstractInstruction *'>
<var: #jumpWordTooBig type: #'AbstractInstruction *'>
<var: #jumpNotIndexable type: #'AbstractInstruction *'>
<var: #jumpHasFixedFields type: #'AbstractInstruction *'>
+ <var: #convertToIntAndReturn type: #'AbstractInstruction *'>
- <var: #jumpFixedFieldsDone type: #'AbstractInstruction *'>
<var: #jumpArrayOutOfBounds type: #'AbstractInstruction *'>
<var: #jumpBytesOutOfBounds type: #'AbstractInstruction *'>
<var: #jumpShortsOutOfBounds type: #'AbstractInstruction *'>
<var: #jumpWordsOutOfBounds type: #'AbstractInstruction *'>
<var: #jumpFixedFieldsOutOfBounds type: #'AbstractInstruction *'>
jumpImmediate := self genJumpImmediate: ReceiverResultReg.
cogit MoveR: Arg0Reg R: Arg1Reg.
+ jumpBadIndex := self genJumpNotSmallInteger: Arg0Reg scratch: TempReg.
- jumpBadIndex := self genJumpNotSmallInteger: Arg0Reg.
self genConvertSmallIntegerToIntegerInReg: Arg1Reg.
cogit SubCq: 1 R: Arg1Reg. "1-rel => 0-rel"
"formatReg := self formatOf: ReceiverResultReg"
self genGetFormatOf: ReceiverResultReg
into: (formatReg := SendNumArgsReg)
leastSignificantHalfOfBaseHeaderIntoScratch: TempReg.
self genGetNumSlotsOf: ReceiverResultReg into: ClassReg.
"dispatch on format in a combination of highest dynamic frequency order first and convenience.
0 = 0 sized objects (UndefinedObject True False et al)
1 = non-indexable objects with inst vars (Point et al)
2 = indexable objects with no inst vars (Array et al)
3 = indexable objects with inst vars (MethodContext AdditionalMethodState et al)
4 = weak indexable objects with inst vars (WeakArray et al)
5 = weak non-indexable objects with inst vars (ephemerons) (Ephemeron)
6 unused, reserved for exotic pointer objects?
7 Forwarded Object, 1st field is pointer, rest of fields are ignored
8 unused, reserved for exotic non-pointer objects?
9 (?) 64-bit indexable
10 - 11 32-bit indexable
12 - 15 16-bit indexable
16 - 23 byte indexable
24 - 31 compiled method"
cogit CmpCq: objectMemory firstByteFormat R: formatReg.
jumpIsBytes := cogit JumpAboveOrEqual: 0.
cogit CmpCq: objectMemory arrayFormat R: formatReg.
jumpIsArray := cogit JumpZero: 0.
jumpNotIndexable := cogit JumpBelow: 0.
cogit CmpCq: objectMemory weakArrayFormat R: formatReg.
jumpHasFixedFields := cogit JumpBelowOrEqual: 0.
cogit CmpCq: objectMemory firstShortFormat R: formatReg.
jumpIsShorts := cogit JumpAboveOrEqual: 0.
cogit CmpCq: objectMemory firstLongFormat R: formatReg.
jumpIsWords := cogit JumpAboveOrEqual: 0.
"For now ignore 64-bit indexability."
jumpNotIndexable jmpTarget: cogit Label.
jumpNotIndexable := cogit Jump: 0.
jumpIsBytes jmpTarget:
(cogit LogicalShiftLeftCq: objectMemory shiftForWord R: ClassReg).
cogit AndCq: objectMemory wordSize - 1 R: formatReg.
cogit SubR: formatReg R: ClassReg;
CmpR: Arg1Reg R: ClassReg.
jumpBytesOutOfBounds := cogit JumpBelowOrEqual: 0.
cogit AddCq: objectMemory baseHeaderSize R: Arg1Reg.
+ cogit backEnd byteReadsZeroExtend
+ ifTrue:
+ [cogit MoveXbr: Arg1Reg R: ReceiverResultReg R: ReceiverResultReg]
+ ifFalse:
+ [cogit "formatReg already contains a value <= 16r1f, so no need to zero it"
+ MoveXbr: Arg1Reg R: ReceiverResultReg R: formatReg;
+ MoveR: formatReg R: ReceiverResultReg].
+ convertToIntAndReturn := cogit Label.
- cogit MoveXbr: Arg1Reg R: ReceiverResultReg R: ReceiverResultReg.
self genConvertIntegerToSmallIntegerInReg: ReceiverResultReg.
+ cogit RetN: retNoffset.
- jumpBytesDone := cogit Jump: 0.
jumpIsShorts jmpTarget:
(cogit LogicalShiftLeftCq: objectMemory shiftForWord - 1 R: ClassReg).
cogit AndCq: 1 R: formatReg.
cogit SubR: formatReg R: ClassReg;
CmpR: Arg1Reg R: ClassReg.
jumpShortsOutOfBounds := cogit JumpBelowOrEqual: 0.
cogit AddR: Arg1Reg R: ReceiverResultReg.
cogit MoveM16: objectMemory baseHeaderSize r: ReceiverResultReg R: ReceiverResultReg.
+ cogit Jump: convertToIntAndReturn.
- self genConvertIntegerToSmallIntegerInReg: ReceiverResultReg.
- jumpShortsDone := cogit Jump: 0.
jumpIsWords jmpTarget:
(cogit CmpR: Arg1Reg R: ClassReg).
jumpWordsOutOfBounds := cogit JumpBelowOrEqual: 0.
cogit AddCq: objectMemory baseHeaderSize >> objectMemory shiftForWord R: Arg1Reg.
cogit MoveXwr: Arg1Reg R: ReceiverResultReg R: TempReg.
cogit SubCq: objectMemory baseHeaderSize >> objectMemory shiftForWord R: Arg1Reg.
jumpWordTooBig := self jumpNotSmallIntegerUnsignedValueInRegister: TempReg.
cogit MoveR: TempReg R: ReceiverResultReg.
+ cogit Jump: convertToIntAndReturn.
- self genConvertIntegerToSmallIntegerInReg: ReceiverResultReg.
- jumpWordsDone := cogit Jump: 0.
jumpHasFixedFields jmpTarget:
(cogit AndCq: objectMemory classIndexMask R: TempReg).
cogit MoveR: TempReg R: formatReg.
cogit CmpCq: ClassMethodContextCompactIndex R: TempReg.
jumpIsContext := cogit JumpZero: 0.
cogit PushR: ClassReg.
self genGetClassObjectOfClassIndex: formatReg into: ClassReg scratchReg: TempReg.
self genLoadSlot: InstanceSpecificationIndex sourceReg: ClassReg destReg: formatReg.
cogit PopR: ClassReg.
self genConvertSmallIntegerToIntegerInReg: formatReg.
cogit
AndCq: objectMemory fixedFieldsOfClassFormatMask R: formatReg;
SubR: formatReg R: ClassReg;
CmpR: Arg1Reg R: ClassReg.
jumpFixedFieldsOutOfBounds := cogit JumpBelowOrEqual: 0.
"index is (formatReg (fixed fields) + Arg1Reg (0-rel index)) * wordSize + baseHeaderSize"
cogit AddR: formatReg R: Arg1Reg.
cogit AddCq: objectMemory baseHeaderSize >> objectMemory shiftForWord R: Arg1Reg.
cogit MoveXwr: Arg1Reg R: ReceiverResultReg R: ReceiverResultReg.
+ cogit RetN: retNoffset.
- jumpFixedFieldsDone := cogit Jump: 0.
jumpIsArray jmpTarget:
(cogit CmpR: Arg1Reg R: ClassReg).
jumpArrayOutOfBounds := cogit JumpBelowOrEqual: 0.
cogit AddCq: objectMemory baseHeaderSize >> objectMemory shiftForWord R: Arg1Reg.
cogit MoveXwr: Arg1Reg R: ReceiverResultReg R: ReceiverResultReg.
+ cogit RetN: retNoffset.
- jumpFixedFieldsDone jmpTarget:
- (jumpWordsDone jmpTarget:
- (jumpShortsDone jmpTarget:
- (jumpBytesDone jmpTarget:
- (cogit RetN: retNoffset)))).
-
jumpFixedFieldsOutOfBounds jmpTarget:
(jumpArrayOutOfBounds jmpTarget:
(jumpBytesOutOfBounds jmpTarget:
(jumpShortsOutOfBounds jmpTarget:
(jumpWordsOutOfBounds jmpTarget:
(jumpWordTooBig jmpTarget:
(jumpNotIndexable jmpTarget:
(jumpIsContext jmpTarget:
(jumpBadIndex jmpTarget:
(jumpImmediate jmpTarget: cogit Label))))))))).
^0!
Item was changed:
----- Method: CogObjectRepresentationFor64BitSpur>>genInnerPrimitiveAt: (in category 'primitive generators') -----
genInnerPrimitiveAt: retNoffset
"Implement the guts of primitiveAt"
+ | formatReg convertToIntAndReturn
+ jumpNotIndexable jumpImmediate jumpBadIndex
- | formatReg jumpNotIndexable jumpImmediate jumpBadIndex
- jumpBytesDone jumpShortsDone jumpWordsDone jumpFixedFieldsDone
jumpIsBytes jumpIsShorts jumpIsWords jumpIsArray jumpHasFixedFields jumpIsContext
jumpBytesOutOfBounds jumpShortsOutOfBounds jumpWordsOutOfBounds jumpArrayOutOfBounds jumpFixedFieldsOutOfBounds |
<inline: true>
"c.f. StackInterpreter>>stSizeOf: SpurMemoryManager>>lengthOf:format: fixedFieldsOf:format:length:"
<var: #jumpIsBytes type: #'AbstractInstruction *'>
<var: #jumpIsShorts type: #'AbstractInstruction *'>
<var: #jumpBadIndex type: #'AbstractInstruction *'>
<var: #jumpIsContext type: #'AbstractInstruction *'>
<var: #jumpImmediate type: #'AbstractInstruction *'>
- <var: #jumpBytesDone type: #'AbstractInstruction *'>
- <var: #jumpShortsDone type: #'AbstractInstruction *'>
- <var: #jumpWordsDone type: #'AbstractInstruction *'>
<var: #jumpNotIndexable type: #'AbstractInstruction *'>
<var: #jumpHasFixedFields type: #'AbstractInstruction *'>
+ <var: #convertToIntAndReturn type: #'AbstractInstruction *'>
- <var: #jumpFixedFieldsDone type: #'AbstractInstruction *'>
<var: #jumpArrayOutOfBounds type: #'AbstractInstruction *'>
<var: #jumpBytesOutOfBounds type: #'AbstractInstruction *'>
<var: #jumpShortsOutOfBounds type: #'AbstractInstruction *'>
<var: #jumpWordsOutOfBounds type: #'AbstractInstruction *'>
<var: #jumpFixedFieldsOutOfBounds type: #'AbstractInstruction *'>
jumpImmediate := self genJumpImmediate: ReceiverResultReg.
cogit MoveR: Arg0Reg R: Arg1Reg.
jumpBadIndex := self genJumpNotSmallInteger: Arg0Reg scratch: TempReg.
self genConvertSmallIntegerToIntegerInReg: Arg1Reg.
cogit SubCq: 1 R: Arg1Reg. "1-rel => 0-rel"
"formatReg := self formatOf: ReceiverResultReg"
self genGetFormatOf: ReceiverResultReg
into: (formatReg := SendNumArgsReg)
leastSignificantHalfOfBaseHeaderIntoScratch: TempReg.
self genGetNumSlotsOf: ReceiverResultReg into: ClassReg.
"dispatch on format in a combination of highest dynamic frequency order first and convenience.
0 = 0 sized objects (UndefinedObject True False et al)
1 = non-indexable objects with inst vars (Point et al)
2 = indexable objects with no inst vars (Array et al)
3 = indexable objects with inst vars (MethodContext AdditionalMethodState et al)
4 = weak indexable objects with inst vars (WeakArray et al)
5 = weak non-indexable objects with inst vars (ephemerons) (Ephemeron)
6 unused, reserved for exotic pointer objects?
7 Forwarded Object, 1st field is pointer, rest of fields are ignored
8 unused, reserved for exotic non-pointer objects?
9 (?) 64-bit indexable
10 - 11 32-bit indexable
12 - 15 16-bit indexable
16 - 23 byte indexable
24 - 31 compiled method"
cogit CmpCq: objectMemory firstByteFormat R: formatReg.
jumpIsBytes := cogit JumpAboveOrEqual: 0.
cogit CmpCq: objectMemory arrayFormat R: formatReg.
jumpIsArray := cogit JumpZero: 0.
jumpNotIndexable := cogit JumpBelow: 0.
cogit CmpCq: objectMemory weakArrayFormat R: formatReg.
jumpHasFixedFields := cogit JumpBelowOrEqual: 0.
cogit CmpCq: objectMemory firstShortFormat R: formatReg.
jumpIsShorts := cogit JumpAboveOrEqual: 0.
cogit CmpCq: objectMemory firstLongFormat R: formatReg.
jumpIsWords := cogit JumpAboveOrEqual: 0.
"For now ignore 64-bit indexability."
jumpNotIndexable jmpTarget: cogit Label.
jumpNotIndexable := cogit Jump: 0.
jumpIsBytes jmpTarget:
(cogit LogicalShiftLeftCq: objectMemory shiftForWord R: ClassReg).
cogit AndCq: objectMemory wordSize - 1 R: formatReg.
cogit SubR: formatReg R: ClassReg;
CmpR: Arg1Reg R: ClassReg.
jumpBytesOutOfBounds := cogit JumpBelowOrEqual: 0.
cogit AddCq: objectMemory baseHeaderSize R: Arg1Reg.
+ cogit backEnd byteReadsZeroExtend
+ ifTrue:
+ [cogit MoveXbr: Arg1Reg R: ReceiverResultReg R: ReceiverResultReg]
+ ifFalse:
+ [cogit "formatReg already contains a value <= 16r1f, so no need to zero it"
+ MoveXbr: Arg1Reg R: ReceiverResultReg R: formatReg;
+ MoveR: formatReg R: ReceiverResultReg].
+ convertToIntAndReturn := cogit Label.
- cogit MoveXbr: Arg1Reg R: ReceiverResultReg R: ReceiverResultReg.
self genConvertIntegerToSmallIntegerInReg: ReceiverResultReg.
+ cogit RetN: retNoffset.
- jumpBytesDone := cogit Jump: 0.
jumpIsShorts jmpTarget:
(cogit LogicalShiftLeftCq: objectMemory shiftForWord - 1 R: ClassReg).
cogit AndCq: 1 R: formatReg.
cogit SubR: formatReg R: ClassReg;
CmpR: Arg1Reg R: ClassReg.
jumpShortsOutOfBounds := cogit JumpBelowOrEqual: 0.
cogit AddR: Arg1Reg R: ReceiverResultReg.
cogit MoveM16: objectMemory baseHeaderSize r: ReceiverResultReg R: ReceiverResultReg.
+ cogit Jump: convertToIntAndReturn.
- self genConvertIntegerToSmallIntegerInReg: ReceiverResultReg.
- jumpShortsDone := cogit Jump: 0.
jumpIsWords jmpTarget:
(cogit CmpR: Arg1Reg R: ClassReg).
jumpWordsOutOfBounds := cogit JumpBelowOrEqual: 0.
cogit AddCq: objectMemory baseHeaderSize >> (objectMemory shiftForWord - 1) R: Arg1Reg.
cogit MoveX32r: Arg1Reg R: ReceiverResultReg R: TempReg.
cogit MoveR: TempReg R: ReceiverResultReg.
+ cogit Jump: convertToIntAndReturn.
- self genConvertIntegerToSmallIntegerInReg: ReceiverResultReg.
- jumpWordsDone := cogit Jump: 0.
jumpHasFixedFields jmpTarget:
(cogit AndCq: objectMemory classIndexMask R: TempReg).
cogit MoveR: TempReg R: formatReg.
cogit CmpCq: ClassMethodContextCompactIndex R: TempReg.
jumpIsContext := cogit JumpZero: 0.
self genGetClassObjectOfClassIndex: formatReg into: Scratch0Reg scratchReg: TempReg.
self genLoadSlot: InstanceSpecificationIndex sourceReg: Scratch0Reg destReg: formatReg.
self genConvertSmallIntegerToIntegerInReg: formatReg.
cogit
AndCq: objectMemory fixedFieldsOfClassFormatMask R: formatReg;
SubR: formatReg R: ClassReg;
CmpR: Arg1Reg R: ClassReg.
jumpFixedFieldsOutOfBounds := cogit JumpBelowOrEqual: 0.
"index is (formatReg (fixed fields) + Arg1Reg (0-rel index)) * wordSize + baseHeaderSize"
cogit AddR: formatReg R: Arg1Reg.
cogit AddCq: objectMemory baseHeaderSize >> objectMemory shiftForWord R: Arg1Reg.
cogit MoveXwr: Arg1Reg R: ReceiverResultReg R: ReceiverResultReg.
+ cogit RetN: retNoffset.
- jumpFixedFieldsDone := cogit Jump: 0.
jumpIsArray jmpTarget:
(cogit CmpR: Arg1Reg R: ClassReg).
jumpArrayOutOfBounds := cogit JumpBelowOrEqual: 0.
cogit AddCq: objectMemory baseHeaderSize >> objectMemory shiftForWord R: Arg1Reg.
cogit MoveXwr: Arg1Reg R: ReceiverResultReg R: ReceiverResultReg.
+ cogit RetN: retNoffset.
- jumpFixedFieldsDone jmpTarget:
- (jumpWordsDone jmpTarget:
- (jumpShortsDone jmpTarget:
- (jumpBytesDone jmpTarget:
- (cogit RetN: retNoffset)))).
-
jumpFixedFieldsOutOfBounds jmpTarget:
(jumpArrayOutOfBounds jmpTarget:
(jumpBytesOutOfBounds jmpTarget:
(jumpShortsOutOfBounds jmpTarget:
(jumpWordsOutOfBounds jmpTarget:
(jumpNotIndexable jmpTarget:
(jumpIsContext jmpTarget:
(jumpBadIndex jmpTarget:
(jumpImmediate jmpTarget: cogit Label)))))))).
^0!
Item was changed:
----- Method: CogObjectRepresentationForSpur>>genInnerPrimitiveObjectAt: (in category 'primitive generators') -----
genInnerPrimitiveObjectAt: retNOffset
| headerReg
jumpBadIndex jumpNotCogMethod jumpBounds jumpNotHeaderIndex |
<var: #jumpBounds type: #'AbstractInstruction *'>
<var: #jumpBadIndex type: #'AbstractInstruction *'>
<var: #jumpNotCogMethod type: #'AbstractInstruction *'>
<var: #jumpNotHeaderIndex type: #'AbstractInstruction *'>
+ jumpBadIndex := self genJumpNotSmallInteger: Arg0Reg scratch: TempReg.
- jumpBadIndex := self genJumpNotSmallInteger: Arg0Reg.
"get header into Arg1Reg..."
cogit MoveMw: objectMemory baseHeaderSize r: ReceiverResultReg R: (headerReg := Arg1Reg).
+ jumpNotCogMethod := self genJumpSmallInteger: headerReg scratch: TempReg.
- jumpNotCogMethod := self genJumpSmallInteger: headerReg.
cogit MoveMw: (cogit offset: CogMethod of: #methodHeader) r: headerReg R: headerReg.
jumpNotCogMethod jmpTarget: (cogit
CmpCq: (objectMemory integerObjectOf: 1) R: Arg0Reg).
jumpNotHeaderIndex := cogit JumpNonZero: 0.
cogit
MoveR: headerReg R: ReceiverResultReg;
RetN: retNOffset.
jumpNotHeaderIndex jmpTarget: (cogit
AndCq: (objectMemory integerObjectOf: coInterpreter alternateHeaderNumLiteralsMask) R: headerReg).
cogit
SubCq: (objectMemory integerObjectOf: 1) - objectMemory smallIntegerTag R: Arg0Reg;
CmpR: headerReg R: Arg0Reg.
jumpBounds := cogit JumpAbove: 0.
self genConvertSmallIntegerToIntegerInReg: Arg0Reg.
cogit
AddCq: objectMemory baseHeaderSize >> objectMemory shiftForWord R: Arg0Reg;
MoveXwr: Arg0Reg R: ReceiverResultReg R: ReceiverResultReg;
RetN: retNOffset.
jumpBounds jmpTarget: (cogit
AddCq: (objectMemory integerObjectOf: 1) - objectMemory smallIntegerTag R: Arg0Reg).
jumpBadIndex jmpTarget: cogit Label.
^CompletePrimitive!
Item was changed:
----- Method: CogVMSimulator>>primitiveObjectAt (in category 'object access primitives') -----
primitiveObjectAt
+ "self transcript
+ nextPutAll: (self nameOfClass: (self methodClassOf: (self stackValue: 1)));
+ nextPutAll: '>>#';
+ nextPutAll: (self stringOf: (self maybeSelectorOfMethod: (self stackValue: 1)));
+ nextPutAll: ' objectAt: '; print: (objectMemory integerValueOf: self stackTop); cr; flush.
+ self halt."
- (self stackValue: 1) = 16r1148000 ifTrue: [self halt].
^super primitiveObjectAt!
Item was added:
+ ----- Method: CogX64Compiler>>stop (in category 'encoding') -----
+ stop
+ "int3"
+ <inline: true>
+ ^16rCC!
Item was changed:
----- Method: Cogit>>cog:selector: (in category 'jit - api') -----
cog: aMethodObj selector: aSelectorOop
"Attempt to produce a machine code method for the bytecode method
object aMethodObj. N.B. If there is no code memory available do *NOT*
attempt to reclaim the method zone. Certain clients (e.g. ceSICMiss:)
depend on the zone remaining constant across method generation."
<api>
<returnTypeC: #'CogMethod *'>
| cogMethod |
<var: #cogMethod type: #'CogMethod *'>
+ self cCode: [] inSmalltalk: "for debugging, allow excluding mehtods based on selector or methodClass"
+ [self class initializationOptions
+ at: #DoNotJIT
+ ifPresent:
+ [:excluded| | methodClass selector |
+ methodClass := coInterpreter nameOfClass: (coInterpreter methodClassOf: aMethodObj).
+ selector := coInterpreter stringOf: aSelectorOop.
+ (excluded anySatisfy: [:exclude| selector = exclude or: [methodClass = exclude]]) ifTrue:
+ [coInterpreter transcript nextPutAll: 'EXCLUDING '; nextPutAll: methodClass; nextPutAll: '>>#'; nextPutAll: selector; cr; flush.
+ ^nil]]].
+ "In Newspeak we support anonymous accessors and hence tolerate the same
- "In Newspeak we support annonymous accessors and hence tolerate the same
method being cogged multiple times. But only if the method class association is nil."
NewspeakVM
ifTrue:
[(coInterpreter methodHasCogMethod: aMethodObj) ifTrue:
[cogMethod := coInterpreter cogMethodOf: aMethodObj.
self deny: cogMethod selector = aSelectorOop.
cogMethod selector = aSelectorOop ifTrue:
[^cogMethod].
(coInterpreter methodClassAssociationOf: aMethodObj) ~= objectMemory nilObject ifTrue:
[self warnMultiple: cogMethod selectors: aSelectorOop.
^nil]]]
ifFalse: [self deny: (coInterpreter methodHasCogMethod: aMethodObj)].
"coInterpreter stringOf: aSelectorOop"
coInterpreter
compilationBreak: aSelectorOop
point: (objectMemory lengthOf: aSelectorOop)
isMNUCase: false.
aMethodObj = breakMethod ifTrue: [self halt: 'Compilation of breakMethod'].
NewspeakVM ifTrue:
[cogMethod := methodZone findPreviouslyCompiledVersionOf: aMethodObj with: aSelectorOop.
cogMethod ifNotNil:
[(coInterpreter methodHasCogMethod: aMethodObj) not ifTrue:
[self assert: (coInterpreter rawHeaderOf: aMethodObj) = cogMethod methodHeader.
cogMethod methodObject: aMethodObj.
coInterpreter rawHeaderOf: aMethodObj put: cogMethod asInteger].
^cogMethod]].
"If the generators for the alternate bytecode set are missing then interpret."
(coInterpreter methodUsesAlternateBytecodeSet: aMethodObj)
ifTrue:
[(self numElementsIn: generatorTable) <= 256 ifTrue:
[^nil].
bytecodeSetOffset := 256]
ifFalse:
[bytecodeSetOffset := 0].
objectRepresentation ensureNoForwardedLiteralsIn: aMethodObj.
methodObj := aMethodObj.
methodHeader := objectMemory methodHeaderOf: aMethodObj.
cogMethod := self compileCogMethod: aSelectorOop.
(cogMethod asInteger between: MaxNegativeErrorCode and: -1) ifTrue:
[cogMethod asInteger = InsufficientCodeSpace ifTrue:
[coInterpreter callForCogCompiledCodeCompaction].
self maybeFreeCounters.
"Right now no errors should be reported, so nothing more to do."
"self reportError: (self cCoerceSimple: cogMethod to: #sqInt)."
^nil].
"self cCode: ''
inSmalltalk:
[coInterpreter printCogMethod: cogMethod.
""coInterpreter symbolicMethod: aMethodObj.""
self assertValidMethodMap: cogMethod."
"self disassembleMethod: cogMethod."
"printInstructions := clickConfirm := true""]."
^cogMethod!
Item was changed:
----- Method: StackInterpreter>>maybeSelectorOfMethod: (in category 'debug support') -----
maybeSelectorOfMethod: methodObj
"Answer the selector of a method, assuming its penultimate literal is either
a symbol or a pointer object whose first slot references the method and
whose second slot is a symbol (i.e. an AdditionalMethodState). If a Symbol
can't be found answer nil. This isn't satisfactory, as it puts a lot of information
into the VM, but it is needed for adequate crash debugging at Cadence."
| penultimateLiteral maybeSelector |
self assert: (objectMemory isOopCompiledMethod: methodObj).
penultimateLiteral := self penultimateLiteralOf: methodObj.
(objectMemory isWordsOrBytes: penultimateLiteral) ifTrue:
[^(objectMemory fetchClassTagOfNonImm: penultimateLiteral)
= (objectMemory fetchClassTagOfNonImm: (objectMemory splObj: SelectorDoesNotUnderstand)) ifTrue:
[penultimateLiteral]].
^((objectMemory isPointers: penultimateLiteral)
and: [(objectMemory numSlotsOf: penultimateLiteral) >= 2
and: [(objectMemory fetchPointer: 0 ofObject: penultimateLiteral) = methodObj
and: [maybeSelector := objectMemory fetchPointer: 1 ofObject: penultimateLiteral.
(objectMemory isWordsOrBytes: maybeSelector)
and: [(objectMemory fetchClassTagOfNonImm: maybeSelector)
= (objectMemory fetchClassTagOfNonImm: (objectMemory splObj: SelectorDoesNotUnderstand))]]]]) ifTrue:
+ [maybeSelector]!
- [penultimateLiteral]!
More information about the Vm-dev
mailing list