Eliot Miranda uploaded a new version of VMMaker to project VM Maker: http://source.squeak.org/VMMaker/VMMaker.oscog-eem.1941.mcz
==================== Summary ====================
Name: VMMaker.oscog-eem.1941 Author: eem Time: 6 September 2016, 10:06:17.574 am UUID: ccc9d9be-c2f0-437a-bdfe-13dfc9c7225c Ancestors: VMMaker.oscog-cb.1940
Improve stack backtrace printing for full blocks.
=============== Diff against VMMaker.oscog-cb.1940 ===============
Item was changed: ----- Method: StackInterpreter>>findSelectorOfMethod: (in category 'debug support') ----- + findSelectorOfMethod: meth + | classObj classDict classDictSize methodArray i | + (objectMemory addressCouldBeObj: meth) ifFalse: - findSelectorOfMethod: methArg - | meth classObj classDict classDictSize methodArray i | - (objectMemory addressCouldBeObj: methArg) ifFalse: [^objectMemory nilObject]. + (objectMemory isForwarded: meth) ifTrue: + [^self findSelectorOfMethod: (objectMemory followForwarded: meth)]. - (objectMemory isForwarded: methArg) - ifTrue: [meth := objectMemory followForwarded: methArg] - ifFalse: [meth := methArg]. (objectMemory isOopCompiledMethod: meth) ifFalse: [^objectMemory nilObject]. + (self maybeSelectorOfMethod: meth) ifNotNil: + [:selector| ^selector]. - NewspeakVM ifTrue: - [(self maybeSelectorOfMethod: meth) ifNotNil: - [:selector| ^selector]]. classObj := self safeMethodClassOf: meth. (self addressCouldBeClassObj: classObj) ifTrue: [classDict := objectMemory fetchPointer: MethodDictionaryIndex ofObject: classObj. classDictSize := objectMemory numSlotsOf: classDict. classDictSize > MethodArrayIndex ifTrue: [methodArray := objectMemory fetchPointer: MethodArrayIndex ofObject: classDict. i := 0. [i < (classDictSize - SelectorStart)] whileTrue: [meth = (objectMemory fetchPointer: i ofObject: methodArray) ifTrue: [^(objectMemory fetchPointer: i + SelectorStart ofObject: classDict)]. i := i + 1]]]. ^objectMemory nilObject!
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. + With full blocks as of 9/2016 the last literal of a CompiledBlock is a back pointer + to the enclosing block or compiled method." + | ultimateLiteral penultimateLiteral maybeSelector | - into the VM, but it is needed for adequate crash debugging at Cadence." - | penultimateLiteral maybeSelector | self assert: (objectMemory isOopCompiledMethod: methodObj). + ultimateLiteral := self ultimateLiteralOf: methodObj. + (objectMemory isOopCompiledMethod: ultimateLiteral) ifTrue: + [^self maybeSelectorOfMethod: ultimateLiteral]. 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]!
Item was added: + ----- Method: StackInterpreter>>ultimateLiteralOf: (in category 'debug printing') ----- + ultimateLiteralOf: aMethodOop + <api> + self assert: (objectMemory isOopCompiledMethod: aMethodOop). + ^self literal: (objectMemory literalCountOf: aMethodOop) - 1 ofMethod: aMethodOop!
vm-dev@lists.squeakfoundation.org