gofront 1.7.0 → 1.8.0

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 (128) hide show
  1. package/README.md +13 -13
  2. package/package.json +8 -37
  3. package/src/backend/js/expressions.js +1341 -148
  4. package/src/backend/js/fmt-runtime.js +573 -0
  5. package/src/backend/js/index.js +375 -57
  6. package/src/backend/js/runtime.js +1460 -133
  7. package/src/backend/js/statements.js +900 -86
  8. package/src/backend/js/stdlib/bits.js +87 -14
  9. package/src/backend/js/stdlib/builder.js +41 -6
  10. package/src/backend/js/stdlib/bytes.js +253 -7
  11. package/src/backend/js/stdlib/errors.js +2 -1
  12. package/src/backend/js/stdlib/fmt.js +349 -10
  13. package/src/backend/js/stdlib/index.js +8 -3
  14. package/src/backend/js/stdlib/json.js +247 -52
  15. package/src/backend/js/stdlib/maps.js +0 -8
  16. package/src/backend/js/stdlib/math.js +17 -1
  17. package/src/backend/js/stdlib/simd.js +10 -0
  18. package/src/backend/js/stdlib/slices.js +36 -6
  19. package/src/backend/js/stdlib/strconv.js +10 -5
  20. package/src/backend/js/stdlib/strings.js +83 -4
  21. package/src/backend/js/stdlib/testing.js +7 -0
  22. package/src/backend/js/stdlib/time.js +79 -55
  23. package/src/backend/js/stdlib/unicode.js +1 -1
  24. package/src/backend/js/stdlib/utf8.js +1 -1
  25. package/src/backend/js/templ.js +38 -76
  26. package/src/backend/js/type-info.js +272 -0
  27. package/src/backend/shared/fmt-types.js +188 -0
  28. package/src/backend/wasm/boundary.js +436 -80
  29. package/src/backend/wasm/emit-builtins.js +303 -13
  30. package/src/backend/wasm/emit-exprs.js +1397 -203
  31. package/src/backend/wasm/emit-maps.js +61 -13
  32. package/src/backend/wasm/emit-stmts.js +1359 -164
  33. package/src/backend/wasm/emit.js +512 -77
  34. package/src/backend/wasm/encode.js +43 -13
  35. package/src/backend/wasm/globals.js +452 -0
  36. package/src/backend/wasm/index.js +194 -2489
  37. package/src/backend/wasm/method-expr.js +381 -0
  38. package/src/backend/wasm/module-emitter.js +2240 -0
  39. package/src/backend/wasm/monomorph.js +62 -4
  40. package/src/backend/wasm/prescan.js +397 -0
  41. package/src/backend/wasm/stdlib/bytes.js +1804 -127
  42. package/src/backend/wasm/stdlib/core.js +1574 -199
  43. package/src/backend/wasm/stdlib/index.js +0 -5
  44. package/src/backend/wasm/stdlib/io.js +1567 -150
  45. package/src/backend/wasm/stdlib/packages.js +2 -0
  46. package/src/backend/wasm/stdlib/simd.js +293 -28
  47. package/src/backend/wasm/stdlib/time.js +1041 -12
  48. package/src/backend/wasm/types.js +200 -15
  49. package/src/backend/wasm/variadic.js +93 -0
  50. package/src/backend/wasm/wat.js +47 -20
  51. package/src/{cli-core.js → cli/cli-core.js} +236 -10
  52. package/src/{test-runner.js → cli/test-runner.js} +332 -39
  53. package/src/{vendor.js → cli/vendor.js} +3 -4
  54. package/src/compiler.js +107 -269
  55. package/src/index.js +15 -169
  56. package/src/{lexer.js → lexer/lexer.js} +102 -55
  57. package/src/{tokens.js → lexer/tokens.js} +1 -0
  58. package/src/link/sourcemap.js +97 -0
  59. package/src/link/stdlib.js +515 -0
  60. package/src/link/wasm.js +294 -0
  61. package/src/lower/bounds.js +394 -0
  62. package/src/lower/boxing.js +1 -1
  63. package/src/lower/captures.js +176 -32
  64. package/src/lower/index.js +26 -18
  65. package/src/lower/json-codecs.js +1398 -0
  66. package/src/lower/ownership.js +22 -1
  67. package/src/lower/range.js +86 -1
  68. package/src/lower/reachability.js +132 -0
  69. package/src/parser/declarations.js +58 -13
  70. package/src/parser/expressions.js +29 -7
  71. package/src/parser/index.js +2 -1
  72. package/src/parser/statements.js +37 -22
  73. package/src/{templ-parser.js → parser/templ.js} +138 -15
  74. package/src/parser/types.js +69 -9
  75. package/src/resolver.js +22 -1
  76. package/src/typechecker/assignability.js +176 -17
  77. package/src/typechecker/const-fold.js +356 -0
  78. package/src/typechecker/constants.js +256 -0
  79. package/src/typechecker/expressions.js +931 -122
  80. package/src/typechecker/index.js +459 -67
  81. package/src/typechecker/init-order.js +330 -0
  82. package/src/typechecker/resolve.js +451 -56
  83. package/src/typechecker/statements.js +90 -9
  84. package/src/typechecker/stdlib/core.js +333 -55
  85. package/src/typechecker/stdlib/excluded.js +898 -0
  86. package/src/typechecker/stdlib/extended.js +322 -26
  87. package/src/typechecker/{stdlib.js → stdlib/index.js} +5 -5
  88. package/src/typechecker/stdlib/simd.js +65 -15
  89. package/src/typechecker/termination.js +1 -1
  90. package/src/typechecker/types.js +149 -25
  91. package/stdlib/bytes/iter.go +192 -0
  92. package/stdlib/bytes/search.go +240 -0
  93. package/stdlib/bytes/split.go +218 -0
  94. package/stdlib/cmp/cmp.go +65 -0
  95. package/stdlib/encoding/json/errors.go +31 -0
  96. package/stdlib/encoding/json/indent.go +71 -0
  97. package/stdlib/encoding/json/number.go +12 -0
  98. package/stdlib/encoding/json/stream.go +173 -0
  99. package/stdlib/errors/overlay.go +12 -0
  100. package/stdlib/hash/hash.go +53 -0
  101. package/stdlib/internal/jsonrt/dec.go +738 -0
  102. package/stdlib/internal/jsonrt/enc.go +366 -0
  103. package/stdlib/internal/jsonrt/indent.go +135 -0
  104. package/stdlib/internal/jsonrt/number.go +27 -0
  105. package/stdlib/internal/jsonrt/reader.go +73 -0
  106. package/stdlib/internal/jsonrt/scanner.go +649 -0
  107. package/stdlib/io/io.go +346 -0
  108. package/stdlib/iter/iter.go +18 -0
  109. package/stdlib/maps/iter.go +65 -0
  110. package/stdlib/math/extra.go +270 -0
  111. package/stdlib/slices/extra.go +73 -0
  112. package/stdlib/slices/iter.go +113 -0
  113. package/stdlib/sort/sort.go +561 -0
  114. package/stdlib/strconv/quote.go +341 -0
  115. package/stdlib/strings/extra.go +35 -0
  116. package/stdlib/strings/iter.go +122 -0
  117. package/stdlib/sync/extra.go +105 -0
  118. package/stdlib/unicode/unicode.go +112 -0
  119. package/stdlib/unicode/utf8/bytes.go +239 -0
  120. package/src/backend/wasm/const-fold.js +0 -205
  121. package/src/backend/wasm/emit-stdlib.js +0 -13
  122. /package/src/{asset-manager.js → cli/asset-manager.js} +0 -0
  123. /package/src/{colors.js → cli/colors.js} +0 -0
  124. /package/src/{dev-server.js → cli/dev-server.js} +0 -0
  125. /package/src/{minifier.js → cli/minifier.js} +0 -0
  126. /package/src/{project-config.js → cli/project-config.js} +0 -0
  127. /package/src/{pwa.js → cli/pwa.js} +0 -0
  128. /package/src/{templ-lexer.js → lexer/templ-lexer.js} +0 -0
