D - is this a bug & with delegates ?
- Mike Wynn (81/81) Sep 11 2003 I have the following tree walker class.
- Walter (3/3) Sep 11 2003 It's hard to see as your example contains a lot of stuff in it that seem...
I have the following tree walker class. linux dmd 0.71 gcc (GCC) 3.2.2 20030222 (Red Hat Linux 3.2.2-5) if I do not put the `&` in front of the method name it does not work, but compiles fine. i.e. register_walker( getFC, FunctionCall.classinfo ); // does not work instead of register_walker( &getFC, FunctionCall.classinfo ); // works which is suposed to be correct ? class MyWF : WalkerFactory { Walker getFC( WalkerFactory wf ) { return new FCWalker( wf ); } Walker getVar( WalkerFactory wf ) { return new VarWalker( wf ); } Walker getConst( WalkerFactory wf ) { return new ConstWalker( wf ); } Walker getOp( WalkerFactory wf ) { return new OpWalker( this ); } this() { super(); register_walker( &getFC, FunctionCall.classinfo ); register_walker( &getVar, Var.classinfo ); register_walker( &getConst, Const.classinfo ); register_walker( &getOp, Operator.classinfo ); } // rest of main code. class Node { Node[] children; } class WalkerFactory { alias Walker delegate( WalkerFactory ) CreateFunc; CreateFunc[ClassInfo] walkers; Walker getDef( WalkerFactory wf ) { return new Walker( wf ); } this() { register_walker( &getDef, Node.classinfo ); } void walk( Node n ) { CreateFunc cf = walkers[n.classinfo]; if ( cf ) { Walker w = cf( this ); if ( w ) { w.walk( n ); } } } void register_walker( CreateFunc w, ClassInfo ci ) { walkers[ci] = w; } } class Walker { WalkerFactory parent; this( WalkerFactory p0 ) { parent = p0; } void walk( Node n ) { Node c; if ( first( n ) ) { foreach( Node c; enum_children( n ) ) { if ( child_pre( n, c ) ) { parent.walk( c ); child_post( n, c ); } } last( n ); } } Node[] enum_children( Node n ) { return n.children; } bit first( Node n ) { return true; } bit child_pre( Node n, Node c ) { return true; } void child_post( Node n, Node c ) { } void last( Node n ) { } } class ReversedWalker : Walker { this( WalkerFactory p0 ) { super( p0 ); } Node[] enum_children( Node n ) { return n.children.dup.reverse; } }
Sep 11 2003
It's hard to see as your example contains a lot of stuff in it that seems not relevant to the problem. Can you cut it down please? Sometimes cutting it down to the bare minimum to show the problem reveals it for what it is.
Sep 11 2003
Walter wrote:It's hard to see as your example contains a lot of stuff in it that seems not relevant to the problem. Can you cut it down please? Sometimes cutting it down to the bare minimum to show the problem reveals it for what it is.in the process of cutting it down ...main_forward.d: class MyWF forward reference of base class WalkerFactorywhich is due to the Walker class having and error, (hence I've not the code down further, .... got to go out and buy food today).
Sep 12 2003
Walter wrote:It's hard to see as your example contains a lot of stuff in it that seems not relevant to the problem. Can you cut it down please? Sometimes cutting it down to the bare minimum to show the problem reveals it for what it is.Arrggghh!! o.k. this is going to be one of those long time to find bugs, as soon as I cut the codesize down it works, (the whole tree walker is not that big do you want me to send you the whole original non working project ?)
Sep 12 2003
Mike Wynn wrote:Walter wrote:well now I'm stuck ... the original code will not break !! BUT who should a delegate be passed alias int delegate( int ) myfunc; void dofunc( myfunc f ) { .... } class MyObj { int funca( int a ) { ... } int funcb( int b ) { ... } void process() { dofunc( funca ); // <= is this right dofunc( &funcb ); // or is this right } } is there a difference (and if a sub class overrides funca or funcb will the `right` methods always be called (i.e. is it in the D spec that the address of a delegate is from the vtbl not direct)?)It's hard to see as your example contains a lot of stuff in it that seems not relevant to the problem. Can you cut it down please? Sometimes cutting it down to the bare minimum to show the problem reveals it for what it is.
Sep 12 2003
"Mike Wynn" <mike l8night.co.uk> wrote in message news:bjstd3$qov$1 digitaldaemon.com...BUT who should a delegate be passed alias int delegate( int ) myfunc; void dofunc( myfunc f ) { .... } class MyObj { int funca( int a ) { ... } int funcb( int b ) { ... } void process() { dofunc( funca ); // <= is this right dofunc( &funcb ); // or is this rightThe second one.} } is there a differenceThe former no longer is supported.(and if a sub class overrides funca or funcb will the `right` methods always be called (i.e. is it in the D spec that the address of a delegate is from the vtbl not direct)?)Yes, it comes from the vtbl[].
Nov 19 2003