[Vm-dev] VM Maker: VMMaker.oscog-eem.538.mcz

commits at source.squeak.org commits at source.squeak.org
Fri Dec 6 19:27:52 UTC 2013


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

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

Name: VMMaker.oscog-eem.538
Author: eem
Time: 6 December 2013, 11:25:41.549 am
UUID: 6b6d8ba7-4913-4563-9d01-da880441f843
Ancestors: VMMaker.oscog-eem.537

Fix translation of var := TStmtList so that the value of the last
statement is assigned, not the first.

Fix the concatenation of the assert-failure reason in
isValidObjStackPage:myIndex:firstPage: so that it works in C.

Remove the assert in updateRootOfObjStackAt:with: so that the
intermediate state of a partially followed objStack is not reported
as an assert-failure.

Add a print routine for pages of an objStack.

[ All to fix broken assert code :-) ]

Slang:
Generate the CoInterpreter *before* the Cogit so that the
objectMemory and interpreter classes have initialized *before* the
Cogit is generated.  Otherwise the Cogit can be generated with values
from the wrong interpreter/objectMemory.

=============== Diff against VMMaker.oscog-eem.537 ===============

Item was changed:
  ----- Method: SpurMemoryManager>>ensureRoomOnObjStackAt: (in category 'obj stacks') -----
  ensureRoomOnObjStackAt: objStackRootIndex
  	"An obj stack is a stack of objects stored in a hidden root slot, such as
  	 the markStack or the ephemeronQueue.  It is a linked list of segments,
  	 with the hot end at the head of the list.  It is a word object.  The stack
  	 pointer is in ObjStackTopx and 0 means empty.  The list goes through
  	 ObjStackNextx. We don't want to shrink objStacks, since they're used
  	 in GC and its good to keep their memory around.  So unused pages
  	 created by popping emptying pages are kept on the ObjStackFreex list."
  	| stackOrNil freeOrNewPage |
  	stackOrNil := self fetchPointer: objStackRootIndex ofObject: hiddenRootsObj.
  	(stackOrNil = nilObj
  	 or: [(self fetchPointer: ObjStackTopx ofObject: stackOrNil) >= ObjStackLimit]) ifTrue:
  		[freeOrNewPage := stackOrNil = nilObj
  								ifTrue: [0]
  								ifFalse: [self fetchPointer: ObjStackFreex ofObject: stackOrNil].
  		 freeOrNewPage ~= 0
  			ifTrue: "the free page list is always on the new page."
  				[self storePointer: ObjStackFreex ofObjStack: stackOrNil withValue: 0.
  				 self assert: (marking not or: [self isMarked: freeOrNewPage])]
  			ifFalse:
  				[freeOrNewPage := self allocateSlotsInOldSpace: ObjStackPageSlots
  										format: self wordIndexableFormat
  										classIndex: self wordSizeClassIndexPun.
  				 freeOrNewPage ifNil: [self error: 'no memory to allocate or extend obj stack'].
  				 self storePointer: ObjStackFreex ofObjStack: freeOrNewPage withValue: 0..
  				 marking ifTrue: [self setIsMarkedOf: freeOrNewPage to: true]].
  		 self storePointer: ObjStackMyx ofObjStack: freeOrNewPage withValue: objStackRootIndex;
  			  storePointer: ObjStackNextx ofObjStack: freeOrNewPage withValue: (stackOrNil = nilObj ifTrue: [0] ifFalse: [stackOrNil]);
  			  storePointer: ObjStackTopx ofObjStack: freeOrNewPage withValue: 0;
  			  storePointer: objStackRootIndex ofObject: hiddenRootsObj withValue: freeOrNewPage.
  		 self assert: (self isValidObjStackAt: objStackRootIndex).
  		 "Added a new page; now update and answer the relevant cached first page."
+ 		 stackOrNil := self updateRootOfObjStackAt: objStackRootIndex with: freeOrNewPage].
- 		 ^self updateRootOfObjStackAt: objStackRootIndex with: freeOrNewPage].
  	self assert: (self isValidObjStackAt: objStackRootIndex).
  	^stackOrNil!

