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 <ric...@snowcoders.com>:
> 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 emscripten-discuss+unsubscr...@googlegroups.com.
> 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 emscripten-discuss+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to