I see now that the same thing happens with raw pointers, and is not an
issue of smart pointers.

‪On Tue, 30 Jul 2019 at 15:50, ‫שחר לנגבהיים‬‎ <[email protected]> wrote:‬

> Hi,
> I have a couple of structs objects, inheriting from a base struct, and
> passed using smart pointers. I've tried to bind them using embind, but when
> I look at the object in the debugger I see that it isn't a smart pointer
> but a raw pointer, and when I try to pass the object to another object, I
> get an error that the wrong type of object is passed.
>
> c++ code:
> struct RenderModel {};
>
> EMSCRIPTEN_BINDINGS(RenderModelBinding) {
> emscripten::class_<RenderModel>("RenderModel")
> .constructor<>()
> .smart_ptr<std::shared_ptr<RenderModel>>("RenderModel");
> }
>
> struct GroupRenderModel : RenderModel {
> void addModel(std::shared_ptr<wre_model::RenderModel> model) {
> models.push_back(model);
> }
>
> std::vector<std::shared_ptr<wre_model::RenderModel>> models;
> };
>
> EMSCRIPTEN_BINDINGS(GroupRenderModelBinding) {
> emscripten::class_<GroupRenderModel>("GroupRenderModel")
> .constructor<>()
> .function("addModel", &GroupRenderModel::addModel)
> .smart_ptr<std::shared_ptr<GroupRenderModel>>("GroupRenderModel");
> }
>
> struct TextureRenderModel : public RenderModel {};
>
> EMSCRIPTEN_BINDINGS(TextureRenderModelBinding) {
> emscripten::class_<TextureRenderModel>("TextureRenderModel")
> .constructor<>()
> .smart_ptr<std::shared_ptr<TextureRenderModel>>("TextureRenderModel");
> }
>
> JS code:
> const groupLayer = new Module.GroupRenderModel();
> const textureLayer = new Module.TextureRenderModel();
> groupLayer.addModel(textureLayer);
>
> When checking in the debugger, I see that groupLayer's pointer is:
>
>    1. ptrType: RegisteredPointer
>       1. destructorFunction: null
>       2. isConst: false
>       3. isReference: false
>       4. isSmartPointer: false
>       5. name: "GroupRenderModel*"
>
> textureLayer's pointer is:
>
>    1. ptrType: RegisteredPointer
>       1. destructorFunction: null
>       2. isConst: false
>       3. isReference: false
>       4. isSmartPointer: false
>       5. name: "TextureRenderModel*"
>
> And the error printed when calling setModel is:
>
>    1. BindingError {name: "BindingError", message: "Expected null or
>    instance of RenderModel, got an instance of TextureRenderModel", stack:
>    "BindingError: Expected null or instance of
>    RenderM…ttp://localhost:51840/client.e31bb0bc.js:68387:15"}
>    2. message: "Expected null or instance of RenderModel, got an instance
>    of TextureRenderModel"
>       1. name: "BindingError"
>       2. stack: "BindingError: Expected null or instance of RenderModel,
>       got an instance of TextureRenderModel↵ at BindingError.<anonymous> (
>       http://localhost:51840/render/appWASM.js:5207:24)↵ at new
>       BindingError (eval at createNamedFunction (
>       http://localhost:51840/render/appWASM.js:1:1), <anonymous>:4:34)↵
>       at throwBindingError (
>       http://localhost:51840/render/appWASM.js:5225:13)↵ at upcastPointer
>       (http://localhost:51840/render/appWASM.js:5569:15)↵ at
>       RegisteredPointer.genericPointerToWireType [as toWireType] (
>       http://localhost:51840/render/appWASM.js:5622:13)↵ at
>       GroupRenderModel$addModel [as addModel] (eval at new_ (
>       http://localhost:51840/render/appWASM.js:1:1), <anonymous>:9:26)↵
>       at CompositionCanvas.updateRenderEngine (
>       http://localhost:51840/client.e31bb0bc.js:68401:18)↵ at
>       http://localhost:51840/client.e31bb0bc.js:68387:15";
>       3. __proto__: Error
>
>
> Using smart_ptr_constructor changes the value in isSmartPointer, but the
> same binding error is returned.
>
> struct RenderModel {};
>
> EMSCRIPTEN_BINDINGS(RenderModelBinding) {
> emscripten::class_<RenderModel>("RenderModel")
> .smart_ptr_constructor<std::shared_ptr<RenderModel>>("RenderModel",
> &std::make_shared<RenderModel>);
> }
>
> struct GroupRenderModel : public RenderModel {
> void addModel(std::shared_ptr<wre_model::RenderModel> model) {
> models.push_back(model);
> }
>
> std::vector<std::shared_ptr<wre_model::RenderModel>> models;
> };
>
> EMSCRIPTEN_BINDINGS(GroupRenderModelBinding) {
> emscripten::class_<GroupRenderModel>("GroupRenderModel")
> .function("addModel", &GroupRenderModel::addModel)
> .smart_ptr_constructor<std::shared_ptr<GroupRenderModel>>(
> "GroupRenderModel", &std::make_shared<GroupRenderModel>);
> }
>
> struct TextureRenderModel : public RenderModel {};
>
> EMSCRIPTEN_BINDINGS(TextureRenderModelBinding) {
> emscripten::class_<TextureRenderModel>("TextureRenderModel")
> .smart_ptr_constructor<std::shared_ptr<TextureRenderModel>>(
> "TextureRenderModel", &std::make_shared<TextureRenderModel>);
> }
>
> Am I making some mistake with my binding declaration, or does embind not
> support implicit casting?
>
>
>    1.
>
> --
> 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].
> To view this discussion on the web visit
> https://groups.google.com/d/msgid/emscripten-discuss/849ef787-772d-4a66-ac98-1d9d3e948b36%40googlegroups.com
> <https://groups.google.com/d/msgid/emscripten-discuss/849ef787-772d-4a66-ac98-1d9d3e948b36%40googlegroups.com?utm_medium=email&utm_source=footer>
> .
>

-- 
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].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/emscripten-discuss/CA%2B_KjGZ32RE-OngVv1dym80-PZDLkMmZC7F1X8x66waKL2gPYQ%40mail.gmail.com.

Reply via email to