porffor 0.16.0-ab08df866 → 0.16.0-c6061294e

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/2c.js CHANGED
@@ -29,8 +29,8 @@ typedef double f64;
29
29
  f64 NAN = 0e+0/0e+0;
30
30
 
31
31
  struct ReturnValue {
32
- f64 value;
33
- i32 type;
32
+ ${CValtype.f64} value;
33
+ ${CValtype.i32} type;
34
34
  };\n\n`;
35
35
 
36
36
  // todo: is memcpy/etc safe with host endianness?
@@ -41,60 +41,60 @@ const CMemFuncs = {
41
41
  [Opcodes.i32_store]: {
42
42
  c: `memcpy(_memory + offset + pointer, &value, sizeof(value));`,
43
43
  args: ['pointer', 'value'],
44
- argTypes: ['i32', 'i32'],
44
+ argTypes: [CValtype.i32, CValtype.i32],
45
45
  returns: false
46
46
  },
47
47
  [Opcodes.i32_store16]: {
48
48
  c: `memcpy(_memory + offset + pointer, &value, sizeof(value));`,
49
49
  args: ['pointer', 'value'],
50
- argTypes: ['i32', 'i16'],
50
+ argTypes: [CValtype.i32, CValtype.i16],
51
51
  returns: false
52
52
  },
53
53
  [Opcodes.i32_store8]: {
54
54
  c: `memcpy(_memory + offset + pointer, &value, sizeof(value));`,
55
55
  args: ['pointer', 'value'],
56
- argTypes: ['i32', 'i8'],
56
+ argTypes: [CValtype.i32, CValtype.i8],
57
57
  returns: false
58
58
  },
59
59
 
60
60
  [Opcodes.i32_load]: {
61
- c: `i32 out;
61
+ c: `${CValtype.i32} out;
62
62
  memcpy(&out, _memory + offset + pointer, sizeof(out));
63
63
  return out;`,
64
64
  args: ['pointer'],
65
- argTypes: ['i32'],
66
- returns: 'i32'
65
+ argTypes: [CValtype.i32],
66
+ returns: CValtype.i32
67
67
  },
68
68
  [Opcodes.i32_load16_u]: {
69
- c: `i16 out;
69
+ c: `${CValtype.i16} out;
70
70
  memcpy(&out, _memory + offset + pointer, sizeof(out));
71
71
  return out;`,
72
72
  args: ['pointer'],
73
- argTypes: ['i32'],
74
- returns: 'i32'
73
+ argTypes: [CValtype.i32],
74
+ returns: CValtype.i32
75
75
  },
76
76
  [Opcodes.i32_load8_u]: {
77
- c: `i8 out;
77
+ c: `${CValtype.i8} out;
78
78
  memcpy(&out, _memory + offset + pointer, sizeof(out));
79
79
  return out;`,
80
80
  args: ['pointer'],
81
- argTypes: ['i32'],
82
- returns: 'i32'
81
+ argTypes: [CValtype.i32],
82
+ returns: CValtype.i32
83
83
  },
84
84
 
85
85
  [Opcodes.f64_store]: {
86
86
  c: `memcpy(_memory + offset + pointer, &value, sizeof(value));`,
87
87
  args: ['pointer', 'value'],
88
- argTypes: ['i32', 'f64'],
88
+ argTypes: [CValtype.i32, CValtype.f64],
89
89
  returns: false
90
90
  },
