gofront 1.6.0 → 1.7.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 (80) hide show
  1. package/README.md +35 -39
  2. package/package.json +37 -4
  3. package/src/backend/js/expressions.js +559 -144
  4. package/src/backend/js/index.js +174 -49
  5. package/src/backend/js/runtime.js +1518 -54
  6. package/src/backend/js/statements.js +91 -73
  7. package/src/backend/js/stdlib/base64.js +12 -0
  8. package/src/backend/js/stdlib/binary.js +102 -0
  9. package/src/backend/js/stdlib/bits.js +15 -1
  10. package/src/backend/js/stdlib/builder.js +28 -9
  11. package/src/backend/js/stdlib/bytes.js +75 -18
  12. package/src/backend/js/stdlib/errors.js +25 -1
  13. package/src/backend/js/stdlib/fmt.js +70 -13
  14. package/src/backend/js/stdlib/hex.js +17 -0
  15. package/src/backend/js/stdlib/html.js +1 -1
  16. package/src/backend/js/stdlib/index.js +28 -0
  17. package/src/backend/js/stdlib/io.js +105 -3
  18. package/src/backend/js/stdlib/json.js +972 -0
  19. package/src/backend/js/stdlib/math.js +13 -1
  20. package/src/backend/js/stdlib/path.js +18 -4
  21. package/src/backend/js/stdlib/rand.js +10 -5
  22. package/src/backend/js/stdlib/sha256.js +12 -0
  23. package/src/backend/js/stdlib/simd.js +24 -0
  24. package/src/backend/js/stdlib/slices.js +52 -26
  25. package/src/backend/js/stdlib/strconv.js +21 -5
  26. package/src/backend/js/stdlib/strings.js +148 -15
  27. package/src/backend/js/stdlib/sync.js +13 -0
  28. package/src/backend/js/stdlib/time.js +90 -19
  29. package/src/backend/js/stdlib/unicode.js +2 -2
  30. package/src/backend/wasm/boundary.js +1225 -41
  31. package/src/backend/wasm/const-fold.js +205 -0
  32. package/src/backend/wasm/emit-builtins.js +220 -76
  33. package/src/backend/wasm/emit-exprs.js +475 -276
  34. package/src/backend/wasm/emit-maps.js +144 -8
  35. package/src/backend/wasm/emit-stdlib.js +12 -3005
  36. package/src/backend/wasm/emit-stmts.js +264 -270
  37. package/src/backend/wasm/emit.js +124 -87
  38. package/src/backend/wasm/encode.js +140 -29
  39. package/src/backend/wasm/index.js +1001 -32
  40. package/src/backend/wasm/optimize.js +17 -6
  41. package/src/backend/wasm/stdlib/bytes.js +5039 -0
  42. package/src/backend/wasm/stdlib/core.js +8903 -0
  43. package/src/backend/wasm/stdlib/index.js +43 -0
  44. package/src/backend/wasm/stdlib/io.js +2161 -0
  45. package/src/backend/wasm/stdlib/packages.js +2400 -0
  46. package/src/backend/wasm/stdlib/pure.js +720 -0
  47. package/src/backend/wasm/stdlib/simd.js +234 -0
  48. package/src/backend/wasm/stdlib/time.js +1200 -0
  49. package/src/backend/wasm/types.js +174 -1
  50. package/src/backend/wasm/wat.js +37 -0
  51. package/src/cli-core.js +1 -1
  52. package/src/compiler.js +18 -4
  53. package/src/dts-parser.js +150 -140
  54. package/src/index.js +2 -6
  55. package/src/lexer.js +80 -29
  56. package/src/lower/boxing.js +1 -7
  57. package/src/lower/captures.js +2 -6
  58. package/src/lower/embedding.js +2 -1
  59. package/src/lower/ownership.js +30 -9
  60. package/src/minifier.js +20 -68
  61. package/src/parser/declarations.js +3 -6
  62. package/src/parser/expressions.js +3 -8
  63. package/src/parser/index.js +18 -3
  64. package/src/parser/statements.js +25 -38
  65. package/src/parser/struct-tag.js +144 -0
  66. package/src/parser/types.js +64 -8
  67. package/src/resolver.js +2 -27
  68. package/src/templ-lexer.js +29 -63
  69. package/src/templ-parser.js +22 -45
  70. package/src/typechecker/assignability.js +126 -13
  71. package/src/typechecker/expressions.js +168 -16
  72. package/src/typechecker/index.js +35 -8
  73. package/src/typechecker/resolve.js +187 -8
  74. package/src/typechecker/statements.js +68 -9
  75. package/src/typechecker/stdlib/core.js +280 -89
  76. package/src/typechecker/stdlib/extended.js +490 -1
  77. package/src/typechecker/stdlib/simd.js +73 -0
  78. package/src/typechecker/stdlib.js +2 -0
  79. package/src/typechecker/types.js +362 -9
  80. package/src/vendor.js +86 -11
