[Vm-dev] VM Maker: VMMaker.oscog-eem.825.mcz
commits at source.squeak.org
commits at source.squeak.org
Sat Jul 19 00:15:03 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, 5:11:54.902 pm
UUID: 878e9947-131b-4e62-9126-37e8f11f4b2b
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