@@ -15,7 +15,9 @@ namespace winrt::Microsoft::ReactNative {
15
15
CallInvokerWriter::CallInvokerWriter (
16
16
const std::shared_ptr<facebook::react::CallInvoker> &jsInvoker,
17
17
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()) {}
19
21
20
22
CallInvokerWriter::~CallInvokerWriter () {
21
23
if (auto jsiRuntimeHolder = m_jsiRuntimeHolder.lock ()) {
@@ -26,32 +28,30 @@ CallInvokerWriter::~CallInvokerWriter() {
26
28
void CallInvokerWriter::WithResultArgs (
27
29
Mso::Functor<void (facebook::jsi::Runtime &rt, facebook::jsi::Value const *args, size_t argCount)>
28
30
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
+ }
55
55
}
56
56
57
57
void CallInvokerWriter::WriteNull () noexcept {
@@ -96,24 +96,26 @@ void CallInvokerWriter::WriteArrayEnd() noexcept {
96
96
97
97
IJSValueWriter CallInvokerWriter::GetWriter () noexcept {
98
98
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
+ }
112
110
}
113
- Debug (VerifyElseCrash (m_dynamicWriter != nullptr /* || m_jsDispatcher.HasThreadAccess() */ ));
111
+ Debug (VerifyElseCrash (m_dynamicWriter != nullptr || (m_threadId == std::this_thread::get_id () && m_fastPath) ));
114
112
return m_writer;
115
113
}
116
114
115
+ void CallInvokerWriter::ExitCurrentCallInvokeScope () noexcept {
116
+ m_fastPath = false ;
117
+ }
118
+
117
119
// ===========================================================================
118
120
// JSNoopWriter implementation
119
121
// ===========================================================================
@@ -129,4 +131,4 @@ void JSNoopWriter::WriteObjectEnd() noexcept {}
129
131
void JSNoopWriter::WriteArrayBegin () noexcept {}
130
132
void JSNoopWriter::WriteArrayEnd () noexcept {}
131
133
132
- } // namespace winrt::Microsoft::ReactNative
134
+ } // namespace winrt::Microsoft::ReactNative
0 commit comments