No registered users in community xowiki
in last 10 minutes
in last 10 minutes
Re: [Xotcl] Issue with mixin delete
From: Gustaf Neumann <neumann_at_wu-wien.ac.at>
Date: Mon, 08 May 2006 22:15:41 +0200
> BTW, this will happen with any method, not just "destroy".
>
i know.
>
> Is it not considered acceptable to ever remove a mixin class?
>
> When is it valid to remove a mixin if removing it corrupts the method
> chaining?
>
removing a mixin class from the mixin list does not "corrupt" the chain
in the sense that there
is a memory corruption etc. The current implementation does not allow to
remove
***active*** mixin classes, this are the classes of which the method is
currently executing.
what does this mean, assume there are classes M1, M2, M3, all of the form
Class M2
M2 instproc foo {} {
BEFORE
next
AFTER
}
Object o -mixin {M1 M2 M3}
when method foo of M2 is called, M2 is the active call. If between the
invocation
of foo of M2 and "next" the mixin class M2 is removed for o, "next" has the
problem to find the continuation (next searches the current mixin
classes of o
for the currently executing Class). If this class is not found (your
example),
the list is searched to the end and no other Mixin classes are searched.
So, the only restriction is that you are not allowed to remove the mixin
from o
in the BEFORE part of M2. If you remove M2 from the BEFORE part of
M1, there won't be a problem, since foo of M2 won't be called. If you remove
M2 in AFTER of M2 foo, there would not be a problem either, since "next"
was alreday executed.
It looks quite easy to give a reasonable error message, when the
currently active
mixin class is deleted, it will be more expensive to handle this problem in
a friendly way.
Hope, this explains, what is happening.
-gustaf
PS: wouln't be conditional mixins a solution for your problem?
Date: Mon, 08 May 2006 22:15:41 +0200
> BTW, this will happen with any method, not just "destroy".
>
i know.
>
> Is it not considered acceptable to ever remove a mixin class?
>
> When is it valid to remove a mixin if removing it corrupts the method
> chaining?
>
removing a mixin class from the mixin list does not "corrupt" the chain
in the sense that there
is a memory corruption etc. The current implementation does not allow to
remove
***active*** mixin classes, this are the classes of which the method is
currently executing.
what does this mean, assume there are classes M1, M2, M3, all of the form
Class M2
M2 instproc foo {} {
BEFORE
next
AFTER
}
Object o -mixin {M1 M2 M3}
when method foo of M2 is called, M2 is the active call. If between the
invocation
of foo of M2 and "next" the mixin class M2 is removed for o, "next" has the
problem to find the continuation (next searches the current mixin
classes of o
for the currently executing Class). If this class is not found (your
example),
the list is searched to the end and no other Mixin classes are searched.
So, the only restriction is that you are not allowed to remove the mixin
from o
in the BEFORE part of M2. If you remove M2 from the BEFORE part of
M1, there won't be a problem, since foo of M2 won't be called. If you remove
M2 in AFTER of M2 foo, there would not be a problem either, since "next"
was alreday executed.
It looks quite easy to give a reasonable error message, when the
currently active
mixin class is deleted, it will be more expensive to handle this problem in
a friendly way.
Hope, this explains, what is happening.
-gustaf
PS: wouln't be conditional mixins a solution for your problem?