goscript 0.1.3 → 0.2.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 +5 -2
- package/cmd/go_js_wasm_exec/main.go +201 -0
- package/cmd/go_js_wasm_exec/main_test.go +83 -0
- package/cmd/goscript/{cmd_compile.go → cmd-compile.go} +35 -8
- package/cmd/goscript/cmd-test.go +14 -0
- package/cmd/goscript/cmd-test_test.go +1 -1
- package/cmd/goscript/cmd_compile_test.go +105 -6
- package/compiler/build-flags.go +9 -10
- package/compiler/compile-request.go +12 -9
- package/compiler/compliance_test.go +0 -1
- package/compiler/config.go +2 -0
- package/compiler/gotest/request.go +28 -0
- package/compiler/gotest/runner.go +353 -27
- package/compiler/gotest/runner_test.go +400 -1
- package/compiler/gotest/testdata/browserapi/browserapi_test.go +20 -0
- package/compiler/gotest/testdata/browserapi/go.mod +3 -0
- package/compiler/lowered-program.go +24 -17
- package/compiler/lowering.go +988 -263
- package/compiler/lowering_bench_test.go +364 -0
- package/compiler/override-facts.go +15 -0
- package/compiler/override-parity-verifier.go +450 -0
- package/compiler/override-parity.go +122 -0
- package/compiler/override-registry_test.go +559 -0
- package/compiler/package-graph.go +61 -4
- package/compiler/package-graph_test.go +30 -0
- package/compiler/protobuf-ts-binding.go +514 -0
- package/compiler/protobuf-ts-binding_test.go +172 -0
- package/compiler/semantic-model-types.go +17 -4
- package/compiler/semantic-model.go +709 -72
- package/compiler/semantic-model_test.go +219 -0
- package/compiler/service.go +20 -1
- package/compiler/skeleton_test.go +1008 -20
- package/compiler/typescript-emitter.go +147 -15
- package/dist/gs/builtin/builtin.d.ts +2 -2
- package/dist/gs/builtin/builtin.js +20 -0
- package/dist/gs/builtin/builtin.js.map +1 -1
- package/dist/gs/builtin/slice.d.ts +2 -1
- package/dist/gs/builtin/slice.js +34 -4
- package/dist/gs/builtin/slice.js.map +1 -1
- package/dist/gs/builtin/type.d.ts +14 -6
- package/dist/gs/builtin/type.js +224 -64
- package/dist/gs/builtin/type.js.map +1 -1
- package/dist/gs/builtin/varRef.d.ts +11 -0
- package/dist/gs/builtin/varRef.js +57 -2
- package/dist/gs/builtin/varRef.js.map +1 -1
- package/dist/gs/bytes/buffer.gs.js +1 -1
- package/dist/gs/bytes/buffer.gs.js.map +1 -1
- package/dist/gs/bytes/reader.gs.js +1 -1
- package/dist/gs/bytes/reader.gs.js.map +1 -1
- package/dist/gs/compress/zlib/index.d.ts +13 -6
- package/dist/gs/compress/zlib/index.js +131 -35
- package/dist/gs/compress/zlib/index.js.map +1 -1
- package/dist/gs/crypto/sha1/index.js +2 -5
- package/dist/gs/crypto/sha1/index.js.map +1 -1
- package/dist/gs/crypto/sha256/index.js +2 -5
- package/dist/gs/crypto/sha256/index.js.map +1 -1
- package/dist/gs/crypto/sha512/index.js +2 -5
- package/dist/gs/crypto/sha512/index.js.map +1 -1
- package/dist/gs/embed/index.d.ts +6 -0
- package/dist/gs/embed/index.js +210 -5
- package/dist/gs/embed/index.js.map +1 -1
- package/dist/gs/encoding/json/index.d.ts +114 -0
- package/dist/gs/encoding/json/index.js +544 -36
- package/dist/gs/encoding/json/index.js.map +1 -1
- package/dist/gs/fmt/fmt.d.ts +3 -3
- package/dist/gs/fmt/fmt.js +29 -16
- package/dist/gs/fmt/fmt.js.map +1 -1
- package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/index.d.ts +100 -0
- package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/index.js +564 -0
- package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/index.js.map +1 -1
- package/dist/gs/github.com/go-git/go-billy/v6/osfs/index.d.ts +45 -0
- package/dist/gs/github.com/go-git/go-billy/v6/osfs/index.js +229 -0
- package/dist/gs/github.com/go-git/go-billy/v6/osfs/index.js.map +1 -0
- package/dist/gs/github.com/pkg/errors/errors.js +54 -30
- package/dist/gs/github.com/pkg/errors/errors.js.map +1 -1
- package/dist/gs/go/scanner/index.d.ts +2 -0
- package/dist/gs/go/scanner/index.js +29 -5
- package/dist/gs/go/scanner/index.js.map +1 -1
- package/dist/gs/go/token/index.js +22 -6
- package/dist/gs/go/token/index.js.map +1 -1
- package/dist/gs/hash/index.d.ts +6 -0
- package/dist/gs/hash/index.js +20 -0
- package/dist/gs/hash/index.js.map +1 -1
- package/dist/gs/internal/goarch/index.d.ts +43 -3
- package/dist/gs/internal/goarch/index.js +42 -10
- package/dist/gs/internal/goarch/index.js.map +1 -1
- package/dist/gs/io/fs/fs.js +26 -14
- package/dist/gs/io/fs/fs.js.map +1 -1
- package/dist/gs/io/fs/readdir.js +8 -4
- package/dist/gs/io/fs/readdir.js.map +1 -1
- package/dist/gs/io/fs/sub.js +8 -1
- package/dist/gs/io/fs/sub.js.map +1 -1
- package/dist/gs/io/io.d.ts +12 -6
- package/dist/gs/io/io.js +87 -42
- package/dist/gs/io/io.js.map +1 -1
- package/dist/gs/math/bits/index.d.ts +31 -5
- package/dist/gs/math/bits/index.js +29 -28
- package/dist/gs/math/bits/index.js.map +1 -1
- package/dist/gs/mime/index.d.ts +16 -0
- package/dist/gs/mime/index.js +315 -6
- package/dist/gs/mime/index.js.map +1 -1
- package/dist/gs/net/http/httptest/index.d.ts +12 -0
- package/dist/gs/net/http/httptest/index.js +85 -6
- package/dist/gs/net/http/httptest/index.js.map +1 -1
- package/dist/gs/net/http/index.d.ts +303 -6
- package/dist/gs/net/http/index.js +1615 -58
- package/dist/gs/net/http/index.js.map +1 -1
- package/dist/gs/os/dir_unix.gs.js +1 -1
- package/dist/gs/os/dir_unix.gs.js.map +1 -1
- package/dist/gs/os/error.gs.js +1 -1
- package/dist/gs/os/error.gs.js.map +1 -1
- package/dist/gs/os/exec.gs.d.ts +1 -0
- package/dist/gs/os/exec.gs.js +4 -8
- package/dist/gs/os/exec.gs.js.map +1 -1
- package/dist/gs/os/exec_posix.gs.js +1 -1
- package/dist/gs/os/exec_posix.gs.js.map +1 -1
- package/dist/gs/os/index.d.ts +1 -1
- package/dist/gs/os/index.js +1 -1
- package/dist/gs/os/index.js.map +1 -1
- package/dist/gs/os/proc.gs.d.ts +4 -0
- package/dist/gs/os/proc.gs.js +12 -6
- package/dist/gs/os/proc.gs.js.map +1 -1
- package/dist/gs/os/root_js.gs.js +1 -1
- package/dist/gs/os/root_js.gs.js.map +1 -1
- package/dist/gs/os/types.gs.js +1 -1
- package/dist/gs/os/types.gs.js.map +1 -1
- package/dist/gs/os/types_js.gs.d.ts +6 -2
- package/dist/gs/os/types_js.gs.js +170 -9
- package/dist/gs/os/types_js.gs.js.map +1 -1
- package/dist/gs/os/types_unix.gs.js +1 -1
- package/dist/gs/os/types_unix.gs.js.map +1 -1
- package/dist/gs/path/path.js +11 -7
- package/dist/gs/path/path.js.map +1 -1
- package/dist/gs/reflect/index.d.ts +5 -4
- package/dist/gs/reflect/index.js +4 -3
- package/dist/gs/reflect/index.js.map +1 -1
- package/dist/gs/reflect/map.js +15 -0
- package/dist/gs/reflect/map.js.map +1 -1
- package/dist/gs/reflect/type.d.ts +26 -6
- package/dist/gs/reflect/type.js +1498 -279
- package/dist/gs/reflect/type.js.map +1 -1
- package/dist/gs/reflect/types.d.ts +14 -6
- package/dist/gs/reflect/types.js +35 -1
- package/dist/gs/reflect/types.js.map +1 -1
- package/dist/gs/reflect/value.d.ts +1 -0
- package/dist/gs/reflect/value.js +83 -41
- package/dist/gs/reflect/value.js.map +1 -1
- package/dist/gs/reflect/visiblefields.js +4 -140
- package/dist/gs/reflect/visiblefields.js.map +1 -1
- package/dist/gs/runtime/pprof/index.d.ts +8 -2
- package/dist/gs/runtime/pprof/index.js +50 -30
- package/dist/gs/runtime/pprof/index.js.map +1 -1
- package/dist/gs/runtime/runtime.js +5 -4
- package/dist/gs/runtime/runtime.js.map +1 -1
- package/dist/gs/runtime/trace/index.js +5 -19
- package/dist/gs/runtime/trace/index.js.map +1 -1
- package/dist/gs/strconv/atoi.gs.js +1 -1
- package/dist/gs/strconv/atoi.gs.js.map +1 -1
- package/dist/gs/strconv/complex.gs.d.ts +3 -0
- package/dist/gs/strconv/complex.gs.js +148 -0
- package/dist/gs/strconv/complex.gs.js.map +1 -0
- package/dist/gs/strconv/index.d.ts +1 -0
- package/dist/gs/strconv/index.js +1 -0
- package/dist/gs/strconv/index.js.map +1 -1
- package/dist/gs/strings/builder.js +1 -1
- package/dist/gs/strings/reader.d.ts +1 -1
- package/dist/gs/strings/reader.js +11 -7
- package/dist/gs/strings/reader.js.map +1 -1
- package/dist/gs/strings/replace.js +15 -7
- package/dist/gs/strings/replace.js.map +1 -1
- package/dist/gs/strings/strings.d.ts +5 -0
- package/dist/gs/strings/strings.js +57 -5
- package/dist/gs/strings/strings.js.map +1 -1
- package/dist/gs/sync/atomic/type.gs.js +9 -9
- package/dist/gs/sync/atomic/type.gs.js.map +1 -1
- package/dist/gs/sync/atomic/value.gs.js +2 -2
- package/dist/gs/sync/atomic/value.gs.js.map +1 -1
- package/dist/gs/sync/sync.d.ts +2 -1
- package/dist/gs/sync/sync.js +37 -16
- package/dist/gs/sync/sync.js.map +1 -1
- package/dist/gs/syscall/env.js +22 -14
- package/dist/gs/syscall/env.js.map +1 -1
- package/dist/gs/syscall/js/index.js +9 -0
- package/dist/gs/syscall/js/index.js.map +1 -1
- package/dist/gs/testing/testing.js +59 -15
- package/dist/gs/testing/testing.js.map +1 -1
- package/dist/gs/time/time.d.ts +24 -1
- package/dist/gs/time/time.js +43 -3
- package/dist/gs/time/time.js.map +1 -1
- package/dist/gs/unique/index.js +7 -1
- package/dist/gs/unique/index.js.map +1 -1
- package/go.mod +3 -3
- package/go.sum +16 -0
- package/gs/builtin/builtin.ts +25 -2
- package/gs/builtin/runtime-contract.test.ts +260 -18
- package/gs/builtin/slice.ts +51 -4
- package/gs/builtin/type.ts +310 -63
- package/gs/builtin/varRef.ts +85 -2
- package/gs/bytes/buffer.gs.ts +1 -1
- package/gs/bytes/reader.gs.ts +1 -1
- package/gs/compress/zlib/index.test.ts +159 -1
- package/gs/compress/zlib/index.ts +164 -37
- package/gs/compress/zlib/meta.json +4 -1
- package/gs/compress/zlib/parity.json +51 -0
- package/gs/crypto/sha1/index.test.ts +19 -2
- package/gs/crypto/sha1/index.ts +3 -6
- package/gs/crypto/sha256/index.test.ts +14 -2
- package/gs/crypto/sha256/index.ts +3 -6
- package/gs/crypto/sha512/index.test.ts +17 -2
- package/gs/crypto/sha512/index.ts +3 -6
- package/gs/embed/index.test.ts +87 -0
- package/gs/embed/index.ts +229 -5
- package/gs/encoding/json/index.test.ts +360 -6
- package/gs/encoding/json/index.ts +679 -38
- package/gs/encoding/json/parity.json +81 -0
- package/gs/fmt/fmt.test.ts +41 -3
- package/gs/fmt/fmt.ts +40 -17
- package/gs/fmt/meta.json +6 -1
- package/gs/github.com/aperturerobotics/protobuf-go-lite/index.test.ts +211 -3
- package/gs/github.com/aperturerobotics/protobuf-go-lite/index.ts +857 -1
- package/gs/github.com/go-git/go-billy/v6/osfs/index.test.ts +110 -0
- package/gs/github.com/go-git/go-billy/v6/osfs/index.ts +280 -0
- package/gs/github.com/go-git/go-billy/v6/osfs/meta.json +8 -0
- package/gs/github.com/pkg/errors/errors.ts +54 -30
- package/gs/go/scanner/index.test.ts +39 -56
- package/gs/go/scanner/index.ts +33 -5
- package/gs/go/scanner/parity.json +27 -0
- package/gs/go/token/index.ts +22 -6
- package/gs/hash/index.test.ts +20 -33
- package/gs/hash/index.ts +28 -0
- package/gs/hash/parity.json +21 -0
- package/gs/internal/goarch/index.test.ts +32 -0
- package/gs/internal/goarch/index.ts +45 -13
- package/gs/internal/goarch/parity.json +144 -0
- package/gs/io/fs/fs.ts +26 -14
- package/gs/io/fs/readdir.test.ts +38 -0
- package/gs/io/fs/readdir.ts +8 -4
- package/gs/io/fs/sub.ts +8 -1
- package/gs/io/io.test.ts +77 -6
- package/gs/io/io.ts +115 -52
- package/gs/io/meta.json +7 -1
- package/gs/io/parity.json +162 -0
- package/gs/math/bits/index.test.ts +14 -1
- package/gs/math/bits/index.ts +75 -32
- package/gs/math/bits/parity.json +156 -0
- package/gs/mime/index.test.ts +90 -0
- package/gs/mime/index.ts +369 -6
- package/gs/mime/parity.json +36 -0
- package/gs/net/http/httptest/index.test.ts +98 -2
- package/gs/net/http/httptest/index.ts +101 -6
- package/gs/net/http/httptest/parity.json +15 -0
- package/gs/net/http/index.test.ts +797 -12
- package/gs/net/http/index.ts +1874 -136
- package/gs/net/http/meta.json +16 -1
- package/gs/net/http/parity.json +193 -0
- package/gs/os/dir_unix.gs.ts +1 -1
- package/gs/os/error.gs.ts +1 -1
- package/gs/os/exec.gs.ts +4 -8
- package/gs/os/exec_posix.gs.ts +1 -1
- package/gs/os/file_unix_js.test.ts +52 -0
- package/gs/os/index.test.ts +9 -0
- package/gs/os/index.ts +1 -0
- package/gs/os/meta.json +4 -0
- package/gs/os/parity.json +9 -0
- package/gs/os/proc.gs.ts +18 -5
- package/gs/os/proc.test.ts +26 -0
- package/gs/os/readdir.test.ts +56 -0
- package/gs/os/root_js.gs.ts +1 -1
- package/gs/os/types.gs.ts +1 -1
- package/gs/os/types_js.gs.ts +170 -9
- package/gs/os/types_unix.gs.ts +1 -1
- package/gs/path/path.ts +11 -7
- package/gs/reflect/deepequal.test.ts +10 -1
- package/gs/reflect/field.test.ts +37 -15
- package/gs/reflect/function-types.test.ts +518 -22
- package/gs/reflect/index.ts +8 -6
- package/gs/reflect/map.ts +20 -0
- package/gs/reflect/meta.json +6 -4
- package/gs/reflect/parity.json +234 -0
- package/gs/reflect/sliceat.test.ts +156 -0
- package/gs/reflect/structof.test.ts +401 -0
- package/gs/reflect/type.ts +1980 -365
- package/gs/reflect/typefor.test.ts +540 -10
- package/gs/reflect/types.ts +43 -18
- package/gs/reflect/value.ts +105 -45
- package/gs/reflect/visiblefields.ts +5 -168
- package/gs/runtime/parity.json +24 -0
- package/gs/runtime/pprof/index.test.ts +29 -7
- package/gs/runtime/pprof/index.ts +56 -30
- package/gs/runtime/pprof/parity.json +27 -0
- package/gs/runtime/runtime.test.ts +3 -1
- package/gs/runtime/runtime.ts +4 -3
- package/gs/runtime/trace/index.test.ts +5 -3
- package/gs/runtime/trace/index.ts +8 -20
- package/gs/runtime/trace/parity.json +36 -0
- package/gs/strconv/atoi.gs.ts +1 -1
- package/gs/strconv/complex.gs.ts +174 -0
- package/gs/strconv/complex.test.ts +65 -0
- package/gs/strconv/index.ts +1 -0
- package/gs/strconv/parity.json +120 -0
- package/gs/strings/builder.ts +1 -1
- package/gs/strings/meta.json +5 -2
- package/gs/strings/parity.json +186 -0
- package/gs/strings/reader.test.ts +2 -2
- package/gs/strings/reader.ts +11 -7
- package/gs/strings/replace.ts +15 -7
- package/gs/strings/strings.test.ts +22 -2
- package/gs/strings/strings.ts +64 -6
- package/gs/sync/atomic/type.gs.ts +9 -9
- package/gs/sync/atomic/value.gs.ts +2 -2
- package/gs/sync/meta.json +1 -0
- package/gs/sync/sync.test.ts +41 -1
- package/gs/sync/sync.ts +41 -16
- package/gs/syscall/env.ts +29 -14
- package/gs/syscall/js/index.test.ts +18 -0
- package/gs/syscall/js/index.ts +12 -0
- package/gs/testing/testing.test.ts +99 -3
- package/gs/testing/testing.ts +95 -24
- package/gs/time/parity.json +225 -0
- package/gs/time/time.test.ts +20 -2
- package/gs/time/time.ts +49 -7
- package/gs/unique/index.ts +7 -1
- package/package.json +4 -2
- package/dist/gs/github.com/aperturerobotics/starpc/srpc/index.d.ts +0 -217
- package/dist/gs/github.com/aperturerobotics/starpc/srpc/index.js +0 -814
- package/dist/gs/github.com/aperturerobotics/starpc/srpc/index.js.map +0 -1
- package/gs/github.com/aperturerobotics/starpc/srpc/index.test.ts +0 -31
- package/gs/github.com/aperturerobotics/starpc/srpc/index.ts +0 -1233
- package/gs/github.com/aperturerobotics/starpc/srpc/meta.json +0 -46
- /package/compiler/{wasm_api.go → wasm-api.go} +0 -0
package/gs/math/bits/index.ts
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
// This replaces the auto-generated version that has TypeScript syntax errors
|
|
3
3
|
|
|
4
4
|
// UintSize is the size of a uint in bits
|
|
5
|
-
export const UintSize =
|
|
5
|
+
export const UintSize = 64
|
|
6
6
|
|
|
7
7
|
type Word64 = number | bigint
|
|
8
8
|
|
|
@@ -22,9 +22,13 @@ function word64Result(value: bigint, useBigInt: boolean): Word64 {
|
|
|
22
22
|
: Number(value)
|
|
23
23
|
}
|
|
24
24
|
|
|
25
|
+
function rotateCount(k: number, n: number): number {
|
|
26
|
+
return ((k % n) + n) % n
|
|
27
|
+
}
|
|
28
|
+
|
|
25
29
|
// --- Leading zeros ---
|
|
26
|
-
export function LeadingZeros(x:
|
|
27
|
-
return
|
|
30
|
+
export function LeadingZeros(x: Word64): number {
|
|
31
|
+
return LeadingZeros64(x)
|
|
28
32
|
}
|
|
29
33
|
|
|
30
34
|
export function LeadingZeros8(x: number): number {
|
|
@@ -53,9 +57,8 @@ export function LeadingZeros64(x: Word64): number {
|
|
|
53
57
|
}
|
|
54
58
|
|
|
55
59
|
// --- Trailing zeros ---
|
|
56
|
-
export function TrailingZeros(x:
|
|
57
|
-
|
|
58
|
-
return TrailingZeros32(x)
|
|
60
|
+
export function TrailingZeros(x: Word64): number {
|
|
61
|
+
return TrailingZeros64(x)
|
|
59
62
|
}
|
|
60
63
|
|
|
61
64
|
export function TrailingZeros8(x: number): number {
|
|
@@ -90,8 +93,8 @@ export function TrailingZeros64(x: Word64): number {
|
|
|
90
93
|
}
|
|
91
94
|
|
|
92
95
|
// --- Ones count ---
|
|
93
|
-
export function OnesCount(x:
|
|
94
|
-
return
|
|
96
|
+
export function OnesCount(x: Word64): number {
|
|
97
|
+
return OnesCount64(x)
|
|
95
98
|
}
|
|
96
99
|
|
|
97
100
|
export function OnesCount8(x: number): number {
|
|
@@ -124,36 +127,40 @@ export function OnesCount64(x: Word64): number {
|
|
|
124
127
|
}
|
|
125
128
|
|
|
126
129
|
// --- Rotate left ---
|
|
127
|
-
export function RotateLeft(x: number, k: number): number
|
|
128
|
-
|
|
130
|
+
export function RotateLeft(x: number, k: number): number
|
|
131
|
+
export function RotateLeft(x: bigint, k: number): bigint
|
|
132
|
+
export function RotateLeft(x: Word64, k: number): number
|
|
133
|
+
export function RotateLeft(x: Word64, k: number): Word64 {
|
|
134
|
+
return RotateLeft64(x, k)
|
|
129
135
|
}
|
|
130
136
|
|
|
131
137
|
export function RotateLeft8(x: number, k: number): number {
|
|
132
138
|
const n = 8
|
|
133
|
-
k = k
|
|
139
|
+
k = rotateCount(k, n)
|
|
134
140
|
x = x & 0xff
|
|
135
141
|
return ((x << k) | (x >> (n - k))) & 0xff
|
|
136
142
|
}
|
|
137
143
|
|
|
138
144
|
export function RotateLeft16(x: number, k: number): number {
|
|
139
145
|
const n = 16
|
|
140
|
-
k = k
|
|
146
|
+
k = rotateCount(k, n)
|
|
141
147
|
x = x & 0xffff
|
|
142
148
|
return ((x << k) | (x >> (n - k))) & 0xffff
|
|
143
149
|
}
|
|
144
150
|
|
|
145
151
|
export function RotateLeft32(x: number, k: number): number {
|
|
146
152
|
const n = 32
|
|
147
|
-
k = k
|
|
153
|
+
k = rotateCount(k, n)
|
|
148
154
|
x = x >>> 0 // Ensure unsigned
|
|
149
155
|
return ((x << k) | (x >>> (n - k))) >>> 0
|
|
150
156
|
}
|
|
151
157
|
|
|
152
158
|
export function RotateLeft64(x: number, k: number): number
|
|
153
159
|
export function RotateLeft64(x: bigint, k: number): bigint
|
|
160
|
+
export function RotateLeft64(x: Word64, k: number): number
|
|
154
161
|
export function RotateLeft64(x: Word64, k: number): Word64 {
|
|
155
162
|
const n = 64
|
|
156
|
-
k = k
|
|
163
|
+
k = rotateCount(k, n)
|
|
157
164
|
const useBigInt = useBigIntResult(x)
|
|
158
165
|
const word = toUint64(x)
|
|
159
166
|
return word64Result(
|
|
@@ -163,8 +170,11 @@ export function RotateLeft64(x: Word64, k: number): Word64 {
|
|
|
163
170
|
}
|
|
164
171
|
|
|
165
172
|
// --- Reverse ---
|
|
166
|
-
export function Reverse(x: number): number
|
|
167
|
-
|
|
173
|
+
export function Reverse(x: number): number
|
|
174
|
+
export function Reverse(x: bigint): bigint
|
|
175
|
+
export function Reverse(x: Word64): number
|
|
176
|
+
export function Reverse(x: Word64): Word64 {
|
|
177
|
+
return Reverse64(x)
|
|
168
178
|
}
|
|
169
179
|
|
|
170
180
|
export function Reverse8(x: number): number {
|
|
@@ -196,6 +206,7 @@ export function Reverse32(x: number): number {
|
|
|
196
206
|
|
|
197
207
|
export function Reverse64(x: number): number
|
|
198
208
|
export function Reverse64(x: bigint): bigint
|
|
209
|
+
export function Reverse64(x: Word64): number
|
|
199
210
|
export function Reverse64(x: Word64): Word64 {
|
|
200
211
|
// Implement 64-bit reverse using similar bit manipulation
|
|
201
212
|
const useBigInt = useBigIntResult(x)
|
|
@@ -226,8 +237,11 @@ export function Reverse64(x: Word64): Word64 {
|
|
|
226
237
|
}
|
|
227
238
|
|
|
228
239
|
// --- ReverseBytes ---
|
|
229
|
-
export function ReverseBytes(x: number): number
|
|
230
|
-
|
|
240
|
+
export function ReverseBytes(x: number): number
|
|
241
|
+
export function ReverseBytes(x: bigint): bigint
|
|
242
|
+
export function ReverseBytes(x: Word64): number
|
|
243
|
+
export function ReverseBytes(x: Word64): Word64 {
|
|
244
|
+
return ReverseBytes64(x)
|
|
231
245
|
}
|
|
232
246
|
|
|
233
247
|
export function ReverseBytes16(x: number): number {
|
|
@@ -247,6 +261,7 @@ export function ReverseBytes32(x: number): number {
|
|
|
247
261
|
|
|
248
262
|
export function ReverseBytes64(x: number): number
|
|
249
263
|
export function ReverseBytes64(x: bigint): bigint
|
|
264
|
+
export function ReverseBytes64(x: Word64): number
|
|
250
265
|
export function ReverseBytes64(x: Word64): Word64 {
|
|
251
266
|
const useBigInt = useBigIntResult(x)
|
|
252
267
|
const word = toUint64(x)
|
|
@@ -266,8 +281,8 @@ export function ReverseBytes64(x: Word64): Word64 {
|
|
|
266
281
|
}
|
|
267
282
|
|
|
268
283
|
// --- Len ---
|
|
269
|
-
export function Len(x:
|
|
270
|
-
return
|
|
284
|
+
export function Len(x: Word64): number {
|
|
285
|
+
return Len64(x)
|
|
271
286
|
}
|
|
272
287
|
|
|
273
288
|
export function Len8(x: number): number {
|
|
@@ -287,8 +302,11 @@ export function Len64(x: Word64): number {
|
|
|
287
302
|
}
|
|
288
303
|
|
|
289
304
|
// --- Multiplication functions ---
|
|
290
|
-
export function Mul(x: number, y: number): [number, number]
|
|
291
|
-
|
|
305
|
+
export function Mul(x: number, y: number): [number, number]
|
|
306
|
+
export function Mul(x: bigint, y: bigint): [bigint, bigint]
|
|
307
|
+
export function Mul(x: Word64, y: Word64): [number, number]
|
|
308
|
+
export function Mul(x: Word64, y: Word64): [Word64, Word64] {
|
|
309
|
+
return Mul64(x, y)
|
|
292
310
|
}
|
|
293
311
|
|
|
294
312
|
export function Mul32(x: number, y: number): [number, number] {
|
|
@@ -301,6 +319,7 @@ export function Mul32(x: number, y: number): [number, number] {
|
|
|
301
319
|
|
|
302
320
|
export function Mul64(x: number, y: number): [number, number]
|
|
303
321
|
export function Mul64(x: bigint, y: bigint): [bigint, bigint]
|
|
322
|
+
export function Mul64(x: Word64, y: Word64): [number, number]
|
|
304
323
|
export function Mul64(x: Word64, y: Word64): [Word64, Word64] {
|
|
305
324
|
const useBigInt = useBigIntResult(x, y)
|
|
306
325
|
x = toUint64(x)
|
|
@@ -309,15 +328,15 @@ export function Mul64(x: Word64, y: Word64): [Word64, Word64] {
|
|
|
309
328
|
const lo = product & uint64Mask
|
|
310
329
|
const hi = product >> 64n
|
|
311
330
|
|
|
312
|
-
return [
|
|
313
|
-
word64Result(hi & uint64Mask, useBigInt),
|
|
314
|
-
word64Result(lo, useBigInt),
|
|
315
|
-
]
|
|
331
|
+
return [word64Result(hi & uint64Mask, useBigInt), word64Result(lo, useBigInt)]
|
|
316
332
|
}
|
|
317
333
|
|
|
318
334
|
// --- Division functions ---
|
|
319
|
-
export function Div(hi: number, lo: number, y: number): [number, number]
|
|
320
|
-
|
|
335
|
+
export function Div(hi: number, lo: number, y: number): [number, number]
|
|
336
|
+
export function Div(hi: bigint, lo: bigint, y: bigint): [bigint, bigint]
|
|
337
|
+
export function Div(hi: Word64, lo: Word64, y: Word64): [number, number]
|
|
338
|
+
export function Div(hi: Word64, lo: Word64, y: Word64): [Word64, Word64] {
|
|
339
|
+
return Div64(hi, lo, y)
|
|
321
340
|
}
|
|
322
341
|
|
|
323
342
|
export function Div32(hi: number, lo: number, y: number): [number, number] {
|
|
@@ -337,6 +356,7 @@ export function Div32(hi: number, lo: number, y: number): [number, number] {
|
|
|
337
356
|
|
|
338
357
|
export function Div64(hi: number, lo: number, y: number): [number, number]
|
|
339
358
|
export function Div64(hi: bigint, lo: bigint, y: bigint): [bigint, bigint]
|
|
359
|
+
export function Div64(hi: Word64, lo: Word64, y: Word64): [number, number]
|
|
340
360
|
export function Div64(hi: Word64, lo: Word64, y: Word64): [Word64, Word64] {
|
|
341
361
|
const useBigInt = useBigIntResult(hi, lo, y)
|
|
342
362
|
hi = toUint64(hi)
|
|
@@ -355,9 +375,27 @@ export function Div64(hi: Word64, lo: Word64, y: Word64): [Word64, Word64] {
|
|
|
355
375
|
return [word64Result(quotient, useBigInt), word64Result(remainder, useBigInt)]
|
|
356
376
|
}
|
|
357
377
|
|
|
378
|
+
export function Rem(hi: Word64, lo: Word64, y: Word64): Word64 {
|
|
379
|
+
return Div(hi, lo, y)[1]
|
|
380
|
+
}
|
|
381
|
+
|
|
382
|
+
export function Rem32(hi: number, lo: number, y: number): number {
|
|
383
|
+
return Div32(hi, lo, y)[1]
|
|
384
|
+
}
|
|
385
|
+
|
|
386
|
+
export function Rem64(hi: number, lo: number, y: number): number
|
|
387
|
+
export function Rem64(hi: bigint, lo: bigint, y: bigint): bigint
|
|
388
|
+
export function Rem64(hi: Word64, lo: Word64, y: Word64): number
|
|
389
|
+
export function Rem64(hi: Word64, lo: Word64, y: Word64): Word64 {
|
|
390
|
+
return Div64(hi, lo, y)[1]
|
|
391
|
+
}
|
|
392
|
+
|
|
358
393
|
// --- Add and Sub with carry ---
|
|
359
|
-
export function Add(x: number, y: number, carry: number): [number, number]
|
|
360
|
-
|
|
394
|
+
export function Add(x: number, y: number, carry: number): [number, number]
|
|
395
|
+
export function Add(x: bigint, y: bigint, carry: bigint): [bigint, bigint]
|
|
396
|
+
export function Add(x: Word64, y: Word64, carry: Word64): [number, number]
|
|
397
|
+
export function Add(x: Word64, y: Word64, carry: Word64): [Word64, Word64] {
|
|
398
|
+
return Add64(x, y, carry)
|
|
361
399
|
}
|
|
362
400
|
|
|
363
401
|
export function Add32(x: number, y: number, carry: number): [number, number] {
|
|
@@ -369,6 +407,7 @@ export function Add32(x: number, y: number, carry: number): [number, number] {
|
|
|
369
407
|
|
|
370
408
|
export function Add64(x: number, y: number, carry: number): [number, number]
|
|
371
409
|
export function Add64(x: bigint, y: bigint, carry: bigint): [bigint, bigint]
|
|
410
|
+
export function Add64(x: Word64, y: Word64, carry: Word64): [number, number]
|
|
372
411
|
export function Add64(x: Word64, y: Word64, carry: Word64): [Word64, Word64] {
|
|
373
412
|
const useBigInt = useBigIntResult(x, y, carry)
|
|
374
413
|
const sum = toUint64(x) + toUint64(y) + toUint64(carry)
|
|
@@ -377,8 +416,11 @@ export function Add64(x: Word64, y: Word64, carry: Word64): [Word64, Word64] {
|
|
|
377
416
|
return [word64Result(result, useBigInt), word64Result(carryOut, useBigInt)]
|
|
378
417
|
}
|
|
379
418
|
|
|
380
|
-
export function Sub(x: number, y: number, borrow: number): [number, number]
|
|
381
|
-
|
|
419
|
+
export function Sub(x: number, y: number, borrow: number): [number, number]
|
|
420
|
+
export function Sub(x: bigint, y: bigint, borrow: bigint): [bigint, bigint]
|
|
421
|
+
export function Sub(x: Word64, y: Word64, borrow: Word64): [number, number]
|
|
422
|
+
export function Sub(x: Word64, y: Word64, borrow: Word64): [Word64, Word64] {
|
|
423
|
+
return Sub64(x, y, borrow)
|
|
382
424
|
}
|
|
383
425
|
|
|
384
426
|
export function Sub32(x: number, y: number, borrow: number): [number, number] {
|
|
@@ -390,6 +432,7 @@ export function Sub32(x: number, y: number, borrow: number): [number, number] {
|
|
|
390
432
|
|
|
391
433
|
export function Sub64(x: number, y: number, borrow: number): [number, number]
|
|
392
434
|
export function Sub64(x: bigint, y: bigint, borrow: bigint): [bigint, bigint]
|
|
435
|
+
export function Sub64(x: Word64, y: Word64, borrow: Word64): [number, number]
|
|
393
436
|
export function Sub64(x: Word64, y: Word64, borrow: Word64): [Word64, Word64] {
|
|
394
437
|
const useBigInt = useBigIntResult(x, y, borrow)
|
|
395
438
|
const diff = toUint64(x) - toUint64(y) - toUint64(borrow)
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schemaVersion": 1,
|
|
3
|
+
"strict": true,
|
|
4
|
+
"symbols": {
|
|
5
|
+
"Add": {
|
|
6
|
+
"status": "real"
|
|
7
|
+
},
|
|
8
|
+
"Add32": {
|
|
9
|
+
"status": "real"
|
|
10
|
+
},
|
|
11
|
+
"Add64": {
|
|
12
|
+
"status": "real"
|
|
13
|
+
},
|
|
14
|
+
"Div": {
|
|
15
|
+
"status": "real"
|
|
16
|
+
},
|
|
17
|
+
"Div32": {
|
|
18
|
+
"status": "real"
|
|
19
|
+
},
|
|
20
|
+
"Div64": {
|
|
21
|
+
"status": "real"
|
|
22
|
+
},
|
|
23
|
+
"LeadingZeros": {
|
|
24
|
+
"status": "real"
|
|
25
|
+
},
|
|
26
|
+
"LeadingZeros16": {
|
|
27
|
+
"status": "real"
|
|
28
|
+
},
|
|
29
|
+
"LeadingZeros32": {
|
|
30
|
+
"status": "real"
|
|
31
|
+
},
|
|
32
|
+
"LeadingZeros64": {
|
|
33
|
+
"status": "real"
|
|
34
|
+
},
|
|
35
|
+
"LeadingZeros8": {
|
|
36
|
+
"status": "real"
|
|
37
|
+
},
|
|
38
|
+
"Len": {
|
|
39
|
+
"status": "real"
|
|
40
|
+
},
|
|
41
|
+
"Len16": {
|
|
42
|
+
"status": "real"
|
|
43
|
+
},
|
|
44
|
+
"Len32": {
|
|
45
|
+
"status": "real"
|
|
46
|
+
},
|
|
47
|
+
"Len64": {
|
|
48
|
+
"status": "real"
|
|
49
|
+
},
|
|
50
|
+
"Len8": {
|
|
51
|
+
"status": "real"
|
|
52
|
+
},
|
|
53
|
+
"Mul": {
|
|
54
|
+
"status": "real"
|
|
55
|
+
},
|
|
56
|
+
"Mul32": {
|
|
57
|
+
"status": "real"
|
|
58
|
+
},
|
|
59
|
+
"Mul64": {
|
|
60
|
+
"status": "real"
|
|
61
|
+
},
|
|
62
|
+
"OnesCount": {
|
|
63
|
+
"status": "real"
|
|
64
|
+
},
|
|
65
|
+
"OnesCount16": {
|
|
66
|
+
"status": "real"
|
|
67
|
+
},
|
|
68
|
+
"OnesCount32": {
|
|
69
|
+
"status": "real"
|
|
70
|
+
},
|
|
71
|
+
"OnesCount64": {
|
|
72
|
+
"status": "real"
|
|
73
|
+
},
|
|
74
|
+
"OnesCount8": {
|
|
75
|
+
"status": "real"
|
|
76
|
+
},
|
|
77
|
+
"Rem": {
|
|
78
|
+
"status": "real"
|
|
79
|
+
},
|
|
80
|
+
"Rem32": {
|
|
81
|
+
"status": "real"
|
|
82
|
+
},
|
|
83
|
+
"Rem64": {
|
|
84
|
+
"status": "real"
|
|
85
|
+
},
|
|
86
|
+
"Reverse": {
|
|
87
|
+
"status": "real"
|
|
88
|
+
},
|
|
89
|
+
"Reverse16": {
|
|
90
|
+
"status": "real"
|
|
91
|
+
},
|
|
92
|
+
"Reverse32": {
|
|
93
|
+
"status": "real"
|
|
94
|
+
},
|
|
95
|
+
"Reverse64": {
|
|
96
|
+
"status": "real"
|
|
97
|
+
},
|
|
98
|
+
"Reverse8": {
|
|
99
|
+
"status": "real"
|
|
100
|
+
},
|
|
101
|
+
"ReverseBytes": {
|
|
102
|
+
"status": "real"
|
|
103
|
+
},
|
|
104
|
+
"ReverseBytes16": {
|
|
105
|
+
"status": "real"
|
|
106
|
+
},
|
|
107
|
+
"ReverseBytes32": {
|
|
108
|
+
"status": "real"
|
|
109
|
+
},
|
|
110
|
+
"ReverseBytes64": {
|
|
111
|
+
"status": "real"
|
|
112
|
+
},
|
|
113
|
+
"RotateLeft": {
|
|
114
|
+
"status": "real"
|
|
115
|
+
},
|
|
116
|
+
"RotateLeft16": {
|
|
117
|
+
"status": "real"
|
|
118
|
+
},
|
|
119
|
+
"RotateLeft32": {
|
|
120
|
+
"status": "real"
|
|
121
|
+
},
|
|
122
|
+
"RotateLeft64": {
|
|
123
|
+
"status": "real"
|
|
124
|
+
},
|
|
125
|
+
"RotateLeft8": {
|
|
126
|
+
"status": "real"
|
|
127
|
+
},
|
|
128
|
+
"Sub": {
|
|
129
|
+
"status": "real"
|
|
130
|
+
},
|
|
131
|
+
"Sub32": {
|
|
132
|
+
"status": "real"
|
|
133
|
+
},
|
|
134
|
+
"Sub64": {
|
|
135
|
+
"status": "real"
|
|
136
|
+
},
|
|
137
|
+
"TrailingZeros": {
|
|
138
|
+
"status": "real"
|
|
139
|
+
},
|
|
140
|
+
"TrailingZeros16": {
|
|
141
|
+
"status": "real"
|
|
142
|
+
},
|
|
143
|
+
"TrailingZeros32": {
|
|
144
|
+
"status": "real"
|
|
145
|
+
},
|
|
146
|
+
"TrailingZeros64": {
|
|
147
|
+
"status": "real"
|
|
148
|
+
},
|
|
149
|
+
"TrailingZeros8": {
|
|
150
|
+
"status": "real"
|
|
151
|
+
},
|
|
152
|
+
"UintSize": {
|
|
153
|
+
"status": "real"
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import { describe, expect, it } from 'vitest'
|
|
2
|
+
|
|
3
|
+
import {
|
|
4
|
+
AddExtensionType,
|
|
5
|
+
BEncoding,
|
|
6
|
+
ErrInvalidMediaParameter,
|
|
7
|
+
ExtensionsByType,
|
|
8
|
+
FormatMediaType,
|
|
9
|
+
ParseMediaType,
|
|
10
|
+
QEncoding,
|
|
11
|
+
TypeByExtension,
|
|
12
|
+
WordDecoder,
|
|
13
|
+
WordEncoder_Encode,
|
|
14
|
+
} from './index.js'
|
|
15
|
+
|
|
16
|
+
describe('mime override', () => {
|
|
17
|
+
it('parses, formats, and looks up media types', () => {
|
|
18
|
+
const [mediaType, params, err] = ParseMediaType(
|
|
19
|
+
'Text/Plain; Charset="utf-8"; format=flowed',
|
|
20
|
+
)
|
|
21
|
+
expect(err).toBeNull()
|
|
22
|
+
expect(mediaType).toBe('text/plain')
|
|
23
|
+
expect(params.get('charset')).toBe('utf-8')
|
|
24
|
+
expect(params.get('format')).toBe('flowed')
|
|
25
|
+
const [trailingMediaType, trailingParams, trailingErr] = ParseMediaType('text/plain;')
|
|
26
|
+
expect(trailingErr).toBeNull()
|
|
27
|
+
expect(trailingMediaType).toBe('text/plain')
|
|
28
|
+
expect(trailingParams.size).toBe(0)
|
|
29
|
+
|
|
30
|
+
expect(
|
|
31
|
+
FormatMediaType('text/plain', new Map([['charset', 'utf-8']])),
|
|
32
|
+
).toBe('text/plain; charset=utf-8')
|
|
33
|
+
expect(
|
|
34
|
+
FormatMediaType('Attachment', new Map([['FileName', 'hello.txt']])),
|
|
35
|
+
).toBe('attachment; filename=hello.txt')
|
|
36
|
+
expect(
|
|
37
|
+
FormatMediaType('attachment', new Map([['filename', 'foo bar.txt']])),
|
|
38
|
+
).toBe('attachment; filename="foo bar.txt"')
|
|
39
|
+
expect(
|
|
40
|
+
FormatMediaType('text/plain', new Map([
|
|
41
|
+
['z', 'last'],
|
|
42
|
+
['a', 'first'],
|
|
43
|
+
])),
|
|
44
|
+
).toBe('text/plain; a=first; z=last')
|
|
45
|
+
|
|
46
|
+
const encoded = FormatMediaType(
|
|
47
|
+
'attachment',
|
|
48
|
+
new Map([['filename', 'résumé.txt']]),
|
|
49
|
+
)
|
|
50
|
+
expect(encoded).toBe("attachment; filename*=utf-8''r%C3%A9sum%C3%A9.txt")
|
|
51
|
+
const [, encodedParams, encodedErr] = ParseMediaType(encoded)
|
|
52
|
+
expect(encodedErr).toBeNull()
|
|
53
|
+
expect(encodedParams.get('filename')).toBe('résumé.txt')
|
|
54
|
+
const [, pathParams, pathErr] = ParseMediaType('form-data; filename="C:\\dev\\go.txt"; quoted="a\\"b"')
|
|
55
|
+
expect(pathErr).toBeNull()
|
|
56
|
+
expect(pathParams.get('filename')).toBe('C:\\dev\\go.txt')
|
|
57
|
+
expect(pathParams.get('quoted')).toBe('a"b')
|
|
58
|
+
|
|
59
|
+
expect(TypeByExtension('.json')).toBe('application/json')
|
|
60
|
+
expect(AddExtensionType('.goscript', 'text/plain; charset=utf-8')).toBeNull()
|
|
61
|
+
const [extensions, extensionErr] = ExtensionsByType('text/plain')
|
|
62
|
+
expect(extensionErr).toBeNull()
|
|
63
|
+
expect(extensions).toContain('.goscript')
|
|
64
|
+
})
|
|
65
|
+
|
|
66
|
+
it('reports invalid media parameters', () => {
|
|
67
|
+
const [, , err] = ParseMediaType('text/plain; broken')
|
|
68
|
+
expect(err).toBe(ErrInvalidMediaParameter)
|
|
69
|
+
expect(ParseMediaType('text/plain; filename=foo bar')[2]).toBe(ErrInvalidMediaParameter)
|
|
70
|
+
expect(ParseMediaType('text/plain; filename="unterminated')[2]).toBe(ErrInvalidMediaParameter)
|
|
71
|
+
expect(ParseMediaType('text/plain; x=1; x=2')[2]).toBe(ErrInvalidMediaParameter)
|
|
72
|
+
expect(ParseMediaType('text/plain; bad[]=x')[2]).toBe(ErrInvalidMediaParameter)
|
|
73
|
+
expect(ParseMediaType('text/plain; bad{}=x')[1].get('bad{}')).toBe('x')
|
|
74
|
+
})
|
|
75
|
+
|
|
76
|
+
it('encodes and decodes RFC 2047 words', () => {
|
|
77
|
+
expect(WordEncoder_Encode(BEncoding, 'utf-8', 'hello')).toBe('hello')
|
|
78
|
+
|
|
79
|
+
const bWord = WordEncoder_Encode(BEncoding, 'utf-8', 'héllo')
|
|
80
|
+
expect(new WordDecoder().Decode(bWord)).toEqual(['héllo', null])
|
|
81
|
+
|
|
82
|
+
const qWord = WordEncoder_Encode(QEncoding, 'utf-8', 'hello world')
|
|
83
|
+
expect(qWord).toBe('hello world')
|
|
84
|
+
|
|
85
|
+
const encodedQWord = WordEncoder_Encode(QEncoding, 'utf-8', 'héllo world')
|
|
86
|
+
const [header, err] = new WordDecoder().DecodeHeader(`subject ${encodedQWord}`)
|
|
87
|
+
expect(err).toBeNull()
|
|
88
|
+
expect(header).toBe('subject héllo world')
|
|
89
|
+
})
|
|
90
|
+
})
|