[Vm-dev] VM Maker: VMMaker-dtl.175.mcz
squeak-dev-noreply at lists.squeakfoundation.org
squeak-dev-noreply at lists.squeakfoundation.org
Wed May 26 02:05:43 UTC 2010
Dave Lewis uploaded a new version of VMMaker to project VM Maker:
http://www.squeaksource.com/VMMaker/VMMaker-dtl.175.mcz
==================== Summary ====================
Name: VMMaker-dtl.175
Author: dtl
Time: 25 May 2010, 8:01:19 am
UUID: e948f35c-c90f-44e1-8f83-29db7c31d3b3
Ancestors: VMMaker-dtl.174
VMMaker 4.2.2
Reference Mantis 7473: VM changes for better finalization support
Add Igor's VM changes to support better finalization (weak-finalizers-VM.1.cs merged with Alien support updates).
Expand special object array with slots needed for Alien as well as for new finalization support. The new entries in ObjectMemory class>>initializeSpecialObjectIndices are:
SelectorAttemptToAssign := 50.
"PrimErrTableIndex := 51. in Interpreter class>>initializePrimitiveErrorCodes"
ClassAlien := 52.
InvokeCallbackSelector := 53.
ClassUnsafeAlien := 54.
ClassWeakFinalizer := 55
=============== Diff against VMMaker-dtl.174 ===============
Item was added:
+ ----- Method: ObjectMemory>>weakFinalizerCheck: (in category 'finalization') -----
+ weakFinalizerCheck: oop
+ "Our oop has at least 2 non-weak fixed slots (this is assured before entering this method, in
+ #finalizeReference:.
+ We are assuming that if its first non-weak field is an instance of WeakFinalizer class,
+ then we should add this oop to that list, by storing it to list's first field and
+ also, updating the oop's 2nd fixed slot to point to the value which we overridden:
+
+ list := oop instVarAt: 1.
+ list class == WeakFinalizer ifTrue: [
+ first := list instVarAt: 1.
+ oop instVarAt: 2 put: first.
+ list instVarAt: 1 put: oop ] "
+
+ | listOop listItemOop |
+ self inline: true.
+
+ listOop := self fetchPointer: 0 ofObject: oop.
+ (self fetchClassOf: listOop) == (self splObj: ClassWeakFinalizer) ifTrue: [
+ listItemOop := self fetchPointer: 0 ofObject: listOop.
+ self storePointer: 1 ofObject: oop withValue: listItemOop.
+ self storePointer: 0 ofObject: listOop withValue: oop.
+ ].
+ !
Item was changed:
(excessive method size, no diff calculated)
Item was changed:
----- Method: ObjectMemory>>finalizeReference: (in category 'finalization') -----
finalizeReference: oop
"During sweep phase we have encountered a weak reference.
Check if its object has gone away (or is about to) and if so, signal a
semaphore. "
"Do *not* inline this in sweepPhase - it is quite an unlikely
case to run into a weak reference"
+ | weakOop oopGone chunk firstField lastField nonWeakCnt |
- | weakOop oopGone chunk firstField lastField |
self inline: false.
self var: #oop type: 'usqInt'.
self var: #weakOop type: 'usqInt'.
+ nonWeakCnt := self nonWeakFieldsOf: oop.
+ firstField := self baseHeaderSize + (nonWeakCnt << self shiftForWord).
- firstField := self baseHeaderSize + ((self nonWeakFieldsOf: oop) << self shiftForWord).
lastField := self lastPointerOf: oop.
firstField to: lastField by: self bytesPerWord do: [:i |
weakOop := self longAt: oop + i.
"ar 1/18/2005: Added oop < youngStart test to make sure we're not testing
objects in non-GCable region. This could lead to a forward reference in
old space with the oop pointed to not being marked and thus treated as free."
(weakOop == nilObj or: [(self isIntegerObject: weakOop) or:[weakOop < youngStart]])
ifFalse: ["Check if the object is being collected.
If the weak reference points
* backward: check if the weakOops chunk is free
* forward: check if the weakOoop has been marked by GC"
weakOop < oop
ifTrue: [chunk := self chunkFromOop: weakOop.
oopGone := ((self longAt: chunk) bitAnd: TypeMask) = HeaderTypeFree]
ifFalse: [oopGone := ((self baseHeader: weakOop) bitAnd: self markBit) = 0].
oopGone ifTrue: ["Store nil in the pointer and signal the interpreter "
self longAt: oop + i put: nilObj.
+ nonWeakCnt >= 2 ifTrue: [ self weakFinalizerCheck: oop ].
self signalFinalization: oop]]]!
Item was changed:
----- Method: ObjectMemory class>>initializeSpecialObjectIndices (in category 'initialization') -----
initializeSpecialObjectIndices
"Initialize indices into specialObjects array."
NilObject := 0.
FalseObject := 1.
TrueObject := 2.
SchedulerAssociation := 3.
ClassBitmap := 4.
ClassInteger := 5.
ClassString := 6.
ClassArray := 7.
"SmalltalkDictionary := 8." "Do not delete!!"
ClassFloat := 9.
ClassMethodContext := 10.
ClassBlockContext := 11.
ClassPoint := 12.
ClassLargePositiveInteger := 13.
TheDisplay := 14.
ClassMessage := 15.
ClassCompiledMethod := 16.
TheLowSpaceSemaphore := 17.
ClassSemaphore := 18.
ClassCharacter := 19.
SelectorDoesNotUnderstand := 20.
SelectorCannotReturn := 21.
ProcessSignalingLowSpace := 22. "was TheInputSemaphore"
SpecialSelectors := 23.
CharacterTable := 24.
SelectorMustBeBoolean := 25.
ClassByteArray := 26.
ClassProcess := 27.
CompactClasses := 28.
TheTimerSemaphore := 29.
TheInterruptSemaphore := 30.
SelectorCannotInterpret := 34.
"Was MethodContextProto := 35."
ClassBlockClosure := 36.
"Was BlockContextProto := 37."
ExternalObjectsArray := 38.
ClassPseudoContext := 39.
ClassTranslatedMethod := 40.
TheFinalizationSemaphore := 41.
ClassLargeNegativeInteger := 42.
ClassExternalAddress := 43.
ClassExternalStructure := 44.
ClassExternalData := 45.
ClassExternalFunction := 46.
ClassExternalLibrary := 47.
SelectorAboutToReturn := 48.
SelectorRunWithIn := 49.
+ SelectorAttemptToAssign := 50.
+
+ "PrimErrTableIndex := 51. in Interpreter class>>initializePrimitiveErrorCodes"
+
+ ClassAlien := 52.
+ InvokeCallbackSelector := 53.
+ ClassUnsafeAlien := 54.
+
+ ClassWeakFinalizer := 55
!
Item was changed:
----- Method: VMMaker class>>versionString (in category 'version testing') -----
versionString
"VMMaker versionString"
+ ^'4.2.2'!
- ^'4.2.1'!
More information about the Vm-dev
mailing list