@@ -15,7 +15,9 @@ namespace winrt::Microsoft::ReactNative {
1515CallInvokerWriter::CallInvokerWriter (
1616 const std::shared_ptr<facebook::react::CallInvoker> &jsInvoker,
1717 std::weak_ptr<LongLivedJsiRuntime> jsiRuntimeHolder) noexcept
18- : m_callInvoker(jsInvoker), m_jsiRuntimeHolder(std::move(jsiRuntimeHolder)) {}
18+ : m_callInvoker(jsInvoker),
19+ m_jsiRuntimeHolder (std::move(jsiRuntimeHolder)),
20+ m_threadId(std::this_thread::get_id()) {}
1921
2022CallInvokerWriter::~CallInvokerWriter () {
2123 if (auto jsiRuntimeHolder = m_jsiRuntimeHolder.lock ()) {
@@ -26,32 +28,30 @@ CallInvokerWriter::~CallInvokerWriter() {
2628void CallInvokerWriter::WithResultArgs (
2729 Mso::Functor<void (facebook::jsi::Runtime &rt, facebook::jsi::Value const *args, size_t argCount)>
2830 handler) noexcept {
29- /*
30- if (m_jsDispatcher.HasThreadAccess()) {
31- VerifyElseCrash(!m_dynamicWriter);
32- if (auto jsiRuntimeHolder = m_jsiRuntimeHolder.lock()) {
33- const facebook::jsi::Value *args{nullptr};
34- size_t argCount{0};
35- m_jsiWriter->AccessResultAsArgs(args, argCount);
36- handler(jsiRuntimeHolder->Runtime(), args, argCount);
37- m_jsiWriter = nullptr;
38- }
39- } else {
40- */
41- VerifyElseCrash (!m_jsiWriter);
42- folly::dynamic dynValue = m_dynamicWriter->TakeValue ();
43- VerifyElseCrash (dynValue.isArray ());
44- m_callInvoker->invokeAsync (
45- [handler, dynValue = std::move (dynValue), weakJsiRuntimeHolder = m_jsiRuntimeHolder, self = get_strong ()](
46- facebook::jsi::Runtime &runtime) {
47- std::vector<facebook::jsi::Value> args;
48- args.reserve (dynValue.size ());
49- for (auto const &item : dynValue) {
50- args.emplace_back (facebook::jsi::valueFromDynamic (runtime, item));
51- }
52- handler (runtime, args.data (), args.size ());
53- });
54- // }
31+ if (m_threadId == std::this_thread::get_id () && m_fastPath) {
32+ VerifyElseCrash (!m_dynamicWriter);
33+ if (auto jsiRuntimeHolder = m_jsiRuntimeHolder.lock ()) {
34+ const facebook::jsi::Value *args{nullptr };
35+ size_t argCount{0 };
36+ m_jsiWriter->AccessResultAsArgs (args, argCount);
37+ handler (jsiRuntimeHolder->Runtime (), args, argCount);
38+ m_jsiWriter = nullptr ;
39+ }
40+ } else {
41+ VerifyElseCrash (!m_jsiWriter);
42+ folly::dynamic dynValue = m_dynamicWriter->TakeValue ();
43+ VerifyElseCrash (dynValue.isArray ());
44+ m_callInvoker->invokeAsync (
45+ [handler, dynValue = std::move (dynValue), weakJsiRuntimeHolder = m_jsiRuntimeHolder, self = get_strong ()](
46+ facebook::jsi::Runtime &runtime) {
47+ std::vector<facebook::jsi::Value> args;
48+ args.reserve (dynValue.size ());
49+ for (auto const &item : dynValue) {
50+ args.emplace_back (facebook::jsi::valueFromDynamic (runtime, item));
51+ }
52+ handler (runtime, args.data (), args.size ());
53+ });
54+ }
5555}
5656
5757void CallInvokerWriter::WriteNull () noexcept {
@@ -96,24 +96,26 @@ void CallInvokerWriter::WriteArrayEnd() noexcept {
9696
9797IJSValueWriter CallInvokerWriter::GetWriter () noexcept {
9898 if (!m_writer) {
99- /*
100- if (m_jsDispatcher.HasThreadAccess()) {
101- if (auto jsiRuntimeHolder = m_jsiRuntimeHolder.lock()) {
102- m_jsiWriter = winrt::make_self<JsiWriter>(jsiRuntimeHolder->Runtime());
103- m_writer = m_jsiWriter.as<IJSValueWriter>();
104- } else {
105- m_writer = winrt::make<JSNoopWriter>();
106- }
107- } else {
108- */
109- m_dynamicWriter = winrt::make_self<DynamicWriter>();
110- m_writer = m_dynamicWriter.as <IJSValueWriter>();
111- // }
99+ if (m_threadId == std::this_thread::get_id () && m_fastPath) {
100+ if (auto jsiRuntimeHolder = m_jsiRuntimeHolder.lock ()) {
101+ m_jsiWriter = winrt::make_self<JsiWriter>(jsiRuntimeHolder->Runtime ());
102+ m_writer = m_jsiWriter.as <IJSValueWriter>();
103+ } else {
104+ m_writer = winrt::make<JSNoopWriter>();
105+ }
106+ } else {
107+ m_dynamicWriter = winrt::make_self<DynamicWriter>();
108+ m_writer = m_dynamicWriter.as <IJSValueWriter>();
109+ }
112110 }
113- Debug (VerifyElseCrash (m_dynamicWriter != nullptr /* || m_jsDispatcher.HasThreadAccess() */ ));
111+ Debug (VerifyElseCrash (m_dynamicWriter != nullptr || (m_threadId == std::this_thread::get_id () && m_fastPath) ));
114112 return m_writer;
115113}
116114
115+ void CallInvokerWriter::ExitCurrentCallInvokeScope () noexcept {
116+ m_fastPath = false ;
117+ }
118+
117119// ===========================================================================
118120// JSNoopWriter implementation
119121// ===========================================================================
@@ -129,4 +131,4 @@ void JSNoopWriter::WriteObjectEnd() noexcept {}
129131void JSNoopWriter::WriteArrayBegin () noexcept {}
130132void JSNoopWriter::WriteArrayEnd () noexcept {}
131133
132- } // namespace winrt::Microsoft::ReactNative
134+ } // namespace winrt::Microsoft::ReactNative
0 commit comments