@fluffylabs/anan-as 1.0.0-031e728
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +112 -0
- package/build/debug-raw.d.ts +210 -0
- package/build/debug-raw.js +372 -0
- package/build/debug-raw.wasm +0 -0
- package/build/debug.d.ts +204 -0
- package/build/debug.js +405 -0
- package/build/debug.wasm +0 -0
- package/build/release-mini.d.ts +210 -0
- package/build/release-mini.js +410 -0
- package/build/release-mini.wasm +0 -0
- package/build/release.d.ts +204 -0
- package/build/release.js +405 -0
- package/build/release.wasm +0 -0
- package/build/test.d.ts +6 -0
- package/build/test.js +47 -0
- package/build/test.wasm +0 -0
- package/package.json +78 -0
package/README.md
ADDED
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
# 🍍 anan-as
|
|
2
|
+
|
|
3
|
+
Assembly Script implementation of the JAM PVM (32bit).
|
|
4
|
+
|
|
5
|
+
[Demo](https://todr.me/anan-as)
|
|
6
|
+
|
|
7
|
+
#### Todo
|
|
8
|
+
|
|
9
|
+
- [x] Memory
|
|
10
|
+
- [x] [JAM tests](https://github.com/w3f/jamtestvectors/pull/3) compatibility
|
|
11
|
+
- [x] 64-bit & new instructions ([GrayPaper v0.5.0](https://graypaper.fluffylabs.dev))
|
|
12
|
+
- [x] GP 0.5.4 compatibility (ZBB extensions)
|
|
13
|
+
|
|
14
|
+
### Why?
|
|
15
|
+
|
|
16
|
+
- [Pineaples](https://en.wikipedia.org/wiki/Ananas) are cool.
|
|
17
|
+
- [JAM](https://graypaper.com/) is promising.
|
|
18
|
+
- [PVM](https://github.com/paritytech/polkavm) is neat.
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
### Useful where?
|
|
22
|
+
|
|
23
|
+
- Potentially as an alternative implementation for [`typeberry`](https://github.com/fluffylabs).
|
|
24
|
+
- To test out the [PVM debugger](https://pvm.fluffylabs.dev).
|
|
25
|
+
|
|
26
|
+
## Installation
|
|
27
|
+
|
|
28
|
+
```bash
|
|
29
|
+
npm install @fluffylabs/anan-as
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
## Usage
|
|
33
|
+
|
|
34
|
+
The package exports multiple builds to suit different use cases:
|
|
35
|
+
|
|
36
|
+
### ESM Bindings (Recommended)
|
|
37
|
+
|
|
38
|
+
ESM bindings provide a convenient JavaScript wrapper around the WebAssembly module:
|
|
39
|
+
|
|
40
|
+
```javascript
|
|
41
|
+
// Default import (optimized release build with ESM bindings)
|
|
42
|
+
import ananAs from '@fluffylabs/anan-as';
|
|
43
|
+
|
|
44
|
+
// Debug build (includes source maps and debug info)
|
|
45
|
+
import ananAs from '@fluffylabs/anan-as/debug';
|
|
46
|
+
|
|
47
|
+
// Explicit release build
|
|
48
|
+
import ananAs from '@fluffylabs/anan-as/release';
|
|
49
|
+
|
|
50
|
+
// Release build with minimal runtime (requires manually calling GC)
|
|
51
|
+
import ananAs from '@fluffylabs/anan-as/release-mini';
|
|
52
|
+
// make sure to call GC after multiple independent runs
|
|
53
|
+
ananAs.__collect();
|
|
54
|
+
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
### Raw Bindings
|
|
58
|
+
|
|
59
|
+
Raw bindings give you direct access to WebAssembly exports without the JavaScript wrapper layer. This is useful for instantiating multiple instances or when you need more control:
|
|
60
|
+
|
|
61
|
+
```javascript
|
|
62
|
+
// Raw bindings
|
|
63
|
+
import { instantiate } from '@fluffylabs/anan-as/raw';
|
|
64
|
+
// Import WASM file URLs
|
|
65
|
+
import debugWasm from '@fluffylabs/anan-as/debug.wasm';
|
|
66
|
+
import releaseWasm from '@fluffylabs/anan-as/release.wasm';
|
|
67
|
+
|
|
68
|
+
// Use with your own loader
|
|
69
|
+
const module = await WebAssembly.instantiateStreaming(
|
|
70
|
+
fetch(releaseWasm),
|
|
71
|
+
imports
|
|
72
|
+
);
|
|
73
|
+
const ananAs = await instantiate(module);
|
|
74
|
+
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
### Version Tags
|
|
78
|
+
|
|
79
|
+
When installing the package, you can choose between stable releases and bleeding-edge builds:
|
|
80
|
+
|
|
81
|
+
```bash
|
|
82
|
+
# Latest stable release
|
|
83
|
+
npm install @fluffylabs/anan-as
|
|
84
|
+
|
|
85
|
+
# Latest build from main branch (includes commit hash)
|
|
86
|
+
npm install @fluffylabs/anan-as@next
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
## Building
|
|
90
|
+
|
|
91
|
+
To download the dependencies:
|
|
92
|
+
```
|
|
93
|
+
$ npm ci
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
To build the WASM modules (in `./build/{release,debug}.wasm`):
|
|
97
|
+
|
|
98
|
+
```
|
|
99
|
+
$ npm run build
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
To run the example in the browser at [http://localhost:3000](http://localhost:3000).
|
|
103
|
+
|
|
104
|
+
```
|
|
105
|
+
$ npm run web
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
To run JSON test vectors.
|
|
109
|
+
|
|
110
|
+
```
|
|
111
|
+
$ npm start ./path/to/tests/*.json
|
|
112
|
+
```
|
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
declare namespace __AdaptedExports {
|
|
2
|
+
/** Exported memory */
|
|
3
|
+
export const memory: WebAssembly.Memory;
|
|
4
|
+
/**
|
|
5
|
+
* assembly/api-internal/getAssembly
|
|
6
|
+
* @param p `assembly/program/Program`
|
|
7
|
+
* @returns `~lib/string/String`
|
|
8
|
+
*/
|
|
9
|
+
export function getAssembly(p: __Internref26): string;
|
|
10
|
+
/**
|
|
11
|
+
* assembly/program-build/wrapAsProgram
|
|
12
|
+
* @param bytecode `~lib/typedarray/Uint8Array`
|
|
13
|
+
* @returns `~lib/typedarray/Uint8Array`
|
|
14
|
+
*/
|
|
15
|
+
export function wrapAsProgram(bytecode: Uint8Array): Uint8Array;
|
|
16
|
+
/**
|
|
17
|
+
* assembly/api-debugger/resetJAM
|
|
18
|
+
* @param program `~lib/array/Array<u8>`
|
|
19
|
+
* @param pc `f64`
|
|
20
|
+
* @param initialGas `i64`
|
|
21
|
+
* @param args `~lib/array/Array<u8>`
|
|
22
|
+
* @param hasMetadata `bool`
|
|
23
|
+
*/
|
|
24
|
+
export function resetJAM(program: Array<number>, pc: number, initialGas: bigint, args: Array<number>, hasMetadata?: boolean): void;
|
|
25
|
+
/**
|
|
26
|
+
* assembly/api-debugger/resetGeneric
|
|
27
|
+
* @param program `~lib/array/Array<u8>`
|
|
28
|
+
* @param flatRegisters `~lib/array/Array<u8>`
|
|
29
|
+
* @param initialGas `i64`
|
|
30
|
+
* @param hasMetadata `bool`
|
|
31
|
+
*/
|
|
32
|
+
export function resetGeneric(program: Array<number>, flatRegisters: Array<number>, initialGas: bigint, hasMetadata?: boolean): void;
|
|
33
|
+
/**
|
|
34
|
+
* assembly/api-debugger/resetGenericWithMemory
|
|
35
|
+
* @param program `~lib/array/Array<u8>`
|
|
36
|
+
* @param flatRegisters `~lib/array/Array<u8>`
|
|
37
|
+
* @param pageMap `~lib/typedarray/Uint8Array`
|
|
38
|
+
* @param chunks `~lib/typedarray/Uint8Array`
|
|
39
|
+
* @param initialGas `i64`
|
|
40
|
+
* @param hasMetadata `bool`
|
|
41
|
+
*/
|
|
42
|
+
export function resetGenericWithMemory(program: Array<number>, flatRegisters: Array<number>, pageMap: Uint8Array, chunks: Uint8Array, initialGas: bigint, hasMetadata?: boolean): void;
|
|
43
|
+
/**
|
|
44
|
+
* assembly/api-debugger/nextStep
|
|
45
|
+
* @returns `bool`
|
|
46
|
+
*/
|
|
47
|
+
export function nextStep(): boolean;
|
|
48
|
+
/**
|
|
49
|
+
* assembly/api-debugger/nSteps
|
|
50
|
+
* @param steps `u32`
|
|
51
|
+
* @returns `bool`
|
|
52
|
+
*/
|
|
53
|
+
export function nSteps(steps: number): boolean;
|
|
54
|
+
/**
|
|
55
|
+
* assembly/api-debugger/getProgramCounter
|
|
56
|
+
* @returns `u32`
|
|
57
|
+
*/
|
|
58
|
+
export function getProgramCounter(): number;
|
|
59
|
+
/**
|
|
60
|
+
* assembly/api-debugger/setNextProgramCounter
|
|
61
|
+
* @param pc `u32`
|
|
62
|
+
*/
|
|
63
|
+
export function setNextProgramCounter(pc: number): void;
|
|
64
|
+
/**
|
|
65
|
+
* assembly/api-debugger/getStatus
|
|
66
|
+
* @returns `u8`
|
|
67
|
+
*/
|
|
68
|
+
export function getStatus(): number;
|
|
69
|
+
/**
|
|
70
|
+
* assembly/api-debugger/getExitArg
|
|
71
|
+
* @returns `u32`
|
|
72
|
+
*/
|
|
73
|
+
export function getExitArg(): number;
|
|
74
|
+
/**
|
|
75
|
+
* assembly/api-debugger/getGasLeft
|
|
76
|
+
* @returns `i64`
|
|
77
|
+
*/
|
|
78
|
+
export function getGasLeft(): bigint;
|
|
79
|
+
/**
|
|
80
|
+
* assembly/api-debugger/setGasLeft
|
|
81
|
+
* @param gas `i64`
|
|
82
|
+
*/
|
|
83
|
+
export function setGasLeft(gas: bigint): void;
|
|
84
|
+
/**
|
|
85
|
+
* assembly/api-debugger/getRegisters
|
|
86
|
+
* @returns `~lib/typedarray/Uint8Array`
|
|
87
|
+
*/
|
|
88
|
+
export function getRegisters(): Uint8Array;
|
|
89
|
+
/**
|
|
90
|
+
* assembly/api-debugger/setRegisters
|
|
91
|
+
* @param flatRegisters `~lib/array/Array<u8>`
|
|
92
|
+
*/
|
|
93
|
+
export function setRegisters(flatRegisters: Array<number>): void;
|
|
94
|
+
/**
|
|
95
|
+
* assembly/api-debugger/getPageDump
|
|
96
|
+
* @param index `u32`
|
|
97
|
+
* @returns `~lib/typedarray/Uint8Array`
|
|
98
|
+
*/
|
|
99
|
+
export function getPageDump(index: number): Uint8Array;
|
|
100
|
+
/**
|
|
101
|
+
* assembly/api-debugger/setMemory
|
|
102
|
+
* @param address `u32`
|
|
103
|
+
* @param data `~lib/typedarray/Uint8Array`
|
|
104
|
+
*/
|
|
105
|
+
export function setMemory(address: number, data: Uint8Array): void;
|
|
106
|
+
/** assembly/api-utils/InputKind */
|
|
107
|
+
export enum InputKind {
|
|
108
|
+
/** @type `i32` */
|
|
109
|
+
Generic,
|
|
110
|
+
/** @type `i32` */
|
|
111
|
+
SPI,
|
|
112
|
+
}
|
|
113
|
+
/** assembly/api-utils/HasMetadata */
|
|
114
|
+
export enum HasMetadata {
|
|
115
|
+
/** @type `i32` */
|
|
116
|
+
Yes,
|
|
117
|
+
/** @type `i32` */
|
|
118
|
+
No,
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* assembly/api-utils/getGasCosts
|
|
122
|
+
* @param input `~lib/array/Array<u8>`
|
|
123
|
+
* @param kind `i32`
|
|
124
|
+
* @param withMetadata `i32`
|
|
125
|
+
* @returns `~lib/array/Array<assembly/gas-costs/BlockGasCost>`
|
|
126
|
+
*/
|
|
127
|
+
export function getGasCosts(input: Array<number>, kind: number, withMetadata: number): Array<__Record50<never>>;
|
|
128
|
+
/**
|
|
129
|
+
* assembly/api-utils/disassemble
|
|
130
|
+
* @param input `~lib/array/Array<u8>`
|
|
131
|
+
* @param kind `i32`
|
|
132
|
+
* @param withMetadata `i32`
|
|
133
|
+
* @returns `~lib/string/String`
|
|
134
|
+
*/
|
|
135
|
+
export function disassemble(input: Array<number>, kind: number, withMetadata: number): string;
|
|
136
|
+
/**
|
|
137
|
+
* assembly/api-utils/prepareProgram
|
|
138
|
+
* @param kind `i32`
|
|
139
|
+
* @param hasMetadata `i32`
|
|
140
|
+
* @param program `~lib/array/Array<u8>`
|
|
141
|
+
* @param initialRegisters `~lib/array/Array<u64>`
|
|
142
|
+
* @param initialPageMap `~lib/array/Array<assembly/api-internal/InitialPage>`
|
|
143
|
+
* @param initialMemory `~lib/array/Array<assembly/api-internal/InitialChunk>`
|
|
144
|
+
* @param args `~lib/array/Array<u8>`
|
|
145
|
+
* @returns `assembly/spi/StandardProgram`
|
|
146
|
+
*/
|
|
147
|
+
export function prepareProgram(kind: number, hasMetadata: number, program: Array<number>, initialRegisters: Array<bigint>, initialPageMap: Array<__Record46<undefined>>, initialMemory: Array<__Record48<undefined>>, args: Array<number>): __Internref42;
|
|
148
|
+
/**
|
|
149
|
+
* assembly/api-utils/runProgram
|
|
150
|
+
* @param program `assembly/spi/StandardProgram`
|
|
151
|
+
* @param initialGas `i64`
|
|
152
|
+
* @param programCounter `u32`
|
|
153
|
+
* @param logs `bool`
|
|
154
|
+
* @param useSbrkGas `bool`
|
|
155
|
+
* @returns `assembly/api-internal/VmOutput`
|
|
156
|
+
*/
|
|
157
|
+
export function runProgram(program: __Internref42, initialGas?: bigint, programCounter?: number, logs?: boolean, useSbrkGas?: boolean): __Record55<never>;
|
|
158
|
+
}
|
|
159
|
+
/** assembly/program/Program */
|
|
160
|
+
declare class __Internref26 extends Number {
|
|
161
|
+
private __nominal26: symbol;
|
|
162
|
+
private __nominal0: symbol;
|
|
163
|
+
}
|
|
164
|
+
/** assembly/gas-costs/BlockGasCost */
|
|
165
|
+
declare interface __Record50<TOmittable> {
|
|
166
|
+
/** @type `u32` */
|
|
167
|
+
pc: number | TOmittable;
|
|
168
|
+
/** @type `u64` */
|
|
169
|
+
gas: bigint | TOmittable;
|
|
170
|
+
}
|
|
171
|
+
/** assembly/api-internal/InitialPage */
|
|
172
|
+
declare interface __Record46<TOmittable> {
|
|
173
|
+
/** @type `u32` */
|
|
174
|
+
address: number | TOmittable;
|
|
175
|
+
/** @type `u32` */
|
|
176
|
+
length: number | TOmittable;
|
|
177
|
+
/** @type `i32` */
|
|
178
|
+
access: number | TOmittable;
|
|
179
|
+
}
|
|
180
|
+
/** assembly/api-internal/InitialChunk */
|
|
181
|
+
declare interface __Record48<TOmittable> {
|
|
182
|
+
/** @type `u32` */
|
|
183
|
+
address: number | TOmittable;
|
|
184
|
+
/** @type `~lib/array/Array<u8>` */
|
|
185
|
+
data: Array<number>;
|
|
186
|
+
}
|
|
187
|
+
/** assembly/spi/StandardProgram */
|
|
188
|
+
declare class __Internref42 extends Number {
|
|
189
|
+
private __nominal42: symbol;
|
|
190
|
+
private __nominal0: symbol;
|
|
191
|
+
}
|
|
192
|
+
/** assembly/api-internal/VmOutput */
|
|
193
|
+
declare interface __Record55<TOmittable> {
|
|
194
|
+
/** @type `i32` */
|
|
195
|
+
status: number | TOmittable;
|
|
196
|
+
/** @type `~lib/array/Array<u64>` */
|
|
197
|
+
registers: Array<bigint>;
|
|
198
|
+
/** @type `u32` */
|
|
199
|
+
pc: number | TOmittable;
|
|
200
|
+
/** @type `~lib/array/Array<assembly/api-internal/InitialChunk>` */
|
|
201
|
+
memory: Array<__Record48<never>>;
|
|
202
|
+
/** @type `i64` */
|
|
203
|
+
gas: bigint | TOmittable;
|
|
204
|
+
/** @type `u32` */
|
|
205
|
+
exitCode: number | TOmittable;
|
|
206
|
+
}
|
|
207
|
+
/** Instantiates the compiled WebAssembly module with the given imports. */
|
|
208
|
+
export declare function instantiate(module: WebAssembly.Module, imports: {
|
|
209
|
+
env: unknown,
|
|
210
|
+
}): Promise<typeof __AdaptedExports>;
|
|
@@ -0,0 +1,372 @@
|
|
|
1
|
+
export async function instantiate(module, imports = {}) {
|
|
2
|
+
const adaptedImports = {
|
|
3
|
+
env: Object.setPrototypeOf({
|
|
4
|
+
abort(message, fileName, lineNumber, columnNumber) {
|
|
5
|
+
// ~lib/builtins/abort(~lib/string/String | null?, ~lib/string/String | null?, u32?, u32?) => void
|
|
6
|
+
message = __liftString(message >>> 0);
|
|
7
|
+
fileName = __liftString(fileName >>> 0);
|
|
8
|
+
lineNumber = lineNumber >>> 0;
|
|
9
|
+
columnNumber = columnNumber >>> 0;
|
|
10
|
+
(() => {
|
|
11
|
+
// @external.js
|
|
12
|
+
throw Error(`${message} in ${fileName}:${lineNumber}:${columnNumber}`);
|
|
13
|
+
})();
|
|
14
|
+
},
|
|
15
|
+
"console.log"(text) {
|
|
16
|
+
// ~lib/bindings/dom/console.log(~lib/string/String) => void
|
|
17
|
+
text = __liftString(text >>> 0);
|
|
18
|
+
console.log(text);
|
|
19
|
+
},
|
|
20
|
+
}, Object.assign(Object.create(globalThis), imports.env || {})),
|
|
21
|
+
};
|
|
22
|
+
const { exports } = await WebAssembly.instantiate(module, adaptedImports);
|
|
23
|
+
const memory = exports.memory || imports.env.memory;
|
|
24
|
+
const adaptedExports = Object.setPrototypeOf({
|
|
25
|
+
getAssembly(p) {
|
|
26
|
+
// assembly/api-internal/getAssembly(assembly/program/Program) => ~lib/string/String
|
|
27
|
+
p = __lowerInternref(p) || __notnull();
|
|
28
|
+
return __liftString(exports.getAssembly(p) >>> 0);
|
|
29
|
+
},
|
|
30
|
+
wrapAsProgram(bytecode) {
|
|
31
|
+
// assembly/program-build/wrapAsProgram(~lib/typedarray/Uint8Array) => ~lib/typedarray/Uint8Array
|
|
32
|
+
bytecode = __lowerTypedArray(Uint8Array, 10, 0, bytecode) || __notnull();
|
|
33
|
+
return __liftTypedArray(Uint8Array, exports.wrapAsProgram(bytecode) >>> 0);
|
|
34
|
+
},
|
|
35
|
+
resetJAM(program, pc, initialGas, args, hasMetadata) {
|
|
36
|
+
// assembly/api-debugger/resetJAM(~lib/array/Array<u8>, f64, i64, ~lib/array/Array<u8>, bool?) => void
|
|
37
|
+
program = __retain(__lowerArray(__setU8, 6, 0, program) || __notnull());
|
|
38
|
+
initialGas = initialGas || 0n;
|
|
39
|
+
args = __lowerArray(__setU8, 6, 0, args) || __notnull();
|
|
40
|
+
hasMetadata = hasMetadata ? 1 : 0;
|
|
41
|
+
try {
|
|
42
|
+
exports.__setArgumentsLength(arguments.length);
|
|
43
|
+
exports.resetJAM(program, pc, initialGas, args, hasMetadata);
|
|
44
|
+
} finally {
|
|
45
|
+
__release(program);
|
|
46
|
+
}
|
|
47
|
+
},
|
|
48
|
+
resetGeneric(program, flatRegisters, initialGas, hasMetadata) {
|
|
49
|
+
// assembly/api-debugger/resetGeneric(~lib/array/Array<u8>, ~lib/array/Array<u8>, i64, bool?) => void
|
|
50
|
+
program = __retain(__lowerArray(__setU8, 6, 0, program) || __notnull());
|
|
51
|
+
flatRegisters = __lowerArray(__setU8, 6, 0, flatRegisters) || __notnull();
|
|
52
|
+
initialGas = initialGas || 0n;
|
|
53
|
+
hasMetadata = hasMetadata ? 1 : 0;
|
|
54
|
+
try {
|
|
55
|
+
exports.__setArgumentsLength(arguments.length);
|
|
56
|
+
exports.resetGeneric(program, flatRegisters, initialGas, hasMetadata);
|
|
57
|
+
} finally {
|
|
58
|
+
__release(program);
|
|
59
|
+
}
|
|
60
|
+
},
|
|
61
|
+
resetGenericWithMemory(program, flatRegisters, pageMap, chunks, initialGas, hasMetadata) {
|
|
62
|
+
// assembly/api-debugger/resetGenericWithMemory(~lib/array/Array<u8>, ~lib/array/Array<u8>, ~lib/typedarray/Uint8Array, ~lib/typedarray/Uint8Array, i64, bool?) => void
|
|
63
|
+
program = __retain(__lowerArray(__setU8, 6, 0, program) || __notnull());
|
|
64
|
+
flatRegisters = __retain(__lowerArray(__setU8, 6, 0, flatRegisters) || __notnull());
|
|
65
|
+
pageMap = __retain(__lowerTypedArray(Uint8Array, 10, 0, pageMap) || __notnull());
|
|
66
|
+
chunks = __lowerTypedArray(Uint8Array, 10, 0, chunks) || __notnull();
|
|
67
|
+
initialGas = initialGas || 0n;
|
|
68
|
+
hasMetadata = hasMetadata ? 1 : 0;
|
|
69
|
+
try {
|
|
70
|
+
exports.__setArgumentsLength(arguments.length);
|
|
71
|
+
exports.resetGenericWithMemory(program, flatRegisters, pageMap, chunks, initialGas, hasMetadata);
|
|
72
|
+
} finally {
|
|
73
|
+
__release(program);
|
|
74
|
+
__release(flatRegisters);
|
|
75
|
+
__release(pageMap);
|
|
76
|
+
}
|
|
77
|
+
},
|
|
78
|
+
nextStep() {
|
|
79
|
+
// assembly/api-debugger/nextStep() => bool
|
|
80
|
+
return exports.nextStep() != 0;
|
|
81
|
+
},
|
|
82
|
+
nSteps(steps) {
|
|
83
|
+
// assembly/api-debugger/nSteps(u32) => bool
|
|
84
|
+
return exports.nSteps(steps) != 0;
|
|
85
|
+
},
|
|
86
|
+
getProgramCounter() {
|
|
87
|
+
// assembly/api-debugger/getProgramCounter() => u32
|
|
88
|
+
return exports.getProgramCounter() >>> 0;
|
|
89
|
+
},
|
|
90
|
+
getExitArg() {
|
|
91
|
+
// assembly/api-debugger/getExitArg() => u32
|
|
92
|
+
return exports.getExitArg() >>> 0;
|
|
93
|
+
},
|
|
94
|
+
setGasLeft(gas) {
|
|
95
|
+
// assembly/api-debugger/setGasLeft(i64) => void
|
|
96
|
+
gas = gas || 0n;
|
|
97
|
+
exports.setGasLeft(gas);
|
|
98
|
+
},
|
|
99
|
+
getRegisters() {
|
|
100
|
+
// assembly/api-debugger/getRegisters() => ~lib/typedarray/Uint8Array
|
|
101
|
+
return __liftTypedArray(Uint8Array, exports.getRegisters() >>> 0);
|
|
102
|
+
},
|
|
103
|
+
setRegisters(flatRegisters) {
|
|
104
|
+
// assembly/api-debugger/setRegisters(~lib/array/Array<u8>) => void
|
|
105
|
+
flatRegisters = __lowerArray(__setU8, 6, 0, flatRegisters) || __notnull();
|
|
106
|
+
exports.setRegisters(flatRegisters);
|
|
107
|
+
},
|
|
108
|
+
getPageDump(index) {
|
|
109
|
+
// assembly/api-debugger/getPageDump(u32) => ~lib/typedarray/Uint8Array
|
|
110
|
+
return __liftTypedArray(Uint8Array, exports.getPageDump(index) >>> 0);
|
|
111
|
+
},
|
|
112
|
+
setMemory(address, data) {
|
|
113
|
+
// assembly/api-debugger/setMemory(u32, ~lib/typedarray/Uint8Array) => void
|
|
114
|
+
data = __lowerTypedArray(Uint8Array, 10, 0, data) || __notnull();
|
|
115
|
+
exports.setMemory(address, data);
|
|
116
|
+
},
|
|
117
|
+
InputKind: (values => (
|
|
118
|
+
// assembly/api-utils/InputKind
|
|
119
|
+
values[values.Generic = exports["InputKind.Generic"].valueOf()] = "Generic",
|
|
120
|
+
values[values.SPI = exports["InputKind.SPI"].valueOf()] = "SPI",
|
|
121
|
+
values
|
|
122
|
+
))({}),
|
|
123
|
+
HasMetadata: (values => (
|
|
124
|
+
// assembly/api-utils/HasMetadata
|
|
125
|
+
values[values.Yes = exports["HasMetadata.Yes"].valueOf()] = "Yes",
|
|
126
|
+
values[values.No = exports["HasMetadata.No"].valueOf()] = "No",
|
|
127
|
+
values
|
|
128
|
+
))({}),
|
|
129
|
+
getGasCosts(input, kind, withMetadata) {
|
|
130
|
+
// assembly/api-utils/getGasCosts(~lib/array/Array<u8>, i32, i32) => ~lib/array/Array<assembly/gas-costs/BlockGasCost>
|
|
131
|
+
input = __lowerArray(__setU8, 6, 0, input) || __notnull();
|
|
132
|
+
return __liftArray(pointer => __liftRecord50(__getU32(pointer)), 2, exports.getGasCosts(input, kind, withMetadata) >>> 0);
|
|
133
|
+
},
|
|
134
|
+
disassemble(input, kind, withMetadata) {
|
|
135
|
+
// assembly/api-utils/disassemble(~lib/array/Array<u8>, i32, i32) => ~lib/string/String
|
|
136
|
+
input = __lowerArray(__setU8, 6, 0, input) || __notnull();
|
|
137
|
+
return __liftString(exports.disassemble(input, kind, withMetadata) >>> 0);
|
|
138
|
+
},
|
|
139
|
+
prepareProgram(kind, hasMetadata, program, initialRegisters, initialPageMap, initialMemory, args) {
|
|
140
|
+
// assembly/api-utils/prepareProgram(i32, i32, ~lib/array/Array<u8>, ~lib/array/Array<u64>, ~lib/array/Array<assembly/api-internal/InitialPage>, ~lib/array/Array<assembly/api-internal/InitialChunk>, ~lib/array/Array<u8>) => assembly/spi/StandardProgram
|
|
141
|
+
program = __retain(__lowerArray(__setU8, 6, 0, program) || __notnull());
|
|
142
|
+
initialRegisters = __retain(__lowerArray(__setU64, 52, 3, initialRegisters) || __notnull());
|
|
143
|
+
initialPageMap = __retain(__lowerArray((pointer, value) => { __setU32(pointer, __lowerRecord46(value) || __notnull()); }, 47, 2, initialPageMap) || __notnull());
|
|
144
|
+
initialMemory = __retain(__lowerArray((pointer, value) => { __setU32(pointer, __lowerRecord48(value) || __notnull()); }, 49, 2, initialMemory) || __notnull());
|
|
145
|
+
args = __lowerArray(__setU8, 6, 0, args) || __notnull();
|
|
146
|
+
try {
|
|
147
|
+
return __liftInternref(exports.prepareProgram(kind, hasMetadata, program, initialRegisters, initialPageMap, initialMemory, args) >>> 0);
|
|
148
|
+
} finally {
|
|
149
|
+
__release(program);
|
|
150
|
+
__release(initialRegisters);
|
|
151
|
+
__release(initialPageMap);
|
|
152
|
+
__release(initialMemory);
|
|
153
|
+
}
|
|
154
|
+
},
|
|
155
|
+
runProgram(program, initialGas, programCounter, logs, useSbrkGas) {
|
|
156
|
+
// assembly/api-utils/runProgram(assembly/spi/StandardProgram, i64?, u32?, bool?, bool?) => assembly/api-internal/VmOutput
|
|
157
|
+
program = __lowerInternref(program) || __notnull();
|
|
158
|
+
initialGas = initialGas || 0n;
|
|
159
|
+
logs = logs ? 1 : 0;
|
|
160
|
+
useSbrkGas = useSbrkGas ? 1 : 0;
|
|
161
|
+
exports.__setArgumentsLength(arguments.length);
|
|
162
|
+
return __liftRecord55(exports.runProgram(program, initialGas, programCounter, logs, useSbrkGas) >>> 0);
|
|
163
|
+
},
|
|
164
|
+
}, exports);
|
|
165
|
+
function __liftRecord50(pointer) {
|
|
166
|
+
// assembly/gas-costs/BlockGasCost
|
|
167
|
+
// Hint: Opt-out from lifting as a record by providing an empty constructor
|
|
168
|
+
if (!pointer) return null;
|
|
169
|
+
return {
|
|
170
|
+
pc: __getU32(pointer + 0),
|
|
171
|
+
gas: __getU64(pointer + 8),
|
|
172
|
+
};
|
|
173
|
+
}
|
|
174
|
+
function __lowerRecord46(value) {
|
|
175
|
+
// assembly/api-internal/InitialPage
|
|
176
|
+
// Hint: Opt-out from lowering as a record by providing an empty constructor
|
|
177
|
+
if (value == null) return 0;
|
|
178
|
+
const pointer = exports.__pin(exports.__new(12, 46));
|
|
179
|
+
__setU32(pointer + 0, value.address);
|
|
180
|
+
__setU32(pointer + 4, value.length);
|
|
181
|
+
__setU32(pointer + 8, value.access);
|
|
182
|
+
exports.__unpin(pointer);
|
|
183
|
+
return pointer;
|
|
184
|
+
}
|
|
185
|
+
function __lowerRecord48(value) {
|
|
186
|
+
// assembly/api-internal/InitialChunk
|
|
187
|
+
// Hint: Opt-out from lowering as a record by providing an empty constructor
|
|
188
|
+
if (value == null) return 0;
|
|
189
|
+
const pointer = exports.__pin(exports.__new(8, 48));
|
|
190
|
+
__setU32(pointer + 0, value.address);
|
|
191
|
+
__setU32(pointer + 4, __lowerArray(__setU8, 6, 0, value.data) || __notnull());
|
|
192
|
+
exports.__unpin(pointer);
|
|
193
|
+
return pointer;
|
|
194
|
+
}
|
|
195
|
+
function __liftRecord48(pointer) {
|
|
196
|
+
// assembly/api-internal/InitialChunk
|
|
197
|
+
// Hint: Opt-out from lifting as a record by providing an empty constructor
|
|
198
|
+
if (!pointer) return null;
|
|
199
|
+
return {
|
|
200
|
+
address: __getU32(pointer + 0),
|
|
201
|
+
data: __liftArray(__getU8, 0, __getU32(pointer + 4)),
|
|
202
|
+
};
|
|
203
|
+
}
|
|
204
|
+
function __liftRecord55(pointer) {
|
|
205
|
+
// assembly/api-internal/VmOutput
|
|
206
|
+
// Hint: Opt-out from lifting as a record by providing an empty constructor
|
|
207
|
+
if (!pointer) return null;
|
|
208
|
+
return {
|
|
209
|
+
status: __getI32(pointer + 0),
|
|
210
|
+
registers: __liftArray(pointer => BigInt.asUintN(64, __getU64(pointer)), 3, __getU32(pointer + 4)),
|
|
211
|
+
pc: __getU32(pointer + 8),
|
|
212
|
+
memory: __liftArray(pointer => __liftRecord48(__getU32(pointer)), 2, __getU32(pointer + 12)),
|
|
213
|
+
gas: __getI64(pointer + 16),
|
|
214
|
+
exitCode: __getU32(pointer + 24),
|
|
215
|
+
};
|
|
216
|
+
}
|
|
217
|
+
function __liftString(pointer) {
|
|
218
|
+
if (!pointer) return null;
|
|
219
|
+
const
|
|
220
|
+
end = pointer + new Uint32Array(memory.buffer)[pointer - 4 >>> 2] >>> 1,
|
|
221
|
+
memoryU16 = new Uint16Array(memory.buffer);
|
|
222
|
+
let
|
|
223
|
+
start = pointer >>> 1,
|
|
224
|
+
string = "";
|
|
225
|
+
while (end - start > 1024) string += String.fromCharCode(...memoryU16.subarray(start, start += 1024));
|
|
226
|
+
return string + String.fromCharCode(...memoryU16.subarray(start, end));
|
|
227
|
+
}
|
|
228
|
+
function __liftArray(liftElement, align, pointer) {
|
|
229
|
+
if (!pointer) return null;
|
|
230
|
+
const
|
|
231
|
+
dataStart = __getU32(pointer + 4),
|
|
232
|
+
length = __dataview.getUint32(pointer + 12, true),
|
|
233
|
+
values = new Array(length);
|
|
234
|
+
for (let i = 0; i < length; ++i) values[i] = liftElement(dataStart + (i << align >>> 0));
|
|
235
|
+
return values;
|
|
236
|
+
}
|
|
237
|
+
function __lowerArray(lowerElement, id, align, values) {
|
|
238
|
+
if (values == null) return 0;
|
|
239
|
+
const
|
|
240
|
+
length = values.length,
|
|
241
|
+
buffer = exports.__pin(exports.__new(length << align, 1)) >>> 0,
|
|
242
|
+
header = exports.__pin(exports.__new(16, id)) >>> 0;
|
|
243
|
+
__setU32(header + 0, buffer);
|
|
244
|
+
__dataview.setUint32(header + 4, buffer, true);
|
|
245
|
+
__dataview.setUint32(header + 8, length << align, true);
|
|
246
|
+
__dataview.setUint32(header + 12, length, true);
|
|
247
|
+
for (let i = 0; i < length; ++i) lowerElement(buffer + (i << align >>> 0), values[i]);
|
|
248
|
+
exports.__unpin(buffer);
|
|
249
|
+
exports.__unpin(header);
|
|
250
|
+
return header;
|
|
251
|
+
}
|
|
252
|
+
function __liftTypedArray(constructor, pointer) {
|
|
253
|
+
if (!pointer) return null;
|
|
254
|
+
return new constructor(
|
|
255
|
+
memory.buffer,
|
|
256
|
+
__getU32(pointer + 4),
|
|
257
|
+
__dataview.getUint32(pointer + 8, true) / constructor.BYTES_PER_ELEMENT
|
|
258
|
+
).slice();
|
|
259
|
+
}
|
|
260
|
+
function __lowerTypedArray(constructor, id, align, values) {
|
|
261
|
+
if (values == null) return 0;
|
|
262
|
+
const
|
|
263
|
+
length = values.length,
|
|
264
|
+
buffer = exports.__pin(exports.__new(length << align, 1)) >>> 0,
|
|
265
|
+
header = exports.__new(12, id) >>> 0;
|
|
266
|
+
__setU32(header + 0, buffer);
|
|
267
|
+
__dataview.setUint32(header + 4, buffer, true);
|
|
268
|
+
__dataview.setUint32(header + 8, length << align, true);
|
|
269
|
+
new constructor(memory.buffer, buffer, length).set(values);
|
|
270
|
+
exports.__unpin(buffer);
|
|
271
|
+
return header;
|
|
272
|
+
}
|
|
273
|
+
class Internref extends Number {}
|
|
274
|
+
const registry = new FinalizationRegistry(__release);
|
|
275
|
+
function __liftInternref(pointer) {
|
|
276
|
+
if (!pointer) return null;
|
|
277
|
+
const sentinel = new Internref(__retain(pointer));
|
|
278
|
+
registry.register(sentinel, pointer);
|
|
279
|
+
return sentinel;
|
|
280
|
+
}
|
|
281
|
+
function __lowerInternref(value) {
|
|
282
|
+
if (value == null) return 0;
|
|
283
|
+
if (value instanceof Internref) return value.valueOf();
|
|
284
|
+
throw TypeError("internref expected");
|
|
285
|
+
}
|
|
286
|
+
const refcounts = new Map();
|
|
287
|
+
function __retain(pointer) {
|
|
288
|
+
if (pointer) {
|
|
289
|
+
const refcount = refcounts.get(pointer);
|
|
290
|
+
if (refcount) refcounts.set(pointer, refcount + 1);
|
|
291
|
+
else refcounts.set(exports.__pin(pointer), 1);
|
|
292
|
+
}
|
|
293
|
+
return pointer;
|
|
294
|
+
}
|
|
295
|
+
function __release(pointer) {
|
|
296
|
+
if (pointer) {
|
|
297
|
+
const refcount = refcounts.get(pointer);
|
|
298
|
+
if (refcount === 1) exports.__unpin(pointer), refcounts.delete(pointer);
|
|
299
|
+
else if (refcount) refcounts.set(pointer, refcount - 1);
|
|
300
|
+
else throw Error(`invalid refcount '${refcount}' for reference '${pointer}'`);
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
function __notnull() {
|
|
304
|
+
throw TypeError("value must not be null");
|
|
305
|
+
}
|
|
306
|
+
let __dataview = new DataView(memory.buffer);
|
|
307
|
+
function __setU8(pointer, value) {
|
|
308
|
+
try {
|
|
309
|
+
__dataview.setUint8(pointer, value, true);
|
|
310
|
+
} catch {
|
|
311
|
+
__dataview = new DataView(memory.buffer);
|
|
312
|
+
__dataview.setUint8(pointer, value, true);
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
function __setU32(pointer, value) {
|
|
316
|
+
try {
|
|
317
|
+
__dataview.setUint32(pointer, value, true);
|
|
318
|
+
} catch {
|
|
319
|
+
__dataview = new DataView(memory.buffer);
|
|
320
|
+
__dataview.setUint32(pointer, value, true);
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
function __setU64(pointer, value) {
|
|
324
|
+
try {
|
|
325
|
+
__dataview.setBigUint64(pointer, value, true);
|
|
326
|
+
} catch {
|
|
327
|
+
__dataview = new DataView(memory.buffer);
|
|
328
|
+
__dataview.setBigUint64(pointer, value, true);
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
function __getU8(pointer) {
|
|
332
|
+
try {
|
|
333
|
+
return __dataview.getUint8(pointer, true);
|
|
334
|
+
} catch {
|
|
335
|
+
__dataview = new DataView(memory.buffer);
|
|
336
|
+
return __dataview.getUint8(pointer, true);
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
function __getI32(pointer) {
|
|
340
|
+
try {
|
|
341
|
+
return __dataview.getInt32(pointer, true);
|
|
342
|
+
} catch {
|
|
343
|
+
__dataview = new DataView(memory.buffer);
|
|
344
|
+
return __dataview.getInt32(pointer, true);
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
function __getU32(pointer) {
|
|
348
|
+
try {
|
|
349
|
+
return __dataview.getUint32(pointer, true);
|
|
350
|
+
} catch {
|
|
351
|
+
__dataview = new DataView(memory.buffer);
|
|
352
|
+
return __dataview.getUint32(pointer, true);
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
function __getI64(pointer) {
|
|
356
|
+
try {
|
|
357
|
+
return __dataview.getBigInt64(pointer, true);
|
|
358
|
+
} catch {
|
|
359
|
+
__dataview = new DataView(memory.buffer);
|
|
360
|
+
return __dataview.getBigInt64(pointer, true);
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
function __getU64(pointer) {
|
|
364
|
+
try {
|
|
365
|
+
return __dataview.getBigUint64(pointer, true);
|
|
366
|
+
} catch {
|
|
367
|
+
__dataview = new DataView(memory.buffer);
|
|
368
|
+
return __dataview.getBigUint64(pointer, true);
|
|
369
|
+
}
|
|
370
|
+
}
|
|
371
|
+
return adaptedExports;
|
|
372
|
+
}
|
|
Binary file
|