gofront 1.8.0 → 1.9.1

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 (178) hide show
  1. package/README.md +3 -3
  2. package/package.json +6 -5
  3. package/src/backend/js/expressions.js +1157 -408
  4. package/src/backend/js/index.js +327 -153
  5. package/src/backend/js/natives.js +383 -0
  6. package/src/backend/js/runtime.js +559 -2552
  7. package/src/backend/js/statements.js +670 -158
  8. package/src/backend/js/stdlib/index.js +45 -93
  9. package/src/backend/js/templ.js +32 -45
  10. package/src/backend/js/type-info.js +298 -19
  11. package/src/backend/shared/fixed-float.js +20 -0
  12. package/src/backend/shared/fmt-types.js +91 -170
  13. package/src/backend/shared/host-unicode.js +36 -0
  14. package/src/backend/wasm/boundary.js +490 -965
  15. package/src/backend/wasm/emit-builtins.js +884 -256
  16. package/src/backend/wasm/emit-exprs.js +185 -77
  17. package/src/backend/wasm/emit-maps.js +17 -367
  18. package/src/backend/wasm/emit-shared.js +4 -1
  19. package/src/backend/wasm/emit-stmts.js +524 -240
  20. package/src/backend/wasm/emit.js +176 -38
  21. package/src/backend/wasm/globals.js +48 -8
  22. package/src/backend/wasm/glue.js +2 -4
  23. package/src/backend/wasm/index.js +44 -530
  24. package/src/backend/wasm/method-expr.js +12 -1
  25. package/src/backend/wasm/module-emitter.js +299 -770
  26. package/src/backend/wasm/monomorph.js +139 -8
  27. package/src/backend/wasm/natives.js +600 -0
  28. package/src/backend/wasm/prescan.js +5 -153
  29. package/src/backend/wasm/prune-funcs.js +89 -0
  30. package/src/backend/wasm/stdlib/index.js +2 -32
  31. package/src/backend/wasm/types.js +97 -20
  32. package/src/backend/wasm/variadic.js +9 -4
  33. package/src/cli/cli-core.js +5 -1
  34. package/src/cli/test-runner.js +115 -342
  35. package/src/compiler.js +113 -130
  36. package/src/lexer/lexer.js +106 -11
  37. package/src/lexer/templ-lexer.js +61 -18
  38. package/src/lexer/tokens.js +1 -0
  39. package/src/link/stdlib.js +355 -132
  40. package/src/link/type-names.js +204 -0
  41. package/src/link/wasm.js +30 -6
  42. package/src/lower/bounds.js +153 -0
  43. package/src/lower/captures.js +92 -33
  44. package/src/lower/embedding.js +62 -5
  45. package/src/lower/errors-as.js +196 -0
  46. package/src/lower/fmt-formatters.js +929 -0
  47. package/src/lower/functions.js +225 -7
  48. package/src/lower/gen-types.js +293 -0
  49. package/src/lower/index.js +14 -2
  50. package/src/lower/json-codecs.js +334 -245
  51. package/src/lower/ownership.js +25 -7
  52. package/src/lower/reachability.js +69 -51
  53. package/src/lower/walk.js +12 -0
  54. package/src/parser/declarations.js +30 -5
  55. package/src/parser/expressions.js +111 -57
  56. package/src/parser/statements.js +108 -0
  57. package/src/parser/templ.js +44 -5
  58. package/src/parser/types.js +12 -0
  59. package/src/resolver.js +1 -2
  60. package/src/typechecker/assignability.js +214 -19
  61. package/src/typechecker/const-fold.js +70 -27
  62. package/src/typechecker/constants.js +156 -8
  63. package/src/typechecker/expressions.js +490 -108
  64. package/src/typechecker/index.js +346 -42
  65. package/src/typechecker/init-order.js +136 -40
  66. package/src/typechecker/operand-text.js +41 -0
  67. package/src/typechecker/resolve.js +490 -65
  68. package/src/typechecker/statements.js +288 -27
  69. package/src/typechecker/stdlib/excluded.js +9 -5
  70. package/src/typechecker/stdlib/index.js +25 -9
  71. package/src/typechecker/termination.js +10 -1
  72. package/src/typechecker/types.js +287 -575
  73. package/stdlib/bytes/buffer.go +479 -0
  74. package/stdlib/bytes/bytes.go +1010 -0
  75. package/stdlib/bytes/reader.go +161 -0
  76. package/stdlib/context/context.go +115 -0
  77. package/stdlib/crypto/rand/rand.go +34 -0
  78. package/stdlib/crypto/sha256/sha256.go +249 -0
  79. package/stdlib/encoding/base64/base64.go +331 -0
  80. package/stdlib/encoding/binary/binary.go +332 -0
  81. package/stdlib/encoding/hex/hex.go +140 -0
  82. package/stdlib/encoding/json/json.go +62 -0
  83. package/stdlib/errors/errors.go +174 -0
  84. package/stdlib/fmt/errors.go +110 -0
  85. package/stdlib/fmt/format.go +732 -0
  86. package/stdlib/fmt/print.go +1232 -0
  87. package/stdlib/gom/gom.go +293 -0
  88. package/stdlib/html/html.go +251 -0
  89. package/stdlib/internal/fmtrt/fmtrt.go +163 -0
  90. package/stdlib/internal/jsonrt/dec.go +171 -38
  91. package/stdlib/internal/jsonrt/enc.go +186 -36
  92. package/stdlib/internal/jsonrt/scanner.go +17 -8
  93. package/stdlib/io/io.go +157 -1
  94. package/stdlib/maps/maps.go +131 -0
  95. package/stdlib/math/bits/bits.go +507 -0
  96. package/stdlib/math/extra.go +16 -14
  97. package/stdlib/math/math.go +439 -0
  98. package/stdlib/math/rand/rand.go +297 -0
  99. package/stdlib/os/os.go +93 -0
  100. package/stdlib/path/filepath/filepath.go +47 -0
  101. package/stdlib/path/path.go +394 -0
  102. package/stdlib/regexp/regexp.go +231 -0
  103. package/stdlib/slices/slices.go +526 -0
  104. package/stdlib/slices/sort.go +209 -0
  105. package/stdlib/slices/zsort_cmp.go +480 -0
  106. package/stdlib/slices/zsort_ordered.go +482 -0
  107. package/stdlib/sort/sort.go +391 -452
  108. package/stdlib/sort/zsort_func.go +480 -0
  109. package/stdlib/sort/zsort_iface.go +480 -0
  110. package/stdlib/strconv/float.go +1699 -0
  111. package/stdlib/strconv/isprint.go +752 -0
  112. package/stdlib/strconv/quote.go +235 -50
  113. package/stdlib/strconv/strconv.go +616 -0
  114. package/stdlib/strings/builder.go +95 -0
  115. package/stdlib/strings/reader.go +163 -0
  116. package/stdlib/strings/replacer.go +102 -0
  117. package/stdlib/strings/strings.go +807 -0
  118. package/stdlib/sync/sync.go +268 -0
  119. package/stdlib/testing/async_js.go +61 -0
  120. package/stdlib/testing/benchmark.go +297 -0
  121. package/stdlib/testing/testing.go +523 -0
  122. package/stdlib/time/duration.go +233 -0
  123. package/stdlib/time/format.go +745 -0
  124. package/stdlib/time/parse.go +790 -0
  125. package/stdlib/time/sleep_js.go +63 -0
  126. package/stdlib/time/time.go +834 -0
  127. package/stdlib/unicode/unicode.go +141 -3
  128. package/stdlib/unicode/utf8/utf8.go +464 -0
  129. package/src/backend/js/fmt-runtime.js +0 -573
  130. package/src/backend/js/stdlib/base64.js +0 -12
  131. package/src/backend/js/stdlib/binary.js +0 -102
  132. package/src/backend/js/stdlib/bits.js +0 -119
  133. package/src/backend/js/stdlib/builder.js +0 -98
  134. package/src/backend/js/stdlib/bytes.js +0 -368
  135. package/src/backend/js/stdlib/errors.js +0 -45
  136. package/src/backend/js/stdlib/fmt.js +0 -517
  137. package/src/backend/js/stdlib/gom.js +0 -155
  138. package/src/backend/js/stdlib/hex.js +0 -17
  139. package/src/backend/js/stdlib/html.js +0 -20
  140. package/src/backend/js/stdlib/io.js +0 -137
  141. package/src/backend/js/stdlib/json.js +0 -1167
  142. package/src/backend/js/stdlib/maps.js +0 -37
  143. package/src/backend/js/stdlib/math.js +0 -85
  144. package/src/backend/js/stdlib/os.js +0 -13
  145. package/src/backend/js/stdlib/path.js +0 -48
  146. package/src/backend/js/stdlib/rand.js +0 -32
  147. package/src/backend/js/stdlib/regexp.js +0 -54
  148. package/src/backend/js/stdlib/sha256.js +0 -12
  149. package/src/backend/js/stdlib/shared.js +0 -17
  150. package/src/backend/js/stdlib/simd.js +0 -34
  151. package/src/backend/js/stdlib/slices.js +0 -107
  152. package/src/backend/js/stdlib/sort.js +0 -30
  153. package/src/backend/js/stdlib/strconv.js +0 -79
  154. package/src/backend/js/stdlib/strings.js +0 -301
  155. package/src/backend/js/stdlib/sync.js +0 -13
  156. package/src/backend/js/stdlib/testing.js +0 -41
  157. package/src/backend/js/stdlib/time.js +0 -152
  158. package/src/backend/js/stdlib/unicode.js +0 -25
  159. package/src/backend/js/stdlib/utf8.js +0 -26
  160. package/src/backend/wasm/stdlib/bytes.js +0 -6716
  161. package/src/backend/wasm/stdlib/core.js +0 -10278
  162. package/src/backend/wasm/stdlib/io.js +0 -3578
  163. package/src/backend/wasm/stdlib/packages.js +0 -2402
  164. package/src/backend/wasm/stdlib/pure.js +0 -720
  165. package/src/backend/wasm/stdlib/time.js +0 -2229
  166. package/src/typechecker/stdlib/core.js +0 -1079
  167. package/src/typechecker/stdlib/extended.js +0 -1210
  168. package/stdlib/bytes/iter.go +0 -192
  169. package/stdlib/bytes/search.go +0 -240
  170. package/stdlib/bytes/split.go +0 -218
  171. package/stdlib/errors/overlay.go +0 -12
  172. package/stdlib/maps/iter.go +0 -65
  173. package/stdlib/slices/extra.go +0 -73
  174. package/stdlib/slices/iter.go +0 -113
  175. package/stdlib/strings/extra.go +0 -35
  176. package/stdlib/strings/iter.go +0 -122
  177. package/stdlib/sync/extra.go +0 -105
  178. package/stdlib/unicode/utf8/bytes.go +0 -239
