Spec-Zone.ru › OCaml 4.14

Модуль Dynlink

module Dynlink: sig .. end

Динамическая загрузка файлов .cmo, .cma и .cmxs.

val is_native : bool

true если программа нативную, false если программа на байткоде.

Динамическая загрузка скомпилированных файлов

val loadfile : string -> unit

В байткоде: загрузить указанный файл байткода (.cmo файл) или файл байткодовой библиотеки (.cma файл) и связать его с работающей программой. В нативном коде: загрузить указанный файл плагина OCaml (обычно .cmxs) и связать его с работающей программой.

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

Будет вызвано исключение, если данная библиотека определяет модули верхнего уровня, имена которых конфликтуют с имеющимися модулями либо в основной программе, либо в общей библиотеке, загруженной ранее с помощью loadfile. Модули из общих библиотек, ранее загруженных с помощью loadfile_private, в это ограничение не входят.

Единицы компиляции, загруженные этой функцией, добавляются в список «разрешенных единиц» (см. Dynlink.set_allowed_units).

val loadfile_private : string -> unit

То же, что и loadfile, за исключением того, что загруженные единицы компиляции скрыты (не могут быть обработаны) другими модулями, динамически загруженными впоследствии.

Будет вызвано исключение, если данная библиотека определяет модули верхнего уровня, имена которых конфликтуют с имеющимися модулями либо в основной программе, либо в общей библиотеке, загруженной ранее с помощью loadfile. Модули из общих библиотек, ранее загруженных с помощью loadfile_private, в это ограничение не входят.

Также будет вызвано исключение, если данная библиотека определяет модули верхнего уровня, имя которых совпадает с именем интерфейса, от которого зависит модуль, существующий либо в основной программе, либо в общей библиотеке, загруженной ранее с помощью loadfile. Это относится даже к зависимостям «псевдонима модуля» (т. е. только от имени, а не от содержимого интерфейса).

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

val adapt_filename : string -> string

В байткоде – функция идентичности. В нативном коде – замена последней расширения на .cmxs.

Управление доступом

val set_allowed_units : string list -> unit

Установите список единиц компиляции, к которым могут обращаться единицы, динамически загруженные в будущем, точно в соответствии с заданным значением.

Изначально все единицы компиляции, составляющие работающую программу, доступны для обработки из динамически связанных единиц. set_allowed_units может использоваться для ограничения доступа к подмножеству этих единиц, например, к единицам, составляющим API для динамически связанного кода, и предотвращения доступа ко всем другим единицам, например, к частным, внутренним модулям работающей программы.

Обратите внимание, что Dynlink.loadfile изменяет список разрешенных единиц.

val allow_only : string list -> unit

allow_only units устанавливает список разрешенных единиц, являющийся пересечением существующих разрешенных единиц и заданного списка единиц. Таким образом, он никогда не увеличивает множество разрешенных единиц.

val prohibit : string list -> unit

prohibit units запрещает динамически связанным единицам обращаться к единицам, перечисленным в списке units, удаляя такие единицы из списка разрешенных. Это можно использовать для предотвращения доступа к выбранным единицам, например, к частным, внутренним модулям работающей программы.

val main_program_units : unit -> string list

Возвращает список единиц компиляции, составляющих основную программу (то есть не динамически связанные).

val public_dynamically_loaded_units : unit -> string list

Возвращает список единиц компиляции, которые были динамически загружены с помощью loadfile (и не с помощью loadfile_private). Обратите внимание, что динамически загруженные единицы компиляции нельзя разгрузить.

val all_units : unit -> string list

Возвращает список единиц компиляции, составляющих основную программу вместе с единицами, которые были динамически загружены с помощью loadfile (и не с помощью loadfile_private).

val allow_unsafe_modules : bool -> unit

Управляет тем, разрешается ли динамическая загрузка небезопасных объектных файлов. Единица компиляции считается «небезопасной», если она содержит объявления внешних функций, которые могут нарушить безопасность типов. По умолчанию динамическая загрузка небезопасных объектных файлов не разрешена. В нативном коде эта функция ничего не делает; объектные файлы с внешними функциями всегда разрешено динамически подключать.

Обработка ошибок

type linking_error = private 
| Undefined_global of string
| Unavailable_primitive of string
| Uninitialized_global of string
type error = private 
| Not_a_bytecode_file of string
| Inconsistent_import of string
| Unavailable_unit of string
| Unsafe_file
| Linking_error of string * linking_error
| Corrupted_interface of string
| Cannot_open_dynamic_library of exn
| Library's_module_initializers_failed of exn
| Inconsistent_implementation of string
| Module_already_loaded of string
| Private_library_cannot_implement_interface of string
exception Error of error

Ошибки при динамическом связывании сообщаются путём повышения исключения Error с описанием ошибки. Частым случаем является отсутствие динамической библиотеки в системе: это сообщается через Cannot_open_dynamic_library (вложенное исключение может быть специфичным для платформы).

val error_message : error -> string

Преобразовать описание ошибки в удобочитаемое сообщение.

© 1995-2022 INRIA.
https://v2.ocaml.org/releases/4.14/htmlman/libref/Dynlink.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API