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

commits at source.squeak.org commits at source.squeak.org
Fri Jul 18 19:20:24 UTC 2014


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

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

Name: VMMaker.oscog-eem.825
Author: eem
Time: 18 July 2014, 12:18:02.991 pm
UUID: 038c31e2-d97d-4f1b-be2a-3908f6982b5f
Ancestors: VMMaker.oscog-eem.824

Spur:
Fix bad bug in remapObj: that confused the test for old vs
new and hence tried to copyAndForward old objects.

Fix bug in processWeaklings that could remember a weak
object twice.

General:
Fix compilation warnings in stringForCString:

Add a warnpid variable that prnts the pid in warnings, useful
in debugging multi-image tests (i.e. magma).

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

Item was changed:
  ----- Method: ObjectMemory>>stringForCString: (in category 'primitive support') -----
  stringForCString: aCString
  	"Answer a new String copied from a null-terminated C string,
  	 or nil if out of memory.
  	 Caution: This may invoke the garbage collector."
  	<api>
  	<var: 'aCString' type: 'const char *'>
  	<inline: false>
  	| len newString |
  	len := self strlen: aCString.
  	newString := self instantiateClass: (self splObj: ClassByteString) indexableSize: len.
  	newString ifNotNil:
+ 		[self st: (self cCoerceSimple: newString + self baseHeaderSize to: #'char *')
- 		[self st: newString + self baseHeaderSize
  			rn: aCString
  			cpy: len]. "(char *)strncpy()"
  	^newString!

Item was changed:
  ----- Method: SpurGenerationScavenger>>processWeaklings (in category 'weakness and ephemerality') -----
  processWeaklings
  	"Go through the remembered set and the weak list, nilling references to
  	 any objects that didn't survive the scavenge. Read the class comment
  	 for a more in-depth description of the algorithm."
  	<inline: false>
  	| i rootObj weakCorpse weakObj |
  	self assert: self allWeakSurvivorsOnWeakList.
  	i := 0.
  	[i < rememberedSetSize] whileTrue:
  		[rootObj := rememberedSet at: i.
  		(manager isWeakNonImm: rootObj)
  			ifTrue:
  				["If no more referents, remove by overwriting with the last element in the set."
  				 (self processWeakSurvivor: rootObj)
  					ifFalse:
  						[manager setIsRememberedOf: rootObj to: false.
  						 i + 1 < rememberedSetSize ifTrue:
  							[rememberedSet at: i put: (rememberedSet at: rememberedSetSize - 1)].
  						 rememberedSetSize := rememberedSetSize - 1]
  					ifTrue: [i := i + 1]]
  			ifFalse: [i := i + 1]].
  	weakList ifNotNil:
  		[weakCorpse := self firstCorpse: weakList.
  		 [weakCorpse notNil] whileTrue:
  			[self assert: (manager isForwarded: weakCorpse).
  			 weakObj := manager followForwarded: weakCorpse.
  			 "weakObj may have been tenured..."
  			 ((self processWeakSurvivor: weakObj)
+ 			  and: [(manager isOldObject: weakObj)
+ 			  and: [(manager isRemembered: weakObj) not]]) ifTrue:
- 			  and: [manager isOldObject: weakObj]) ifTrue:
  				[self remember: weakObj].
  			 weakCorpse := self nextCorpseOrNil: weakCorpse].
  		weakList := nil]!

Item was changed:
  ----- Method: SpurGenerationScavenger>>remember: (in category 'store check') -----
  remember: objOop
  	"Add the argument to the remembered set and set its isRemembered bit to true.
  	 Answer the argument for the benefit of the Cogit."
  	<api>
  	<inline: false>
  	self assert: (manager isNonImmediate: objOop).
  	self assert: (manager isYoungObject: objOop) not.
  	self assert: (manager isRemembered: objOop) not.
+ 	self assert: (manager isInRememberedSet: objOop) not.
  	manager setIsRememberedOf: objOop to: true.
  	rememberedSetSize < RememberedSetLimit
  		ifTrue:
  			[rememberedSet at: rememberedSetSize put: objOop.
  			 (rememberedSetSize := rememberedSetSize + 1) >= RememberedSetRedZone ifTrue:
  				[manager scheduleScavenge]]
  		ifFalse:
  			[self error: 'remembered set overflow' "for now"].
  	^objOop!

Item was changed:
  CogClass subclass: #SpurMemoryManager
(excessive size, no diff calculated)

Item was changed:
  ----- Method: SpurMemoryManager>>allOldSpaceEntitiesFrom:do: (in category 'object enumeration') -----
  allOldSpaceEntitiesFrom: initialObject do: aBlock
  	<inline: true>
  	| prevObj prevPrevObj objOop |
+ 	self assert: (self isOldObject: initialObject).
  	prevPrevObj := prevObj := nil.
  	objOop := initialObject.
  	[self assert: objOop \\ self allocationUnit = 0.
  	 self oop: objOop isLessThan: endOfMemory] whileTrue:
  		[self assert: (self long64At: objOop) ~= 0.
  		 aBlock value: objOop.
  		 prevPrevObj := prevObj.
  		 prevObj := objOop.
  		 objOop := self objectAfter: objOop limit: endOfMemory].
  	self touch: prevPrevObj.
  	self touch: prevObj!

Item was changed:
  ----- Method: SpurMemoryManager>>remapObj: (in category 'gc - scavenging') -----
  remapObj: objOop
  	"Scavenge or simply follow objOop.  Answer the new location of objOop.
  	 The send should have been guarded by a send of shouldRemapOop:.
  	 The method is called remapObj: for compatibility with ObjectMemory."
  	<api>
  	<inline: false>
  	| resolvedObj |
  	self assert: (self shouldRemapOop: objOop).
  	(self isForwarded: objOop)
  		ifTrue:
  			[resolvedObj := self followForwarded: objOop.
  			(self isInFutureSpace: resolvedObj) ifTrue: "already scavenged"
  				[^resolvedObj]]
  		ifFalse:
  			[resolvedObj := objOop].
  	(scavengeInProgress
+ 	 and: [self isReallyYoung: resolvedObj]) ifTrue: "a becommed or compacted object whose target is in old space, or a CogMethod."
+ 		[^scavenger copyAndForward: resolvedObj].
+ 	^resolvedObj!
- 	 and: [self isReallyYoung: resolvedObj]) ifFalse: "a becommed or compacted object whose target is in old space, or a CogMethod."
- 		[^resolvedObj].
- 	^scavenger copyAndForward: resolvedObj!

