Thread overview
Internal delegate and Stack Overflow
Nov 28, 2008
tsalm
Nov 29, 2008
BCS
Nov 29, 2008
tsalm
Nov 29, 2008
BCS
Nov 29, 2008
tsalm
November 28, 2008
Hello,

I would do something like this, but this return me an execution error :
object.Exception: Stack Overflow

// --------CODE--------
class A
{
 void delegate() dg;

 void doIt()
 {
  dg();
 }
}

class B
{
 A a;

 this()
 {
  a = new A;
  a.dg = { doSomething(); };
 }

 void doSomething() { }
}

void main()
{
 auto b = new B;
 b.a.doIt();
}
// ------END CODE------

Is this a bug or have I do something wrong ?
Thanks in advance for your help,
TSalm
November 29, 2008
Reply to TSalm,

> Hello,
> 
> I would do something like this, but this return me an execution error
> : object.Exception: Stack Overflow
> 
> // --------CODE--------
> class A
> {
> void delegate() dg;
> void doIt()
> {
> dg();
> }
> }
> class B
> {
> A a;
> this()
> {
> a = new A;
> a.dg = { doSomething(); };
> }
> void doSomething() { }
> }
> void main()
> {
> auto b = new B;
> b.a.doIt();
> }
> // ------END CODE------
> 
> Is this a bug or have I do something wrong ?
> Thanks in advance for your help,
> TSalm

If this is d1.0 the error is that you are allowing an anon delegate to escape the enclosing function.

a.dg = &this.doSomething;  // this would be ok if that helps.


if it is 2.0, I think this is correct.


November 29, 2008
Le Sat, 29 Nov 2008 01:08:28 +0100, BCS <ao@pathlink.com> a écrit:

> Reply to TSalm,
>
>> Hello,
>>  I would do something like this, but this return me an execution error
>> : object.Exception: Stack Overflow
>>  // --------CODE--------
>> class A
>> {
>> void delegate() dg;
>> void doIt()
>> {
>> dg();
>> }
>> }
>> class B
>> {
>> A a;
>> this()
>> {
>> a = new A;
>> a.dg = { doSomething(); };
>> }
>> void doSomething() { }
>> }
>> void main()
>> {
>> auto b = new B;
>> b.a.doIt();
>> }
>> // ------END CODE------
>>  Is this a bug or have I do something wrong ?
>> Thanks in advance for your help,
>> TSalm
>
> If this is d1.0 the error is that you are allowing an anon delegate to escape the enclosing function.

Yes, it's on D1.036.


>
> a.dg = &this.doSomething;  // this would be ok if that helps.
>
>
>  if it is 2.0, I think this is correct.
>

Yes, you are right.
But this is an example code. The "true" code uses delegates with argument which differs from called functions, so I can't point delegate directly to them.
And this anonymous function's way is really fastest to code... I must waiting for a D2 stable version ;-)

Thanks
November 29, 2008
Reply to TSalm,

> Yes, you are right.
> But this is an example code. The "true" code uses delegates with
> argument
> which differs from called functions, so I can't point delegate
> directly to
> them.
> And this anonymous function's way is really fastest to code... I must
> waiting for a D2 stable version ;-)
> Thanks
> 

you can store off the values you need like this:


struct C(R, A...)
{
  A args;
  R function(A) dg;
  static R delegate() opCall(R function(A) dg, A a)
  {
     C!(R, A) ret;
     ret.dg=dg;
     foreach(int i,_;A)
        ret.args[i] = a[i];
     return &ret.fn;
  }
  R fn() { return dg(args); }
}


// test it

import std.stdio;

int delegate() dg(int i)
{
  return C!(int,int)(function int(int j){return j;}, i);   // <--- used here
}

void main()
{
  auto d = dg(5);
  writef("%s\n", d());
}


November 29, 2008
Le Sat, 29 Nov 2008 01:49:20 +0100, BCS <ao@pathlink.com> a écrit:

> struct C(R, A...)
> {
>   A args;
>   R function(A) dg;
>   static R delegate() opCall(R function(A) dg, A a)
>   {
>      C!(R, A) ret;
>      ret.dg=dg;
>      foreach(int i,_;A)
>         ret.args[i] = a[i];
>      return &ret.fn;
>   }
>   R fn() { return dg(args); }
> }
>   // test it
>  import std.stdio;
>  int delegate() dg(int i)
> {
>   return C!(int,int)(function int(int j){return j;}, i);   // <--- used here
> }
>  void main()
> {
>   auto d = dg(5);
>   writef("%s\n", d());
> }

Interesting code. Thanks!