[squeak-dev] The Inbox: Environments-ul.43.mcz

Levente Uzonyi leves at elte.hu
Sun Dec 29 21:28:14 UTC 2013


I've uploaded this version to the Inbox to let you review it before I push 
it to the Trunk. It fixes the most urgent issues of Environments, but it 
also includes some "radical" changes, and a "high impact" postscript.


Levente

On Sun, 29 Dec 2013, commits at source.squeak.org wrote:

> 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