[Vm-dev] VM Maker: VMMakerUI-eem.2.mcz

commits at source.squeak.org commits at source.squeak.org
Mon Dec 23 03:14:22 UTC 2019


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

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

Name: VMMakerUI-eem.2
Author: eem
Time: 22 December 2019, 7:14:20.960407 pm
UUID: d412eec8-114e-4a7a-ad8e-3ac33b0e36b3
Ancestors: VMMakerUI-eem.1

Add abstract register names on the left of the register state (i.e. include the register map) if there's a cogit.
Nuke unused accessors (I like my state encapsulated).
No need for an unaccessible pc field.
(buit still have to test using the CogProcessorAlien without a cogit etc).

=============== Diff against VMMakerUI-eem.1 ===============

Item was changed:
  Model subclass: #CogProcessorAlienInspector
+ 	instanceVariableNames: 'cogit coInterpreter objectMemory processor registerSelectors windowTitle registerCache registerMap'
- 	instanceVariableNames: 'cogit coInterpreter objectMemory processor registerSelectors windowTitle registerCache'
  	classVariableNames: ''
  	poolDictionaries: ''
  	category: 'VMMakerUI-SqueakInspectors'!
  
  !CogProcessorAlienInspector commentStamp: 'eem 12/22/2019 08:27' prior: 0!
  A CogProcessorAlienInspector is an inspector for a CogProcessorAlien processor simulator that displays the processor simulator's register state.
  
  Instance Variables
  	processor:			<CogProcessorAlien>
  	registerCache:		<Array of Integer>
  	registerSelectors:	<Array of Symbol>
  	windowTitle:		<String>!

Item was changed:
  ----- Method: CogProcessorAlienInspector>>cogit: (in category 'initialization') -----
  cogit: aCogit
  	cogit := aCogit.
  	coInterpreter := cogit coInterpreter.
  	objectMemory := coInterpreter objectMemory.
  	processor := cogit processor.
+ 	registerSelectors := processor registerStateGetters.
+ 	self computeRegisterMap.
+ 	windowTitle := nil.
+ 	self changed: #text; changed: #window!
- 	registerSelectors := OrderedCollection withAll: processor registerStateGetters!

Item was added:
+ ----- Method: CogProcessorAlienInspector>>computeRegisterMap (in category 'initialization') -----
+ computeRegisterMap
+ 	| map |
+ 	registerMap := Dictionary new.
+ 	map := cogit backEnd generalPurposeRegisterMap.
+ 	(map keys asSortedCollection: [:a :b| (map at: a) < (map at: b)]) do:
+ 		[:regName| | abstractName |
+ 		abstractName := cogit backEnd nameForRegister: (map at: regName).
+ 		abstractName last ~~ $? ifTrue:
+ 			[registerMap at: regName put: abstractName]]!

Item was changed:
  ----- Method: CogProcessorAlienInspector>>evaluateExpression: (in category 'evaluation') -----
  evaluateExpression: exp
  	"Callback from text widget after do-it, print-it, inspect-it, etc... The return value will be fed  back."
  
  	| register value |
  	register := (exp asString findTokens: '=') first withBlanksTrimmed asLowercase asSymbol.
+ 	value := registerCache at: register.
- 	value := self registerCache at: register.
  
  	self interpret: register.
+ 
+ 	^value!
- 	
- 	^ value!

Item was changed:
  ----- Method: CogProcessorAlienInspector>>initialize (in category 'initialization') -----
  initialize
  
  	super initialize.
+ 	registerSelectors := OrderedCollection new.
+ 	registerMap := Dictionary new.
+ 	registerCache := IdentityDictionary new.!
- 	
- 	self registerSelectors: OrderedCollection new.
- 	
- 	self registerCache: IdentityDictionary new.!

Item was removed:
- ----- Method: CogProcessorAlienInspector>>inspect: (in category 'initialization') -----
- inspect: aRegisterSelector
- 
- 	self registerSelectors add: aRegisterSelector.
- 	self changed: #text.!

Item was removed:
- ----- Method: CogProcessorAlienInspector>>inspectAll: (in category 'initialization') -----
- inspectAll: someRegisterSelectors
- 
- 	self registerSelectors addAll: someRegisterSelectors.
- 	self changed: #text.!

Item was removed:
- ----- Method: CogProcessorAlienInspector>>inspectNone (in category 'initialization') -----
- inspectNone
- 
- 	self registerSelectors removeAll.
- 	self changed: #text.!

Item was changed:
  ----- Method: CogProcessorAlienInspector>>interpret: (in category 'evaluation') -----
  interpret: registerSelector
  	"Offer some ways of interpretation."
  	
+ 	| value options where choice |
- 	| value options choice |
  
  	self flag: #updates. "mt: The cache value corresponds maybe to the value at interaction time. In case the register changes quickly and it takes the user some time to make a choice?"
+ 	value := registerCache at: registerSelector.
+ 
- 	value := self registerCache at: registerSelector.
- 	
  	options := OrderedDictionary newFrom: {
  		'Object' -> #interpret:asObject:.
  		'Stack frame' -> #interpret:asStackFrame:.
  		'Code address' -> #interpret:asCodeAddress:.
  		'Integer' -> #interpret:asInteger:.
  		'Character' -> #interpret:asCharacter:.
  	}.
