porffor 0.2.0-2265539 → 0.2.0-22b3092

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 (56) hide show
  1. package/.vscode/launch.json +18 -0
  2. package/LICENSE +20 -20
  3. package/README.md +61 -43
  4. package/asur/README.md +2 -0
  5. package/asur/index.js +1262 -0
  6. package/byg/index.js +237 -0
  7. package/compiler/2c.js +1 -1
  8. package/compiler/{sections.js → assemble.js} +57 -10
  9. package/compiler/builtins/annexb_string.js +72 -0
  10. package/compiler/builtins/annexb_string.ts +19 -0
  11. package/compiler/builtins/array.ts +145 -0
  12. package/compiler/builtins/base64.ts +49 -39
  13. package/compiler/builtins/crypto.ts +120 -0
  14. package/compiler/builtins/escape.ts +141 -0
  15. package/compiler/builtins/int.ts +147 -0
  16. package/compiler/builtins/number.ts +527 -0
  17. package/compiler/builtins/porffor.d.ts +26 -19
  18. package/compiler/builtins/string.ts +1055 -0
  19. package/compiler/builtins/tostring.ts +45 -0
  20. package/compiler/builtins.js +412 -105
  21. package/compiler/{codeGen.js → codegen.js} +674 -287
  22. package/compiler/embedding.js +22 -22
  23. package/compiler/encoding.js +108 -10
  24. package/compiler/generated_builtins.js +684 -4
  25. package/compiler/index.js +16 -14
  26. package/compiler/log.js +6 -3
  27. package/compiler/opt.js +23 -22
  28. package/compiler/parse.js +31 -25
  29. package/compiler/precompile.js +19 -25
  30. package/compiler/prefs.js +2 -2
  31. package/compiler/prototype.js +2 -18
  32. package/compiler/types.js +37 -0
  33. package/compiler/wasmSpec.js +27 -8
  34. package/compiler/wrap.js +46 -45
  35. package/package.json +9 -5
  36. package/porf +2 -0
  37. package/rhemyn/compile.js +3 -2
  38. package/rhemyn/parse.js +323 -320
  39. package/rhemyn/test/parse.js +58 -58
  40. package/runner/compare.js +34 -34
  41. package/runner/debug.js +122 -0
  42. package/runner/index.js +31 -9
  43. package/runner/profiler.js +102 -0
  44. package/runner/repl.js +40 -7
  45. package/runner/sizes.js +37 -37
  46. package/test262_changes_from_1afe9b87d2_to_04-09.md +270 -0
  47. package/demo.js +0 -3
  48. package/demo.ts +0 -1
  49. package/filesize.cmd +0 -2
  50. package/hello +0 -0
  51. package/runner/info.js +0 -89
  52. package/runner/profile.js +0 -46
  53. package/runner/results.json +0 -1
  54. package/runner/transform.js +0 -15
  55. package/tmp.c +0 -152
  56. 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
  {
@@ -21,6 +22,18 @@ export const importedFuncs = [
21
22
  import: 't',
22
23
  params: 0,
23
24
  returns: 1
25
+ },
26
+ {
27
+ name: 'profile1',
28
+ import: 'y',
29
+ params: 1,
30
+ returns: 0
31
+ },
32
+ {
33
+ name: 'profile2',
34
+ import: 'z',
35
+ params: 1,
36
+ returns: 0
24
37
  }
25
38
  ];
26
39
 
@@ -52,10 +65,10 @@ export const NULL = 0;
52
65
 
