Flutter Engine Uber Docs
Docs for the entire Flutter Engine repo.
 
Loading...
Searching...
No Matches
builtin_libraries.cc
Go to the documentation of this file.
1// Copyright 2013 The Flutter Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
6
7#include <lib/fdio/namespace.h>
8#include <lib/zx/channel.h>
9
10#include <optional>
11
12#include "flutter/fml/logging.h"
15#include "third_party/dart/runtime/bin/io_natives.h"
16#include "third_party/dart/runtime/include/dart_api.h"
20
21using tonic::ToDart;
22
23namespace dart_runner {
24namespace {
25
26#define REGISTER_FUNCTION(name, count) {#name, name, count},
27#define DECLARE_FUNCTION(name, count) \
28 extern void name(Dart_NativeArguments args);
29
30#define BUILTIN_NATIVE_LIST(V) \
31 V(Logger_PrintString, 1) \
32 V(ScheduleMicrotask, 1)
33
35
36const struct NativeEntry {
37 const char* name;
38 Dart_NativeFunction function;
40} kBuiltinEntries[] = {BUILTIN_NATIVE_LIST(REGISTER_FUNCTION)};
41
42Dart_NativeFunction BuiltinNativeLookup(Dart_Handle name,
44 bool* auto_setup_scope) {
45 const char* function_name = nullptr;
46 Dart_Handle result = Dart_StringToCString(name, &function_name);
47 if (Dart_IsError(result)) {
48 Dart_PropagateError(result);
49 }
50 FML_DCHECK(function_name != nullptr);
51 FML_DCHECK(auto_setup_scope != nullptr);
52 *auto_setup_scope = true;
53 size_t num_entries = dart_utils::ArraySize(kBuiltinEntries);
54 for (size_t i = 0; i < num_entries; i++) {
55 const NativeEntry& entry = kBuiltinEntries[i];
56 if (!strcmp(function_name, entry.name) &&
57 (entry.argument_count == argument_count)) {
58 return entry.function;
59 }
60 }
61 return nullptr;
62}
63
64const uint8_t* BuiltinNativeSymbol(Dart_NativeFunction native_function) {
65 size_t num_entries = dart_utils::ArraySize(kBuiltinEntries);
66 for (size_t i = 0; i < num_entries; i++) {
67 const NativeEntry& entry = kBuiltinEntries[i];
68 if (entry.function == native_function)
69 return reinterpret_cast<const uint8_t*>(entry.name);
70 }
71 return nullptr;
72}
73
74void Logger_PrintString(Dart_NativeArguments args) {
75 intptr_t length = 0;
76 uint8_t* chars = nullptr;
77 Dart_Handle str = Dart_GetNativeArgument(args, 0);
78 Dart_Handle result = Dart_StringToUTF8(str, &chars, &length);
79 if (Dart_IsError(result)) {
80 Dart_PropagateError(result);
81 } else {
82 fwrite(chars, 1, length, stdout);
83 fputc('\n', stdout);
84 fflush(stdout);
85 }
86}
87
88void ScheduleMicrotask(Dart_NativeArguments args) {
89 Dart_Handle closure = Dart_GetNativeArgument(args, 0);
90 if (tonic::CheckAndHandleError(closure) || !Dart_IsClosure(closure))
91 return;
93}
94
95} // namespace
96
97void InitBuiltinLibrariesForIsolate(const std::string& script_uri,
98 fdio_ns_t* namespc,
99 int stdoutfd,
100 int stderrfd,
101 zx::channel directory_request,
102 bool service_isolate) {
103 // dart:fuchsia --------------------------------------------------------------
104 // dart runner doesn't care about scenic view ref.
105 if (!service_isolate) {
106 fuchsia::dart::Initialize(std::move(directory_request), std::nullopt);
107 }
108
109 // dart:fuchsia.builtin ------------------------------------------------------
110
111 Dart_Handle builtin_lib = Dart_LookupLibrary(ToDart("dart:fuchsia.builtin"));
113 Dart_Handle result = Dart_SetNativeResolver(builtin_lib, BuiltinNativeLookup,
114 BuiltinNativeSymbol);
116
117 // dart:io -------------------------------------------------------------------
118
119 Dart_Handle io_lib = Dart_LookupLibrary(ToDart("dart:io"));
121 result = Dart_SetNativeResolver(io_lib, dart::bin::IONativeLookup,
122 dart::bin::IONativeSymbol);
124
125 // dart:zircon ---------------------------------------------------------------
126
127 Dart_Handle zircon_lib = Dart_LookupLibrary(ToDart("dart:zircon"));
129 // NativeResolver already set by fuchsia::dart::Initialize().
130
131 // Core libraries ------------------------------------------------------------
132
133 Dart_Handle async_lib = Dart_LookupLibrary(ToDart("dart:async"));
135
136 Dart_Handle core_lib = Dart_LookupLibrary(ToDart("dart:core"));
138
139 Dart_Handle internal_lib = Dart_LookupLibrary(ToDart("dart:_internal"));
141
142 Dart_Handle isolate_lib = Dart_LookupLibrary(ToDart("dart:isolate"));
144
145#if !defined(AOT_RUNTIME)
146 // AOT: These steps already happened at compile time in gen_snapshot.
147
148 // We need to ensure that all the scripts loaded so far are finalized
149 // as we are about to invoke some Dart code below to set up closures.
150 result = Dart_FinalizeLoading(false);
152#endif
153
154 // Setup the internal library's 'internalPrint' function.
155 Dart_Handle print =
156 Dart_Invoke(builtin_lib, ToDart("_getPrintClosure"), 0, nullptr);
158
159 result = Dart_SetField(internal_lib, ToDart("_printClosure"), print);
161
162 // Set up the 'scheduleImmediate' closure.
163 Dart_Handle schedule_immediate_closure;
164 if (service_isolate) {
165 // Running on dart::ThreadPool.
166 schedule_immediate_closure = Dart_Invoke(
167 isolate_lib, ToDart("_getIsolateScheduleImmediateClosure"), 0, nullptr);
168 } else {
169 // Running on async::Loop.
170 schedule_immediate_closure = Dart_Invoke(
171 builtin_lib, ToDart("_getScheduleMicrotaskClosure"), 0, nullptr);
172 }
173 FML_CHECK(!tonic::CheckAndHandleError(schedule_immediate_closure));
174
175 Dart_Handle schedule_args[1];
176 schedule_args[0] = schedule_immediate_closure;
177 result = Dart_Invoke(async_lib, ToDart("_setScheduleImmediateClosure"), 1,
178 schedule_args);
180
181 // Set up the namespace in dart:io.
182 Dart_Handle namespace_type =
183 Dart_GetNonNullableType(io_lib, ToDart("_Namespace"), 0, nullptr);
184 FML_CHECK(!tonic::CheckAndHandleError(namespace_type));
185
186 Dart_Handle namespace_args[1];
187 namespace_args[0] = ToDart(reinterpret_cast<intptr_t>(namespc));
188 result =
189 Dart_Invoke(namespace_type, ToDart("_setupNamespace"), 1, namespace_args);
191
192 // Set up the namespace in dart:zircon.
193 namespace_type =
194 Dart_GetNonNullableType(zircon_lib, ToDart("_Namespace"), 0, nullptr);
195 FML_CHECK(!tonic::CheckAndHandleError(namespace_type));
196
197 result = Dart_SetField(namespace_type, ToDart("_namespace"),
198 ToDart(reinterpret_cast<intptr_t>(namespc)));
200
201 // Set up stdout and stderr.
202 Dart_Handle stdio_args[3];
203 stdio_args[0] = Dart_NewInteger(0);
204 stdio_args[1] = Dart_NewInteger(stdoutfd);
205 stdio_args[2] = Dart_NewInteger(stderrfd);
206 result = Dart_Invoke(io_lib, ToDart("_setStdioFDs"), 3, stdio_args);
208
209 // Disable some dart:io operations.
210 Dart_Handle embedder_config_type =
211 Dart_GetNonNullableType(io_lib, ToDart("_EmbedderConfig"), 0, nullptr);
212 FML_CHECK(!tonic::CheckAndHandleError(embedder_config_type));
213
214 result =
215 Dart_SetField(embedder_config_type, ToDart("_mayExit"), Dart_False());
217
218 // Set the script location.
219 result = Dart_SetField(builtin_lib, ToDart("_rawScript"), ToDart(script_uri));
221
222 // Setup the uriBase with the base uri of the fidl app.
223 Dart_Handle uri_base =
224 Dart_Invoke(io_lib, ToDart("_getUriBaseClosure"), 0, nullptr);
226
227 result = Dart_SetField(core_lib, ToDart("_uriBaseClosure"), uri_base);
229
230 Dart_Handle setup_hooks = ToDart("_setupHooks");
231 result = Dart_Invoke(builtin_lib, setup_hooks, 0, nullptr);
233 result = Dart_Invoke(io_lib, setup_hooks, 0, nullptr);
235 result = Dart_Invoke(isolate_lib, setup_hooks, 0, nullptr);
237}
238
239} // namespace dart_runner
#define BUILTIN_NATIVE_LIST(V)
void ScheduleMicrotask(Dart_Handle callback)
static DartMicrotaskQueue * GetForCurrentThread()
G_BEGIN_DECLS G_MODULE_EXPORT FlValue * args
#define FML_CHECK(condition)
Definition logging.h:104
#define FML_DCHECK(condition)
Definition logging.h:122
Dart_NativeFunction function
Definition fuchsia.cc:51
const char * name
Definition fuchsia.cc:50
#define REGISTER_FUNCTION(name, count)
Definition fuchsia.cc:41
int argument_count
Definition fuchsia.cc:52
#define DECLARE_FUNCTION(name, count)
Definition fuchsia.cc:42
size_t length
void InitBuiltinLibrariesForIsolate(const std::string &script_uri, fdio_ns_t *namespc, int stdoutfd, int stderrfd, zx::channel directory_request, bool service_isolate)
size_t ArraySize(T(&array)[SIZE])
Definition inlines.h:11
std::function< void(Dart_NativeArguments)> NativeEntry
std::function< void()> closure
Definition closure.h:14
void Initialize(zx::channel directory_request, std::optional< zx::eventpair > view_ref)
Initializes Dart bindings for the Fuchsia application model.
Definition fuchsia.cc:103
Dart_Handle ToDart(const T &object)
bool CheckAndHandleError(Dart_Handle handle)
Definition dart_error.cc:33