VM Maker: VMMakerUI-eem.13.mcz

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
1 message Options
Reply | Threaded
Open this post in threaded view
|

VM Maker: VMMakerUI-eem.13.mcz

commits-2
 
Eliot Miranda uploaded a new version of VMMakerUI to project VM Maker:
http://source.squeak.org/VMMaker/VMMakerUI-eem.13.mcz

==================== Summary ====================

Name: VMMakerUI-eem.13
Author: eem
Time: 30 December 2019, 7:26:41.726219 pm
UUID: c312a4d2-81ac-46b0-bd9a-7334a7f4dfa7
Ancestors: VMMakerUI-eem.12

Add a subclass of CogOopInspector, CogBytecodeMethodInspector (you can guess what for).
Add emphasised printing support.

=============== Diff against VMMakerUI-eem.12 ===============

Item was added:
+ ----- Method: CogAbstractFrameInspector>>interpretMethod:value:at: (in category 'evaluating') -----
+ interpretMethod: fieldName value: valueString at: address
+ | methodFieldString secondMethodFieldString  |
+ methodFieldString := valueString copyUpTo: Character tab.
+ secondMethodFieldString := (ReadStream on: valueString from: methodFieldString size + 2 to: valueString size)
+ skipSeparators;
+ upTo: $:.
+ "compare ignoring least signirficant bits, which are flags"
+ methodFieldString allButLast = secondMethodFieldString allButLast ifTrue:
+ [^(CogBytecodeMethodInspector on: coInterpreter)
+ oop: (coInterpreter longAt: address);
+ displayPinnable: fieldName, ' ', valueString].
+ "It's a CogMethod; use a different inspector"
+ self shouldBeImplemented!

Item was added:
+ CogOopInspector subclass: #CogBytecodeMethodInspector
+ instanceVariableNames: ''
+ classVariableNames: ''
+ poolDictionaries: ''
+ category: 'VMMakerUI-SqueakInspectors'!

Item was added:
+ ----- Method: CogBytecodeMethodInspector>>textMenu: (in category 'accessing - ui') -----
+ textMenu: aMenuMorph
+ aMenuMorph
+ addTitle: 'Select print format';
+ add: #printOop: action: [self printer: #printOop:on:oopAttribute:];
+ add: #longPrintOop: action: [self printer: #longPrintOop:on:oopAttribute:];
+ add: #symbolicMethod: action: [self printer: #symbolicMethod:on:oopAttribute:].
+ ^aMenuMorph!

Item was changed:
  ----- Method: CogOopInspector>>interpretOopString: (in category 'evaluating') -----
  interpretOopString: aStringContainingAnOop
+ ^(CogOopInspector on: coInterpreter)
- ^self copy
  oop: (ExtendedNumberParser on: aStringContainingAnOop readStream skipSeparators) nextInteger;
  displayPinnable: aStringContainingAnOop withBlanksTrimmed!

Item was added:
+ ----- Method: StackInterpreter>>printDecodeMethodHeaderOop:on: (in category '*VMMakerUI-debug printing') -----
+ printDecodeMethodHeaderOop: methodHeaderOop on: aStream
+ self shortPrintOop: methodHeaderOop on: aStream.
+ (self methodHeaderHasPrimitive: methodHeaderOop) ifTrue:
+ [aStream nextPutAll: ' hasPrim'].
+ (self methodHeaderIndicatesLargeFrame: methodHeaderOop) ifTrue:
+ [aStream nextPutAll: ' largeFrame'].
+ (SistaVM and: [self isOptimizedMethodHeader: methodHeaderOop]) ifTrue:
+ [aStream nextPutAll: ' optimized'].
+ (MULTIPLEBYTECODESETS and: [(objectMemory integerValueOf: methodHeaderOop) < 0]) ifTrue:
+ [aStream nextPutAll: ' altSet'].
+ NewspeakVM ifTrue:
+ [aStream nextPutAll:
+ ((self accessModifierOfMethodHeader: methodHeaderOop) caseOf: {
+ [0] -> [' public'].
+ [1] -> [' private'].
+ [2] -> [' protected'].
+ [3] -> [' access undefined'] })].
+ aStream
+ nextPutAll: ' nLits '; print: (objectMemory literalCountOfMethodHeader: methodHeaderOop);
+ nextPutAll: ' nArgs '; print: (self argumentCountOfMethodHeader: methodHeaderOop);
+ nextPutAll: ' nTemps '; print: (self temporaryCountOfMethodHeader: methodHeaderOop)!

Item was added:
+ ----- Method: StackInterpreter>>printMethodHeaderOop:on: (in category '*VMMakerUI-debug printing') -----
+ printMethodHeaderOop: headerOop on: aStream
+ <doNotGenerate>
+ self printDecodeMethodHeaderOop: headerOop on: aStream!

