Как ссылаться на внешнюю глобальную переменную в Squeak FFI - PullRequest
2 голосов
/ 17 июня 2020

Для взаимодействия с HDF5 мне нужно получить ссылку на / value внешней переменной, экспортируемой библиотекой, и передать ее другим внешним функциям.

Например, есть переменная, представляющая собственный двойной введите: H5T_NATIVE_DOUBLE_g.

В VW, DLL CC, это возможно с помощью декларативной аннотации:

H5T_NATIVE_DOUBLE_g
    <C: hid_t H5T_NATIVE_DOUBLE_g>

Есть ли что-нибудь подобное в Squeak FFI? Есть ли поддержка для такого варианта использования?

1 Ответ

2 голосов
/ 17 июня 2020

После запроса, похоже, есть как минимум базовая c поддержка в (Threaded) FFIPlugin:

ExternalAddress class>>loadSymbol: moduleSymbol module: module 
    <primitive: 'primitiveLoadSymbolFromModule' module: 'SqueakFFIPrims'>
    ^ self primitiveFailed

Таким образом, мы могли бы создать ExternalData, получить его адрес через сообщение выше (передавая имя глобальной переменной и заданную ExternalLibrary в качестве аргумента модуля) и укажите ее тип.
Затем мы можем использовать эти ExternalData для передачи адреса, если внешняя функция ожидает указатель.
Чтобы передать значение, необходимо разыменовать адрес, не уверен, что он автоматизирован плагином ...

В моем случае я знаю, что мне придется передать значение, поэтому я могу напрямую отменить ссылку на адрес, чтобы получить значение и сохранить это (предполагая, что глобальная переменная назначается один раз при инициализации и не изменится впоследствии, и предполагая, что инициализация уже произошла во время загрузки библиотеки - множество c предположений, специфичных для приложения ...).

...