@@ -165,18 +165,6 @@ export function setupExtendedGlobals(globals, types) {
165
165
  kind: "namespace",
166
166
  name: "maps",
167
167
  members: {
168
- Keys: {
169
- kind: "func",
170
- params: [ANY],
171
- returns: [ANY],
172
- _derivedReturn: "keysOfArg0",
173
- },
174
- Values: {
175
- kind: "func",
176
- params: [ANY],
177
- returns: [ANY],
178
- _derivedReturn: "valuesOfArg0",
179
- },
180
168
  Clone: {
181
169
  kind: "func",
182
170
  params: [ANY],
@@ -274,12 +262,26 @@ export function setupExtendedGlobals(globals, types) {
274
262
  ["_self", ANY],
275
263
  ]
276
264
  : name === "bytes.Buffer"
277
- ? [["_buf", BYTE_SLICE_T]]
265
+ ? [
266
+ ["_buf", BYTE_SLICE_T],
267
+ ["_lastOp", INT],
268
+ ["_lastRuneLen", INT],
269
+ ]
278
270
  : [],
279
271
  ),
280
272
  methods: new Map([..._builderBase, ...extra]),
281
273
  },
282
274
  });
275
+ const ioPkg = globals.lookup("io");
276
+ const IO_READER = ioPkg?.members?.Reader ?? {
277
+ kind: "interface",
278
+ name: "io.Reader",
279
+ };
280
+ const IO_WRITER = ioPkg?.members?.Writer ?? {
281
+ kind: "interface",
282
+ name: "io.Writer",
283
+ };
284
+
283
285
  types.set(
284
286
  "strings.Builder",
285
287
  _makeBuilderType("strings.Builder", [
@@ -292,6 +294,34 @@ export function setupExtendedGlobals(globals, types) {
292
294
  ["WriteRune", { kind: "func", params: [INT], returns: [INT, ERROR] }],
293
295
  ["Bytes", { kind: "func", params: [], returns: [BYTE_SLICE_T] }],
294
296
  ["Read", { kind: "func", params: [BYTE_SLICE_T], returns: [INT, ERROR] }],
297
+ ["ReadRune", { kind: "func", params: [], returns: [INT32, INT, ERROR] }],
298
+ ["UnreadRune", { kind: "func", params: [], returns: [ERROR] }],
299
+ ["ReadByte", { kind: "func", params: [], returns: [UINT8, ERROR] }],
300
+ ["UnreadByte", { kind: "func", params: [], returns: [ERROR] }],
301
+ [
302
+ "ReadBytes",
303
+ { kind: "func", params: [UINT8], returns: [BYTE_SLICE_T, ERROR] },
304
+ ],
305
+ [
306
+ "ReadString",
307
+ { kind: "func", params: [UINT8], returns: [STRING, ERROR] },
308
+ ],
309
+ [
310
+ "ReadFrom",
311
+ { kind: "func", params: [IO_READER], returns: [INT64, ERROR] },
312
+ ],
313
+ [
314
+ "WriteTo",
315
+ { kind: "func", params: [IO_WRITER], returns: [INT64, ERROR] },
316
+ ],
317
+ ["Next", { kind: "func", params: [INT], returns: [BYTE_SLICE_T] }],
318
+ ["Truncate", { kind: "func", params: [INT], returns: [VOID] }],
319
+ ["Available", { kind: "func", params: [], returns: [INT] }],
320
+ [
321
+ "AvailableBuffer",
322
+ { kind: "func", params: [], returns: [BYTE_SLICE_T] },
323
+ ],
324
+ ["Peek", { kind: "func", params: [INT], returns: [BYTE_SLICE_T, ERROR] }],
295
325
  ]),
296
326
  );
297
327
  types.set("strings.Replacer", {
@@ -302,6 +332,14 @@ export function setupExtendedGlobals(globals, types) {
302
332
  fields: new Map([["_pairs", STR_SLICE_T]]),
303
333
  methods: new Map([
304
334
  ["Replace", { kind: "func", params: [STRING], returns: [STRING] }],
335
+ [
336
+ "WriteString",
337
+ {
338
+ kind: "func",
339
+ params: [IO_WRITER, STRING],
340
+ returns: [INT, ERROR],
341
+ },
342
+ ],
305
343
  ]),
306
344
  },
307
345
  });
@@ -313,12 +351,37 @@ export function setupExtendedGlobals(globals, types) {
313
351
  fields: new Map([
314
352
  ["_src", srcType],
315
353
  ["_pos", INT],
354
+ ["_prev", INT],
316
355
  ]),
317
356
  methods: new Map([
318
357
  [
319
358
  "Read",
320
359
  { kind: "func", params: [BYTE_SLICE_T], returns: [INT, ERROR] },
321
360
  ],
361
+ [
362
+ "ReadAt",
363
+ {
364
+ kind: "func",
365
+ params: [BYTE_SLICE_T, INT64],
366
+ returns: [INT, ERROR],
367
+ },
368
+ ],
369
+ ["ReadByte", { kind: "func", params: [], returns: [UINT8, ERROR] }],
370
+ ["UnreadByte", { kind: "func", params: [], returns: [ERROR] }],
371
+ [
372
+ "ReadRune",
373
+ { kind: "func", params: [], returns: [INT32, INT, ERROR] },
374
+ ],
375
+ ["UnreadRune", { kind: "func", params: [], returns: [ERROR] }],
376
+ [
377
+ "Seek",
378
+ { kind: "func", params: [INT64, INT], returns: [INT64, ERROR] },
379
+ ],
380
+ ["Size", { kind: "func", params: [], returns: [INT64] }],
381
+ [
382
+ "WriteTo",
383
+ { kind: "func", params: [IO_WRITER], returns: [INT64, ERROR] },
384
+ ],
322
385
  ["Len", { kind: "func", params: [], returns: [INT] }],
323
386
  ["Reset", { kind: "func", params: [resetArgType], returns: [VOID] }],
324
387
  ]),
@@ -347,11 +410,6 @@ export function setupExtendedGlobals(globals, types) {
347
410
  ]),
348
411
  },