@@ -8,8 +8,13 @@ import {
8
8
  FLOAT32,
9
9
  FLOAT64,
10
10
  INT,
11
+ INT32,
12
+ INT64,
11
13
  STRING,
12
14
  UINT8,
15
+ UINT16,
16
+ UINT32,
17
+ UINT64,
13
18
  VOID,
14
19
  } from "../types.js";
15
20
 
@@ -251,15 +256,27 @@ export function setupExtendedGlobals(globals, types) {
251
256
  ["Write", { kind: "func", params: [BYTE_SLICE_T], returns: [INT, ERROR] }],
252
257
  ["String", { kind: "func", params: [], returns: [STRING] }],
253
258
  ["Len", { kind: "func", params: [], returns: [INT] }],
259
+ ["Cap", { kind: "func", params: [], returns: [INT] }],
254
260
  ["Reset", { kind: "func", params: [], returns: [VOID] }],
255
261
  ["Grow", { kind: "func", params: [INT], returns: [VOID] }],
256
262
  ];
263
+ const STR_SLICE_T = { kind: "slice", elem: STRING };
257
264
  const _makeBuilderType = (name, extra = []) => ({
258
265
  kind: "named",
259
266
  name,
260
267
  underlying: {
261
268
  kind: "struct",
262
- fields: new Map(),
269
+ fields: new Map(
270
+ name === "strings.Builder"
271
+ ? [
272
+ ["_buf", STR_SLICE_T],
273
+ ["_len", INT],
274
+ ["_self", ANY],
275
+ ]
276
+ : name === "bytes.Buffer"
277
+ ? [["_buf", BYTE_SLICE_T]]
278
+ : [],
279
+ ),
263
280
  methods: new Map([..._builderBase, ...extra]),
264
281
  },
265
282
  });
