Flutter Engine
 
Loading...
Searching...
No Matches
fuchsia.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 <zircon/syscalls.h>
8
9#include <cstdio>
10#include <cstring>
11#include <memory>
12#include <vector>
13
17#include "third_party/dart/runtime/include/dart_api.h"
25
26using tonic::ToDart;
27
28namespace fuchsia {
29namespace dart {
30namespace {
31
32static tonic::DartLibraryNatives* g_natives;
33
34tonic::DartLibraryNatives* InitNatives() {
36
37 return natives;
38}
39
40#define REGISTER_FUNCTION(name, count) {"" #name, name, count},
41#define DECLARE_FUNCTION(name, count) \
42 extern void name(Dart_NativeArguments args);
43
44#define FIDL_NATIVE_LIST(V) V(SetReturnCode, 1)
45
47
48static struct NativeEntries {
49 const char* name;
50 Dart_NativeFunction function;
52} Entries[] = {FIDL_NATIVE_LIST(REGISTER_FUNCTION)};
53
54Dart_NativeFunction NativeLookup(Dart_Handle name,
56 bool* auto_setup_scope) {
57 const char* function_name = nullptr;
58 Dart_Handle result = Dart_StringToCString(name, &function_name);
59 if (Dart_IsError(result)) {
60 Dart_PropagateError(result);
61 }
62 FML_DCHECK(function_name != nullptr);
63 FML_DCHECK(auto_setup_scope != nullptr);
64 *auto_setup_scope = true;
65 size_t num_entries = std::size(Entries);
66 for (size_t i = 0; i < num_entries; ++i) {
67 const struct NativeEntries& entry = Entries[i];
68 if (!strcmp(function_name, entry.name) &&
69 (entry.argument_count == argument_count)) {
70 return entry.function;
71 }
72 }
73 if (!g_natives)
74 g_natives = InitNatives();
75 return g_natives->GetNativeFunction(name, argument_count, auto_setup_scope);
76}
77
78const uint8_t* NativeSymbol(Dart_NativeFunction native_function) {
79 size_t num_entries = std::size(Entries);
80 for (size_t i = 0; i < num_entries; ++i) {
81 const struct NativeEntries& entry = Entries[i];
82 if (entry.function == native_function) {
83 return reinterpret_cast<const uint8_t*>(entry.name);
84 }
85 }
86 if (!g_natives)
87 g_natives = InitNatives();
88 return g_natives->GetSymbol(native_function);
89}
90
91void SetReturnCode(Dart_NativeArguments arguments) {
92 int64_t return_code;
93 Dart_Handle status =
94 Dart_GetNativeIntegerArgument(arguments, 0, &return_code);
95 if (!tonic::CheckAndHandleError(status)) {
97 }
98}
99
100} // namespace
101
102void Initialize(zx::channel directory_request,
103 std::optional<zx::eventpair> view_ref) {
105
106 Dart_Handle library = Dart_LookupLibrary(ToDart("dart:fuchsia"));
108 Dart_Handle result = Dart_SetNativeResolver(
109 library, fuchsia::dart::NativeLookup, fuchsia::dart::NativeSymbol);
111
112 auto dart_state = tonic::DartState::Current();
113 std::unique_ptr<tonic::DartClassProvider> fuchsia_class_provider(
114 new tonic::DartClassProvider(dart_state, "dart:fuchsia"));
115 dart_state->class_library().add_provider("fuchsia",
116 std::move(fuchsia_class_provider));
117
118 if (directory_request) {
119 result = Dart_SetField(
120 library, ToDart("_outgoingServices"),
121 ToDart(zircon::dart::Handle::Create(std::move(directory_request))));
123 }
124
125 if (view_ref) {
126 result = Dart_SetField(
127 library, ToDart("_viewRef"),
128 ToDart(zircon::dart::Handle::Create((*view_ref).release())));
130 }
131}
132
133} // namespace dart
134} // namespace fuchsia
const uint8_t * GetSymbol(Dart_NativeFunction native_function)
Dart_NativeFunction GetNativeFunction(Dart_Handle name, int argument_count, bool *auto_setup_scope)
void SetReturnCode(uint32_t return_code)
Definition dart_state.cc:66
static DartState * Current()
Definition dart_state.cc:56
static fml::RefPtr< Handle > Create(zx_handle_t handle)
Definition handle.cc:28
#define FML_CHECK(condition)
Definition logging.h:104
#define FML_DCHECK(condition)
Definition logging.h:122
Dart_NativeFunction function
Definition fuchsia.cc:50
const char * name
Definition fuchsia.cc:49
#define FIDL_NATIVE_LIST(V)
Definition fuchsia.cc:44
#define REGISTER_FUNCTION(name, count)
Definition fuchsia.cc:40
int argument_count
Definition fuchsia.cc:51
#define DECLARE_FUNCTION(name, count)
Definition fuchsia.cc:41
void Initialize(zx::channel directory_request, std::optional< zx::eventpair > view_ref)
Initializes Dart bindings for the Fuchsia application model.
Definition fuchsia.cc:102
Dart_Handle ToDart(const T &object)
bool CheckAndHandleError(Dart_Handle handle)
Definition dart_error.cc:33
void Initialize()
Definition natives.cc:68