+ 	where := coInterpreter whereIs: value.
- 	
  	choice := Project uiManager
  		chooseFrom: options keys
  		values: options values
+ 		title: ('{1} {2}' format: {registerSelector asUppercase. (where beginsWith: ' ') ifTrue: [where allButFirst] ifFalse: [' = ', where]}).
- 		title: ('{1} {2}' format: {registerSelector asUppercase. coInterpreter whereIs: value}).
  		
  	choice ifNotNil:
  		[:selector | self perform: selector with: registerSelector with: value]!

Item was removed:
- ----- Method: CogProcessorAlienInspector>>pcText (in category 'accessing - ui') -----
- pcText
- 
- 	^processor pc hex allButFirst: 3!

Item was changed:
  ----- Method: CogProcessorAlienInspector>>processor: (in category 'accessing') -----
  processor: aCogProcessorAlien
  	processor := aCogProcessorAlien.
  	registerSelectors := processor registerStateGetters.
+ 	registerMap := Dictionary new.
  	windowTitle := nil.
+ 	self changed: #text; changed: #windowTitle.!
- 	self changed: #windowTitle.!

Item was removed:
- ----- Method: CogProcessorAlienInspector>>registerAt: (in category 'accessing - ui') -----
- registerAt: aRegisterSelector
- 
- 	^ self alien perform: aRegisterSelector!

Item was removed:
- ----- Method: CogProcessorAlienInspector>>registerCache (in category 'accessing') -----
- registerCache
- 
- 	^ registerCache!

Item was removed:
- ----- Method: CogProcessorAlienInspector>>registerCache: (in category 'accessing') -----
- registerCache: anObject
- 
- 	registerCache := anObject.!

Item was removed:
- ----- Method: CogProcessorAlienInspector>>registerSelectors (in category 'accessing') -----
- registerSelectors
- 
- 	^ registerSelectors!

Item was removed:
- ----- Method: CogProcessorAlienInspector>>registerSelectors: (in category 'accessing') -----
- registerSelectors: anObject
- 
- 	registerSelectors := anObject.
- 	self changed: #text.!

Item was changed:
  ----- Method: CogProcessorAlienInspector>>registerTextAt: (in category 'accessing - ui') -----
  registerTextAt: aRegisterSelector
  
  	| raw current last text |
  	current := processor perform: aRegisterSelector.
+ 	last := registerCache at: aRegisterSelector ifAbsent: [].
+ 	registerCache at: aRegisterSelector put: current.	
- 	last := self registerCache at: aRegisterSelector ifAbsent: [].
- 	self registerCache at: aRegisterSelector put: current.	
  
  	raw := String streamContents:
  				[:s |
  				current
  					printOn: s
  					base: (2 raisedTo: self bitsPerDigit)
  					length: processor class wordSize * 8 / self bitsPerDigit
  					padded: true].
  		
  	text := (String streamContents:
  				[:s |
  				raw groupsOf: self digitsPerGroup atATimeCollect:
  					[:group |
  					s nextPutAll: group; space]])
  						asText.
  
  	last ~= current ifTrue:
  		[text addAllAttributes: {TextEmphasis bold. TextColor color: Color salmon}].
  	^text!

Item was changed:
  ----- Method: CogProcessorAlienInspector>>text (in category 'accessing - ui') -----
  text
  
  	^Text streamContents:
  		[:s | | max exclude fpstate |
+ 		max := (registerSelectors ifEmpty: [1] ifNotEmpty: [:selector | (selector collect: #size) max]).
- 		max := (self registerSelectors ifEmpty: [1] ifNotEmpty: [:selector | (selector collect: #size) max]).
- 		s
- 			nextPutAll: ('PC' padded: #right to: max with: Character space);
- 			nextPutAll: ' = ';
- 			nextPutAll: self pcText;
- 			cr.
  		exclude := Set new.
  		1 to: (fpstate := processor floatingPointRegisterStateGetters) size by: 4 do:
  			[:index|
  			((index to: index + 3) allSatisfy: [:fpri| (processor perform: (fpstate at: fpri)) isZero]) ifTrue:
  				[exclude addAll: (fpstate copyFrom: index to: index + 3)]].
+ 		registerSelectors do:
+ 			[:selector | | attribute |
- 		self registerSelectors do: [:selector |
  			(exclude includes: selector) ifFalse:
  				[s
  					nextPutAll: ((selector asUppercase padded: #right to: max with: Character space)
+ 						asText addAttribute: (attribute := PluggableTextAttribute evalBlock: [self interpret: selector]));
+ 					space;
+ 					nextPutAll: (self registerTextAt: selector).
+ 				 (registerMap at: selector ifAbsent: []) ifNotNil:
+ 					[:abstractReg|
+ 					 s space; nextPutAll: (abstractReg asText addAttribute: attribute)].
+ 				 s cr]]]!
- 						asText addAttribute: (PluggableTextAttribute evalBlock: [self interpret: selector]));
- 					nextPutAll: ' = ';
- 					nextPutAll: (self registerTextAt: selector);
- 					cr]]]!



More information about the Vm-dev mailing list