[Mono-list] Re: [Mono-bugs] Hi.
Dietmar Maurer
dietmar@ximian.com
12 Jul 2002 08:39:49 +0200
On Fri, 2002-07-12 at 00:34, Daniel Stodden wrote:
> why? removal. consider removing an invocation chain from another. now
> the fun part is that not the first occurence of the list to remove is
> removed but the _last_ occurence.
>
> might have originated at MS from a side effect. but it's documented in
> the class docs nonetheless.
> removals are therefore implemented in mono by reverting the internal
> order for speed. ::Invoke() then recurses depth-first through the chain,
> which gets you back to the expected order during invocation. eats up
> some stack space, but i can't think of a more elegant way.
>
> summary, for a bundle of delegates of type foo(int):
>
> (a + b + c)(42) invokes a -> b -> c.
>
> (a + b + c - b)(42) invokes a -> c.
>
> (a + b + c + a + b - (a + b))(42)
> invokes a -> b -> c, not c -> a -> b.
>
> ever.
>
> i've spent quite some time until i got this right. pleaso drop me a note
> if any problems arise. i remember having checked in unit tests for this,
> though.
Hi Daniel,
I assume I have broken correct behavior, because I have reimplemented
the delegate invoke. The new implementation simply goes through the list
without reverting the order. The new implementation is written in
(architecture independent) IL code, and I want that code to be as simple
as possible (see mono/metadata/marshal.c).
So we can either provide a more complicated implementation of Invoke(),
or we simply put a bit more logic into the removal code. IMO removal is
not speed critical, so i would prefer that. What do you think?
- Dietmar