The Trunk: Traits-nice.280.mcz

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
1 message Options
Reply | Threaded
Open this post in threaded view
|

The Trunk: Traits-nice.280.mcz

commits-2
Nicolas Cellier uploaded a new version of Traits to project The Trunk:
http://source.squeak.org/trunk/Traits-nice.280.mcz

==================== Summary ====================

Name: Traits-nice.280
Author: nice
Time: 4 February 2010, 8:21:32.572 pm
UUID: c73f76e5-ba68-4e91-bc27-ef1754513b29
Ancestors: Traits-ar.279

push some temp declarations inside blocks

=============== Diff against Traits-ar.279 ===============

Item was changed:
  ----- Method: Trait classSide>>flattenTraitMethodsInClass: (in category 'load-unload') -----
  flattenTraitMethodsInClass: aClass
  "Flatten all the trait methods in the given class"
+
- | oldClass |
  (aClass isTrait or:[aClass hasTraitComposition]) ifFalse:[^self].
  self storeTraitInfoInClass: aClass.
+ aClass selectorsAndMethodsDo:[:sel :meth| | oldClass |
- aClass selectorsAndMethodsDo:[:sel :meth|
  (aClass includesLocalSelector: sel) ifFalse:[
  oldClass := meth methodHome.
  aClass compile: (aClass sourceCodeAt: sel)
  classified: (aClass organization categoryOfElement: sel)
  withStamp: (oldClass compiledMethodAt: sel ifAbsent:[meth]) timeStamp
  notifying: nil]].
  aClass traitComposition: #().!

Item was changed:
  ----- Method: ClassDescription>>assembleTraitMethodsFrom: (in category '*Traits-NanoKernel') -----
  assembleTraitMethodsFrom: aTraitComposition
  "Assemble the resulting methods for installing the given trait composition.
  Returns a Dictionary instead of a MethodDictionary for speed (MDs grow by #become:)"
+ | methods |
- | methods oldMethod |
  methods := Dictionary new.
  "Stick in the local methods first, since this avoids generating conflict methods unnecessarily"
  self selectorsAndMethodsDo:[:sel :newMethod|
  (self isLocalMethod: newMethod)
  ifTrue:[methods at: sel put:newMethod]].
  "Now assemble the traits methods"
  aTraitComposition do:[:trait|
+ trait selectorsAndMethodsDo:[:sel :newMethod| | oldMethod |
- trait selectorsAndMethodsDo:[:sel :newMethod|
  oldMethod := methods at: sel ifAbsentPut:[newMethod].
  newMethod == oldMethod ifFalse:["a conflict"
  (self isLocalMethod: oldMethod) ifFalse:[
  methods at: sel put: (self resolveTraitsConflict: sel from: oldMethod to: newMethod)]]]].
  ^methods!

Item was changed:
  ----- Method: ClassDescription>>installTraitMethodDict: (in category '*Traits-NanoKernel') -----
  installTraitMethodDict: methods
  "After having assembled the trait composition, install its methods."
+ | oldCategories removals |
- | oldCategories oldMethod removals |
  "Apply the changes. We first add the new or changed methods."
  oldCategories := Set new.
+ methods keysAndValuesDo:[:sel :newMethod| | oldMethod |
- methods keysAndValuesDo:[:sel :newMethod|
  oldMethod := self compiledMethodAt: sel ifAbsent:[nil].
  oldMethod == newMethod ifFalse:[
  self traitAddSelector: sel withMethod: newMethod.
  (self organization categoryOfElement: sel) ifNotNil:[:cat| oldCategories add: cat].
  self organization classify: sel under:
  (newMethod methodHome organization categoryOfElement: newMethod selector)]].
 
  "Now remove the old or obsoleted ones"
  removals := OrderedCollection new.
  self selectorsDo:[:sel| (methods includesKey: sel) ifFalse:[removals add: sel]].
  removals do:[:sel| self traitRemoveSelector: sel].
 
  "Clean out empty categories"
  oldCategories do:[:cat|
  (self organization isEmptyCategoryNamed: cat)
  ifTrue:[self organization removeCategory: cat]].
 
  !

Item was changed:
  ----- Method: ClassDescription>>updateTraitsFrom: (in category '*Traits-NanoKernel') -----
  updateTraitsFrom: instanceTraits
  "ClassTrait/Metaclass only. Update me from the given instance traits"
+ | map newTraits |
- | map newTraits trait |
  self isMeta ifFalse:[self error: 'This is a metaclass operation'].
  map := Dictionary new.
  self traitComposition do:[:composed| map at: composed trait put: composed].
+ newTraits := (instanceTraits collect:[:composed| | trait |
- newTraits := (instanceTraits collect:[:composed|
  trait := composed trait classTrait.
  map at: trait ifAbsent:[trait]]
  ), (self traitComposition select:[:comp| comp trait isBaseTrait]).
 
  self installTraitsFrom: newTraits!

Item was changed:
  ----- Method: Trait classSide>>restoreAllTraits (in category 'load-unload') -----
  restoreAllTraits "Trait restoreAllTraits"
  "Restores traits that had been previously removed.
  This is the inverse operation to removeAllTraits."
+ | classes |
- | classes method |
  classes := Smalltalk allClasses select:[:aClass| aClass includesSelector: #traitInfo].
+ classes do:[:aClass| | method |
- classes do:[:aClass|
  method := aClass compiledMethodAt: #traitInfo.
  (method pragmaAt: #traitDefinition:) ifNotNil:[:pragma|
  pragma arguments first
  ifTrue:[self convertClassToTrait: aClass]].
  ] displayingProgress:[:aClass| 'Creating trait ', aClass name].
  classes := Smalltalk allClassesAndTraits select:[:aClass|
  (aClass includesSelector: #traitInfo)
  or:[aClass classSide includesSelector: #traitInfo]].
  classes do:[:aClass|
  self restoreCompositionOf: aClass.
  self restoreCompositionOf: aClass classSide.
  ] displayingProgress:[:aClass| 'Updating ', aClass name].
  !