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