Item was changed:
  ----- Method: SpurMemoryManager>>stringForCString: (in category 'primitive support') -----
  stringForCString: aCString
  	"Answer a new String copied from a null-terminated C string,
  	 or nil if out of memory."
  	<api>
  	<var: 'aCString' type: 'const char *'>
  	<inline: false>
  	| len newString |
  	len := self strlen: aCString.
  	newString := self
  					allocateSlots: (self numSlotsForBytes: len)
  					format: (self byteFormatForNumBytes: len)
  					classIndex: ClassByteStringCompactIndex.
  	newString ifNotNil:
+ 		[self st: (self cCoerceSimple: newString + self baseHeaderSize to: #'char *')
- 		[self st: newString + self baseHeaderSize
  			rn: aCString
  			cpy: len]. "(char *)strncpy()"
  	^newString!

Item was changed:
  ----- Method: StackInterpreter class>>preambleCCode (in category 'translation') -----
  preambleCCode
  	^	
  '/* Disable Intel compiler inlining of warning which is used for breakpoints */
  #pragma auto_inline off
+ sqInt warnpid;
  void
  warning(char *s) { /* Print an error message but don''t exit. */
+ 	if (warnpid)
+ 		printf("\n%s pid %ld\n", s, warnpid);
+ 	else
+ 		printf("\n%s\n", s);
- 	printf("\n%s\n", s);
  }
  void
  warningat(char *s, int l) { /* ditto with line number. */
+ 	/* use alloca to call warning so one does not have to remember to set two breakpoints... */
- #if 0
- 	printf("\n%s %d\n", s, l);
- #else /* use alloca to call warning so one does not have to remember to set two breakpoints... */
  	char *sl = alloca(strlen(s) + 16);
  	sprintf(sl, "%s %d", s, l);
  	warning(sl);
- #endif
  }
  #pragma auto_inline on
  
  void
+ invalidCompactClassError(char *s) { /* Print a (compact) class index error message and exit. */
+ #if SPURVM
+ 	printf("\nClass %s does not have the required class index\n", s);
+ #else
- invalidCompactClassError(char *s) { /* Print a compact class index error message and exit. */
  	printf("\nClass %s does not have the required compact class index\n", s);
+ #endif
  	exit(-1);
  }
  
  /*
   * Define sigsetjmp and siglongjmp to be the most minimal setjmp/longjmp available on the platform.
   */
  #if WIN32
  # define sigsetjmp(jb,ssmf) setjmp(jb)
  # define siglongjmp(jb,v) longjmp(jb,v)
  #else
  # define sigsetjmp(jb,ssmf) _setjmp(jb)
  # define siglongjmp(jb,v) _longjmp(jb,v)
  #endif
  '!



More information about the Vm-dev mailing list