gofront 1.6.1 → 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 (132) hide show
  1. package/README.md +45 -49
  2. package/package.json +12 -8
  3. package/src/backend/js/expressions.js +1627 -148
  4. package/src/backend/js/fmt-runtime.js +573 -0
  5. package/src/backend/js/index.js +508 -102
  6. package/src/backend/js/runtime.js +1997 -106
  7. package/src/backend/js/statements.js +931 -87
  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 +7 -1
  12. package/src/backend/js/stdlib/fmt.js +349 -10
  13. package/src/backend/js/stdlib/index.js +19 -2
  14. package/src/backend/js/stdlib/json.js +1167 -0
  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 +34 -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 +446 -72
  29. package/src/backend/wasm/emit-builtins.js +320 -13
  30. package/src/backend/wasm/emit-exprs.js +1404 -199
  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 +518 -74
  34. package/src/backend/wasm/encode.js +128 -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/optimize.js +4 -2
  41. package/src/backend/wasm/prescan.js +397 -0
  42. package/src/backend/wasm/stdlib/bytes.js +1804 -127
  43. package/src/backend/wasm/stdlib/core.js +1574 -199
  44. package/src/backend/wasm/stdlib/index.js +3 -5
  45. package/src/backend/wasm/stdlib/io.js +1567 -150
  46. package/src/backend/wasm/stdlib/packages.js +2 -0
  47. package/src/backend/wasm/stdlib/simd.js +499 -0
  48. package/src/backend/wasm/stdlib/time.js +1041 -12
  49. package/src/backend/wasm/types.js +221 -15
  50. package/src/backend/wasm/variadic.js +93 -0
  51. package/src/backend/wasm/wat.js +84 -20
  52. package/src/{cli-core.js → cli/cli-core.js} +236 -10
  53. package/src/{test-runner.js → cli/test-runner.js} +332 -39
  54. package/src/{vendor.js → cli/vendor.js} +89 -15
  55. package/src/compiler.js +107 -269
  56. package/src/dts-parser.js +71 -14
  57. package/src/index.js +15 -169
  58. package/src/{lexer.js → lexer/lexer.js} +102 -55
  59. package/src/{tokens.js → lexer/tokens.js} +1 -0
  60. package/src/link/sourcemap.js +97 -0
  61. package/src/link/stdlib.js +515 -0
  62. package/src/link/wasm.js +294 -0
  63. package/src/lower/bounds.js +394 -0
  64. package/src/lower/boxing.js +1 -6
  65. package/src/lower/captures.js +176 -32
  66. package/src/lower/embedding.js +2 -1
  67. package/src/lower/index.js +26 -18
  68. package/src/lower/json-codecs.js +1398 -0
  69. package/src/lower/ownership.js +22 -1
  70. package/src/lower/range.js +86 -1
  71. package/src/lower/reachability.js +132 -0
  72. package/src/parser/declarations.js +58 -13
  73. package/src/parser/expressions.js +29 -7
  74. package/src/parser/index.js +2 -1
  75. package/src/parser/statements.js +37 -22
  76. package/src/parser/struct-tag.js +144 -0
  77. package/src/{templ-parser.js → parser/templ.js} +138 -15
  78. package/src/parser/types.js +130 -13
  79. package/src/resolver.js +22 -1
  80. package/src/typechecker/assignability.js +215 -11
  81. package/src/typechecker/const-fold.js +356 -0
  82. package/src/typechecker/constants.js +256 -0
  83. package/src/typechecker/expressions.js +960 -99
  84. package/src/typechecker/index.js +491 -72
  85. package/src/typechecker/init-order.js +330 -0
  86. package/src/typechecker/resolve.js +596 -52
  87. package/src/typechecker/statements.js +157 -17
  88. package/src/typechecker/stdlib/core.js +333 -55
  89. package/src/typechecker/stdlib/excluded.js +898 -0
  90. package/src/typechecker/stdlib/extended.js +359 -26
  91. package/src/typechecker/{stdlib.js → stdlib/index.js} +6 -4
  92. package/src/typechecker/stdlib/simd.js +123 -0
  93. package/src/typechecker/termination.js +1 -1
  94. package/src/typechecker/types.js +165 -26
  95. package/stdlib/bytes/iter.go +192 -0
  96. package/stdlib/bytes/search.go +240 -0
  97. package/stdlib/bytes/split.go +218 -0
  98. package/stdlib/cmp/cmp.go +65 -0
  99. package/stdlib/encoding/json/errors.go +31 -0
  100. package/stdlib/encoding/json/indent.go +71 -0
  101. package/stdlib/encoding/json/number.go +12 -0
  102. package/stdlib/encoding/json/stream.go +173 -0
  103. package/stdlib/errors/overlay.go +12 -0
  104. package/stdlib/hash/hash.go +53 -0
  105. package/stdlib/internal/jsonrt/dec.go +738 -0
  106. package/stdlib/internal/jsonrt/enc.go +366 -0
  107. package/stdlib/internal/jsonrt/indent.go +135 -0
  108. package/stdlib/internal/jsonrt/number.go +27 -0
  109. package/stdlib/internal/jsonrt/reader.go +73 -0
  110. package/stdlib/internal/jsonrt/scanner.go +649 -0
  111. package/stdlib/io/io.go +346 -0
  112. package/stdlib/iter/iter.go +18 -0
  113. package/stdlib/maps/iter.go +65 -0
  114. package/stdlib/math/extra.go +270 -0
  115. package/stdlib/slices/extra.go +73 -0
  116. package/stdlib/slices/iter.go +113 -0
  117. package/stdlib/sort/sort.go +561 -0
  118. package/stdlib/strconv/quote.go +341 -0
  119. package/stdlib/strings/extra.go +35 -0
  120. package/stdlib/strings/iter.go +122 -0
  121. package/stdlib/sync/extra.go +105 -0
  122. package/stdlib/unicode/unicode.go +112 -0
  123. package/stdlib/unicode/utf8/bytes.go +239 -0
  124. package/src/backend/wasm/const-fold.js +0 -205
  125. package/src/backend/wasm/emit-stdlib.js +0 -13
  126. /package/src/{asset-manager.js → cli/asset-manager.js} +0 -0
  127. /package/src/{colors.js → cli/colors.js} +0 -0
  128. /package/src/{dev-server.js → cli/dev-server.js} +0 -0
  129. /package/src/{minifier.js → cli/minifier.js} +0 -0
  130. /package/src/{project-config.js → cli/project-config.js} +0 -0
  131. /package/src/{pwa.js → cli/pwa.js} +0 -0
  132. /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] }],