Item was changed:
  ----- Method: StackInterpreter>>printOop:on:oopAttribute: (in category '*VMMakerUI-debug printing') -----
  printOop: oop on: aStream oopAttribute: oopTextAttribute
  <doNotGenerate>
  | cls fmt lastIndex startIP bytecodesPerLine column |
  <inline: false>
  (objectMemory isImmediate: oop) ifTrue:
  [^self shortPrintOop: oop on: aStream].
  self printHex: oop on: aStream.
  (objectMemory addressCouldBeObj: oop) ifFalse:
  [(oop bitAnd: objectMemory allocationUnit - 1) ~= 0 ifTrue: [^aStream nextPutAll: ' is misaligned'; cr].
  ((objectMemory isInNewSpace: oop)
   and: [objectMemory isForwarded: oop]) ifTrue:
  [self printForwarder: oop on: aStream].
  ^aStream nextPutAll: (self whereIs: oop); cr].
  (objectMemory isFreeObject: oop) ifTrue:
  [aStream nextPutAll: ' is a free chunk of size '; print: (objectMemory sizeOfFree: oop).
  objectMemory hasSpurMemoryManagerAPI ifTrue:
  [aStream nextPutAll: ' 0th: '. self printHex: (objectMemory fetchPointer: 0 ofFreeChunk: oop) on: aStream.
  objectMemory printHeaderTypeOf: oop on: aStream].
  ^aStream cr].
  (objectMemory isForwarded: oop) ifTrue:
  [self printForwarder: oop on: aStream].
  aStream nextPutAll: ': a(n) '.
  self printNameOfClass: (cls := objectMemory fetchClassOfNonImm: oop) count: 5 on: aStream.
  cls = (objectMemory splObj: ClassFloat) ifTrue:
  [^aStream cr; print: (objectMemory dbgFloatValueOf: oop); cr].
  fmt := objectMemory formatOf: oop.
  fmt > objectMemory lastPointerFormat ifTrue:
  [aStream nextPutAll: ' nbytes '; print: (objectMemory numBytesOf: oop)].
  aStream 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:
  [aStream nextPutAll: ' datasize '; print: (self sizeOfAlienData: oop).
  aStream nextPutAll: ((self isIndirectAlien: oop)
  ifTrue: [' indirect @ ']
  ifFalse:
  [(self isPointerAlien: oop)
  ifTrue: [' pointer @ ']
  ifFalse: [' direct @ ']]).
  self printHex: (self startOfAlienData: oop) on: aStream. ^aStream cr].
  (objectMemory isWordsNonImm: oop) ifTrue:
  [lastIndex := 64 min: ((objectMemory numBytesOf: oop) / objectMemory wordSize).
  lastIndex > 0 ifTrue:
  [1 to: lastIndex do:
  [:index|
  self printHex: (objectMemory fetchLong32: index - 1 ofObject: oop) on: aStream.
  index \\ self elementsPerPrintOopLine = 0 ifTrue:
  [aStream cr]].
  lastIndex \\ self elementsPerPrintOopLine = 0 ifFalse:
  [aStream cr]].
  ^self].
  self printStringOf: oop on: aStream.
  ^aStream cr].
  "this is nonsense.  apologies."
  startIP := (objectMemory safeLastPointerOf: oop) + objectMemory bytesPerOop - objectMemory baseHeaderSize / objectMemory bytesPerOop.
  lastIndex := 256 min: startIP.
  lastIndex > 0 ifTrue:
  [1 to: lastIndex do:
  [:index|
  aStream space; nextPutAll: (self hex: (objectMemory fetchPointer: index - 1 ofObject: oop) withAttribute: oopTextAttribute); space.
  aStream nextPutAll: (self shortPrint: (objectMemory fetchPointer: index - 1 ofObject: oop)).
  index \\ self elementsPerPrintOopLine = 0 ifTrue:
  [aStream cr]].
  lastIndex \\ self elementsPerPrintOopLine = 0 ifFalse:
  [aStream cr]].
  (objectMemory isCompiledMethod: oop)
  ifFalse:
  [startIP > 64 ifTrue: [aStream nextPutAll: '...'; 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:
+ [aStream nextPutAll: (oop+objectMemory baseHeaderSize+index-1) hex; nextPutAll: ': '].
- [aStream nextPutAll: (oop+objectMemory baseHeaderSize+index-1) hex; print: ': '].
  byte := objectMemory fetchByte: index - 1 ofObject: oop.
  aStream space. byte printOn: aStream base: 16. aStream nextPut: $/. byte printOn: aStream.
  column := column + 1.
  column > bytecodesPerLine ifTrue:
  [column := 1. aStream cr]].
  column = 1 ifFalse:
  [aStream cr]]!

Item was added:
+ ----- Method: StackInterpreter>>symbolicMethod:on:oopAttribute: (in category '*VMMakerUI-debug printing') -----
+ symbolicMethod: aMethod on: aStream oopAttribute: oopTextAttribute
+ <doNotGenerate>
+ | prim |
+ (prim := self primitiveIndexOf: aMethod) > 0 ifTrue:
+ [aStream nextPutAll: '<primitive: '; print: prim; nextPut: $>.
+ (self isQuickPrimitiveIndex: prim) ifTrue:
+ [aStream nextPutAll: ' quick method'; cr; flush.
+ ^self].
+ aStream cr].
+ 0 to: (objectMemory literalCountOf: aMethod) do:
+ [:i| | field |
+ i * objectMemory bytesPerOop + objectMemory baseHeaderSize + aMethod printOn: aStream base: 16.
+ aStream space; print: i; nextPutAll: ': '.
+ field := objectMemory fetchPointer: i ofObject: aMethod.
+ aStream nextPutAll: (self hex: field withAttribute: oopTextAttribute); space.
+ i = 0
+ ifTrue: [self printMethodHeaderOop: field on: aStream]
+ ifFalse: [aStream nextPutAll: (self shortPrint: field)].
+ aStream cr].
+ (InstructionPrinter
+ on: ((VMCompiledMethodProxy new
+ for: aMethod
+ coInterpreter: self
+ objectMemory: objectMemory)
+ printPretty: true;
+ yourself))
+ indent: 0;
+ printInstructionsOn: aStream!