@@ -34,48 +34,56 @@ template <typename Model> class ModelHostObject : public JsiHostObject {
3434 errorMessage, sizeof (errorMessage),
3535 " Argument count mismatch, was expecting: %zu but got: %zu" ,
3636 forwardArgCount, count);
37- callInvoker->invokeAsync (
38- [errorMessage, &promise]() { promise->reject (errorMessage); });
37+ promise->reject (errorMessage);
3938 return ;
4039 }
4140
42- // We need to dispatch a thread if we want the forward to be
43- // asynchronous
44- std::thread ([args, this , promise, &runtime]() {
45- try {
46- auto argsConverted = jsiconversion::createArgsTupleFromJsi (
47- &Model::forward, args, runtime);
48- auto result = std::apply (std::bind_front (&Model::forward, model),
49- argsConverted);
50- callInvoker->invokeAsync (
51- [promise, result = std::move (result)](jsi::Runtime &runtime) {
52- promise->resolve (
53- jsiconversion::getJsiValue (std::move (result), runtime));
54- });
55- } catch (const std::runtime_error &e) {
56- // This catch should be merged with the next two
57- // (std::runtime_error and jsi::JSError inherits from
58- // std::exception) HOWEVER react native has broken RTTI which
59- // breaks proper exception type checking. Remove when the
60- // following change is present in our version:
61- // https://github.com/facebook/react-native/commit/3132cc88dd46f95898a756456bebeeb6c248f20e
62- callInvoker->invokeAsync (
63- [&e, promise]() { promise->reject (e.what ()); });
64- return ;
65- } catch (const jsi::JSError &e) {
66- callInvoker->invokeAsync (
67- [&e, promise]() { promise->reject (e.what ()); });
68- return ;
69- } catch (const std::exception &e) {
70- callInvoker->invokeAsync (
71- [&e, promise]() { promise->reject (e.what ()); });
72- return ;
73- } catch (...) {
74- callInvoker->invokeAsync (
75- [promise]() { promise->reject (" Unknown error" ); });
76- return ;
77- }
78- }).detach ();
41+ try {
42+ auto argsConverted = jsiconversion::createArgsTupleFromJsi (
43+ &Model::forward, args, runtime);
44+
45+ // We need to dispatch a thread if we want the forward to be
46+ // asynchronous. In this thread all accesses to jsi::Runtime need to
47+ // be done via the callInvoker.
48+ std::thread ([this , promise,
49+ argsConverted = std::move (argsConverted)]() {
50+ try {
51+ auto result = std::apply (
52+ std::bind_front (&Model::forward, model), argsConverted);
53+
54+ callInvoker->invokeAsync ([promise, result = std::move (result)](
55+ jsi::Runtime &runtime) {
56+ promise->resolve (
57+ jsiconversion::getJsiValue (std::move (result), runtime));
58+ });
59+ } catch (const std::runtime_error &e) {
60+ // This catch should be merged with the next two
61+ // (std::runtime_error and jsi::JSError inherits from
62+ // std::exception) HOWEVER react native has broken RTTI which
63+ // breaks proper exception type checking. Remove when the
64+ // following change is present in our version:
65+ // https://github.com/facebook/react-native/commit/3132cc88dd46f95898a756456bebeeb6c248f20e
66+ callInvoker->invokeAsync (
67+ [&e, promise]() { promise->reject (e.what ()); });
68+ return ;
69+ } catch (const jsi::JSError &e) {
70+ callInvoker->invokeAsync (
71+ [&e, promise]() { promise->reject (e.what ()); });
72+ return ;
73+ } catch (const std::exception &e) {
74+ callInvoker->invokeAsync (
75+ [&e, promise]() { promise->reject (e.what ()); });
76+ return ;
77+ } catch (...) {
78+ callInvoker->invokeAsync (
79+ [promise]() { promise->reject (" Unknown error" ); });
80+ return ;
81+ }
82+ }).detach ();
83+ } catch (...) {
84+ promise->reject (
85+ " Couldn't parse JS arguments in native forward function" );
86+ }
7987 });
8088
8189 return promise;
0 commit comments