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 +42 -28
- package/compiler/builtins.js +1 -21
- package/compiler/codegen.js +16 -8
- package/compiler/generated_builtins.js +1 -1
- package/compiler/opt.js +2 -2
- package/package.json +1 -1
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: [
|
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: [
|
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: [
|
56
|
+
argTypes: [CValtype.i32, CValtype.i8],
|
57
57
|
returns: false
|
58
58
|
},
|
59
59
|
|
60
60
|
[Opcodes.i32_load]: {
|
61
|
-
c:
|
61
|
+
c: `${CValtype.i32} out;
|
62
62
|
memcpy(&out, _memory + offset + pointer, sizeof(out));
|
63
63
|
return out;`,
|
64
64
|
args: ['pointer'],
|
65
|
-
argTypes: [
|
66
|
-
returns:
|
65
|
+
argTypes: [CValtype.i32],
|
66
|
+
returns: CValtype.i32
|
67
67
|
},
|
68
68
|
[Opcodes.i32_load16_u]: {
|
69
|
-
c:
|
69
|
+
c: `${CValtype.i16} out;
|
70
70
|
memcpy(&out, _memory + offset + pointer, sizeof(out));
|
71
71
|
return out;`,
|
72
72
|
args: ['pointer'],
|
73
|
-
argTypes: [
|
74
|
-
returns:
|
73
|
+
argTypes: [CValtype.i32],
|
74
|
+
returns: CValtype.i32
|
75
75
|
},
|
76
76
|
[Opcodes.i32_load8_u]: {
|
77
|
-
c:
|
77
|
+
c: `${CValtype.i8} out;
|
78
78
|
memcpy(&out, _memory + offset + pointer, sizeof(out));
|
79
79
|
return out;`,
|
80
80
|
args: ['pointer'],
|
81
|
-
argTypes: [
|
82
|
-
returns:
|
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: [
|
88
|
+
argTypes: [CValtype.i32, CValtype.f64],
|
89
89
|
returns: false
|
90
90
|
},
|
91
91
|
[Opcodes.f64_load]: {
|
92
|
-
c:
|
92
|
+
c: `${CValtype.f64} out;
|
93
93
|
memcpy(&out, _memory + offset + pointer, sizeof(out));
|
94
94
|
return out;`,
|
95
95
|
args: ['pointer'],
|
96
|
-
argTypes: [
|
97
|
-
returns:
|
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(
|
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 ?
|
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(
|
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 =
|
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 =
|
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();
|
package/compiler/builtins.js
CHANGED
@@ -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
|
package/compiler/codegen.js
CHANGED
@@ -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
|
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
|
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 = (
|
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
|
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
|
-
//
|
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,
|
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.
|
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']
|
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