arisu писал(а):
так мы убиваем двух зайцев: сохраняем совместимость со старым исходным кодом, который использует `[ccall]`/`[ccall16]` (ну да, придётся перекомпилировать один раз), и почти полностью убираем проблему «необъяснимых падений».
(1) При этом мы теряем совместимость с существующим соглашением об отображении модулей на файлы. Сейчас ББ для обеих платформ может находиться в одном каталоге. А после принятия этого хака - нужно отдельно компилировать для каждой платформы и отдельно хранить для каждой платформы. Вам, может, это не особо чувствительно, а у меня инструменты завязаны на существующее соглашение, и рабочий процесс.
(2) При этом мы не то что совместимость теряем, а вовсе какой-то хаос привносим в ocf. Вот, допустим, перед нами M.ocf. В нем стек выравнен на 4 или на 16? Он для Лин или Вин? неизвестно. Проверить это загрузчик никак не может.
Проблема "необъяснимых падений", замечу, пока что гипотетическая - в существующих модулях для SDL2 она решена за счет ccall16. Хочется, чтобы она и осталась гипотетической. Но предложенное решение неудовлетворительно, его нужно дорабатывать.
Если уж зашла речь о том, что платформы несовместимы на уровне АБИ - то нужно это явно провести: согласиться, что в ocf идентификатор архитектуры идентифицирует не только архитектуру, но и платформу, и иметь тогда W386 и L386.
И в отображение модулей на файлы тоже ввести изменения: Module.w386 Module.L386. Например.
А вообще-то, решение-то уже есть у этой проблемы. Тот же SDL2 работает с [ccall16] без падений. Видимо, писанины для вас больше - сделать два интерфейсных модуля GitDll, GitSo, два платформенных модуля GitLin, GitWin, и еще единый модуль с высокоуровневым интерфейсом к гиту GitService, в который по шаблону Крюк будет устанавливаться GitLin или GitWin, в зависимости от платформы. (Собсно, так сейчас сделаны все "контакты" с платформой в самом ББ).
А вам бы хотелось один GitDllSo, и напрямую вызывать библиотечные процедуры.
Конечно, хлопотнее иметь несколько модулей, но решение рабочее, и совместимости не ломает.
На другой чаше весов - потеря совместимости + скрытая цена в виде переделки (перекомпиляции) всех модулей ББ, а их более 300, емнип.
Ну или, как я выше описал, честное введение понятия платформ в ocf и загрузчик.