349
412
  });
350
- const ioPkg = globals.lookup("io");
351
- const IO_READER = ioPkg?.members?.Reader ?? {
352
- kind: "interface",
353
- name: "io.Reader",
354
- };
355
413
  types.set("io.LimitedReader", {
356
414
  kind: "named",
357
415
  name: "io.LimitedReader",
@@ -389,6 +447,7 @@ export function setupExtendedGlobals(globals, types) {
389
447
  returns: [{ kind: "pointer", base: types.get("bytes.Reader") }],
390
448
  };
391
449
  bytesPkg.members.Reader = types.get("bytes.Reader");
450
+ bytesPkg.members.Buffer = types.get("bytes.Buffer");
392
451
  }
393
452
 
394
453
  globals.define("rand", {
@@ -484,6 +543,23 @@ export function setupExtendedGlobals(globals, types) {
484
543
  members: globals.lookup("path").members,
485
544
  });
486
545
 
546
+ const TIME_TIME = types.get("time.Time");
547
+ const TIME_DURATION = types.get("time.Duration");
548
+
549
+ const CONTEXT_T = {
550
+ kind: "named",
551
+ name: "context.Context",
552
+ underlying: {
553
+ kind: "interface",
554
+ methods: new Map([
555
+ ["Deadline", { kind: "func", params: [], returns: [TIME_TIME, BOOL] }],
556
+ ["Err", { kind: "func", params: [], returns: [ERROR] }],
557
+ ["Value", { kind: "func", params: [ANY], returns: [ANY] }],
558
+ ]),
559
+ },
560
+ };
561
+ types.set("context.Context", CONTEXT_T);
562
+
487
563
  const TESTING_T = {
488
564
  kind: "named",
489
565
  name: "testing.T",
@@ -529,18 +605,237 @@ export function setupExtendedGlobals(globals, types) {
529
605
  },
530
606
  ],
531
607
  ["Name", { kind: "func", params: [], returns: [STRING] }],
608
+ [
609
+ "Cleanup",
610
+ {
611
+ kind: "func",
612
+ params: [{ kind: "func", params: [], returns: [VOID] }],
613
+ returns: [VOID],
614
+ },
615
+ ],
616
+ ["Setenv", { kind: "func", params: [STRING, STRING], returns: [VOID] }],
617
+ ["Deadline", { kind: "func", params: [], returns: [TIME_TIME, BOOL] }],
618
+ ["Context", { kind: "func", params: [], returns: [CONTEXT_T] }],
619
+ ["Parallel", { kind: "func", params: [], returns: [VOID] }],
620
+ ["SkipNow", { kind: "func", params: [], returns: [VOID] }],
621
+ ["Attr", { kind: "func", params: [STRING, STRING], returns: [VOID] }],
622
+ ["Output", { kind: "func", params: [], returns: [IO_WRITER] }],
623
+ ]);
624
+
625
+ const TESTING_B = {
626
+ kind: "named",
627
+ name: "testing.B",
628
+ underlying: {
629
+ kind: "struct",
630
+ fields: new Map([["N", INT]]),
631
+ methods: new Map(),
632
+ },
633
+ };
634
+ const TESTING_B_PTR = { kind: "pointer", base: TESTING_B };
635
+
636
+ TESTING_B.underlying.methods = new Map([
637
+ [
638
+ "Cleanup",
639
+ {
640
+ kind: "func",
641
+ params: [{ kind: "func", params: [], returns: [VOID] }],
642
+ returns: [VOID],
643
+ },
644
+ ],
645
+ ["Error", { kind: "func", params: [ANY], returns: [VOID], variadic: true }],
646
+ [
647
+ "Errorf",
648
+ { kind: "func", params: [STRING, ANY], returns: [VOID], variadic: true },
649
+ ],
650
+ ["Fatal", { kind: "func", params: [ANY], returns: [VOID], variadic: true }],
651
+ [
652
+ "Fatalf",
653
+ { kind: "func", params: [STRING, ANY], returns: [VOID], variadic: true },
654
+ ],
655
+ ["Fail", { kind: "func", params: [], returns: [VOID] }],
656
+ ["Failed", { kind: "func", params: [], returns: [BOOL] }],
657
+ ["FailNow", { kind: "func", params: [], returns: [VOID] }],
658
+ ["Log", { kind: "func", params: [ANY], returns: [VOID], variadic: true }],
659
+ [
660
+ "Logf",
661
+ { kind: "func", params: [STRING, ANY], returns: [VOID], variadic: true },
662
+ ],
663
+ ["Skip", { kind: "func", params: [ANY], returns: [VOID], variadic: true }],
664
+ [
665
+ "Skipf",
666
+ { kind: "func", params: [STRING, ANY], returns: [VOID], variadic: true },
667
+ ],
668
+ ["Skipped", { kind: "func", params: [], returns: [BOOL] }],
669
+ ["SkipNow", { kind: "func", params: [], returns: [VOID] }],
670
+ ["Helper", { kind: "func", params: [], returns: [VOID] }],
671
+ ["Name", { kind: "func", params: [], returns: [STRING] }],
672
+ ["Attr", { kind: "func", params: [STRING, STRING], returns: [VOID] }],
673
+ ["Context", { kind: "func", params: [], returns: [CONTEXT_T] }],
674
+ ["Elapsed", { kind: "func", params: [], returns: [TIME_DURATION] }],
675
+ ["Loop", { kind: "func", params: [], returns: [BOOL] }],
676
+ ["Output", { kind: "func", params: [], returns: [IO_WRITER] }],
677
+ ["ReportAllocs", { kind: "func", params: [], returns: [VOID] }],
678
+ [
679
+ "ReportMetric",
680
+ { kind: "func", params: [FLOAT64, STRING], returns: [VOID] },
681
+ ],
682
+ ["ResetTimer", { kind: "func", params: [], returns: [VOID] }],
683
+ [
684
+ "Run",
685
+ {
686
+ kind: "func",
687
+ params: [
688
+ STRING,
689
+ { kind: "func", params: [TESTING_B_PTR], returns: [VOID] },
690
+ ],
691
+ returns: [BOOL],
692
+ },
693
+ ],
694
+ ["SetBytes", { kind: "func", params: [INT64], returns: [VOID] }],
695
+ ["Setenv", { kind: "func", params: [STRING, STRING], returns: [VOID] }],
696
+ ["StartTimer", { kind: "func", params: [], returns: [VOID] }],
697
+ ["StopTimer", { kind: "func", params: [], returns: [VOID] }],
532
698
  ]);
