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.
