porffor 0.2.0-6aff0fa → 0.2.0-767de65

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 (50) hide show
  1. package/.vscode/launch.json +18 -0
  2. package/LICENSE +20 -20
  3. package/README.md +54 -41
  4. package/asur/index.js +624 -340
  5. package/byg/index.js +237 -0
  6. package/compiler/2c.js +1 -1
  7. package/compiler/{sections.js → assemble.js} +57 -10
  8. package/compiler/builtins/annexb_string.js +72 -0
  9. package/compiler/builtins/annexb_string.ts +19 -0
  10. package/compiler/builtins/array.ts +145 -0
  11. package/compiler/builtins/base64.ts +3 -5
  12. package/compiler/builtins/crypto.ts +120 -0
  13. package/compiler/builtins/escape.ts +141 -0
  14. package/compiler/builtins/int.ts +147 -0
  15. package/compiler/builtins/number.ts +527 -0
  16. package/compiler/builtins/porffor.d.ts +27 -8
  17. package/compiler/builtins/string.ts +1055 -0
  18. package/compiler/builtins/tostring.ts +45 -0
  19. package/compiler/builtins.js +405 -108
  20. package/compiler/{codeGen.js → codegen.js} +654 -246
  21. package/compiler/embedding.js +22 -22
  22. package/compiler/encoding.js +108 -10
  23. package/compiler/generated_builtins.js +682 -2
  24. package/compiler/index.js +16 -14
  25. package/compiler/log.js +2 -2
  26. package/compiler/opt.js +23 -22
  27. package/compiler/parse.js +31 -25
  28. package/compiler/precompile.js +19 -25
  29. package/compiler/prefs.js +2 -2
  30. package/compiler/prototype.js +2 -18
  31. package/compiler/types.js +37 -0
  32. package/compiler/wasmSpec.js +13 -1
  33. package/compiler/wrap.js +36 -42
  34. package/empty.js +0 -0
  35. package/hello.js +2 -0
  36. package/package.json +9 -5
  37. package/porf +2 -0
  38. package/rhemyn/compile.js +3 -2
  39. package/rhemyn/parse.js +323 -320
  40. package/rhemyn/test/parse.js +58 -58
  41. package/runner/compare.js +34 -34
  42. package/runner/debug.js +122 -0
  43. package/runner/index.js +26 -10
  44. package/runner/profiler.js +45 -26
  45. package/runner/repl.js +40 -7
  46. package/runner/sizes.js +37 -37
  47. package/test262_changes_from_1afe9b87d2_to_04-09.md +270 -0
  48. package/runner/info.js +0 -89
  49. package/runner/transform.js +0 -15
  50. package/util/enum.js +0 -20
@@ -0,0 +1,45 @@
1
+ // // @porf -funsafe-no-unlikely-proto-checks -valtype=i32
2
+
3
+ export const __Boolean_prototype_toString = (_this: boolean) => {
4
+ let out: bytestring = '';
5
+ if (_this) out = 'true';
6
+ else out = 'false';
7
+
8
+ return out;
9
+ };
10
+
11
+ export const __String_prototype_toString = (_this: string) => {
12
+ let out: string = Porffor.s``;
13
+ Porffor.clone(_this, out);
14
+ return out;
15
+ };
16
+
17
+ export const ___bytestring_prototype_toString = (_this: bytestring) => {
18
+ let out: bytestring = Porffor.bs``;
19
+ Porffor.clone(_this, out);
20
+ return out;
21
+ };
22
+
23
+ // // export const __undefined_prototype_toString = (_this: number) => {
24
+
25
+ // // };
26
+
27
+ export const __Object_prototype_toString = (_this: object) => {
28
+ let out: bytestring = '[object Object]';
29
+ return out;
30
+ };
31
+
32
+ export const __Function_prototype_toString = (_this: Function) => {
33
+ // todo: actually use source
34
+ let out: bytestring = 'function () {}';
35
+ return out;
36
+ };
37
+
38
+
39
+ // // export const ___array_prototype_toString = (_this: any[]) => {
40
+ // // return _this.join();
41
+ // // };
42
+
43
+ // // export const ___regexp_prototype_toString = (_this: number) => {
44
+
45
+ // // };
@@ -2,6 +2,7 @@ import { Blocktype, Opcodes, Valtype, ValtypeSize } from "./wasmSpec.js";
2
2
  import { number, i32x4 } from "./embedding.js";
