40#define REGISTER_FUNCTION(name, count) {"" #name, name, count},
41#define DECLARE_FUNCTION(name, count) \
42 extern void name(Dart_NativeArguments args);
44#define FIDL_NATIVE_LIST(V) V(SetReturnCode, 1)
48static struct NativeEntries {
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);
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) &&
70 return entry.function;
74 g_natives = InitNatives();
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);
87 g_natives = InitNatives();
88 return g_natives->
GetSymbol(native_function);
91void SetReturnCode(Dart_NativeArguments arguments) {
94 Dart_GetNativeIntegerArgument(arguments, 0, &return_code);
103 std::optional<zx::eventpair> view_ref) {
106 Dart_Handle library = Dart_LookupLibrary(ToDart(
"dart:fuchsia"));
108 Dart_Handle result = Dart_SetNativeResolver(
109 library, fuchsia::dart::NativeLookup, fuchsia::dart::NativeSymbol);
113 std::unique_ptr<tonic::DartClassProvider> fuchsia_class_provider(
115 dart_state->class_library().add_provider(
"fuchsia",
116 std::move(fuchsia_class_provider));
118 if (directory_request) {
119 result = Dart_SetField(
120 library, ToDart(
"_outgoingServices"),
126 result = Dart_SetField(
127 library, ToDart(
"_viewRef"),