delegate type info?

Thomas Kuehne thomas-dloop at kuehne.cn
Tue Oct 24 16:18:38 PDT 2006


-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Lutger schrieb am 2006-10-24:
> Is it possible at all to retrieve whether a given delegate is a delegate 
> literal or from an object, that is if the .ptr property points to an 
> Object or not?

Yes, the solution however is implementation defined.

# import internal.gc.gcbits;
# import internal.gc.gclinux;
# import internal.gc.gcx;
# import std.utf;
# import std.gc;
# 
# template delegatePointsToObject(T){
#    static assert(is(T == delegate));
#    bool delegatePointsToObject(T x){
#       gc_t handle = cast(gc_t) getGCHandle();
#       Gcx* engine = handle.gcx;
#       Pool* pool = engine.findPool(x.ptr);
#       if(!pool){
#          return false;
#       }
#       
#       Object o = cast(Object) x.ptr;
#       if(!o){
#          return false;
#       }
# 
#       ClassInfo ci = o.classinfo;
#       if(!ci){
#          return false;
#       }
#       if(ci.name.length > (1 << 12)){
#          return false;
#       }
#       try{
#          std.utf.validate(ci.name);
#       }catch{
#          return false;
#       }
# 
#       return true;
#    }
# }

usage sample:

# interface I{
#    void bar();
# }
# 
# class C : I{
#    void bar(){
#       writefln("hallo");
#    }
# }
# 
# import std.stdio;
# int main(){
#    C c = new C();
#    I i = c;
# 
#    char[] foo(){ return null; }
# 
#    writefln("delegate points to object:");
#    writefln("object\t\t%s", delegatePointsToObject(&c.bar));
#    writefln("interface\t%s", delegatePointsToObject(&i.bar));
#    writefln("nested function\t%s", delegatePointsToObject(&foo));
# 
#    return 0;
# }

Thomas


-----BEGIN PGP SIGNATURE-----

iD8DBQFFPqwgLK5blCcjpWoRAliaAKCubrXIgEDiKhKPTVh/N1SO1VBrPwCeKHy8
dBxiBYSWMJXD+hOQ1cRjBI8=
=Ui9D
-----END PGP SIGNATURE-----



More information about the Digitalmars-d-learn mailing list