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.