53
66
  export const BuiltinVars = function() {
54
67
  this.undefined = number(UNDEFINED);
55
- this.undefined.type = 'undefined';
68
+ this.undefined.type = TYPES.undefined;
56
69
 
57
70
  this.null = number(NULL);
58
- this.null.type = 'object';
71
+ this.null.type = TYPES.object;
59
72
 
60
73
  this.NaN = number(NaN);
61
74
  this.NaN.floatOnly = true;
@@ -119,6 +132,14 @@ export const BuiltinVars = function() {
119
132
 
120
133
  // stubs just so that parent objects exist
121
134
  this.Math = number(1);
135
+
136
+ // wintercg(tm)
137
+ this.__navigator_userAgent = (scope, { makeString }) => makeString(scope, `Porffor/0.2.0`, false, '__navigator_userAgent');
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
+ }
122
143
  };
123
144
 
124
145
  export const BuiltinFuncs = function() {
@@ -177,9 +198,10 @@ export const BuiltinFuncs = function() {
177
198
  params: [ valtypeBinary ],
178
199
  locals: [],
179
200
  returns: [ valtypeBinary ],
180
- returnType: 'object',
201
+ returnType: TYPES.object,
181
202
  wasm: [
182
- [ Opcodes.local_get, 0 ]
203
+ // [ Opcodes.local_get, 0 ]
204
+ ...number(1)
183
205
  ]
184
206
  };
185
207
 
@@ -189,7 +211,7 @@ export const BuiltinFuncs = function() {
189
211
  typedParams: true,
190
212
  locals: [ Valtype.i32, Valtype.i32 ],
191
213
  returns: [],
192
- wasm: (scope, { TYPES, typeSwitch }) => [
214
+ wasm: (scope, { typeSwitch }) => [
193
215
  ...typeSwitch(scope, [ [ Opcodes.local_get, 1 ] ], {
194
216
  [TYPES.number]: [
195
217
  [ Opcodes.local_get, 0 ],
@@ -351,7 +373,7 @@ export const BuiltinFuncs = function() {
351
373
  params: [ valtypeBinary ],
352
374
  locals: [],
353
375
  returns: [ valtypeBinary ],
354
- returnType: 'boolean',
376
+ returnType: TYPES.boolean,
355
377
  wasm: [
356
378
  [ Opcodes.local_get, 0 ],
357
379
  [ Opcodes.local_get, 0 ],
@@ -366,7 +388,7 @@ export const BuiltinFuncs = function() {
366
388
  params: [ valtypeBinary ],
367
389
  locals: [ valtypeBinary ],
368
390
  returns: [ valtypeBinary ],
369
- returnType: 'boolean',
391
+ returnType: TYPES.boolean,
370
392
  wasm: [
371
393
  [ Opcodes.local_get, 0 ],
372
394
  [ Opcodes.local_get, 0 ],
@@ -385,7 +407,7 @@ export const BuiltinFuncs = function() {
385
407
  params: [ valtypeBinary ],
386
408
  locals: [],
387
409
  returns: [ valtypeBinary ],
388
- returnType: 'boolean',
410
+ returnType: TYPES.boolean,
389
411
  wasm: [
390
412
  [ Opcodes.local_get, 0 ],
391
413
  [ Opcodes.local_get, 0 ],
@@ -400,7 +422,7 @@ export const BuiltinFuncs = function() {
400
422
  params: [ valtypeBinary ],
401
423
  locals: [],
402
424
  returns: [ valtypeBinary ],
403
- returnType: 'boolean',
425
+ returnType: TYPES.boolean,
404
426
  wasm: [
405
427
  [ Opcodes.local_get, 0 ],
406
428
  [ Opcodes.local_get, 0 ],
@@ -540,61 +562,314 @@ export const BuiltinFuncs = function() {
540
562
 
541
563
  // this is an implementation of xorshift128+ (in wasm bytecode)
542
564
  // fun fact: v8, SM, JSC also use this (you will need this fun fact to maintain your sanity reading this code)
543
- 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}`);
544
858
 
545
859
  this.__Math_random = {
546
860
  floatOnly: true,
547
861
  params: [],
548
- locals: [ Valtype.i64, Valtype.i64 ],
862
+ locals: prng.locals,
549
863
  localNames: [ 's1', 's0' ],
550
- globals: [ Valtype.i64, Valtype.i64 ],
864
+ globals: prng.globals,
551
865
  globalNames: [ 'state0', 'state1' ],
552
866
  globalInits: [ prngSeed0, prngSeed1 ],
553
867
  returns: [ Valtype.f64 ],
554
868
  wasm: [
555
- // setup: s1 = state0, s0 = state1, state0 = s0
556
- [ Opcodes.global_get, 0 ], // state0
557
- [ Opcodes.local_tee, 0 ], // s1
558
- [ Opcodes.global_get, 1 ], // state1
559
- [ Opcodes.local_tee, 1, ], // s0
560
- [ Opcodes.global_set, 0 ], // state0
561
-
562
- // s1 ^= s1 << 23
563
- // [ Opcodes.local_get, 0 ], // s1
564
- [ Opcodes.local_get, 0 ], // s1
565
- [ Opcodes.i64_const, 23 ],
566
- [ Opcodes.i64_shl ], // <<
567
- [ Opcodes.i64_xor ], // ^
568
- [ Opcodes.local_set, 0 ], // s1
569
-
570
- // state1 = s1 ^ s0 ^ (s1 >> 17) ^ (s0 >> 26)
571
- // s1 ^ s0
572
- [ Opcodes.local_get, 0 ], // s1
573
- [ Opcodes.local_get, 1 ], // s0
574
- [ Opcodes.i64_xor ], // ^
575
-
576
- // ^ (s1 >> 17)
577
- [ Opcodes.local_get, 0 ], // s1
578
- [ Opcodes.i64_const, 17 ],
579
- [ Opcodes.i64_shr_u ], // >>
580
- [ Opcodes.i64_xor ], // ^
581
-
582
- // ^ (s0 >> 26)
583
- [ Opcodes.local_get, 1 ], // s0
584
- [ Opcodes.i64_const, 26 ],
585
- [ Opcodes.i64_shr_u ], // >>
586
- [ Opcodes.i64_xor ], // ^
587
-
588
- // state1 =
589
- [ Opcodes.global_set, 1 ],
869
+ ...prng.wasm,
590
870
 
591
871
  // you thought it was over? now we need the result as a f64 between 0-1 :)
592
872
 
593
- // state1 + s0
594
- [ Opcodes.global_get, 1 ], // state1
595
- [ Opcodes.local_get, 1 ], // s0
596
- [ Opcodes.i64_add ],
597
-
598
873
  // should we >> 12 here?
599
874
  // it feels like it but it breaks values
600
875
 
@@ -609,15 +884,72 @@ export const BuiltinFuncs = function() {
609
884
  // ...number(1),
610
885
  // [ Opcodes.f64_sub ],
611
886
 
612
- ...number((1 << 53) - 1, Valtype.i64),
613
- [ 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 ],
893
+
894
+ // / (1 << 53)
895
+ ...number(1 << 53),
896
+ [ Opcodes.f64_div ]
897
+ ] : [
898
+ ...number((1 << 21) - 1, Valtype.i32),
899
+ [ Opcodes.i32_and ],
614
900
 
615
- // double(mantissa)
616
- [ Opcodes.f64_convert_i64_u ],
901
+ // double(mantissa)
902
+ [ Opcodes.f64_convert_i32_u ],
617
903
 
618
- // / (1 << 53)
619
- ...number(1 << 53),
620
- [ Opcodes.f64_div ]
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 ],
621
953
  ]
622
954
  };
623
955
 
@@ -696,7 +1028,7 @@ export const BuiltinFuncs = function() {
696
1028
  params: [ valtypeBinary ],
697
1029
  locals: [],
698
1030
  returns: [ valtypeBinary ],
699
- returnType: 'boolean',
1031
+ returnType: TYPES.boolean,
700
1032
  wasm: [
701
1033
  [ Opcodes.local_get, 0 ],
702
1034
  ...number(0),
@@ -721,7 +1053,7 @@ export const BuiltinFuncs = function() {
721
1053
  typedParams: true,
722
1054
  locals: [ Valtype.i32, Valtype.i32 ],
723
1055
  returns: [ valtypeBinary ],
724
- returnType: Prefs.bytestring ? '_bytestring' : 'string',
1056
+ returnType: Prefs.bytestring ? TYPES._bytestring : TYPES.string,
725
1057
  wasm: (scope, { TYPE_NAMES, typeSwitch, makeString }) => {
726
1058
  const bc = {};
727
1059
  for (const x in TYPE_NAMES) {
@@ -732,60 +1064,35 @@ export const BuiltinFuncs = function() {
732
1064
  }
733
1065
  };
734
1066
 
735
- const localIsOneOf = (getter, arr, valtype = valtypeBinary) => {
736
- const out = [];
737
-
738
- for (let i = 0; i < arr.length; i++) {
739
- out.push(...getter, ...number(arr[i], valtype), valtype === Valtype.f64 ? [ Opcodes.f64_eq ] : [ Opcodes.i32_eq ]);
740
- if (i !== 0) out.push([ Opcodes.i32_or ]);
741
- }
742
-
743
- return out;
744
- };
745
-
746
- this.__Porffor_ptr = {
1067
+ this.__Porffor_rawType = {
747
1068
  params: [ valtypeBinary, Valtype.i32 ],
748
1069
  typedParams: true,
749
- locals: [ Valtype.i32, Valtype.i32 ],
1070
+ locals: [],
750
1071
  returns: [ valtypeBinary ],
751
- wasm: (scope, { TYPES }) => [
752
- ...localIsOneOf([ [ Opcodes.local_get, 1 ] ], [ TYPES.string, TYPES._array, TYPES._bytestring ], Valtype.i32),
753
- [ Opcodes.if, valtypeBinary ],
754
- [ Opcodes.local_get, 0 ],
755
- [ Opcodes.else ],
756
- ...number(NaN),
757
- [ Opcodes.end ]
758
- ]
759
- };
760
-
761
- this.__Porffor_i32_ptr = {
762
- params: [ Valtype.i32, Valtype.i32 ],
763
- typedParams: true,
764
- locals: [ Valtype.i32, Valtype.i32 ],
765
- returns: [ Valtype.i32 ],
766
- wasm: (scope, { TYPES }) => [
767
- ...localIsOneOf([ [ Opcodes.local_get, 1 ] ], [ TYPES.string, TYPES._array, TYPES._bytestring ], Valtype.i32),
768
- [ Opcodes.if, Valtype.i32 ],
769
- [ Opcodes.local_get, 0 ],
770
- [ Opcodes.else ],
771
- ...number(-1, Valtype.i32),
772
- [ Opcodes.end ]
1072
+ wasm: [
1073
+ [ Opcodes.local_get, 1 ],
1074
+ Opcodes.i32_from_u
773
1075
  ]
774
1076
  };
775
1077
 
776
- // unsafe: does not check type just ~casts to number
777
- this.__Porffor_i32_ptrUnsafe = {
778
- params: [ Valtype.i32 ],
1078
+ this.__Porffor_clone = {
1079
+ params: [ valtypeBinary, valtypeBinary ],
779
1080
  locals: [],
780
- returns: [ Valtype.i32 ],
1081
+ returns: [],
781
1082
  wasm: [
1083
+ // dst
1084
+ [ Opcodes.local_get, 1 ],
1085
+ Opcodes.i32_to_u,
1086
+
1087
+ // src
782
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 ],
783
1094
  ]
784
1095
  };
785
1096
 
786
-
787
- const generated = new GeneratedBuiltins.BuiltinFuncs();
788
- for (const x in generated) {
789
- this[x] = generated[x];
790
- }
1097
+ GeneratedBuiltins.BuiltinFuncs.call(this);
791
1098
  };