532
623
  ]);
533
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] }],
698
+ ]);
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",
@@ -853,6 +1149,43 @@ export function setupExtendedGlobals(globals, types) {
853
1149
  types.set("encoding/base64.Encoding", BASE64_ENCODING_T);
854
1150
  types.set("base64.Encoding", BASE64_ENCODING_T);
855
1151
 
1152
+ // ── encoding/json ─────────────────────────────────────────────
1153
+ const RAW_MESSAGE_T = {
1154
+ kind: "named",
1155
+ name: "json.RawMessage",
1156
+ underlying: BYTE_SLICE,
1157
+ methods: new Map(),
1158
+ };
1159
+ globals.define("json", {
1160
+ kind: "namespace",
1161
+ name: "json",
1162
+ members: {
1163
+ Marshal: {
1164
+ kind: "func",
1165
+ params: [ANY],
1166
+ returns: [BYTE_SLICE, ERROR],
1167
+ },
1168
+ MarshalIndent: {
1169
+ kind: "func",
1170
+ params: [ANY, STRING, STRING],
1171
+ returns: [BYTE_SLICE, ERROR],
1172
+ },
1173
+ Unmarshal: {
1174
+ kind: "func",
1175
+ params: [BYTE_SLICE, ANY],
1176
+ returns: [ERROR],
1177
+ },
1178
+ Valid: {
1179
+ kind: "func",
1180
+ params: [BYTE_SLICE],
1181
+ returns: [BOOL],
1182
+ },
1183
+ RawMessage: RAW_MESSAGE_T,
1184
+ },
1185
+ });
1186
+ types.set("encoding/json.RawMessage", RAW_MESSAGE_T);
1187
+ types.set("json.RawMessage", RAW_MESSAGE_T);
1188
+
856
1189
  for (const name of [
857
1190
  "append",
858
1191
  "len",
@@ -7,14 +7,16 @@
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 { 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";
14
15
 
15
16
  export function setupGlobals(globals, types) {
16
17
  setupCoreGlobals(globals, types);
17
18
  setupExtendedGlobals(globals, types);
18
19
  setupSharedGlobals(globals, types);
20
+ setupSimdGlobals(globals, types);
19
21
  setupWebGlobals(globals, types);
20
22
  }
@@ -0,0 +1,123 @@
1
+ // src/typechecker/stdlib/simd.js
2
+ // `gofront/simd` — WebAssembly SIMD types and vector operations.
3
+ //
4
+ // F32x4 is a 128-bit 4-wide float32 vector with Go value semantics:
5
+ // - Lowered to WASM v128 in wasm packages.
6
+ // - Lowered to a frozen 4-number array with Math.fround in js packages.
7
+
8
+ import { BOOL, FLOAT32, INT } from "../types.js";
9
+
10
+ export function setupSimdGlobals(globals, types) {
11
+ const f32x4Type = {
12
+ kind: "named",
13
+ name: "simd.F32x4",
14
+ underlying: {
15
+ kind: "simd",
16
+ simd: "F32x4",
17
+ elem: FLOAT32,
18
+ lanes: 4,
19
+ },
20
+ };
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
+
38
+ f32x4Type.underlying.methods = new Map([
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])],
79
+ ]);
80
+
81
+ types.set("simd.F32x4", f32x4Type);
82
+ types.set("F32x4", f32x4Type);
83
+ types.set("simd.Mask32x4", mask32x4Type);
84
+ types.set("Mask32x4", mask32x4Type);
85
+
86
+ const sharedFloat32 = types.get("shared.Float32") ?? {
87
+ kind: "named",
88
+ name: "shared.Float32",
89
+ underlying: { kind: "shared", elem: FLOAT32, shared: "Float32" },
90
+ };
91
+
92
+ const members = {
93
+ F32x4: f32x4Type,
94
+ Mask32x4: mask32x4Type,
95
+ Select: fn([mask32x4Type, f32x4Type, f32x4Type], [f32x4Type]),
96
+ Shuffle: fn([f32x4Type, f32x4Type, INT, INT, INT, INT], [f32x4Type]),
97
+ NewF32x4: {
98
+ kind: "func",
99
+ params: [FLOAT32, FLOAT32, FLOAT32, FLOAT32],
100
+ returns: [f32x4Type],
101
+ },
102
+ Splat: {
103
+ kind: "func",
104
+ params: [FLOAT32],
105
+ returns: [f32x4Type],
106
+ },
107
+ LoadF32x4: {
108
+ kind: "func",
109
+ params: [sharedFloat32, INT],
110
+ returns: [f32x4Type],
111
+ },
112
+ LoadF32x4Slice: fn([{ kind: "slice", elem: FLOAT32 }, INT], [f32x4Type]),
113
+ StoreF32x4Slice: fn([{ kind: "slice", elem: FLOAT32 }, INT, f32x4Type], []),
114
+ Pad4: fn([INT], [INT]),
115
+ StoreF32x4: {
116
+ kind: "func",
117
+ params: [sharedFloat32, INT, f32x4Type],
118
+ returns: [],
119
+ },
120
+ };
121
+
122
+ globals.define("simd", { kind: "namespace", name: "simd", members });
123
+ }
@@ -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":