Compile-time reflection

Christopher Wright dhasenan at gmail.com
Sun Jul 15 06:31:02 PDT 2007


Hey all,

I've been looking into creating a mocks library, and I've determined 
that most of it is possible. If someone gives me a delegate, I can mock 
it. (I think.) If someone gives me a class or interface, I can replace 
all its functions with null pointers so that using any unexpected 
function results in a segmentation fault.

I could replace all the methods of your class with a variadic method 
that just throws an exception. But variadic methods have the signature:
(TypeInfo[], void*, this)

That doesn't match arbitrary function signatures, just variadic function 
signatures.

I could use a template function! No good. It wouldn't be instantiated at 
compile time because nobody calls it by name. I won't even be able to 
get a pointer to it to put in a vtbl.

I could mess with ClassInfo.vtbl at compile time! No good. It's a 
void*[] -- no way even to get the array length at compile time, much 
less muck about with pointers.

To do a proper job, I'd need the following, ideally:
struct function {
    void* addr;
    TypeInfo returnType;
    TypeInfo[] parameterTypes;
    ...
}
function func = &somefunc;
func.returnType.type x;

And, along with this, vtbls being filled by a template. (Templates 
affect the vtbl; templates need to read the vtbl; therefore, vtbl must 
be filled during template expansion and paying attention to dependencies.)


Without this, would anyone use a mocks library that segfaulted when you 
called a method without setting up expectations for it? Or one where you 
had to set up expectations, positive or negative, for every method of 
every mocked type?



More information about the Digitalmars-d mailing list