instrumentisto / medea

[Closed] Medea media server
Mozilla Public License 2.0
23 stars 3 forks source link

Use type erased wrapper for values transferred through FFI #203

Closed alexlapa closed 3 years ago

alexlapa commented 3 years ago

Synopsis

Есть места, в которых могло бы пригодится стирание типов.

Из того что есть в данный момент:

  1. Completer, который регистрирует по отдельной функции для каждого типа которым Раст завершает Дартовские футуры.
  2. Function, который регистрирует по отдельной функции для каждого типа который раст может в него прокинуть.

Что появится потом:

  1. Резалты.
  2. Опшены.

В этих случаях, при текущем подходе надо будет делать по отдельной структуре на каждый тип/комбинацию: 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?

Почему Dart_Handle в DartValue передаем как указатель а не by value?

Что за стремный unbox_dart_handle(ptr::NonNull<Dart_Handle>) -> Dart_Handle

Checklist

alexlapa commented 3 years ago

FCM:

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