Spec-Zone.ru › OCaml

Модуль 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-2024 INRIA.
https://ocaml.org/manual/5.2/api/Dynlink.html

Spec-Zone.ru

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