533
699
 
700
+ const TESTING_M = {
701
+ kind: "named",
702
+ name: "testing.M",
703
+ underlying: {
704
+ kind: "struct",
705
+ fields: new Map(),
706
+ methods: new Map([["Run", { kind: "func", params: [], returns: [INT] }]]),
707
+ },
708
+ };
709
+
710
+ const TESTING_TB = {
711
+ kind: "named",
712
+ name: "testing.TB",
713
+ underlying: {
714
+ kind: "interface",
715
+ methods: new Map([
716
+ ["Attr", { kind: "func", params: [STRING, STRING], returns: [VOID] }],
717
+ [
718
+ "Cleanup",
719
+ {
720
+ kind: "func",
721
+ params: [{ kind: "func", params: [], returns: [VOID] }],
722
+ returns: [VOID],
723
+ },
724
+ ],
725
+ ["Context", { kind: "func", params: [], returns: [CONTEXT_T] }],
726
+ [
727
+ "Error",
728
+ { kind: "func", params: [ANY], returns: [VOID], variadic: true },
729
+ ],
730
+ [
731
+ "Errorf",
732
+ {
733
+ kind: "func",
734
+ params: [STRING, ANY],
735
+ returns: [VOID],
736
+ variadic: true,
737
+ },
738
+ ],
739
+ ["Fail", { kind: "func", params: [], returns: [VOID] }],
740
+ ["Failed", { kind: "func", params: [], returns: [BOOL] }],
741
+ ["FailNow", { kind: "func", params: [], returns: [VOID] }],
742
+ [
743
+ "Fatal",
744
+ { kind: "func", params: [ANY], returns: [VOID], variadic: true },
745
+ ],
746
+ [
747
+ "Fatalf",
748
+ {
749
+ kind: "func",
750
+ params: [STRING, ANY],
751
+ returns: [VOID],
752
+ variadic: true,
753
+ },
754
+ ],
755
+ ["Helper", { kind: "func", params: [], returns: [VOID] }],
756
+ [
757
+ "Log",
758
+ { kind: "func", params: [ANY], returns: [VOID], variadic: true },
759
+ ],
760
+ [
761
+ "Logf",
762
+ {
763
+ kind: "func",
764
+ params: [STRING, ANY],
765
+ returns: [VOID],
766
+ variadic: true,
767
+ },
768
+ ],
769
+ ["Name", { kind: "func", params: [], returns: [STRING] }],
770
+ ["Output", { kind: "func", params: [], returns: [IO_WRITER] }],
771
+ ["Setenv", { kind: "func", params: [STRING, STRING], returns: [VOID] }],
772
+ [
773
+ "Skip",
774
+ { kind: "func", params: [ANY], returns: [VOID], variadic: true },
775
+ ],
776
+ [
777
+ "Skipf",
778
+ {
779
+ kind: "func",
780
+ params: [STRING, ANY],
781
+ returns: [VOID],
782
+ variadic: true,
783
+ },
784
+ ],
785
+ ["SkipNow", { kind: "func", params: [], returns: [VOID] }],
786
+ ["Skipped", { kind: "func", params: [], returns: [BOOL] }],
787
+ ]),
788
+ },
789
+ };
790
+
791
+ const BENCHMARK_RESULT_T = {
792
+ kind: "named",
793
+ name: "testing.BenchmarkResult",
794
+ underlying: {
795
+ kind: "struct",
796
+ fields: new Map([
797
+ ["N", INT],
798
+ ["T", TIME_DURATION],
799
+ ["Bytes", INT64],
800
+ ["MemAllocs", UINT64],
801
+ ["MemBytes", UINT64],
802
+ ["Extra", { kind: "map", key: STRING, value: FLOAT64 }],
803
+ ]),
804
+ methods: new Map([
805
+ ["AllocedBytesPerOp", { kind: "func", params: [], returns: [INT64] }],
806
+ ["AllocsPerOp", { kind: "func", params: [], returns: [INT64] }],
807
+ ["MemString", { kind: "func", params: [], returns: [STRING] }],
808
+ ["NsPerOp", { kind: "func", params: [], returns: [INT64] }],
809
+ ["String", { kind: "func", params: [], returns: [STRING] }],
810
+ ]),
811
+ },
812
+ };
813
+
534
814
  globals.define("testing", {
535
815
  kind: "namespace",
536
816
  name: "testing",
537
817
  members: {
538
818
  T: TESTING_T,
819
+ B: TESTING_B,
820
+ M: TESTING_M,
821
+ TB: TESTING_TB,
822
+ BenchmarkResult: BENCHMARK_RESULT_T,
823
+ Benchmark: {
824
+ kind: "func",
825
+ params: [{ kind: "func", params: [TESTING_B_PTR], returns: [VOID] }],
826
+ returns: [BENCHMARK_RESULT_T],
827
+ },
828
+ Init: { kind: "func", params: [], returns: [VOID] },
539
829
  Short: { kind: "func", params: [], returns: [BOOL] },
830
+ Testing: { kind: "func", params: [], returns: [BOOL] },
540
831
  Verbose: { kind: "func", params: [], returns: [BOOL] },
541
832
  },
542
833
  });
