Есть места, в которых могло бы пригодится стирание типов.
Из того что есть в данный момент:
Completer, который регистрирует по отдельной функции для каждого типа которым Раст завершает Дартовские футуры.
Function, который регистрирует по отдельной функции для каждого типа который раст может в него прокинуть.
Что появится потом:
Резалты.
Опшены.
В этих случаях, при текущем подходе надо будет делать по отдельной структуре на каждый тип/комбинацию: Option<i64>, Option<ptr::NonNull<c_void>>, Result<i64, String>, Result<i64, DartHandle> и т.д. А еще может понадобится композирование этих структур, а-ля Result<Option<ptr::NonNull<c_void>>, String>, тогда вообще весело будет.
Учитывая, что у нас и так FFI, и нет никаких гарантий что на вход прийдет действительно то, что мы ожидаем вижу смысл прибегнуть с стиранию типов.
Solution
У нас уже есть енам, в котором собрано все что мы можем прокидывать через FFI. Лепим над ним #[repr(u8)] и спокойно передаем туды-сюды.
Use type erased wrapper for values transferred through FFI boundaries (#203)
Additionally:
- use 'dev' Flutter channel on CI
- use 'x86_64' arch for Android emulator on CI
Synopsis
Есть места, в которых могло бы пригодится стирание типов.
Из того что есть в данный момент:
Что появится потом:
В этих случаях, при текущем подходе надо будет делать по отдельной структуре на каждый тип/комбинацию:
Option<i64>
,Option<ptr::NonNull<c_void>>
,Result<i64, String>
,Result<i64, DartHandle>
и т.д. А еще может понадобится композирование этих структур, а-ляResult<Option<ptr::NonNull<c_void>>, String>
, тогда вообще весело будет.Учитывая, что у нас и так FFI, и нет никаких гарантий что на вход прийдет действительно то, что мы ожидаем вижу смысл прибегнуть с стиранию типов.
Solution
У нас уже есть енам, в котором собрано все что мы можем прокидывать через FFI. Лепим над ним
#[repr(u8)]
и спокойно передаем туды-сюды.Некоторые нюансы реализации
Почему переехали с flutter stable на dev?
Почему на CI переехали в
i686-linux-android
наx86_64-linux-android
?Почему
PtrArray
теперь пердается как указатель а не by value?DartValue
не делать отдельный вариант под каждую структуру, которую мы будем передавать через FFI.Почему
Dart_Handle
вDartValue
передаем как указатель а не by value?DartHandle
, а вотPointer<DartHandle>
можно.Что за стремный
unbox_dart_handle(ptr::NonNull<Dart_Handle>) -> Dart_Handle
Pointer<DartHandle>
получитьDartHandle
, сделать это можно только так.Checklist
Draft:
prefixk::
labels appliedDraft:
prefix is removed