blob: 49a567e5b5db6e35b804cfe3cfa8ea6862200448 [file] [log] [blame]
// Copyright 2013 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
part of dart.ui;
// ignore_for_file: avoid_classes_with_only_static_members
/// Helper functions for Dart Plugin Registrants.
class DartPluginRegistrant {
static bool _wasInitialized = false;
/// Makes sure the that the Dart Plugin Registrant has been called for this
/// isolate. This can safely be executed multiple times on the same isolate,
/// but should not be called on the Root isolate.
static void ensureInitialized() {
if (!_wasInitialized) {
_wasInitialized = true;
_ensureInitialized();
}
}
@FfiNative<Void Function()>('DartPluginRegistrant_EnsureInitialized')
external static void _ensureInitialized();
}
// Corelib 'print' implementation.
void _print(String arg) {
_Logger._printString(arg);
}
void _printDebug(String arg) {
_Logger._printDebugString(arg);
}
class _Logger {
@FfiNative<Void Function(Handle)>('DartRuntimeHooks::Logger_PrintString')
external static void _printString(String? s);
@FfiNative<Void Function(Handle)>('DartRuntimeHooks::Logger_PrintDebugString')
external static void _printDebugString(String? s);
}
// If we actually run on big endian machines, we'll need to do something smarter
// here. We don't use [Endian.Host] because it's not a compile-time
// constant and can't propagate into the set/get calls.
const Endian _kFakeHostEndian = Endian.little;
// A service protocol extension to schedule a frame to be rendered into the
// window.
Future<developer.ServiceExtensionResponse> _scheduleFrame(
String method,
Map<String, String> parameters,
) async {
// Schedule the frame.
PlatformDispatcher.instance.scheduleFrame();
// Always succeed.
return developer.ServiceExtensionResponse.result(json.encode(<String, String>{
'type': 'Success',
}));
}
Future<developer.ServiceExtensionResponse> _reinitializeShader(
String method,
Map<String, String> parameters,
) async {
final String? assetKey = parameters['assetKey'];
if (assetKey != null) {
FragmentProgram._reinitializeShader(assetKey);
}
// Always succeed.
return developer.ServiceExtensionResponse.result(json.encode(<String, String>{
'type': 'Success',
}));
}
Future<developer.ServiceExtensionResponse> _getImpellerEnabled(
String method,
Map<String, String> parameters,
) async {
return developer.ServiceExtensionResponse.result(json.encode(<String, Object>{
'type': 'Success',
'enabled': _impellerEnabled,
}));
}
@pragma('vm:entry-point')
void _setupHooks() {
assert(() {
// In debug mode, register the schedule frame extension.
developer.registerExtension('ext.ui.window.scheduleFrame', _scheduleFrame);
// In debug mode, allow shaders to be reinitialized.
developer.registerExtension(
'ext.ui.window.reinitializeShader',
_reinitializeShader,
);
return true;
}());
// In debug and profile mode, allow tools to display the current rendering backend.
if (!_kReleaseMode) {
developer.registerExtension(
'ext.ui.window.impellerEnabled',
_getImpellerEnabled,
);
}
}
const bool _kReleaseMode = bool.fromEnvironment('dart.vm.product');
/// Returns runtime Dart compilation trace as a UTF-8 encoded memory buffer.
///
/// The buffer contains a list of symbols compiled by the Dart JIT at runtime up
/// to the point when this function was called. This list can be saved to a text
/// file and passed to tools such as `flutter build` or Dart `gen_snapshot` in
/// order to pre-compile this code offline.
///
/// The list has one symbol per line of the following format:
/// `<namespace>,<class>,<symbol>\n`.
///
/// Here are some examples:
///
/// ```csv
/// dart:core,Duration,get:inMilliseconds
/// package:flutter/src/widgets/binding.dart,::,runApp
/// file:///.../my_app.dart,::,main
/// ```
///
/// This function is only effective in debug and dynamic modes, and will throw in AOT mode.
List<int> saveCompilationTrace() {
throw UnimplementedError();
}
@FfiNative<Void Function(Handle)>('DartRuntimeHooks::ScheduleMicrotask')
external void _scheduleMicrotask(void Function() callback);
@FfiNative<Handle Function(Handle)>('DartRuntimeHooks::GetCallbackHandle')
external int? _getCallbackHandle(Function closure);
@FfiNative<Handle Function(Int64)>('DartRuntimeHooks::GetCallbackFromHandle')
external Function? _getCallbackFromHandle(int handle);
typedef _PrintClosure = void Function(String line);
// Used by the embedder to initialize how printing is performed.
// See also https://github.com/dart-lang/sdk/blob/main/sdk/lib/_internal/vm/lib/print_patch.dart
@pragma('vm:entry-point')
_PrintClosure _getPrintClosure() => _print;
typedef _ScheduleImmediateClosure = void Function(void Function());
// Used by the embedder to initialize how microtasks are scheduled.
// See also https://github.com/dart-lang/sdk/blob/main/sdk/lib/_internal/vm/lib/schedule_microtask_patch.dart
@pragma('vm:entry-point')
_ScheduleImmediateClosure _getScheduleMicrotaskClosure() => _scheduleMicrotask;
// Used internally to indicate whether the Engine is using Impeller for
// rendering.
@pragma('vm:entry-point')
bool _impellerEnabled = false;