In Blink, we store a pointer to a wrapper type info, and the void* on the object. The wrapper type info struct is used to determine the type of the void*. We also have some code that decides when you actually want to have type S* but the void* points to a T* whether it's safe to cast from T* to S*.
hth -jochen On Fri, Feb 5, 2016 at 8:02 AM Zac Hansen <[email protected]> wrote: > Thinking more about this problem, I realize it's actually quite involved. > Without some sort of type information about what's being stored, it > doesn't seem possible to see if something is a derived class of an > arbitrary type. > > Also, introducing some sort of templated pointer type to External would > require the whole stack to suddenly be templatized adn the concept of the > callback info object wouldn't work since it wouldn't be returning an array > of objects of the same type in it's operator[]. > > I've settled on simply testing to see if it's exactly the right type as > what I'm trying to convert it to by wrapping it in a templated class with a > known base type and testing if the base type is dynamic_cast'able to the > specific type I want. but that stops me from using parameters with > derived types which should be allowed. > > --Zac > > > On Thursday, February 4, 2016 at 9:09:54 PM UTC-8, Zac Hansen wrote: >> >> I'm in a FunctionTemplate callback and about to call a function that >> expects parameters of a certain type and I want to make sure that the >> variable backing the object is of the right type. I know the type the >> function wants (T), but you can't call dynamic_cast<T>(my_void_ptr). >> >> Unless I'm missing something (which is entirely possible), it seems like >> it would be nice if v8::External were templated to take a pointer type. >> So I could say v8::External<T>::New(my_t_ptr) and then have >> my_local_external->Value() return a T* instead of a void *. I'm not a >> template master, but I think you could make void * the default to not have >> any behavior change in the default case. >> >> I think a workaround for this is to make a templated wrapping class that >> inherits from a non-templated base class.. so I can say >> dynamic_cast<WrapperClass<T>>((WrapperBaseClass*)void_from_external) == >> nullptr and find out that way, but it doesn't seem like that workaround >> should be necessary. >> >> Anyone have a better way to do this (like something already in V8 I don't >> know about) or any thoughts on if v8::External could be made templated? >> I'd be willing to write the patch, as it seems pretty trivial. >> >> >> Thank you! >> >> --Zac >> > -- > -- > v8-users mailing list > [email protected] > http://groups.google.com/group/v8-users > --- > You received this message because you are subscribed to the Google Groups > "v8-users" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to [email protected]. > For more options, visit https://groups.google.com/d/optout. > -- -- v8-users mailing list [email protected] http://groups.google.com/group/v8-users --- You received this message because you are subscribed to the Google Groups "v8-users" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. For more options, visit https://groups.google.com/d/optout.
