I believe you can avoid the extra factory interface class I mentioned by
passing a function that returns the constructed object as an
emscripten::val. You can call that, and embind should marshal the object
correctly.
So, on the JS side something like:
Module.doSomeStuff(function(f) {
return new MyDerivedClass(f);
});
on the C++ side something like:
void doSomeStuff(emscripten::val factoryFunc) {
TestStruct *s = factoryFunc(2.2);
}
-- brion
On Wed, Dec 9, 2015 at 1:30 PM, Brion Vibber <[email protected]> wrote:
> Ah, I see -- the JS object that's created isn't actually a pointer in this
> case, it's a wrapper object (that contains a pointer). Digging into the
> wrapper object to find the pointer is probably gauche...
>
> Easiest way may be to define a virtual factory class in C++, which has a
> method that is bound to return your instance type; then you can pass the
> derived JS factory instance into your C++ side and simply call that
> function instead of the constructor directly.
>
> -- brion
>
> On Wed, Dec 9, 2015 at 12:56 PM, Joshua Auerbach <[email protected]>
> wrote:
>
>> Are you sure it's so simple?
>>
>> Calling this from C++ does not work properly:
>>
>> TestStruct* testPtr = reinterpret_cast<TestStruct*>(
>> emscripten_run_script_int("new Module.TestStruct(2.2);") );
>>
>> while I can create TestStructs with the same constructor fine from within
>> JavaScript (and emscripten_run_script_int works if I am actually returning
>> an int)
>>
>> note:
>>
>> struct TestStruct {
>> double a;
>> TestStruct(double x) : a(x) {}
>> };
>>
>> EMSCRIPTEN_BINDINGS(my_module) {
>> emscripten::class_<TestStruct>("TestStruct")
>> .constructor<float>()
>> .property("a", &TestStruct::a);
>> }
>>
>>
>> Thanks,
>> Josh
>>
>>
>> On 12/09/2015 06:54 PM, Brion Vibber wrote:
>>
>> Simply return the pointer from the function with the 'return' statement,
>> like any other function return value. Remember that pointers are just
>> integers.
>>
>> -- brion
>> On Dec 9, 2015 6:13 AM, "Josh A" < <[email protected]>
>> [email protected]> wrote:
>>
>>> Hi all,
>>>
>>> This seems like it should be really straight forward, but I can't find
>>> an example of this.
>>>
>>> I am trying to expose some scripting on my software:
>>>
>>> With embind I expose an Interface that should be implemented by
>>> javascript. This works fine.
>>>
>>> Now I want to call some code that takes a provided js implementation of
>>> the interface, instatiates it and returns a pointer to C++ of the created
>>> object. I can do the js call fine and everything works, but I can't seem
>>> to find how to get the pointer from the js back to the C++, either using an
>>> emscripten_run_script variant or using embind vars or some other method.
>>>
>>> I have tried searching, reading through docs and looking at the test
>>> code, but still can't find an example of this. Can someone please point me
>>> to the right place?
>>>
>>> Thanks++
>>> Josh
>>> --
>>> You received this message because you are subscribed to the Google
>>> Groups "emscripten-discuss" 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.
>>>
>> --
>> You received this message because you are subscribed to the Google Groups
>> "emscripten-discuss" 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.
>>
>>
>>
>> --
>> Dr. Joshua E. Auerbach
>> Postdoctoral Researcher
>> Laboratory of Intelligent Systems
>> École Polytechnique Fédérale de Lausanne
>>
>> --
>> You received this message because you are subscribed to the Google Groups
>> "emscripten-discuss" 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.
>>
>
>
--
You received this message because you are subscribed to the Google Groups
"emscripten-discuss" 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.