On Thu, 03 May 2012 14:05:26 -0400, Mehrdad <[email protected]> wrote:

There's the RTInfo method I told you about (recently added) if you want to stick the information directly into TypeInfo at compile time.

There's also static ctors. Just add a hashtable based on the class name, and use typeid(this).name as the initial key. You have to handle all the inheritance of properties yourself, but that shouldn't be too difficult.

-Steve

Ooh... how do I get RTInfo? It's not in druntime/phobos....

https://github.com/D-Programming-Language/druntime/blob/master/import/object.di#L622

Need the github versions of dmd/druntime/phobos.

Basically how it works is the compiler evaluates RTInfo!T where T is the type for which TypeInfo is being generated, and places the result into a location that is returned by TypeInfo.rtInfo property. This all happens at compile-time, so it effectively gives you a hook to store runtime type information into the TypeInfo.

As far as I know, there's not official documentation on it, it's a pretty beta feature. But I think it will open a door to actual runtime type information that we never had before.

One limitation is, it has to be inside the runtime, and specifically in object.di. However, we may be able to effectively generate class/struct specific runtime type information. For example:

struct RTTI
{
  // druntime-specified properties
  ...
  // type-specific properties
  void *typeSpecificProperties;
}

template RTInfo_Instance(T)
{
   static if(is(typeof({void *x = T.__rtInfo();}))
     immutable RTTI RTInfo_Instance = RTTI(..., T.__rtInfo());
   else
     immutable RTTI RTInfo_Instance = RTTI(..., null);
}

template RTInfo(T)
{
   immutable void * RTInfo = &RTInfo_Instance!T;
}

I have no idea if this works :) But I'm *positive* someone with better template skills than me can make something like this work.

-Steve

Reply via email to