> Indeed. And this is not different from changing a layout of a class having as > impact that you have to update the methods. > The default traits implementation already recompiles all methods anyway > whenever it installs the trait. What I do is, I just let the trait compile > itself on the subpart of the class that originally defined the trait.
allMethods from where? > Since this subpart is a copy of the original trait (just like the default > traits does), it also has a COPY of the original layout. In this copy, the > indices of the slots are updated when they are mixed with the class that is > going to use the trait. So it's being compiled in the scope of the installed > version of the trait-layout. So that easily works. Yes, no big challenge to make it work. I agree. Put a ref to copydown, from strongtalk. Cheers, Alexandre > > cheers >> On 3 Apr 2011, at 06:23, Toon Verwaest wrote: >> >>>> How are you dealing with the fact that the application of trait with state >>>> may change the layout of the class user and that you should recompile >>>> all the class method to deal with that. And if you have two traits having >>>> state you should do the same but for the traits themselves. >>>> So this means that the method in the traits cannot be reused (ok now we do >>>> not reuse them anymore sniff it was a nice model - reuse without cost of >>>> duplication). >>>> >>>> How your layout object helps you for that? >>>> This is why I want first class slot :) >>>> >>>> Stef >>> I don't think I fully understand what you are saying... >>> >>> The model is like this at the moment: >>> >>> Every class has a layout attached to it. Layouts that have slots have >>> LayoutScopes. For example, if you have >>> >>> Class A super: Object slots: #(a b c) >>> Class B super: A slots: #(d e) >>> >>> Then you get >>> >>> Class A<-> PointerLayout -> LayoutClassScope #(a b c) -> >>> LayoutClassScope #() -> LayoutEmptyScope >>> Class B<-> PointerLayout -> LayoutClassScope #(d e) -> LayoutClassScope >>> #(a b c) -> LayoutClassScope #() -> LayoutEmptyScope >>> >>> where LayoutClassScope #(a b c) is shared between the scope of B and the >>> layout of A. The empty LayoutClassScope comes from Object and is shared as >>> well. >>> >>> Now if you get a stateful trait, a stateful trait C with slots #(f) looks >>> like this: >>> >>> StatefulTrait C<-> PointerLayout -> LayoutTraitScope #(f) -> >>> LayoutEmptyScope >>> >>> If you were to install the trait C on B, it would become: >>> >>> Class B<-> PointerLayout -> LayoutClassScope #(d e) -> LayoutForkScope >>> -> LayoutClassScope #(a b c) -> LayoutClassScope #() -> LayoutEmptyScope >>> >>> where the LayoutForkScope would have sidescopes: >>> LayoutForkScope sideScopes: { LayoutTraitScope #(f) -> LayoutEmptyScope } >>> >>> Then the classbuilder will build classes by always following the public >>> path. Sidescopes aren't public. When you compile methods on the trait, its >>> scopes are public; but when they are installed, they aren't public since >>> they are sidescopes. >>> >>> However, every method is compiled on the trait or class that provided the >>> selector, so when you install the trait-related method, it will see the >>> state related to the trait. And when the trait is installed, the sidescopes >>> are actually copies of the original traitscope, so the actual fieldindices >>> are updated in the LayoutTraitScope when it's installed. >>> >>> Then how methods get updated based on state changes is at the moment >>> completely unrelated to the trait implementation, since methods are already >>> updated in my class builder based on a MethodModificationModel that knows >>> how the fields have changed. This will use the decompiler/bytecode >>> modification/recompiler to update the methods in place. >>> >>> The only thing that I forgot to do until now is to actually modify all the >>> classes that use a trait, every time the state of a trait changes... But >>> that's straightforward. We just have to ask for the users of the stateful >>> trait and reapply their class modification. That's all nicely modeled >>> already. >>> >>> As for overlapping state from multiple stateful traits.... there is no >>> overlapping state since all state is private to the trait! You can use 2 >>> traits with same slot names. This is no problem at all since the state is >>> only seen by that trait. And their methods are only compiled on that trait, >>> so the methods will always know exactly which of the slots you are >>> referring to. >>> >>> I hope this helps somehow :) Otherwise ... wait for the paper ;) >>> >>> cheers, >>> Toon >>> > > -- _,.;:~^~:;._,.;:~^~:;._,.;:~^~:;._,.;:~^~:;._,.;: Alexandre Bergel http://www.bergel.eu ^~:;._,.;:~^~:;._,.;:~^~:;._,.;:~^~:;._,.;:~^~:;.