@fluffylabs/anan-as 1.0.0-791e5e1 → 1.0.0-7ec9bd7

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 CHANGED
@@ -1,24 +1,23 @@
1
1
  # 🍍 anan-as
2
2
 
3
- Assembly Script implementation of the JAM PVM (32bit).
3
+ AssemblyScript implementation of the JAM PVM (64-bit).
4
4
 
5
5
  [Demo](https://todr.me/anan-as)
6
6
 
7
- #### Todo
7
+ ## Todo
8
8
 
9
9
  - [x] Memory
10
10
  - [x] [JAM tests](https://github.com/w3f/jamtestvectors/pull/3) compatibility
11
11
  - [x] 64-bit & new instructions ([GrayPaper v0.5.0](https://graypaper.fluffylabs.dev))
12
12
  - [x] GP 0.5.4 compatibility (ZBB extensions)
13
13
 
14
- ### Why?
14
+ ## Why?
15
15
 
16
- - [Pineaples](https://en.wikipedia.org/wiki/Ananas) are cool.
16
+ - [Pineapples](https://en.wikipedia.org/wiki/Ananas) are cool.
17
17
  - [JAM](https://graypaper.com/) is promising.
18
18
  - [PVM](https://github.com/paritytech/polkavm) is neat.
19
19
 
20
-
21
- ### Useful where?
20
+ ## Useful where?
22
21
 
23
22
  - Potentially as an alternative implementation for [`typeberry`](https://github.com/fluffylabs).
24
23
  - To test out the [PVM debugger](https://pvm.fluffylabs.dev).
@@ -54,9 +53,11 @@ ananAs.__collect();
54
53
 
55
54
  ```
56
55
 
57
- ### Raw Bindings
56
+ ## Raw Bindings
58
57
 
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:
58
+ Raw bindings give you direct access to WebAssembly exports
59
+ without the JavaScript wrapper layer.
60
+ This is useful for instantiating multiple instances or when you need more control:
60
61
 
61
62
  ```javascript
62
63
  // Raw bindings
@@ -74,9 +75,10 @@ const ananAs = await instantiate(module);
74
75
 
75
76
  ```
76
77
 
77
- ### Version Tags
78
+ ## Version Tags
78
79
 
79
- When installing the package, you can choose between stable releases and bleeding-edge builds:
80
+ When installing the package, you can choose between stable releases
81
+ and bleeding-edge builds:
80
82
 
81
83
  ```bash
82
84
  # Latest stable release
@@ -89,24 +91,25 @@ npm install @fluffylabs/anan-as@next
89
91
  ## Building
90
92
 
91
93
  To download the dependencies:
92
- ```
93
- $ npm ci
94
+
95
+ ```cmd
96
+ npm ci
94
97
  ```
95
98
 
96
99
  To build the WASM modules (in `./build/{release,debug}.wasm`):
97
100
 
98
- ```
99
- $ npm run build
101
+ ```cmd
102
+ npm run build
100
103
  ```
101
104
 
102
105
  To run the example in the browser at [http://localhost:3000](http://localhost:3000).
103
106
 
104
- ```
105
- $ npm run web
107
+ ```cmd
108
+ npm run web
106
109
  ```
107
110
 
108
111
  To run JSON test vectors.
109
112
 
110
- ```
111
- $ npm start ./path/to/tests/*.json
113
+ ```cmd
114
+ npm start ./path/to/tests/*.json
112
115
  ```
@@ -97,12 +97,20 @@ declare namespace __AdaptedExports {
97
97
  * @returns `~lib/typedarray/Uint8Array`
98
98
  */
99
99
  export function getPageDump(index: number): Uint8Array;
100
+ /**
101
+ * assembly/api-debugger/getMemory
102
+ * @param address `u32`
103
+ * @param length `u32`
104
+ * @returns `~lib/typedarray/Uint8Array | null`
105
+ */
106
+ export function getMemory(address: number, length: number): Uint8Array | null;
100
107
  /**
101
108
  * assembly/api-debugger/setMemory
102
109
  * @param address `u32`
103
110
  * @param data `~lib/typedarray/Uint8Array`
111
+ * @returns `bool`
104
112
  */
105
- export function setMemory(address: number, data: Uint8Array): void;
113
+ export function setMemory(address: number, data: Uint8Array): boolean;
106
114
  /** assembly/api-utils/InputKind */
107
115
  export enum InputKind {
108
116
  /** @type `i32` */
@@ -109,10 +109,14 @@ export async function instantiate(module, imports = {}) {
109
109
  // assembly/api-debugger/getPageDump(u32) => ~lib/typedarray/Uint8Array
110
110
  return __liftTypedArray(Uint8Array, exports.getPageDump(index) >>> 0);
111
111
  },
112
+ getMemory(address, length) {
113
+ // assembly/api-debugger/getMemory(u32, u32) => ~lib/typedarray/Uint8Array | null
114
+ return __liftTypedArray(Uint8Array, exports.getMemory(address, length) >>> 0);
115
+ },
112
116
  setMemory(address, data) {
113
- // assembly/api-debugger/setMemory(u32, ~lib/typedarray/Uint8Array) => void
117
+ // assembly/api-debugger/setMemory(u32, ~lib/typedarray/Uint8Array) => bool
114
118
  data = __lowerTypedArray(Uint8Array, 10, 0, data) || __notnull();
115
- exports.setMemory(address, data);
119
+ return exports.setMemory(address, data) != 0;
116
120
  },
117
121
  InputKind: (values => (
118
122
  // assembly/api-utils/InputKind
Binary file
package/build/debug.d.ts CHANGED
@@ -96,12 +96,20 @@ export declare function setRegisters(flatRegisters: Array<number>): void;
96
96
  * @returns `~lib/typedarray/Uint8Array`
97
97
  */
98
98
  export declare function getPageDump(index: number): Uint8Array;
99
+ /**
100
+ * assembly/api-debugger/getMemory
101
+ * @param address `u32`
102
+ * @param length `u32`
103
+ * @returns `~lib/typedarray/Uint8Array | null`
104
+ */
105
+ export declare function getMemory(address: number, length: number): Uint8Array | null;
99
106
  /**
100
107
  * assembly/api-debugger/setMemory
101
108
  * @param address `u32`
102
109
  * @param data `~lib/typedarray/Uint8Array`
110
+ * @returns `bool`
103
111
  */
104
- export declare function setMemory(address: number, data: Uint8Array): void;
112
+ export declare function setMemory(address: number, data: Uint8Array): boolean;
105
113
  /** assembly/api-utils/InputKind */
106
114
  export declare enum InputKind {
107
115
  /** @type `i32` */
package/build/debug.js CHANGED
@@ -109,10 +109,14 @@ async function instantiate(module, imports = {}) {
109
109
  // assembly/api-debugger/getPageDump(u32) => ~lib/typedarray/Uint8Array
110
110
  return __liftTypedArray(Uint8Array, exports.getPageDump(index) >>> 0);
111
111
  },
112
+ getMemory(address, length) {
113
+ // assembly/api-debugger/getMemory(u32, u32) => ~lib/typedarray/Uint8Array | null
114
+ return __liftTypedArray(Uint8Array, exports.getMemory(address, length) >>> 0);
115
+ },
112
116
  setMemory(address, data) {
113
- // assembly/api-debugger/setMemory(u32, ~lib/typedarray/Uint8Array) => void
117
+ // assembly/api-debugger/setMemory(u32, ~lib/typedarray/Uint8Array) => bool
114
118
  data = __lowerTypedArray(Uint8Array, 10, 0, data) || __notnull();
115
- exports.setMemory(address, data);
119
+ return exports.setMemory(address, data) != 0;
116
120
  },
117
121
  InputKind: (values => (
118
122
  // assembly/api-utils/InputKind
@@ -388,6 +392,7 @@ export const {
388
392
  getRegisters,
389
393
  setRegisters,
390
394
  getPageDump,
395
+ getMemory,
391
396
  setMemory,
392
397
  InputKind,
393
398
  HasMetadata,
package/build/debug.wasm CHANGED
Binary file
@@ -102,12 +102,20 @@ export declare function setRegisters(flatRegisters: Array<number>): void;
102
102
  * @returns `~lib/typedarray/Uint8Array`
103
103
  */
104
104
  export declare function getPageDump(index: number): Uint8Array;
105
+ /**
106
+ * assembly/api-debugger/getMemory
107
+ * @param address `u32`
108
+ * @param length `u32`
109
+ * @returns `~lib/typedarray/Uint8Array | null`
110
+ */
111
+ export declare function getMemory(address: number, length: number): Uint8Array | null;
105
112
  /**
106
113
  * assembly/api-debugger/setMemory
107
114
  * @param address `u32`
108
115
  * @param data `~lib/typedarray/Uint8Array`
116
+ * @returns `bool`
109
117
  */
110
- export declare function setMemory(address: number, data: Uint8Array): void;
118
+ export declare function setMemory(address: number, data: Uint8Array): boolean;
111
119
  /** assembly/api-utils/InputKind */
112
120
  export declare enum InputKind {
113
121
  /** @type `i32` */
@@ -109,10 +109,14 @@ async function instantiate(module, imports = {}) {
109
109
  // assembly/api-debugger/getPageDump(u32) => ~lib/typedarray/Uint8Array
110
110
  return __liftTypedArray(Uint8Array, exports.getPageDump(index) >>> 0);
111
111
  },
112
+ getMemory(address, length) {
113
+ // assembly/api-debugger/getMemory(u32, u32) => ~lib/typedarray/Uint8Array | null
114
+ return __liftTypedArray(Uint8Array, exports.getMemory(address, length) >>> 0);
115
+ },
112
116
  setMemory(address, data) {
113
- // assembly/api-debugger/setMemory(u32, ~lib/typedarray/Uint8Array) => void
117
+ // assembly/api-debugger/setMemory(u32, ~lib/typedarray/Uint8Array) => bool
114
118
  data = __lowerTypedArray(Uint8Array, 10, 0, data) || __notnull();
115
- exports.setMemory(address, data);
119
+ return exports.setMemory(address, data) != 0;
116
120
  },
117
121
  InputKind: (values => (
118
122
  // assembly/api-utils/InputKind
@@ -393,6 +397,7 @@ export const {
393
397
  getRegisters,
394
398
  setRegisters,
395
399
  getPageDump,
400
+ getMemory,
396
401
  setMemory,
397
402
  InputKind,
398
403
  HasMetadata,
Binary file
@@ -0,0 +1,218 @@
1
+ /** Exported memory */
2
+ export declare const memory: WebAssembly.Memory;
3
+ // Exported runtime interface
4
+ export declare function __new(size: number, id: number): number;
5
+ export declare function __pin(ptr: number): number;
6
+ export declare function __unpin(ptr: number): void;
7
+ export declare function __collect(): void;
8
+ export declare const __rtti_base: number;
9
+ /**
10
+ * assembly/api-internal/getAssembly
11
+ * @param p `assembly/program/Program`
12
+ * @returns `~lib/string/String`
13
+ */
14
+ export declare function getAssembly(p: __Internref26): string;
15
+ /**
16
+ * assembly/program-build/wrapAsProgram
17
+ * @param bytecode `~lib/typedarray/Uint8Array`
18
+ * @returns `~lib/typedarray/Uint8Array`
19
+ */
20
+ export declare function wrapAsProgram(bytecode: Uint8Array): Uint8Array;
21
+ /**
22
+ * assembly/api-debugger/resetJAM
23
+ * @param program `~lib/array/Array<u8>`
24
+ * @param pc `f64`
25
+ * @param initialGas `i64`
26
+ * @param args `~lib/array/Array<u8>`
27
+ * @param hasMetadata `bool`
28
+ */
29
+ export declare function resetJAM(program: Array<number>, pc: number, initialGas: bigint, args: Array<number>, hasMetadata?: boolean): void;
30
+ /**
31
+ * assembly/api-debugger/resetGeneric
32
+ * @param program `~lib/array/Array<u8>`
33
+ * @param flatRegisters `~lib/array/Array<u8>`
34
+ * @param initialGas `i64`
35
+ * @param hasMetadata `bool`
36
+ */
37
+ export declare function resetGeneric(program: Array<number>, flatRegisters: Array<number>, initialGas: bigint, hasMetadata?: boolean): void;
38
+ /**
39
+ * assembly/api-debugger/resetGenericWithMemory
40
+ * @param program `~lib/array/Array<u8>`
41
+ * @param flatRegisters `~lib/array/Array<u8>`
42
+ * @param pageMap `~lib/typedarray/Uint8Array`
43
+ * @param chunks `~lib/typedarray/Uint8Array`
44
+ * @param initialGas `i64`
45
+ * @param hasMetadata `bool`
46
+ */
47
+ export declare function resetGenericWithMemory(program: Array<number>, flatRegisters: Array<number>, pageMap: Uint8Array, chunks: Uint8Array, initialGas: bigint, hasMetadata?: boolean): void;
48
+ /**
49
+ * assembly/api-debugger/nextStep
50
+ * @returns `bool`
51
+ */
52
+ export declare function nextStep(): boolean;
53
+ /**
54
+ * assembly/api-debugger/nSteps
55
+ * @param steps `u32`
56
+ * @returns `bool`
57
+ */
58
+ export declare function nSteps(steps: number): boolean;
59
+ /**
60
+ * assembly/api-debugger/getProgramCounter
61
+ * @returns `u32`
62
+ */
63
+ export declare function getProgramCounter(): number;
64
+ /**
65
+ * assembly/api-debugger/setNextProgramCounter
66
+ * @param pc `u32`
67
+ */
68
+ export declare function setNextProgramCounter(pc: number): void;
69
+ /**
70
+ * assembly/api-debugger/getStatus
71
+ * @returns `u8`
72
+ */
73
+ export declare function getStatus(): number;
74
+ /**
75
+ * assembly/api-debugger/getExitArg
76
+ * @returns `u32`
77
+ */
78
+ export declare function getExitArg(): number;
79
+ /**
80
+ * assembly/api-debugger/getGasLeft
81
+ * @returns `i64`
82
+ */
83
+ export declare function getGasLeft(): bigint;
84
+ /**
85
+ * assembly/api-debugger/setGasLeft
86
+ * @param gas `i64`
87
+ */
88
+ export declare function setGasLeft(gas: bigint): void;
89
+ /**
90
+ * assembly/api-debugger/getRegisters
91
+ * @returns `~lib/typedarray/Uint8Array`
92
+ */
93
+ export declare function getRegisters(): Uint8Array;
94
+ /**
95
+ * assembly/api-debugger/setRegisters
96
+ * @param flatRegisters `~lib/array/Array<u8>`
97
+ */
98
+ export declare function setRegisters(flatRegisters: Array<number>): void;
99
+ /**
100
+ * assembly/api-debugger/getPageDump
101
+ * @param index `u32`
102
+ * @returns `~lib/typedarray/Uint8Array`
103
+ */
104
+ export declare function getPageDump(index: number): Uint8Array;
105
+ /**
106
+ * assembly/api-debugger/getMemory
107
+ * @param address `u32`
108
+ * @param length `u32`
109
+ * @returns `~lib/typedarray/Uint8Array | null`
110
+ */
111
+ export declare function getMemory(address: number, length: number): Uint8Array | null;
112
+ /**
113
+ * assembly/api-debugger/setMemory
114
+ * @param address `u32`
115
+ * @param data `~lib/typedarray/Uint8Array`
116
+ * @returns `bool`
117
+ */
118
+ export declare function setMemory(address: number, data: Uint8Array): boolean;
119
+ /** assembly/api-utils/InputKind */
120
+ export declare enum InputKind {
121
+ /** @type `i32` */
122
+ Generic,
123
+ /** @type `i32` */
124
+ SPI,
125
+ }
126
+ /** assembly/api-utils/HasMetadata */
127
+ export declare enum HasMetadata {
128
+ /** @type `i32` */
129
+ Yes,
130
+ /** @type `i32` */
131
+ No,
132
+ }
133
+ /**
134
+ * assembly/api-utils/getGasCosts
135
+ * @param input `~lib/array/Array<u8>`
136
+ * @param kind `i32`
137
+ * @param withMetadata `i32`
138
+ * @returns `~lib/array/Array<assembly/gas-costs/BlockGasCost>`
139
+ */
140
+ export declare function getGasCosts(input: Array<number>, kind: number, withMetadata: number): Array<__Record50<never>>;
141
+ /**
142
+ * assembly/api-utils/disassemble
143
+ * @param input `~lib/array/Array<u8>`
144
+ * @param kind `i32`
145
+ * @param withMetadata `i32`
146
+ * @returns `~lib/string/String`
147
+ */
148
+ export declare function disassemble(input: Array<number>, kind: number, withMetadata: number): string;
149
+ /**
150
+ * assembly/api-utils/prepareProgram
151
+ * @param kind `i32`
152
+ * @param hasMetadata `i32`
153
+ * @param program `~lib/array/Array<u8>`
154
+ * @param initialRegisters `~lib/array/Array<u64>`
155
+ * @param initialPageMap `~lib/array/Array<assembly/api-internal/InitialPage>`
156
+ * @param initialMemory `~lib/array/Array<assembly/api-internal/InitialChunk>`
157
+ * @param args `~lib/array/Array<u8>`
158
+ * @returns `assembly/spi/StandardProgram`
159
+ */
160
+ export declare function prepareProgram(kind: number, hasMetadata: number, program: Array<number>, initialRegisters: Array<bigint>, initialPageMap: Array<__Record46<undefined>>, initialMemory: Array<__Record48<undefined>>, args: Array<number>): __Internref42;
161
+ /**
162
+ * assembly/api-utils/runProgram
163
+ * @param program `assembly/spi/StandardProgram`
164
+ * @param initialGas `i64`
165
+ * @param programCounter `u32`
166
+ * @param logs `bool`
167
+ * @param useSbrkGas `bool`
168
+ * @returns `assembly/api-internal/VmOutput`
169
+ */
170
+ export declare function runProgram(program: __Internref42, initialGas?: bigint, programCounter?: number, logs?: boolean, useSbrkGas?: boolean): __Record55<never>;
171
+ /** assembly/program/Program */
172
+ declare class __Internref26 extends Number {
173
+ private __nominal26: symbol;
174
+ private __nominal0: symbol;
175
+ }
176
+ /** assembly/gas-costs/BlockGasCost */
177
+ declare interface __Record50<TOmittable> {
178
+ /** @type `u32` */
179
+ pc: number | TOmittable;
180
+ /** @type `u64` */
181
+ gas: bigint | TOmittable;
182
+ }
183
+ /** assembly/api-internal/InitialPage */
184
+ declare interface __Record46<TOmittable> {
185
+ /** @type `u32` */
186
+ address: number | TOmittable;
187
+ /** @type `u32` */
188
+ length: number | TOmittable;
189
+ /** @type `i32` */
190
+ access: number | TOmittable;
191
+ }
192
+ /** assembly/api-internal/InitialChunk */
193
+ declare interface __Record48<TOmittable> {
194
+ /** @type `u32` */
195
+ address: number | TOmittable;
196
+ /** @type `~lib/array/Array<u8>` */
197
+ data: Array<number>;
198
+ }
199
+ /** assembly/spi/StandardProgram */
200
+ declare class __Internref42 extends Number {
201
+ private __nominal42: symbol;
202
+ private __nominal0: symbol;
203
+ }
204
+ /** assembly/api-internal/VmOutput */
205
+ declare interface __Record55<TOmittable> {
206
+ /** @type `i32` */
207
+ status: number | TOmittable;
208
+ /** @type `~lib/array/Array<u64>` */
209
+ registers: Array<bigint>;
210
+ /** @type `u32` */
211
+ pc: number | TOmittable;
212
+ /** @type `~lib/array/Array<assembly/api-internal/InitialChunk>` */
213
+ memory: Array<__Record48<never>>;
214
+ /** @type `i64` */
215
+ gas: bigint | TOmittable;
216
+ /** @type `u32` */
217
+ exitCode: number | TOmittable;
218
+ }
@@ -0,0 +1,415 @@
1
+ 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
+ getMemory(address, length) {
113
+ // assembly/api-debugger/getMemory(u32, u32) => ~lib/typedarray/Uint8Array | null
114
+ return __liftTypedArray(Uint8Array, exports.getMemory(address, length) >>> 0);
115
+ },
116
+ setMemory(address, data) {
117
+ // assembly/api-debugger/setMemory(u32, ~lib/typedarray/Uint8Array) => bool
118
+ data = __lowerTypedArray(Uint8Array, 10, 0, data) || __notnull();
119
+ return exports.setMemory(address, data) != 0;
120
+ },
121
+ InputKind: (values => (
122
+ // assembly/api-utils/InputKind
123
+ values[values.Generic = exports["InputKind.Generic"].valueOf()] = "Generic",
124
+ values[values.SPI = exports["InputKind.SPI"].valueOf()] = "SPI",
125
+ values
126
+ ))({}),
127
+ HasMetadata: (values => (
128
+ // assembly/api-utils/HasMetadata
129
+ values[values.Yes = exports["HasMetadata.Yes"].valueOf()] = "Yes",
130
+ values[values.No = exports["HasMetadata.No"].valueOf()] = "No",
131
+ values
132
+ ))({}),
133
+ getGasCosts(input, kind, withMetadata) {
134
+ // assembly/api-utils/getGasCosts(~lib/array/Array<u8>, i32, i32) => ~lib/array/Array<assembly/gas-costs/BlockGasCost>
135
+ input = __lowerArray(__setU8, 6, 0, input) || __notnull();
136
+ return __liftArray(pointer => __liftRecord50(__getU32(pointer)), 2, exports.getGasCosts(input, kind, withMetadata) >>> 0);
137
+ },
138
+ disassemble(input, kind, withMetadata) {
139
+ // assembly/api-utils/disassemble(~lib/array/Array<u8>, i32, i32) => ~lib/string/String
140
+ input = __lowerArray(__setU8, 6, 0, input) || __notnull();
141
+ return __liftString(exports.disassemble(input, kind, withMetadata) >>> 0);
142
+ },
143
+ prepareProgram(kind, hasMetadata, program, initialRegisters, initialPageMap, initialMemory, args) {
144
+ // 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
145
+ program = __retain(__lowerArray(__setU8, 6, 0, program) || __notnull());
146
+ initialRegisters = __retain(__lowerArray(__setU64, 52, 3, initialRegisters) || __notnull());
147
+ initialPageMap = __retain(__lowerArray((pointer, value) => { __setU32(pointer, __lowerRecord46(value) || __notnull()); }, 47, 2, initialPageMap) || __notnull());
148
+ initialMemory = __retain(__lowerArray((pointer, value) => { __setU32(pointer, __lowerRecord48(value) || __notnull()); }, 49, 2, initialMemory) || __notnull());
149
+ args = __lowerArray(__setU8, 6, 0, args) || __notnull();
150
+ try {
151
+ return __liftInternref(exports.prepareProgram(kind, hasMetadata, program, initialRegisters, initialPageMap, initialMemory, args) >>> 0);
152
+ } finally {
153
+ __release(program);
154
+ __release(initialRegisters);
155
+ __release(initialPageMap);
156
+ __release(initialMemory);
157
+ }
158
+ },
159
+ runProgram(program, initialGas, programCounter, logs, useSbrkGas) {
160
+ // assembly/api-utils/runProgram(assembly/spi/StandardProgram, i64?, u32?, bool?, bool?) => assembly/api-internal/VmOutput
161
+ program = __lowerInternref(program) || __notnull();
162
+ initialGas = initialGas || 0n;
163
+ logs = logs ? 1 : 0;
164
+ useSbrkGas = useSbrkGas ? 1 : 0;
165
+ exports.__setArgumentsLength(arguments.length);
166
+ return __liftRecord55(exports.runProgram(program, initialGas, programCounter, logs, useSbrkGas) >>> 0);
167
+ },
168
+ }, exports);
169
+ function __liftRecord50(pointer) {
170
+ // assembly/gas-costs/BlockGasCost
171
+ // Hint: Opt-out from lifting as a record by providing an empty constructor
172
+ if (!pointer) return null;
173
+ return {
174
+ pc: __getU32(pointer + 0),
175
+ gas: __getU64(pointer + 8),
176
+ };
177
+ }
178
+ function __lowerRecord46(value) {
179
+ // assembly/api-internal/InitialPage
180
+ // Hint: Opt-out from lowering as a record by providing an empty constructor
181
+ if (value == null) return 0;
182
+ const pointer = exports.__pin(exports.__new(12, 46));
183
+ __setU32(pointer + 0, value.address);
184
+ __setU32(pointer + 4, value.length);
185
+ __setU32(pointer + 8, value.access);
186
+ exports.__unpin(pointer);
187
+ return pointer;
188
+ }
189
+ function __lowerRecord48(value) {
190
+ // assembly/api-internal/InitialChunk
191
+ // Hint: Opt-out from lowering as a record by providing an empty constructor
192
+ if (value == null) return 0;
193
+ const pointer = exports.__pin(exports.__new(8, 48));
194
+ __setU32(pointer + 0, value.address);
195
+ __setU32(pointer + 4, __lowerArray(__setU8, 6, 0, value.data) || __notnull());
196
+ exports.__unpin(pointer);
197
+ return pointer;
198
+ }
199
+ function __liftRecord48(pointer) {
200
+ // assembly/api-internal/InitialChunk
201
+ // Hint: Opt-out from lifting as a record by providing an empty constructor
202
+ if (!pointer) return null;
203
+ return {
204
+ address: __getU32(pointer + 0),
205
+ data: __liftArray(__getU8, 0, __getU32(pointer + 4)),
206
+ };
207
+ }
208
+ function __liftRecord55(pointer) {
209
+ // assembly/api-internal/VmOutput
210
+ // Hint: Opt-out from lifting as a record by providing an empty constructor
211
+ if (!pointer) return null;
212
+ return {
213
+ status: __getI32(pointer + 0),
214
+ registers: __liftArray(pointer => BigInt.asUintN(64, __getU64(pointer)), 3, __getU32(pointer + 4)),
215
+ pc: __getU32(pointer + 8),
216
+ memory: __liftArray(pointer => __liftRecord48(__getU32(pointer)), 2, __getU32(pointer + 12)),
217
+ gas: __getI64(pointer + 16),
218
+ exitCode: __getU32(pointer + 24),
219
+ };
220
+ }
221
+ function __liftString(pointer) {
222
+ if (!pointer) return null;
223
+ const
224
+ end = pointer + new Uint32Array(memory.buffer)[pointer - 4 >>> 2] >>> 1,
225
+ memoryU16 = new Uint16Array(memory.buffer);
226
+ let
227
+ start = pointer >>> 1,
228
+ string = "";
229
+ while (end - start > 1024) string += String.fromCharCode(...memoryU16.subarray(start, start += 1024));
230
+ return string + String.fromCharCode(...memoryU16.subarray(start, end));
231
+ }
232
+ function __liftArray(liftElement, align, pointer) {
233
+ if (!pointer) return null;
234
+ const
235
+ dataStart = __getU32(pointer + 4),
236
+ length = __dataview.getUint32(pointer + 12, true),
237
+ values = new Array(length);
238
+ for (let i = 0; i < length; ++i) values[i] = liftElement(dataStart + (i << align >>> 0));
239
+ return values;
240
+ }
241
+ function __lowerArray(lowerElement, id, align, values) {
242
+ if (values == null) return 0;
243
+ const
244
+ length = values.length,
245
+ buffer = exports.__pin(exports.__new(length << align, 1)) >>> 0,
246
+ header = exports.__pin(exports.__new(16, id)) >>> 0;
247
+ __setU32(header + 0, buffer);
248
+ __dataview.setUint32(header + 4, buffer, true);
249
+ __dataview.setUint32(header + 8, length << align, true);
250
+ __dataview.setUint32(header + 12, length, true);
251
+ for (let i = 0; i < length; ++i) lowerElement(buffer + (i << align >>> 0), values[i]);
252
+ exports.__unpin(buffer);
253
+ exports.__unpin(header);
254
+ return header;
255
+ }
256
+ function __liftTypedArray(constructor, pointer) {
257
+ if (!pointer) return null;
258
+ return new constructor(
259
+ memory.buffer,
260
+ __getU32(pointer + 4),
261
+ __dataview.getUint32(pointer + 8, true) / constructor.BYTES_PER_ELEMENT
262
+ ).slice();
263
+ }
264
+ function __lowerTypedArray(constructor, id, align, values) {
265
+ if (values == null) return 0;
266
+ const
267
+ length = values.length,
268
+ buffer = exports.__pin(exports.__new(length << align, 1)) >>> 0,
269
+ header = exports.__new(12, id) >>> 0;
270
+ __setU32(header + 0, buffer);
271
+ __dataview.setUint32(header + 4, buffer, true);
272
+ __dataview.setUint32(header + 8, length << align, true);
273
+ new constructor(memory.buffer, buffer, length).set(values);
274
+ exports.__unpin(buffer);
275
+ return header;
276
+ }
277
+ class Internref extends Number {}
278
+ const registry = new FinalizationRegistry(__release);
279
+ function __liftInternref(pointer) {
280
+ if (!pointer) return null;
281
+ const sentinel = new Internref(__retain(pointer));
282
+ registry.register(sentinel, pointer);
283
+ return sentinel;
284
+ }
285
+ function __lowerInternref(value) {
286
+ if (value == null) return 0;
287
+ if (value instanceof Internref) return value.valueOf();
288
+ throw TypeError("internref expected");
289
+ }
290
+ const refcounts = new Map();
291
+ function __retain(pointer) {
292
+ if (pointer) {
293
+ const refcount = refcounts.get(pointer);
294
+ if (refcount) refcounts.set(pointer, refcount + 1);
295
+ else refcounts.set(exports.__pin(pointer), 1);
296
+ }
297
+ return pointer;
298
+ }
299
+ function __release(pointer) {
300
+ if (pointer) {
301
+ const refcount = refcounts.get(pointer);
302
+ if (refcount === 1) exports.__unpin(pointer), refcounts.delete(pointer);
303
+ else if (refcount) refcounts.set(pointer, refcount - 1);
304
+ else throw Error(`invalid refcount '${refcount}' for reference '${pointer}'`);
305
+ }
306
+ }
307
+ function __notnull() {
308
+ throw TypeError("value must not be null");
309
+ }
310
+ let __dataview = new DataView(memory.buffer);
311
+ function __setU8(pointer, value) {
312
+ try {
313
+ __dataview.setUint8(pointer, value, true);
314
+ } catch {
315
+ __dataview = new DataView(memory.buffer);
316
+ __dataview.setUint8(pointer, value, true);
317
+ }
318
+ }
319
+ function __setU32(pointer, value) {
320
+ try {
321
+ __dataview.setUint32(pointer, value, true);
322
+ } catch {
323
+ __dataview = new DataView(memory.buffer);
324
+ __dataview.setUint32(pointer, value, true);
325
+ }
326
+ }
327
+ function __setU64(pointer, value) {
328
+ try {
329
+ __dataview.setBigUint64(pointer, value, true);
330
+ } catch {
331
+ __dataview = new DataView(memory.buffer);
332
+ __dataview.setBigUint64(pointer, value, true);
333
+ }
334
+ }
335
+ function __getU8(pointer) {
336
+ try {
337
+ return __dataview.getUint8(pointer, true);
338
+ } catch {
339
+ __dataview = new DataView(memory.buffer);
340
+ return __dataview.getUint8(pointer, true);
341
+ }
342
+ }
343
+ function __getI32(pointer) {
344
+ try {
345
+ return __dataview.getInt32(pointer, true);
346
+ } catch {
347
+ __dataview = new DataView(memory.buffer);
348
+ return __dataview.getInt32(pointer, true);
349
+ }
350
+ }
351
+ function __getU32(pointer) {
352
+ try {
353
+ return __dataview.getUint32(pointer, true);
354
+ } catch {
355
+ __dataview = new DataView(memory.buffer);
356
+ return __dataview.getUint32(pointer, true);
357
+ }
358
+ }
359
+ function __getI64(pointer) {
360
+ try {
361
+ return __dataview.getBigInt64(pointer, true);
362
+ } catch {
363
+ __dataview = new DataView(memory.buffer);
364
+ return __dataview.getBigInt64(pointer, true);
365
+ }
366
+ }
367
+ function __getU64(pointer) {
368
+ try {
369
+ return __dataview.getBigUint64(pointer, true);
370
+ } catch {
371
+ __dataview = new DataView(memory.buffer);
372
+ return __dataview.getBigUint64(pointer, true);
373
+ }
374
+ }
375
+ return adaptedExports;
376
+ }
377
+ export const {
378
+ memory,
379
+ __new,
380
+ __pin,
381
+ __unpin,
382
+ __collect,
383
+ __rtti_base,
384
+ getAssembly,
385
+ wrapAsProgram,
386
+ resetJAM,
387
+ resetGeneric,
388
+ resetGenericWithMemory,
389
+ nextStep,
390
+ nSteps,
391
+ getProgramCounter,
392
+ setNextProgramCounter,
393
+ getStatus,
394
+ getExitArg,
395
+ getGasLeft,
396
+ setGasLeft,
397
+ getRegisters,
398
+ setRegisters,
399
+ getPageDump,
400
+ getMemory,
401
+ setMemory,
402
+ InputKind,
403
+ HasMetadata,
404
+ getGasCosts,
405
+ disassemble,
406
+ prepareProgram,
407
+ runProgram,
408
+ } = await (async url => instantiate(
409
+ await (async () => {
410
+ const isNodeOrBun = typeof process != "undefined" && process.versions != null && (process.versions.node != null || process.versions.bun != null);
411
+ if (isNodeOrBun) { return globalThis.WebAssembly.compile(await (await import("node:fs/promises")).readFile(url)); }
412
+ else { return await globalThis.WebAssembly.compileStreaming(globalThis.fetch(url)); }
413
+ })(), {
414
+ }
415
+ ))(new URL("release-stub.wasm", import.meta.url));
Binary file
@@ -96,12 +96,20 @@ export declare function setRegisters(flatRegisters: Array<number>): void;
96
96
  * @returns `~lib/typedarray/Uint8Array`
97
97
  */
98
98
  export declare function getPageDump(index: number): Uint8Array;
99
+ /**
100
+ * assembly/api-debugger/getMemory
101
+ * @param address `u32`
102
+ * @param length `u32`
103
+ * @returns `~lib/typedarray/Uint8Array | null`
104
+ */
105
+ export declare function getMemory(address: number, length: number): Uint8Array | null;
99
106
  /**
100
107
  * assembly/api-debugger/setMemory
101
108
  * @param address `u32`
102
109
  * @param data `~lib/typedarray/Uint8Array`
110
+ * @returns `bool`
103
111
  */
104
- export declare function setMemory(address: number, data: Uint8Array): void;
112
+ export declare function setMemory(address: number, data: Uint8Array): boolean;
105
113
  /** assembly/api-utils/InputKind */
106
114
  export declare enum InputKind {
107
115
  /** @type `i32` */
package/build/release.js CHANGED
@@ -109,10 +109,14 @@ async function instantiate(module, imports = {}) {
109
109
  // assembly/api-debugger/getPageDump(u32) => ~lib/typedarray/Uint8Array
110
110
  return __liftTypedArray(Uint8Array, exports.getPageDump(index) >>> 0);
111
111
  },
112
+ getMemory(address, length) {
113
+ // assembly/api-debugger/getMemory(u32, u32) => ~lib/typedarray/Uint8Array | null
114
+ return __liftTypedArray(Uint8Array, exports.getMemory(address, length) >>> 0);
115
+ },
112
116
  setMemory(address, data) {
113
- // assembly/api-debugger/setMemory(u32, ~lib/typedarray/Uint8Array) => void
117
+ // assembly/api-debugger/setMemory(u32, ~lib/typedarray/Uint8Array) => bool
114
118
  data = __lowerTypedArray(Uint8Array, 10, 0, data) || __notnull();
115
- exports.setMemory(address, data);
119
+ return exports.setMemory(address, data) != 0;
116
120
  },
117
121
  InputKind: (values => (
118
122
  // assembly/api-utils/InputKind
@@ -388,6 +392,7 @@ export const {
388
392
  getRegisters,
389
393
  setRegisters,
390
394
  getPageDump,
395
+ getMemory,
391
396
  setMemory,
392
397
  InputKind,
393
398
  HasMetadata,
Binary file
package/package.json CHANGED
@@ -1,22 +1,24 @@
1
1
  {
2
2
  "name": "@fluffylabs/anan-as",
3
3
  "description": "AssemblyScript PVM interpreter.",
4
- "version": "1.0.0-791e5e1",
5
- "main": "./bin/index.js",
4
+ "version": "1.0.0-7ec9bd7",
5
+ "main": "./bin/index.ts",
6
6
  "repository": {
7
7
  "url": "https://github.com/tomusdrw/anan-as"
8
8
  },
9
9
  "scripts": {
10
- "asbuild": "npm run asbuild:debug && npm run asbuild:release && npm run asbuild:raw && npm run asbuild:release-mini",
10
+ "asbuild": "npm run asbuild:debug && npm run asbuild:release",
11
+ "asbuild:all": "npm run asbuild:debug && npm run asbuild:release && npm run asbuild:raw && npm run asbuild:release-mini && npm run asbuild:release-stub",
11
12
  "asbuild:debug": "asc assembly/index.ts --target debug",
12
13
  "asbuild:release": "asc assembly/index.ts --uncheckedBehavior=always --target release",
13
14
  "asbuild:release-mini": "asc assembly/index.ts --uncheckedBehavior=always --target release-mini",
15
+ "asbuild:release-stub": "asc assembly/index.ts --uncheckedBehavior=always --target release-stub",
14
16
  "asbuild:raw": "asc assembly/index.ts --target raw",
15
17
  "asbuild:test": "asc assembly/test-run.ts --target test",
16
- "build": "npm run asbuild && npm run cp-build",
18
+ "build": "npm run asbuild:all && npm run asbuild:test && npm run tsbuild && npm run cp-build",
17
19
  "cp-build": "rm -rf ./web/build; cp -r ./build ./web/",
18
20
  "format": "biome format --write",
19
- "fuzz": "npx @jazzer.js/core --sync ./bin/fuzz",
21
+ "fuzz": "tsx ./bin/fuzz.ts",
20
22
  "lint": "biome lint --write; biome check --write",
21
23
  "prestart": "npm run build",
22
24
  "pretest:w3f": "npm run build",
@@ -24,11 +26,12 @@
24
26
  "preweb": "npm run build",
25
27
  "qa": "biome ci",
26
28
  "qa-fix": "npm run format; npm run lint",
27
- "start": "node ./bin/index.js",
28
- "test": "npm run asbuild:test && node ./bin/test.js",
29
- "test:w3f": "node ./bin/test-w3f.js",
30
- "test:gas-cost": "node ./bin/test-gas-cost.js",
31
- "update-version": "node ./web/bump-version.js $GITHUB_SHA",
29
+ "start": "tsx ./bin/index.ts",
30
+ "test": "npm run asbuild:test && tsx ./bin/test.ts",
31
+ "tsbuild": "tsc",
32
+ "test:w3f": "tsx ./bin/test-w3f.ts",
33
+ "test:gas-cost": "tsx ./bin/test-gas-cost.ts",
34
+ "update-version": "tsx ./web/bump-version.ts $GITHUB_SHA",
32
35
  "web": "npx live-server ./web"
33
36
  },
34
37
  "type": "module",
@@ -37,7 +40,10 @@
37
40
  "license": "MPL-2.0",
38
41
  "devDependencies": {
39
42
  "@biomejs/biome": "^2.2.6",
40
- "assemblyscript": "^0.28.8"
43
+ "@types/node": "^24.8.1",
44
+ "assemblyscript": "^0.28.8",
45
+ "tsx": "^4.20.6",
46
+ "typescript": "^5.9.3"
41
47
  },
42
48
  "files": [
43
49
  "build/**/*.wasm",
@@ -63,6 +69,10 @@
63
69
  "import": "./build/release-mini.js",
64
70
  "types": "./build/release-mini.d.ts"
65
71
  },
72
+ "./release-stub": {
73
+ "import": "./build/release-stub.js",
74
+ "types": "./build/release-stub.d.ts"
75
+ },
66
76
  "./raw": {
67
77
  "import": "./build/debug-raw.js",
68
78
  "types": "./build/debug-raw.d.ts"