Skip to content

Commit 228c190

Browse files
committed
Use latest Hermes ABI-safe API
1 parent d80a4bd commit 228c190

File tree

13 files changed

+242
-172
lines changed

13 files changed

+242
-172
lines changed

packages/@react-native-windows/telemetry/src/test/projects/UsesPackagesConfig/packages.config

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,5 +2,5 @@
22
<packages>
33
<package id="Microsoft.Windows.CppWinRT" version="2.0.210312.4" targetFramework="native"/>
44
<package id="Microsoft.UI.Xaml" version="2.6.0" targetFramework="native"/>
5-
<package id="ReactNative.Hermes.Windows" version="0.0.0-2301.25002-ccf86d4f" targetFramework="native"/>
5+
<package id="ReactNative.Hermes.Windows" version="0.0.0-2302.1002-2d4bf1df" targetFramework="native"/>
66
</packages>

packages/playground/windows/playground-composition/packages.config

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,5 +9,5 @@
99
<package id="Microsoft.UI.Xaml" version="2.7.0-prerelease.210913003" targetFramework="native"/>
1010
<package id="Microsoft.VCRTForwarders.140" version="1.0.2-rc" targetFramework="native"/>
1111
<package id="Microsoft.Windows.CppWinRT" version="2.0.210312.4" targetFramework="native"/>
12-
<package id="ReactNative.Hermes.Windows" version="0.0.0-2301.25002-ccf86d4f" targetFramework="native"/>
12+
<package id="ReactNative.Hermes.Windows" version="0.0.0-2302.1002-2d4bf1df" targetFramework="native"/>
1313
</packages>

packages/playground/windows/playground-win32/packages.config

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,5 +9,5 @@
99
<package id="Microsoft.UI.Xaml" version="2.7.0-prerelease.210913003" targetFramework="native"/>
1010
<package id="Microsoft.VCRTForwarders.140" version="1.0.2-rc" targetFramework="native"/>
1111
<package id="Microsoft.Windows.CppWinRT" version="2.0.210312.4" targetFramework="native"/>
12-
<package id="ReactNative.Hermes.Windows" version="0.0.0-2301.25002-ccf86d4f" targetFramework="native"/>
12+
<package id="ReactNative.Hermes.Windows" version="0.0.0-2302.1002-2d4bf1df" targetFramework="native"/>
1313
</packages>

packages/playground/windows/playground/packages.config

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,5 +3,5 @@
33
<package id="Microsoft.Windows.CppWinRT" version="2.0.210312.4" targetFramework="native"/>
44
<package id="Microsoft.UI.Xaml" version="2.7.0" targetFramework="native"/>
55
<package id="Microsoft.WinUI" version="3.0.0-preview4.210210.4" targetFramework="native"/>
6-
<package id="ReactNative.Hermes.Windows" version="0.0.0-2301.25002-ccf86d4f" targetFramework="native"/>
6+
<package id="ReactNative.Hermes.Windows" version="0.0.0-2302.1002-2d4bf1df" targetFramework="native"/>
77
</packages>

vnext/Microsoft.ReactNative/Views/DevMenu.cpp

Lines changed: 5 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -15,17 +15,11 @@
1515
#include "winrt/Windows.UI.Core.h"
1616
#include "winrt/Windows.UI.Xaml.Interop.h"
1717

18-
#include <hermes/hermes.h>
1918
#include <winrt/Windows.ApplicationModel.DataTransfer.h>
20-
#include "HermesRuntimeHolder.h"
2119
#include "HermesSamplingProfiler.h"
2220

2321
using namespace winrt::Windows::ApplicationModel;
2422

