porffor 0.17.0-a1f691e30 → 0.17.0-b103c8894
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/compiler/builtins/array.ts +22 -0
- package/compiler/builtins/math.ts +6 -2
- package/compiler/builtins/set.ts +2 -9
- package/compiler/builtins/typedarray.js +42 -0
- package/compiler/builtins.js +14 -0
- package/compiler/codegen.js +255 -10
- package/compiler/generated_builtins.js +304 -122
- package/compiler/types.js +31 -5
- package/compiler/wasmSpec.js +2 -0
- package/compiler/wrap.js +14 -1
- package/package.json +1 -1
- package/runner/repl.js +11 -6
package/compiler/types.js
CHANGED
@@ -20,10 +20,26 @@ export const TYPE_NAMES = {
|
|
20
20
|
[TYPES.bigint]: 'BigInt'
|
21
21
|
};
|
22
22
|
|
23
|
+
// flags
|
24
|
+
export const TYPE_FLAGS = {
|
25
|
+
// iterable: 0b10000000,
|
26
|
+
length: 0b01000000,
|
27
|
+
};
|
28
|
+
|
29
|
+
// TYPES.string |= TYPE_FLAGS.iterable;
|
30
|
+
TYPES.string |= TYPE_FLAGS.length;
|
31
|
+
|
32
|
+
export const typeHasFlag = (type, flag) => (type & flag) !== 0;
|
33
|
+
|
23
34
|
export const INTERNAL_TYPE_BASE = 0x10;
|
24
35
|
let internalTypeIndex = INTERNAL_TYPE_BASE;
|
25
|
-
const registerInternalType = name => {
|
26
|
-
|
36
|
+
const registerInternalType = (name, flags = []) => {
|
37
|
+
let n = internalTypeIndex++;
|
38
|
+
|
39
|
+
for (const x of flags) {
|
40
|
+
if (TYPE_FLAGS[x]) n |= TYPE_FLAGS[x];
|
41
|
+
}
|
42
|
+
|
27
43
|
TYPES[name.toLowerCase()] = n;
|
28
44
|
TYPE_NAMES[n] = name;
|
29
45
|
};
|
@@ -31,8 +47,18 @@ const registerInternalType = name => {
|
|
31
47
|
// note: when adding a new internal type, please also add a deserializer to wrap.js
|
32
48
|
// (it is okay to add a throw todo deserializer for wips)
|
33
49
|
|
34
|
-
registerInternalType('Array');
|
50
|
+
registerInternalType('Array', ['iterable', 'length']);
|
35
51
|
registerInternalType('RegExp');
|
36
|
-
registerInternalType('ByteString');
|
52
|
+
registerInternalType('ByteString', ['iterable', 'length']);
|
37
53
|
registerInternalType('Date');
|
38
|
-
registerInternalType('Set');
|
54
|
+
registerInternalType('Set', ['iterable']);
|
55
|
+
|
56
|
+
registerInternalType('Uint8Array', ['iterable', 'length']);
|
57
|
+
registerInternalType('Int8Array', ['iterable', 'length']);
|
58
|
+
registerInternalType('Uint8ClampedArray', ['iterable', 'length']);
|
59
|
+
registerInternalType('Uint16Array', ['iterable', 'length']);
|
60
|
+
registerInternalType('Int16Array', ['iterable', 'length']);
|
61
|
+
registerInternalType('Uint32Array', ['iterable', 'length']);
|
62
|
+
registerInternalType('Int32Array', ['iterable', 'length']);
|
63
|
+
registerInternalType('Float32Array', ['iterable', 'length']);
|
64
|
+
registerInternalType('Float64Array', ['iterable', 'length']);
|
package/compiler/wasmSpec.js
CHANGED
@@ -68,6 +68,7 @@ export const Opcodes = {
|
|
68
68
|
|
69
69
|
i32_load: 0x28,
|
70
70
|
i64_load: 0x29,
|
71
|
+
f32_load: 0x2a,
|
71
72
|
f64_load: 0x2b,
|
72
73
|
|
73
74
|
i32_load8_s: 0x2c,
|
@@ -82,6 +83,7 @@ export const Opcodes = {
|
|
82
83
|
|
83
84
|
i32_store: 0x36,
|
84
85
|
i64_store: 0x37,
|
86
|
+
f32_store: 0x38,
|
85
87
|
f64_store: 0x39,
|
86
88
|
|
87
89
|
i32_store8: 0x3a,
|
package/compiler/wrap.js
CHANGED
@@ -2,7 +2,7 @@ import { encodeVector, encodeLocal } from './encoding.js';
|
|
2
2
|
import { importedFuncs } from './builtins.js';
|
3
3
|
import compile from './index.js';
|
4
4
|
import decompile from './decompile.js';
|
5
|
-
import { TYPES } from './types.js';
|
5
|
+
import { TYPES, TYPE_NAMES } from './types.js';
|
6
6
|
import { log } from './log.js';
|
7
7
|
import Prefs from './prefs.js';
|
8
8
|
|
@@ -115,6 +115,19 @@ const porfToJSValue = ({ memory, funcs, pages }, value, type) => {
|
|
115
115
|
return Symbol(desc);
|
116
116
|
}
|
117
117
|
|
118
|
+
case TYPES.uint8array:
|
119
|
+
case TYPES.int8array:
|
120
|
+
case TYPES.uint8clampedarray:
|
121
|
+
case TYPES.uint16array:
|
122
|
+
case TYPES.int16array:
|
123
|
+
case TYPES.uint32array:
|
124
|
+
case TYPES.int32array:
|
125
|
+
case TYPES.float32array:
|
126
|
+
case TYPES.float64array: {
|
127
|
+
const length = (new Int32Array(memory.buffer, value, 1))[0];
|
128
|
+
return new globalThis[TYPE_NAMES[type]](memory.buffer, value + 4, length);
|
129
|
+
}
|
130
|
+
|
118
131
|
default: return value;
|
119
132
|
}
|
120
133
|
};
|
package/package.json
CHANGED
package/runner/repl.js
CHANGED
@@ -40,10 +40,9 @@ let lastMemory, lastPages;
|
|
40
40
|
const PageSize = 65536;
|
41
41
|
const memoryToString = mem => {
|
42
42
|
let out = '';
|
43
|
-
const pages = lastPages.length;
|
44
43
|
const wasmPages = mem.buffer.byteLength / PageSize;
|
45
44
|
|
46
|
-
out += `\x1B[1mallocated ${mem.buffer.byteLength / 1024}
|
45
|
+
out += `\x1B[1mallocated ${mem.buffer.byteLength / 1024}KiB\x1B[0m (using ${wasmPages} Wasm page${wasmPages === 1 ? '' : 's'})\n\n`;
|
47
46
|
|
48
47
|
const buf = new Uint8Array(mem.buffer);
|
49
48
|
|
@@ -55,10 +54,16 @@ const memoryToString = mem => {
|
|
55
54
|
}
|
56
55
|
|
57
56
|
out += `\x1B[0m\x1B[1m name${' '.repeat(longestName - 4)} \x1B[0m\x1B[90m│\x1B[0m\x1B[1m type${' '.repeat(longestType - 4)} \x1B[0m\x1B[90m│\x1B[0m\x1B[1m memory\x1B[0m\n`; // ─
|
58
|
-
for (let i = 0; i <
|
59
|
-
|
60
|
-
|
61
|
-
|
57
|
+
for (let i = 0; i < wasmPages; i++) {
|
58
|
+
if (lastPages[i]) {
|
59
|
+
const [ type, name ] = lastPages[i].split(': ');
|
60
|
+
// out += `\x1B[36m${lastPages[i].replace(':', '\x1B[90m:\x1B[34m')}\x1B[90m${' '.repeat(longestName - lastPages[i].length)} | \x1B[0m`;
|
61
|
+
out += ` \x1B[34m${name}${' '.repeat(longestName - name.length)} \x1B[90m│\x1B[0m \x1B[36m${type}${' '.repeat(longestType - type.length)} \x1B[90m│\x1B[0m `;
|
62
|
+
} else {
|
63
|
+
const type = '???';
|
64
|
+
const name = '???';
|
65
|
+
out += ` \x1B[34m${name}${' '.repeat(longestName - name.length)} \x1B[90m│\x1B[0m \x1B[36m${type}${' '.repeat(longestType - type.length)} \x1B[90m│\x1B[0m `;
|
66
|
+
}
|
62
67
|
|
63
68
|
for (let j = 0; j < 40; j++) {
|
64
69
|
const val = buf[i * pageSize + j];
|