# Пам'ять (env)

> Host-функції пам'яті NeuroWASM — allocate, deallocate і abort — і правила розташування пам'яті, яких має дотримуватися контракт.

Source: https://docs.nro.world/uk/neurowasm/memory

Контракт експортує одну лінійну `memory`. Host-функції читають і пишуть її через пари `(ptr, len)`; вказівник чи довжина за межами пам'яті призводять до помилки host-функції (зазвичай повертається `-1`), а не до переривання.

VM копіює вхідні дані виклику **зі зміщенням 64**; див. [Експорти контракту → call](./exports#call).

## `allocate` <Badge type="tip" text="працює" />

```text
(import "env" "allocate" (func (param i32) (result i32)))
allocate(size: i32) → ptr: i32
```

Резервує `size` байтів простим зсувним алокатором і повертає початок. Хост лише пересуває курсор — пам'ять він не збільшує, тож контракт має подбати, щоб діапазон існував. Від'ємні розміри вважаються 0; один запит обмежено **1 MiB**. Для інструментаріїв (AssemblyScript тощо), які очікують, що виділятиме хост.

## `deallocate` <Badge type="tip" text="працює" />

```text
(import "env" "deallocate" (func (param i32)))
```

Нічого не робить — зсувний алокатор ніколи не звільняє пам'ять. Є, щоб лінкувався код, написаний під інтерфейси алокаторів.

## `abort` <Badge type="tip" text="працює" />

```text
(import "env" "abort" (func (param i32 i32 i32 i32)))
```

Хук переривання AssemblyScript, прийнятий, щоб такі модулі лінкувалися. **Він нічого не робить і не зупиняє виконання** — AssemblyScript після нього виконує `unreachable`, і саме це робить виклик невдалим. Щоб навмисно завершити виклик помилкою, перервіться (`unreachable`) — це відкотить усе дерево викликів — або поверніть помилку через `set_return`, коли викликач має побачити повідомлення.
