41#define REGISTER_FUNCTION(name, count) {"" #name, name, count},
42#define DECLARE_FUNCTION(name, count) \
43 extern void name(Dart_NativeArguments args);
45#define FIDL_NATIVE_LIST(V) V(SetReturnCode, 1)
49static struct NativeEntries {
55Dart_NativeFunction NativeLookup(Dart_Handle
name,
57 bool* auto_setup_scope) {
58 const char* function_name =
nullptr;
59 Dart_Handle result = Dart_StringToCString(
name, &function_name);
60 if (Dart_IsError(result)) {
61 Dart_PropagateError(result);
65 *auto_setup_scope =
true;
66 size_t num_entries = std::size(Entries);
67 for (
size_t i = 0;
i < num_entries; ++
i) {
68 const struct NativeEntries& entry = Entries[
i];
69 if (!strcmp(function_name, entry.name) &&
71 return entry.function;
75 g_natives = InitNatives();
79const uint8_t* NativeSymbol(Dart_NativeFunction native_function) {
80 size_t num_entries = std::size(Entries);
81 for (
size_t i = 0;
i < num_entries; ++
i) {
82 const struct NativeEntries& entry = Entries[
i];
83 if (entry.function == native_function) {
84 return reinterpret_cast<const uint8_t*
>(entry.name);
88 g_natives = InitNatives();
89 return g_natives->
GetSymbol(native_function);
92void SetReturnCode(Dart_NativeArguments arguments) {
95 Dart_GetNativeIntegerArgument(arguments, 0, &return_code);
104 std::optional<zx::eventpair> view_ref) {
107 Dart_Handle library = Dart_LookupLibrary(ToDart(
"dart:fuchsia"));
109 Dart_Handle result = Dart_SetNativeResolver(
110 library, fuchsia::dart::NativeLookup, fuchsia::dart::NativeSymbol);
114 std::unique_ptr<tonic::DartClassProvider> fuchsia_class_provider(
116 dart_state->class_library().add_provider(
"fuchsia",
117 std::move(fuchsia_class_provider));
119 if (directory_request) {
120 result = Dart_SetField(
121 library, ToDart(
"_outgoingServices"),
127 result = Dart_SetField(
128 library, ToDart(
"_viewRef"),