@@ -272,9 +289,107 @@ export function setupExtendedGlobals(globals, types) {
272
289
  types.set(
273
290
  "bytes.Buffer",
274
291
  _makeBuilderType("bytes.Buffer", [
292
+ ["WriteRune", { kind: "func", params: [INT], returns: [INT, ERROR] }],
275
293
  ["Bytes", { kind: "func", params: [], returns: [BYTE_SLICE_T] }],
294
+ ["Read", { kind: "func", params: [BYTE_SLICE_T], returns: [INT, ERROR] }],
276
295
  ]),
277
296
  );
297
+ types.set("strings.Replacer", {
298
+ kind: "named",
299
+ name: "strings.Replacer",
300
+ underlying: {
301
+ kind: "struct",
302
+ fields: new Map([["_pairs", STR_SLICE_T]]),
303
+ methods: new Map([
304
+ ["Replace", { kind: "func", params: [STRING], returns: [STRING] }],
305
+ ]),
306
+ },
307
+ });
308
+ const _makeReaderType = (name, srcType, resetArgType = srcType) => ({
309
+ kind: "named",
310
+ name,
311
+ underlying: {
312
+ kind: "struct",
313
+ fields: new Map([
314
+ ["_src", srcType],
315
+ ["_pos", INT],
316
+ ]),
317
+ methods: new Map([
318
+ [
319
+ "Read",
320
+ { kind: "func", params: [BYTE_SLICE_T], returns: [INT, ERROR] },
321
+ ],
322
+ ["Len", { kind: "func", params: [], returns: [INT] }],
323
+ ["Reset", { kind: "func", params: [resetArgType], returns: [VOID] }],
324
+ ]),
325
+ },
326
+ });
327
+ types.set(
328
+ "strings.Reader",
329
+ _makeReaderType("strings.Reader", BYTE_SLICE_T, STRING),
330
+ );
331
+ types.set("bytes.Reader", _makeReaderType("bytes.Reader", BYTE_SLICE_T));
332
+ types.set("io.discard", {
333
+ kind: "named",
334
+ name: "io.discard",
335
+ underlying: {
336
+ kind: "struct",
337
+ fields: new Map(),
338
+ methods: new Map([
339
+ [
340
+ "Write",
341
+ { kind: "func", params: [BYTE_SLICE_T], returns: [INT, ERROR] },
342
+ ],
343
+ [
344
+ "WriteString",
345
+ { kind: "func", params: [STRING], returns: [INT, ERROR] },
346
+ ],
347
+ ]),
348
+ },
349
+ });
350
+ const ioPkg = globals.lookup("io");
351
+ const IO_READER = ioPkg?.members?.Reader ?? {
352
+ kind: "interface",
353
+ name: "io.Reader",
354
+ };
355
+ types.set("io.LimitedReader", {
356
+ kind: "named",
357
+ name: "io.LimitedReader",
358
+ underlying: {
359
+ kind: "struct",
360
+ fields: new Map([
361
+ ["R", IO_READER],
362
+ ["N", INT64],
363
+ ]),
364
+ methods: new Map([
365
+ [
366
+ "Read",
367
+ { kind: "func", params: [BYTE_SLICE_T], returns: [INT, ERROR] },
368
+ ],
369
+ ]),
370
+ },
371
+ });
372
+ if (ioPkg?.members) {
373
+ ioPkg.members.LimitedReader = types.get("io.LimitedReader");
374
+ }
375
+ const stringsPkg = globals.lookup("strings");
376
+ if (stringsPkg?.members) {
377
+ stringsPkg.members.NewReader = {
378
+ kind: "func",
379
+ params: [STRING],
380
+ returns: [{ kind: "pointer", base: types.get("strings.Reader") }],
381
+ };
382
+ stringsPkg.members.Reader = types.get("strings.Reader");
383
+ }
384
+ const bytesPkg = globals.lookup("bytes");
385
+ if (bytesPkg?.members) {
386
+ bytesPkg.members.NewReader = {
387
+ kind: "func",
388
+ params: [BYTE_SLICE_T],
389
+ returns: [{ kind: "pointer", base: types.get("bytes.Reader") }],
390
+ };
391
+ bytesPkg.members.Reader = types.get("bytes.Reader");
392
+ }
278
393
 
279
394
  globals.define("rand", {
280
395
  kind: "namespace",
@@ -295,6 +410,25 @@ export function setupExtendedGlobals(globals, types) {
295
410
  params: [INT],
296
411
  returns: [{ kind: "slice", elem: INT }],
297
412
  },
413
+ Read: {
414
+ kind: "func",
415
+ params: [{ kind: "slice", elem: UINT8 }],
416
+ returns: [INT, ERROR],
417
+ },
418
+ Reader: {
419
+ kind: "interface",
420
+ name: "io.Reader",
421
+ methods: new Map([
422
+ [
423
+ "Read",
424
+ {
425
+ kind: "func",
426
+ params: [{ kind: "slice", elem: UINT8 }],
427
+ returns: [INT, ERROR],
428
+ },
429
+ ],
430
+ ]),
431
+ },
298
432
  },
299
433
  });
300
434
 
@@ -340,9 +474,16 @@ export function setupExtendedGlobals(globals, types) {
340
474
  IsAbs: { kind: "func", params: [STRING], returns: [BOOL] },
341
475
  Split: { kind: "func", params: [STRING], returns: [STRING, STRING] },
342
476
  Match: { kind: "func", params: [STRING, STRING], returns: [BOOL, ERROR] },
477
+ ErrBadPattern: ERROR,
343
478
  },
344
479
  });
345
480
 
481
+ globals.define("filepath", {
482
+ kind: "namespace",
483
+ name: "filepath",
484
+ members: globals.lookup("path").members,
485
+ });
486
+
346
487
  const TESTING_T = {
347
488
  kind: "named",
348
489
  name: "testing.T",
@@ -401,6 +542,354 @@ export function setupExtendedGlobals(globals, types) {
401
542
  });
