goscript 0.1.4 → 0.2.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.
- 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} +7 -0
- package/cmd/goscript/cmd-test.go +14 -0
- package/cmd/goscript/cmd-test_test.go +1 -1
- package/cmd/goscript-wasm/main.go +38 -6
- package/compiler/compile-request.go +12 -9
- package/compiler/compliance_test.go +0 -1
- package/compiler/config.go +2 -0
- package/compiler/diagnostic.go +104 -12
- package/compiler/diagnostic_test.go +106 -0
- package/compiler/gotest/request.go +28 -0
- package/compiler/gotest/runner.go +354 -44
- package/compiler/gotest/runner_test.go +293 -1
- package/compiler/gotest/testdata/browserapi/browserapi_test.go +20 -0
- package/compiler/gotest/testdata/browserapi/go.mod +3 -0
- package/compiler/index.test.ts +23 -0
- package/compiler/lowered-program.go +33 -24
- package/compiler/lowering.go +746 -194
- package/compiler/lowering_bench_test.go +42 -27
- package/compiler/lowering_internal_test.go +18 -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/protobuf-ts-binding.go +567 -0
- package/compiler/protobuf-ts-binding_test.go +402 -0
- package/compiler/runtime-contract.go +4 -0
- package/compiler/runtime-contract_test.go +2 -0
- package/compiler/semantic-model-types.go +9 -4
- package/compiler/semantic-model.go +282 -70
- package/compiler/semantic-model_test.go +82 -1
- package/compiler/service.go +21 -1
- package/compiler/skeleton_test.go +118 -10
- package/compiler/typescript-emitter.go +128 -13
- package/compiler/wasm/compile_test.go +37 -4
- package/compiler/{wasm_api.go → wasm-api.go} +57 -7
- package/dist/gs/builtin/hostio.js +5 -0
- package/dist/gs/builtin/hostio.js.map +1 -1
- package/dist/gs/builtin/slice.d.ts +13 -2
- package/dist/gs/builtin/slice.js +187 -6
- package/dist/gs/builtin/slice.js.map +1 -1
- package/dist/gs/builtin/type.d.ts +13 -5
- package/dist/gs/builtin/type.js +153 -60
- 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 +10 -3
- package/dist/gs/compress/zlib/index.js +50 -16
- package/dist/gs/compress/zlib/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/github.com/aperturerobotics/protobuf-go-lite/index.d.ts +101 -0
- package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/index.js +589 -0
- package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/index.js.map +1 -1
- package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/json/index.d.ts +1 -0
- package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/json/index.js +17 -11
- package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/json/index.js.map +1 -1
- 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/byteorder/index.js +2 -2
- package/dist/gs/internal/byteorder/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 +4 -2
- 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 +2 -0
- package/dist/gs/io/io.js.map +1 -1
- package/dist/gs/math/bits/index.d.ts +5 -0
- package/dist/gs/math/bits/index.js +16 -4
- 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 +300 -5
- package/dist/gs/net/http/index.js +1598 -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.js +1 -1
- 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 +25 -6
- package/dist/gs/reflect/type.js +1475 -228
- 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.js +9 -5
- 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/doc_64.gs.js +7 -6
- package/dist/gs/sync/atomic/doc_64.gs.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/syscall/env.js +22 -14
- package/dist/gs/syscall/env.js.map +1 -1
- package/dist/gs/testing/testing.js +55 -13
- 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/hostio.test.ts +16 -0
- package/gs/builtin/hostio.ts +7 -0
- package/gs/builtin/runtime-contract.test.ts +246 -21
- package/gs/builtin/slice.ts +269 -24
- package/gs/builtin/type.ts +226 -59
- 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 +62 -1
- package/gs/compress/zlib/index.ts +53 -16
- package/gs/compress/zlib/parity.json +51 -0
- 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/github.com/aperturerobotics/protobuf-go-lite/index.test.ts +373 -3
- package/gs/github.com/aperturerobotics/protobuf-go-lite/index.ts +893 -1
- package/gs/github.com/aperturerobotics/protobuf-go-lite/json/index.test.ts +18 -0
- package/gs/github.com/aperturerobotics/protobuf-go-lite/json/index.ts +17 -11
- 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/byteorder/index.test.ts +2 -2
- package/gs/internal/byteorder/index.ts +2 -2
- 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.ts +4 -4
- package/gs/io/fs/sub.ts +8 -1
- package/gs/io/io.ts +1 -0
- package/gs/io/parity.json +162 -0
- package/gs/math/bits/index.test.ts +14 -1
- package/gs/math/bits/index.ts +23 -4
- 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 +781 -12
- package/gs/net/http/index.ts +1860 -139
- 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/index.test.ts +9 -0
- package/gs/os/index.ts +1 -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/root_js.gs.ts +1 -1
- package/gs/os/types.gs.ts +1 -1
- package/gs/os/types_js.gs.ts +1 -1
- package/gs/os/types_unix.gs.ts +1 -1
- package/gs/path/path.ts +11 -7
- 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 +1961 -317
- package/gs/reflect/typefor.test.ts +530 -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/parity.json +186 -0
- package/gs/strings/reader.ts +9 -5
- 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/doc_64.gs.ts +6 -7
- package/gs/sync/atomic/doc_64.test.ts +43 -0
- package/gs/sync/atomic/type.gs.ts +9 -9
- package/gs/sync/atomic/value.gs.ts +2 -2
- package/gs/syscall/env.ts +29 -14
- package/gs/testing/testing.test.ts +67 -0
- package/gs/testing/testing.ts +87 -19
- 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 -926
- package/dist/gs/github.com/aperturerobotics/starpc/srpc/index.js.map +0 -1
- package/gs/github.com/aperturerobotics/starpc/srpc/index.test.ts +0 -38
- package/gs/github.com/aperturerobotics/starpc/srpc/index.ts +0 -1361
- package/gs/github.com/aperturerobotics/starpc/srpc/meta.json +0 -46
|
@@ -113,6 +113,24 @@ describe('protobuf-go-lite/json override', () => {
|
|
|
113
113
|
])
|
|
114
114
|
})
|
|
115
115
|
|
|
116
|
+
it('matches jsoniter value types while reading object fields', () => {
|
|
117
|
+
const state = NewUnmarshalState(
|
|
118
|
+
jsonBytes('{"id":"step","config":{"kind":"inline"}}'),
|
|
119
|
+
DefaultUnmarshalerConfig,
|
|
120
|
+
)
|
|
121
|
+
|
|
122
|
+
expect(state?.ReadObjectField()).toBe('id')
|
|
123
|
+
expect(state?.WhatIsNext()).toBe(1)
|
|
124
|
+
expect(state?.ReadString()).toBe('step')
|
|
125
|
+
expect(state?.ReadObjectField()).toBe('config')
|
|
126
|
+
expect(state?.WhatIsNext()).toBe(6)
|
|
127
|
+
expect(
|
|
128
|
+
new TextDecoder().decode(new Uint8Array(state?.SkipAndReturnBytes())),
|
|
129
|
+
).toBe('{"kind":"inline"}')
|
|
130
|
+
expect(state?.ReadObjectField()).toBe('')
|
|
131
|
+
expect(state?.Err()).toBeNull()
|
|
132
|
+
})
|
|
133
|
+
|
|
116
134
|
it('tracks unmarshaled field masks through nested fields', () => {
|
|
117
135
|
const state = NewUnmarshalState(jsonBytes('{}'), DefaultUnmarshalerConfig)
|
|
118
136
|
state?.AddField('top')
|
|
@@ -423,6 +423,7 @@ export class UnmarshalState {
|
|
|
423
423
|
private path: string[]
|
|
424
424
|
private objectEntries: Array<[string, unknown]> | null = null
|
|
425
425
|
private objectIndex = 0
|
|
426
|
+
private objectValue: unknown = undefined
|
|
426
427
|
|
|
427
428
|
constructor(
|
|
428
429
|
init?: Partial<{
|
|
@@ -612,16 +613,21 @@ export class UnmarshalState {
|
|
|
612
613
|
}
|
|
613
614
|
|
|
614
615
|
public ReadObjectField(): string {
|
|
615
|
-
const record = recordValue(this.value)
|
|
616
|
-
if (record == null) {
|
|
617
|
-
this.SetErrorf('expected JSON object')
|
|
618
|
-
return ''
|
|
619
|
-
}
|
|
620
616
|
if (this.objectEntries == null) {
|
|
617
|
+
const record = recordValue(this.value)
|
|
618
|
+
if (record == null) {
|
|
619
|
+
this.SetErrorf('expected JSON object')
|
|
620
|
+
return ''
|
|
621
|
+
}
|
|
621
622
|
this.objectEntries = Object.entries(record)
|
|
622
623
|
this.objectIndex = 0
|
|
624
|
+
this.objectValue = this.value
|
|
623
625
|
}
|
|
624
626
|
if (this.objectIndex >= this.objectEntries.length) {
|
|
627
|
+
this.value = this.objectValue
|
|
628
|
+
this.objectEntries = null
|
|
629
|
+
this.objectIndex = 0
|
|
630
|
+
this.objectValue = undefined
|
|
625
631
|
return ''
|
|
626
632
|
}
|
|
627
633
|
const [key, value] = this.objectEntries[this.objectIndex]
|
|
@@ -747,22 +753,22 @@ export class UnmarshalState {
|
|
|
747
753
|
|
|
748
754
|
public WhatIsNext(): number {
|
|
749
755
|
if (this.value === null) {
|
|
750
|
-
return
|
|
756
|
+
return 3
|
|
751
757
|
}
|
|
752
758
|
if (Array.isArray(this.value)) {
|
|
753
|
-
return
|
|
759
|
+
return 5
|
|
754
760
|
}
|
|
755
761
|
if (typeof this.value === 'object') {
|
|
756
|
-
return
|
|
762
|
+
return 6
|
|
757
763
|
}
|
|
758
764
|
if (typeof this.value === 'string') {
|
|
759
|
-
return
|
|
765
|
+
return 1
|
|
760
766
|
}
|
|
761
767
|
if (typeof this.value === 'number') {
|
|
762
|
-
return
|
|
768
|
+
return 2
|
|
763
769
|
}
|
|
764
770
|
if (typeof this.value === 'boolean') {
|
|
765
|
-
return
|
|
771
|
+
return 4
|
|
766
772
|
}
|
|
767
773
|
return 0
|
|
768
774
|
}
|
|
@@ -109,10 +109,18 @@ class fundamental {
|
|
|
109
109
|
},
|
|
110
110
|
],
|
|
111
111
|
fundamental,
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
112
|
+
[
|
|
113
|
+
{
|
|
114
|
+
name: 'msg',
|
|
115
|
+
key: 'msg',
|
|
116
|
+
type: { kind: $.TypeKind.Basic, name: 'string' },
|
|
117
|
+
},
|
|
118
|
+
{
|
|
119
|
+
name: 'stack',
|
|
120
|
+
key: 'stack',
|
|
121
|
+
type: { kind: $.TypeKind.Pointer, elemType: 'stack' },
|
|
122
|
+
},
|
|
123
|
+
],
|
|
116
124
|
)
|
|
117
125
|
}
|
|
118
126
|
|
|
@@ -231,20 +239,28 @@ class withStack {
|
|
|
231
239
|
},
|
|
232
240
|
],
|
|
233
241
|
withStack,
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
242
|
+
[
|
|
243
|
+
{
|
|
244
|
+
name: 'error',
|
|
245
|
+
key: 'error',
|
|
246
|
+
type: {
|
|
247
|
+
kind: $.TypeKind.Interface,
|
|
248
|
+
name: 'GoError',
|
|
249
|
+
methods: [
|
|
250
|
+
{
|
|
251
|
+
name: 'Error',
|
|
252
|
+
args: [],
|
|
253
|
+
returns: [{ type: { kind: $.TypeKind.Basic, name: 'string' } }],
|
|
254
|
+
},
|
|
255
|
+
],
|
|
256
|
+
},
|
|
245
257
|
},
|
|
246
|
-
|
|
247
|
-
|
|
258
|
+
{
|
|
259
|
+
name: 'stack',
|
|
260
|
+
key: 'stack',
|
|
261
|
+
type: { kind: $.TypeKind.Pointer, elemType: 'stack' },
|
|
262
|
+
},
|
|
263
|
+
],
|
|
248
264
|
)
|
|
249
265
|
}
|
|
250
266
|
|
|
@@ -405,20 +421,28 @@ class withMessage {
|
|
|
405
421
|
},
|
|
406
422
|
],
|
|
407
423
|
withMessage,
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
424
|
+
[
|
|
425
|
+
{
|
|
426
|
+
name: 'cause',
|
|
427
|
+
key: 'cause',
|
|
428
|
+
type: {
|
|
429
|
+
kind: $.TypeKind.Interface,
|
|
430
|
+
name: 'GoError',
|
|
431
|
+
methods: [
|
|
432
|
+
{
|
|
433
|
+
name: 'Error',
|
|
434
|
+
args: [],
|
|
435
|
+
returns: [{ type: { kind: $.TypeKind.Basic, name: 'string' } }],
|
|
436
|
+
},
|
|
437
|
+
],
|
|
438
|
+
},
|
|
419
439
|
},
|
|
420
|
-
|
|
421
|
-
|
|
440
|
+
{
|
|
441
|
+
name: 'msg',
|
|
442
|
+
key: 'msg',
|
|
443
|
+
type: { kind: $.TypeKind.Basic, name: 'string' },
|
|
444
|
+
},
|
|
445
|
+
],
|
|
422
446
|
)
|
|
423
447
|
}
|
|
424
448
|
|
|
@@ -3,70 +3,53 @@ import { describe, expect, it } from 'vitest'
|
|
|
3
3
|
import * as $ from '@goscript/builtin/index.js'
|
|
4
4
|
import * as token from '@goscript/go/token/index.js'
|
|
5
5
|
|
|
6
|
-
import {
|
|
7
|
-
ErrorList_Add,
|
|
8
|
-
ErrorList_Err,
|
|
9
|
-
ErrorList_Error,
|
|
10
|
-
ErrorList_Len,
|
|
11
|
-
ErrorList_RemoveMultiples,
|
|
12
|
-
Scanner,
|
|
13
|
-
type ErrorList,
|
|
14
|
-
} from './index.js'
|
|
6
|
+
import { Error as ScannerError, ErrorList_Err, PrintError } from './index.js'
|
|
15
7
|
|
|
16
8
|
describe('go/scanner override', () => {
|
|
17
|
-
it('
|
|
18
|
-
const
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
'test error',
|
|
30
|
-
)
|
|
31
|
-
|
|
32
|
-
expect(ErrorList_Len(list.value)).toBe(1)
|
|
33
|
-
expect(ErrorList_Error(list.value)).toBe('test.go:1:1: test error')
|
|
9
|
+
it('prints errors to an io.Writer', () => {
|
|
10
|
+
const chunks: string[] = []
|
|
11
|
+
const writer = {
|
|
12
|
+
Write(p: $.Bytes): [number, $.GoError] {
|
|
13
|
+
chunks.push($.bytesToString(p))
|
|
14
|
+
return [$.len(p), null]
|
|
15
|
+
},
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
PrintError(writer, $.newError('scan failed'))
|
|
19
|
+
|
|
20
|
+
expect(chunks).toEqual(['scan failed\n'])
|
|
34
21
|
})
|
|
35
22
|
|
|
36
|
-
it('
|
|
37
|
-
const
|
|
38
|
-
const
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
23
|
+
it('prints every ErrorList entry', () => {
|
|
24
|
+
const chunks: string[] = []
|
|
25
|
+
const writer = {
|
|
26
|
+
Write(p: $.Bytes): [number, $.GoError] {
|
|
27
|
+
chunks.push($.bytesToString(p))
|
|
28
|
+
return [$.len(p), null]
|
|
29
|
+
},
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
const errors = [
|
|
33
|
+
new ScannerError({
|
|
34
|
+
Pos: new token.Position({ Filename: 'a.go', Line: 1, Column: 2 }),
|
|
35
|
+
Msg: 'first',
|
|
43
36
|
}),
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
expect(ErrorList_Len(list.value)).toBe(1)
|
|
51
|
-
})
|
|
52
|
-
|
|
53
|
-
it('returns nil Err for an empty list and an error for non-empty lists', () => {
|
|
54
|
-
const empty: ErrorList = null
|
|
55
|
-
expect(ErrorList_Err(empty)).toBeNull()
|
|
37
|
+
new ScannerError({
|
|
38
|
+
Pos: new token.Position({ Filename: 'a.go', Line: 3, Column: 4 }),
|
|
39
|
+
Msg: 'second',
|
|
40
|
+
}),
|
|
41
|
+
]
|
|
56
42
|
|
|
57
|
-
|
|
58
|
-
ErrorList_Add(list, new token.Position({ Line: 1 }), 'first')
|
|
59
|
-
expect(ErrorList_Err(list.value)?.Error()).toBe('1: first')
|
|
60
|
-
})
|
|
43
|
+
PrintError(writer, errors as $.GoError)
|
|
61
44
|
|
|
62
|
-
|
|
63
|
-
const fset = token.NewFileSet()
|
|
64
|
-
const file = fset.AddFile('test.go', -1, 0)
|
|
65
|
-
const scanner = new Scanner()
|
|
45
|
+
expect(chunks).toEqual(['a.go:1:2: first\n', 'a.go:3:4: second\n'])
|
|
66
46
|
|
|
67
|
-
|
|
47
|
+
chunks.length = 0
|
|
48
|
+
const err = ErrorList_Err(errors)
|
|
49
|
+
expect(Array.isArray(err)).toBe(true)
|
|
50
|
+
expect(err?.Error()).toBe('a.go:1:2: first (and 1 more errors)')
|
|
51
|
+
PrintError(writer, err)
|
|
68
52
|
|
|
69
|
-
expect(
|
|
70
|
-
expect(scanner.Scan()).toEqual([file.Pos(0), token.EOF, ''])
|
|
53
|
+
expect(chunks).toEqual(['a.go:1:2: first\n', 'a.go:3:4: second\n'])
|
|
71
54
|
})
|
|
72
55
|
})
|
package/gs/go/scanner/index.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import * as $ from '@goscript/builtin/index.js'
|
|
2
2
|
import * as token from '@goscript/go/token/index.js'
|
|
3
|
+
import type * as io from '@goscript/io/index.js'
|
|
3
4
|
|
|
4
5
|
export class Error {
|
|
5
6
|
public get Pos(): token.Position {
|
|
@@ -54,10 +55,14 @@ export class Error {
|
|
|
54
55
|
},
|
|
55
56
|
],
|
|
56
57
|
Error,
|
|
57
|
-
|
|
58
|
-
Pos:
|
|
59
|
-
|
|
60
|
-
|
|
58
|
+
[
|
|
59
|
+
{ name: 'Pos', key: 'Pos', type: 'go/token.Position' },
|
|
60
|
+
{
|
|
61
|
+
name: 'Msg',
|
|
62
|
+
key: 'Msg',
|
|
63
|
+
type: { kind: $.TypeKind.Basic, name: 'string' },
|
|
64
|
+
},
|
|
65
|
+
],
|
|
61
66
|
)
|
|
62
67
|
}
|
|
63
68
|
|
|
@@ -196,9 +201,32 @@ export function ErrorList_Error(list: ErrorList): string {
|
|
|
196
201
|
return `${errors[0]!.Error()} (and ${errors.length - 1} more errors)`
|
|
197
202
|
}
|
|
198
203
|
|
|
204
|
+
type errorListWithError = ErrorList & { Error?: () => string }
|
|
205
|
+
|
|
199
206
|
export function ErrorList_Err(list: ErrorList): $.GoError {
|
|
200
207
|
if ($.len(list) === 0) {
|
|
201
208
|
return null
|
|
202
209
|
}
|
|
203
|
-
|
|
210
|
+
const err = list as errorListWithError
|
|
211
|
+
err.Error = () => ErrorList_Error(list)
|
|
212
|
+
return err as unknown as $.GoError
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
export function PrintError(w: io.Writer, err: $.GoError): void {
|
|
216
|
+
if (err === null) {
|
|
217
|
+
return
|
|
218
|
+
}
|
|
219
|
+
if (Array.isArray(err)) {
|
|
220
|
+
for (const entry of Array.from((err as ErrorList) ?? [])) {
|
|
221
|
+
if (entry == null) {
|
|
222
|
+
continue
|
|
223
|
+
}
|
|
224
|
+
w.Write($.stringToBytes(`${entry.Error()}\n`))
|
|
225
|
+
}
|
|
226
|
+
return
|
|
227
|
+
}
|
|
228
|
+
const text = err.Error()
|
|
229
|
+
for (const line of text.split('\n')) {
|
|
230
|
+
w.Write($.stringToBytes(line + '\n'))
|
|
231
|
+
}
|
|
204
232
|
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schemaVersion": 1,
|
|
3
|
+
"strict": true,
|
|
4
|
+
"symbols": {
|
|
5
|
+
"Error": {
|
|
6
|
+
"status": "real"
|
|
7
|
+
},
|
|
8
|
+
"ErrorHandler": {
|
|
9
|
+
"status": "real"
|
|
10
|
+
},
|
|
11
|
+
"ErrorList": {
|
|
12
|
+
"status": "real"
|
|
13
|
+
},
|
|
14
|
+
"Mode": {
|
|
15
|
+
"status": "real"
|
|
16
|
+
},
|
|
17
|
+
"PrintError": {
|
|
18
|
+
"status": "real"
|
|
19
|
+
},
|
|
20
|
+
"ScanComments": {
|
|
21
|
+
"status": "real"
|
|
22
|
+
},
|
|
23
|
+
"Scanner": {
|
|
24
|
+
"status": "real"
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
}
|
package/gs/go/token/index.ts
CHANGED
|
@@ -285,12 +285,28 @@ export class Position {
|
|
|
285
285
|
},
|
|
286
286
|
],
|
|
287
287
|
Position,
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
288
|
+
[
|
|
289
|
+
{
|
|
290
|
+
name: 'Filename',
|
|
291
|
+
key: 'Filename',
|
|
292
|
+
type: { kind: $.TypeKind.Basic, name: 'string' },
|
|
293
|
+
},
|
|
294
|
+
{
|
|
295
|
+
name: 'Offset',
|
|
296
|
+
key: 'Offset',
|
|
297
|
+
type: { kind: $.TypeKind.Basic, name: 'int' },
|
|
298
|
+
},
|
|
299
|
+
{
|
|
300
|
+
name: 'Line',
|
|
301
|
+
key: 'Line',
|
|
302
|
+
type: { kind: $.TypeKind.Basic, name: 'int' },
|
|
303
|
+
},
|
|
304
|
+
{
|
|
305
|
+
name: 'Column',
|
|
306
|
+
key: 'Column',
|
|
307
|
+
type: { kind: $.TypeKind.Basic, name: 'int' },
|
|
308
|
+
},
|
|
309
|
+
],
|
|
294
310
|
)
|
|
295
311
|
}
|
|
296
312
|
|
package/gs/hash/index.test.ts
CHANGED
|
@@ -1,37 +1,24 @@
|
|
|
1
1
|
import { describe, expect, it } from 'vitest'
|
|
2
2
|
|
|
3
|
-
import * as $ from '
|
|
4
|
-
|
|
5
|
-
import './index.js'
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
return 64
|
|
24
|
-
}
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
describe('hash runtime contracts', () => {
|
|
28
|
-
it('registers Hash for runtime type assertions', () => {
|
|
29
|
-
const [value, ok] = $.typeAssertTuple<FakeHash>(
|
|
30
|
-
new FakeHash(),
|
|
31
|
-
'hash.Hash',
|
|
32
|
-
)
|
|
33
|
-
|
|
34
|
-
expect(ok).toBe(true)
|
|
35
|
-
expect(value).toBeInstanceOf(FakeHash)
|
|
3
|
+
import * as $ from '@goscript/builtin/index.js'
|
|
4
|
+
|
|
5
|
+
import type { XOF } from './index.js'
|
|
6
|
+
|
|
7
|
+
describe('hash override', () => {
|
|
8
|
+
it('exports the XOF interface shape', () => {
|
|
9
|
+
const xof: XOF = {
|
|
10
|
+
Write(p: $.Bytes): [number, $.GoError] {
|
|
11
|
+
return [$.len(p), null]
|
|
12
|
+
},
|
|
13
|
+
Read(p: $.Bytes): [number, $.GoError] {
|
|
14
|
+
return [$.len(p), null]
|
|
15
|
+
},
|
|
16
|
+
Reset(): void {},
|
|
17
|
+
BlockSize(): number {
|
|
18
|
+
return 1
|
|
19
|
+
},
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
expect(xof.BlockSize()).toBe(1)
|
|
36
23
|
})
|
|
37
24
|
})
|
package/gs/hash/index.ts
CHANGED
|
@@ -16,6 +16,13 @@ export interface Hash64 extends Hash {
|
|
|
16
16
|
Sum64(): bigint
|
|
17
17
|
}
|
|
18
18
|
|
|
19
|
+
export interface XOF {
|
|
20
|
+
Write(p: $.Bytes): [number, $.GoError]
|
|
21
|
+
Read(p: $.Bytes): [number, $.GoError]
|
|
22
|
+
Reset(): void
|
|
23
|
+
BlockSize(): number
|
|
24
|
+
}
|
|
25
|
+
|
|
19
26
|
export interface Cloner {
|
|
20
27
|
Clone(): [Hash, $.GoError]
|
|
21
28
|
}
|
|
@@ -116,3 +123,24 @@ $.registerInterfaceType('hash.Cloner', null, [
|
|
|
116
123
|
],
|
|
117
124
|
},
|
|
118
125
|
])
|
|
126
|
+
|
|
127
|
+
$.registerInterfaceType('hash.XOF', null, [
|
|
128
|
+
{
|
|
129
|
+
name: 'Write',
|
|
130
|
+
args: [{ name: 'p', type: bytesType }],
|
|
131
|
+
returns: [
|
|
132
|
+
{ name: 'n', type: intType },
|
|
133
|
+
{ name: 'err', type: errorType },
|
|
134
|
+
],
|
|
135
|
+
},
|
|
136
|
+
{
|
|
137
|
+
name: 'Read',
|
|
138
|
+
args: [{ name: 'p', type: bytesType }],
|
|
139
|
+
returns: [
|
|
140
|
+
{ name: 'n', type: intType },
|
|
141
|
+
{ name: 'err', type: errorType },
|
|
142
|
+
],
|
|
143
|
+
},
|
|
144
|
+
{ name: 'Reset', args: [], returns: [] },
|
|
145
|
+
{ name: 'BlockSize', args: [], returns: [{ name: '_r0', type: intType }] },
|
|
146
|
+
])
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schemaVersion": 1,
|
|
3
|
+
"strict": true,
|
|
4
|
+
"symbols": {
|
|
5
|
+
"Cloner": {
|
|
6
|
+
"status": "real"
|
|
7
|
+
},
|
|
8
|
+
"Hash": {
|
|
9
|
+
"status": "real"
|
|
10
|
+
},
|
|
11
|
+
"Hash32": {
|
|
12
|
+
"status": "real"
|
|
13
|
+
},
|
|
14
|
+
"Hash64": {
|
|
15
|
+
"status": "real"
|
|
16
|
+
},
|
|
17
|
+
"XOF": {
|
|
18
|
+
"status": "real"
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
}
|
|
@@ -16,7 +16,7 @@ describe('internal/byteorder uint64', () => {
|
|
|
16
16
|
BEPutUint64(bytes, 0x0102030405060708n)
|
|
17
17
|
|
|
18
18
|
expect(Array.from(bytes)).toEqual([1, 2, 3, 4, 5, 6, 7, 8])
|
|
19
|
-
expect(BEUint64(bytes)).toBe(
|
|
19
|
+
expect(BEUint64(bytes)).toBe(0x0102030405060708n)
|
|
20
20
|
})
|
|
21
21
|
|
|
22
22
|
test('reads and writes little-endian bigint values', () => {
|
|
@@ -25,7 +25,7 @@ describe('internal/byteorder uint64', () => {
|
|
|
25
25
|
LEPutUint64(bytes, 0x0102030405060708n)
|
|
26
26
|
|
|
27
27
|
expect(Array.from(bytes)).toEqual([8, 7, 6, 5, 4, 3, 2, 1])
|
|
28
|
-
expect(LEUint64(bytes)).toBe(
|
|
28
|
+
expect(LEUint64(bytes)).toBe(0x0102030405060708n)
|
|
29
29
|
})
|
|
30
30
|
|
|
31
31
|
test('appends uint64 values', () => {
|
|
@@ -13,7 +13,7 @@ export function BEUint32(b: $.Bytes): number {
|
|
|
13
13
|
}
|
|
14
14
|
|
|
15
15
|
export function BEUint64(b: $.Bytes): number {
|
|
16
|
-
return
|
|
16
|
+
return $.uint(
|
|
17
17
|
(BigInt(b![0]) << 56n) |
|
|
18
18
|
(BigInt(b![1]) << 48n) |
|
|
19
19
|
(BigInt(b![2]) << 40n) |
|
|
@@ -34,7 +34,7 @@ export function LEUint32(b: $.Bytes): number {
|
|
|
34
34
|
}
|
|
35
35
|
|
|
36
36
|
export function LEUint64(b: $.Bytes): number {
|
|
37
|
-
return
|
|
37
|
+
return $.uint(
|
|
38
38
|
BigInt(b![0]) |
|
|
39
39
|
(BigInt(b![1]) << 8n) |
|
|
40
40
|
(BigInt(b![2]) << 16n) |
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { describe, expect, it } from 'vitest'
|
|
2
|
+
|
|
3
|
+
import {
|
|
4
|
+
ArchFamily,
|
|
5
|
+
BigEndian,
|
|
6
|
+
DefaultPhysPageSize,
|
|
7
|
+
GOARCH,
|
|
8
|
+
Int64Align,
|
|
9
|
+
IsAmd64,
|
|
10
|
+
IsWasm,
|
|
11
|
+
PCQuantum,
|
|
12
|
+
PtrBits,
|
|
13
|
+
PtrSize,
|
|
14
|
+
StackAlign,
|
|
15
|
+
WASM,
|
|
16
|
+
} from './index.js'
|
|
17
|
+
|
|
18
|
+
describe('internal/goarch override', () => {
|
|
19
|
+
it('matches JS/WASM Go architecture constants', () => {
|
|
20
|
+
expect(GOARCH).toBe('wasm')
|
|
21
|
+
expect(IsWasm).toBe(1)
|
|
22
|
+
expect(IsAmd64).toBe(0)
|
|
23
|
+
expect(PtrSize).toBe(8)
|
|
24
|
+
expect(PtrBits).toBe(64)
|
|
25
|
+
expect(Int64Align).toBe(PtrSize)
|
|
26
|
+
expect(StackAlign).toBe(PtrSize)
|
|
27
|
+
expect(BigEndian).toBe(false)
|
|
28
|
+
expect(DefaultPhysPageSize).toBe(65536)
|
|
29
|
+
expect(PCQuantum).toBe(1)
|
|
30
|
+
expect(ArchFamily).toBe(WASM)
|
|
31
|
+
})
|
|
32
|
+
})
|
|
@@ -1,18 +1,50 @@
|
|
|
1
|
-
|
|
2
|
-
// This replaces the auto-generated version with appropriate values for JS
|
|
1
|
+
export type ArchFamilyType = number
|
|
3
2
|
|
|
4
|
-
|
|
5
|
-
export const
|
|
3
|
+
export const AMD64: ArchFamilyType = 0
|
|
4
|
+
export const ARM: ArchFamilyType = 1
|
|
5
|
+
export const ARM64: ArchFamilyType = 2
|
|
6
|
+
export const I386: ArchFamilyType = 3
|
|
7
|
+
export const LOONG64: ArchFamilyType = 4
|
|
8
|
+
export const MIPS: ArchFamilyType = 5
|
|
9
|
+
export const MIPS64: ArchFamilyType = 6
|
|
10
|
+
export const PPC64: ArchFamilyType = 7
|
|
11
|
+
export const RISCV64: ArchFamilyType = 8
|
|
12
|
+
export const S390X: ArchFamilyType = 9
|
|
13
|
+
export const WASM: ArchFamilyType = 10
|
|
6
14
|
|
|
7
|
-
|
|
8
|
-
export const BigEndian = false
|
|
15
|
+
export const GOARCH = 'wasm'
|
|
9
16
|
|
|
10
|
-
|
|
11
|
-
export const
|
|
17
|
+
export const Is386 = 0
|
|
18
|
+
export const IsAmd64 = 0
|
|
19
|
+
export const IsAmd64p32 = 0
|
|
20
|
+
export const IsArm = 0
|
|
21
|
+
export const IsArmbe = 0
|
|
22
|
+
export const IsArm64 = 0
|
|
23
|
+
export const IsArm64be = 0
|
|
24
|
+
export const IsLoong64 = 0
|
|
25
|
+
export const IsMips = 0
|
|
26
|
+
export const IsMipsle = 0
|
|
27
|
+
export const IsMips64 = 0
|
|
28
|
+
export const IsMips64le = 0
|
|
29
|
+
export const IsMips64p32 = 0
|
|
30
|
+
export const IsMips64p32le = 0
|
|
31
|
+
export const IsPpc = 0
|
|
32
|
+
export const IsPpc64 = 0
|
|
33
|
+
export const IsPpc64le = 0
|
|
34
|
+
export const IsRiscv = 0
|
|
35
|
+
export const IsRiscv64 = 0
|
|
36
|
+
export const IsS390 = 0
|
|
37
|
+
export const IsS390x = 0
|
|
38
|
+
export const IsSparc = 0
|
|
39
|
+
export const IsSparc64 = 0
|
|
40
|
+
export const IsWasm = 1
|
|
12
41
|
|
|
13
|
-
|
|
14
|
-
export const
|
|
42
|
+
export const PtrSize = 8
|
|
43
|
+
export const PtrBits = PtrSize * 8
|
|
44
|
+
export const Int64Align = PtrSize
|
|
45
|
+
export const BigEndian = false
|
|
46
|
+
export const ArchFamily: ArchFamilyType = WASM
|
|
47
|
+
export const DefaultPhysPageSize = 65536
|
|
48
|
+
export const PCQuantum = 1
|
|
15
49
|
export const MinFrameSize = 0
|
|
16
|
-
|
|
17
|
-
// CPU cache line size (not really applicable in JS, but some code might reference it)
|
|
18
|
-
export const CacheLineSize = 64
|
|
50
|
+
export const StackAlign = PtrSize
|