Crap, that last reply was early.. I hit tab/space anda it went to "POST"... 

 

> Very pseudocode-y:
>
> class Foo {};
>
> function f(Foo * f){}
>
> static void callback(const v8::FunctionCallbackInfo<v8::Value>& args) {
>    void * internal_field = args[0].GetInternalField(0); // this skips a 
> bunch of casts and such
>
>   // How to find out if internal_field is convertible to Foo *?
>
> }
>
> // create the function called "foo"
> ft = FunctionTemplate( callback);
> context->Global->Set("foo", ft);
>
> // Create an object backed by a C++ Foo object and call it "o"
> o = v8::Object::New();
> o.SetInternalField(new Foo());
> context->Global->Set("o", o);
>
> then in javascript:
>
> foo(o);
>
>
>
> On Thursday, February 4, 2016 at 9:41:30 PM UTC-8, Louis P. Santillan 
> wrote:
>>
>> First, is the Function callback calling a C++ native function, a JS 
>> function or another C++ defined Function callback?  Providing some 
>> code might make the issue more obvious. 
>>
>> Second, v8.h has all the JS ("container") types defined.  Start there 
>> when defining variables.  You can often use the v8 type when going 
>> between JS-land and C++-land.  Things like: 
>> ``` 
>>    v8::Array arr = Array::New( isolate, len ); 
>>    v8::Integer i = Integer::New( isolate, ivalue ); 
>> ``` 
>>
>> If you're converting the callback's parameters to a native type: 
>> ``` 
>>    String::Utf8Value str( args[ 0 ] ); 
>>    char* ascii = *str; // * is overloaded to return an ASCII C string 
>>    int n = ( int )( args[ 1 ]->Int32Value() ); 
>> ``` 
>>
>> Once you have the parameter in the v8 type or C++ type, you can pass 
>> them appropriately. 
>>
>> If you're hard up for the wrapper approach, then Stephen Beal had an 
>> extensive template based solution that is probably 18-24 months 
>> out-of-date (read: extensively out of date) and then there's node.js' 
>> wrapper object approach. 
>>
>> -L 
>>
>> On Thu, Feb 4, 2016 at 9:09 PM, Zac Hansen <[email protected]> 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.

Reply via email to