Eliot Miranda uploaded a new version of VMMaker to project VM Maker: http://source.squeak.org/VMMaker/VMMaker.oscog-eem.198.mcz
==================== Summary ====================
Name: VMMaker.oscog-eem.198 Author: eem Time: 10 August 2012, 1:58:46.571 pm UUID: 03c8603b-bb83-42f6-8e04-a161f808aace Ancestors: VMMaker.oscog-lw.197
Make overflowing the youngReferrers list a hard error (appears to happen quite often in Newspeak code). Clarify remapNSIfObjectRef:pc:hasYoung:.
=============== Diff against VMMaker.oscog-lw.197 ===============
Item was changed: ----- Method: CogMethodZone>>addToYoungReferrers: (in category 'young referers') ----- addToYoungReferrers: cogMethod <var: #cogMethod type: #'CogMethod *'> self assert: youngReferrers <= limitAddress. - self assert: self roomOnYoungReferrersList. self assert: (self occurrencesInYoungReferrers: cogMethod) = 0. self assert: cogMethod cmRefersToYoung. + (self asserta: self roomOnYoungReferrersList) ifFalse: + [self error: 'no room on youngReferrers list']. youngReferrers := youngReferrers - BytesPerWord. objectMemory longAt: youngReferrers put: cogMethod asUnsignedInteger!
Item was changed: ----- Method: Cogit>>remapNSIfObjectRef:pc:hasYoung: (in category 'garbage collection') ----- remapNSIfObjectRef: annotation pc: mcpc hasYoung: hasYoungPtr <option: #NewspeakVM> <var: #mcpc type: #'char *'> <var: #targetMethod type: #'CogMethod *'> annotation = IsObjectReference ifTrue: [| literal mappedLiteral | literal := backEnd literalBeforeFollowingAddress: mcpc asInteger. (objectRepresentation couldBeObject: literal) ifTrue: [mappedLiteral := objectMemory remap: literal. literal ~= mappedLiteral ifTrue: [backEnd storeLiteral: mappedLiteral beforeFollowingAddress: mcpc asInteger. codeModified := true]. (hasYoungPtr ~= 0 and: [objectMemory isYoung: mappedLiteral]) ifTrue: [(self cCoerceSimple: hasYoungPtr to: #'sqInt *') at: 0 put: true]]]. (self isSendAnnotation: annotation) ifTrue: [| cacheTag mappedCacheTag entryPoint | cacheTag := backEnd inlineCacheTagAt: mcpc asInteger. (objectRepresentation couldBeObject: cacheTag) ifTrue: [mappedCacheTag := objectMemory remap: cacheTag. cacheTag ~= mappedCacheTag ifTrue: [backEnd rewriteInlineCacheTag: mappedCacheTag at: mcpc asInteger. codeModified := true]. (hasYoungPtr ~= 0 and: [objectMemory isYoung: mappedCacheTag]) ifTrue: [(self cCoerceSimple: hasYoungPtr to: #'sqInt *') at: 0 put: true]]. entryPoint := backEnd callTargetFromReturnAddress: mcpc asInteger. + entryPoint = ceImplicitReceiverTrampoline + ifTrue: + [| pc oop mappedOop | + pc := mcpc asInteger + backEnd jumpShortByteSize. - entryPoint = ceImplicitReceiverTrampoline ifTrue: - [| pc oop mappedOop | - pc := mcpc asInteger + backEnd jumpShortByteSize. - (oop := backEnd unalignedLongAt: pc) ~= 0 ifTrue: - [mappedOop := objectMemory remap: oop. - mappedOop ~= oop ifTrue: - [backEnd unalignedLongAt: pc put: mappedOop]. - (hasYoungPtr ~= 0 - and: [objectMemory isYoung: mappedOop]) ifTrue: - [(self cCoerceSimple: hasYoungPtr to: #'sqInt *') at: 0 put: true]. - pc := mcpc asInteger + backEnd jumpShortByteSize + BytesPerOop. (oop := backEnd unalignedLongAt: pc) ~= 0 ifTrue: [mappedOop := objectMemory remap: oop. mappedOop ~= oop ifTrue: [backEnd unalignedLongAt: pc put: mappedOop]. + (hasYoungPtr ~= 0 + and: [objectMemory isYoung: mappedOop]) ifTrue: + [(self cCoerceSimple: hasYoungPtr to: #'sqInt *') at: 0 put: true]. + pc := mcpc asInteger + backEnd jumpShortByteSize + BytesPerOop. + (oop := backEnd unalignedLongAt: pc) ~= 0 ifTrue: + [mappedOop := objectMemory remap: oop. + mappedOop ~= oop ifTrue: + [backEnd unalignedLongAt: pc put: mappedOop]. + (hasYoungPtr ~= 0 + and: [objectMemory isYoung: mappedOop]) ifTrue: + [(self cCoerceSimple: hasYoungPtr to: #'sqInt *') at: 0 put: true]]]] + ifFalse: + [hasYoungPtr ~= 0 ifTrue: + [| offset targetMethod | + "Since the unlinking routines may rewrite the cacheTag to the send's selector, and + since they don't have the cogMethod to hand and can't add it to youngReferrers, + the method must remain in youngReferrers if the targetMethod's selector is young." + entryPoint > methodZoneBase ifTrue: "It's a linked send." + [offset := (entryPoint bitAnd: entryPointMask) = checkedEntryAlignment + ifTrue: [cmEntryOffset] + ifFalse: [cmNoCheckEntryOffset]. + targetMethod := self cCoerceSimple: entryPoint - offset to: #'CogMethod *'. + (objectMemory isYoung: targetMethod selector) ifTrue: + [(self cCoerceSimple: hasYoungPtr to: #'sqInt *') at: 0 put: true]]]]]. - (hasYoungPtr ~= 0 - and: [objectMemory isYoung: mappedOop]) ifTrue: - [(self cCoerceSimple: hasYoungPtr to: #'sqInt *') at: 0 put: true]]]]. - hasYoungPtr ~= 0 ifTrue: - [| offset targetMethod | - "Since the unlinking routines may rewrite the cacheTag to the send's selector, and - since they don't have the cogMethod to hand and can't add it to youngReferrers, - the method must remain in youngReferrers if the targetMethod's selector is young." - entryPoint > methodZoneBase ifTrue: "It's a linked send." - [offset := (entryPoint bitAnd: entryPointMask) = checkedEntryAlignment - ifTrue: [cmEntryOffset] - ifFalse: [cmNoCheckEntryOffset]. - targetMethod := self cCoerceSimple: entryPoint - offset to: #'CogMethod *'. - (objectMemory isYoung: targetMethod selector) ifTrue: - [(self cCoerceSimple: hasYoungPtr to: #'sqInt *') at: 0 put: true]]]]. ^0 "keep scanning"!
vm-dev@lists.squeakfoundation.org