@@ -8,7 +8,6 @@ import {
8
8
  isComplex64,
9
9
  isInterfaceType,
10
10
  isPointerToStruct,
11
- isSigned,
12
11
  isStringType,
13
12
  toWasmType,
14
13
  } from "./types.js";
@@ -43,10 +42,10 @@ export class MapsEmitter {
43
42
  this.emitMapMake(mapInfo);
44
43
  break;
45
44
  case "get":
46
- this.emitMapGet(mapInfo);
45
+ this.emitMapLookup(mapInfo, false);
47
46
  break;
48
47
  case "get_ok":
49
- this.emitMapGetOk(mapInfo);
48
+ this.emitMapLookup(mapInfo, true);
50
49
  break;
51
50
  case "set":
52
51
  this.emitMapSet(mapInfo);
@@ -61,13 +60,10 @@ export class MapsEmitter {
61
60
  this.emitMapClear(mapInfo);
62
61
  break;
63
62
  case "keys":
64
- this.emitMapKeys(mapInfo);
63
+ this.emitMapProject(mapInfo, false);
65
64
  break;
66
65
  case "values":
67
- this.emitMapValues(mapInfo);
68
- break;
69
- case "clone":
70
- this.emitMapClone(mapInfo);
66
+ this.emitMapProject(mapInfo, true);
71
67
  break;
72
68
  }
73
69
  }
