www.digitalmars.com         C & C++   DMDScript  

digitalmars.D - Triggers

reply Sjoerd van Leent <svanleent gmail.com> writes:
OK, to make matters worse.

As I was reading so many things about properties, keywords and a bunch of other
interesting things, perhaps triggers.

Triggers are, in my opinion, functions that act as delegates, and are called
before or after one or more other functions. Maybe we can do something with
this? It would introduce some aspect programming to D.

file 1:

class Foo
{
    int mybar;
    int myother;

    void bar(int i)
    {
        mybar = i;
    }


    void other(int i)
    {
        myother = i;
    }
}


file 2:

trigger(before) : "*.void * (int *)"
{
    writefln("calling ", this.currentFunctionName);
}

trigger(after) : "*.void * (int *)"
{
    writefln("called ", this.currentFunctionName);
}


This might be something for D3 though...
Aug 05 2009
parent reply Jeremie Pelletier <jeremiep gmail.com> writes:
Sjoerd van Leent Wrote:

 OK, to make matters worse.
 
 As I was reading so many things about properties, keywords and a bunch of
other interesting things, perhaps triggers.
 
 Triggers are, in my opinion, functions that act as delegates, and are called
before or after one or more other functions. Maybe we can do something with
this? It would introduce some aspect programming to D.
 
 file 1:
 
 class Foo
 {
     int mybar;
     int myother;
 
     void bar(int i)
     {
         mybar = i;
     }
 
 
     void other(int i)
     {
         myother = i;
     }
 }
 
 
 file 2:
 
 trigger(before) : "*.void * (int *)"
 {
     writefln("calling ", this.currentFunctionName);
 }
 
 trigger(after) : "*.void * (int *)"
 {
     writefln("called ", this.currentFunctionName);
 }
 
 
 This might be something for D3 though...

You can already do something like that, although very hackish: turn on trace profiling and override the prolog/epilog code from druntime (I think these are called _trace_pro_n and _trace_epi_n, just grep the source for their syntax). Just make *very* sure to use only naked declarations in these and any routine they may call, or else you will just call back into _trace_pro_n until you get a stack overflow.
Aug 05 2009
parent Sjoerd van Leent <svanleent gmail.com> writes:
Jeremie Pelletier Wrote:

 Sjoerd van Leent Wrote:
 
 OK, to make matters worse.
 
 As I was reading so many things about properties, keywords and a bunch of
other interesting things, perhaps triggers.
 
 Triggers are, in my opinion, functions that act as delegates, and are called
before or after one or more other functions. Maybe we can do something with
this? It would introduce some aspect programming to D.
 
 file 1:
 
 class Foo
 {
     int mybar;
     int myother;
 
     void bar(int i)
     {
         mybar = i;
     }
 
 
     void other(int i)
     {
         myother = i;
     }
 }
 
 
 file 2:
 
 trigger(before) : "*.void * (int *)"
 {
     writefln("calling ", this.currentFunctionName);
 }
 
 trigger(after) : "*.void * (int *)"
 {
     writefln("called ", this.currentFunctionName);
 }
 
 
 This might be something for D3 though...

You can already do something like that, although very hackish: turn on trace profiling and override the prolog/epilog code from druntime (I think these are called _trace_pro_n and _trace_epi_n, just grep the source for their syntax). Just make *very* sure to use only naked declarations in these and any routine they may call, or else you will just call back into _trace_pro_n until you get a stack overflow.

There comes "AspectD" :-) Sjoerd
Aug 06 2009