Item was changed:
  ----- Method: SpurMemoryManager>>isValidObjStackPage:myIndex:firstPage: (in category 'obj stacks') -----
  isValidObjStackPage: objStackPage myIndex: myx firstPage: isFirstPage
  	"Answer if the obj stack at stackRootIndex is valid."
  	| freeOrNextPage index |
  	<inline: false>
  	(self isValidObjStackPage: objStackPage myIndex: myx) ifFalse:
  		[^false].
  	freeOrNextPage := self fetchPointer: ObjStackFreex ofObject: objStackPage.
  	[freeOrNextPage ~= 0] whileTrue:
  		[isFirstPage ifFalse:
  			[objStackInvalidBecause := 'free page on other than first page'.
  			 invalidObjStackPage := objStackPage.
  			 ^false].
  		 (self isValidObjStackPage: freeOrNextPage myIndex: myx) ifFalse:
+ 			[objStackInvalidBecause := self stretch: objStackInvalidBecause cat: ', on next page'.
- 			[objStackInvalidBecause := self str: objStackInvalidBecause cat: ', on next page'.
  			^false].
  		 freeOrNextPage := self fetchPointer: ObjStackFreex ofObject: freeOrNextPage].
  	isFirstPage ifTrue:
  		[(myx between: self classTableRootSlots and: self classTableRootSlots + self hiddenRootSlots - 1) ifFalse:
  			[objStackInvalidBecause := 'myx out of range'.
  			 invalidObjStackPage := objStackPage.
  			 ^false].
  		 (self fetchPointer: myx ofObject: hiddenRootsObj) = objStackPage ifFalse:
  			[objStackInvalidBecause := 'firstPage is not root'.
  			 invalidObjStackPage := objStackPage.
  			 ^false]].
  	index := self fetchPointer: ObjStackTopx ofObject: objStackPage.
  	(index between: 0 and: ObjStackLimit) ifFalse:
  		[objStackInvalidBecause := 'bad topx'.
  		 invalidObjStackPage := objStackPage.
  		 ^false].
  	freeOrNextPage := self fetchPointer: ObjStackNextx ofObject: objStackPage.
  	^freeOrNextPage = 0
  	  or: [self isValidObjStackPage: freeOrNextPage myIndex: myx firstPage: false]!

Item was changed:
  ----- Method: SpurMemoryManager>>popObjStack: (in category 'obj stacks') -----
  popObjStack: objStack
  	| topx top nextPage myx |
  	self assert: (self isValidObjStack: objStack).
  	topx := self fetchPointer: ObjStackTopx ofObject: objStack.
  	topx = 0 ifTrue:
  		[self assert: (self fetchPointer: ObjStackNextx ofObject: objStack) = 0.
  		 self cCode: [] "for debugging markAndTrace: set (MarkStackRecord := OrderedCollection new)"
  			inSmalltalk:
  				[(self fetchPointer: ObjStackMyx ofObject: objStack) = MarkStackRootIndex ifTrue:
  					[MarkStackRecord ifNotNil:
  						[MarkStackRecord addLast: {#EMPTY. nil}]]].
  		^nil].
  	topx := topx - 1.
  	top := self fetchPointer: topx + ObjStackFixedSlots ofObject: objStack.
  	self cCode: [] "for debugging markAndTrace: set (MarkStackRecord := OrderedCollection new)"
  		inSmalltalk:
  			[(self fetchPointer: ObjStackMyx ofObject: objStack) = MarkStackRootIndex ifTrue:
  				[MarkStackRecord ifNotNil:
  					[(MarkStackRecord last first = #push and: [MarkStackRecord last last = top])
  						ifTrue: [MarkStackRecord removeLast]
  						ifFalse: [MarkStackRecord addLast: {#pop. top}]]]].
  	self storePointer: ObjStackTopx ofObject: objStack withValue: topx.
  	(topx = 0
  	 and: [(nextPage := self fetchPointer: ObjStackNextx ofObject: objStack) ~= 0]) ifTrue:
  		[self storePointer: ObjStackFreex ofObjStack: nextPage withValue: objStack.
  		 self storePointer: ObjStackNextx ofObjStack: objStack withValue: 0.
  		 myx := self fetchPointer: ObjStackMyx ofObject: objStack.
  		 self updateRootOfObjStackAt: myx with: nextPage].
+ 	self assert: (self isValidObjStack: objStack).
  	^top!

Item was added:
+ ----- Method: SpurMemoryManager>>printObjStack: (in category 'obj stacks') -----
+ printObjStack: objStack
+ 	<api>
+ 	objStack = nilObj
+ 		ifTrue:
+ 			[coInterpreter print: 'nil'; cr]
+ 		ifFalse:
+ 			[self printObjStackPage: objStack
+ 				myIndex: (self fetchPointer: ObjStackMyx ofObject: objStack)
+ 				pageType: ObjStackMyx]!

Item was added:
+ ----- Method: SpurMemoryManager>>printObjStackPage:myIndex:pageType: (in category 'obj stacks') -----
+ printObjStackPage: objStackPage myIndex: myx pageType: pageType
+ 	| freeOrNextPage isFirstPage isNextPage isFreePage |
+ 	<inline: false>
+ 	isFirstPage := pageType = ObjStackMyx.
+ 	isNextPage := pageType = ObjStackNextx.
+ 	isFreePage := pageType = ObjStackFreex.
+ 	self printObjStackPage: objStackPage
+ 		myIndex: myx
+ 		tag: (isFirstPage ifTrue: ['head'] ifFalse: [isFreePage ifTrue: ['free'] ifFalse: ['next']]).
+ 	(isFirstPage or: [isNextPage]) ifTrue:
+ 		[coInterpreter tab; print: 'next: '; printHex: (self fetchPointer: ObjStackNextx ofObject: objStackPage).
+ 		 isFirstPage ifTrue:
+ 			[coInterpreter print: ' free: '; printHex: (self fetchPointer: ObjStackFreex ofObject: objStackPage)].
+ 		 coInterpreter cr].
+ 	freeOrNextPage := self fetchPointer: ObjStackFreex ofObject: objStackPage.
+ 	[freeOrNextPage ~= 0] whileTrue:
+ 		[self printObjStackPage: freeOrNextPage myIndex: myx pageType: ObjStackFreex.
+ 		 freeOrNextPage := self fetchPointer: ObjStackFreex ofObject: freeOrNextPage].
+ 	freeOrNextPage := self fetchPointer: ObjStackNextx ofObject: objStackPage.
+ 	freeOrNextPage ~= 0 ifTrue:
+ 		[self printObjStackPage: freeOrNextPage myIndex: myx pageType: ObjStackNextx]!

Item was added:
+ ----- Method: SpurMemoryManager>>printObjStackPage:myIndex:tag: (in category 'obj stacks') -----
+ printObjStackPage: objStackPage myIndex: myx tag: pageType
+ 	<var: 'pageType' type: #'char *'>
+ 	<inline: false>
+ 	coInterpreter
+ 		print: pageType; space; printHex: objStackPage; space;
+ 		print: 'cx '; printNum: (self classIndexOf: objStackPage);
+ 		print: ' ('; printNum: self wordSizeClassIndexPun;
+ 		print: ') fmt '; printNum: (self formatOf: objStackPage);
+ 		print: ' ('; printNum: self wordIndexableFormat;
+ 		print: ') sz '; printNum: (self numSlotsOfAny: objStackPage);
+ 		print: ' ('; printNum: ObjStackPageSlots;
+ 		print: ') myx: '; printNum: (self fetchPointer: ObjStackMyx ofObject: objStackPage);
+ 		print: ' ('; printNum: myx;
+ 		print: ((self isMarked: objStackPage) ifTrue: [') mkd'] ifFalse: [') unmkd']);
+ 		cr!

Item was changed:
  ----- Method: SpurMemoryManager>>updateRootOfObjStackAt:with: (in category 'obj stacks') -----
  updateRootOfObjStackAt: objStackRootIndex with: newRootPage
  	self storePointer: objStackRootIndex
  		ofObject: hiddenRootsObj
  		withValue: newRootPage.
  	objStackRootIndex caseOf: {
  		[MarkStackRootIndex]			->	[markStack := newRootPage].
  		[WeaklingStackRootIndex]		->	[weaklingStack := newRootPage].
  		[EphemeronQueueRootIndex]	->	[ephemeronQueue := newRootPage] }.
- 	self assert: (self isValidObjStack: newRootPage).
  	^newRootPage!

Item was changed:
  ----- Method: TAssignmentNode>>emitCCodeOn:level:generator: (in category 'C code generation') -----
  emitCCodeOn: aStream level: level generator: aCodeGen
  	expression isSwitch ifTrue:
  		[^expression emitCCodeOn: aStream addToEndOfCases: self level: level generator: aCodeGen].
  	expression isLiteralArrayDeclaration ifTrue:
  		[^self emitLiteralArrayDeclarationOn: aStream level: level generator: aCodeGen].
  	(expression isSend and: [expression isValueExpansion]) ifTrue:
  		[^self emitValueExpansionOn: aStream level: level generator: aCodeGen].
+ 	(expression isStmtList and: [expression statements size > 1]) ifTrue:
+ 		[^self emitStatementListExpansion: expression on: aStream level: level generator: aCodeGen].
  	variable emitCCodeOn: aStream level: level generator: aCodeGen.
  	self isVariableUpdatingAssignment
  		ifTrue:
  			[aStream
  				space;
  				nextPutAll: expression selector;	"+ or -"
  				nextPut: $=;
  				space.
  			expression args first emitCCodeAsArgumentOn: aStream level: level generator: aCodeGen]
  		ifFalse:
  			[aStream space; nextPut: $=; space.
  			 expression emitCCodeAsArgumentOn: aStream level: level generator: aCodeGen]!

Item was added:
+ ----- Method: TAssignmentNode>>emitStatementListExpansion:on:level:generator: (in category 'C code generation') -----
+ emitStatementListExpansion: stmtList on: aStream level: level generator: aCodeGen
+ 	| lastStmt copy |
+ 	lastStmt := stmtList statements last.
+ 	lastStmt = variable ifTrue:
+ 		[^expression emitCCodeOn: aStream level: level generator: aCodeGen].
+ 	copy := stmtList copy.
+ 	copy statements
+ 		at: stmtList statements size
+ 		put: (TAssignmentNode new
+ 				setVariable: variable
+ 				expression: lastStmt).
+ 	copy emitCCodeOn: aStream level: level generator: aCodeGen!

Item was added:
+ ----- Method: VMClass>>stretch:cat: (in category 'C library extensions') -----
+ stretch: s1 cat: s2
+ 	<var: 's1' type: #'char *'>
+ 	<var: 's2' type: #'char *'>
+ 	| ns |
+ 	<var: 'ns' type: #'char *'>
+ 	^self
+ 		cCode:
+ 			[ns := self malloc: (self strlen: s1) + (self strlen: s2) + 2.
+ 			self str: ns cpy: s1.
+ 			self str: ns cat: s2]
+ 		inSmalltalk: [self str: s1 cat: s2]!

Item was changed:
  ----- Method: VMMaker>>generateMainVM (in category 'generate sources') -----
  generateMainVM
+ 	"Generate the interp (and optionally the cogit), internal plugins and exports.
+ 	 N.B. generateInterpreterFile *must* preceed generateCogitFile so that
+ 	 the objectMemory and interpreter classes are initialized before the Cogit
+ 	 code is generated."
- "generate the interp (and optionally the cogit), internal plugins and exports"
  
+ 	self generateInterpreterFile;
+ 		generateCogitFile;
- 	self generateCogitFile;
- 		generateInterpreterFile;
  		processFilesForCoreVM;
  		generateInternalPlugins;
  		generateExportsFile!



More information about the Vm-dev mailing list