7 #include <zircon/syscalls.h> 17 #include "flutter/fml/size.h" 18 #include "third_party/dart/runtime/include/dart_api.h" 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) 49 static struct NativeEntries {
51 Dart_NativeFunction
function;
55 Dart_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;
67 for (
size_t i = 0; i < num_entries; ++i) {
68 const struct NativeEntries& entry = Entries[i];
69 if (!strcmp(function_name, entry.name) &&
70 (entry.argument_count == argument_count)) {
71 return entry.function;
75 g_natives = InitNatives();
79 const uint8_t* NativeSymbol(Dart_NativeFunction native_function) {
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);
92 void SetReturnCode(Dart_NativeArguments arguments) {
95 Dart_GetNativeIntegerArgument(arguments, 0, &return_code);
103 void Initialize(fidl::InterfaceHandle<fuchsia::sys::Environment> environment,
104 zx::channel directory_request,
105 std::optional<zx::eventpair> view_ref) {
108 Dart_Handle library = Dart_LookupLibrary(
ToDart(
"dart:fuchsia"));
110 Dart_Handle
result = Dart_SetNativeResolver(
111 library, fuchsia::dart::NativeLookup, fuchsia::dart::NativeSymbol);
115 std::unique_ptr<tonic::DartClassProvider> fuchsia_class_provider(
117 dart_state->class_library().add_provider(
"fuchsia",
118 std::move(fuchsia_class_provider));
122 result = Dart_SetField(
123 library,
ToDart(
"_environment"),
128 if (directory_request) {
129 result = Dart_SetField(
130 library,
ToDart(
"_outgoingServices"),
136 result = Dart_SetField(
137 library,
ToDart(
"_viewRef"),
#define FIDL_NATIVE_LIST(V)
#define FML_DCHECK(condition)
#define REGISTER_FUNCTION(name, count)
static DartState * Current()
constexpr std::size_t size(T(&array)[N])
static fml::RefPtr< Handle > Create(zx_handle_t handle)
void Initialize(fidl::InterfaceHandle< fuchsia::sys::Environment > environment, zx::channel directory_request, std::optional< zx::eventpair > view_ref)
Initializes Dart bindings for the Fuchsia application model.
bool CheckAndHandleError(Dart_Handle handle)
const uint8_t * GetSymbol(Dart_NativeFunction native_function)
void SetReturnCode(uint32_t return_code)
#define DECLARE_FUNCTION(name, count)
#define FML_CHECK(condition)
Dart_NativeFunction GetNativeFunction(Dart_Handle name, int argument_count, bool *auto_setup_scope)
Dart_Handle ToDart(const T &object)