91
91
  [Opcodes.f64_load]: {
92
- c: `f64 out;
92
+ c: `${CValtype.f64} out;
93
93
  memcpy(&out, _memory + offset + pointer, sizeof(out));
94
94
  return out;`,
95
95
  args: ['pointer'],
96
- argTypes: ['i32'],
97
- returns: 'f64'
96
+ argTypes: [CValtype.i32],
97
+ returns: CValtype.f64
98
98
  },
99
99
  };
100
100
 
@@ -108,7 +108,7 @@ for (const x in CValtype) {
108
108
 
109
109
  const removeBrackets = str => {
110
110
  // return str;
111
- // if (str.startsWith('(i32)(u32)')) return '(i32)(u32)(' + removeBrackets(str.slice(22, -1)) + ')';
111
+ // if (str.startsWith(`(${CValtype.i32})(${CValtype.u32})`)) return `(${CValtype.i32})(${CValtype.u32})(` + removeBrackets(str.slice(22, -1)) + ')';
112
112
 
113
113
  for (const x in CValtype) {
114
114
  const p = `(${x})`;
@@ -219,7 +219,7 @@ export default ({ funcs, globals, tags, data, exceptions, pages }) => {
219
219
 
220
220
  const shouldInline = false; // f.internal;
221
221
  if (f.name === 'main') out += `int main(${prependMain.has('argv') ? 'int argc, char* argv[]' : ''}) {\n`;
222
- else out += `${f.internal ? (returns ? 'f64' : 'void') : 'struct ReturnValue'} ${shouldInline ? 'inline ' : ''}${sanitize(f.name)}(${f.params.map((x, i) => `${CValtype[x]} ${invLocals[i]}`).join(', ')}) {\n`;
222
+ else out += `${f.internal ? (returns ? CValtype.f64 : 'void') : 'struct ReturnValue'} ${shouldInline ? 'inline ' : ''}${sanitize(f.name)}(${f.params.map((x, i) => `${CValtype[x]} ${invLocals[i]}`).join(', ')}) {\n`;
223
223
 
224
224
  if (f.name === 'main') {
225
225
  out += ' ' + [...prependMain.values()].join('\n ');
@@ -283,12 +283,12 @@ export default ({ funcs, globals, tags, data, exceptions, pages }) => {
283
283
  switch (i[1]) {
284
284
  // i32_trunc_sat_f64_s
285
285
  case 0x02:
286
- vals.push(`(i32)(${vals.pop()})`);
286
+ vals.push(`(${CValtype.i32})(${vals.pop()})`);
287
287
  break;
288
288
 
289
289
  // i32_trunc_sat_f64_u
290
290
  case 0x03:
291
- vals.push(`(u32)(${vals.pop()})`);
291
+ vals.push(`(${CValtype.u32})(${vals.pop()})`);
292
292
  break;
293
293
  }
294
294
 
@@ -337,7 +337,7 @@ export default ({ funcs, globals, tags, data, exceptions, pages }) => {
337
337
 
338
338
  case Opcodes.f64_trunc:
339
339
  // vals.push(`trunc(${vals.pop()})`);
340
- vals.push(`(i32)(${removeBrackets(vals.pop())})`); // this is ~10x faster with clang??
340
+ vals.push(`(${CValtype.i32})(${removeBrackets(vals.pop())})`); // this is ~10x faster with clang??
341
341
  break;
342
342
 
343
343
  case Opcodes.f64_convert_i32_u:
@@ -345,7 +345,7 @@ export default ({ funcs, globals, tags, data, exceptions, pages }) => {
345
345
  case Opcodes.f64_convert_i64_u:
346
346
  case Opcodes.f64_convert_i64_s:
347
347
  // int to f64
348
- vals.push(`(f64)(${removeBrackets(vals.pop())})`);
348
+ vals.push(`(${CValtype.f64})(${removeBrackets(vals.pop())})`);
349
349
  break;
350
350
 
351
351
  case Opcodes.i32_eqz:
@@ -353,7 +353,7 @@ export default ({ funcs, globals, tags, data, exceptions, pages }) => {
353
353
  vals.push(`!(${removeBrackets(vals.pop())})`);
354
354
  } else {
355
355
  let cond = '(' + removeBrackets(vals.pop());
356
- if (cond.startsWith(`(i32)`)) cond = `${cond.slice(5)} == 0e+0`;
356
+ if (cond.startsWith(`(${CValtype.i32})`)) cond = `${cond.slice(`(${CValtype.i32})`.length)}) == 0e+0`;
357
357
  else cond += ') == 0';
358
358
  vals.push(cond);
359
359
  }
@@ -368,7 +368,7 @@ export default ({ funcs, globals, tags, data, exceptions, pages }) => {
368
368
  case Opcodes.if: {
369
369
  let cond = removeBrackets(vals.pop());
370
370
  if (!lastCond) {
371
- if (cond.startsWith(`(i32)`)) cond = `${cond.slice(5)} != 0e+0`;
371
+ if (cond.startsWith(`(${CValtype.i32})`)) cond = `(${cond.slice(`(${CValtype.i32})`.length)}) != 0e+0`;
372
372
  else cond = `(${cond}) != 0`;
373
373
  }
374
374
 
@@ -434,6 +434,7 @@ export default ({ funcs, globals, tags, data, exceptions, pages }) => {
434
434
  const importFunc = importFuncs[i[1]];
435
435
  switch (importFunc.name) {
436
436
  case 'print':
437
+ // line(`printf("%f\\n", ${vals.pop()})`);
437
438
  line(`printf("${valtype === 'f64' ? '%g' : '%i'}\\n", ${vals.pop()})`);
438
439
  includes.set('stdio.h', true);
439
440
  break;
@@ -444,6 +445,17 @@ export default ({ funcs, globals, tags, data, exceptions, pages }) => {
444
445
 
445
446
  case 'time':
446
447
  line(`double _time_out`);
448
+ /* platformSpecific(
449
+ `FILETIME _time_filetime;
450
+ GetSystemTimeAsFileTime(&_time_filetime);
451
+
452
+ ULARGE_INTEGER _time_ularge;
453
+ _time_ularge.LowPart = _time_filetime.dwLowDateTime;
454
+ _time_ularge.HighPart = _time_filetime.dwHighDateTime;
455
+ _time_out = (_time_ularge.QuadPart - 116444736000000000i64) / 10000.;`,
456
+ `struct timespec _time;
457
+ clock_gettime(CLOCK_MONOTONIC, &_time);
458
+ _time_out = _time.tv_nsec / 1000000.;`); */
447
459
  platformSpecific(
448
460
  `LARGE_INTEGER _time_freq, _time_t;
449
461
  QueryPerformanceFrequency(&_time_freq);
@@ -561,7 +573,7 @@ _time_out = _time.tv_nsec / 1000000. + _time.tv_sec * 1000.;`);
561
573
 
562
574
  let cond = removeBrackets(vals.pop());
563
575
  if (!lastCond) {
564
- if (cond.startsWith(`(i32)`)) cond = `${cond.slice(5)} != 0e+0`;
576
+ if (cond.startsWith(`(${CValtype.i32})`)) cond = `(${cond.slice(`(${CValtype.i32})`.length)}) != 0e+0`;
565
577
  else cond = `(${cond}) != 0`;
566
578
  }
567
579
 
@@ -591,7 +603,8 @@ _time_out = _time.tv_nsec / 1000000. + _time.tv_sec * 1000.;`);
591
603
  const name = invOpcodes[i[0]];
592
604
  const func = CMemFuncs[i[0]];
593
605
  if (!prepend.has(name)) {
594
- prepend.set(name, `${func.returns || 'void'} ${name}(i32 align, i32 offset, ${func.args.map((x, i) => `${func.argTypes[i]} ${x}`).join(', ')}) {\n ${func.c.replaceAll('\n', '\n ')}\n}\n`);
606
+ prepend.set(name, `${func.returns || 'void'} ${name}(${CValtype.i32} align, ${CValtype.i32} offset, ${func.args.map((x, i) => `${func.argTypes[i]} ${x}`).join(', ')}) {\n ${func.c.replaceAll('\n', '\n ')}\n}\n`);
607
+ // generate func c and prepend
595
608
  }
596
609
 
597
610
  const immediates = [ i[1], read_unsignedLEB128(i.slice(2)) ];
@@ -626,6 +639,7 @@ _time_out = _time.tv_nsec / 1000000. + _time.tv_sec * 1000.;`);
626
639
  depth = 0;
627
640
 
628
641
  const makeIncludes = includes => [...includes.keys()].map(x => `#include <${x}>\n`).join('');
642
+
629
643
  out = platformSpecific(makeIncludes(winIncludes), makeIncludes(unixIncludes), false) + '\n' + makeIncludes(includes) + '\n' + alwaysPreface + [...prepend.values()].join('\n') + '\n\n' + out;
630
644
 
631
645
  return out.trim();
@@ -167,7 +167,6 @@ export const BuiltinFuncs = function() {
167
167
  params: [ valtypeBinary, valtypeBinary ],
168
168
  locals: [],
169
169
  returns: [ valtypeBinary ],
170
- returnType: TYPES.number,
171
170
  wasm: [ // x - truncf(x / y) * y
172
171
  [ Opcodes.local_get, 0 ], // x
173
172
 
@@ -190,7 +189,6 @@ export const BuiltinFuncs = function() {
190
189
  params: [ valtypeBinary, valtypeBinary ],
191
190
  locals: [],
192
191
  returns: [ valtypeBinary ],
193
- returnType: TYPES.number,
194
192
  wasm: [
195
193
  [ Opcodes.local_get, 0 ],
196
194
  Opcodes.i32_to,
@@ -210,7 +208,6 @@ export const BuiltinFuncs = function() {
210
208
  params: [ valtypeBinary ],
211
209
  locals: [],
212
210
  returns: [ valtypeBinary ],
213
- returnType: TYPES.number,
214
211
  wasm: [
215
212
  [ Opcodes.local_get, 0 ]
216
213
  ],
@@ -472,7 +469,6 @@ export const BuiltinFuncs = function() {
472
469
  params: [ valtypeBinary ],
473
470
  locals: [],
474
471
  returns: [ valtypeBinary ],
475
- returnType: TYPES.number,
476
472
  wasm: [
477
473
  [ Opcodes.local_get, 0 ],
478
474
  [ Opcodes.f64_sqrt ]
@@ -484,7 +480,6 @@ export const BuiltinFuncs = function() {
484
480
  params: [ valtypeBinary ],
485
481
  locals: [],
486
482
  returns: [ valtypeBinary ],
487
- returnType: TYPES.number,
488
483
  wasm: [
489
484
  [ Opcodes.local_get, 0 ],
490
485
  [ Opcodes.f64_abs ]
@@ -496,7 +491,6 @@ export const BuiltinFuncs = function() {
496
491
  params: [ valtypeBinary ],
497
492
  locals: [],
498
493
  returns: [ valtypeBinary ],
499
- returnType: TYPES.number,
500
494
  wasm: [
501
495
  ...number(1),
502
496
  [ Opcodes.local_get, 0 ],
@@ -509,7 +503,6 @@ export const BuiltinFuncs = function() {
509
503
  params: [ valtypeBinary ],
510
504
  locals: [],
511
505
  returns: [ valtypeBinary ],
512
- returnType: TYPES.number,
513
506
  wasm: [
514
507
  [ Opcodes.local_get, 0 ],
515
508
  [ Opcodes.f64_floor ]
@@ -521,7 +514,6 @@ export const BuiltinFuncs = function() {
521
514
  params: [ valtypeBinary ],
522
515
  locals: [],
523
516
  returns: [ valtypeBinary ],
524
- returnType: TYPES.number,
525
517
  wasm: [
526
518
  [ Opcodes.local_get, 0 ],
527
519
  [ Opcodes.f64_ceil ]
@@ -533,7 +525,6 @@ export const BuiltinFuncs = function() {
533
525
  params: [ valtypeBinary ],
534
526
  locals: [],
535
527
  returns: [ valtypeBinary ],
536
- returnType: TYPES.number,
537
528
  wasm: [
538
529
  [ Opcodes.local_get, 0 ],
539
530
  [ Opcodes.f64_nearest ]
@@ -545,7 +536,6 @@ export const BuiltinFuncs = function() {
545
536
  params: [ valtypeBinary ],
546
537
  locals: [],
547
538
  returns: [ valtypeBinary ],
548
- returnType: TYPES.number,
549
539
  wasm: [
550
540
  [ Opcodes.local_get, 0 ],
551
541
  [ Opcodes.f64_trunc ]
@@ -557,7 +547,6 @@ export const BuiltinFuncs = function() {
557
547
  params: [ valtypeBinary ],
558
548
  locals: [],
559
549
  returns: [ valtypeBinary ],
560
- returnType: TYPES.number,
561
550
  wasm: [
562
551
  [ Opcodes.local_get, 0 ],
563
552
  Opcodes.i32_trunc_sat_f64_u,
@@ -571,7 +560,6 @@ export const BuiltinFuncs = function() {
571
560
  params: [ valtypeBinary ],
572
561
  locals: [],
573
562
  returns: [ valtypeBinary ],
574
- returnType: TYPES.number,
575
563
  wasm: [
576
564
  [ Opcodes.local_get, 0 ],
577
565
  [ Opcodes.f32_demote_f64 ],
@@ -585,7 +573,6 @@ export const BuiltinFuncs = function() {
585
573
  params: [ valtypeBinary, valtypeBinary ],
586
574
  locals: [],
587
575
  returns: [ valtypeBinary ],
588
- returnType: TYPES.number,
589
576
  wasm: [
590
577
  [ Opcodes.local_get, 0 ],
591
578
  Opcodes.i32_trunc_sat_f64_s,
@@ -900,7 +887,6 @@ export const BuiltinFuncs = function() {
900
887
  globalNames: [ 'state0', 'state1' ],
901
888
  globalInits: [ prngSeed0, prngSeed1 ],
902
889
  returns: [ Valtype.f64 ],
903
- returnType: TYPES.number,
904
890
  wasm: [
905
891
  ...prng.wasm,
906
892
 
@@ -952,7 +938,6 @@ export const BuiltinFuncs = function() {
952
938
  globalNames: [ 'state0', 'state1' ],
953
939
  globalInits: [ prngSeed0, prngSeed1 ],
954
940
  returns: [ Valtype.i32 ],
955
- returnType: TYPES.number,
956
941
  wasm: [
957
942
  ...prng.wasm,
958
943
 
@@ -974,7 +959,6 @@ export const BuiltinFuncs = function() {
974
959
  params: [ valtypeBinary ],
975
960
  locals: [],
976
961
  returns: [ valtypeBinary ],
977
- returnType: TYPES.number,
978
962
  wasm: [
979
963
  [ Opcodes.local_get, 0 ],
980
964
  ...number(Math.PI / 180),
@@ -987,7 +971,6 @@ export const BuiltinFuncs = function() {
987
971
  params: [ valtypeBinary ],
988
972
  locals: [],
989
973
  returns: [ valtypeBinary ],
990
- returnType: TYPES.number,
991
974
  wasm: [
992
975
  [ Opcodes.local_get, 0 ],
993
976
  ...number(180 / Math.PI),
@@ -1001,7 +984,6 @@ export const BuiltinFuncs = function() {
1001
984
  locals: [],
1002
985
  localNames: [ 'x', 'lower', 'upper' ],
1003
986
  returns: [ valtypeBinary ],
1004
- returnType: TYPES.number,
1005
987
  wasm: [
1006
988
  [ Opcodes.local_get, 0 ],
1007
989
  [ Opcodes.local_get, 1 ],
@@ -1017,9 +999,9 @@ export const BuiltinFuncs = function() {
1017
999
  locals: [],
1018
1000
  localNames: [ 'x', 'inLow', 'inHigh', 'outLow', 'outHigh' ],
1019
1001
  returns: [ valtypeBinary ],
1020
- returnType: TYPES.number,
1021
1002
  wasm: [
1022
1003
  // (x − inLow) * (outHigh − outLow) / (inHigh - inLow) + outLow
1004
+
1023
1005
  [ Opcodes.local_get, 0 ],
1024
1006
  [ Opcodes.local_get, 1 ],
1025
1007
  [ Opcodes.f64_sub ],
@@ -1061,7 +1043,6 @@ export const BuiltinFuncs = function() {
1061
1043
  params: [],
1062
1044
  locals: [],
1063
1045
  returns: [ valtypeBinary ],
1064
- returnType: TYPES.number,
1065
1046
  wasm: [
1066
1047
  [ Opcodes.call, importedFuncs.time ]
1067
1048
  ]
@@ -1089,7 +1070,6 @@ export const BuiltinFuncs = function() {
1089
1070
  typedParams: true,
1090
1071
  locals: [],
1091
1072
  returns: [ valtypeBinary ],
1092
- returnType: TYPES.number,
1093
1073
  wasm: [
1094
1074
  [ Opcodes.local_get, 1 ],
1095
1075
  Opcodes.i32_from_u
@@ -1078,7 +1078,7 @@ const asmFunc = (name, { wasm, params, locals: localTypes, globals: globalTypes
1078
1078
  locals,
1079
1079
  localInd: allLocals.length,
1080
1080
  returns,
1081
- returnType,
1081
+ returnType: returnType ?? TYPES.number,
1082
1082
  internal: true,
1083
1083
  index: currentFuncIndex++,
1084
1084
  table
@@ -1254,7 +1254,7 @@ const getNodeType = (scope, node) => {
1254
1254
  const func = funcs.find(x => x.name === name);
1255
1255
 
1256
1256
  if (func) {
1257
- if (func.returnType != null) return func.returnType;
1257
+ if (func.returnType) return func.returnType;
1258
1258
  }
1259
1259
 
1260
1260
  if (builtinFuncs[name] && !builtinFuncs[name].typedReturns) return builtinFuncs[name].returnType ?? TYPES.number;
@@ -1270,7 +1270,15 @@ const getNodeType = (scope, node) => {
1270
1270
  const func = spl[spl.length - 1];
1271
1271
  const protoFuncs = Object.keys(prototypeFuncs).filter(x => x != TYPES.bytestring && prototypeFuncs[x][func] != null);
1272
1272
  if (protoFuncs.length === 1) {
1273
- if (protoFuncs[0].returnType != null) return protoFuncs[0].returnType;
1273
+ if (protoFuncs[0].returnType) return protoFuncs[0].returnType;
1274
+ }
1275
+
1276
+ if (protoFuncs.length > 0) {
1277
+ if (scope.locals['#last_type']) return getLastType(scope);
1278
+
1279
+ // presume
1280
+ // todo: warn here?
1281
+ return TYPES.number;
1274
1282
  }
1275
1283
  }
1276
1284
 
@@ -1970,7 +1978,7 @@ const generateCall = (scope, decl, _global, _name, unusedValue = false) => {
1970
1978
  const func = funcs[idx - importedFuncs.length]; // idx === scope.index ? scope : funcs.find(x => x.index === idx);
1971
1979
  const userFunc = func && !func.internal;
1972
1980
  const typedParams = userFunc || builtinFuncs[name]?.typedParams;
1973
- const typedReturns = (userFunc && func.returnType == null) || builtinFuncs[name]?.typedReturns;
1981
+ const typedReturns = (func && func.returnType == null) || builtinFuncs[name]?.typedReturns;
1974
1982
  const paramCount = func && (typedParams ? func.params.length / 2 : func.params.length);
1975
1983
 
1976
1984
  let args = decl.arguments;
@@ -2563,7 +2571,7 @@ const generateUnary = (scope, decl) => {
2563
2571
  // * -1
2564
2572
 
2565
2573
  if (decl.prefix && decl.argument.type === 'Literal' && typeof decl.argument.value === 'number') {
2566
- // if -n, just return that as a const
2574
+ // if -<N>, just return that
2567
2575
  return number(-1 * decl.argument.value);
2568
2576
  }
2569
2577
 
@@ -2575,14 +2583,14 @@ const generateUnary = (scope, decl) => {
2575
2583
  case '!':
2576
2584
  const arg = decl.argument;
2577
2585
  if (arg.type === 'UnaryExpression' && arg.operator === '!') {
2578
- // opt: !!x -> is x truthy
2586
+ // !!x -> is x truthy
2579
2587
  return truthy(scope, generate(scope, arg.argument), getNodeType(scope, arg.argument), false, false);
2580
2588
  }
2581
-
2582
2589
  // !=
2583
- return falsy(scope, generate(scope, arg), getNodeType(scope, arg), false, false);
2590
+ return falsy(scope, generate(scope, decl.argument), getNodeType(scope, decl.argument), false, false);
2584
2591
 
2585
2592
  case '~':
2593
+ // todo: does not handle Infinity properly (should convert to 0) (but opt const converting saves us sometimes)
2586
2594
  return [
2587
2595
  ...generate(scope, decl.argument),
2588
2596
  Opcodes.i32_to,
@@ -1748,7 +1748,7 @@ export const BuiltinFuncs = function() {
1748
1748
  localNames: ["iterable","iterable#type","out","type","forof_base_pointer","forof_length","forof_counter","x","x#type","#last_type","#typeswitch_tmp"],
1749
1749
  };
1750
1750
  this.__Set_prototype_union = {
1751
- wasm: (scope, {builtin,internalThrow,}) => [[32,2],[32,3],[16, builtin('__Porffor_rawType')],[68,0,0,0,0,0,0,52,64],[98],[4,64],...internalThrow(scope, 'TypeError', `Set.prototype.union's 'other' argument must be a Set`),[11],[32,0],[65,20],[16, builtin('Set$constructor')],[33,4],[32,2],[252,3],[33,5],[65,0],[33,7],[32,5],[40,1,0],[33,6],[32,3],[33,11],[2,64],[32,11],[65,2],[70],[4,64,"TYPESWITCH|String"],[65,2],[33,9],[3,64],[65,0],[32,5],[47,0,4],[59,0,3],[68,0,0,0,0,0,0,240,191],[33,8],[2,64],[32,4],[65,20],[32,8],[32,9],[16, builtin('__Set_prototype_add')],[26],[26],[32,5],[65,2],[106],[33,5],[32,7],[65,1],[106],[34,7],[32,6],[71],[13,1],[11],[11],[12,1],[11],[32,11],[65,16],[70],[4,64,"TYPESWITCH|Array"],[3,64],[32,5],[43,0,4],[32,5],[45,0,12],[33,9],[33,8],[2,64],[32,4],[65,20],[32,8],[32,9],[16, builtin('__Set_prototype_add')],[26],[26],[32,5],[65,9],[106],[33,5],[32,7],[65,1],[106],[34,7],[32,6],[71],[13,1],[11],[11],[12,1],[11],[32,11],[65,18],[70],[4,64,"TYPESWITCH|ByteString"],[65,18],[33,9],[3,64],[65,0],[32,5],[32,7],[106],[45,0,4],[58,0,3],[68,0,0,0,0,0,0,240,191],[33,8],[2,64],[32,4],[65,20],[32,8],[32,9],[16, builtin('__Set_prototype_add')],[26],[26],[32,7],[65,1],[106],[34,7],[32,6],[71],[13,1],[11],[11],[12,1],[11],[32,11],[65,20],[70],[4,64,"TYPESWITCH|Set"],[3,64],[32,5],[43,0,4],[32,5],[45,0,12],[33,9],[33,8],[2,64],[32,4],[65,20],[32,8],[32,9],[16, builtin('__Set_prototype_add')],[26],[26],[32,5],[65,9],[106],[33,5],[32,7],[65,1],[106],[34,7],[32,6],[71],[13,1],[11],[11],[12,1],[11],...internalThrow(scope, 'TypeError', `Tried for..of on non-iterable type`),[11,"TYPESWITCH_end"],[32,4],[65,20],[15]],
1751
+ wasm: (scope, {builtin,internalThrow,}) => [[32,2],[32,3],[16, builtin('__Porffor_rawType')],[68,0,0,0,0,0,0,52,64],[98],[4,64],...internalThrow(scope, 'TypeError', `Set.union requires 'Set'`),[11],[32,0],[65,20],[16, builtin('Set$constructor')],[33,4],[32,2],[252,3],[33,5],[65,0],[33,7],[32,5],[40,1,0],[33,6],[32,3],[33,11],[2,64],[32,11],[65,2],[70],[4,64,"TYPESWITCH|String"],[65,2],[33,9],[3,64],[65,0],[32,5],[47,0,4],[59,0,3],[68,0,0,0,0,0,0,240,191],[33,8],[2,64],[32,4],[65,20],[32,8],[32,9],[16, builtin('__Set_prototype_add')],[26],[26],[32,5],[65,2],[106],[33,5],[32,7],[65,1],[106],[34,7],[32,6],[71],[13,1],[11],[11],[12,1],[11],[32,11],[65,16],[70],[4,64,"TYPESWITCH|Array"],[3,64],[32,5],[43,0,4],[32,5],[45,0,12],[33,9],[33,8],[2,64],[32,4],[65,20],[32,8],[32,9],[16, builtin('__Set_prototype_add')],[26],[26],[32,5],[65,9],[106],[33,5],[32,7],[65,1],[106],[34,7],[32,6],[71],[13,1],[11],[11],[12,1],[11],[32,11],[65,18],[70],[4,64,"TYPESWITCH|ByteString"],[65,18],[33,9],[3,64],[65,0],[32,5],[32,7],[106],[45,0,4],[58,0,3],[68,0,0,0,0,0,0,240,191],[33,8],[2,64],[32,4],[65,20],[32,8],[32,9],[16, builtin('__Set_prototype_add')],[26],[26],[32,7],[65,1],[106],[34,7],[32,6],[71],[13,1],[11],[11],[12,1],[11],[32,11],[65,20],[70],[4,64,"TYPESWITCH|Set"],[3,64],[32,5],[43,0,4],[32,5],[45,0,12],[33,9],[33,8],[2,64],[32,4],[65,20],[32,8],[32,9],[16, builtin('__Set_prototype_add')],[26],[26],[32,5],[65,9],[106],[33,5],[32,7],[65,1],[106],[34,7],[32,6],[71],[13,1],[11],[11],[12,1],[11],...internalThrow(scope, 'TypeError', `Tried for..of on non-iterable type`),[11,"TYPESWITCH_end"],[32,4],[65,20],[15]],
1752
1752
  params: [124,127,124,127],
1753
1753
  typedParams: true,
1754
1754
  returns: [124,127],
package/compiler/opt.js CHANGED
@@ -108,7 +108,7 @@ export default (funcs, globals, pages, tags, exceptions) => {
108
108
  for (const f of funcs) {
109
109
  const wasm = f.wasm;
110
110
 
111
- const lastType = f.locals['#last_type']?.idx;
111
+ const lastType = f.locals['#last_type'];
112
112
 
113
113
  let runs = (+Prefs.optWasmRuns) || 2; // todo: how many by default?
114
114
  while (runs > 0) {
@@ -248,7 +248,7 @@ export default (funcs, globals, pages, tags, exceptions) => {
248
248
  }
249
249
 
250
250
  // remove setting last type if it is never gotten
251
- if (!f.gotLastType && inst[0] === Opcodes.local_set && inst[1] === lastType) {
251
+ if (!f.gotLastType && inst[0] === Opcodes.local_set && inst[1] === lastType?.idx) {
252
252
  // replace this inst with drop
253
253
  wasm.splice(i, 1, [ Opcodes.drop ]); // remove this and last inst
254
254
  if (i > 0) i--;
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.16.0-ab08df866",
4
+ "version": "0.16.0-c6061294e",
5
5
  "author": "CanadaHonk",
6
6
  "license": "MIT",
7
7
  "scripts": {