This may need to be reduced to a small test case that shows the issue. One potential thing that comes to mind is that if you have a class Derived : public Base and shared_ptr<Derived> and shared_ptr<Base>, then those cannot be treated interchangeably in JS side, i.e. if you get a shared_ptr<Derived> to JS side, you can't call a function that expects a shared_ptr<Base> with it, and the other way around, but you need to perform the appropriate casts on the C++ side. Also try building with -s SAFE_HEAP=1 linker flag to see if this might be some alignment related corruption.
2017-08-07 5:35 GMT+03:00 Ricky <[email protected]>: > I ran into this a while ago but just worked around the problem instead of > fixing it. I'm now going back and fixing my "TODOs" and hoping someone has > some idea of what is going on here. > Basically, there seems to be some weird issue with a shared_ptr that I'm > holding onto in the javascript layer of which causes a bad_weak_ptr when I > call shared_from_this(). What is seriously weird about this is it only > happens when I call directly on that object. For example, I have the > following code on my javascript side just to test this oddity: > > onReadProducts: () => { > appViewModel.data.testBusiness(this.currentBusiness().data); > this.currentBusiness().data.readProductsAsync(index, count, name); > } > > Which maps to the following methods on my C++ side > > void App::testBusiness(std::shared_ptr<Business> businessArg) { > printf("is App null - %d\n", (this == nullptr)); > printf("is App->shared_from_this null - %d\n", (this->shared_from_this() > == nullptr)); > if (this->businessQuery->size() == 0) { > printf("this->businessQuery->size() has no size\n"); > } > else { > printf("this->businessQuery->at(0) is null - %d\n", > (this->businessQuery->at(0) == nullptr)); > printf("this->businessQuery->at(0)->shared_from_this() is null - > %d\n", (this->businessQuery->at(0)->shared_from_this() == nullptr)); > printf("is at(0) same as passed in business %d\n", > (this->businessQuery->at(0) == businessArg)); > printf("businessArg is null - %d\n", (businessArg == nullptr)); > printf("businessArg->shared_from_this() is null - %d\n", > (businessArg->shared_from_this() == nullptr)); > } > } > void Business::readProductsAsync(unsigned int index, unsigned int count, > std::string name) > { > printf("businessArg is null - %d\n", (this == nullptr)); > printf("businessArg->shared_from_this() is null - %d\n", > (this->shared_from_this() == nullptr)); > // There is more here but it doesn't matter > } > > When I run this in the browser I get the following output > > App::testBusiness - is App null - 0 > App::testBusiness - is App->shared_from_this null - 0 > App::testBusiness - this->businessQuery->at(0) is null - 0 > App::testBusiness - this->businessQuery->at(0)->shared_from_this() is null - > 0 > App::testBusiness - is at(0) same as passed in business 1 > App::testBusiness - businessArg is null - 0 > App::testBusiness - businessArg->shared_from_this() is null - 0 > Business::readProductsAsync - this is null - 0 > Compiled code throwing an exception, 5507792,19624,3140 > can_catch on 5507792 > Resuming exception 5507792,5507792 > Uncaught 5507792 > > So when I pass my handle of std::shared_ptr<Business> to App, I'm able to > perform a shared_from_this on that handle but when I call a method on that > handle directly I get a bad_weak_ptr? What's going on here? This seems like > a strange and crazy bug. > > -- > 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.
