[squeak-dev] The Trunk: Traits-ar.283.mcz
commits at source.squeak.org
commits at source.squeak.org
Thu Mar 11 16:52:19 UTC 2010
Andreas Raab uploaded a new version of Traits to project The Trunk:
http://source.squeak.org/trunk/Traits-ar.283.mcz
==================== Summary ====================
Name: Traits-ar.283
Author: ar
Time: 11 March 2010, 8:51:35.08 am
UUID: 68a46760-cb16-874a-a84d-2ac3da946f79
Ancestors: Traits-ar.282
Fix SystemChangeNotification for traits.
NB, SystemNotification is broken: It requires passing in *both* old and new class/trait verbatim even though they cannot both exist at the same time and even though copying is not desirable (for the current trait implementation copying would mean recompiling all methods). So we pass in a shallowCopy to avoid excessive recompilation but of course if a client ever looks deeply inside it it will quickly find that it's not a copy. This should be fixed by passing a description of some sort (similar to MCClassDefinition) or specifically the values that were changed.
=============== Diff against Traits-ar.282 ===============
Item was changed:
----- Method: ClassTrait>>uses: (in category 'initialize') -----
uses: aTraitComposition
+ | newTraits copyOfOldTrait |
+ copyOfOldTrait := self shallowCopy.
- | newTraits |
newTraits := aTraitComposition asTraitComposition.
newTraits traitsDo:[:t|
(t isBaseTrait and:[t classSide hasMethods])
ifTrue:[self error: 'Cannot add: ', t].
(t isClassTrait and:[(baseTrait includesTrait: t baseTrait) not])
ifTrue:[self error: 'Cannot add: ', t].
].
+ self installTraitsFrom: newTraits.
+ SystemChangeNotifier uniqueInstance
+ traitDefinitionChangedFrom: copyOfOldTrait to: self.!
- self installTraitsFrom: newTraits.!
Item was changed:
----- Method: Trait classSide>>named:uses:category:env: (in category 'instance creation') -----
named: aSymbol uses: aTraitComposition category: aString env: anEnvironment
+ | trait oldTrait systemCategory |
- | trait oldTrait systemCategory oldCategory |
systemCategory := aString asSymbol.
+ trait := anEnvironment at: aSymbol ifAbsent: [nil].
+ (trait == nil or:[trait isMemberOf: Trait]) ifFalse: [
- oldTrait := anEnvironment at: aSymbol ifAbsent: [nil].
- oldTrait ifNil:[
- trait := Trait new.
- ] ifNotNil:[
- oldCategory := oldTrait category.
- trait := oldTrait.
- ].
- (trait isMemberOf: Trait) ifFalse: [
^self error: trait name , ' is not a Trait'].
+
+ oldTrait := trait shallowCopy.
+ trait ifNil:[trait := Trait new].
+
trait
setName: aSymbol
andRegisterInCategory: systemCategory
environment: anEnvironment.
trait uses: aTraitComposition.
"... notify interested clients ..."
oldTrait ifNil:[
SystemChangeNotifier uniqueInstance classAdded: trait inCategory: systemCategory.
] ifNotNil:[
+ SystemChangeNotifier uniqueInstance traitDefinitionChangedFrom: oldTrait to: trait.
+ systemCategory = oldTrait category ifFalse:[
- systemCategory = oldCategory ifFalse:[
SystemChangeNotifier uniqueInstance class: trait
recategorizedFrom: oldTrait category to: systemCategory].
].
^ trait!
More information about the Squeak-dev
mailing list
|