gofront 1.8.0 → 1.9.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.
- package/README.md +3 -3
- package/package.json +5 -4
- package/src/backend/js/expressions.js +849 -371
- package/src/backend/js/index.js +241 -147
- package/src/backend/js/natives.js +383 -0
- package/src/backend/js/runtime.js +512 -2547
- package/src/backend/js/statements.js +506 -103
- package/src/backend/js/stdlib/index.js +45 -93
- package/src/backend/js/templ.js +32 -45
- package/src/backend/js/type-info.js +177 -13
- package/src/backend/shared/fixed-float.js +20 -0
- package/src/backend/shared/fmt-types.js +63 -171
- package/src/backend/shared/host-unicode.js +36 -0
- package/src/backend/wasm/boundary.js +490 -965
- package/src/backend/wasm/emit-builtins.js +643 -256
- package/src/backend/wasm/emit-exprs.js +124 -57
- package/src/backend/wasm/emit-maps.js +17 -367
- package/src/backend/wasm/emit-stmts.js +325 -75
- package/src/backend/wasm/emit.js +104 -13
- package/src/backend/wasm/globals.js +47 -8
- package/src/backend/wasm/glue.js +2 -4
- package/src/backend/wasm/index.js +36 -530
- package/src/backend/wasm/method-expr.js +12 -1
- package/src/backend/wasm/module-emitter.js +92 -717
- package/src/backend/wasm/monomorph.js +103 -6
- package/src/backend/wasm/natives.js +596 -0
- package/src/backend/wasm/prescan.js +5 -153
- package/src/backend/wasm/prune-funcs.js +89 -0
- package/src/backend/wasm/stdlib/index.js +2 -32
- package/src/backend/wasm/types.js +68 -20
- package/src/backend/wasm/variadic.js +3 -3
- package/src/cli/cli-core.js +5 -1
- package/src/cli/test-runner.js +115 -342
- package/src/compiler.js +108 -130
- package/src/lexer/lexer.js +105 -11
- package/src/lexer/templ-lexer.js +61 -18
- package/src/lexer/tokens.js +1 -0
- package/src/link/stdlib.js +354 -132
- package/src/link/type-names.js +148 -0
- package/src/link/wasm.js +30 -6
- package/src/lower/bounds.js +153 -0
- package/src/lower/captures.js +92 -33
- package/src/lower/embedding.js +32 -3
- package/src/lower/errors-as.js +196 -0
- package/src/lower/fmt-formatters.js +905 -0
- package/src/lower/functions.js +2 -0
- package/src/lower/gen-types.js +274 -0
- package/src/lower/index.js +7 -1
- package/src/lower/json-codecs.js +228 -247
- package/src/lower/ownership.js +25 -7
- package/src/lower/reachability.js +69 -51
- package/src/lower/walk.js +12 -0
- package/src/parser/declarations.js +28 -5
- package/src/parser/expressions.js +86 -16
- package/src/parser/statements.js +1 -0
- package/src/parser/templ.js +44 -5
- package/src/parser/types.js +1 -0
- package/src/resolver.js +1 -2
- package/src/typechecker/assignability.js +124 -11
- package/src/typechecker/const-fold.js +70 -27
- package/src/typechecker/constants.js +32 -6
- package/src/typechecker/expressions.js +326 -98
- package/src/typechecker/index.js +208 -33
- package/src/typechecker/init-order.js +136 -40
- package/src/typechecker/operand-text.js +40 -0
- package/src/typechecker/resolve.js +192 -36
- package/src/typechecker/statements.js +122 -11
- package/src/typechecker/stdlib/excluded.js +9 -5
- package/src/typechecker/stdlib/index.js +25 -9
- package/src/typechecker/termination.js +10 -1
- package/src/typechecker/types.js +203 -573
- package/stdlib/bytes/buffer.go +479 -0
- package/stdlib/bytes/bytes.go +1010 -0
- package/stdlib/bytes/reader.go +161 -0
- package/stdlib/context/context.go +115 -0
- package/stdlib/crypto/rand/rand.go +34 -0
- package/stdlib/crypto/sha256/sha256.go +249 -0
- package/stdlib/encoding/base64/base64.go +331 -0
- package/stdlib/encoding/binary/binary.go +332 -0
- package/stdlib/encoding/hex/hex.go +140 -0
- package/stdlib/encoding/json/json.go +62 -0
- package/stdlib/errors/errors.go +174 -0
- package/stdlib/fmt/errors.go +110 -0
- package/stdlib/fmt/format.go +732 -0
- package/stdlib/fmt/print.go +1232 -0
- package/stdlib/gom/gom.go +293 -0
- package/stdlib/html/html.go +251 -0
- package/stdlib/internal/fmtrt/fmtrt.go +163 -0
- package/stdlib/internal/jsonrt/dec.go +171 -38
- package/stdlib/internal/jsonrt/enc.go +186 -36
- package/stdlib/internal/jsonrt/scanner.go +17 -8
- package/stdlib/io/io.go +157 -1
- package/stdlib/maps/maps.go +131 -0
- package/stdlib/math/bits/bits.go +507 -0
- package/stdlib/math/extra.go +16 -14
- package/stdlib/math/math.go +439 -0
- package/stdlib/math/rand/rand.go +297 -0
- package/stdlib/os/os.go +93 -0
- package/stdlib/path/filepath/filepath.go +47 -0
- package/stdlib/path/path.go +394 -0
- package/stdlib/regexp/regexp.go +231 -0
- package/stdlib/slices/slices.go +526 -0
- package/stdlib/slices/sort.go +209 -0
- package/stdlib/slices/zsort_cmp.go +480 -0
- package/stdlib/slices/zsort_ordered.go +482 -0
- package/stdlib/sort/sort.go +391 -452
- package/stdlib/sort/zsort_func.go +480 -0
- package/stdlib/sort/zsort_iface.go +480 -0
- package/stdlib/strconv/float.go +1699 -0
- package/stdlib/strconv/isprint.go +752 -0
- package/stdlib/strconv/quote.go +235 -50
- package/stdlib/strconv/strconv.go +616 -0
- package/stdlib/strings/builder.go +95 -0
- package/stdlib/strings/reader.go +163 -0
- package/stdlib/strings/replacer.go +102 -0
- package/stdlib/strings/strings.go +807 -0
- package/stdlib/sync/sync.go +268 -0
- package/stdlib/testing/async_js.go +61 -0
- package/stdlib/testing/benchmark.go +297 -0
- package/stdlib/testing/testing.go +523 -0
- package/stdlib/time/duration.go +233 -0
- package/stdlib/time/format.go +745 -0
- package/stdlib/time/parse.go +790 -0
- package/stdlib/time/sleep_js.go +63 -0
- package/stdlib/time/time.go +834 -0
- package/stdlib/unicode/unicode.go +141 -3
- package/stdlib/unicode/utf8/utf8.go +464 -0
- package/src/backend/js/fmt-runtime.js +0 -573
- package/src/backend/js/stdlib/base64.js +0 -12
- package/src/backend/js/stdlib/binary.js +0 -102
- package/src/backend/js/stdlib/bits.js +0 -119
- package/src/backend/js/stdlib/builder.js +0 -98
- package/src/backend/js/stdlib/bytes.js +0 -368
- package/src/backend/js/stdlib/errors.js +0 -45
- package/src/backend/js/stdlib/fmt.js +0 -517
- package/src/backend/js/stdlib/gom.js +0 -155
- package/src/backend/js/stdlib/hex.js +0 -17
- package/src/backend/js/stdlib/html.js +0 -20
- package/src/backend/js/stdlib/io.js +0 -137
- package/src/backend/js/stdlib/json.js +0 -1167
- package/src/backend/js/stdlib/maps.js +0 -37
- package/src/backend/js/stdlib/math.js +0 -85
- package/src/backend/js/stdlib/os.js +0 -13
- package/src/backend/js/stdlib/path.js +0 -48
- package/src/backend/js/stdlib/rand.js +0 -32
- package/src/backend/js/stdlib/regexp.js +0 -54
- package/src/backend/js/stdlib/sha256.js +0 -12
- package/src/backend/js/stdlib/shared.js +0 -17
- package/src/backend/js/stdlib/simd.js +0 -34
- package/src/backend/js/stdlib/slices.js +0 -107
- package/src/backend/js/stdlib/sort.js +0 -30
- package/src/backend/js/stdlib/strconv.js +0 -79
- package/src/backend/js/stdlib/strings.js +0 -301
- package/src/backend/js/stdlib/sync.js +0 -13
- package/src/backend/js/stdlib/testing.js +0 -41
- package/src/backend/js/stdlib/time.js +0 -152
- package/src/backend/js/stdlib/unicode.js +0 -25
- package/src/backend/js/stdlib/utf8.js +0 -26
- package/src/backend/wasm/stdlib/bytes.js +0 -6716
- package/src/backend/wasm/stdlib/core.js +0 -10278
- package/src/backend/wasm/stdlib/io.js +0 -3578
- package/src/backend/wasm/stdlib/packages.js +0 -2402
- package/src/backend/wasm/stdlib/pure.js +0 -720
- package/src/backend/wasm/stdlib/time.js +0 -2229
- package/src/typechecker/stdlib/core.js +0 -1079
- package/src/typechecker/stdlib/extended.js +0 -1210
- package/stdlib/bytes/iter.go +0 -192
- package/stdlib/bytes/search.go +0 -240
- package/stdlib/bytes/split.go +0 -218
- package/stdlib/errors/overlay.go +0 -12
- package/stdlib/maps/iter.go +0 -65
- package/stdlib/slices/extra.go +0 -73
- package/stdlib/slices/iter.go +0 -113
- package/stdlib/strings/extra.go +0 -35
- package/stdlib/strings/iter.go +0 -122
- package/stdlib/sync/extra.go +0 -105
- 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.
|
|
45
|
+
this.emitMapLookup(mapInfo, false);
|
|
47
46
|
break;
|
|
48
47
|
case "get_ok":
|
|
49
|
-
this.
|
|
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.
|
|
63
|
+
this.emitMapProject(mapInfo, false);
|
|
65
64
|
break;
|
|
66
65
|
case "values":
|
|
67
|
-
this.
|
|
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
|
-
|
|
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: "
|
|
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
|
-
|
|
1736
|
-
const sliceInfo = this.mod.getSliceType(
|
|
1737
|
-
|
|
1738
|
-
|
|
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
|
}
|