GHC.Stable
| Авторские права | (c) Университет Глазго 1992-2004 |
|---|---|
| Лицензия | см. libraries/base/LICENSE |
| Поддержка | ffi@haskell.org |
| Устойчивость | внутренняя |
| Переносимость | непереносимая (расширения GHC) |
| Безопасный Haskell | Нет |
| Язык | Haskell2010 |
Описание
Устойчивые указатели.
Устойчивый указатель — это ссылка на выражение Haskell, которая гарантирует, что оно не будет затронуто сборкой мусора, т.е. оно не будет удалено, и значение самого устойчивого указателя не изменится во время сборки мусора (обычные ссылки могут быть перемещены во время сборки мусора). Следовательно, устойчивые указатели можно передавать внешнему коду, который может рассматривать их как неявную ссылку на значение Haskell.
Значение StablePtr зарезервировано для представления NULL во внешнем коде.
Значение типа StablePtr a — это устойчивый указатель на выражение Haskell типа a.
Конструкторы
| StablePtr (StablePtr# a) |
Примеры реализации
| Storable (StablePtr a) Исходный код | С версии: base-2.1 |
Определено в GHC.Internal.Foreign.Storable МетодыsizeOf :: StablePtr a -> Int Исходный код alignment :: StablePtr a -> Int Исходный код peekElemOff :: Ptr (StablePtr a) -> Int -> IO (StablePtr a) Исходный код pokeElemOff :: Ptr (StablePtr a) -> Int -> StablePtr a -> IO () Исходный код peekByteOff :: Ptr b -> Int -> IO (StablePtr a) Исходный код pokeByteOff :: Ptr b -> Int -> StablePtr a -> IO () Исходный код peek :: Ptr (StablePtr a) -> IO (StablePtr a) Исходный код poke :: Ptr (StablePtr a) -> StablePtr a -> IO () Исходный код | |
| Eq (StablePtr a) Исходный код | С версии: base-2.1 |
Определено в GHC.Internal.Stable Методы== :: StablePtr a -> StablePtr a -> Bool Исходный код /= :: StablePtr a -> StablePtr a -> Bool Исходный код |
newStablePtr :: a -> IO (StablePtr a) Исходный код
Создаёт стабильный указатель, ссылающийся на заданное значение Haskell.
deRefStablePtr :: StablePtr a -> IO a Исходный код
Получает значение Haskell, на которое ссылается стабильный указатель, т.е. то же самое значение, которое было передано в соответствующий вызов newStablePtr. Если аргумент функции deRefStablePtr уже был освобожден с помощью freeStablePtr, поведение функции deRefStablePtr не определено.
freeStablePtr :: StablePtr a -> IO () Исходный код
Разрывает связь между стабильным указателем и значением Haskell. После этого, если стабильный указатель передается в deRefStablePtr или freeStablePtr, поведение не определено. Однако стабильный указатель всё ещё может быть передан в castStablePtrToPtr, но значение Ptr (), возвращаемое castStablePtrToPtr, в этом случае не определено (в частности, оно может быть nullPtr). Тем не менее, вызов castStablePtrToPtr гарантированно не будет циклиться.
castStablePtrToPtr :: StablePtr a -> Ptr () Исходный код
Преобразует стабильный указатель в адрес. Не делаются гарантии относительно полученного значения, за исключением того, что исходный стабильный указатель может быть восстановлен с помощью castPtrToStablePtr. В частности, адрес может не ссылаться на доступный участок памяти, и любая попытка передачи его в функции класса Storable приводит к неопределенному поведению.
castPtrToStablePtr :: Ptr () -> StablePtr a Исходный код
Обратное преобразование castStablePtrToPtr, т.е., у нас есть тождество
sp == castPtrToStablePtr (castStablePtrToPtr sp)
для любого стабильного указателя sp, над которым freeStablePtr ещё не выполнялось. Более того, castPtrToStablePtr может применяться только к указателям, которые были созданы с помощью castStablePtrToPtr.
© The University of Glasgow and others
Licensed under a BSD-style license (see top of the page).
https://downloads.haskell.org/~ghc/9.12.1/docs/libraries/base-4.21.0.0-8e62/GHC-Stable.html