porffor 0.17.0-048c6f2ee → 0.17.0-55678f69e

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/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
- const n = internalTypeIndex++;
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']);
@@ -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
  };
@@ -127,7 +140,7 @@ export default (source, flags = [ 'module' ], customImports = {}, print = str =>
127
140
 
128
141
  globalThis.porfDebugInfo = { funcs, globals };
129
142
 
130
- if (source.includes?.('export ')) flags.push('module');
143
+ // if (process.argv[1].includes('/runner') && source.includes?.('export ')) flags.push('module');
131
144
 
132
145
  // fs.writeFileSync('out.wasm', Buffer.from(wasm));
133
146
 
@@ -317,6 +330,38 @@ export default (source, flags = [ 'module' ], customImports = {}, print = str =>
317
330
 
318
331
  throw porfToJSValue({ memory, funcs, pages }, value, type);
319
332
  }
333
+
334
+ if (exceptionMode === 'stackest') {
335
+ const constructorIdx = e.getArg(exceptTag, 0);
336
+ const constructorName = constructorIdx == -1 ? null : funcs.find(x => ((x.originalIndex ?? x.index) - importedFuncs.length) === constructorIdx)?.name;
337
+
338
+ const value = e.getArg(exceptTag, 1);
339
+ const type = e.getArg(exceptTag, 2);
340
+ const message = porfToJSValue({ memory, funcs, pages }, value, type);
341
+
342
+ // no constructor, just throw message
343
+ if (!constructorName) throw message;
344
+
345
+ const constructor = globalThis[constructorName] ?? eval(`class ${constructorName} extends Error { constructor(message) { super(message); this.name = "${constructorName}"; } }; ${constructorName}`);
346
+ throw new constructor(message);
347
+ }
348
+
349
+ if (exceptionMode === 'partial') {
350
+ const exceptId = e.getArg(exceptTag, 0);
351
+ const exception = exceptions[exceptId];
352
+
353
+ const constructorName = exception.constructor;
354
+
355
+ const value = e.getArg(exceptTag, 1);
356
+ const type = e.getArg(exceptTag, 2);
357
+ const message = porfToJSValue({ memory, funcs, pages }, value, type);
358
+
359
+ // no constructor, just throw message
360
+ if (!constructorName) throw message;
361
+
362
+ const constructor = globalThis[constructorName] ?? eval(`class ${constructorName} extends Error { constructor(message) { super(message); this.name = "${constructorName}"; } }; ${constructorName}`);
363
+ throw new constructor(message);
364
+ }
320
365
  }
321
366
 
322
367
  if (e instanceof WebAssembly.RuntimeError) {
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "porffor",
3
3
  "description": "a basic experimental wip aot optimizing js -> wasm engine/compiler/runtime in js",
4
- "version": "0.17.0-048c6f2ee",
4
+ "version": "0.17.0-55678f69e",
5
5
  "author": "CanadaHonk",
6
6
  "license": "MIT",
7
7
  "scripts": {},
package/runner/index.js CHANGED
@@ -130,7 +130,7 @@ const print = str => {
130
130
  let runStart;
131
131
  try {
132
132
  if (process.argv.includes('-b')) {
133
- const { wasm, exports } = await compile(source, process.argv.includes('--module') ? [ 'module' ] : [], {}, print);
133
+ const { wasm, exports } = compile(source, process.argv.includes('--module') ? [ 'module' ] : [], {}, print);
134
134
 
135
135
  runStart = performance.now();
136
136
  if (!process.argv.includes('--no-run')) exports.main();
@@ -145,7 +145,9 @@ try {
145
145
  // if (cache) process.stdout.write(cache);
146
146
  } catch (e) {
147
147
  // if (cache) process.stdout.write(cache);
148
- console.error(process.argv.includes('-i') ? e : `${e.constructor.name}: ${e.message}`);
148
+ let out = e;
149
+ if (!process.argv.includes('-i') && Object.getPrototypeOf(e).message != null) out = `${e.constructor.name}${e.message != null ? `: ${e.message}` : ''}`;
150
+ console.error(out);
149
151
  }
150
152
 
151
153
  if (process.argv.includes('-t')) console.log(`${process.argv.includes('-b') ? '' : '\n\n'}total time: ${(performance.now() - start).toFixed(2)}ms\nexecution time: ${(performance.now() - runStart).toFixed(2)}ms`);
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}KB\x1B[0m for ${pages} thing${pages === 1 ? '' : 's'} using ${wasmPages} Wasm page${wasmPages === 1 ? '' : 's'}\n\n`;
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 < pages; 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 `;
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];