Flutter Engine
The Flutter Engine
Loading...
Searching...
No Matches
dart_isolate.h
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
5#ifndef FLUTTER_RUNTIME_DART_ISOLATE_H_
6#define FLUTTER_RUNTIME_DART_ISOLATE_H_
7
8#include <memory>
9#include <optional>
10#include <set>
11#include <string>
12#include <unordered_set>
13
14#include "flutter/common/task_runners.h"
15#include "flutter/fml/compiler_specific.h"
16#include "flutter/fml/macros.h"
17#include "flutter/fml/mapping.h"
18#include "flutter/lib/ui/io_manager.h"
19#include "flutter/lib/ui/snapshot_delegate.h"
20#include "flutter/lib/ui/ui_dart_state.h"
21#include "flutter/lib/ui/window/platform_configuration.h"
22#include "flutter/runtime/dart_snapshot.h"
23#include "flutter/runtime/isolate_configuration.h"
24#include "third_party/dart/runtime/include/dart_api.h"
26
27namespace flutter {
28
29class DartVM;
30class DartIsolateGroupData;
31class IsolateConfiguration;
32
33//------------------------------------------------------------------------------
34/// @brief Represents an instance of a live isolate. An isolate is a
35/// separate Dart execution context. Different Dart isolates don't
36/// share memory and can be scheduled concurrently by the Dart VM on
37/// one of the Dart VM managed worker pool threads.
38///
39/// The entire lifecycle of a Dart isolate is controlled by the Dart
40/// VM. Because of this, the engine never holds a strong pointer to
41/// the Dart VM for extended periods of time. This allows the VM (or
42/// the isolates themselves) to terminate Dart execution without
43/// consulting the engine.
44///
45/// The isolate that the engine creates to act as the host for the
46/// Flutter application code with UI bindings is called the root
47/// isolate.
48///
49/// The root isolate is special in the following ways:
50/// * The root isolate forms a new isolate group. Child isolates are
51/// added to their parents groups. When the root isolate dies, all
52/// isolates in its group are terminated.
53/// * Only root isolates get UI bindings.
54/// * Root isolates execute their code on engine managed threads.
55/// All other isolates run their Dart code on Dart VM managed
56/// thread pool workers that the engine has no control over.
57/// * Since the engine does not know the thread on which non-root
58/// isolates are run, the engine has no opportunity to get a
59/// reference to non-root isolates. Such isolates can only be
60/// terminated if they terminate themselves or their isolate group
61/// is torn down.
62///
63class DartIsolate : public UIDartState {
64 public:
65 class Flags {
66 public:
67 Flags();
68
69 explicit Flags(const Dart_IsolateFlags* flags);
70
72
73 void SetNullSafetyEnabled(bool enabled);
74 void SetIsDontNeedSafe(bool value);
75
76 Dart_IsolateFlags Get() const;
77
78 private:
79 Dart_IsolateFlags flags_;
80 };
81
82 //----------------------------------------------------------------------------
83 /// @brief The engine represents all dart isolates as being in one of the
84 /// known phases. By invoking various methods on the Dart isolate,
85 /// the engine transition the Dart isolate from one phase to the
86 /// next. The Dart isolate will only move from one phase to the
87 /// next in the order specified in the `DartIsolate::Phase` enum.
88 /// That is, once the isolate has moved out of a particular phase,
89 /// it can never transition back to that phase in the future.
90 /// There is no error recovery mechanism and callers that find
91 /// their isolates in an undesirable phase must discard the
92 /// isolate and start over.
93 ///
94 enum class Phase {
95 // NOLINTBEGIN(readability-identifier-naming)
96 //--------------------------------------------------------------------------
97 /// The initial phase of all Dart isolates. This is an internal phase and
98 /// callers can never get a reference to a Dart isolate in this phase.
99 ///
100 Unknown,
101 //--------------------------------------------------------------------------
102 /// The Dart isolate has been created but none of the library tag or message
103 /// handers have been set yet. The is an internal phase and callers can
104 /// never get a reference to a Dart isolate in this phase.
105 ///
107 //--------------------------------------------------------------------------
108 /// The Dart isolate has been fully initialized but none of the
109 /// libraries referenced by that isolate have been loaded yet. This is an
110 /// internal phase and callers can never get a reference to a Dart isolate
111 /// in this phase.
112 ///
114 //--------------------------------------------------------------------------
115 /// The isolate has been fully initialized and is waiting for the caller to
116 /// associate isolate snapshots with the same. The isolate will only be
117 /// ready to execute Dart code once one of the `Prepare` calls are
118 /// successfully made.
119 ///
121 //--------------------------------------------------------------------------
122 /// The isolate is fully ready to start running Dart code. Callers can
123 /// transition the isolate to the next state by calling the `Run` or
124 /// `RunFromLibrary` methods.
125 ///
126 Ready,
127 //--------------------------------------------------------------------------
128 /// The isolate is currently running Dart code.
129 ///
130 Running,
131 //--------------------------------------------------------------------------
132 /// The isolate is no longer running Dart code and is in the middle of being
133 /// collected. This is in internal phase and callers can never get a
134 /// reference to a Dart isolate in this phase.
135 ///
136 Shutdown,
137 // NOLINTEND(readability-identifier-naming)
138 };
139
140 //----------------------------------------------------------------------------
141 /// @brief Creates an instance of a root isolate and returns a weak
142 /// pointer to the same. The isolate instance may only be used
143 /// safely on the engine thread on which it was created. In the
144 /// shell, this is the UI thread and task runner. Using the
145 /// isolate on any other thread is user error.
146 ///
147 /// The isolate that the engine creates to act as the host for the
148 /// Flutter application code with UI bindings is called the root
149 /// isolate.
150 ///
151 /// The root isolate is special in the following ways:
152 /// * The root isolate forms a new isolate group. Child isolates
153 /// are added to their parents groups. When the root isolate
154 /// dies, all isolates in its group are terminated.
155 /// * Only root isolates get UI bindings.
156 /// * Root isolates execute their code on engine managed threads.
157 /// All other isolates run their Dart code on Dart VM managed
158 /// thread pool workers that the engine has no control over.
159 /// * Since the engine does not know the thread on which non-root
160 /// isolates are run, the engine has no opportunity to get a
161 /// reference to non-root isolates. Such isolates can only be
162 /// terminated if they terminate themselves or their isolate
163 /// group is torn down.
164 ///
165 /// @param[in] settings The settings used to create the
166 /// isolate.
167 /// @param[in] platform_configuration The platform configuration for
168 /// handling communication with the
169 /// framework.
170 /// @param[in] flags The Dart isolate flags for this
171 /// isolate instance.
172 /// @param[in] dart_entrypoint The name of the dart entrypoint
173 /// function to invoke.
174 /// @param[in] dart_entrypoint_library The name of the dart library
175 /// containing the entrypoint.
176 /// @param[in] dart_entrypoint_args Arguments passed as a List<String>
177 /// to Dart's entrypoint function.
178 /// @param[in] isolate_configuration The isolate configuration used to
179 /// configure the isolate before
180 /// invoking the entrypoint.
181 /// @param[in] root_isolate_create_callback A callback called after the root
182 /// isolate is created, _without_
183 /// isolate scope. This gives the
184 /// caller a chance to finish any
185 /// setup before running the Dart
186 /// program, and after any embedder
187 /// callbacks in the settings object.
188 /// @param[in] isolate_create_callback The isolate create callback. This
189 /// will be called when the before the
190 /// main Dart entrypoint is invoked in
191 /// the root isolate. The isolate is
192 /// already in the running state at
193 /// this point and an isolate scope is
194 /// current.
195 /// @param[in] isolate_shutdown_callback The isolate shutdown callback.
196 /// This will be called before the
197 /// isolate is about to transition
198 /// into the Shutdown phase. The
199 /// isolate is still running at this
200 /// point and an isolate scope is
201 /// current.
202 /// @param[in] context Engine-owned state which is
203 /// accessed by the root dart isolate.
204 /// @param[in] spawning_isolate The isolate that is spawning the
205 /// new isolate.
206 /// @return A weak pointer to the root Dart isolate. The caller must
207 /// ensure that the isolate is not referenced for long periods of
208 /// time as it prevents isolate collection when the isolate
209 /// terminates itself. The caller may also only use the isolate on
210 /// the thread on which the isolate was created.
211 ///
212 static std::weak_ptr<DartIsolate> CreateRunningRootIsolate(
213 const Settings& settings,
214 const fml::RefPtr<const DartSnapshot>& isolate_snapshot,
215 std::unique_ptr<PlatformConfiguration> platform_configuration,
216 Flags flags,
217 const fml::closure& root_isolate_create_callback,
218 const fml::closure& isolate_create_callback,
219 const fml::closure& isolate_shutdown_callback,
220 std::optional<std::string> dart_entrypoint,
221 std::optional<std::string> dart_entrypoint_library,
222 const std::vector<std::string>& dart_entrypoint_args,
223 std::unique_ptr<IsolateConfiguration> isolate_configuration,
224 const UIDartState::Context& context,
225 const DartIsolate* spawning_isolate = nullptr);
226
227 // |UIDartState|
228 ~DartIsolate() override;
229
230 //----------------------------------------------------------------------------
231 /// @brief The current phase of the isolate. The engine represents all
232 /// dart isolates as being in one of the known phases. By invoking
233 /// various methods on the Dart isolate, the engine transitions
234 /// the Dart isolate from one phase to the next. The Dart isolate
235 /// will only move from one phase to the next in the order
236 /// specified in the `DartIsolate::Phase` enum. That is, the once
237 /// the isolate has moved out of a particular phase, it can never
238 /// transition back to that phase in the future. There is no error
239 /// recovery mechanism and callers that find their isolates in an
240 /// undesirable phase must discard the isolate and start over.
241 ///
242 /// @return The current isolate phase.
243 ///
244 Phase GetPhase() const;
245
246 //----------------------------------------------------------------------------
247 /// @brief Returns the ID for an isolate which is used to query the
248 /// service protocol.
249 ///
250 /// @return The service identifier for this isolate.
251 ///
252 std::string GetServiceId();
253
254 //----------------------------------------------------------------------------
255 /// @brief Prepare the isolate for running for a precompiled code bundle.
256 /// The Dart VM must be configured for running precompiled code.
257 ///
258 /// The isolate must already be in the `Phase::LibrariesSetup`
259 /// phase. After a successful call to this method, the isolate
260 /// will transition to the `Phase::Ready` phase.
261 ///
262 /// @return Whether the isolate was prepared and the described phase
263 /// transition made.
264 ///
265 [[nodiscard]] bool PrepareForRunningFromPrecompiledCode();
266
267 //----------------------------------------------------------------------------
268 /// @brief Prepare the isolate for running for a a list of kernel files.
269 ///
270 /// The Dart VM must be configured for running from kernel
271 /// snapshots.
272 ///
273 /// The isolate must already be in the `Phase::LibrariesSetup`
274 /// phase. This call can be made multiple times. After a series of
275 /// successful calls to this method, the caller can specify the
276 /// last kernel file mapping by specifying `last_piece` to `true`.
277 /// On success, the isolate will transition to the `Phase::Ready`
278 /// phase.
279 ///
280 /// @param[in] kernel The kernel mapping.
281 /// @param[in] last_piece Indicates if this is the last kernel mapping
282 /// expected. After this point, the isolate will
283 /// attempt a transition to the `Phase::Ready` phase.
284 ///
285 /// @return If the kernel mapping supplied was successfully used to
286 /// prepare the isolate.
287 ///
288 [[nodiscard]] bool PrepareForRunningFromKernel(
289 const std::shared_ptr<const fml::Mapping>& kernel,
290 bool child_isolate,
291 bool last_piece);
292
293 //----------------------------------------------------------------------------
294 /// @brief Prepare the isolate for running for a a list of kernel files.
295 ///
296 /// The Dart VM must be configured for running from kernel
297 /// snapshots.
298 ///
299 /// The isolate must already be in the `Phase::LibrariesSetup`
300 /// phase. After a successful call to this method, the isolate
301 /// will transition to the `Phase::Ready` phase.
302 ///
303 /// @param[in] kernels The kernels
304 ///
305 /// @return If the kernel mappings supplied were successfully used to
306 /// prepare the isolate.
307 ///
308 [[nodiscard]] bool PrepareForRunningFromKernels(
309 std::vector<std::shared_ptr<const fml::Mapping>> kernels);
310
311 //----------------------------------------------------------------------------
312 /// @brief Prepare the isolate for running for a a list of kernel files.
313 ///
314 /// The Dart VM must be configured for running from kernel
315 /// snapshots.
316 ///
317 /// The isolate must already be in the `Phase::LibrariesSetup`
318 /// phase. After a successful call to this method, the isolate
319 /// will transition to the `Phase::Ready` phase.
320 ///
321 /// @param[in] kernels The kernels
322 ///
323 /// @return If the kernel mappings supplied were successfully used to
324 /// prepare the isolate.
325 ///
326 [[nodiscard]] bool PrepareForRunningFromKernels(
327 std::vector<std::unique_ptr<const fml::Mapping>> kernels);
328
329 //----------------------------------------------------------------------------
330 /// @brief Transition the root isolate to the `Phase::Running` phase and
331 /// invoke the main entrypoint (the "main" method) in the
332 /// specified library. The isolate must already be in the
333 /// `Phase::Ready` phase.
334 ///
335 /// @param[in] library_name The name of the library in which to invoke the
336 /// supplied entrypoint.
337 /// @param[in] entrypoint The entrypoint in `library_name`
338 /// @param[in] args A list of string arguments to the entrypoint.
339 ///
340 /// @return If the isolate successfully transitioned to the running phase
341 /// and the main entrypoint was invoked.
342 ///
343 [[nodiscard]] bool RunFromLibrary(std::optional<std::string> library_name,
344 std::optional<std::string> entrypoint,
345 const std::vector<std::string>& args);
346
347 //----------------------------------------------------------------------------
348 /// @brief Transition the isolate to the `Phase::Shutdown` phase. The
349 /// only thing left to do is to collect the isolate.
350 ///
351 /// @return If the isolate successfully transitioned to the shutdown
352 /// phase.
353 ///
354 [[nodiscard]] bool Shutdown();
355
356 //----------------------------------------------------------------------------
357 /// @brief Registers a callback that will be invoked in isolate scope
358 /// just before the isolate transitions to the `Phase::Shutdown`
359 /// phase.
360 ///
361 /// @param[in] closure The callback to invoke on isolate shutdown.
362 ///
363 void AddIsolateShutdownCallback(const fml::closure& closure);
364
365 //----------------------------------------------------------------------------
366 /// @brief A weak pointer to the Dart isolate instance. This instance may
367 /// only be used on the task runner that created the root isolate.
368 ///
369 /// @return The weak isolate pointer.
370 ///
371 std::weak_ptr<DartIsolate> GetWeakIsolatePtr();
372
373 //----------------------------------------------------------------------------
374 /// @brief The task runner on which the Dart code for the root isolate is
375 /// running. For the root isolate, this is the UI task runner for
376 /// the shell that owns the root isolate.
377 ///
378 /// @return The message handling task runner.
379 ///
381
382 //----------------------------------------------------------------------------
383 /// @brief Creates a new isolate in the same group as this isolate, which
384 /// runs on the platform thread. This method can only be invoked
385 /// on the root isolate.
386 ///
387 /// @param[in] entry_point The entrypoint to invoke once the isolate is
388 /// spawned. Will be run on the platform thread.
389 /// @param[out] error If spawning fails inside the Dart VM, this is
390 /// set to the error string. The error should be
391 /// reported to the user. Otherwise it is set to
392 /// null. It's possible for spawning to fail, but
393 /// this error still be null. In that case the
394 /// failure should not be reported to the user.
395 ///
396 /// @return The newly created isolate, or null if spawning failed.
397 ///
399 char** error) override;
400
401 bool LoadLoadingUnit(
402 intptr_t loading_unit_id,
403 std::unique_ptr<const fml::Mapping> snapshot_data,
404 std::unique_ptr<const fml::Mapping> snapshot_instructions);
405
406 void LoadLoadingUnitError(intptr_t loading_unit_id,
407 const std::string& error_message,
408 bool transient);
409
411
413
414 /// Returns the "main" entrypoint of the library contained in the kernel
415 /// data in `mapping`.
417 const std::shared_ptr<const fml::Mapping>& mapping);
418
419 private:
421 class AutoFireClosure {
422 public:
423 explicit AutoFireClosure(const fml::closure& closure);
424
425 ~AutoFireClosure();
426
427 private:
428 fml::closure closure_;
429 FML_DISALLOW_COPY_AND_ASSIGN(AutoFireClosure);
430 };
431 friend class DartVM;
432
433 Phase phase_ = Phase::Unknown;
434 std::vector<std::unique_ptr<AutoFireClosure>> shutdown_callbacks_;
435 std::unordered_set<fml::RefPtr<DartSnapshot>> loading_unit_snapshots_;
436 fml::RefPtr<fml::TaskRunner> message_handling_task_runner_;
437 const bool may_insecurely_connect_to_all_domains_;
438 const bool is_platform_isolate_;
439 const bool is_spawning_in_group_;
440 std::string domain_network_policy_;
441 std::shared_ptr<PlatformIsolateManager> platform_isolate_manager_;
442
443 static std::weak_ptr<DartIsolate> CreateRootIsolate(
444 const Settings& settings,
445 fml::RefPtr<const DartSnapshot> isolate_snapshot,
446 std::unique_ptr<PlatformConfiguration> platform_configuration,
447 const Flags& flags,
448 const fml::closure& isolate_create_callback,
449 const fml::closure& isolate_shutdown_callback,
450 const UIDartState::Context& context,
451 const DartIsolate* spawning_isolate = nullptr);
452
453 DartIsolate(const Settings& settings,
454 bool is_root_isolate,
455 const UIDartState::Context& context,
456 bool is_spawning_in_group = false);
457
458 DartIsolate(const Settings& settings,
459 const UIDartState::Context& context,
460 std::shared_ptr<PlatformIsolateManager> platform_isolate_manager);
461
462 //----------------------------------------------------------------------------
463 /// @brief Initializes the given (current) isolate.
464 ///
465 /// @param[in] dart_isolate The current isolate that is to be initialized.
466 ///
467 /// @return Whether the initialization succeeded. Irrespective of whether
468 /// the initialization suceeded, the current isolate will still be
469 /// active.
470 ///
471 [[nodiscard]] bool Initialize(Dart_Isolate dart_isolate);
472
473 void SetMessageHandlingTaskRunner(const fml::RefPtr<fml::TaskRunner>& runner,
474 bool post_directly_to_runner);
475
476 bool LoadKernel(const std::shared_ptr<const fml::Mapping>& mapping,
477 bool last_piece);
478
479 [[nodiscard]] bool LoadLibraries();
480
481 bool UpdateThreadPoolNames() const;
482
483 [[nodiscard]] bool MarkIsolateRunnable();
484
485 void OnShutdownCallback();
486
487 // |Dart_IsolateGroupCreateCallback|
488 static Dart_Isolate DartIsolateGroupCreateCallback(
489 const char* advisory_script_uri,
490 const char* advisory_script_entrypoint,
491 const char* package_root,
492 const char* package_config,
494 std::shared_ptr<DartIsolate>* parent_isolate_group,
495 char** error);
496
497 // |Dart_IsolateInitializeCallback|
498 static bool DartIsolateInitializeCallback(void** child_callback_data,
499 char** error);
500
501 static Dart_Isolate DartCreateAndStartServiceIsolate(
502 const char* package_root,
503 const char* package_config,
505 char** error);
506
507 typedef std::function<Dart_Isolate(std::shared_ptr<DartIsolateGroupData>*,
508 std::shared_ptr<DartIsolate>*,
510 char**)>
511 IsolateMaker;
512
513 static Dart_Isolate CreateDartIsolateGroup(
514 std::unique_ptr<std::shared_ptr<DartIsolateGroupData>> isolate_group_data,
515 std::unique_ptr<std::shared_ptr<DartIsolate>> isolate_data,
517 char** error,
518 const IsolateMaker& make_isolate);
519
520 static bool InitializeIsolate(
521 const std::shared_ptr<DartIsolate>& embedder_isolate,
523 char** error);
524
525 // |Dart_IsolateShutdownCallback|
526 static void DartIsolateShutdownCallback(
527 std::shared_ptr<DartIsolateGroupData>* isolate_group_data,
528 std::shared_ptr<DartIsolate>* isolate_data);
529
530 // |Dart_IsolateCleanupCallback|
531 static void DartIsolateCleanupCallback(
532 std::shared_ptr<DartIsolateGroupData>* isolate_group_data,
533 std::shared_ptr<DartIsolate>* isolate_data);
534
535 // |Dart_IsolateGroupCleanupCallback|
536 static void DartIsolateGroupCleanupCallback(
537 std::shared_ptr<DartIsolateGroupData>* isolate_group_data);
538
539 // |Dart_DeferredLoadHandler|
540 static Dart_Handle OnDartLoadLibrary(intptr_t loading_unit_id);
541
542 static void SpawnIsolateShutdownCallback(
543 std::shared_ptr<DartIsolateGroupData>* isolate_group_data,
544 std::shared_ptr<DartIsolate>* isolate_data);
545
547};
548
549} // namespace flutter
550
551#endif // FLUTTER_RUNTIME_DART_ISOLATE_H_
void SetNullSafetyEnabled(bool enabled)
void SetIsDontNeedSafe(bool value)
Dart_IsolateFlags Get() const
Represents an instance of a live isolate. An isolate is a separate Dart execution context....
bool PrepareForRunningFromKernel(const std::shared_ptr< const fml::Mapping > &kernel, bool child_isolate, bool last_piece)
Prepare the isolate for running for a a list of kernel files.
std::string GetServiceId()
Returns the ID for an isolate which is used to query the service protocol.
void LoadLoadingUnitError(intptr_t loading_unit_id, const std::string &error_message, bool transient)
std::weak_ptr< DartIsolate > GetWeakIsolatePtr()
A weak pointer to the Dart isolate instance. This instance may only be used on the task runner that c...
Dart_Isolate CreatePlatformIsolate(Dart_Handle entry_point, char **error) override
Creates a new isolate in the same group as this isolate, which runs on the platform thread....
static std::weak_ptr< DartIsolate > CreateRunningRootIsolate(const Settings &settings, const fml::RefPtr< const DartSnapshot > &isolate_snapshot, std::unique_ptr< PlatformConfiguration > platform_configuration, Flags flags, const fml::closure &root_isolate_create_callback, const fml::closure &isolate_create_callback, const fml::closure &isolate_shutdown_callback, std::optional< std::string > dart_entrypoint, std::optional< std::string > dart_entrypoint_library, const std::vector< std::string > &dart_entrypoint_args, std::unique_ptr< IsolateConfiguration > isolate_configuration, const UIDartState::Context &context, const DartIsolate *spawning_isolate=nullptr)
Creates an instance of a root isolate and returns a weak pointer to the same. The isolate instance ma...
bool PrepareForRunningFromKernels(std::vector< std::shared_ptr< const fml::Mapping > > kernels)
Prepare the isolate for running for a a list of kernel files.
static Dart_Handle LoadLibraryFromKernel(const std::shared_ptr< const fml::Mapping > &mapping)
bool RunFromLibrary(std::optional< std::string > library_name, std::optional< std::string > entrypoint, const std::vector< std::string > &args)
Transition the root isolate to the Phase::Running phase and invoke the main entrypoint (the "main" me...
DartIsolateGroupData & GetIsolateGroupData()
void AddIsolateShutdownCallback(const fml::closure &closure)
Registers a callback that will be invoked in isolate scope just before the isolate transitions to the...
fml::RefPtr< fml::TaskRunner > GetMessageHandlingTaskRunner() const
The task runner on which the Dart code for the root isolate is running. For the root isolate,...
bool Shutdown()
Transition the isolate to the Phase::Shutdown phase. The only thing left to do is to collect the isol...
Phase GetPhase() const
The current phase of the isolate. The engine represents all dart isolates as being in one of the know...
bool PrepareForRunningFromPrecompiledCode()
Prepare the isolate for running for a precompiled code bundle. The Dart VM must be configured for run...
bool LoadLoadingUnit(intptr_t loading_unit_id, std::unique_ptr< const fml::Mapping > snapshot_data, std::unique_ptr< const fml::Mapping > snapshot_instructions)
Phase
The engine represents all dart isolates as being in one of the known phases. By invoking various meth...
Describes a running instance of the Dart VM. There may only be one running instance of the Dart VM in...
Definition dart_vm.h:61
An isolate configuration is a collection of snapshots and asset managers that the engine will use to ...
PlatformConfiguration * platform_configuration() const
Dart_Isolate isolate()
Definition dart_state.h:51
struct _Dart_Handle * Dart_Handle
Definition dart_api.h:258
struct _Dart_Isolate * Dart_Isolate
Definition dart_api.h:88
FlutterSemanticsFlag flags
G_BEGIN_DECLS G_MODULE_EXPORT FlValue * args
const uint8_t uint32_t uint32_t GError ** error
#define FML_DISALLOW_COPY_AND_ASSIGN(TypeName)
Definition macros.h:27
std::function< void()> closure
Definition closure.h:14
The subset of state which is owned by the shell or engine and passed through the RuntimeController in...
flags to indicate/promise which of the optional texture coordinates or colors will be supplied during...
Definition dl_vertices.h:80