[Vm-dev] VM Maker: VMMaker.oscog-eem.985.mcz
commits at source.squeak.org
commits at source.squeak.org
Mon Dec 15 17:42:46 UTC 2014
Eliot Miranda uploaded a new version of VMMaker to project VM Maker:
http://source.squeak.org/VMMaker/VMMaker.oscog-eem.985.mcz
==================== Summary ====================
Name: VMMaker.oscog-eem.985
Author: eem
Time: 15 December 2014, 9:40:05.395 am
UUID: f455e095-e61a-46a0-8994-c4bc33bb8a46
Ancestors: VMMaker.oscog-eem.984
Fix slip in unreachableMethods.
Print first field of free chunks in printOop:
if on Spur.
=============== Diff against VMMaker.oscog-eem.984 ===============
Item was changed:
----- Method: CCodeGenerator>>unreachableMethods (in category 'utilities') -----
unreachableMethods
"Return a collection of methods that are never invoked."
| neededSelectors previousSize visited |
neededSelectors := Set new.
"collect the exports"
methods do:
[:m|
m export ifTrue:
[neededSelectors add: m selector]].
"Now compute the transitive closure..."
previousSize := neededSelectors size.
visited := IdentitySet new: methods size.
[neededSelectors do:
[:s|
(methods at: s ifAbsent: []) ifNotNil:
[:m|
(visited includes: m) ifFalse:
[visited add: m.
+ neededSelectors
+ add: m selector;
+ addAll: m allCalls]]].
- m export ifTrue:
- [neededSelectors
- add: m selector;
- addAll: m allCalls]]]].
neededSelectors size > previousSize]
whileTrue:
[previousSize := neededSelectors size].
^methods reject: [:m| neededSelectors includes: m selector]!
Item was changed:
----- Method: StackInterpreter>>printOop: (in category 'debug printing') -----
printOop: oop
| cls fmt lastIndex startIP bytecodesPerLine column |
<inline: false>
(objectMemory isImmediate: oop) ifTrue:
[^self shortPrintOop: oop].
self printHex: oop.
(objectMemory addressCouldBeObj: oop) ifFalse:
[^self print: ((oop bitAnd: objectMemory allocationUnit - 1) ~= 0
ifTrue: [' is misaligned']
ifFalse: [self whereIs: oop]); cr].
(objectMemory isFreeObject: oop) ifTrue:
+ [self print: ' is a free chunk of size '; printNum: (objectMemory sizeOfFree: oop).
+ objectMemory hasSpurMemoryManagerAPI ifTrue:
+ [self print: ' 0th: '; printHex: (objectMemory fetchPointer: 0 ofFreeChunk: oop)].
+ ^self cr].
- [^self print: ' is a free chunk of size '; printNum: (objectMemory sizeOfFree: oop); cr].
(objectMemory isForwarded: oop) ifTrue:
[^self
print: ' is a forwarded object to '; printHex: (objectMemory followForwarded: oop);
print: ' of slot size '; printNum: (objectMemory numSlotsOfAny: oop); cr].
self print: ': a(n) '.
self printNameOfClass: (cls := objectMemory fetchClassOfNonImm: oop) count: 5.
cls = (objectMemory splObj: ClassFloat) ifTrue:
[^self cr; printFloat: (objectMemory dbgFloatValueOf: oop); cr].
fmt := objectMemory formatOf: oop.
fmt > objectMemory lastPointerFormat ifTrue:
[self print: ' nbytes '; printNum: (objectMemory numBytesOf: oop)].
self cr.
(fmt between: objectMemory firstLongFormat and: objectMemory firstCompiledMethodFormat - 1) ifTrue:
["This will answer false if splObj: ClassAlien is nilObject"
(self is: oop KindOfClass: (objectMemory splObj: ClassAlien)) ifTrue:
[self print: ' datasize '; printNum: (self sizeOfAlienData: oop).
self print: ((self isIndirectAlien: oop)
ifTrue: [' indirect @ ']
ifFalse:
[(self isPointerAlien: oop)
ifTrue: [' pointer @ ']
ifFalse: [' direct @ ']]).
^self printHex: (self startOfAlienData: oop) asUnsignedInteger; cr].
(objectMemory isWords: oop) ifTrue:
[lastIndex := 64 min: ((objectMemory numBytesOf: oop) / objectMemory wordSize).
lastIndex > 0 ifTrue:
[1 to: lastIndex do:
[:index|
self space; printHex: (objectMemory fetchLong32: index - 1 ofObject: oop).
(index \\ self elementsPerPrintOopLine) = 0 ifTrue:
[self cr]].
(lastIndex \\ self elementsPerPrintOopLine) = 0 ifFalse:
[self cr]].
^self].
^self printStringOf: oop; cr].
"this is nonsense. apologies."
startIP := (objectMemory lastPointerOf: oop) + objectMemory bytesPerOop - objectMemory baseHeaderSize / objectMemory bytesPerOop.
lastIndex := 256 min: startIP.
lastIndex > 0 ifTrue:
[1 to: lastIndex do:
[:index|
self cCode: [self printHex: (objectMemory fetchPointer: index - 1 ofObject: oop); space]
inSmalltalk: [self space; printHex: (objectMemory fetchPointer: index - 1 ofObject: oop); space.
self print: (self shortPrint: (objectMemory fetchPointer: index - 1 ofObject: oop))].
(index \\ self elementsPerPrintOopLine) = 0 ifTrue:
[self cr]].
(lastIndex \\ self elementsPerPrintOopLine) = 0 ifFalse:
[self cr]].
(objectMemory isCompiledMethod: oop)
ifFalse:
[startIP > 64 ifTrue: [self print: '...'; cr]]
ifTrue:
[startIP := startIP * objectMemory wordSize + 1.
lastIndex := objectMemory lengthOf: oop.
lastIndex - startIP > 100 ifTrue:
[lastIndex := startIP + 100].
bytecodesPerLine := 8.
column := 1.
startIP to: lastIndex do:
[:index| | byte |
column = 1 ifTrue:
[self cCode: 'printf("0x%08x: ", oop+BaseHeaderSize+index-1)'
inSmalltalk: [self print: (oop+objectMemory baseHeaderSize+index-1) hex; print: ': ']].
byte := objectMemory fetchByte: index - 1 ofObject: oop.
self cCode: 'printf(" %02x/%-3d", byte,byte)'
inSmalltalk: [self space; print: (byte radix: 16); printChar: $/; printNum: byte].
column := column + 1.
column > bytecodesPerLine ifTrue:
[column := 1. self cr]].
column = 1 ifFalse:
[self cr]]!
Item was changed:
----- Method: StackInterpreter>>shortPrint: (in category 'simulation') -----
shortPrint: oop
<doNotGenerate>
| name classOop |
(objectMemory isImmediate: oop) ifTrue:
[(objectMemory isImmediateCharacter: oop) ifTrue:
[^(objectMemory characterValueOf: oop) < 256
ifTrue:
['=$', (objectMemory characterValueOf: oop) printString,
' (', (String with: (Character value: (objectMemory characterValueOf: oop))), ')']
ifFalse:
['=$', (objectMemory characterValueOf: oop) printString, '(???)']].
(objectMemory isIntegerObject: oop) ifTrue:
[^'=', (objectMemory integerValueOf: oop) printString,
' (', (objectMemory integerValueOf: oop) hex, ')'].
(objectMemory isImmediateFloat: oop) ifTrue:
[^ '=', (objectMemory floatValueOf: oop) printString, ' (', oop hex, ')'].
^'= UNKNOWN IMMEDIATE', ' (', (objectMemory integerValueOf: oop) hex, ')'].
(objectMemory addressCouldBeObj: oop) ifFalse:
[^(oop bitAnd: objectMemory allocationUnit - 1) ~= 0
ifTrue: [' is misaligned']
ifFalse: [self whereIs: oop]].
(objectMemory isFreeObject: oop) ifTrue:
+ [^' is a free chunk of size ', (objectMemory sizeOfFree: oop) printString,
+ (objectMemory hasSpurMemoryManagerAPI
+ ifTrue: [' 0th: ', (objectMemory fetchPointer: 0 ofFreeChunk: oop) hex]
+ ifFalse: [''])].
- [^' is a free chunk of size ', (objectMemory sizeOfFree: oop) printString].
(objectMemory isForwarded: oop) ifTrue:
[^' is a forwarded object to ', (objectMemory followForwarded: oop) hex,
' of slot size ', (objectMemory numSlotsOfAny: oop) printString].
(objectMemory isFloatInstance: oop) ifTrue:
[^'=', (objectMemory dbgFloatValueOf: oop) printString].
oop = objectMemory nilObject ifTrue:
[^'nil'].
oop = objectMemory falseObject ifTrue:
[^'false'].
oop = objectMemory trueObject ifTrue:
[^'true'].
classOop := objectMemory fetchClassOfNonImm: oop.
((self objCouldBeClassObj: oop)
and: [(objectMemory numSlotsOf: classOop) = metaclassNumSlots]) ifTrue:
[^'class ', (self nameOfClass: oop)].
name := self nameOfClass: classOop.
name size = 0 ifTrue: [name := '??'].
(#('String' 'ByteString') includes: name) ifTrue:
[^(self stringOf: oop) printString].
(#('Symbol' 'ByteSymbol') includes: name) ifTrue:
[^'#', (self stringOf: oop)].
name = 'Character' ifTrue: "SpurMemoryManager has immediate Characters (see above); ObjectMemory does not"
[^'=', (Character value: (objectMemory integerValueOf:
(objectMemory fetchPointer: 0 ofObject: oop))) printString].
"Try to spot association-like things; they're all subclasses of LookupKey"
((objectMemory isPointersNonImm: oop)
and: [((objectMemory instanceSizeOf: classOop) between: ValueIndex + 1 and: ValueIndex + 2)
and: [(objectMemory isBytes: (objectMemory fetchPointer: KeyIndex ofObject: oop))]]) ifTrue:
[| classLookupKey |
classLookupKey := objectMemory fetchClassOfNonImm: (objectMemory splObj: SchedulerAssociation).
[classLookupKey = objectMemory nilObject ifTrue:
[^(('AEIOU' includes: name first) ifTrue: ['an '] ifFalse: ['a ']), name].
(objectMemory instanceSizeOf: classLookupKey) = (KeyIndex + 1)] whileFalse:
[classLookupKey := self superclassOf: classLookupKey].
(self includesBehavior: classOop ThatOf: classLookupKey) ifTrue:
[^(('AEIOU' includes: name first) ifTrue: ['an '] ifFalse: ['a ']), name,
' ', (self shortPrint: (objectMemory fetchPointer: KeyIndex ofObject: oop)),
' -> ',
(objectMemory fetchPointer: ValueIndex ofObject: oop) hex8]].
^(('AEIOU' includes: name first) ifTrue: ['an '] ifFalse: ['a ']), name!
More information about the Vm-dev
mailing list