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.