402
543
  types.set("testing.T", TESTING_T);
403
544
 
545
+ // ── sync ──────────────────────────────────────────────────────
546
+ const MUTEX_T = {
547
+ kind: "named",
548
+ name: "sync.Mutex",
549
+ underlying: { kind: "struct", fields: new Map([["state", INT32]]) },
550
+ methods: new Map([
551
+ ["Lock", { kind: "func", params: [], returns: [VOID] }],
552
+ ["Unlock", { kind: "func", params: [], returns: [VOID] }],
553
+ ["TryLock", { kind: "func", params: [], returns: [BOOL] }],
554
+ ]),
555
+ };
556
+ const RWMUTEX_T = {
557
+ kind: "named",
558
+ name: "sync.RWMutex",
559
+ underlying: { kind: "struct", fields: new Map([["state", INT32]]) },
560
+ methods: new Map([
561
+ ["Lock", { kind: "func", params: [], returns: [VOID] }],
562
+ ["Unlock", { kind: "func", params: [], returns: [VOID] }],
563
+ ["RLock", { kind: "func", params: [], returns: [VOID] }],
564
+ ["RUnlock", { kind: "func", params: [], returns: [VOID] }],
565
+ ["TryLock", { kind: "func", params: [], returns: [BOOL] }],
566
+ ["TryRLock", { kind: "func", params: [], returns: [BOOL] }],
567
+ ]),
568
+ };
569
+ const ONCE_T = {
570
+ kind: "named",
571
+ name: "sync.Once",
572
+ underlying: { kind: "struct", fields: new Map([["done", UINT32]]) },
573
+ methods: new Map([
574
+ [
575
+ "Do",
576
+ {
577
+ kind: "func",
578
+ params: [{ kind: "func", params: [], returns: [VOID] }],
579
+ returns: [VOID],
580
+ },
581
+ ],
582
+ ]),
583
+ };
584
+ const WAITGROUP_T = {
585
+ kind: "named",
586
+ name: "sync.WaitGroup",
587
+ underlying: { kind: "struct", fields: new Map([["counter", INT]]) },
588
+ methods: new Map([
589
+ ["Add", { kind: "func", params: [INT], returns: [VOID] }],
590
+ ["Done", { kind: "func", params: [], returns: [VOID] }],
591
+ ["Wait", { kind: "func", params: [], returns: [VOID] }],
592
+ ]),
593
+ };
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
+ globals.define("sync", {
603
+ kind: "namespace",
604
+ name: "sync",
605
+ members: {
606
+ Mutex: MUTEX_T,
607
+ RWMutex: RWMUTEX_T,
608
+ Once: ONCE_T,
609
+ WaitGroup: WAITGROUP_T,
610
+ Locker: LOCKER_T,
611
+ },
612
+ });
613
+ types.set("sync.Mutex", MUTEX_T);
614
+ types.set("sync.RWMutex", RWMUTEX_T);
615
+ types.set("sync.Once", ONCE_T);
616
+ types.set("sync.WaitGroup", WAITGROUP_T);
617
+ types.set("sync.Locker", LOCKER_T);
618
+
619
+ // ── crypto/sha256 ─────────────────────────────────────────────
620
+ const BYTE_SLICE = { kind: "slice", elem: UINT8 };
621
+ const HASH_T = {
622
+ kind: "interface",
623
+ methods: new Map([
624
+ ["Write", { kind: "func", params: [BYTE_SLICE], returns: [INT, ERROR] }],
625
+ ["Sum", { kind: "func", params: [BYTE_SLICE], returns: [BYTE_SLICE] }],
626
+ ["Reset", { kind: "func", params: [], returns: [VOID] }],
627
+ ["Size", { kind: "func", params: [], returns: [INT] }],
628
+ ["BlockSize", { kind: "func", params: [], returns: [INT] }],
629
+ ]),
630
+ };
631
+ const SHA256_DIGEST_T = {
632
+ kind: "named",
633
+ name: "sha256.digest",
634
+ underlying: { kind: "struct", fields: new Map([["buf", BYTE_SLICE]]) },
635
+ methods: new Map([
636
+ ["Write", { kind: "func", params: [BYTE_SLICE], returns: [INT, ERROR] }],
637
+ ["Sum", { kind: "func", params: [BYTE_SLICE], returns: [BYTE_SLICE] }],
638
+ ["Reset", { kind: "func", params: [], returns: [VOID] }],
639
+ ["Size", { kind: "func", params: [], returns: [INT] }],
640
+ ["BlockSize", { kind: "func", params: [], returns: [INT] }],
641
+ ]),
642
+ };
643
+ globals.define("sha256", {
644
+ kind: "namespace",
645
+ name: "sha256",
646
+ members: {
647
+ Size: INT,
648
+ BlockSize: INT,
649
+ Sum256: {
650
+ kind: "func",
651
+ params: [BYTE_SLICE],
652
+ returns: [{ kind: "array", size: 32, elem: UINT8 }],
653
+ },
654
+ New: { kind: "func", params: [], returns: [HASH_T] },
655
+ },
656
+ });
657
+ types.set("hash.Hash", HASH_T);
658
+ types.set("sha256.digest", SHA256_DIGEST_T);
659
+ types.set("crypto/sha256.digest", SHA256_DIGEST_T);
660
+
661
+ // ── encoding/binary ───────────────────────────────────────────
662
+ const BYTE_ORDER_METHODS = [
663
+ ["Uint16", { kind: "func", params: [BYTE_SLICE], returns: [UINT16] }],
664
+ ["Uint32", { kind: "func", params: [BYTE_SLICE], returns: [UINT32] }],
665
+ ["Uint64", { kind: "func", params: [BYTE_SLICE], returns: [UINT64] }],
666
+ [
667
+ "PutUint16",
668
+ { kind: "func", params: [BYTE_SLICE, UINT16], returns: [VOID] },
669
+ ],
670
+ [
671
+ "PutUint32",
672
+ { kind: "func", params: [BYTE_SLICE, UINT32], returns: [VOID] },
673
+ ],
674
+ [
675
+ "PutUint64",
676
+ { kind: "func", params: [BYTE_SLICE, UINT64], returns: [VOID] },
677
+ ],
678
+ ["String", { kind: "func", params: [], returns: [STRING] }],
679
+ ];
680
+ const BYTE_ORDER_T = {
681
+ kind: "interface",
682
+ methods: new Map(BYTE_ORDER_METHODS),
683
+ };
684
+ const LITTLE_ENDIAN_METHODS = new Map([
685
+ ...BYTE_ORDER_METHODS,
686
+ [
687
+ "AppendUint16",
688
+ { kind: "func", params: [BYTE_SLICE, UINT16], returns: [BYTE_SLICE] },
689
+ ],
690
+ [
691
+ "AppendUint32",
692
+ { kind: "func", params: [BYTE_SLICE, UINT32], returns: [BYTE_SLICE] },
693
+ ],
694
+ [
695
+ "AppendUint64",
696
+ { kind: "func", params: [BYTE_SLICE, UINT64], returns: [BYTE_SLICE] },
697
+ ],
698
+ ]);
699
+ const LITTLE_ENDIAN_T = {
700
+ kind: "named",
701
+ name: "binary.LittleEndian",
702
+ underlying: {
703
+ kind: "struct",
704
+ fields: new Map([["order", INT32]]),
705
+ methods: LITTLE_ENDIAN_METHODS,
706
+ },
707
+ methods: LITTLE_ENDIAN_METHODS,
708
+ };
709
+ const BIG_ENDIAN_METHODS = new Map([
710
+ ...BYTE_ORDER_METHODS,
711
+ [
712
+ "AppendUint16",
713
+ { kind: "func", params: [BYTE_SLICE, UINT16], returns: [BYTE_SLICE] },
714
+ ],
715
+ [
716
+ "AppendUint32",
717
+ { kind: "func", params: [BYTE_SLICE, UINT32], returns: [BYTE_SLICE] },
718
+ ],
719
+ [
720
+ "AppendUint64",
721
+ { kind: "func", params: [BYTE_SLICE, UINT64], returns: [BYTE_SLICE] },
722
+ ],
723
+ ]);
724
+ const BIG_ENDIAN_T = {
725
+ kind: "named",
726
+ name: "binary.BigEndian",
727
+ underlying: {
728
+ kind: "struct",
729
+ fields: new Map([["order", INT32]]),
730
+ methods: BIG_ENDIAN_METHODS,
731
+ },
732
+ methods: BIG_ENDIAN_METHODS,
733
+ };
734
+ globals.define("binary", {
735
+ kind: "namespace",
736
+ name: "binary",
737
+ members: {
738
+ ByteOrder: BYTE_ORDER_T,
739
+ LittleEndian: LITTLE_ENDIAN_T,
740
+ BigEndian: BIG_ENDIAN_T,
741
+ Read: {
742
+ kind: "func",
743
+ params: [ANY, BYTE_ORDER_T, ANY],
744
+ returns: [ERROR],
745
+ },
746
+ Write: {
747
+ kind: "func",
748
+ params: [ANY, BYTE_ORDER_T, ANY],
749
+ returns: [ERROR],
750
+ },
751
+ Size: { kind: "func", params: [ANY], returns: [INT] },
752
+ AppendUint16: {
753
+ kind: "func",
754
+ params: [BYTE_SLICE, UINT16],
755
+ returns: [BYTE_SLICE],
756
+ },
757
+ AppendUint32: {
758
+ kind: "func",
759
+ params: [BYTE_SLICE, UINT32],
760
+ returns: [BYTE_SLICE],
761
+ },
762
+ AppendUint64: {
763
+ kind: "func",
764
+ params: [BYTE_SLICE, UINT64],
765
+ returns: [BYTE_SLICE],
766
+ },
767
+ },
768
+ });
769
+ types.set("encoding/binary.ByteOrder", BYTE_ORDER_T);
770
+ types.set("binary.ByteOrder", BYTE_ORDER_T);
771
+ types.set("encoding/binary.LittleEndian", LITTLE_ENDIAN_T);
772
+ types.set("binary.LittleEndian", LITTLE_ENDIAN_T);
773
+ types.set("encoding/binary.BigEndian", BIG_ENDIAN_T);
774
+ types.set("binary.BigEndian", BIG_ENDIAN_T);
775
+
776
+ // ── encoding/hex ──────────────────────────────────────────────
777
+ globals.define("hex", {
778
+ kind: "namespace",
779
+ name: "hex",
780
+ members: {
781
+ EncodeToString: { kind: "func", params: [BYTE_SLICE], returns: [STRING] },
782
+ DecodeString: {
783
+ kind: "func",
784
+ params: [STRING],
785
+ returns: [BYTE_SLICE, ERROR],
786
+ },
787
+ Encode: {
788
+ kind: "func",
789
+ params: [BYTE_SLICE, BYTE_SLICE],
790
+ returns: [INT],
791
+ },
792
+ Decode: {
793
+ kind: "func",
794
+ params: [BYTE_SLICE, BYTE_SLICE],
795
+ returns: [INT, ERROR],
796
+ },
797
+ EncodedLen: { kind: "func", params: [INT], returns: [INT] },
798
+ DecodedLen: { kind: "func", params: [INT], returns: [INT] },
799
+ ErrLength: ERROR,
800
+ },
801
+ });
802
+
803
+ // ── encoding/base64 ───────────────────────────────────────────
804
+ const BASE64_ENCODING_METHODS = new Map([
805
+ [
806
+ "EncodeToString",
807
+ { kind: "func", params: [BYTE_SLICE], returns: [STRING] },
808
+ ],
809
+ [
810
+ "DecodeString",
811
+ { kind: "func", params: [STRING], returns: [BYTE_SLICE, ERROR] },
812
+ ],
813
+ [
814
+ "Encode",
815
+ { kind: "func", params: [BYTE_SLICE, BYTE_SLICE], returns: [VOID] },
816
+ ],
817
+ [
818
+ "Decode",
819
+ { kind: "func", params: [BYTE_SLICE, BYTE_SLICE], returns: [INT, ERROR] },
820
+ ],
821
+ ["EncodedLen", { kind: "func", params: [INT], returns: [INT] }],
822
+ ["DecodedLen", { kind: "func", params: [INT], returns: [INT] }],
823
+ ["WithPadding", { kind: "func", params: [INT], returns: [ANY] }],
824
+ ]);
825
+ const BASE64_ENCODING_T = {
826
+ kind: "named",
827
+ name: "base64.Encoding",
828
+ underlying: {
829
+ kind: "struct",
830
+ fields: new Map([["mode", INT32]]),
831
+ methods: BASE64_ENCODING_METHODS,
832
+ },
833
+ methods: BASE64_ENCODING_METHODS,
834
+ };
835
+ globals.define("base64", {
836
+ kind: "namespace",
837
+ name: "base64",
838
+ members: {
839
+ Encoding: BASE64_ENCODING_T,
840
+ StdEncoding: BASE64_ENCODING_T,
841
+ URLEncoding: BASE64_ENCODING_T,
842
+ RawStdEncoding: BASE64_ENCODING_T,
843
+ RawURLEncoding: BASE64_ENCODING_T,
844
+ NewEncoding: {
845
+ kind: "func",
846
+ params: [STRING],
847
+ returns: [BASE64_ENCODING_T],
848
+ },
849
+ StdPadding: INT,
850
+ NoPadding: INT,
851
+ },
852
+ });
853
+ types.set("encoding/base64.Encoding", BASE64_ENCODING_T);
854
+ types.set("base64.Encoding", BASE64_ENCODING_T);
855
+
856
+ // ── encoding/json ─────────────────────────────────────────────
857
+ const RAW_MESSAGE_T = {
858
+ kind: "named",
859
+ name: "json.RawMessage",
860
+ underlying: BYTE_SLICE,
861
+ methods: new Map(),
862
+ };
863
+ globals.define("json", {
864
+ kind: "namespace",
865
+ name: "json",
866
+ members: {
867
+ Marshal: {
868
+ kind: "func",
869
+ params: [ANY],
870
+ returns: [BYTE_SLICE, ERROR],
871
+ },
872
+ MarshalIndent: {
873
+ kind: "func",
874
+ params: [ANY, STRING, STRING],
875
+ returns: [BYTE_SLICE, ERROR],
876
+ },
877
+ Unmarshal: {
878
+ kind: "func",
879
+ params: [BYTE_SLICE, ANY],
880
+ returns: [ERROR],
881
+ },
882
+ Valid: {
883
+ kind: "func",
884
+ params: [BYTE_SLICE],
885
+ returns: [BOOL],
886
+ },
887
+ RawMessage: RAW_MESSAGE_T,
888
+ },
889
+ });
890
+ types.set("encoding/json.RawMessage", RAW_MESSAGE_T);
891
+ types.set("json.RawMessage", RAW_MESSAGE_T);
892
+
404
893
  for (const name of [
405
894
  "append",
406
895
  "len",
@@ -0,0 +1,73 @@
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 { 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
+ 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] }],
37
+ ]);
38
+
39
+ types.set("simd.F32x4", f32x4Type);
40
+ types.set("F32x4", f32x4Type);
41
+
42
+ const sharedFloat32 = types.get("shared.Float32") ?? {
43
+ kind: "named",
44
+ name: "shared.Float32",
45
+ underlying: { kind: "shared", elem: FLOAT32, shared: "Float32" },
46
+ };
47
+
48
+ const members = {
49
+ F32x4: f32x4Type,
50
+ NewF32x4: {
51
+ kind: "func",
52
+ params: [FLOAT32, FLOAT32, FLOAT32, FLOAT32],
53
+ returns: [f32x4Type],
54
+ },
55
+ Splat: {
56
+ kind: "func",
57
+ params: [FLOAT32],
58
+ returns: [f32x4Type],
59
+ },
60
+ LoadF32x4: {
61
+ kind: "func",
62
+ params: [sharedFloat32, INT],
63
+ returns: [f32x4Type],
64
+ },
65
+ StoreF32x4: {
66
+ kind: "func",
67
+ params: [sharedFloat32, INT, f32x4Type],
68
+ returns: [],
69
+ },
70
+ };
71
+
72
+ globals.define("simd", { kind: "namespace", name: "simd", members });
73
+ }
@@ -10,11 +10,13 @@
10
10
  import { setupCoreGlobals } from "./stdlib/core.js";
11
11
  import { setupExtendedGlobals } from "./stdlib/extended.js";
12
12
  import { setupSharedGlobals } from "./stdlib/shared.js";
13
+ import { setupSimdGlobals } from "./stdlib/simd.js";
13
14
  import { setupWebGlobals } from "./stdlib/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
  }