react-native-windows 0.71.30 → 0.71.32
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/Directory.Build.props +5 -0
- package/Microsoft.ReactNative/IReactDispatcher.cpp +4 -0
- package/Microsoft.ReactNative/IReactDispatcher.h +1 -0
- package/Microsoft.ReactNative/Microsoft.ReactNative.vcxproj +2 -4
- package/Microsoft.ReactNative/ReactHost/ReactInstanceWin.cpp +30 -11
- package/Microsoft.ReactNative/ReactHost/ReactInstanceWin.h +0 -2
- package/Microsoft.ReactNative/Views/DevMenu.cpp +3 -3
- package/Microsoft.ReactNative.Cxx/JSI/NodeApiJsiLoader.cpp +16 -0
- package/Microsoft.ReactNative.Cxx/Microsoft.ReactNative.Cxx.vcxitems +43 -12
- package/Microsoft.ReactNative.Cxx/Microsoft.ReactNative.Cxx.vcxitems.filters +17 -6
- package/PropertySheets/External/Microsoft.ReactNative.Uwp.CSharpApp.targets +1 -1
- package/PropertySheets/External/Microsoft.ReactNative.Uwp.CppApp.targets +1 -1
- package/PropertySheets/External/Microsoft.ReactNative.WinAppSDK.CSharpApp.targets +1 -1
- package/PropertySheets/Generated/PackageVersion.g.props +3 -3
- package/PropertySheets/JSEngine.props +4 -4
- package/PropertySheets/React.Cpp.props +1 -0
- package/PropertySheets/Warnings.props +6 -0
- package/ReactCommon/ReactCommon.vcxproj +53 -1
- package/ReactCommon/cgmanifest.json +15 -0
- package/Scripts/Tfs/Layout-MSRN-Headers.ps1 +36 -0
- package/Shared/DevSupportManager.cpp +2 -9
- package/Shared/DevSupportManager.h +2 -6
- package/Shared/HermesRuntimeHolder.cpp +344 -84
- package/Shared/HermesRuntimeHolder.h +32 -21
- package/Shared/HermesSamplingProfiler.cpp +66 -14
- package/Shared/HermesSamplingProfiler.h +5 -3
- package/Shared/InspectorPackagerConnection.cpp +62 -108
- package/Shared/InspectorPackagerConnection.h +9 -21
- package/Shared/JSI/RuntimeHolder.h +2 -2
- package/Shared/JSI/ScriptStore.h +18 -20
- package/Shared/JSI/V8RuntimeHolder.cpp +260 -0
- package/Shared/JSI/V8RuntimeHolder.h +37 -0
- package/Shared/OInstance.cpp +16 -32
- package/Shared/SafeLoadLibrary.cpp +77 -0
- package/Shared/SafeLoadLibrary.h +19 -0
- package/Shared/Shared.vcxitems +19 -8
- package/Shared/Shared.vcxitems.filters +23 -30
- package/codegen/NativeAccessibilityInfoSpec.g.h +2 -1
- package/codegen/NativeAccessibilityManagerSpec.g.h +27 -16
- package/codegen/NativeActionSheetManagerSpec.g.h +42 -26
- package/codegen/NativeAlertManagerSpec.g.h +18 -12
- package/codegen/NativeAnimatedModuleSpec.g.h +17 -6
- package/codegen/NativeAnimatedTurboModuleSpec.g.h +17 -6
- package/codegen/NativeAnimationsDebugModuleSpec.g.h +2 -1
- package/codegen/NativeAppStateSpec.g.h +16 -5
- package/codegen/NativeAppThemeSpec.g.h +24 -13
- package/codegen/NativeAppearanceSpec.g.h +2 -1
- package/codegen/NativeBlobModuleSpec.g.h +10 -4
- package/codegen/NativeBugReportingSpec.g.h +2 -1
- package/codegen/NativeClipboardSpec.g.h +2 -1
- package/codegen/NativeDatePickerAndroidSpec.g.h +2 -1
- package/codegen/NativeDevLoadingViewSpec.g.h +2 -1
- package/codegen/NativeDevMenuSpec.g.h +2 -1
- package/codegen/NativeDevSettingsSpec.g.h +2 -1
- package/codegen/NativeDevSplitBundleLoaderSpec.g.h +2 -1
- package/codegen/NativeDeviceEventManagerSpec.g.h +2 -1
- package/codegen/NativeDeviceInfoSpec.g.h +41 -20
- package/codegen/NativeDialogManagerAndroidSpec.g.h +26 -15
- package/codegen/NativeDialogManagerWindowsSpec.g.h +27 -16
- package/codegen/NativeExceptionsManagerSpec.g.h +27 -16
- package/codegen/NativeFileReaderModuleSpec.g.h +2 -1
- package/codegen/NativeFrameRateLoggerSpec.g.h +10 -4
- package/codegen/NativeHeadlessJsTaskSupportSpec.g.h +2 -1
- package/codegen/NativeI18nManagerSpec.g.h +11 -5
- package/codegen/NativeImageEditorSpec.g.h +37 -16
- package/codegen/NativeImageLoaderAndroidSpec.g.h +2 -1
- package/codegen/NativeImageLoaderIOSSpec.g.h +2 -1
- package/codegen/NativeImageStoreAndroidSpec.g.h +2 -1
- package/codegen/NativeImageStoreIOSSpec.g.h +16 -5
- package/codegen/NativeIntentAndroidSpec.g.h +2 -1
- package/codegen/NativeJSCHeapCaptureSpec.g.h +2 -1
- package/codegen/NativeJSCSamplingProfilerSpec.g.h +2 -1
- package/codegen/NativeKeyboardObserverSpec.g.h +2 -1
- package/codegen/NativeLinkingManagerSpec.g.h +2 -1
- package/codegen/NativeLogBoxSpec.g.h +2 -1
- package/codegen/NativeModalManagerSpec.g.h +2 -1
- package/codegen/NativeNetworkingAndroidSpec.g.h +2 -1
- package/codegen/NativeNetworkingIOSSpec.g.h +16 -10
- package/codegen/NativePerformanceObserverSpec.g.h +15 -9
- package/codegen/NativePermissionsAndroidSpec.g.h +2 -1
- package/codegen/NativePlatformConstantsAndroidSpec.g.h +29 -18
- package/codegen/NativePlatformConstantsIOSSpec.g.h +24 -13
- package/codegen/NativePlatformConstantsWinSpec.g.h +21 -10
- package/codegen/NativePushNotificationManagerIOSSpec.g.h +36 -20
- package/codegen/NativeRedBoxSpec.g.h +2 -1
- package/codegen/NativeSampleTurboModuleSpec.g.h +11 -5
- package/codegen/NativeSegmentFetcherSpec.g.h +2 -1
- package/codegen/NativeSettingsManagerSpec.g.h +9 -3
- package/codegen/NativeShareModuleSpec.g.h +10 -4
- package/codegen/NativeSoundManagerSpec.g.h +2 -1
- package/codegen/NativeSourceCodeSpec.g.h +9 -3
- package/codegen/NativeStatusBarManagerAndroidSpec.g.h +10 -4
- package/codegen/NativeStatusBarManagerIOSSpec.g.h +17 -6
- package/codegen/NativeTimingSpec.g.h +2 -1
- package/codegen/NativeToastAndroidSpec.g.h +13 -7
- package/codegen/NativeUIManagerSpec.g.h +2 -1
- package/codegen/NativeVibrationSpec.g.h +2 -1
- package/codegen/NativeWebSocketModuleSpec.g.h +9 -3
- package/package.json +3 -3
- package/template/cs-app-WinAppSDK/proj/ExperimentalFeatures.props +1 -1
- package/Microsoft.ReactNative.Cxx/JSI/NodeApiJsiRuntime.cpp +0 -2103
- package/Microsoft.ReactNative.Cxx/JSI/NodeApiJsiRuntime.h +0 -73
- package/Shared/HermesShim.cpp +0 -118
- package/Shared/HermesShim.h +0 -21
- package/Shared/JSI/NapiJsiV8RuntimeHolder.cpp +0 -209
- package/Shared/JSI/NapiJsiV8RuntimeHolder.h +0 -44
- package/Shared/V8JSIRuntimeHolder.cpp +0 -70
- package/Shared/V8JSIRuntimeHolder.h +0 -53
|
@@ -21,10 +21,8 @@
|
|
|
21
21
|
#include <winrt/Windows.Web.Http.Headers.h>
|
|
22
22
|
#include <winrt/Windows.Web.Http.h>
|
|
23
23
|
|
|
24
|
-
#ifdef HERMES_ENABLE_DEBUGGER
|
|
25
24
|
#include <winrt/Windows.ApplicationModel.Activation.h>
|
|
26
25
|
#include <winrt/Windows.Networking.Connectivity.h>
|
|
27
|
-
#endif
|
|
28
26
|
|
|
29
27
|
#pragma warning(push)
|
|
30
28
|
#pragma warning(disable : 4068 4251 4101 4804 4309)
|
|
@@ -243,7 +241,6 @@ void DevSupportManager::StopPollingLiveReload() {
|
|
|
243
241
|
void DevSupportManager::EnsureHermesInspector(
|
|
244
242
|
[[maybe_unused]] const std::string &packagerHost,
|
|
245
243
|
[[maybe_unused]] const uint16_t packagerPort) noexcept {
|
|
246
|
-
#ifdef HERMES_ENABLE_DEBUGGER
|
|
247
244
|
static std::once_flag once;
|
|
248
245
|
std::call_once(once, [this, &packagerHost, packagerPort]() {
|
|
249
246
|
// TODO: should we use the bundleAppId as the app param if available?
|
|
@@ -266,14 +263,10 @@ void DevSupportManager::EnsureHermesInspector(
|
|
|
266
263
|
m_BundleStatusProvider);
|
|
267
264
|
m_inspectorPackagerConnection->connectAsync();
|
|
268
265
|
});
|
|
269
|
-
|
|
270
|
-
#endif
|
|
271
266
|
}
|
|
272
267
|
|
|
273
|
-
void DevSupportManager::UpdateBundleStatus(bool
|
|
274
|
-
|
|
275
|
-
m_BundleStatusProvider->updateBundleStatus(isLastDownloadSucess, updateTimestamp);
|
|
276
|
-
#endif
|
|
268
|
+
void DevSupportManager::UpdateBundleStatus(bool isLastDownloadSuccess, int64_t updateTimestamp) noexcept {
|
|
269
|
+
m_BundleStatusProvider->updateBundleStatus(isLastDownloadSuccess, updateTimestamp);
|
|
277
270
|
}
|
|
278
271
|
|
|
279
272
|
std::pair<std::string, bool> GetJavaScriptFromServer(
|
|
@@ -14,9 +14,7 @@
|
|
|
14
14
|
#include <memory>
|
|
15
15
|
#include <string>
|
|
16
16
|
|
|
17
|
-
#if defined(HERMES_ENABLE_DEBUGGER)
|
|
18
17
|
#include <InspectorPackagerConnection.h>
|
|
19
|
-
#endif
|
|
20
18
|
|
|
21
19
|
namespace facebook {
|
|
22
20
|
namespace react {
|
|
@@ -57,7 +55,6 @@ class DevSupportManager final : public facebook::react::IDevSupportManager {
|
|
|
57
55
|
private:
|
|
58
56
|
std::atomic_bool m_cancellation_token;
|
|
59
57
|
|
|
60
|
-
#if defined(HERMES_ENABLE_DEBUGGER)
|
|
61
58
|
std::shared_ptr<InspectorPackagerConnection> m_inspectorPackagerConnection;
|
|
62
59
|
|
|
63
60
|
struct BundleStatusProvider : public InspectorPackagerConnection::IBundleStatusProvider {
|
|
@@ -65,8 +62,8 @@ class DevSupportManager final : public facebook::react::IDevSupportManager {
|
|
|
65
62
|
return m_bundleStatus;
|
|
66
63
|
}
|
|
67
64
|
|
|
68
|
-
void updateBundleStatus(bool
|
|
69
|
-
m_bundleStatus.
|
|
65
|
+
void updateBundleStatus(bool isLastDownloadSuccess, int64_t updateTimestamp) {
|
|
66
|
+
m_bundleStatus.m_isLastDownloadSuccess = isLastDownloadSuccess;
|
|
70
67
|
m_bundleStatus.m_updateTimestamp = updateTimestamp;
|
|
71
68
|
}
|
|
72
69
|
|
|
@@ -74,7 +71,6 @@ class DevSupportManager final : public facebook::react::IDevSupportManager {
|
|
|
74
71
|
InspectorPackagerConnection::BundleStatus m_bundleStatus;
|
|
75
72
|
};
|
|
76
73
|
std::shared_ptr<BundleStatusProvider> m_BundleStatusProvider = std::make_shared<BundleStatusProvider>();
|
|
77
|
-
#endif
|
|
78
74
|
};
|
|
79
75
|
|
|
80
76
|
} // namespace Microsoft::ReactNative
|
|
@@ -3,134 +3,394 @@
|
|
|
3
3
|
|
|
4
4
|
#include "pch.h"
|
|
5
5
|
|
|
6
|
-
#include
|
|
7
|
-
#include <mutex>
|
|
6
|
+
#include "HermesRuntimeHolder.h"
|
|
8
7
|
|
|
8
|
+
#include <ApiLoaders/HermesApi.h>
|
|
9
9
|
#include <JSI/decorator.h>
|
|
10
|
-
#include <
|
|
10
|
+
#include <NodeApiJsiRuntime.h>
|
|
11
|
+
#include <crash/verifyElseCrash.h>
|
|
11
12
|
#include <cxxreact/SystraceSection.h>
|
|
12
|
-
#include <
|
|
13
|
-
#include
|
|
14
|
-
#include "
|
|
13
|
+
#include <jsinspector/InspectorInterfaces.h>
|
|
14
|
+
#include <mutex>
|
|
15
|
+
#include "SafeLoadLibrary.h"
|
|
15
16
|
|
|
16
|
-
#
|
|
17
|
-
#include <hermes/inspector/chrome/Registration.h>
|
|
18
|
-
#endif
|
|
17
|
+
#define CRASH_ON_ERROR(result) VerifyElseCrash(result == napi_ok);
|
|
19
18
|
|
|
20
|
-
|
|
21
|
-
using namespace Microsoft::ReactNative;
|
|
19
|
+
namespace React {
|
|
20
|
+
using namespace winrt::Microsoft::ReactNative;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
using namespace Microsoft::NodeApiJsi;
|
|
22
24
|
|
|
23
|
-
namespace
|
|
24
|
-
|
|
25
|
+
namespace Microsoft::ReactNative {
|
|
26
|
+
|
|
27
|
+
React::ReactPropertyId<React::ReactNonAbiValue<std::shared_ptr<HermesRuntimeHolder>>>
|
|
28
|
+
HermesRuntimeHolderProperty() noexcept {
|
|
29
|
+
static React::ReactPropertyId<React::ReactNonAbiValue<std::shared_ptr<HermesRuntimeHolder>>> propId{
|
|
30
|
+
L"ReactNative.HermesRuntimeHolder", L"HermesRuntimeHolder"};
|
|
31
|
+
return propId;
|
|
32
|
+
}
|
|
25
33
|
|
|
26
34
|
namespace {
|
|
27
35
|
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
36
|
+
int32_t NAPI_CDECL addInspectorPage(const char *title, const char *vm, void *connectFunc) noexcept;
|
|
37
|
+
void NAPI_CDECL removeInspectorPage(int32_t pageId) noexcept;
|
|
38
|
+
|
|
39
|
+
class HermesFuncResolver : public IFuncResolver {
|
|
40
|
+
public:
|
|
41
|
+
HermesFuncResolver() : libHandle_(LoadLibraryAsPeerFirst(L"hermes.dll")) {}
|
|
42
|
+
|
|
43
|
+
FuncPtr getFuncPtr(const char *funcName) override {
|
|
44
|
+
return reinterpret_cast<FuncPtr>(GetProcAddress(libHandle_, funcName));
|
|
35
45
|
}
|
|
46
|
+
|
|
47
|
+
private:
|
|
48
|
+
HMODULE libHandle_;
|
|
49
|
+
};
|
|
50
|
+
|
|
51
|
+
HermesApi &initHermesApi() noexcept {
|
|
52
|
+
static HermesFuncResolver funcResolver;
|
|
53
|
+
static HermesApi s_hermesApi(&funcResolver);
|
|
54
|
+
HermesApi::setCurrent(&s_hermesApi);
|
|
55
|
+
CRASH_ON_ERROR(s_hermesApi.hermes_set_inspector(&addInspectorPage, &removeInspectorPage));
|
|
56
|
+
return s_hermesApi;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
HermesApi &getHermesApi() noexcept {
|
|
60
|
+
static HermesApi &s_hermesApi = initHermesApi();
|
|
61
|
+
return s_hermesApi;
|
|
36
62
|
}
|
|
37
63
|
|
|
38
|
-
|
|
39
|
-
|
|
64
|
+
class HermesTask {
|
|
65
|
+
public:
|
|
66
|
+
HermesTask(
|
|
67
|
+
void *taskData,
|
|
68
|
+
jsr_task_run_cb taskRunCallback,
|
|
69
|
+
jsr_data_delete_cb taskDataDeleteCallback,
|
|
70
|
+
void *deleterData)
|
|
71
|
+
: taskData_(taskData),
|
|
72
|
+
taskRunCallback_(taskRunCallback),
|
|
73
|
+
taskDataDeleteCallback_(taskDataDeleteCallback),
|
|
74
|
+
deleterData_(deleterData) {}
|
|
75
|
+
|
|
76
|
+
HermesTask(const HermesTask &other) = delete;
|
|
77
|
+
HermesTask &operator=(const HermesTask &other) = delete;
|
|
78
|
+
|
|
79
|
+
~HermesTask() {
|
|
80
|
+
if (taskDataDeleteCallback_ != nullptr) {
|
|
81
|
+
taskDataDeleteCallback_(taskData_, deleterData_);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
void Run() const {
|
|
86
|
+
if (taskRunCallback_ != nullptr) {
|
|
87
|
+
taskRunCallback_(taskData_);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
private:
|
|
92
|
+
void *taskData_;
|
|
93
|
+
jsr_task_run_cb taskRunCallback_;
|
|
94
|
+
jsr_data_delete_cb taskDataDeleteCallback_;
|
|
95
|
+
void *deleterData_;
|
|
96
|
+
};
|
|
97
|
+
|
|
98
|
+
class HermesTaskRunner {
|
|
99
|
+
public:
|
|
100
|
+
static void Create(jsr_config config, std::shared_ptr<facebook::react::MessageQueueThread> queue) {
|
|
101
|
+
CRASH_ON_ERROR(getHermesApi().jsr_config_set_task_runner(
|
|
102
|
+
config, new HermesTaskRunner(std::move(queue)), &PostTask, &Delete, nullptr));
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
private:
|
|
106
|
+
HermesTaskRunner(std::shared_ptr<facebook::react::MessageQueueThread> queue) : queue_(std::move(queue)) {}
|
|
107
|
+
|
|
108
|
+
static void NAPI_CDECL PostTask(
|
|
109
|
+
void *taskRunnerData,
|
|
110
|
+
void *taskData,
|
|
111
|
+
jsr_task_run_cb taskRunCallback,
|
|
112
|
+
jsr_data_delete_cb taskDataDeleteCallback,
|
|
113
|
+
void *deleterData) {
|
|
114
|
+
auto task = std::make_shared<HermesTask>(taskData, taskRunCallback, taskDataDeleteCallback, deleterData);
|
|
115
|
+
reinterpret_cast<HermesTaskRunner *>(taskRunnerData)->queue_->runOnQueue([task = std::move(task)] { task->Run(); });
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
static void NAPI_CDECL Delete(void *taskRunner, void * /*deleterData*/) {
|
|
119
|
+
delete reinterpret_cast<HermesTaskRunner *>(taskRunner);
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
private:
|
|
123
|
+
std::shared_ptr<facebook::react::MessageQueueThread> queue_;
|
|
124
|
+
};
|
|
125
|
+
|
|
126
|
+
struct HermesJsiBuffer : facebook::jsi::Buffer {
|
|
127
|
+
static std::shared_ptr<const facebook::jsi::Buffer>
|
|
128
|
+
Create(const uint8_t *buffer, size_t bufferSize, jsr_data_delete_cb bufferDeleteCallback, void *deleterData) {
|
|
129
|
+
return std::shared_ptr<const facebook::jsi::Buffer>(
|
|
130
|
+
new HermesJsiBuffer(buffer, bufferSize, bufferDeleteCallback, deleterData));
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
HermesJsiBuffer(
|
|
134
|
+
const uint8_t *buffer,
|
|
135
|
+
size_t bufferSize,
|
|
136
|
+
jsr_data_delete_cb bufferDeleteCallback,
|
|
137
|
+
void *deleterData) noexcept
|
|
138
|
+
: buffer_(buffer),
|
|
139
|
+
bufferSize_(bufferSize),
|
|
140
|
+
bufferDeleteCallback_(bufferDeleteCallback),
|
|
141
|
+
deleterData_(deleterData) {}
|
|
142
|
+
|
|
143
|
+
~HermesJsiBuffer() override {
|
|
144
|
+
if (bufferDeleteCallback_) {
|
|
145
|
+
bufferDeleteCallback_(const_cast<uint8_t *>(buffer_), deleterData_);
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
const uint8_t *data() const override {
|
|
150
|
+
return buffer_;
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
size_t size() const override {
|
|
154
|
+
return bufferSize_;
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
private:
|
|
158
|
+
const uint8_t *buffer_;
|
|
159
|
+
size_t bufferSize_;
|
|
160
|
+
jsr_data_delete_cb bufferDeleteCallback_;
|
|
161
|
+
void *deleterData_;
|
|
162
|
+
};
|
|
163
|
+
|
|
164
|
+
class HermesScriptCache {
|
|
40
165
|
public:
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
: m_runtime(runtime), m_hermesRuntime(hermesRuntime), m_thread(std::move(thread)) {}
|
|
166
|
+
static void Create(jsr_config config, std::shared_ptr<facebook::jsi::PreparedScriptStore> scriptStore) {
|
|
167
|
+
CRASH_ON_ERROR(getHermesApi().jsr_config_set_script_cache(
|
|
168
|
+
config, new HermesScriptCache(std::move(scriptStore)), &LoadScript, &StoreScript, &Delete, nullptr));
|
|
169
|
+
}
|
|
46
170
|
|
|
47
|
-
|
|
171
|
+
private:
|
|
172
|
+
HermesScriptCache(std::shared_ptr<facebook::jsi::PreparedScriptStore> scriptStore)
|
|
173
|
+
: scriptStore_(std::move(scriptStore)) {}
|
|
174
|
+
|
|
175
|
+
static void NAPI_CDECL LoadScript(
|
|
176
|
+
void *scriptCache,
|
|
177
|
+
const char *sourceUrl,
|
|
178
|
+
uint64_t sourceHash,
|
|
179
|
+
const char *runtimeName,
|
|
180
|
+
uint64_t runtimeVersion,
|
|
181
|
+
const char *cacheTag,
|
|
182
|
+
const uint8_t **buffer,
|
|
183
|
+
size_t *bufferSize,
|
|
184
|
+
jsr_data_delete_cb *bufferDeleteCallback,
|
|
185
|
+
void **deleterData) {
|
|
186
|
+
auto &scriptStore = reinterpret_cast<HermesScriptCache *>(scriptCache)->scriptStore_;
|
|
187
|
+
std::shared_ptr<const facebook::jsi::Buffer> preparedScript = scriptStore->tryGetPreparedScript(
|
|
188
|
+
facebook::jsi::ScriptSignature{sourceUrl, sourceHash},
|
|
189
|
+
facebook::jsi::JSRuntimeSignature{runtimeName, runtimeVersion},
|
|
190
|
+
cacheTag);
|
|
191
|
+
if (preparedScript) {
|
|
192
|
+
*buffer = preparedScript->data();
|
|
193
|
+
*bufferSize = preparedScript->size();
|
|
194
|
+
*bufferDeleteCallback = [](void * /*data*/, void *deleterData) noexcept {
|
|
195
|
+
delete reinterpret_cast<std::shared_ptr<const facebook::jsi::Buffer> *>(deleterData);
|
|
196
|
+
};
|
|
197
|
+
*deleterData = new std::shared_ptr<const facebook::jsi::Buffer>(std::move(preparedScript));
|
|
198
|
+
} else {
|
|
199
|
+
*buffer = nullptr;
|
|
200
|
+
*bufferSize = 0;
|
|
201
|
+
*bufferDeleteCallback = nullptr;
|
|
202
|
+
*deleterData = nullptr;
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
static void NAPI_CDECL StoreScript(
|
|
207
|
+
void *scriptCache,
|
|
208
|
+
const char *sourceUrl,
|
|
209
|
+
uint64_t sourceHash,
|
|
210
|
+
const char *runtimeName,
|
|
211
|
+
uint64_t runtimeVersion,
|
|
212
|
+
const char *cacheTag,
|
|
213
|
+
const uint8_t *buffer,
|
|
214
|
+
size_t bufferSize,
|
|
215
|
+
jsr_data_delete_cb bufferDeleteCallback,
|
|
216
|
+
void *deleterData) {
|
|
217
|
+
auto &scriptStore = reinterpret_cast<HermesScriptCache *>(scriptCache)->scriptStore_;
|
|
218
|
+
scriptStore->persistPreparedScript(
|
|
219
|
+
HermesJsiBuffer::Create(buffer, bufferSize, bufferDeleteCallback, deleterData),
|
|
220
|
+
facebook::jsi::ScriptSignature{sourceUrl, sourceHash},
|
|
221
|
+
facebook::jsi::JSRuntimeSignature{runtimeName, runtimeVersion},
|
|
222
|
+
cacheTag);
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
static void NAPI_CDECL Delete(void *scriptCache, void * /*deleterData*/) {
|
|
226
|
+
delete reinterpret_cast<HermesScriptCache *>(scriptCache);
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
private:
|
|
230
|
+
std::shared_ptr<facebook::jsi::PreparedScriptStore> scriptStore_;
|
|
231
|
+
};
|
|
232
|
+
|
|
233
|
+
class HermesLocalConnection : public facebook::react::ILocalConnection {
|
|
234
|
+
public:
|
|
235
|
+
HermesLocalConnection(
|
|
236
|
+
std::unique_ptr<facebook::react::IRemoteConnection> remoteConneciton,
|
|
237
|
+
void *connectFunc) noexcept {
|
|
238
|
+
CRASH_ON_ERROR(getHermesApi().hermes_create_local_connection(
|
|
239
|
+
connectFunc,
|
|
240
|
+
reinterpret_cast<hermes_remote_connection>(remoteConneciton.release()),
|
|
241
|
+
&OnRemoteConnectionSendMessage,
|
|
242
|
+
&OnRemoteConnectionDisconnect,
|
|
243
|
+
&OnRemoteConnectionDelete,
|
|
244
|
+
nullptr,
|
|
245
|
+
&localConnection_));
|
|
246
|
+
}
|
|
48
247
|
|
|
49
|
-
|
|
50
|
-
|
|
248
|
+
~HermesLocalConnection() override {
|
|
249
|
+
CRASH_ON_ERROR(getHermesApi().hermes_delete_local_connection(localConnection_));
|
|
51
250
|
}
|
|
52
251
|
|
|
53
|
-
|
|
54
|
-
|
|
252
|
+
void sendMessage(std::string message) {
|
|
253
|
+
CRASH_ON_ERROR(getHermesApi().hermes_local_connection_send_message(localConnection_, message.c_str()));
|
|
55
254
|
}
|
|
56
255
|
|
|
57
|
-
void
|
|
58
|
-
|
|
59
|
-
// gets invoked.
|
|
60
|
-
m_thread->runOnQueue([&runtime = m_runtime]() {
|
|
61
|
-
auto func = runtime->global().getPropertyAsFunction(*runtime, "__tickleJs");
|
|
62
|
-
func.call(*runtime);
|
|
63
|
-
});
|
|
256
|
+
void disconnect() {
|
|
257
|
+
CRASH_ON_ERROR(getHermesApi().hermes_local_connection_disconnect(localConnection_));
|
|
64
258
|
}
|
|
65
259
|
|
|
66
260
|
private:
|
|
67
|
-
|
|
68
|
-
|
|
261
|
+
static void NAPI_CDECL OnRemoteConnectionSendMessage(hermes_remote_connection remoteConnection, const char *message) {
|
|
262
|
+
reinterpret_cast<facebook::react::IRemoteConnection *>(remoteConnection)->onMessage(message);
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
static void NAPI_CDECL OnRemoteConnectionDisconnect(hermes_remote_connection remoteConnection) {
|
|
266
|
+
reinterpret_cast<facebook::react::IRemoteConnection *>(remoteConnection)->onDisconnect();
|
|
267
|
+
}
|
|
69
268
|
|
|
70
|
-
|
|
269
|
+
static void NAPI_CDECL OnRemoteConnectionDelete(void *remoteConnection, void * /*deleterData*/) {
|
|
270
|
+
delete reinterpret_cast<facebook::react::IRemoteConnection *>(remoteConnection);
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
private:
|
|
274
|
+
hermes_local_connection localConnection_{};
|
|
71
275
|
};
|
|
72
|
-
|
|
276
|
+
|
|
277
|
+
int32_t NAPI_CDECL addInspectorPage(const char *title, const char *vm, void *connectFunc) noexcept {
|
|
278
|
+
return facebook::react::getInspectorInstance().addPage(
|
|
279
|
+
title,
|
|
280
|
+
vm,
|
|
281
|
+
[connectFunc,
|
|
282
|
+
hermesApi = HermesApi::current()](std::unique_ptr<facebook::react::IRemoteConnection> remoteConneciton) {
|
|
283
|
+
HermesApi::Scope apiScope(hermesApi);
|
|
284
|
+
return std::make_unique<HermesLocalConnection>(std::move(remoteConneciton), connectFunc);
|
|
285
|
+
});
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
void NAPI_CDECL removeInspectorPage(int32_t pageId) noexcept {
|
|
289
|
+
facebook::react::getInspectorInstance().removePage(pageId);
|
|
290
|
+
}
|
|
73
291
|
|
|
74
292
|
} // namespace
|
|
75
293
|
|
|
76
|
-
|
|
77
|
-
|
|
294
|
+
HermesRuntimeHolder::HermesRuntimeHolder(
|
|
295
|
+
std::shared_ptr<facebook::react::DevSettings> devSettings,
|
|
296
|
+
std::shared_ptr<facebook::react::MessageQueueThread> jsQueue,
|
|
297
|
+
std::shared_ptr<facebook::jsi::PreparedScriptStore> preparedScriptStore) noexcept
|
|
298
|
+
: m_weakDevSettings(devSettings),
|
|
299
|
+
m_jsQueue(std::move(jsQueue)),
|
|
300
|
+
m_preparedScriptStore(std::move(preparedScriptStore)) {}
|
|
301
|
+
|
|
302
|
+
HermesRuntimeHolder::~HermesRuntimeHolder() {
|
|
303
|
+
if (m_runtime) {
|
|
304
|
+
CRASH_ON_ERROR(getHermesApi().jsr_delete_runtime(m_runtime));
|
|
305
|
+
}
|
|
78
306
|
}
|
|
79
307
|
|
|
80
|
-
void HermesRuntimeHolder::
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
308
|
+
void HermesRuntimeHolder::initRuntime() noexcept {
|
|
309
|
+
facebook::react::SystraceSection s("HermesExecutorFactory::makeHermesRuntimeSystraced");
|
|
310
|
+
std::shared_ptr<facebook::react::DevSettings> devSettings = m_weakDevSettings.lock();
|
|
311
|
+
VerifyElseCrash(devSettings);
|
|
312
|
+
|
|
313
|
+
HermesApi &api = getHermesApi();
|
|
314
|
+
HermesApi::setCurrent(&api);
|
|
315
|
+
jsr_config config{};
|
|
316
|
+
CRASH_ON_ERROR(api.jsr_create_config(&config));
|
|
317
|
+
CRASH_ON_ERROR(api.hermes_config_enable_default_crash_handler(config, devSettings->enableDefaultCrashHandler));
|
|
318
|
+
CRASH_ON_ERROR(api.jsr_config_enable_inspector(config, devSettings->useDirectDebugger));
|
|
319
|
+
CRASH_ON_ERROR(api.jsr_config_set_inspector_runtime_name(config, devSettings->debuggerRuntimeName.c_str()));
|
|
320
|
+
CRASH_ON_ERROR(api.jsr_config_set_inspector_port(config, devSettings->debuggerPort));
|
|
321
|
+
CRASH_ON_ERROR(api.jsr_config_set_inspector_break_on_start(config, devSettings->debuggerBreakOnNextLine));
|
|
322
|
+
if (m_jsQueue) {
|
|
323
|
+
HermesTaskRunner::Create(config, m_jsQueue);
|
|
324
|
+
}
|
|
325
|
+
if (m_preparedScriptStore) {
|
|
326
|
+
HermesScriptCache::Create(config, m_preparedScriptStore);
|
|
84
327
|
}
|
|
85
|
-
|
|
328
|
+
jsr_runtime runtime{};
|
|
329
|
+
CRASH_ON_ERROR(api.jsr_create_runtime(config, &runtime));
|
|
330
|
+
CRASH_ON_ERROR(api.jsr_delete_config(config));
|
|
331
|
+
|
|
332
|
+
napi_env env{};
|
|
333
|
+
CRASH_ON_ERROR(api.jsr_runtime_get_node_api_env(runtime, &env));
|
|
334
|
+
|
|
335
|
+
m_jsiRuntime = makeNodeApiJsiRuntime(
|
|
336
|
+
env, &api, [runtime]() { CRASH_ON_ERROR(HermesApi::current()->jsr_delete_runtime(runtime)); });
|
|
337
|
+
m_ownThreadId = std::this_thread::get_id();
|
|
338
|
+
|
|
339
|
+
// Add JS engine information to Error.prototype so in error reporting we
|
|
340
|
+
// can send this information.
|
|
341
|
+
auto errorPrototype = m_jsiRuntime->global()
|
|
342
|
+
.getPropertyAsObject(*m_jsiRuntime, "Error")
|
|
343
|
+
.getPropertyAsObject(*m_jsiRuntime, "prototype");
|
|
344
|
+
errorPrototype.setProperty(*m_jsiRuntime, "jsEngine", "hermes");
|
|
86
345
|
}
|
|
87
346
|
|
|
88
347
|
facebook::react::JSIEngineOverride HermesRuntimeHolder::getRuntimeType() noexcept {
|
|
89
348
|
return facebook::react::JSIEngineOverride::Hermes;
|
|
90
349
|
}
|
|
91
350
|
|
|
92
|
-
std::shared_ptr<jsi::Runtime> HermesRuntimeHolder::getRuntime() noexcept {
|
|
93
|
-
std::call_once(
|
|
351
|
+
std::shared_ptr<facebook::jsi::Runtime> HermesRuntimeHolder::getRuntime() noexcept {
|
|
352
|
+
std::call_once(m_onceFlag, [this]() { initRuntime(); });
|
|
353
|
+
VerifyElseCrash(m_jsiRuntime);
|
|
354
|
+
return m_jsiRuntime;
|
|
355
|
+
}
|
|
356
|
+
|
|
357
|
+
void HermesRuntimeHolder::crashHandler(int fileDescriptor) noexcept {
|
|
358
|
+
CRASH_ON_ERROR(getHermesApi().hermes_dump_crash_data(m_runtime, fileDescriptor));
|
|
359
|
+
}
|
|
94
360
|
|
|
95
|
-
|
|
96
|
-
|
|
361
|
+
void HermesRuntimeHolder::teardown() noexcept {
|
|
362
|
+
// TODO: (vmoroz) Implement
|
|
363
|
+
}
|
|
97
364
|
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
365
|
+
std::shared_ptr<HermesRuntimeHolder> HermesRuntimeHolder::loadFrom(
|
|
366
|
+
React::ReactPropertyBag const &propertyBag) noexcept {
|
|
367
|
+
return *(propertyBag.Get(HermesRuntimeHolderProperty()));
|
|
368
|
+
}
|
|
101
369
|
|
|
102
|
-
|
|
370
|
+
void HermesRuntimeHolder::storeTo(
|
|
371
|
+
React::ReactPropertyBag const &propertyBag,
|
|
372
|
+
std::shared_ptr<HermesRuntimeHolder> const &holder) noexcept {
|
|
373
|
+
propertyBag.Set(HermesRuntimeHolderProperty(), holder);
|
|
103
374
|
}
|
|
104
375
|
|
|
105
|
-
HermesRuntimeHolder::
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
: m_weakDevSettings(devSettings), m_jsQueue(std::move(jsQueue)) {}
|
|
376
|
+
void HermesRuntimeHolder::addToProfiling() const noexcept {
|
|
377
|
+
CRASH_ON_ERROR(getHermesApi().hermes_sampling_profiler_add(m_runtime));
|
|
378
|
+
}
|
|
109
379
|
|
|
110
|
-
void HermesRuntimeHolder::
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
std::terminate();
|
|
380
|
+
void HermesRuntimeHolder::removeFromProfiling() const noexcept {
|
|
381
|
+
CRASH_ON_ERROR(getHermesApi().hermes_sampling_profiler_remove(m_runtime));
|
|
382
|
+
}
|
|
114
383
|
|
|
115
|
-
|
|
116
|
-
|
|
384
|
+
/*static*/ void HermesRuntimeHolder::enableSamplingProfiler() noexcept {
|
|
385
|
+
CRASH_ON_ERROR(getHermesApi().hermes_sampling_profiler_enable());
|
|
386
|
+
}
|
|
117
387
|
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
facebook::hermes::inspector::chrome::enableDebugging(
|
|
122
|
-
std::move(adapter),
|
|
123
|
-
devSettings->debuggerRuntimeName.empty() ? "Hermes React Native" : devSettings->debuggerRuntimeName);
|
|
124
|
-
}
|
|
125
|
-
#endif
|
|
388
|
+
/*static*/ void HermesRuntimeHolder::disableSamplingProfiler() noexcept {
|
|
389
|
+
CRASH_ON_ERROR(getHermesApi().hermes_sampling_profiler_disable());
|
|
390
|
+
}
|
|
126
391
|
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
auto errorPrototype = m_hermesRuntime->global()
|
|
130
|
-
.getPropertyAsObject(*m_hermesRuntime, "Error")
|
|
131
|
-
.getPropertyAsObject(*m_hermesRuntime, "prototype");
|
|
132
|
-
errorPrototype.setProperty(*m_hermesRuntime, "jsEngine", "hermes");
|
|
392
|
+
/*static*/ void HermesRuntimeHolder::dumpSampledTraceToFile(const std::string &fileName) noexcept {
|
|
393
|
+
CRASH_ON_ERROR(getHermesApi().hermes_sampling_profiler_dump_to_file(fileName.c_str()));
|
|
133
394
|
}
|
|
134
395
|
|
|
135
|
-
} // namespace
|
|
136
|
-
} // namespace facebook
|
|
396
|
+
} // namespace Microsoft::ReactNative
|
|
@@ -2,43 +2,54 @@
|
|
|
2
2
|
// Licensed under the MIT License.
|
|
3
3
|
|
|
4
4
|
#pragma once
|
|
5
|
-
#include <JSI/RuntimeHolder.h>
|
|
6
|
-
|
|
7
|
-
#include <jsi/jsi.h>
|
|
8
|
-
#include <thread>
|
|
9
|
-
|
|
10
5
|
#include <DevSettings.h>
|
|
6
|
+
#include <JSI/RuntimeHolder.h>
|
|
7
|
+
#include <JSI/ScriptStore.h>
|
|
8
|
+
#include <ReactPropertyBag.h>
|
|
9
|
+
#include <cxxreact/MessageQueueThread.h>
|
|
10
|
+
#include <hermes/hermes_api.h>
|
|
11
11
|
|
|
12
|
-
namespace
|
|
13
|
-
class HermesRuntime;
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
namespace facebook {
|
|
17
|
-
namespace react {
|
|
12
|
+
namespace Microsoft::ReactNative {
|
|
18
13
|
|
|
19
14
|
class HermesRuntimeHolder : public Microsoft::JSI::RuntimeHolderLazyInit {
|
|
20
|
-
public:
|
|
15
|
+
public: // RuntimeHolderLazyInit implementation.
|
|
21
16
|
std::shared_ptr<facebook::jsi::Runtime> getRuntime() noexcept override;
|
|
22
17
|
facebook::react::JSIEngineOverride getRuntimeType() noexcept override;
|
|
23
|
-
|
|
24
18
|
void crashHandler(int fileDescriptor) noexcept override;
|
|
25
|
-
|
|
26
19
|
void teardown() noexcept override;
|
|
27
20
|
|
|
21
|
+
public:
|
|
28
22
|
HermesRuntimeHolder(
|
|
29
23
|
std::shared_ptr<facebook::react::DevSettings> devSettings,
|
|
30
|
-
std::shared_ptr<facebook::react::MessageQueueThread> jsQueue
|
|
24
|
+
std::shared_ptr<facebook::react::MessageQueueThread> jsQueue,
|
|
25
|
+
std::shared_ptr<facebook::jsi::PreparedScriptStore> preparedScriptStore) noexcept;
|
|
26
|
+
~HermesRuntimeHolder();
|
|
27
|
+
|
|
28
|
+
static std::shared_ptr<HermesRuntimeHolder> loadFrom(
|
|
29
|
+
winrt::Microsoft::ReactNative::ReactPropertyBag const &propertyBag) noexcept;
|
|
30
|
+
|
|
31
|
+
static void storeTo(
|
|
32
|
+
winrt::Microsoft::ReactNative::ReactPropertyBag const &propertyBag,
|
|
33
|
+
std::shared_ptr<HermesRuntimeHolder> const &holder) noexcept;
|
|
34
|
+
|
|
35
|
+
void addToProfiling() const noexcept;
|
|
36
|
+
void removeFromProfiling() const noexcept;
|
|
37
|
+
|
|
38
|
+
static void enableSamplingProfiler() noexcept;
|
|
39
|
+
static void disableSamplingProfiler() noexcept;
|
|
40
|
+
static void dumpSampledTraceToFile(const std::string &fileName) noexcept;
|
|
31
41
|
|
|
32
42
|
private:
|
|
33
43
|
void initRuntime() noexcept;
|
|
34
|
-
std::shared_ptr<facebook::hermes::HermesRuntime> m_hermesRuntime;
|
|
35
|
-
|
|
36
|
-
std::once_flag m_once_flag;
|
|
37
|
-
std::thread::id m_own_thread_id;
|
|
38
44
|
|
|
45
|
+
private:
|
|
46
|
+
jsr_runtime m_runtime{};
|
|
47
|
+
std::shared_ptr<facebook::jsi::Runtime> m_jsiRuntime;
|
|
48
|
+
std::once_flag m_onceFlag{};
|
|
49
|
+
std::thread::id m_ownThreadId{};
|
|
39
50
|
std::weak_ptr<facebook::react::DevSettings> m_weakDevSettings;
|
|
40
51
|
std::shared_ptr<facebook::react::MessageQueueThread> m_jsQueue;
|
|
52
|
+
std::shared_ptr<facebook::jsi::PreparedScriptStore> m_preparedScriptStore;
|
|
41
53
|
};
|
|
42
54
|
|
|
43
|
-
} // namespace
|
|
44
|
-
} // namespace facebook
|
|
55
|
+
} // namespace Microsoft::ReactNative
|