543
834
  types.set("testing.T", TESTING_T);
835
+ types.set("testing.B", TESTING_B);
836
+ types.set("testing.M", TESTING_M);
837
+ types.set("testing.TB", TESTING_TB);
838
+ types.set("testing.BenchmarkResult", BENCHMARK_RESULT_T);
544
839
 
545
840
  // ── sync ──────────────────────────────────────────────────────
546
841
  const MUTEX_T = {
@@ -553,6 +848,14 @@ export function setupExtendedGlobals(globals, types) {
553
848
  ["TryLock", { kind: "func", params: [], returns: [BOOL] }],
554
849
  ]),
555
850
  };
851
+ const LOCKER_T = {
852
+ kind: "interface",
853
+ name: "sync.Locker",
854
+ methods: new Map([
855
+ ["Lock", { kind: "func", params: [], returns: [VOID] }],
856
+ ["Unlock", { kind: "func", params: [], returns: [VOID] }],
857
+ ]),
858
+ };
556
859
  const RWMUTEX_T = {
557
860
  kind: "named",
558
861
  name: "sync.RWMutex",
@@ -562,6 +865,7 @@ export function setupExtendedGlobals(globals, types) {
562
865
  ["Unlock", { kind: "func", params: [], returns: [VOID] }],
563
866
  ["RLock", { kind: "func", params: [], returns: [VOID] }],
564
867
  ["RUnlock", { kind: "func", params: [], returns: [VOID] }],
868
+ ["RLocker", { kind: "func", params: [], returns: [LOCKER_T] }],
565
869
  ["TryLock", { kind: "func", params: [], returns: [BOOL] }],
566
870
  ["TryRLock", { kind: "func", params: [], returns: [BOOL] }],
567
871
  ]),
