porffor 0.2.0-fde989a → 0.14.0-0d97d1e6a

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.
Files changed (61) hide show
  1. package/CONTRIBUTING.md +256 -0
  2. package/LICENSE +20 -20
  3. package/README.md +131 -86
  4. package/asur/README.md +2 -0
  5. package/asur/index.js +1262 -0
  6. package/byg/index.js +216 -0
  7. package/compiler/2c.js +2 -53
  8. package/compiler/{sections.js → assemble.js} +95 -21
  9. package/compiler/builtins/annexb_string.js +72 -0
  10. package/compiler/builtins/annexb_string.ts +18 -0
  11. package/compiler/builtins/array.ts +145 -0
  12. package/compiler/builtins/base64.ts +76 -0
  13. package/compiler/builtins/boolean.ts +18 -0
  14. package/compiler/builtins/crypto.ts +120 -0
  15. package/compiler/builtins/date.ts +2067 -0
  16. package/compiler/builtins/escape.ts +141 -0
  17. package/compiler/builtins/function.ts +5 -0
  18. package/compiler/builtins/int.ts +145 -0
  19. package/compiler/builtins/number.ts +529 -0
  20. package/compiler/builtins/object.ts +4 -0
  21. package/compiler/builtins/porffor.d.ts +60 -0
  22. package/compiler/builtins/set.ts +187 -0
  23. package/compiler/builtins/string.ts +1080 -0
  24. package/compiler/builtins/symbol.ts +61 -0
  25. package/compiler/builtins.js +440 -285
  26. package/compiler/{codeGen.js → codegen.js} +1116 -489
  27. package/compiler/decompile.js +3 -4
  28. package/compiler/embedding.js +22 -22
  29. package/compiler/encoding.js +94 -10
  30. package/compiler/expression.js +1 -1
  31. package/compiler/generated_builtins.js +1670 -0
  32. package/compiler/index.js +27 -43
  33. package/compiler/log.js +6 -3
  34. package/compiler/opt.js +55 -41
  35. package/compiler/parse.js +38 -30
  36. package/compiler/precompile.js +120 -0
  37. package/compiler/prefs.js +31 -0
  38. package/compiler/prototype.js +31 -46
  39. package/compiler/types.js +38 -0
  40. package/compiler/wasmSpec.js +33 -8
  41. package/compiler/wrap.js +107 -71
  42. package/package.json +9 -5
  43. package/porf +2 -0
  44. package/rhemyn/compile.js +46 -27
  45. package/rhemyn/parse.js +322 -320
  46. package/rhemyn/test/parse.js +58 -58
  47. package/runner/compare.js +33 -34
  48. package/runner/debug.js +117 -0
  49. package/runner/index.js +78 -11
  50. package/runner/profiler.js +75 -0
  51. package/runner/repl.js +40 -13
  52. package/runner/sizes.js +37 -37
  53. package/runner/version.js +10 -8
  54. package/compiler/builtins/base64.js +0 -92
  55. package/filesize.cmd +0 -2
  56. package/runner/info.js +0 -89
  57. package/runner/profile.js +0 -46
  58. package/runner/results.json +0 -1
  59. package/runner/transform.js +0 -15
  60. package/tmp.c +0 -661
  61. package/util/enum.js +0 -20
@@ -1,5 +1,8 @@
1
- import { Blocktype, Opcodes, Valtype, ValtypeSize } from "./wasmSpec.js";
2
- import { number, i32x4 } from "./embedding.js";
1
+ import * as GeneratedBuiltins from './generated_builtins.js';
2
+ import { Blocktype, Opcodes, Valtype, ValtypeSize } from './wasmSpec.js';
3
+ import { number } from './embedding.js';
4
+ import { TYPES } from './types.js';
5
+ import Prefs from './prefs.js';
3
6
 
