A new version of Environments was added to project The Inbox:
http://source.squeak.org/inbox/Environments-cwp.41.mcz ==================== Summary ==================== Name: Environments-cwp.41 Author: cwp Time: 1 January 2014, 1:10:00.935 pm UUID: 773b58d5-3b62-45ef-9176-c6e5b6a5dddb Ancestors: Environments-ul.40 Rewrite import/export to be eager, rather than lazy. (step 1 of 3) =============== Diff against Environments-ul.40 =============== Item was added: + ----- Method: Binding>>source (in category 'as yet unclassified') ----- + source + ^ self! Item was changed: Object subclass: #BindingPolicy + instanceVariableNames: 'namespace policy next environment addSelector removeSelector' - instanceVariableNames: 'namespace policy next' classVariableNames: '' poolDictionaries: '' category: 'Environments-Policies'! Item was added: + ----- Method: BindingPolicy class>>environment:policy:addSelector:removeSelector: (in category 'as yet unclassified') ----- + environment: anEnvironment policy: aNamePolicy addSelector: addSelector removeSelector: removeSelector + ^ self basicNew + initializeWithEnvironment: anEnvironment + policy: aNamePolicy + addSelector: addSelector + removeSelector: removeSelector! Item was added: + ----- Method: BindingPolicy>>binding:addedTo:notify: (in category 'events') ----- + binding: aBinding addedTo: anEnvironment notify: anObject + environment == anEnvironment ifTrue: + [policy name: aBinding key do: + [:name || binding | + binding := aBinding asBinding: name. + anObject perform: addSelector with: binding]]. + ! Item was added: + ----- Method: BindingPolicy>>binding:removedFrom:notify: (in category 'events') ----- + binding: aBinding removedFrom: anEnvironment notify: anObject + environment == anEnvironment ifTrue: + [policy name: aBinding key do: + [:name || binding | + binding := aBinding asBinding: name. + anObject perform: removeSelector with: binding]]. + ! Item was added: + ----- Method: BindingPolicy>>initializeWithEnvironment:policy:addSelector:removeSelector: (in category 'initialize-release') ----- + initializeWithEnvironment: anEnvironment + policy: aNamePolicy + addSelector: aSelector + removeSelector: rSelector + self initialize. + environment := anEnvironment. + policy := aNamePolicy. + addSelector := aSelector. + removeSelector := rSelector! Item was changed: Object subclass: #Environment + instanceVariableNames: 'info imports exports declarations references public undeclared bindings policies observers' - instanceVariableNames: 'info imports exports declarations references public undeclared' classVariableNames: 'Default Instances' poolDictionaries: '' category: 'Environments-Core'! !Environment commentStamp: 'cmm 12/20/2013 14:10' prior: 0! I am a context for compiling methods. I maintain the namespace of classes and global variables that are visible to the methods compiled within me. I have the following instance variables: info <EnvironmentInfo> Metadata about me and the code I contain. imports <Import> Rules for importing globals from other environments. exports <Export> Rules for exposing globals to other environments. declarations <IdentityDictionary> Bindings for globals that have been declared inside me. references <IdentityDictionary> Bindings for globals that are used by methods compiled inside me. public <IdentityDictionary> Bindings for classes that have been declared inside me, and which satisfy the export rules contain in 'exports'. undeclared <Dictionary> Bindings for globals that are used by methods compiled inside me, but which aren't present in 'references' and couldn't be found via the rules in 'imports'.! Item was added: + ----- Method: Environment>>addAllBindings (in category 'updating') ----- + addAllBindings + declarations associationsDo: + [:ea | self binding: ea addedTo: self]! Item was added: + ----- Method: Environment>>addObserver: (in category 'accessing') ----- + addObserver: anObject + observers add: anObject! Item was added: + ----- Method: Environment>>bind:to: (in category 'binding') ----- + bind: aSymbol to: 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. + self binding: binding addedTo: self. + ^anObject + ! Item was added: + ----- Method: Environment>>binding:addedTo: (in category 'updating') ----- + binding: aBinding addedTo: anEnvironment + policies do: + [:ea | ea binding: aBinding addedTo: anEnvironment notify: self]! Item was added: + ----- Method: Environment>>binding:removedFrom: (in category 'updating') ----- + binding: aBinding removedFrom: anEnvironment + policies do: + [:ea | ea binding: aBinding removedFrom: anEnvironment notify: self]! Item was added: + ----- Method: Environment>>declarationOf: (in category 'binding') ----- + declarationOf: aSymbol + ^ declarations bindingOf: aSymbol! Item was added: + ----- Method: Environment>>hideBinding: (in category 'binding') ----- + hideBinding: aBinding + bindings removeKey: aBinding key! Item was changed: ----- Method: Environment>>migrate (in category 'initialize-release') ----- migrate + | newDeclarations source dest index policy | + bindings := IdentityDictionary new. + newDeclarations := IdentityDictionary new. + source := Array new: declarations size. + dest := Array new: declarations size. + index := 1. + declarations associationsDo: + [:ea || binding | + binding := ea key => ea value. + source at: index put: ea. + dest at: index put: binding. + newDeclarations add: binding. + bindings add: binding. + index := index + 1]. + declarations := newDeclarations. + source elementsForwardIdentityTo: dest. + + policy := BindingPolicy + environment: self + policy: AllNamePolicy new + addSelector: #showBinding: + removeSelector: #hideBinding:. + policies := Array with: policy. + + observers := IdentitySet new.. + ! - declarations := declarations. - references := references.! Item was added: + ----- Method: Environment>>notifyObserversOfBindingAdded: (in category 'updating') ----- + notifyObserversOfBindingAdded: aBinding + observers do: [:ea | ea binding: aBinding addedTo: self]! Item was added: + ----- Method: Environment>>notifyObserversOfBindingRemoved: (in category 'updating') ----- + notifyObserversOfBindingRemoved: aBinding + observers do: [:ea | ea binding: aBinding removedFrom: self]! Item was added: + ----- Method: Environment>>purgeUndeclared (in category 'binding') ----- + purgeUndeclared + undeclared removeUnreferencedKeys! Item was added: + ----- Method: Environment>>removeObserver: (in category 'accessing') ----- + removeObserver: anObject + observers remove: anObject! Item was added: + ----- Method: Environment>>showBinding: (in category 'binding') ----- + showBinding: aBinding + | binding | + binding := undeclared associationAt: aBinding key ifAbsent: [nil]. + binding ifNotNil: + [undeclared removeKey: binding key. + binding becomeForward: aBinding]. + + binding := bindings associationAt: aBinding key ifAbsent: [nil]. + binding ifNotNil: + [bindings removeKey: binding key]. + + bindings add: aBinding.! Item was added: + ----- Method: Environment>>undeclare: (in category 'binding') ----- + undeclare: aSymbol + ^ undeclared add: aSymbol => nil! Item was changed: (PackageInfo named: 'Environments') postscript: '"below, add code to be run after the loading of this package" + Smalltalk globals migrate. - | 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. '! |
Free forum by Nabble | Edit this page |