[squeak-dev] The Trunk: Traits-nice.299.mcz

Chris Muller asqueaker at gmail.com
Sat Sep 21 20:52:12 UTC 2013


I was too afraid to update my image because I need stability at the
moment so I haven't tested or reviewed it closely yet.

What's got me confused is that we've just changed some age-old API's
because, suddenly, after all these years, someone decided it wasn't
the Compiler's responsibility to classify..?  To compile something we
have to specify the Class to compile it in, and all classes have
categories / protocols, so isn't it convenient to do that during
compilation?  What is responsible for classifying now and what is the
new API for code-generators to classify the methods they generate?

On Sat, Sep 21, 2013 at 2:52 PM, Nicolas Cellier
<nicolas.cellier.aka.nice at gmail.com> wrote:
> Please send reports, I'm all ear.
> Though I'm not aware of any raised: no sender no implementor in my image.
> Or is it raised ? It's a Morph thing...
>
>
> 2013/9/21 Frank Shearar <frank.shearar at gmail.com>
>>
>> For instance: http://build.squeak.org/job/SqueakTrunk/536/console
>>
>> Look for
>>
>> Exception MessageNotUnderstood raised:
>> Behavior class>>compile:notifying:trailer:ifFail:
>>
>> I don't know where it's coming from yet - that's the entire stack trace.
>>
>> frank
>>
>>
>> On 21 September 2013 18:17, Chris Muller <asqueaker at gmail.com> wrote:
>> > I would expect these changes to break a lot of code..
>> >
>> > On Fri, Sep 20, 2013 at 2:45 PM,  <commits at source.squeak.org> wrote:
>> >> Nicolas Cellier uploaded a new version of Traits to project The Trunk:
>> >> http://source.squeak.org/trunk/Traits-nice.299.mcz
>> >>
>> >> ==================== Summary ====================
>> >>
>> >> Name: Traits-nice.299
>> >> Author: nice
>> >> Time: 20 September 2013, 9:45:04.474 pm
>> >> UUID: d6c18da8-7e93-4bcc-b94e-7f67426a2965
>> >> Ancestors: Traits-nice.298
>> >>
>> >> Don't pass a category to a Compiler, classifying is not its job.
>> >>
>> >> =============== Diff against Traits-nice.298 ===============
>> >>
>> >> Item was changed:
>> >>   ----- Method: ClassDescription>>traitAddSelector:withMethod: (in
>> >> category '*Traits-NanoKernel') -----
>> >>   traitAddSelector: selector withMethod: traitMethod
>> >>         "Add a method inherited from a trait.
>> >>         Recompiles to avoid sharing and implement aliasing."
>> >>         | oldMethod source methodNode newMethod originalSelector |
>> >>         oldMethod := self compiledMethodAt: selector ifAbsent:[nil].
>> >>         oldMethod ifNotNil:[
>> >>                 "The following is an important optimization as it
>> >> prevents exponential
>> >>                 growth in recompilation. If T1 is used by T2 and T2 by
>> >> T3 then (without
>> >>                 this optimization) any change in T1 would cause all
>> >> methods in T2 to be
>> >>                 recompiled and each recompilation of a method in T2
>> >> would cause T3
>> >>                 to be fully recompiled. The test eliminates all such
>> >> situations."
>> >>                 (oldMethod sameTraitCodeAs: traitMethod)
>> >> ifTrue:[^oldMethod].
>> >>         ].
>> >>         originalSelector := traitMethod selector.
>> >>         source := traitMethod methodClass sourceCodeAt:
>> >> originalSelector.
>> >>         originalSelector == selector ifFalse:[
>> >>                 "Replace source selectors for aliases"
>> >>                 source := self replaceSelector: originalSelector
>> >> withAlias: selector in: source.
>> >>         ].
>> >>         methodNode := self newCompiler
>> >> +               compile: source in: self notifying: nil ifFail:[^nil].
>> >> -               compile: source in: self classified: nil notifying: nil
>> >> ifFail:[^nil].
>> >>         newMethod := methodNode generate: self defaultMethodTrailer.
>> >>         newMethod putSource: source fromParseNode: methodNode inFile: 2
>> >>                 withPreamble: [:f | f cr; nextPut: $!!; nextChunkPut:
>> >> 'Trait method'; cr].
>> >>         newMethod originalTraitMethod: traitMethod.
>> >>         ^super addSelectorSilently: selector withMethod: newMethod.!
>> >>
>> >>
>> >
>>
>
>
>
>


More information about the Squeak-dev mailing list