@@ -591,14 +895,6 @@ export function setupExtendedGlobals(globals, types) {
591
895
  ["Wait", { kind: "func", params: [], returns: [VOID] }],
592
896
  ]),
593
897
  };
594
- const LOCKER_T = {
595
- kind: "interface",
596
- name: "sync.Locker",
597
- methods: new Map([
598
- ["Lock", { kind: "func", params: [], returns: [VOID] }],
599
- ["Unlock", { kind: "func", params: [], returns: [VOID] }],
600
- ]),
601
- };
602
898
  globals.define("sync", {
603
899
  kind: "namespace",
604
900
  name: "sync",
@@ -7,11 +7,11 @@
7
7
  // stdlib/extended.js — gom, maps, regexp, rand, utf8, path, builder types,
8
8
  // built-in functions
9
9
 
10
- import { setupCoreGlobals } from "./stdlib/core.js";
11
- import { setupExtendedGlobals } from "./stdlib/extended.js";
12
- import { setupSharedGlobals } from "./stdlib/shared.js";
13
- import { setupSimdGlobals } from "./stdlib/simd.js";
14
- import { setupWebGlobals } from "./stdlib/web.js";
10
+ import { setupCoreGlobals } from "./core.js";
11
+ import { setupExtendedGlobals } from "./extended.js";
12
+ import { setupSharedGlobals } from "./shared.js";
13
+ import { setupSimdGlobals } from "./simd.js";
14
+ import { setupWebGlobals } from "./web.js";
15
15
 
16
16
  export function setupGlobals(globals, types) {
17
17
  setupCoreGlobals(globals, types);
@@ -5,7 +5,7 @@
5
5
  // - Lowered to WASM v128 in wasm packages.
6
6
  // - Lowered to a frozen 4-number array with Math.fround in js packages.
7
7
 
8
- import { FLOAT32, INT } from "../types.js";
8
+ import { BOOL, FLOAT32, INT } from "../types.js";
9
9
 
10
10
  export function setupSimdGlobals(globals, types) {
11
11
  const f32x4Type = {
@@ -19,25 +19,69 @@ export function setupSimdGlobals(globals, types) {
19
19
  },
20
20
  };
21
21
 
22
+ const mask32x4Type = {
23
+ kind: "named",
24
+ name: "simd.Mask32x4",
25
+ underlying: {
26
+ kind: "simd",
27
+ simd: "Mask32x4",
28
+ elem: BOOL,
29
+ lanes: 4,
30
+ },
31
+ };
32
+
33
+ const fn = (params, returns) => ({ kind: "func", params, returns });
34
+ const unary = fn([], [f32x4Type]);
35
+ const binary = fn([f32x4Type], [f32x4Type]);
36
+ const compare = fn([f32x4Type], [mask32x4Type]);
37
+
22
38
  f32x4Type.underlying.methods = new Map([
23
- ["Add", { kind: "func", params: [f32x4Type], returns: [f32x4Type] }],
24
- ["Sub", { kind: "func", params: [f32x4Type], returns: [f32x4Type] }],
25
- ["Mul", { kind: "func", params: [f32x4Type], returns: [f32x4Type] }],
26
- ["Div", { kind: "func", params: [f32x4Type], returns: [f32x4Type] }],
27
- ["Min", { kind: "func", params: [f32x4Type], returns: [f32x4Type] }],
28
- ["Max", { kind: "func", params: [f32x4Type], returns: [f32x4Type] }],
29
- ["Dot3", { kind: "func", params: [f32x4Type], returns: [FLOAT32] }],
30
- ["Dot4", { kind: "func", params: [f32x4Type], returns: [FLOAT32] }],
31
- ["Lane", { kind: "func", params: [INT], returns: [FLOAT32] }],
32
- [
33
- "WithLane",
34
- { kind: "func", params: [INT, FLOAT32], returns: [f32x4Type] },
35
- ],
36
- ["Splat", { kind: "func", params: [FLOAT32], returns: [f32x4Type] }],
39
+ ["Add", binary],
40
+ ["Sub", binary],
41
+ ["Mul", binary],
42
+ ["Div", binary],
43
+ ["Min", binary],
44
+ ["Max", binary],
45
+ ["MulAdd", fn([f32x4Type, f32x4Type], [f32x4Type])],
46
+ ["Neg", unary],
47
+ ["Abs", unary],
48
+ ["Sqrt", unary],
49
+ ["Floor", unary],
50
+ ["Ceil", unary],
51
+ ["Trunc", unary],
52
+ ["RoundToEven", unary],
53
+ ["Dot3", fn([f32x4Type], [FLOAT32])],
54
+ ["Dot4", fn([f32x4Type], [FLOAT32])],
55
+ ["Sum", fn([], [FLOAT32])],
56
+ ["Lane", fn([INT], [FLOAT32])],
57
+ ["WithLane", fn([INT, FLOAT32], [f32x4Type])],
58
+ ["Splat", fn([FLOAT32], [f32x4Type])],
59
+ ["Swizzle", fn([INT, INT, INT, INT], [f32x4Type])],
60
+ ["Equal", compare],
61
+ ["NotEqual", compare],
62
+ ["Less", compare],
63
+ ["LessEqual", compare],
64
+ ["Greater", compare],
65
+ ["GreaterEqual", compare],
66
+ ]);
67
+
68
+ const maskBinary = fn([mask32x4Type], [mask32x4Type]);
69
+ mask32x4Type.underlying.methods = new Map([
70
+ ["And", maskBinary],
71
+ ["Or", maskBinary],
72
+ ["Xor", maskBinary],
73
+ ["AndNot", maskBinary],
74
+ ["Not", fn([], [mask32x4Type])],
75
+ ["Any", fn([], [BOOL])],
76
+ ["All", fn([], [BOOL])],
77
+ ["Bits", fn([], [INT])],
78
+ ["Lane", fn([INT], [BOOL])],
37
79
  ]);
38
80
 
39
81
  types.set("simd.F32x4", f32x4Type);
40
82
  types.set("F32x4", f32x4Type);
83
+ types.set("simd.Mask32x4", mask32x4Type);
84
+ types.set("Mask32x4", mask32x4Type);
41
85
 
42
86
  const sharedFloat32 = types.get("shared.Float32") ?? {
43
87
  kind: "named",
@@ -47,6 +91,9 @@ export function setupSimdGlobals(globals, types) {
47
91
 
48
92
  const members = {
49
93
  F32x4: f32x4Type,
94
+ Mask32x4: mask32x4Type,
95
+ Select: fn([mask32x4Type, f32x4Type, f32x4Type], [f32x4Type]),
96
+ Shuffle: fn([f32x4Type, f32x4Type, INT, INT, INT, INT], [f32x4Type]),
50
97
  NewF32x4: {
51
98
  kind: "func",
52
99
  params: [FLOAT32, FLOAT32, FLOAT32, FLOAT32],
@@ -62,6 +109,9 @@ export function setupSimdGlobals(globals, types) {
62
109
  params: [sharedFloat32, INT],
63
110
  returns: [f32x4Type],
64
111
  },
112
+ LoadF32x4Slice: fn([{ kind: "slice", elem: FLOAT32 }, INT], [f32x4Type]),
113
+ StoreF32x4Slice: fn([{ kind: "slice", elem: FLOAT32 }, INT, f32x4Type], []),
114
+ Pad4: fn([INT], [INT]),
65
115
  StoreF32x4: {
66
116
  kind: "func",
67
117
  params: [sharedFloat32, INT, f32x4Type],
@@ -19,7 +19,7 @@ export const terminationMethods = {
19
19
  case "ReturnStmt":
20
20
  return true;
21
21
  case "BranchStmt":
22
- return false;
22
+ return stmt.keyword === "goto";
23
23
  case "ExprStmt":
24
24
  return this._isPanicCall(stmt.expr);
25
25
  case "LabeledStmt":