25-
namespace React {
26-
using namespace winrt::Microsoft::ReactNative;
27-
}
28-
2923
namespace Microsoft::ReactNative {
3024

3125
React::ReactPropertyId<React::ReactNonAbiValue<std::shared_ptr<DevMenuManager>>> DevMenuManagerProperty() noexcept {
@@ -125,7 +119,7 @@ void DevMenuManager::CreateAndShowUI() noexcept {
125119

126120
std::ostringstream os;
127121
if (Microsoft::ReactNative::HermesSamplingProfiler::IsStarted()) {
128-
os << "Hermes Sampling profiler is running.. !";
122+
os << "Hermes Sampling profiler is running!";
129123
} else {
130124
os << "Click to start.";
131125
}
@@ -211,31 +205,21 @@ void DevMenuManager::CreateAndShowUI() noexcept {
211205
if (Mso::React::ReactOptions::JsiEngine(m_context->Properties()) == Mso::React::JSIEngine::Hermes) {
212206
m_samplingProfilerRevoker = devMenu.SamplingProfiler().Click(
213207
winrt::auto_revoke,
214-
[wkThis = weak_from_this()](
215-
auto & /*sender*/, xaml::RoutedEventArgs const & /*args*/) noexcept -> winrt::fire_and_forget {
208+
[wkThis = weak_from_this()](auto & /*sender*/, xaml::RoutedEventArgs const & /*args*/) noexcept
209+
-> winrt::fire_and_forget {
216210
if (auto strongThis = wkThis.lock()) {
217211
strongThis->Hide();
218-
auto jsDispatcher =
219-
React::implementation::ReactDispatcher::GetJSDispatcher(strongThis->m_context->Properties());
220212
if (!Microsoft::ReactNative::HermesSamplingProfiler::IsStarted()) {
221-
jsDispatcher.Post([propertyBag = React::ReactPropertyBag(strongThis->m_context->Properties())] {
222-
auto hermesRuntimeHolder = facebook::react::HermesRuntimeHolder::loadFrom(propertyBag);
223-
hermesRuntimeHolder->getHermesRuntime()->registerForProfiling();
224-
Microsoft::ReactNative::HermesSamplingProfiler::Start();
225-
});
213+
Microsoft::ReactNative::HermesSamplingProfiler::Start(strongThis->m_context);
226214
} else {
227-
auto traceFilePath = co_await Microsoft::ReactNative::HermesSamplingProfiler::Stop();
215+
auto traceFilePath = co_await Microsoft::ReactNative::HermesSamplingProfiler::Stop(strongThis->m_context);
228216
auto uiDispatcher =
229217
React::implementation::ReactDispatcher::GetUIDispatcher(strongThis->m_context->Properties());
230218
uiDispatcher.Post([traceFilePath]() {
231219
DataTransfer::DataPackage data;
232220
data.SetText(winrt::to_hstring(traceFilePath));
233221
DataTransfer::Clipboard::SetContentWithOptions(data, nullptr);
234222
});
235-
jsDispatcher.Post([propertyBag = React::ReactPropertyBag(strongThis->m_context->Properties())]() {
236-
auto hermesRuntimeHolder = facebook::react::HermesRuntimeHolder::loadFrom(propertyBag);
237-
hermesRuntimeHolder->getHermesRuntime()->unregisterForProfiling();
238-
});
239223
}
240224
}
241225
});

vnext/PropertySheets/JSEngine.props

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
<!-- Enabling this will (1) Include hermes glues in the Microsoft.ReactNative binaries AND (2) Make hermes the default engine -->
1515
<UseHermes Condition="'$(UseHermes)' == ''">false</UseHermes>
1616
<!-- This will be true if (1) the client want to use hermes by setting UseHermes to true OR (2) We are building for UWP where dynamic switching is enabled -->
17-
<HermesVersion Condition="'$(HermesVersion)' == ''">0.0.0-2301.25002-ccf86d4f</HermesVersion>
17+
<HermesVersion Condition="'$(HermesVersion)' == ''">0.0.0-2302.1002-2d4bf1df</HermesVersion>
1818
<HermesPackage Condition="'$(HermesPackage)' == '' And Exists('$(PkgReactNative_Hermes_Windows)')">$(PkgReactNative_Hermes_Windows)</HermesPackage>
1919
<HermesPackage Condition="'$(HermesPackage)' == ''">$(NuGetPackageRoot)\ReactNative.Hermes.Windows\$(HermesVersion)</HermesPackage>
2020
<EnableHermesInspectorInReleaseFlavor Condition="'$(EnableHermesInspectorInReleaseFlavor)' == ''">false</EnableHermesInspectorInReleaseFlavor>

vnext/Shared/HermesRuntimeHolder.cpp

Lines changed: 31 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -3,29 +3,29 @@
33

44
#include "pch.h"
55

6-
#include <memory>
7-
#include <mutex>
6+
#include "HermesRuntimeHolder.h"
87

98
#include <JSI/decorator.h>
109
#include <cxxreact/MessageQueueThread.h>
1110
#include <cxxreact/SystraceSection.h>
1211
#include <hermes/hermes.h>
13-
#include "HermesRuntimeHolder.h"
1412
#include "HermesShim.h"
1513

1614
#if defined(HERMES_ENABLE_DEBUGGER)
1715
#include <hermes/inspector/chrome/Registration.h>
1816
#endif
1917

18+
#include <memory>
19+
#include <mutex>
20+
2021
using namespace facebook;
2122
using namespace Microsoft::ReactNative;
2223

2324
namespace React {
2425
using namespace winrt::Microsoft::ReactNative;
2526
}
2627

27-
namespace facebook {
28-
namespace react {
28+
namespace facebook::react {
2929

3030
React::ReactPropertyId<React::ReactNonAbiValue<std::shared_ptr<HermesRuntimeHolder>>>
3131
HermesRuntimeHolderProperty() noexcept {
@@ -36,16 +36,6 @@ HermesRuntimeHolderProperty() noexcept {
3636

3737
namespace {
3838

39-
std::unique_ptr<facebook::hermes::HermesRuntime> makeHermesRuntimeSystraced(bool enableDefaultCrashHandler) {
40-
SystraceSection s("HermesExecutorFactory::makeHermesRuntimeSystraced");
41-
if (enableDefaultCrashHandler) {
42-
return HermesShim::makeHermesRuntimeWithWER();
43-
} else {
44-
auto runtimeConfig = ::hermes::vm::RuntimeConfig();
45-
return HermesShim::makeHermesRuntime(runtimeConfig);
46-
}
47-
}
48-
4939
#ifdef HERMES_ENABLE_DEBUGGER
5040
class HermesExecutorRuntimeAdapter final : public facebook::hermes::inspector::RuntimeAdapter {
5141
public:
@@ -82,10 +72,19 @@ class HermesExecutorRuntimeAdapter final : public facebook::hermes::inspector::R
8272
};
8373
#endif
8474

75+
std::shared_ptr<HermesShim> makeHermesShimSystraced(bool enableDefaultCrashHandler) {
76+
SystraceSection s("HermesExecutorFactory::makeHermesRuntimeSystraced");
77+
if (enableDefaultCrashHandler) {
78+
return HermesShim::makeWithWER();
79+
} else {
80+
return HermesShim::make();
81+
}
82+
}
83+
8584
} // namespace
8685

8786
void HermesRuntimeHolder::crashHandler(int fileDescriptor) noexcept {
88-
HermesShim::hermesCrashHandler(*m_hermesRuntime, fileDescriptor);
87+
m_hermesShim->dumpCrashData(fileDescriptor);
8988
}
9089

9190
void HermesRuntimeHolder::teardown() noexcept {
@@ -101,19 +100,9 @@ facebook::react::JSIEngineOverride HermesRuntimeHolder::getRuntimeType() noexcep
101100
}
102101

103102
std::shared_ptr<jsi::Runtime> HermesRuntimeHolder::getRuntime() noexcept {
104-
return getHermesRuntime();
105-
}
106-
107-
std::shared_ptr<facebook::hermes::HermesRuntime> HermesRuntimeHolder::getHermesRuntime() noexcept {
108-
std::call_once(m_once_flag, [this]() { initRuntime(); });
109-
110-
if (!m_hermesRuntime)
111-
std::terminate();
112-
113-
// Make sure that the runtime instance is not consumed from multiple threads.
114-
if (m_own_thread_id != std::this_thread::get_id())
115-
std::terminate();
116-
103+
std::call_once(m_onceFlag, [this]() { initRuntime(); });
104+
VerifyElseCrash(m_hermesRuntime);
105+
VerifyElseCrashSz(m_ownThreadId == std::this_thread::get_id(), "Must be accessed from JS thread.");
117106
return m_hermesRuntime;
118107
}
119108

@@ -124,11 +113,11 @@ HermesRuntimeHolder::HermesRuntimeHolder(
124113

125114
void HermesRuntimeHolder::initRuntime() noexcept {
126115
auto devSettings = m_weakDevSettings.lock();
127-
if (!devSettings)
128-
std::terminate();
116+
VerifyElseCrash(devSettings);
129117

130-
m_hermesRuntime = makeHermesRuntimeSystraced(devSettings->enableDefaultCrashHandler);
131-
m_own_thread_id = std::this_thread::get_id();
118+
m_hermesShim = makeHermesShimSystraced(devSettings->enableDefaultCrashHandler);
119+
m_hermesRuntime = m_hermesShim->getRuntime();
120+
m_ownThreadId = std::this_thread::get_id();
132121

133122
#ifdef HERMES_ENABLE_DEBUGGER
134123
if (devSettings->useDirectDebugger) {
@@ -158,5 +147,12 @@ void HermesRuntimeHolder::storeTo(
158147
propertyBag.Set(HermesRuntimeHolderProperty(), holder);
159148
}
160149

161-
} // namespace react
162-
} // namespace facebook
150+
void HermesRuntimeHolder::addToProfiling() const noexcept {
151+
m_hermesShim->addToProfiling();
152+
}
153+
154+
void HermesRuntimeHolder::removeFromProfiling() const noexcept {
155+
m_hermesShim->removeFromProfiling();
156+
}
157+
158+
} // namespace facebook::react

vnext/Shared/HermesRuntimeHolder.h

Lines changed: 18 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -14,41 +14,46 @@ namespace facebook::hermes {
1414
class HermesRuntime;
1515
}
1616

17-
namespace facebook {
18-
namespace react {
17+
namespace Microsoft::ReactNative {
18+
class HermesShim;
19+
}
20+
21+
namespace facebook::react {
22+
23+
class MessageQueueThread;
1924

2025
class HermesRuntimeHolder : public Microsoft::JSI::RuntimeHolderLazyInit {
21-
public:
26+
public: // RuntimeHolderLazyInit implementation.
2227
std::shared_ptr<facebook::jsi::Runtime> getRuntime() noexcept override;
2328
facebook::react::JSIEngineOverride getRuntimeType() noexcept override;
24-
2529
void crashHandler(int fileDescriptor) noexcept override;
26-
2730
void teardown() noexcept override;
2831

32+
public:
2933
HermesRuntimeHolder(
3034
std::shared_ptr<facebook::react::DevSettings> devSettings,
3135
std::shared_ptr<facebook::react::MessageQueueThread> jsQueue) noexcept;
3236

33-
std::shared_ptr<facebook::hermes::HermesRuntime> getHermesRuntime() noexcept;
34-
3537
static std::shared_ptr<HermesRuntimeHolder> loadFrom(
3638
winrt::Microsoft::ReactNative::ReactPropertyBag const &propertyBag) noexcept;
3739

3840
static void storeTo(
3941
winrt::Microsoft::ReactNative::ReactPropertyBag const &propertyBag,
4042
std::shared_ptr<HermesRuntimeHolder> const &holder) noexcept;
4143

44+
void addToProfiling() const noexcept;
45+
void removeFromProfiling() const noexcept;
46+
4247
private:
4348
void initRuntime() noexcept;
44-
std::shared_ptr<facebook::hermes::HermesRuntime> m_hermesRuntime;
45-
46-
std::once_flag m_once_flag;
47-
std::thread::id m_own_thread_id;
4849

50+
private:
51+
std::shared_ptr<Microsoft::ReactNative::HermesShim> m_hermesShim;
52+
std::shared_ptr<facebook::hermes::HermesRuntime> m_hermesRuntime;
53+
std::once_flag m_onceFlag{};
54+
std::thread::id m_ownThreadId{};
4955
std::weak_ptr<facebook::react::DevSettings> m_weakDevSettings;
5056
std::shared_ptr<facebook::react::MessageQueueThread> m_jsQueue;
5157
};
5258

53-
} // namespace react
54-
} // namespace facebook
59+
} // namespace facebook::react

0 commit comments

Comments
 (0)