cache closures from hooks.dart (#23230)
diff --git a/lib/ui/window/platform_configuration.cc b/lib/ui/window/platform_configuration.cc
index e8ff227..ccf9cc8 100644
--- a/lib/ui/window/platform_configuration.cc
+++ b/lib/ui/window/platform_configuration.cc
@@ -196,80 +196,109 @@
PlatformConfiguration::~PlatformConfiguration() {}
void PlatformConfiguration::DidCreateIsolate() {
- library_.Set(tonic::DartState::Current(),
- Dart_LookupLibrary(tonic::ToDart("dart:ui")));
+ Dart_Handle library = Dart_LookupLibrary(tonic::ToDart("dart:ui"));
+ update_locales_.Set(tonic::DartState::Current(),
+ Dart_GetField(library, tonic::ToDart("_updateLocales")));
+ update_user_settings_data_.Set(
+ tonic::DartState::Current(),
+ Dart_GetField(library, tonic::ToDart("_updateUserSettingsData")));
+ update_lifecycle_state_.Set(
+ tonic::DartState::Current(),
+ Dart_GetField(library, tonic::ToDart("_updateLifecycleState")));
+ update_semantics_enabled_.Set(
+ tonic::DartState::Current(),
+ Dart_GetField(library, tonic::ToDart("_updateSemanticsEnabled")));
+ update_accessibility_features_.Set(
+ tonic::DartState::Current(),
+ Dart_GetField(library, tonic::ToDart("_updateAccessibilityFeatures")));
+ dispatch_platform_message_.Set(
+ tonic::DartState::Current(),
+ Dart_GetField(library, tonic::ToDart("_dispatchPlatformMessage")));
+ dispatch_semantics_action_.Set(
+ tonic::DartState::Current(),
+ Dart_GetField(library, tonic::ToDart("_dispatchSemanticsAction")));
+ begin_frame_.Set(tonic::DartState::Current(),
+ Dart_GetField(library, tonic::ToDart("_beginFrame")));
+ draw_frame_.Set(tonic::DartState::Current(),
+ Dart_GetField(library, tonic::ToDart("_drawFrame")));
+ report_timings_.Set(tonic::DartState::Current(),
+ Dart_GetField(library, tonic::ToDart("_reportTimings")));
windows_.insert(std::make_pair(0, std::unique_ptr<Window>(new Window{
0, ViewportMetrics{1.0, 0.0, 0.0}})));
}
void PlatformConfiguration::UpdateLocales(
const std::vector<std::string>& locales) {
- std::shared_ptr<tonic::DartState> dart_state = library_.dart_state().lock();
+ std::shared_ptr<tonic::DartState> dart_state =
+ update_locales_.dart_state().lock();
if (!dart_state) {
return;
}
+
tonic::DartState::Scope scope(dart_state);
- tonic::LogIfError(tonic::DartInvokeField(
- library_.value(), "_updateLocales",
- {
- tonic::ToDart<std::vector<std::string>>(locales),
- }));
+ tonic::LogIfError(
+ tonic::DartInvoke(update_locales_.Get(),
+ {
+ tonic::ToDart<std::vector<std::string>>(locales),
+ }));
}
void PlatformConfiguration::UpdateUserSettingsData(const std::string& data) {
- std::shared_ptr<tonic::DartState> dart_state = library_.dart_state().lock();
+ std::shared_ptr<tonic::DartState> dart_state =
+ update_user_settings_data_.dart_state().lock();
if (!dart_state) {
return;
}
tonic::DartState::Scope scope(dart_state);
- tonic::LogIfError(tonic::DartInvokeField(library_.value(),
- "_updateUserSettingsData",
- {
- tonic::StdStringToDart(data),
- }));
+ tonic::LogIfError(tonic::DartInvoke(update_user_settings_data_.Get(),
+ {
+ tonic::StdStringToDart(data),
+ }));
}
void PlatformConfiguration::UpdateLifecycleState(const std::string& data) {
- std::shared_ptr<tonic::DartState> dart_state = library_.dart_state().lock();
+ std::shared_ptr<tonic::DartState> dart_state =
+ update_lifecycle_state_.dart_state().lock();
if (!dart_state) {
return;
}
tonic::DartState::Scope scope(dart_state);
- tonic::LogIfError(tonic::DartInvokeField(library_.value(),
- "_updateLifecycleState",
- {
- tonic::StdStringToDart(data),
- }));
+ tonic::LogIfError(tonic::DartInvoke(update_lifecycle_state_.Get(),
+ {
+ tonic::StdStringToDart(data),
+ }));
}
void PlatformConfiguration::UpdateSemanticsEnabled(bool enabled) {
- std::shared_ptr<tonic::DartState> dart_state = library_.dart_state().lock();
+ std::shared_ptr<tonic::DartState> dart_state =
+ update_semantics_enabled_.dart_state().lock();
if (!dart_state) {
return;
}
tonic::DartState::Scope scope(dart_state);
UIDartState::ThrowIfUIOperationsProhibited();
- tonic::LogIfError(tonic::DartInvokeField(
- library_.value(), "_updateSemanticsEnabled", {tonic::ToDart(enabled)}));
+ tonic::LogIfError(tonic::DartInvoke(update_semantics_enabled_.Get(),
+ {tonic::ToDart(enabled)}));
}
void PlatformConfiguration::UpdateAccessibilityFeatures(int32_t values) {
- std::shared_ptr<tonic::DartState> dart_state = library_.dart_state().lock();
+ std::shared_ptr<tonic::DartState> dart_state =
+ update_accessibility_features_.dart_state().lock();
if (!dart_state) {
return;
}
tonic::DartState::Scope scope(dart_state);
- tonic::LogIfError(tonic::DartInvokeField(library_.value(),
- "_updateAccessibilityFeatures",
- {tonic::ToDart(values)}));
+ tonic::LogIfError(tonic::DartInvoke(update_accessibility_features_.Get(),
+ {tonic::ToDart(values)}));
}
void PlatformConfiguration::DispatchPlatformMessage(
fml::RefPtr<PlatformMessage> message) {
- std::shared_ptr<tonic::DartState> dart_state = library_.dart_state().lock();
+ std::shared_ptr<tonic::DartState> dart_state =
+ dispatch_platform_message_.dart_state().lock();
if (!dart_state) {
FML_DLOG(WARNING)
<< "Dropping platform message for lack of DartState on channel: "
@@ -293,15 +322,16 @@
}
tonic::LogIfError(
- tonic::DartInvokeField(library_.value(), "_dispatchPlatformMessage",
- {tonic::ToDart(message->channel()), data_handle,
- tonic::ToDart(response_id)}));
+ tonic::DartInvoke(dispatch_platform_message_.Get(),
+ {tonic::ToDart(message->channel()), data_handle,
+ tonic::ToDart(response_id)}));
}
void PlatformConfiguration::DispatchSemanticsAction(int32_t id,
SemanticsAction action,
std::vector<uint8_t> args) {
- std::shared_ptr<tonic::DartState> dart_state = library_.dart_state().lock();
+ std::shared_ptr<tonic::DartState> dart_state =
+ dispatch_semantics_action_.dart_state().lock();
if (!dart_state) {
return;
}
@@ -313,14 +343,15 @@
return;
}
- tonic::LogIfError(tonic::DartInvokeField(
- library_.value(), "_dispatchSemanticsAction",
+ tonic::LogIfError(tonic::DartInvoke(
+ dispatch_semantics_action_.Get(),
{tonic::ToDart(id), tonic::ToDart(static_cast<int32_t>(action)),
args_handle}));
}
void PlatformConfiguration::BeginFrame(fml::TimePoint frameTime) {
- std::shared_ptr<tonic::DartState> dart_state = library_.dart_state().lock();
+ std::shared_ptr<tonic::DartState> dart_state =
+ begin_frame_.dart_state().lock();
if (!dart_state) {
return;
}
@@ -328,18 +359,19 @@
int64_t microseconds = (frameTime - fml::TimePoint()).ToMicroseconds();
- tonic::LogIfError(tonic::DartInvokeField(library_.value(), "_beginFrame",
- {
- Dart_NewInteger(microseconds),
- }));
+ tonic::LogIfError(
+ tonic::DartInvoke(begin_frame_.Get(), {
+ Dart_NewInteger(microseconds),
+ }));
UIDartState::Current()->FlushMicrotasksNow();
- tonic::LogIfError(tonic::DartInvokeField(library_.value(), "_drawFrame", {}));
+ tonic::LogIfError(tonic::DartInvokeVoid(draw_frame_.Get()));
}
void PlatformConfiguration::ReportTimings(std::vector<int64_t> timings) {
- std::shared_ptr<tonic::DartState> dart_state = library_.dart_state().lock();
+ std::shared_ptr<tonic::DartState> dart_state =
+ report_timings_.dart_state().lock();
if (!dart_state) {
return;
}
@@ -358,10 +390,9 @@
memcpy(data, timings.data(), sizeof(int64_t) * timings.size());
FML_CHECK(Dart_TypedDataReleaseData(data_handle));
- tonic::LogIfError(tonic::DartInvokeField(library_.value(), "_reportTimings",
- {
- data_handle,
- }));
+ tonic::LogIfError(tonic::DartInvoke(report_timings_.Get(), {
+ data_handle,
+ }));
}
void PlatformConfiguration::CompletePlatformMessageEmptyResponse(
diff --git a/lib/ui/window/platform_configuration.h b/lib/ui/window/platform_configuration.h
index 2a43fcc..f61d474 100644
--- a/lib/ui/window/platform_configuration.h
+++ b/lib/ui/window/platform_configuration.h
@@ -325,8 +325,7 @@
//----------------------------------------------------------------------------
/// @brief Notifies the framework that it is time to begin working on a
- /// new
- /// frame previously scheduled via a call to
+ /// new frame previously scheduled via a call to
/// `PlatformConfigurationClient::ScheduleFrame`. This call
/// originates in the animator.
///
@@ -414,7 +413,16 @@
private:
PlatformConfigurationClient* client_;
- tonic::DartPersistentValue library_;
+ tonic::DartPersistentValue update_locales_;
+ tonic::DartPersistentValue update_user_settings_data_;
+ tonic::DartPersistentValue update_lifecycle_state_;
+ tonic::DartPersistentValue update_semantics_enabled_;
+ tonic::DartPersistentValue update_accessibility_features_;
+ tonic::DartPersistentValue dispatch_platform_message_;
+ tonic::DartPersistentValue dispatch_semantics_action_;
+ tonic::DartPersistentValue begin_frame_;
+ tonic::DartPersistentValue draw_frame_;
+ tonic::DartPersistentValue report_timings_;
std::unordered_map<int64_t, std::unique_ptr<Window>> windows_;