4
7
  export const importedFuncs = [
5
8
  {
@@ -19,6 +22,24 @@ export const importedFuncs = [
19
22
  import: 't',
20
23
  params: 0,
21
24
  returns: 1
25
+ },
26
+ {
27
+ name: 'timeOrigin',
28
+ import: 'u',
29
+ params: 0,
30
+ returns: 1
31
+ },
32
+ {
33
+ name: 'profile1',
34
+ import: 'y',
35
+ params: 1,
36
+ returns: 0
37
+ },
38
+ {
39
+ name: 'profile2',
40
+ import: 'z',
41
+ params: 1,
42
+ returns: 0
22
43
  }
23
44
  ];
24
45
 
@@ -27,8 +48,6 @@ for (let i = 0; i < importedFuncs.length; i++) {
27
48
  importedFuncs[f.name] = i;
28
49
  }
29
50
 
30
- const char = c => number(c.charCodeAt(0));
31
-
32
51
  const printStaticStr = str => {
33
52
  const out = [];
34
53
 
@@ -50,10 +69,10 @@ export const NULL = 0;
50
69
 
51
70
  export const BuiltinVars = function() {
52
71
  this.undefined = number(UNDEFINED);
53
- this.undefined.type = 'undefined';
72
+ this.undefined.type = TYPES.undefined;
54
73
 
55
74
  this.null = number(NULL);
56
- this.null.type = 'object';
75
+ this.null.type = TYPES.object;
57
76
 
58
77
  this.NaN = number(NaN);
59
78
  this.NaN.floatOnly = true;
@@ -117,6 +136,18 @@ export const BuiltinVars = function() {
117
136
 
118
137
  // stubs just so that parent objects exist
119
138
  this.Math = number(1);
139
+
140
+ // wintercg(tm)
141
+ this.__navigator_userAgent = (scope, { makeString }) => makeString(scope, `Porffor/0.14.0`, false, '__navigator_userAgent');
142
+ this.__navigator_userAgent.type = Prefs.bytestring ? TYPES.bytestring : TYPES.string;
143
+
144
+ for (const x in TYPES) {
145
+ this['__Porffor_TYPES_' + x] = number(TYPES[x]);
146
+ }
147
+
148
+ this.__performance_timeOrigin = [
149
+ [ Opcodes.call, importedFuncs.timeOrigin ]
150
+ ];
120
151
  };
121
152
 
122
153
  export const BuiltinFuncs = function() {
@@ -167,7 +198,8 @@ export const BuiltinFuncs = function() {
167
198
  returns: [ valtypeBinary ],
168
199
  wasm: [
169
200
  [ Opcodes.local_get, 0 ]
170
- ]
201
+ ],
202
+ constr: true
171
203
  };
172
204
 
173
205
  // just return given (default 0) for (new) Object() as we somewhat supports object just not constructor
@@ -175,19 +207,21 @@ export const BuiltinFuncs = function() {
175
207
  params: [ valtypeBinary ],
176
208
  locals: [],
177
209
  returns: [ valtypeBinary ],
178
- returnType: 'object',
210
+ returnType: TYPES.object,
179
211
  wasm: [
180
- [ Opcodes.local_get, 0 ]
181
- ]
212
+ // [ Opcodes.local_get, 0 ]
213
+ ...number(1)
214
+ ],
215
+ constr: true
182
216
  };
183
217
 
184
218
 
185
- this.__console_log = {
219
+ this.__Porffor_print = {
186
220
  params: [ valtypeBinary, Valtype.i32 ],
187
221
  typedParams: true,
188
222
  locals: [ Valtype.i32, Valtype.i32 ],
189
223
  returns: [],
190
- wasm: (scope, { TYPES, typeSwitch }) => [
224
+ wasm: (scope, { typeSwitch }) => [
191
225
  ...typeSwitch(scope, [ [ Opcodes.local_get, 1 ] ], {
192
226
  [TYPES.number]: [
193
227
  [ Opcodes.local_get, 0 ],
@@ -239,7 +273,41 @@ export const BuiltinFuncs = function() {
239
273
 
240
274
  [ Opcodes.end ]
241
275
  ],
242
- [TYPES._array]: [
276
+ [TYPES.bytestring]: [
277
+ // simply print a (byte)string :))
278
+ // cache input pointer as i32
279
+ [ Opcodes.local_get, 0 ],
280
+ Opcodes.i32_to_u,
281
+ [ Opcodes.local_tee, 2 ],
282
+
283
+ // make end pointer
284
+ [ Opcodes.i32_load, Math.log2(ValtypeSize.i32) - 1, 0 ],
285
+ [ Opcodes.local_get, 2 ],
286
+ [ Opcodes.i32_add ],
287
+ [ Opcodes.local_set, 3 ],
288
+
289
+ [ Opcodes.loop, Blocktype.void ],
290
+
291
+ // print current char
292
+ [ Opcodes.local_get, 2 ],
293
+ [ Opcodes.i32_load8_u, Math.log2(ValtypeSize.i16) - 1, ValtypeSize.i32 ],
294
+ Opcodes.i32_from_u,
295
+ [ Opcodes.call, importedFuncs.printChar ],
296
+
297
+ // increment pointer
298
+ [ Opcodes.local_get, 2 ],
299
+ [ Opcodes.i32_const, 1 ],
300
+ [ Opcodes.i32_add ],
301
+ [ Opcodes.local_tee, 2 ],
302
+
303
+ // if pointer != end pointer, loop
304
+ [ Opcodes.local_get, 3 ],
305
+ [ Opcodes.i32_ne ],
306
+ [ Opcodes.br_if, 0 ],
307
+
308
+ [ Opcodes.end ]
309
+ ],
310
+ [TYPES.array]: [
243
311
  ...printStaticStr('[ '),
244
312
 
245
313
  // cache input pointer as i32
@@ -300,10 +368,7 @@ export const BuiltinFuncs = function() {
300
368
  [ Opcodes.local_get, 0 ],
301
369
  [ Opcodes.call, importedFuncs.print ],
302
370
  ]
303
- }, Blocktype.void),
304
-
305
- ...char('\n'),
306
- [ Opcodes.call, importedFuncs.printChar ]
371
+ }, Blocktype.void)
307
372
  ]
308
373
  };
309
374
 
@@ -315,7 +380,7 @@ export const BuiltinFuncs = function() {
315
380
  params: [ valtypeBinary ],
316
381
  locals: [],
317
382
  returns: [ valtypeBinary ],
318
- returnType: 'boolean',
383
+ returnType: TYPES.boolean,
319
384
  wasm: [
320
385
  [ Opcodes.local_get, 0 ],
321
386
  [ Opcodes.local_get, 0 ],
@@ -330,7 +395,7 @@ export const BuiltinFuncs = function() {
330
395
  params: [ valtypeBinary ],
331
396
  locals: [ valtypeBinary ],
332
397
  returns: [ valtypeBinary ],
333
- returnType: 'boolean',
398
+ returnType: TYPES.boolean,
334
399
  wasm: [
335
400
  [ Opcodes.local_get, 0 ],
336
401
  [ Opcodes.local_get, 0 ],
@@ -349,7 +414,7 @@ export const BuiltinFuncs = function() {
349
414
  params: [ valtypeBinary ],
350
415
  locals: [],
351
416
  returns: [ valtypeBinary ],
352
- returnType: 'boolean',
417
+ returnType: TYPES.boolean,
353
418
  wasm: [
354
419
  [ Opcodes.local_get, 0 ],
355
420
  [ Opcodes.local_get, 0 ],
@@ -364,7 +429,7 @@ export const BuiltinFuncs = function() {
364
429
  params: [ valtypeBinary ],
365
430
  locals: [],
366
431
  returns: [ valtypeBinary ],
367
- returnType: 'boolean',
432
+ returnType: TYPES.boolean,
368
433
  wasm: [
369
434
  [ Opcodes.local_get, 0 ],
370
435
  [ Opcodes.local_get, 0 ],
@@ -504,61 +569,313 @@ export const BuiltinFuncs = function() {
504
569
 
505
570
  // this is an implementation of xorshift128+ (in wasm bytecode)
506
571
  // fun fact: v8, SM, JSC also use this (you will need this fun fact to maintain your sanity reading this code)
507
- const prngSeed0 = Math.floor(Math.random() * Number.MAX_SAFE_INTEGER), prngSeed1 = Math.floor(Math.random() * Number.MAX_SAFE_INTEGER);
572
+ const prngSeed0 = (Math.random() * (2 ** 30)) | 0, prngSeed1 = (Math.random() * (2 ** 30)) | 0;
573
+
574
+ const prng = ({
575
+ 'lcg32_glibc': {
576
+ globals: [ Valtype.i32 ],
577
+ locals: [],
578
+ returns: Valtype.i32,
579
+ wasm: [
580
+ // seed = (MULTIPLIER * seed + INCREMENT) % MODULUS
581
+ // MULTIPLIER * state0
582
+ [ Opcodes.global_get, 0 ],
583
+ ...number(1103515245, Valtype.i32),
584
+ [ Opcodes.i32_mul ],
585
+
586
+ // + INCREMENT
587
+ ...number(12345, Valtype.i32),
588
+ [ Opcodes.i32_add ],
589
+
590
+ // % MODULUS
591
+ ...number(2 ** 31, Valtype.i32),
592
+ [ Opcodes.i32_rem_s ],
593
+
594
+ // state0 =
595
+ [ Opcodes.global_set, 0 ],
596
+
597
+ // state0
598
+ [ Opcodes.global_get, 0 ],
599
+ ],
600
+ },
601
+ 'lcg32_minstd': {
602
+ globals: [ Valtype.i32 ],
603
+ locals: [],
604
+ returns: Valtype.i32,
605
+ wasm: [
606
+ // seed = (MULTIPLIER * seed + INCREMENT) % MODULUS
607
+ // MULTIPLIER * state0
608
+ [ Opcodes.global_get, 0 ],
609
+ ...number(48271, Valtype.i32),
610
+ [ Opcodes.i32_mul ],
611
+
612
+ // % MODULUS
613
+ ...number((2 ** 31) - 1, Valtype.i32),
614
+ [ Opcodes.i32_rem_s ],
615
+
616
+ // state0 =
617
+ [ Opcodes.global_set, 0 ],
618
+
619
+ // state0
620
+ [ Opcodes.global_get, 0 ],
621
+ ],
622
+ },
623
+ 'lcg64_musl': 0, // todo
624
+
625
+ 'xorshift32+': {
626
+ globals: [ Valtype.i32 ],
627
+ locals: [ Valtype.i32 ],
628
+ returns: Valtype.i32,
629
+ wasm: [
630
+ // setup: s1 = state0
631
+ [ Opcodes.global_get, 0 ], // state0
632
+ [ Opcodes.local_tee, 0 ], // s1
633
+
634
+ // s1 ^= s1 << 13
635
+ [ Opcodes.local_get, 0 ], // s1
636
+ [ Opcodes.i32_const, 13 ],
637
+ [ Opcodes.i32_shl ], // <<
638
+ [ Opcodes.i32_xor ], // ^
639
+ [ Opcodes.local_tee, 0 ], // s1
640
+
641
+ // s1 ^= s1 >> 17
642
+ [ Opcodes.local_get, 0 ], // s1
643
+ [ Opcodes.i32_const, 17 ],
644
+ [ Opcodes.i32_shr_s ], // >>
645
+ [ Opcodes.i32_xor ], // ^
646
+ [ Opcodes.local_tee, 0 ], // s1
647
+
648
+ // s1 ^= s1 << 5
649
+ [ Opcodes.local_get, 0 ], // s1
650
+ [ Opcodes.i32_const, 5 ],
651
+ [ Opcodes.i32_shl ], // <<
652
+ [ Opcodes.i32_xor ], // ^
653
+ [ Opcodes.local_tee, 0 ], // s1
654
+
655
+ // state0 = s1
656
+ [ Opcodes.global_set, 0 ],
657
+
658
+ // s1
659
+ [ Opcodes.local_get, 0 ],
660
+ ],
661
+ },
662
+
663
+ 'xorshift64+': {
664
+ globals: [ Valtype.i64 ],
665
+ locals: [ Valtype.i64 ],
666
+ returns: Valtype.i64,
667
+ wasm: [
668
+ // setup: s1 = state0
669
+ [ Opcodes.global_get, 0 ], // state0
670
+ [ Opcodes.local_tee, 0 ], // s1
671
+
672
+ // s1 ^= s1 >> 12
673
+ [ Opcodes.local_get, 0 ], // s1
674
+ [ Opcodes.i64_const, 12 ],
675
+ [ Opcodes.i64_shr_s ], // >>
676
+ [ Opcodes.i64_xor ], // ^
677
+ [ Opcodes.local_tee, 0 ], // s1
678
+
679
+ // s1 ^= s1 << 25
680
+ [ Opcodes.local_get, 0 ], // s1
681
+ [ Opcodes.i64_const, 25 ],
682
+ [ Opcodes.i64_shl ], // <<
683
+ [ Opcodes.i64_xor ], // ^
684
+ [ Opcodes.local_tee, 0 ], // s1
685
+
686
+ // s1 ^= s1 >> 27
687
+ [ Opcodes.local_get, 0 ], // s1
688
+ [ Opcodes.i64_const, 27 ],
689
+ [ Opcodes.i64_shr_s ], // >>
690
+ [ Opcodes.i64_xor ], // ^
691
+ [ Opcodes.local_tee, 0 ], // s1
692
+
693
+ // state0 = s1
694
+ [ Opcodes.global_set, 0 ],
695
+
696
+ // // s1 * 0x2545F4914F6CDD1D
697
+ // [ Opcodes.local_get, 0 ],
698
+ // [ Opcodes.i64_const, 0x9d, 0xba, 0xb3, 0xfb, 0x94, 0x92, 0xfd, 0xa2, 0x25 ],
699
+ // [ Opcodes.i64_mul ]
700
+
701
+ // s1
702
+ [ Opcodes.local_get, 0 ],
703
+ ],
704
+ },
705
+
706
+ 'xorshift128+': {
707
+ globals: [ Valtype.i64, Valtype.i64 ],
708
+ locals: [ Valtype.i64, Valtype.i64 ],
709
+ returns: Valtype.i64,
710
+ wasm: [
711
+ // setup: s1 = state0, s0 = state1, state0 = s0
712
+ [ Opcodes.global_get, 0 ], // state0
713
+ [ Opcodes.local_tee, 0 ], // s1
714
+ [ Opcodes.global_get, 1 ], // state1
715
+ [ Opcodes.local_tee, 1, ], // s0
716
+ [ Opcodes.global_set, 0 ], // state0
717
+
718
+ // s1 ^= s1 << 23
719
+ // [ Opcodes.local_get, 0 ], // s1
720
+ [ Opcodes.local_get, 0 ], // s1
721
+ [ Opcodes.i64_const, 23 ],
722
+ [ Opcodes.i64_shl ], // <<
723
+ [ Opcodes.i64_xor ], // ^
724
+ [ Opcodes.local_set, 0 ], // s1
725
+
726
+ // state1 = s1 ^ s0 ^ (s1 >> 17) ^ (s0 >> 26)
727
+ // s1 ^ s0
728
+ [ Opcodes.local_get, 0 ], // s1
729
+ [ Opcodes.local_get, 1 ], // s0
730
+ [ Opcodes.i64_xor ], // ^
731
+
732
+ // ^ (s1 >> 17)
733
+ [ Opcodes.local_get, 0 ], // s1
734
+ [ Opcodes.i64_const, 17 ],
735
+ [ Opcodes.i64_shr_u ], // >>
736
+ [ Opcodes.i64_xor ], // ^
737
+
738
+ // ^ (s0 >> 26)
739
+ [ Opcodes.local_get, 1 ], // s0
740
+ [ Opcodes.i64_const, 26 ],
741
+ [ Opcodes.i64_shr_u ], // >>
742
+ [ Opcodes.i64_xor ], // ^
743
+
744
+ // state1 =
745
+ [ Opcodes.global_set, 1 ],
746
+
747
+ // state1 + s0
748
+ [ Opcodes.global_get, 1 ], // state1
749
+ [ Opcodes.local_get, 1 ], // s0
750
+ [ Opcodes.i64_add ]
751
+ ]
752
+ },
753
+
754
+ 'xoroshiro128+': {
755
+ globals: [ Valtype.i64, Valtype.i64 ],
756
+ locals: [ Valtype.i64, Valtype.i64, Valtype.i64 ],
757
+ returns: Valtype.i64,
758
+ wasm: [
759
+ // setup: s1 = state1, s0 = state0
760
+ [ Opcodes.global_get, 1 ], // state0
761
+ [ Opcodes.local_tee, 0 ], // s1
762
+ [ Opcodes.global_get, 0 ], // state1
763
+ [ Opcodes.local_tee, 1, ], // s0
764
+
765
+ // result = s0 + s1
766
+ [ Opcodes.i64_add ],
767
+ [ Opcodes.local_set, 2 ], // result
768
+
769
+ // s1 ^= s0
770
+ [ Opcodes.local_get, 0 ], // s1
771
+ [ Opcodes.local_get, 1 ], // s0
772
+ [ Opcodes.i64_xor ],
773
+ [ Opcodes.local_set, 0 ], // s1
774
+
775
+ // state0 = rotl(s0, 24) ^ s1 ^ (s1 << 16)
776
+
777
+ // rotl(s0, 24) ^ s1
778
+ [ Opcodes.local_get, 1 ], // s0
779
+ ...number(24, Valtype.i64),
780
+ [ Opcodes.i64_rotl ],
781
+ [ Opcodes.local_get, 0 ], // s1
782
+ [ Opcodes.i64_xor ],
783
+
784
+ // ^ (s1 << 16)
785
+ [ Opcodes.local_get, 0 ], // s1
786
+ ...number(16, Valtype.i64),
787
+ [ Opcodes.i64_shl ],
788
+ [ Opcodes.i64_xor ],
789
+
790
+ // state0 =
791
+ [ Opcodes.global_set, 0 ], // state0
792
+
793
+ // state1 = rotl(s1, 37)
794
+ [ Opcodes.local_get, 0 ], // s1
795
+ ...number(37, Valtype.i64),
796
+ [ Opcodes.i64_rotl ],
797
+ [ Opcodes.global_set, 1 ], // state1
798
+
799
+ // result
800
+ [ Opcodes.local_get, 2 ],
801
+ ]
802
+ },
803
+
804
+ 'xoshiro128+': {
805
+ globals: [ Valtype.i32, Valtype.i32, Valtype.i32, Valtype.i32 ],
806
+ locals: [ Valtype.i32, Valtype.i32 ],
807
+ returns: Valtype.i32,
808
+ wasm: [
809
+ // result = state0 + state3
810
+ [ Opcodes.global_get, 0 ], // state0
811
+ [ Opcodes.global_get, 3 ], // state0
812
+ [ Opcodes.i32_add ],
813
+ [ Opcodes.local_set, 0 ], // result
814
+
815
+ // t = state1 << 9
816
+ [ Opcodes.global_get, 1 ], // state1
817
+ ...number(9, Valtype.i32),
818
+ [ Opcodes.i32_shl ],
819
+ [ Opcodes.local_set, 1 ], // t
820
+
821
+ // state2 ^= state0
822
+ [ Opcodes.global_get, 2 ], // state2
823
+ [ Opcodes.global_get, 0 ], // state0
824
+ [ Opcodes.i32_xor ],
825
+ [ Opcodes.global_set, 2 ], // state2
826
+
827
+ // state3 ^= state1
828
+ [ Opcodes.global_get, 3 ], // state3
829
+ [ Opcodes.global_get, 1 ], // state1
830
+ [ Opcodes.i32_xor ],
831
+ [ Opcodes.global_set, 3 ], // state3
832
+
833
+ // state1 ^= state2
834
+ [ Opcodes.global_get, 1 ], // state1
835
+ [ Opcodes.global_get, 2 ], // state2
836
+ [ Opcodes.i32_xor ],
837
+ [ Opcodes.global_set, 1 ], // state1
838
+
839
+ // state0 ^= state3
840
+ [ Opcodes.global_get, 0 ], // state2
841
+ [ Opcodes.global_get, 3 ], // state0
842
+ [ Opcodes.i32_xor ],
843
+ [ Opcodes.global_set, 0 ], // state2
844
+
845
+ // state2 ^= t
846
+ [ Opcodes.global_get, 2 ], // state2
847
+ [ Opcodes.local_get, 1 ], // t
848
+ [ Opcodes.i32_xor ],
849
+ [ Opcodes.global_set, 2 ], // state2
850
+
851
+ // state3 = rotl(state3, 11)
852
+ [ Opcodes.global_get, 3 ], // state3
853
+ ...number(11, Valtype.i32),
854
+ [ Opcodes.i32_rotl ],
855
+ [ Opcodes.global_set, 3 ], // state3
856
+
857
+ // result
858
+ [ Opcodes.local_get, 0 ],
859
+ ]
860
+ }
861
+ })[Prefs.prng ?? 'xorshift128+'];
862
+
863
+ if (!prng) throw new Error(`unknown prng algo: ${Prefs.prng}`);
508
864
 
509
865
  this.__Math_random = {
510
866
  floatOnly: true,
511
867
  params: [],
512
- locals: [ Valtype.i64, Valtype.i64 ],
868
+ locals: prng.locals,
513
869
  localNames: [ 's1', 's0' ],
514
- globals: [ Valtype.i64, Valtype.i64 ],
870
+ globals: prng.globals,
515
871
  globalNames: [ 'state0', 'state1' ],
516
872
  globalInits: [ prngSeed0, prngSeed1 ],
517
873
  returns: [ Valtype.f64 ],
518
874
  wasm: [
519
- // setup: s1 = state0, s0 = state1, state0 = s0
520
- [ Opcodes.global_get, 0 ], // state0
521
- [ Opcodes.local_tee, 0 ], // s1
522
- [ Opcodes.global_get, 1 ], // state1
523
- [ Opcodes.local_tee, 1, ], // s0
524
- [ Opcodes.global_set, 0 ], // state0
525
-
526
- // s1 ^= s1 << 23
527
- // [ Opcodes.local_get, 0 ], // s1
528
- [ Opcodes.local_get, 0 ], // s1
529
- [ Opcodes.i64_const, 23 ],
530
- [ Opcodes.i64_shl ], // <<
531
- [ Opcodes.i64_xor ], // ^
532
- [ Opcodes.local_set, 0 ], // s1
533
-
534
- // state1 = s1 ^ s0 ^ (s1 >> 17) ^ (s0 >> 26)
535
- // s1 ^ s0
536
- [ Opcodes.local_get, 0 ], // s1
537
- [ Opcodes.local_get, 1 ], // s0
538
- [ Opcodes.i64_xor ], // ^
539
-
540
- // ^ (s1 >> 17)
541
- [ Opcodes.local_get, 0 ], // s1
542
- [ Opcodes.i64_const, 17 ],
543
- [ Opcodes.i64_shr_u ], // >>
544
- [ Opcodes.i64_xor ], // ^
545
-
546
- // ^ (s0 >> 26)
547
- [ Opcodes.local_get, 1 ], // s0
548
- [ Opcodes.i64_const, 26 ],
549
- [ Opcodes.i64_shr_u ], // >>
550
- [ Opcodes.i64_xor ], // ^
551
-
552
- // state1 =
553
- [ Opcodes.global_set, 1 ],
875
+ ...prng.wasm,
554
876
 
555
877
  // you thought it was over? now we need the result as a f64 between 0-1 :)
556
878
 
557
- // state1 + s0
558
- [ Opcodes.global_get, 1 ], // state1
559
- [ Opcodes.local_get, 1 ], // s0
560
- [ Opcodes.i64_add ],
561
-
562
879
  // should we >> 12 here?
563
880
  // it feels like it but it breaks values
564
881
 
@@ -573,15 +890,51 @@ export const BuiltinFuncs = function() {
573
890
  // ...number(1),
574
891
  // [ Opcodes.f64_sub ],
575
892
 
576
- ...number((1 << 53) - 1, Valtype.i64),
577
- [ Opcodes.i64_and ],
893
+ ...(prng.returns === Valtype.i64 ? [
894
+ ...number((1 << 53) - 1, Valtype.i64),
895
+ [ Opcodes.i64_and ],
896
+
897
+ // double(mantissa)
898
+ [ Opcodes.f64_convert_i64_u ],
899
+
900
+ // / (1 << 53)
901
+ ...number(1 << 53),
902
+ [ Opcodes.f64_div ]
903
+ ] : [
904
+ ...number((1 << 21) - 1, Valtype.i32),
905
+ [ Opcodes.i32_and ],
906
+
907
+ // double(mantissa)
908
+ [ Opcodes.f64_convert_i32_u ],
909
+
910
+ // / (1 << 21)
911
+ ...number(1 << 21),
912
+ [ Opcodes.f64_div ]
913
+ ])
914
+ ]
915
+ };
916
+
917
+ this.__Porffor_randomByte = {
918
+ params: [],
919
+ locals: prng.locals,
920
+ localNames: [ 's1', 's0' ],
921
+ globals: prng.globals,
922
+ globalNames: [ 'state0', 'state1' ],
923
+ globalInits: [ prngSeed0, prngSeed1 ],
924
+ returns: [ Valtype.i32 ],
925
+ wasm: [
926
+ ...prng.wasm,
927
+
928
+ ...(prng.returns === Valtype.i64 ? [
929
+ // the lowest bits of the output generated by xorshift128+ have low quality
930
+ ...number(56, Valtype.i64),
931
+ [ Opcodes.i64_shr_u ],
578
932
 
579
- // double(mantissa)
580
- [ Opcodes.f64_convert_i64_u ],
933
+ [ Opcodes.i32_wrap_i64 ],
934
+ ] : []),
581
935
 
582
- // / (1 << 53)
583
- ...number(1 << 53),
584
- [ Opcodes.f64_div ]
936
+ ...number(0xff, Valtype.i32),
937
+ [ Opcodes.i32_and ],
585
938
  ]
586
939
  };
587
940
 
@@ -660,7 +1013,7 @@ export const BuiltinFuncs = function() {
660
1013
  params: [ valtypeBinary ],
661
1014
  locals: [],
662
1015
  returns: [ valtypeBinary ],
663
- returnType: 'boolean',
1016
+ returnType: TYPES.boolean,
664
1017
  wasm: [
665
1018
  [ Opcodes.local_get, 0 ],
666
1019
  ...number(0),
@@ -685,7 +1038,7 @@ export const BuiltinFuncs = function() {
685
1038
  typedParams: true,
686
1039
  locals: [ Valtype.i32, Valtype.i32 ],
687
1040
  returns: [ valtypeBinary ],
688
- returnType: process.argv.includes('-bytestring') ? '_bytestring' : 'string',
1041
+ returnType: Prefs.bytestring ? TYPES.bytestring : TYPES.string,
689
1042
  wasm: (scope, { TYPE_NAMES, typeSwitch, makeString }) => {
690
1043
  const bc = {};
691
1044
  for (const x in TYPE_NAMES) {
@@ -696,233 +1049,35 @@ export const BuiltinFuncs = function() {
696
1049
  }
697
1050
  };
698
1051
 
699
- const localIsOneOf = (getter, arr, valtype = valtypeBinary) => {
700
- const out = [];
701
-
702
- for (let i = 0; i < arr.length; i++) {
703
- out.push(...getter, ...number(arr[i], valtype), valtype === Valtype.f64 ? [ Opcodes.f64_eq ] : [ Opcodes.i32_eq ]);
704
- if (i !== 0) out.push([ Opcodes.i32_or ]);
705
- }
706
-
707
- return out;
708
- };
709
-
710
- this.__Porffor_pointer = {
1052
+ this.__Porffor_rawType = {
711
1053
  params: [ valtypeBinary, Valtype.i32 ],
712
1054
  typedParams: true,
713
- locals: [ Valtype.i32, Valtype.i32 ],
714
- returns: [ valtypeBinary ],
715
- wasm: (scope, { TYPES }) => [
716
- ...localIsOneOf([ [ Opcodes.local_get, 1 ] ], [ TYPES.string, TYPES._array, TYPES._bytestring ], Valtype.i32),
717
- [ Opcodes.if, valtypeBinary ],
718
- [ Opcodes.local_get, 0 ],
719
- [ Opcodes.else ],
720
- ...number(NaN),
721
- [ Opcodes.end ]
722
- ]
723
- };
724
-
725
-
726
- this.__SIMD_i32x4_load = {
727
- params: [ Valtype.i32 ],
728
1055
  locals: [],
729
- returns: [ Valtype.v128 ],
730
- wasm: [
731
- [ Opcodes.local_get, 0 ],
732
- [ ...Opcodes.v128_load, 0, 0 ]
733
- ]
734
- };
735
-
736
- this.__SIMD_i32x4_splat = {
737
- params: [ Valtype.i32 ],
738
- locals: [],
739
- returns: [ Valtype.v128 ],
740
- wasm: [
741
- [ Opcodes.local_get, 0 ],
742
- [ ...Opcodes.i32x4_splat ],
743
- ]
744
- };
745
-
746
- this.__SIMD_i16x8_create = {
747
- params: [ Valtype.i32, Valtype.i32, Valtype.i32, Valtype.i32, Valtype.i32, Valtype.i32, Valtype.i32, Valtype.i32 ],
748
- locals: [],
749
- returns: [ Valtype.v128 ],
750
- wasm: [
751
- ...i32x4(0, 0, 0, 0),
752
- [ Opcodes.local_get, 0 ],
753
- [ ...Opcodes.i16x8_replace_lane, 0 ],
754
- [ Opcodes.local_get, 1 ],
755
- [ ...Opcodes.i16x8_replace_lane, 1 ],
756
- [ Opcodes.local_get, 2 ],
757
- [ ...Opcodes.i16x8_replace_lane, 2 ],
758
- [ Opcodes.local_get, 3 ],
759
- [ ...Opcodes.i16x8_replace_lane, 3 ],
760
- [ Opcodes.local_get, 4 ],
761
- [ ...Opcodes.i16x8_replace_lane, 4 ],
762
- [ Opcodes.local_get, 5 ],
763
- [ ...Opcodes.i16x8_replace_lane, 5 ],
764
- [ Opcodes.local_get, 6 ],
765
- [ ...Opcodes.i16x8_replace_lane, 6 ],
766
- [ Opcodes.local_get, 7 ],
767
- [ ...Opcodes.i16x8_replace_lane, 7 ],
768
- ]
769
- };
770
-
771
- this.__SIMD_i32x4_dot_i16x8 = {
772
- params: [ Valtype.v128, Valtype.v128 ],
773
- locals: [],
774
- returns: [ Valtype.v128 ],
775
- wasm: [
776
- [ Opcodes.local_get, 0 ],
777
- [ Opcodes.local_get, 1 ],
778
- [ ...Opcodes.i32x4_dot_i16x8_s ]
779
- ]
780
- };
781
-
782
- this.__SIMD_i32x4_create = {
783
- params: [ Valtype.i32, Valtype.i32, Valtype.i32, Valtype.i32 ],
784
- locals: [],
785
- returns: [ Valtype.v128 ],
786
- wasm: [
787
- ...i32x4(0, 0, 0, 0),
788
- [ Opcodes.local_get, 0 ],
789
- [ ...Opcodes.i32x4_replace_lane, 0 ],
790
- [ Opcodes.local_get, 1 ],
791
- [ ...Opcodes.i32x4_replace_lane, 1 ],
792
- [ Opcodes.local_get, 2 ],
793
- [ ...Opcodes.i32x4_replace_lane, 2 ],
794
- [ Opcodes.local_get, 3 ],
795
- [ ...Opcodes.i32x4_replace_lane, 3 ],
796
- ]
797
- };
798
-
799
- this.__SIMD_i32x4_add = {
800
- params: [ Valtype.v128, Valtype.v128 ],
801
- locals: [],
802
- returns: [ Valtype.v128 ],
803
- wasm: [
804
- [ Opcodes.local_get, 0 ],
805
- [ Opcodes.local_get, 1 ],
806
- [ ...Opcodes.i32x4_add ]
807
- ]
808
- };
809
-
810
- this.__SIMD_i32x4_sub = {
811
- params: [ Valtype.v128, Valtype.v128 ],
812
- locals: [],
813
- returns: [ Valtype.v128 ],
1056
+ returns: [ valtypeBinary ],
814
1057
  wasm: [
815
- [ Opcodes.local_get, 0 ],
816
1058
  [ Opcodes.local_get, 1 ],
817
- [ ...Opcodes.i32x4_sub ]
1059
+ Opcodes.i32_from_u
818
1060
  ]
819
1061
  };
820
1062
 
821
- this.__SIMD_i32x4_mul = {
822
- params: [ Valtype.v128, Valtype.v128 ],
1063
+ this.__Porffor_clone = {
1064
+ params: [ valtypeBinary, valtypeBinary ],
823
1065
  locals: [],
824
- returns: [ Valtype.v128 ],
1066
+ returns: [],
825
1067
  wasm: [
826
- [ Opcodes.local_get, 0 ],
1068
+ // dst
827
1069
  [ Opcodes.local_get, 1 ],
828
- [ ...Opcodes.i32x4_mul ]
829
- ]
830
- };
831
-
832
- this.__SIMD_i32x4_get0 = {
833
- params: [ Valtype.v128 ],
834
- locals: [],
835
- returns: [ Valtype.i32 ],
836
- wasm: [
837
- [ Opcodes.local_get, 0 ],
838
- [ ...Opcodes.i32x4_extract_lane, 0 ],
839
- ],
840
- },
841
-
842
- this.__SIMD_i32x4_get1 = {
843
- params: [ Valtype.v128 ],
844
- locals: [],
845
- returns: [ Valtype.i32 ],
846
- wasm: [
847
- [ Opcodes.local_get, 0 ],
848
- [ ...Opcodes.i32x4_extract_lane, 1 ],
849
- ],
850
- };
851
-
852
- this.__SIMD_i32x4_get2 = {
853
- params: [ Valtype.v128 ],
854
- locals: [],
855
- returns: [ Valtype.i32 ],
856
- wasm: [
857
- [ Opcodes.local_get, 0 ],
858
- [ ...Opcodes.i32x4_extract_lane, 2 ],
859
- ],
860
- };
861
-
862
- this.__SIMD_i32x4_get3 = {
863
- params: [ Valtype.v128 ],
864
- locals: [],
865
- returns: [ Valtype.i32 ],
866
- wasm: [
867
- [ Opcodes.local_get, 0 ],
868
- [ ...Opcodes.i32x4_extract_lane, 3 ],
869
- ],
870
- };
1070
+ Opcodes.i32_to_u,
871
1071
 
872
- this.__SIMD_i32x4_shuffle_000c = {
873
- params: [ Valtype.v128 ],
874
- locals: [],
875
- returns: [ Valtype.v128 ],
876
- wasm: [
1072
+ // src
877
1073
  [ Opcodes.local_get, 0 ],
878
- ...i32x4(0, 0, 0, 0),
879
- [ ...Opcodes.i8x16_shuffle, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 8, 9, 10, 11 ], // i32x4 (a, b, c, d) -> i32x4 (0, 0, 0, c)
880
- ]
881
- };
1074
+ Opcodes.i32_to_u,
882
1075
 
883
- this.__SIMD_i32x4_shuffle_00ab = {
884
- params: [ Valtype.v128 ],
885
- locals: [],
886
- returns: [ Valtype.v128 ],
887
- wasm: [
888
- [ Opcodes.local_get, 0 ],
889
- ...i32x4(0, 0, 0, 0),
890
- [ ...Opcodes.i8x16_shuffle, 16, 16, 16, 16, 16, 16, 16, 16, 0, 1, 2, 3, 4, 5, 6, 7 ], // i32x4 (a, b, c, d) -> i32x4 (0, 0, a, b)
1076
+ // size = pageSize
1077
+ ...number(pageSize, Valtype.i32),
1078
+ [ ...Opcodes.memory_copy, 0x00, 0x00 ],
891
1079
  ]
892
1080
  };
893
- };
894
-
895
- export const BuiltinPreludes = {
896
- btoa: `var keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
897
- var btoa = function (input) {
898
- // todo: throw invalid character for unicode
899
-
900
- let output = "";
901
- let chr1, chr2, chr3, enc1, enc2, enc3, enc4;
902
- let i = 0;
903
-
904
- while (i < input.length) {
905
- chr1 = input.charCodeAt(i++);
906
- chr2 = input.charCodeAt(i++);
907
- chr3 = input.charCodeAt(i++);
908
-
909
- enc1 = chr1 >> 2;
910
- enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
911
- enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
912
- enc4 = chr3 & 63;
913
-
914
- if (isNaN(chr2)) {
915
- enc3 = enc4 = 64;
916
- } else if (isNaN(chr3)) {
917
- enc4 = 64;
918
- }
919
-
920
- output += keyStr.charAt(enc1);
921
- output += keyStr.charAt(enc2);
922
- output += keyStr.charAt(enc3);
923
- output += keyStr.charAt(enc4);
924
- }
925
1081
 
926
- return output;
927
- };`
1082
+ GeneratedBuiltins.BuiltinFuncs.call(this);
928
1083
  };