[squeak-dev] The Inbox: Environments-ul.43.mcz
commits at source.squeak.org
commits at source.squeak.org
Sun Dec 29 21:15:58 UTC 2013
A new version of Environments was added to project The Inbox:
http://source.squeak.org/inbox/Environments-ul.43.mcz
==================== Summary ====================
Name: Environments-ul.43
Author: ul
Time: 29 December 2013, 10:04:32.454 pm
UUID: a91a7c62-f608-48aa-b296-2d541c0083f5
Ancestors: Environments-ul.42
Fixed a typo in the postscript.
=============== Diff against Environments-ul.40 ===============
Item was changed:
----- Method: Environment>>at:ifAbsentPut: (in category 'emulating') -----
at: aSymbol ifAbsentPut: aBlock
+
+ ^declarations
- ^ declarations
at: aSymbol
+ ifAbsent: [ self at: aSymbol put: aBlock value ]!
- ifAbsentPut: aBlock!
Item was changed:
----- Method: Environment>>at:put: (in category 'emulating') -----
at: aSymbol put: anObject
+
+ | binding newBinding |
+ newBinding := aSymbol => anObject.
+ binding := declarations associationAt: aSymbol ifAbsent: [ nil ].
+ binding ifNotNil: [
+ binding class == newBinding class
+ ifTrue: [ binding value: anObject ]
+ ifFalse: [ binding becomeForward: newBinding ].
+ ^anObject ].
+ binding := undeclared associationAt: aSymbol ifAbsent: [ nil ].
+ binding
+ ifNil: [ binding := newBinding ]
+ ifNotNil: [
+ undeclared removeKey: aSymbol.
+ binding class == newBinding class
+ ifTrue: [ binding value: anObject ]
+ ifFalse: [ binding becomeForward: newBinding ] ].
+ declarations add: binding.
+ references add: binding.
+ exports bind: binding. "Do we really want this?"
+ ^anObject
- | binding |
- (declarations includesKey: aSymbol)
- ifTrue: [declarations at: aSymbol put: anObject]
- ifFalse:
- [(undeclared includesKey: aSymbol)
- ifTrue:
- [declarations declare: aSymbol from: undeclared.
- declarations at: aSymbol put: anObject]
- ifFalse:
- [binding := aSymbol => anObject.
- declarations add: binding.
- exports bind: binding]].
- ^ anObject
!
Item was changed:
----- Method: Environment>>removeKey:ifAbsent: (in category 'emulating') -----
removeKey: key ifAbsent: aBlock
+
+ (declarations includesKey: key) ifFalse: [ ^aBlock value ].
+ references removeKey: key ifAbsent: [].
+ public removeKey: key ifAbsent: [].
+ ^declarations removeKey: key!
- self flag: #review.
- ^ declarations removeKey: key ifAbsent: aBlock!
Item was changed:
+ (PackageInfo named: 'Environments') postscript: '| globalsWithMultipleBindings |
+ "Fix exports."
+ Smalltalk globals exports instVarNamed: #namespace put: Smalltalk globals public.
+ "Fix imports."
+ (Smalltalk globals instVarNamed: #imports) instVarNamed: #next put: nil.
+ "Unify globals."
+ globalsWithMultipleBindings := Dictionary new.
+ Binding allSubInstances do: [ :binding |
+ (globalsWithMultipleBindings at: binding key ifAbsentPut: [ IdentitySet new ]) add: binding ].
+ globalsWithMultipleBindings := globalsWithMultipleBindings select: [ :each | each size > 1 ].
+ globalsWithMultipleBindings keysAndValuesDo: [ :name :set |
+ | realBinding |
+ realBinding := Smalltalk associationAt: name ifAbsent: [ nil ].
+ realBinding ifNotNil: [
+ set do: [ :each |
+ each == realBinding ifFalse: [ each becomeForward: realBinding ] ] ] ]'!
- (PackageInfo named: 'Environments') postscript: '"below, add code to be run after the loading of this package"
-
- | allAliases toBeRecompiled undesirableAliases |
-
- "Collect the CompiledMethods pointing to an Alias"
- allAliases := Alias allInstances.
- toBeRecompiled := CompiledMethod allInstances select: [:c | c isInstalled and: [allAliases anySatisfy: [:a | c pointsTo: a]]].
-
- "Collect the Aliases pointing to some class binding in the same Environment with same name"
- undesirableAliases := (Smalltalk globals instVarNamed: ''references'') associations select: [:e |
- e class = Alias and: [e key = e source key
- and: [(Smalltalk globals instVarNamed: ''declarations'') associations includes: e source]]].
-
- "Replace the undesirable Aliases with their source binding"
- undesirableAliases do: [:a | a becomeForward: a source].
-
- "Rehash the references because they pointed to those Aliases - hope there''s nothing else to rehash"
- (Smalltalk globals instVarNamed: ''references'') rehash.
-
- "Recompile the CompiledMethod that used to point to an Alias, because the bytecodes do change"
- Symbol rehash.
- toBeRecompiled do: [:c | c methodClass recompile: c selector].
-
- allAliases := toBeRecompiled := undesirableAliases := nil.
- Smalltalk garbageCollect.
- Alias allInstances size.
- '!
More information about the Squeak-dev
mailing list
|