[Pkg] The Trunk: Environments-cwp.41.mcz

commits at source.squeak.org commits at source.squeak.org
Fri Jan 3 20:25:52 UTC 2014


Colin Putney uploaded a new version of Environments to project The Trunk:
http://source.squeak.org/trunk/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.
  '!



More information about the Packages mailing list