3
3
  import Prefs from './prefs.js';
4
4
  import * as GeneratedBuiltins from './generated_builtins.js';
5
+ import { TYPES } from './types.js';
5
6
 
6
7
  export const importedFuncs = [
7
8
  {
@@ -23,12 +24,18 @@ export const importedFuncs = [
23
24
  returns: 1
24
25
  },
25
26
  {
26
- name: 'profile',
27
+ name: 'profile1',
28
+ import: 'y',
29
+ params: 1,
30
+ returns: 0
31
+ },
32
+ {
33
+ name: 'profile2',
27
34
  import: 'z',
28
35
  params: 1,
29
36
  returns: 0
30
37
  }
31
- ].filter(x => x);
38
+ ];
32
39
 
33
40
  for (let i = 0; i < importedFuncs.length; i++) {
34
41
  const f = importedFuncs[i];
@@ -58,10 +65,10 @@ export const NULL = 0;
58
65
 
59
66
  export const BuiltinVars = function() {
60
67
  this.undefined = number(UNDEFINED);
61
- this.undefined.type = 'undefined';
68
+ this.undefined.type = TYPES.undefined;
62
69
 
63
70
  this.null = number(NULL);
64
- this.null.type = 'object';
71
+ this.null.type = TYPES.object;
65
72
 
66
73
  this.NaN = number(NaN);
67
74
  this.NaN.floatOnly = true;
@@ -128,7 +135,11 @@ export const BuiltinVars = function() {
128
135
 
129
136
  // wintercg(tm)
130
137
  this.__navigator_userAgent = (scope, { makeString }) => makeString(scope, `Porffor/0.2.0`, false, '__navigator_userAgent');
131
- this.__navigator_userAgent.type = Prefs.bytestring ? '_bytestring' : 'string';
138
+ this.__navigator_userAgent.type = Prefs.bytestring ? TYPES._bytestring : TYPES.string;
139
+
140
+ for (const x in TYPES) {
141
+ this['__Porffor_TYPES_' + x] = number(TYPES[x]);
142
+ }
132
143
  };
133
144
 
134
145
  export const BuiltinFuncs = function() {
@@ -187,9 +198,10 @@ export const BuiltinFuncs = function() {
187
198
  params: [ valtypeBinary ],
188
199
  locals: [],
189
200
  returns: [ valtypeBinary ],
190
- returnType: 'object',
201
+ returnType: TYPES.object,
191
202
  wasm: [
192
- [ Opcodes.local_get, 0 ]
203
+ // [ Opcodes.local_get, 0 ]
204
+ ...number(1)
193
205
  ]
194
206
  };
195
207
 
@@ -199,7 +211,7 @@ export const BuiltinFuncs = function() {
199
211
  typedParams: true,
200
212
  locals: [ Valtype.i32, Valtype.i32 ],
201
213
  returns: [],
202
- wasm: (scope, { TYPES, typeSwitch }) => [
214
+ wasm: (scope, { typeSwitch }) => [
203
215
  ...typeSwitch(scope, [ [ Opcodes.local_get, 1 ] ], {
204
216
  [TYPES.number]: [
205
217
  [ Opcodes.local_get, 0 ],
@@ -361,7 +373,7 @@ export const BuiltinFuncs = function() {
361
373
  params: [ valtypeBinary ],
362
374
  locals: [],
363
375
  returns: [ valtypeBinary ],
364
- returnType: 'boolean',
376
+ returnType: TYPES.boolean,
365
377
  wasm: [
366
378
  [ Opcodes.local_get, 0 ],
367
379
  [ Opcodes.local_get, 0 ],
@@ -376,7 +388,7 @@ export const BuiltinFuncs = function() {
376
388
  params: [ valtypeBinary ],
377
389
  locals: [ valtypeBinary ],
378
390
  returns: [ valtypeBinary ],
379
- returnType: 'boolean',
391
+ returnType: TYPES.boolean,
380
392
  wasm: [
381
393
  [ Opcodes.local_get, 0 ],
382
394
  [ Opcodes.local_get, 0 ],
@@ -395,7 +407,7 @@ export const BuiltinFuncs = function() {
395
407
  params: [ valtypeBinary ],
396
408
  locals: [],
397
409
  returns: [ valtypeBinary ],
398
- returnType: 'boolean',
410
+ returnType: TYPES.boolean,
399
411
  wasm: [
400
412
  [ Opcodes.local_get, 0 ],
401
413
  [ Opcodes.local_get, 0 ],
@@ -410,7 +422,7 @@ export const BuiltinFuncs = function() {
410
422
  params: [ valtypeBinary ],
411
423
  locals: [],
412
424
  returns: [ valtypeBinary ],
413
- returnType: 'boolean',
425
+ returnType: TYPES.boolean,
414
426
  wasm: [
415
427
  [ Opcodes.local_get, 0 ],
416
428
  [ Opcodes.local_get, 0 ],
@@ -550,61 +562,314 @@ export const BuiltinFuncs = function() {
550
562
 
551
563
  // this is an implementation of xorshift128+ (in wasm bytecode)
552
564
  // fun fact: v8, SM, JSC also use this (you will need this fun fact to maintain your sanity reading this code)
553
- const prngSeed0 = Math.floor(Math.random() * Number.MAX_SAFE_INTEGER), prngSeed1 = Math.floor(Math.random() * Number.MAX_SAFE_INTEGER);
565
+ // const prngSeed0 = Math.floor(Math.random() * Number.MAX_SAFE_INTEGER), prngSeed1 = Math.floor(Math.random() * Number.MAX_SAFE_INTEGER);
566
+ const prngSeed0 = (Math.random() * (2 ** 30)) | 0, prngSeed1 = (Math.random() * (2 ** 30)) | 0;
567
+
568
+ const prng = ({
569
+ 'lcg32_glibc': {
570
+ globals: [ Valtype.i32 ],
571
+ locals: [],
572
+ returns: Valtype.i32,
573
+ wasm: [
574
+ // seed = (MULTIPLIER * seed + INCREMENT) % MODULUS
575
+ // MULTIPLIER * state0
576
+ [ Opcodes.global_get, 0 ],
577
+ ...number(1103515245, Valtype.i32),
578
+ [ Opcodes.i32_mul ],
579
+
580
+ // + INCREMENT
581
+ ...number(12345, Valtype.i32),
582
+ [ Opcodes.i32_add ],
583
+
584
+ // % MODULUS
585
+ ...number(2 ** 31, Valtype.i32),
586
+ [ Opcodes.i32_rem_s ],
587
+
588
+ // state0 =
589
+ [ Opcodes.global_set, 0 ],
590
+
591
+ // state0
592
+ [ Opcodes.global_get, 0 ],
593
+ ],
594
+ },
595
+ 'lcg32_minstd': {
596
+ globals: [ Valtype.i32 ],
597
+ locals: [],
598
+ returns: Valtype.i32,
599
+ wasm: [
600
+ // seed = (MULTIPLIER * seed + INCREMENT) % MODULUS
601
+ // MULTIPLIER * state0
602
+ [ Opcodes.global_get, 0 ],
603
+ ...number(48271, Valtype.i32),
604
+ [ Opcodes.i32_mul ],
605
+
606
+ // % MODULUS
607
+ ...number((2 ** 31) - 1, Valtype.i32),
608
+ [ Opcodes.i32_rem_s ],
609
+
610
+ // state0 =
611
+ [ Opcodes.global_set, 0 ],
612
+
613
+ // state0
614
+ [ Opcodes.global_get, 0 ],
615
+ ],
616
+ },
617
+ 'lcg64_musl': 0, // todo
618
+
619
+ 'xorshift32+': {
620
+ globals: [ Valtype.i32 ],
621
+ locals: [ Valtype.i32 ],
622
+ returns: Valtype.i32,
623
+ wasm: [
624
+ // setup: s1 = state0
625
+ [ Opcodes.global_get, 0 ], // state0
626
+ [ Opcodes.local_tee, 0 ], // s1
627
+
628
+ // s1 ^= s1 << 13
629
+ [ Opcodes.local_get, 0 ], // s1
630
+ [ Opcodes.i32_const, 13 ],
631
+ [ Opcodes.i32_shl ], // <<
632
+ [ Opcodes.i32_xor ], // ^
633
+ [ Opcodes.local_tee, 0 ], // s1
634
+
635
+ // s1 ^= s1 >> 17
636
+ [ Opcodes.local_get, 0 ], // s1
637
+ [ Opcodes.i32_const, 17 ],
638
+ [ Opcodes.i32_shr_s ], // >>
639
+ [ Opcodes.i32_xor ], // ^
640
+ [ Opcodes.local_tee, 0 ], // s1
641
+
642
+ // s1 ^= s1 << 5
643
+ [ Opcodes.local_get, 0 ], // s1
644
+ [ Opcodes.i32_const, 5 ],
645
+ [ Opcodes.i32_shl ], // <<
646
+ [ Opcodes.i32_xor ], // ^
647
+ [ Opcodes.local_tee, 0 ], // s1
648
+
649
+ // state0 = s1
650
+ [ Opcodes.global_set, 0 ],
651
+
652
+ // s1
653
+ [ Opcodes.local_get, 0 ],
654
+ ],
655
+ },
656
+
657
+ 'xorshift64+': {
658
+ globals: [ Valtype.i64 ],
659
+ locals: [ Valtype.i64 ],
660
+ returns: Valtype.i64,
661
+ wasm: [
662
+ // setup: s1 = state0
663
+ [ Opcodes.global_get, 0 ], // state0
664
+ [ Opcodes.local_tee, 0 ], // s1
665
+
666
+ // s1 ^= s1 >> 12
667
+ [ Opcodes.local_get, 0 ], // s1
668
+ [ Opcodes.i64_const, 12 ],
669
+ [ Opcodes.i64_shr_s ], // >>
670
+ [ Opcodes.i64_xor ], // ^
671
+ [ Opcodes.local_tee, 0 ], // s1
672
+
673
+ // s1 ^= s1 << 25
674
+ [ Opcodes.local_get, 0 ], // s1
675
+ [ Opcodes.i64_const, 25 ],
676
+ [ Opcodes.i64_shl ], // <<
677
+ [ Opcodes.i64_xor ], // ^
678
+ [ Opcodes.local_tee, 0 ], // s1
679
+
680
+ // s1 ^= s1 >> 27
681
+ [ Opcodes.local_get, 0 ], // s1
682
+ [ Opcodes.i64_const, 27 ],
683
+ [ Opcodes.i64_shr_s ], // >>
684
+ [ Opcodes.i64_xor ], // ^
685
+ [ Opcodes.local_tee, 0 ], // s1
686
+
687
+ // state0 = s1
688
+ [ Opcodes.global_set, 0 ],
689
+
690
+ // // s1 * 0x2545F4914F6CDD1D
691
+ // [ Opcodes.local_get, 0 ],
692
+ // [ Opcodes.i64_const, 0x9d, 0xba, 0xb3, 0xfb, 0x94, 0x92, 0xfd, 0xa2, 0x25 ],
693
+ // [ Opcodes.i64_mul ]
694
+
695
+ // s1
696
+ [ Opcodes.local_get, 0 ],
697
+ ],
698
+ },
699
+
700
+ 'xorshift128+': {
701
+ globals: [ Valtype.i64, Valtype.i64 ],
702
+ locals: [ Valtype.i64, Valtype.i64 ],
703
+ returns: Valtype.i64,
704
+ wasm: [
705
+ // setup: s1 = state0, s0 = state1, state0 = s0
706
+ [ Opcodes.global_get, 0 ], // state0
707
+ [ Opcodes.local_tee, 0 ], // s1
708
+ [ Opcodes.global_get, 1 ], // state1
709
+ [ Opcodes.local_tee, 1, ], // s0
710
+ [ Opcodes.global_set, 0 ], // state0
711
+
712
+ // s1 ^= s1 << 23
713
+ // [ Opcodes.local_get, 0 ], // s1
714
+ [ Opcodes.local_get, 0 ], // s1
715
+ [ Opcodes.i64_const, 23 ],
716
+ [ Opcodes.i64_shl ], // <<
717
+ [ Opcodes.i64_xor ], // ^
718
+ [ Opcodes.local_set, 0 ], // s1
719
+
720
+ // state1 = s1 ^ s0 ^ (s1 >> 17) ^ (s0 >> 26)
721
+ // s1 ^ s0
722
+ [ Opcodes.local_get, 0 ], // s1
723
+ [ Opcodes.local_get, 1 ], // s0
724
+ [ Opcodes.i64_xor ], // ^
725
+
726
+ // ^ (s1 >> 17)
727
+ [ Opcodes.local_get, 0 ], // s1
728
+ [ Opcodes.i64_const, 17 ],
729
+ [ Opcodes.i64_shr_u ], // >>
730
+ [ Opcodes.i64_xor ], // ^
731
+
732
+ // ^ (s0 >> 26)
733
+ [ Opcodes.local_get, 1 ], // s0
734
+ [ Opcodes.i64_const, 26 ],
735
+ [ Opcodes.i64_shr_u ], // >>
736
+ [ Opcodes.i64_xor ], // ^
737
+
738
+ // state1 =
739
+ [ Opcodes.global_set, 1 ],
740
+
741
+ // state1 + s0
742
+ [ Opcodes.global_get, 1 ], // state1
743
+ [ Opcodes.local_get, 1 ], // s0
744
+ [ Opcodes.i64_add ]
745
+ ]
746
+ },
747
+
748
+ 'xoroshiro128+': {
749
+ globals: [ Valtype.i64, Valtype.i64 ],
750
+ locals: [ Valtype.i64, Valtype.i64, Valtype.i64 ],
751
+ returns: Valtype.i64,
752
+ wasm: [
753
+ // setup: s1 = state1, s0 = state0
754
+ [ Opcodes.global_get, 1 ], // state0
755
+ [ Opcodes.local_tee, 0 ], // s1
756
+ [ Opcodes.global_get, 0 ], // state1
757
+ [ Opcodes.local_tee, 1, ], // s0
758
+
759
+ // result = s0 + s1
760
+ [ Opcodes.i64_add ],
761
+ [ Opcodes.local_set, 2 ], // result
762
+
763
+ // s1 ^= s0
764
+ [ Opcodes.local_get, 0 ], // s1
765
+ [ Opcodes.local_get, 1 ], // s0
766
+ [ Opcodes.i64_xor ],
767
+ [ Opcodes.local_set, 0 ], // s1
768
+
769
+ // state0 = rotl(s0, 24) ^ s1 ^ (s1 << 16)
770
+
771
+ // rotl(s0, 24) ^ s1
772
+ [ Opcodes.local_get, 1 ], // s0
773
+ ...number(24, Valtype.i64),
774
+ [ Opcodes.i64_rotl ],
775
+ [ Opcodes.local_get, 0 ], // s1
776
+ [ Opcodes.i64_xor ],
777
+
778
+ // ^ (s1 << 16)
779
+ [ Opcodes.local_get, 0 ], // s1
780
+ ...number(16, Valtype.i64),
781
+ [ Opcodes.i64_shl ],
782
+ [ Opcodes.i64_xor ],
783
+
784
+ // state0 =
785
+ [ Opcodes.global_set, 0 ], // state0
786
+
787
+ // state1 = rotl(s1, 37)
788
+ [ Opcodes.local_get, 0 ], // s1
789
+ ...number(37, Valtype.i64),
790
+ [ Opcodes.i64_rotl ],
791
+ [ Opcodes.global_set, 1 ], // state1
792
+
793
+ // result
794
+ [ Opcodes.local_get, 2 ],
795
+ ]
796
+ },
797
+
798
+ 'xoshiro128+': {
799
+ globals: [ Valtype.i32, Valtype.i32, Valtype.i32, Valtype.i32 ],
800
+ locals: [ Valtype.i32, Valtype.i32 ],
801
+ returns: Valtype.i32,
802
+ wasm: [
803
+ // result = state0 + state3
804
+ [ Opcodes.global_get, 0 ], // state0
805
+ [ Opcodes.global_get, 3 ], // state0
806
+ [ Opcodes.i32_add ],
807
+ [ Opcodes.local_set, 0 ], // result
808
+
809
+ // t = state1 << 9
810
+ [ Opcodes.global_get, 1 ], // state1
811
+ ...number(9, Valtype.i32),
812
+ [ Opcodes.i32_shl ],
813
+ [ Opcodes.local_set, 1 ], // t
814
+
815
+ // state2 ^= state0
816
+ [ Opcodes.global_get, 2 ], // state2
817
+ [ Opcodes.global_get, 0 ], // state0
818
+ [ Opcodes.i32_xor ],
819
+ [ Opcodes.global_set, 2 ], // state2
820
+
821
+ // state3 ^= state1
822
+ [ Opcodes.global_get, 3 ], // state3
823
+ [ Opcodes.global_get, 1 ], // state1
824
+ [ Opcodes.i32_xor ],
825
+ [ Opcodes.global_set, 3 ], // state3
826
+
827
+ // state1 ^= state2
828
+ [ Opcodes.global_get, 1 ], // state1
829
+ [ Opcodes.global_get, 2 ], // state2
830
+ [ Opcodes.i32_xor ],
831
+ [ Opcodes.global_set, 1 ], // state1
832
+
833
+ // state0 ^= state3
834
+ [ Opcodes.global_get, 0 ], // state2
835
+ [ Opcodes.global_get, 3 ], // state0
836
+ [ Opcodes.i32_xor ],
837
+ [ Opcodes.global_set, 0 ], // state2
838
+
839
+ // state2 ^= t
840
+ [ Opcodes.global_get, 2 ], // state2
841
+ [ Opcodes.local_get, 1 ], // t
842
+ [ Opcodes.i32_xor ],
843
+ [ Opcodes.global_set, 2 ], // state2
844
+
845
+ // state3 = rotl(state3, 11)
846
+ [ Opcodes.global_get, 3 ], // state3
847
+ ...number(11, Valtype.i32),
848
+ [ Opcodes.i32_rotl ],
849
+ [ Opcodes.global_set, 3 ], // state3
850
+
851
+ // result
852
+ [ Opcodes.local_get, 0 ],
853
+ ]
854
+ }
855
+ })[Prefs.prng ?? 'xorshift128+'];
856
+
857
+ if (!prng) throw new Error(`unknown prng algo: ${Prefs.prng}`);
554
858
 
555
859
  this.__Math_random = {
556
860
  floatOnly: true,
557
861
  params: [],
558
- locals: [ Valtype.i64, Valtype.i64 ],
862
+ locals: prng.locals,
559
863
  localNames: [ 's1', 's0' ],
560
- globals: [ Valtype.i64, Valtype.i64 ],
864
+ globals: prng.globals,
561
865
  globalNames: [ 'state0', 'state1' ],
562
866
  globalInits: [ prngSeed0, prngSeed1 ],
563
867
  returns: [ Valtype.f64 ],
564
868
  wasm: [
565
- // setup: s1 = state0, s0 = state1, state0 = s0
566
- [ Opcodes.global_get, 0 ], // state0
567
- [ Opcodes.local_tee, 0 ], // s1
568
- [ Opcodes.global_get, 1 ], // state1
569
- [ Opcodes.local_tee, 1, ], // s0
570
- [ Opcodes.global_set, 0 ], // state0
571
-
572
- // s1 ^= s1 << 23
573
- // [ Opcodes.local_get, 0 ], // s1
574
- [ Opcodes.local_get, 0 ], // s1
575
- [ Opcodes.i64_const, 23 ],
576
- [ Opcodes.i64_shl ], // <<
577
- [ Opcodes.i64_xor ], // ^
578
- [ Opcodes.local_set, 0 ], // s1
579
-
580
- // state1 = s1 ^ s0 ^ (s1 >> 17) ^ (s0 >> 26)
581
- // s1 ^ s0
582
- [ Opcodes.local_get, 0 ], // s1
583
- [ Opcodes.local_get, 1 ], // s0
584
- [ Opcodes.i64_xor ], // ^
585
-
586
- // ^ (s1 >> 17)
587
- [ Opcodes.local_get, 0 ], // s1
588
- [ Opcodes.i64_const, 17 ],
589
- [ Opcodes.i64_shr_u ], // >>
590
- [ Opcodes.i64_xor ], // ^
591
-
592
- // ^ (s0 >> 26)
593
- [ Opcodes.local_get, 1 ], // s0
594
- [ Opcodes.i64_const, 26 ],
595
- [ Opcodes.i64_shr_u ], // >>
596
- [ Opcodes.i64_xor ], // ^
597
-
598
- // state1 =
599
- [ Opcodes.global_set, 1 ],
869
+ ...prng.wasm,
600
870
 
601
871
  // you thought it was over? now we need the result as a f64 between 0-1 :)
602
872
 
603
- // state1 + s0
604
- [ Opcodes.global_get, 1 ], // state1
605
- [ Opcodes.local_get, 1 ], // s0
606
- [ Opcodes.i64_add ],
607
-
608
873
  // should we >> 12 here?
609
874
  // it feels like it but it breaks values
610
875
 
@@ -619,15 +884,72 @@ export const BuiltinFuncs = function() {
619
884
  // ...number(1),
620
885
  // [ Opcodes.f64_sub ],
621
886
 
622
- ...number((1 << 53) - 1, Valtype.i64),
623
- [ Opcodes.i64_and ],
887
+ ...(prng.returns === Valtype.i64 ? [
888
+ ...number((1 << 53) - 1, Valtype.i64),
889
+ [ Opcodes.i64_and ],
890
+
891
+ // double(mantissa)
892
+ [ Opcodes.f64_convert_i64_u ],
624
893
 
625
- // double(mantissa)
626
- [ Opcodes.f64_convert_i64_u ],
894
+ // / (1 << 53)
895
+ ...number(1 << 53),
896
+ [ Opcodes.f64_div ]
897
+ ] : [
898
+ ...number((1 << 21) - 1, Valtype.i32),
899
+ [ Opcodes.i32_and ],
627
900
 
628
- // / (1 << 53)
629
- ...number(1 << 53),
630
- [ Opcodes.f64_div ]
901
+ // double(mantissa)
902
+ [ Opcodes.f64_convert_i32_u ],
903
+
904
+ // / (1 << 21)
905
+ ...number(1 << 21),
906
+ [ Opcodes.f64_div ]
907
+ ])
908
+ ]
909
+ };
910
+
911
+ // this.__Porffor_randomInt = {
912
+ // params: [],
913
+ // locals: prng.locals,
914
+ // localNames: [ 's1', 's0' ],
915
+ // globals: prng.globals,
916
+ // globalNames: [ 'state0', 'state1' ],
917
+ // globalInits: [ prngSeed0, prngSeed1 ],
918
+ // returns: [ Valtype.i32 ],
919
+ // wasm: [
920
+ // ...prng.wasm,
921
+
922
+ // ...(prng.returns === Valtype.i64 ? [
923
+ // // the lowest bits of the output generated by xorshift128+ have low quality
924
+ // ...number(56, Valtype.i64),
925
+ // [ Opcodes.i64_shr_u ],
926
+
927
+ // [ Opcodes.i32_wrap_i64 ],
928
+ // ] : []),
929
+ // ]
930
+ // };
931
+
932
+ this.__Porffor_randomByte = {
933
+ params: [],
934
+ locals: prng.locals,
935
+ localNames: [ 's1', 's0' ],
936
+ globals: prng.globals,
937
+ globalNames: [ 'state0', 'state1' ],
938
+ globalInits: [ prngSeed0, prngSeed1 ],
939
+ returns: [ Valtype.i32 ],
940
+ wasm: [
941
+ ...prng.wasm,
942
+
943
+ ...(prng.returns === Valtype.i64 ? [
944
+ // the lowest bits of the output generated by xorshift128+ have low quality
945
+ ...number(56, Valtype.i64),
946
+ [ Opcodes.i64_shr_u ],
947
+
948
+ [ Opcodes.i32_wrap_i64 ],
949
+ ] : []),
950
+
951
+ ...number(0xff, Valtype.i32),
952
+ [ Opcodes.i32_and ],
631
953
  ]
632
954
  };
633
955
 
@@ -706,7 +1028,7 @@ export const BuiltinFuncs = function() {
706
1028
  params: [ valtypeBinary ],
707
1029
  locals: [],
708
1030
  returns: [ valtypeBinary ],
709
- returnType: 'boolean',
1031
+ returnType: TYPES.boolean,
710
1032
  wasm: [
711
1033
  [ Opcodes.local_get, 0 ],
712
1034
  ...number(0),
@@ -731,7 +1053,7 @@ export const BuiltinFuncs = function() {
731
1053
  typedParams: true,
732
1054
  locals: [ Valtype.i32, Valtype.i32 ],
733
1055
  returns: [ valtypeBinary ],
734
- returnType: Prefs.bytestring ? '_bytestring' : 'string',
1056
+ returnType: Prefs.bytestring ? TYPES._bytestring : TYPES.string,
735
1057
  wasm: (scope, { TYPE_NAMES, typeSwitch, makeString }) => {
736
1058
  const bc = {};
737
1059
  for (const x in TYPE_NAMES) {
@@ -742,60 +1064,35 @@ export const BuiltinFuncs = function() {
742
1064
  }
743
1065
  };
744
1066
 
745
- const localIsOneOf = (getter, arr, valtype = valtypeBinary) => {
746
- const out = [];
747
-
748
- for (let i = 0; i < arr.length; i++) {
749
- out.push(...getter, ...number(arr[i], valtype), valtype === Valtype.f64 ? [ Opcodes.f64_eq ] : [ Opcodes.i32_eq ]);
750
- if (i !== 0) out.push([ Opcodes.i32_or ]);
751
- }
752
-
753
- return out;
754
- };
755
-
756
- this.__Porffor_ptr = {
1067
+ this.__Porffor_rawType = {
757
1068
  params: [ valtypeBinary, Valtype.i32 ],
758
1069
  typedParams: true,
759
- locals: [ Valtype.i32, Valtype.i32 ],
1070
+ locals: [],
760
1071
  returns: [ valtypeBinary ],
761
- wasm: (scope, { TYPES }) => [
762
- ...localIsOneOf([ [ Opcodes.local_get, 1 ] ], [ TYPES.string, TYPES._array, TYPES._bytestring ], Valtype.i32),
763
- [ Opcodes.if, valtypeBinary ],
764
- [ Opcodes.local_get, 0 ],
765
- [ Opcodes.else ],
766
- ...number(NaN),
767
- [ Opcodes.end ]
768
- ]
769
- };
770
-
771
- this.__Porffor_i32_ptr = {
772
- params: [ Valtype.i32, Valtype.i32 ],
773
- typedParams: true,
774
- locals: [ Valtype.i32, Valtype.i32 ],
775
- returns: [ Valtype.i32 ],
776
- wasm: (scope, { TYPES }) => [
777
- ...localIsOneOf([ [ Opcodes.local_get, 1 ] ], [ TYPES.string, TYPES._array, TYPES._bytestring ], Valtype.i32),
778
- [ Opcodes.if, Valtype.i32 ],
779
- [ Opcodes.local_get, 0 ],
780
- [ Opcodes.else ],
781
- ...number(-1, Valtype.i32),
782
- [ Opcodes.end ]
1072
+ wasm: [
1073
+ [ Opcodes.local_get, 1 ],
1074
+ Opcodes.i32_from_u
783
1075
  ]
784
1076
  };
785
1077
 
786
- // unsafe: does not check type just ~casts to number
787
- this.__Porffor_i32_ptrUnsafe = {
788
- params: [ Valtype.i32 ],
1078
+ this.__Porffor_clone = {
1079
+ params: [ valtypeBinary, valtypeBinary ],
789
1080
  locals: [],
790
- returns: [ Valtype.i32 ],
1081
+ returns: [],
791
1082
  wasm: [
1083
+ // dst
1084
+ [ Opcodes.local_get, 1 ],
1085
+ Opcodes.i32_to_u,
1086
+
1087
+ // src
792
1088
  [ Opcodes.local_get, 0 ],
1089
+ Opcodes.i32_to_u,
1090
+
1091
+ // size = pageSize
1092
+ ...number(pageSize, Valtype.i32),
1093
+ [ ...Opcodes.memory_copy, 0x00, 0x00 ],
793
1094
  ]
794
1095
  };
795
1096
 
796
-
797
- const generated = new GeneratedBuiltins.BuiltinFuncs();
798
- for (const x in generated) {
799
- this[x] = generated[x];
800
- }
1097
+ GeneratedBuiltins.BuiltinFuncs.call(this);
801
1098
  };