Comment #0 by verylonglogin.reg — 2013-02-27T01:57:11Z
The idea is to make created delegate data pointer referring to a valid D object just like for class member function.
It will allow passing closure delegate to functions where such objects are expected and controlling/watching delegate lifetime.
Once it will be implemented the only "raw" delegates would be struct member function delegates? which are used rarely and can easily be avoided.
Comment #1 by maxim — 2013-02-27T05:20:41Z
(In reply to comment #0)
> The idea is to make created delegate data pointer referring to a valid D object
> just like for class member function.
>
> It will allow passing closure delegate to functions where such objects are
> expected and controlling/watching delegate lifetime.
>
> Once it will be implemented the only "raw" delegates would be struct member
> function delegates? which are used rarely and can easily be avoided.
Please elaborate on "to make created delegate data pointer referring to a valid D object just like for class member function". I see no point here since it is always possible to do:
delegate dg = ...;
dg.ptr = whatever is valid - class for member-function, frame for non-member one
dg()
Comment #2 by verylonglogin.reg — 2013-02-27T08:51:10Z
(In reply to comment #1)
> Please elaborate on "to make created delegate data pointer referring to a valid
> D object just like for class member function".
As it looks like a proper way to allow "controlling/watching delegate lifetime" as I wrote. And such ability is essential to fix e.g. Phobos Issue 9603 and make a small but fundamental step forward to working signals in D. Also see Issue 9602.
> I see no point here since it is
> always possible to do:
>
> delegate dg = ...;
> dg.ptr = whatever is valid - class for member-function, frame for non-member
> one
> dg()
I do not understand you example at all.
Comment #3 by maxim — 2013-02-27T08:57:01Z
(In reply to comment #2)
> (In reply to comment #1)
> > Please elaborate on "to make created delegate data pointer referring to a valid
> > D object just like for class member function".
>
> As it looks like a proper way to allow "controlling/watching delegate lifetime"
> as I wrote. And such ability is essential to fix e.g. Phobos Issue 9603 and
> make a small but fundamental step forward to working signals in D. Also see
> Issue 9602.
>
You probably mean data pointer of delegate since delegate does not have lifetime. Still do not understand what exactly you are proposing.
Comment #4 by maxim — 2013-02-27T09:05:30Z
(In reply to comment #0)
> The idea is to make created delegate data pointer referring to a valid D object
> just like for class member function.
Since creation delegate data pointer points to valid memory forgetting about tricks to deliberatly break it. Problem may come when i.e. class destructor references such object which was collected already by GC. But pointer should be reset to null. This actually is a problem of class destructor synchronizing. Are you targeting at this problem?
> It will allow passing closure delegate to functions where such objects are
> expected and controlling/watching delegate lifetime.
How do you suggest to pass information within delegate about data lifetime? Or what mechanism (in addition to GC) would ensure that?
> Once it will be implemented the only "raw" delegates would be struct member
> function delegates? which are used rarely and can easily be avoided.
If such delegate references this struct pointer it may lead to trouble. Otherwise what is specific to struct delegates?
Comment #5 by verylonglogin.reg — 2013-02-27T09:09:50Z
(In reply to comment #3)
> You probably mean data pointer of delegate since delegate does not have
> lifetime.
I propose to define an "object" delegate's lifetime to be its data pointer lifetime.
> Still do not understand what exactly you are proposing.
OK. I added an example, see Comment 2 Issue 9603.
Comment #6 by verylonglogin.reg — 2013-02-27T09:21:58Z
(In reply to comment #4)
> (In reply to comment #0)
> > The idea is to make created delegate data pointer referring to a valid D object
> > just like for class member function.
>
> Since creation delegate data pointer points to valid memory forgetting about
> tricks to deliberatly break it. Problem may come when i.e. class destructor
> references such object which was collected already by GC. But pointer should be
> reset to null. This actually is a problem of class destructor synchronizing.
> Are you targeting at this problem?
No. I'm targeting the problem when delegate's outer scope is destroyed and the problem of determining that the delegate will live "forever" (no "destroyable" outer scope). See example suggested in my previous post.
> > It will allow passing closure delegate to functions where such objects are
> > expected and controlling/watching delegate lifetime.
>
> How do you suggest to pass information within delegate about data lifetime? Or
> what mechanism (in addition to GC) would ensure that?
This is trivial. When creating a closure allocate a special D class instead, that's all. I.e. add a few hidden D object fields before closure data. We will have something like member function delegate then.
> > Once it will be implemented the only "raw" delegates would be struct member
> > function delegates? which are used rarely and can easily be avoided.
>
> If such delegate references this struct pointer it may lead to trouble.
> Otherwise what is specific to struct delegates?
Yes, struct pointer delegates will still be troubles unless D struct will contain regular D object hidden fields defining it being a "struct object". I see no good solution for this problem now. But as I have never meet with such difficulties I don't think it is near as high priority issue as closure delegates.
Comment #7 by maxim — 2013-02-27T09:37:52Z
(In reply to comment #6)
> (In reply to comment #4)
> > (In reply to comment #0)
> > > The idea is to make created delegate data pointer referring to a valid D object
> > > just like for class member function.
> >
> > Since creation delegate data pointer points to valid memory forgetting about
> > tricks to deliberatly break it. Problem may come when i.e. class destructor
> > references such object which was collected already by GC. But pointer should be
> > reset to null. This actually is a problem of class destructor synchronizing.
> > Are you targeting at this problem?
>
> No. I'm targeting the problem when delegate's outer scope is destroyed and the
> problem of determining that the delegate will live "forever" (no "destroyable"
> outer scope). See example suggested in my previous post.
I see. This should have been clarified in the very first comment.
> > > Once it will be implemented the only "raw" delegates would be struct member
> > > function delegates? which are used rarely and can easily be avoided.
> >
> > If such delegate references this struct pointer it may lead to trouble.
> > Otherwise what is specific to struct delegates?
>
> Yes, struct pointer delegates will still be troubles unless D struct will
> contain regular D object hidden fields defining it being a "struct object". I
> see no good solution for this problem now. But as I have never meet with such
> difficulties I don't think it is near as high priority issue as closure
> delegates.
Actually there is issue 9352.
Comment #8 by robert.schadek — 2024-12-13T18:04:14Z