@@ -421,44 +417,6 @@ export class MapsEmitter {
421
417
  this.pushInstruction("ref.eq");
422
418
  }
423
419
 
424
- emitElemLt(v1Loc, v2Loc, elemGoType) {
425
- if (isStringType(elemGoType, this.mod.checker)) {
426
- this.pushInstruction({ op: "local.get", index: v1Loc });
427
- this.pushInstruction({ op: "local.get", index: v2Loc });
428
- this.pushInstruction({
429
- op: "call",
430
- funcIndex: this.mod.getStringCmpImportIndex("<"),
431
- });
432
- return;
433
- }
434
- const wType = toWasmType(elemGoType, this.mod.checker, this.mod);
435
- if (wType === "i64") {
436
- this.pushInstruction({ op: "local.get", index: v1Loc });
437
- this.pushInstruction({ op: "local.get", index: v2Loc });
438
- this.pushInstruction(isSigned(elemGoType) ? "i64.lt_s" : "i64.lt_u");
439
- return;
440
- }
441
- if (wType === "i32") {
442
- this.pushInstruction({ op: "local.get", index: v1Loc });
443
- this.pushInstruction({ op: "local.get", index: v2Loc });
444
- this.pushInstruction(isSigned(elemGoType) ? "i32.lt_s" : "i32.lt_u");
445
- return;
446
- }
447
- if (wType === "f32") {
448
- this.pushInstruction({ op: "local.get", index: v1Loc });
449
- this.pushInstruction({ op: "local.get", index: v2Loc });
450
- this.pushInstruction("f32.lt");
451
- return;
452
- }
453
- if (wType === "f64") {
454
- this.pushInstruction({ op: "local.get", index: v1Loc });
455
- this.pushInstruction({ op: "local.get", index: v2Loc });
456
- this.pushInstruction("f64.lt");
457
- return;
458
- }
459
- this.pushInstruction({ op: "i32.const", value: 0 });
460
- }
461
-
462
420
  emitMapMake(mapInfo) {
463
421
  const nBucketsLoc = this.allocLocal(null, "i32");
464
422
  const cLoc = this.allocLocal(null, "i32");
@@ -536,7 +494,7 @@ export class MapsEmitter {
536
494
  this.pushInstruction({ op: "return" });
537
495
  }
538
496
 
539
- emitMapGet(mapInfo) {
497
+ emitMapLookup(mapInfo, withOk) {
540
498
  const hLoc = this.allocLocal(null, "i32");
541
499
  const bLoc = this.allocLocal(null, "i32");
542
500
  const idxLoc = this.allocLocal(null, "i32");
@@ -547,11 +505,12 @@ export class MapsEmitter {
547
505
  });
548
506
  const entryKeyLoc = this.allocLocal(null, mapInfo.keyWType);
549
507
 
550
- // If m == null -> return zero
508
+ // If m == null -> return zero (and false when withOk)
551
509
  this.pushInstruction({ op: "local.get", index: 0 });
552
510
  this.pushInstruction("ref.is_null");
553
511
  this.pushInstruction({ op: "if", blockType: "void" });
554
512
  this.emitZeroValue(mapInfo.valGoType, mapInfo.valWType);
513
+ if (withOk) this.pushInstruction({ op: "i32.const", value: 0 });
555
514
  this.pushInstruction({ op: "return" });
556
515
  this.pushInstruction("end");
557
516
 
@@ -633,6 +592,7 @@ export class MapsEmitter {
633
592
  typeIndex: mapInfo.entryTypeIndex,
634
593
  fieldIndex: 1,
635
594
  });
595
+ if (withOk) this.pushInstruction({ op: "i32.const", value: 1 });
636
596
  this.pushInstruction({ op: "return" });
637
597
  this.pushInstruction("end");
638
598
  this.pushInstruction("end");
@@ -650,121 +610,7 @@ export class MapsEmitter {
650
610
 
651
611
  // Not found
652
612
  this.emitZeroValue(mapInfo.valGoType, mapInfo.valWType);
653
- this.pushInstruction({ op: "return" });
654
- }
655
-
656
- emitMapGetOk(mapInfo) {
657
- const hLoc = this.allocLocal(null, "i32");
658
- const bLoc = this.allocLocal(null, "i32");
659
- const idxLoc = this.allocLocal(null, "i32");
660
- const entryLoc = this.allocLocal(null, {
661
- kind: "ref",
662
- nullable: true,
663
- typeIndex: mapInfo.entryTypeIndex,
664
- });
665
- const entryKeyLoc = this.allocLocal(null, mapInfo.keyWType);
666
-
667
- // If m == null -> return zero, false
668
- this.pushInstruction({ op: "local.get", index: 0 });
669
- this.pushInstruction("ref.is_null");
670
- this.pushInstruction({ op: "if", blockType: "void" });
671
- this.emitZeroValue(mapInfo.valGoType, mapInfo.valWType);
672
- this.pushInstruction({ op: "i32.const", value: 0 });
673
- this.pushInstruction({ op: "return" });
674
- this.pushInstruction("end");
675
-
676
- this.emitKeyHash(1, mapInfo.keyGoType);
677
- this.pushInstruction({ op: "local.set", index: hLoc });
678
-
679
- this.pushInstruction({ op: "local.get", index: hLoc });
680
- this.pushInstruction({ op: "local.get", index: 0 });
681
- this.pushInstruction({
682
- op: "struct.get",
683
- typeIndex: mapInfo.typeIndex,
684
- fieldIndex: 8,
685
- });
686
- this.pushInstruction({ op: "i32.const", value: 1 });
687
- this.pushInstruction("i32.sub");
688
- this.pushInstruction("i32.and");
689
- this.pushInstruction({ op: "local.set", index: bLoc });
690
-
691
- this.pushInstruction({ op: "local.get", index: 0 });
692
- this.pushInstruction({
693
- op: "struct.get",
694
- typeIndex: mapInfo.typeIndex,
695
- fieldIndex: 0,
696
- });
697
- this.pushInstruction({ op: "local.get", index: bLoc });
698
- this.pushInstruction({
699
- op: "array.get",
700
- typeIndex: mapInfo.bucketsTypeIndex,
701
- });
702
- this.pushInstruction({ op: "local.set", index: idxLoc });
703
-
704
- this.pushInstruction({ op: "block", blockType: "void" });
705
- this.pushInstruction({ op: "loop", blockType: "void" });
706
- this.pushInstruction({ op: "local.get", index: idxLoc });
707
- this.pushInstruction({ op: "i32.const", value: -1 });
708
- this.pushInstruction("i32.eq");
709
- this.pushInstruction({ op: "br_if", depth: 1 });
710
-
711
- this.pushInstruction({ op: "local.get", index: 0 });
712
- this.pushInstruction({
713
- op: "struct.get",
714
- typeIndex: mapInfo.typeIndex,
715
- fieldIndex: 1,
716
- });
717
- this.pushInstruction({ op: "local.get", index: idxLoc });
718
- this.pushInstruction({
719
- op: "array.get",
720
- typeIndex: mapInfo.entriesTypeIndex,
721
- });
722
- this.pushInstruction({ op: "local.set", index: entryLoc });
723
-
724
- this.pushInstruction({ op: "local.get", index: entryLoc });
725
- this.pushInstruction({
726
- op: "struct.get",
727
- typeIndex: mapInfo.entryTypeIndex,
728
- fieldIndex: 5,
729
- });
730
- this.pushInstruction({ op: "i32.const", value: 1 });
731
- this.pushInstruction("i32.eq");
732
- this.pushInstruction({ op: "if", blockType: "void" });
733
-
734
- this.pushInstruction({ op: "local.get", index: entryLoc });
735
- this.pushInstruction({
736
- op: "struct.get",
737
- typeIndex: mapInfo.entryTypeIndex,
738
- fieldIndex: 0,
739
- });
740
- this.pushInstruction({ op: "local.set", index: entryKeyLoc });
741
-
742
- this.emitKeyEq(1, entryKeyLoc, mapInfo.keyGoType);
743
- this.pushInstruction({ op: "if", blockType: "void" });
744
- this.pushInstruction({ op: "local.get", index: entryLoc });
745
- this.pushInstruction({
746
- op: "struct.get",
747
- typeIndex: mapInfo.entryTypeIndex,
748
- fieldIndex: 1,
749
- });
750
- this.pushInstruction({ op: "i32.const", value: 1 });
751
- this.pushInstruction({ op: "return" });
752
- this.pushInstruction("end");
753
- this.pushInstruction("end");
754
-
755
- this.pushInstruction({ op: "local.get", index: entryLoc });
756
- this.pushInstruction({
757
- op: "struct.get",
758
- typeIndex: mapInfo.entryTypeIndex,
759
- fieldIndex: 2,
760
- });
761
- this.pushInstruction({ op: "local.set", index: idxLoc });
762
- this.pushInstruction({ op: "br", depth: 0 });
763
- this.pushInstruction("end");
764
- this.pushInstruction("end");
765
-
766
- this.emitZeroValue(mapInfo.valGoType, mapInfo.valWType);
767
- this.pushInstruction({ op: "i32.const", value: 0 });
613
+ if (withOk) this.pushInstruction({ op: "i32.const", value: 0 });
768
614
  this.pushInstruction({ op: "return" });
769
615
  }
770
616
 
@@ -1192,6 +1038,9 @@ export class MapsEmitter {
1192
1038
 
1193
1039
  // new_entry = struct.new (key, val, next=buckets[b], order_prev=oldTail, order_next=-1, active=1)
1194
1040
  this.pushInstruction({ op: "local.get", index: 1 });
1041
+ // The stored key is a copy: later writes to the caller's array or
1042
+ // struct must not change the map's key.
1043
+ this._emitCopyMapEntry(mapInfo.keyGoType, mapInfo.keyWType);
1195
1044
  this.pushInstruction({ op: "local.get", index: 2 });
1196
1045
  this.pushInstruction({ op: "local.get", index: 0 });
1197
1046
  this.pushInstruction({
@@ -1732,120 +1581,10 @@ export class MapsEmitter {
1732
1581
  this.pushInstruction({ op: "return" });
1733
1582
  }
1734
1583
 
1735
- emitMapKeys(mapInfo) {
1736
- const sliceInfo = this.mod.getSliceType(mapInfo.keyGoType);
1737
- const lenLoc = this.allocLocal(null, "i32");
1738
- const arrLoc = this.allocLocal(null, {
1739
- kind: "ref",
1740
- nullable: true,
1741
- typeIndex: sliceInfo.arrInfo.typeIndex,
1742
- });
1743
- const iLoc = this.allocLocal(null, "i32");
1744
- const idxLoc = this.allocLocal(null, "i32");
1745
- const entryLoc = this.allocLocal(null, {
1746
- kind: "ref",
1747
- nullable: true,
1748
- typeIndex: mapInfo.entryTypeIndex,
1749
- });
1750
-
1751
- this.pushInstruction({ op: "local.get", index: 0 });
1752
- this.pushInstruction("ref.is_null");
1753
- this.pushInstruction({ op: "if", blockType: "void" });
1754
- this.pushInstruction({
1755
- op: "global.get",
1756
- index: sliceInfo.emptyGlobalIndex,
1757
- });
1758
- this.pushInstruction({ op: "return" });
1759
- this.pushInstruction("end");
1760
-
1761
- this.pushInstruction({ op: "local.get", index: 0 });
1762
- this.pushInstruction({
1763
- op: "struct.get",
1764
- typeIndex: mapInfo.typeIndex,
1765
- fieldIndex: 2,
1766
- });
1767
- this.pushInstruction({ op: "local.set", index: lenLoc });
1768
-
1769
- this.pushInstruction({ op: "local.get", index: lenLoc });
1770
- this.pushInstruction({
1771
- op: "array.new_default",
1772
- typeIndex: sliceInfo.arrInfo.typeIndex,
1773
- });
1774
- this.pushInstruction({ op: "local.set", index: arrLoc });
1775
-
1776
- this.pushInstruction({ op: "i32.const", value: 0 });
1777
- this.pushInstruction({ op: "local.set", index: iLoc });
1778
-
1779
- this.pushInstruction({ op: "local.get", index: 0 });
1780
- this.pushInstruction({
1781
- op: "struct.get",
1782
- typeIndex: mapInfo.typeIndex,
1783
- fieldIndex: 5,
1784
- });
1785
- this.pushInstruction({ op: "local.set", index: idxLoc });
1786
-
1787
- this.pushInstruction({ op: "block", blockType: "void" });
1788
- this.pushInstruction({ op: "loop", blockType: "void" });
1789
- this.pushInstruction({ op: "local.get", index: idxLoc });
1790
- this.pushInstruction({ op: "i32.const", value: -1 });
1791
- this.pushInstruction("i32.eq");
1792
- this.pushInstruction({ op: "br_if", depth: 1 });
1793
-
1794
- this.pushInstruction({ op: "local.get", index: 0 });
1795
- this.pushInstruction({
1796
- op: "struct.get",
1797
- typeIndex: mapInfo.typeIndex,
1798
- fieldIndex: 1,
1799
- });
1800
- this.pushInstruction({ op: "local.get", index: idxLoc });
1801
- this.pushInstruction({
1802
- op: "array.get",
1803
- typeIndex: mapInfo.entriesTypeIndex,
1804
- });
1805
- this.pushInstruction({ op: "local.set", index: entryLoc });
1806
-
1807
- this.pushInstruction({ op: "local.get", index: arrLoc });
1808
- this.pushInstruction({ op: "local.get", index: iLoc });
1809
- this.pushInstruction({ op: "local.get", index: entryLoc });
1810
- this.pushInstruction({
1811
- op: "struct.get",
1812
- typeIndex: mapInfo.entryTypeIndex,
1813
- fieldIndex: 0,
1814
- });
1815
- this.pushInstruction({
1816
- op: "array.set",
1817
- typeIndex: sliceInfo.arrInfo.typeIndex,
1818
- });
1819
-
1820
- this.pushInstruction({ op: "local.get", index: iLoc });
1821
- this.pushInstruction({ op: "i32.const", value: 1 });
1822
- this.pushInstruction("i32.add");
1823
- this.pushInstruction({ op: "local.set", index: iLoc });
1824
-
1825
- this.pushInstruction({ op: "local.get", index: entryLoc });
1826
- this.pushInstruction({
1827
- op: "struct.get",
1828
- typeIndex: mapInfo.entryTypeIndex,
1829
- fieldIndex: 4,
1830
- });
1831
- this.pushInstruction({ op: "local.set", index: idxLoc });
1832
- this.pushInstruction({ op: "br", depth: 0 });
1833
- this.pushInstruction("end");
1834
- this.pushInstruction("end");
1835
-
1836
- this.pushInstruction({ op: "local.get", index: arrLoc });
1837
- this.pushInstruction({ op: "i32.const", value: 0 });
1838
- this.pushInstruction({ op: "local.get", index: lenLoc });
1839
- this.pushInstruction({ op: "local.get", index: lenLoc });
1840
- this.pushInstruction({
1841
- op: "struct.new",
1842
- typeIndex: sliceInfo.typeIndex,
1843
- });
1844
- this.pushInstruction({ op: "return" });
1845
- }
1846
-
1847
- emitMapValues(mapInfo) {
1848
- const sliceInfo = this.mod.getSliceType(mapInfo.valGoType);
1584
+ emitMapProject(mapInfo, isValues) {
1585
+ const sliceInfo = this.mod.getSliceType(
1586
+ isValues ? mapInfo.valGoType : mapInfo.keyGoType,
1587
+ );
1849
1588
  const lenLoc = this.allocLocal(null, "i32");
1850
1589
  const arrLoc = this.allocLocal(null, {
1851
1590
  kind: "ref",
@@ -1922,7 +1661,7 @@ export class MapsEmitter {
1922
1661
  this.pushInstruction({
1923
1662
  op: "struct.get",
1924
1663
  typeIndex: mapInfo.entryTypeIndex,
1925
- fieldIndex: 1,
1664
+ fieldIndex: isValues ? 1 : 0,
1926
1665
  });
1927
1666
  this.pushInstruction({
1928
1667
  op: "array.set",
@@ -1955,93 +1694,4 @@ export class MapsEmitter {
1955
1694
  });
1956
1695
  this.pushInstruction({ op: "return" });
1957
1696
  }
1958
-
1959
- emitMapClone(mapInfo) {
1960
- const dstLoc = this.allocLocal(null, mapInfo.wType);
1961
- const idxLoc = this.allocLocal(null, "i32");
1962
- const entryLoc = this.allocLocal(null, {
1963
- kind: "ref",
1964
- nullable: true,
1965
- typeIndex: mapInfo.entryTypeIndex,
1966
- });
1967
-
1968
- this.pushInstruction({ op: "local.get", index: 0 });
1969
- this.pushInstruction("ref.is_null");
1970
- this.pushInstruction({ op: "if", blockType: "void" });
1971
- this.pushInstruction({ op: "ref.null", heapType: mapInfo.typeIndex });
1972
- this.pushInstruction({ op: "return" });
1973
- this.pushInstruction("end");
1974
-
1975
- this.pushInstruction({ op: "local.get", index: 0 });
1976
- this.pushInstruction({
1977
- op: "struct.get",
1978
- typeIndex: mapInfo.typeIndex,
1979
- fieldIndex: 2,
1980
- });
1981
- this.pushInstruction({
1982
- op: "call",
1983
- funcIndex: this.mod.resolveFuncIndex(mapInfo.makeFuncName),
1984
- });
1985
- this.pushInstruction({ op: "local.set", index: dstLoc });
1986
-
1987
- this.pushInstruction({ op: "local.get", index: 0 });
1988
- this.pushInstruction({
1989
- op: "struct.get",
1990
- typeIndex: mapInfo.typeIndex,
1991
- fieldIndex: 5,
1992
- });
1993
- this.pushInstruction({ op: "local.set", index: idxLoc });
1994
-
1995
- this.pushInstruction({ op: "block", blockType: "void" });
1996
- this.pushInstruction({ op: "loop", blockType: "void" });
1997
- this.pushInstruction({ op: "local.get", index: idxLoc });
1998
- this.pushInstruction({ op: "i32.const", value: -1 });
1999
- this.pushInstruction("i32.eq");
2000
- this.pushInstruction({ op: "br_if", depth: 1 });
2001
-
2002
- this.pushInstruction({ op: "local.get", index: 0 });
2003
- this.pushInstruction({
2004
- op: "struct.get",
2005
- typeIndex: mapInfo.typeIndex,
2006
- fieldIndex: 1,
2007
- });
2008
- this.pushInstruction({ op: "local.get", index: idxLoc });
2009
- this.pushInstruction({
2010
- op: "array.get",
2011
- typeIndex: mapInfo.entriesTypeIndex,
2012
- });
2013
- this.pushInstruction({ op: "local.set", index: entryLoc });
2014
-
2015
- this.pushInstruction({ op: "local.get", index: dstLoc });
2016
- this.pushInstruction({ op: "local.get", index: entryLoc });
2017
- this.pushInstruction({
2018
- op: "struct.get",
2019
- typeIndex: mapInfo.entryTypeIndex,
2020
- fieldIndex: 0,
2021
- });
2022
- this.pushInstruction({ op: "local.get", index: entryLoc });
2023
- this.pushInstruction({
2024
- op: "struct.get",
2025
- typeIndex: mapInfo.entryTypeIndex,
2026
- fieldIndex: 1,
2027
- });
2028
- this.pushInstruction({
2029
- op: "call",
2030
- funcIndex: this.mod.resolveFuncIndex(mapInfo.setFuncName),
2031
- });
2032
-
2033
- this.pushInstruction({ op: "local.get", index: entryLoc });
2034
- this.pushInstruction({
2035
- op: "struct.get",
2036
- typeIndex: mapInfo.entryTypeIndex,
2037
- fieldIndex: 4,
2038
- });
2039
- this.pushInstruction({ op: "local.set", index: idxLoc });
2040
- this.pushInstruction({ op: "br", depth: 0 });
2041
- this.pushInstruction("end");
2042
- this.pushInstruction("end");
2043
-
2044
- this.pushInstruction({ op: "local.get", index: dstLoc });
2045
- this.pushInstruction({ op: "return" });
2046
- }
2047
1697
  }
@@ -381,7 +381,10 @@ export class SharedEmitter {
381
381
  store(lhs[1], valLocalInfo);
382
382
  }
383
383
 
384
- if (bodyBlock) this.emitBlock(bodyBlock);
384
+ if (bodyBlock) {
385
+ this._emitRangeBoxes();
386
+ this.emitBlock(bodyBlock);
387
+ }
385
388
 
386
389
  this.pushInstruction("end");
387
390
  this.pushInstruction({ op: "local.get", index: idxTmp });