Host and execution limits
ASPL 0.7.0 · Current release
Hosts and compilation, execution, memory, output, and time ceilings.
On this page
Hosts
The browser runs compiler and VM in a local WebAssembly worker without sending source to a server. It rejects foreign imports even when unused with policy-rejection / foreign-imports-not-supported. User source modules, C interoperability, HTTP, and Raylib require native execution. The native host runs on Linux with process authority and is not a sandbox.
Resource ceilings
MiB = 1048576 bytes; KiB = 1024 bytes.
| Resource | Native | Browser |
|---|---|---|
| Source bytes | 16 MiB | 1 MiB |
| Lexical items | 1048576 | 131072 |
| Syntax nodes | 1048576 | 131072 |
| Syntactic nesting | 256 | 128 |
| Compiler working memory | 512 MiB | 128 MiB |
| Bytecode bytes | 64 MiB | 8 MiB |
| Functions | 65536 | 4096 |
| Foreign imports | 4096 | 0 |
| Integer constants | 1048576 | 131072 |
| Float constants | 1048576 | 131072 |
| String references | 1048576 | 131072 |
| String bytes | 16 MiB | 2 MiB |
| Input-line payload | 65536 bytes | 65536 bytes |
| Bytecode instructions | 4194304 | 524288 |
| Registers per function | 65536 | 8192 |
| Executed instructions | none | 10000000 |
| Runtime frames | 4096 | 512 |
| Runtime value slots | 1048576 | 131072 |
| VM-owned execution memory | 256 MiB | 64 MiB |
| Captured output | none | 256 KiB |
| Check wall time | none | 2 s |
| Run wall time | none | 3 s |
| WebAssembly linear memory | n/a | 256 MiB |
| Concurrent worker jobs | n/a | 1 |
none means no product ceiling; n/a means not applicable. The first observed ceiling determines the outcome.
Memory accounting
Source includes every byte read, including a leading byte-order mark. Compiler memory includes all live compilation allocations. Execution memory includes frames, slots, C-string loans, and live execution-owned strings, excluding immutable program storage, libraries, and foreign allocations. A structural ceiling wins over a memory ceiling at the same operation. Allocation failure below the ceiling is host-failure / allocation-failed.
Deadlines and output
The check clock starts when the loaded worker accepts the job; the run clock starts when it accepts execution after a successful check. Loading counts against neither clock, and waiting for user input does not count against the run clock. The first observed ceiling determines the outcome; a deadline terminates the worker with time-limit. The output ceiling rejects the entire crossing write and retains prior output as partial. Native execution has no product instruction, time, or output ceiling, subject to the instruction counter's representational maximum.
Release scope and related reading
This page describes ASPL 0.7.0. The linked MVP text is a historical record, not a complete description of current extensions.
In 0.7.0 private bytecode is 7 and browser-result wire is 3. Execution memory also accounts for live list, record, and result storage. Files and input extend the historical MVP scope.
Browser-limited loop
Open this example only in the browser. Do not run it natively, where there is no product instruction ceiling. The first observed limit wins; a slow device can reach the time deadline before the instruction ceiling.
Execution: Browser only · ASPL 0.7.0
- No prior knowledge is required to open and check it.
Input: No input lines are required.
fn start_main() -> i64 {
while true {}
return 0;
}
Expected outcomes
{
"browser": {
"check": "success",
"class": "limit-stop",
"reason": "execution-instruction-limit",
"ceiling": 10000000,
"output": ""
}
}