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.
Files changed (295) hide show
  1. package/README.md +5 -2
  2. package/cmd/go_js_wasm_exec/main.go +201 -0
  3. package/cmd/go_js_wasm_exec/main_test.go +83 -0
  4. package/cmd/goscript/{cmd_compile.go → cmd-compile.go} +7 -0
  5. package/cmd/goscript/cmd-test.go +14 -0
  6. package/cmd/goscript/cmd-test_test.go +1 -1
  7. package/cmd/goscript-wasm/main.go +38 -6
  8. package/compiler/compile-request.go +12 -9
  9. package/compiler/compliance_test.go +0 -1
  10. package/compiler/config.go +2 -0
  11. package/compiler/diagnostic.go +104 -12
  12. package/compiler/diagnostic_test.go +106 -0
  13. package/compiler/gotest/request.go +28 -0
  14. package/compiler/gotest/runner.go +354 -44
  15. package/compiler/gotest/runner_test.go +293 -1
  16. package/compiler/gotest/testdata/browserapi/browserapi_test.go +20 -0
  17. package/compiler/gotest/testdata/browserapi/go.mod +3 -0
  18. package/compiler/index.test.ts +23 -0
  19. package/compiler/lowered-program.go +33 -24
  20. package/compiler/lowering.go +746 -194
  21. package/compiler/lowering_bench_test.go +42 -27
  22. package/compiler/lowering_internal_test.go +18 -0
  23. package/compiler/override-facts.go +15 -0
  24. package/compiler/override-parity-verifier.go +450 -0
  25. package/compiler/override-parity.go +122 -0
  26. package/compiler/override-registry_test.go +559 -0
  27. package/compiler/protobuf-ts-binding.go +567 -0
  28. package/compiler/protobuf-ts-binding_test.go +402 -0
  29. package/compiler/runtime-contract.go +4 -0
  30. package/compiler/runtime-contract_test.go +2 -0
  31. package/compiler/semantic-model-types.go +9 -4
  32. package/compiler/semantic-model.go +282 -70
  33. package/compiler/semantic-model_test.go +82 -1
  34. package/compiler/service.go +21 -1
  35. package/compiler/skeleton_test.go +118 -10
  36. package/compiler/typescript-emitter.go +128 -13
  37. package/compiler/wasm/compile_test.go +37 -4
  38. package/compiler/{wasm_api.go → wasm-api.go} +57 -7
  39. package/dist/gs/builtin/hostio.js +5 -0
  40. package/dist/gs/builtin/hostio.js.map +1 -1
  41. package/dist/gs/builtin/slice.d.ts +13 -2
  42. package/dist/gs/builtin/slice.js +187 -6
  43. package/dist/gs/builtin/slice.js.map +1 -1
  44. package/dist/gs/builtin/type.d.ts +13 -5
  45. package/dist/gs/builtin/type.js +153 -60
  46. package/dist/gs/builtin/type.js.map +1 -1
  47. package/dist/gs/builtin/varRef.d.ts +11 -0
  48. package/dist/gs/builtin/varRef.js +57 -2
  49. package/dist/gs/builtin/varRef.js.map +1 -1
  50. package/dist/gs/bytes/buffer.gs.js +1 -1
  51. package/dist/gs/bytes/buffer.gs.js.map +1 -1
  52. package/dist/gs/bytes/reader.gs.js +1 -1
  53. package/dist/gs/bytes/reader.gs.js.map +1 -1
  54. package/dist/gs/compress/zlib/index.d.ts +10 -3
  55. package/dist/gs/compress/zlib/index.js +50 -16
  56. package/dist/gs/compress/zlib/index.js.map +1 -1
  57. package/dist/gs/encoding/json/index.d.ts +114 -0
  58. package/dist/gs/encoding/json/index.js +544 -36
  59. package/dist/gs/encoding/json/index.js.map +1 -1
  60. package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/index.d.ts +101 -0
  61. package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/index.js +589 -0
  62. package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/index.js.map +1 -1
  63. package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/json/index.d.ts +1 -0
  64. package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/json/index.js +17 -11
  65. package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/json/index.js.map +1 -1
  66. package/dist/gs/github.com/pkg/errors/errors.js +54 -30
  67. package/dist/gs/github.com/pkg/errors/errors.js.map +1 -1
  68. package/dist/gs/go/scanner/index.d.ts +2 -0
  69. package/dist/gs/go/scanner/index.js +29 -5
  70. package/dist/gs/go/scanner/index.js.map +1 -1
  71. package/dist/gs/go/token/index.js +22 -6
  72. package/dist/gs/go/token/index.js.map +1 -1
  73. package/dist/gs/hash/index.d.ts +6 -0
  74. package/dist/gs/hash/index.js +20 -0
  75. package/dist/gs/hash/index.js.map +1 -1
  76. package/dist/gs/internal/byteorder/index.js +2 -2
  77. package/dist/gs/internal/byteorder/index.js.map +1 -1
  78. package/dist/gs/internal/goarch/index.d.ts +43 -3
  79. package/dist/gs/internal/goarch/index.js +42 -10
  80. package/dist/gs/internal/goarch/index.js.map +1 -1
  81. package/dist/gs/io/fs/fs.js +26 -14
  82. package/dist/gs/io/fs/fs.js.map +1 -1
  83. package/dist/gs/io/fs/readdir.js +4 -2
  84. package/dist/gs/io/fs/readdir.js.map +1 -1
  85. package/dist/gs/io/fs/sub.js +8 -1
  86. package/dist/gs/io/fs/sub.js.map +1 -1
  87. package/dist/gs/io/io.d.ts +2 -0
  88. package/dist/gs/io/io.js.map +1 -1
  89. package/dist/gs/math/bits/index.d.ts +5 -0
  90. package/dist/gs/math/bits/index.js +16 -4
  91. package/dist/gs/math/bits/index.js.map +1 -1
  92. package/dist/gs/mime/index.d.ts +16 -0
  93. package/dist/gs/mime/index.js +315 -6
  94. package/dist/gs/mime/index.js.map +1 -1
  95. package/dist/gs/net/http/httptest/index.d.ts +12 -0
  96. package/dist/gs/net/http/httptest/index.js +85 -6
  97. package/dist/gs/net/http/httptest/index.js.map +1 -1
  98. package/dist/gs/net/http/index.d.ts +300 -5
  99. package/dist/gs/net/http/index.js +1598 -58
  100. package/dist/gs/net/http/index.js.map +1 -1
  101. package/dist/gs/os/dir_unix.gs.js +1 -1
  102. package/dist/gs/os/dir_unix.gs.js.map +1 -1
  103. package/dist/gs/os/error.gs.js +1 -1
  104. package/dist/gs/os/error.gs.js.map +1 -1
  105. package/dist/gs/os/exec.gs.d.ts +1 -0
  106. package/dist/gs/os/exec.gs.js +4 -8
  107. package/dist/gs/os/exec.gs.js.map +1 -1
  108. package/dist/gs/os/exec_posix.gs.js +1 -1
  109. package/dist/gs/os/exec_posix.gs.js.map +1 -1
  110. package/dist/gs/os/index.d.ts +1 -1
  111. package/dist/gs/os/index.js +1 -1
  112. package/dist/gs/os/index.js.map +1 -1
  113. package/dist/gs/os/proc.gs.d.ts +4 -0
  114. package/dist/gs/os/proc.gs.js +12 -6
  115. package/dist/gs/os/proc.gs.js.map +1 -1
  116. package/dist/gs/os/root_js.gs.js +1 -1
  117. package/dist/gs/os/root_js.gs.js.map +1 -1
  118. package/dist/gs/os/types.gs.js +1 -1
  119. package/dist/gs/os/types.gs.js.map +1 -1
  120. package/dist/gs/os/types_js.gs.js +1 -1
  121. package/dist/gs/os/types_js.gs.js.map +1 -1
  122. package/dist/gs/os/types_unix.gs.js +1 -1
  123. package/dist/gs/os/types_unix.gs.js.map +1 -1
  124. package/dist/gs/path/path.js +11 -7
  125. package/dist/gs/path/path.js.map +1 -1
  126. package/dist/gs/reflect/index.d.ts +5 -4
  127. package/dist/gs/reflect/index.js +4 -3
  128. package/dist/gs/reflect/index.js.map +1 -1
  129. package/dist/gs/reflect/map.js +15 -0
  130. package/dist/gs/reflect/map.js.map +1 -1
  131. package/dist/gs/reflect/type.d.ts +25 -6
  132. package/dist/gs/reflect/type.js +1475 -228
  133. package/dist/gs/reflect/type.js.map +1 -1
  134. package/dist/gs/reflect/types.d.ts +14 -6
  135. package/dist/gs/reflect/types.js +35 -1
  136. package/dist/gs/reflect/types.js.map +1 -1
  137. package/dist/gs/reflect/value.d.ts +1 -0
  138. package/dist/gs/reflect/value.js +83 -41
  139. package/dist/gs/reflect/value.js.map +1 -1
  140. package/dist/gs/reflect/visiblefields.js +4 -140
  141. package/dist/gs/reflect/visiblefields.js.map +1 -1
  142. package/dist/gs/runtime/pprof/index.d.ts +8 -2
  143. package/dist/gs/runtime/pprof/index.js +50 -30
  144. package/dist/gs/runtime/pprof/index.js.map +1 -1
  145. package/dist/gs/runtime/runtime.js +5 -4
  146. package/dist/gs/runtime/runtime.js.map +1 -1
  147. package/dist/gs/runtime/trace/index.js +5 -19
  148. package/dist/gs/runtime/trace/index.js.map +1 -1
  149. package/dist/gs/strconv/atoi.gs.js +1 -1
  150. package/dist/gs/strconv/atoi.gs.js.map +1 -1
  151. package/dist/gs/strconv/complex.gs.d.ts +3 -0
  152. package/dist/gs/strconv/complex.gs.js +148 -0
  153. package/dist/gs/strconv/complex.gs.js.map +1 -0
  154. package/dist/gs/strconv/index.d.ts +1 -0
  155. package/dist/gs/strconv/index.js +1 -0
  156. package/dist/gs/strconv/index.js.map +1 -1
  157. package/dist/gs/strings/builder.js +1 -1
  158. package/dist/gs/strings/reader.js +9 -5
  159. package/dist/gs/strings/reader.js.map +1 -1
  160. package/dist/gs/strings/replace.js +15 -7
  161. package/dist/gs/strings/replace.js.map +1 -1
  162. package/dist/gs/strings/strings.d.ts +5 -0
  163. package/dist/gs/strings/strings.js +57 -5
  164. package/dist/gs/strings/strings.js.map +1 -1
  165. package/dist/gs/sync/atomic/doc_64.gs.js +7 -6
  166. package/dist/gs/sync/atomic/doc_64.gs.js.map +1 -1
  167. package/dist/gs/sync/atomic/type.gs.js +9 -9
  168. package/dist/gs/sync/atomic/type.gs.js.map +1 -1
  169. package/dist/gs/sync/atomic/value.gs.js +2 -2
  170. package/dist/gs/sync/atomic/value.gs.js.map +1 -1
  171. package/dist/gs/syscall/env.js +22 -14
  172. package/dist/gs/syscall/env.js.map +1 -1
  173. package/dist/gs/testing/testing.js +55 -13
  174. package/dist/gs/testing/testing.js.map +1 -1
  175. package/dist/gs/time/time.d.ts +24 -1
  176. package/dist/gs/time/time.js +43 -3
  177. package/dist/gs/time/time.js.map +1 -1
  178. package/dist/gs/unique/index.js +7 -1
  179. package/dist/gs/unique/index.js.map +1 -1
  180. package/go.mod +3 -3
  181. package/go.sum +16 -0
  182. package/gs/builtin/hostio.test.ts +16 -0
  183. package/gs/builtin/hostio.ts +7 -0
  184. package/gs/builtin/runtime-contract.test.ts +246 -21
  185. package/gs/builtin/slice.ts +269 -24
  186. package/gs/builtin/type.ts +226 -59
  187. package/gs/builtin/varRef.ts +85 -2
  188. package/gs/bytes/buffer.gs.ts +1 -1
  189. package/gs/bytes/reader.gs.ts +1 -1
  190. package/gs/compress/zlib/index.test.ts +62 -1
  191. package/gs/compress/zlib/index.ts +53 -16
  192. package/gs/compress/zlib/parity.json +51 -0
  193. package/gs/encoding/json/index.test.ts +360 -6
  194. package/gs/encoding/json/index.ts +679 -38
  195. package/gs/encoding/json/parity.json +81 -0
  196. package/gs/github.com/aperturerobotics/protobuf-go-lite/index.test.ts +373 -3
  197. package/gs/github.com/aperturerobotics/protobuf-go-lite/index.ts +893 -1
  198. package/gs/github.com/aperturerobotics/protobuf-go-lite/json/index.test.ts +18 -0
  199. package/gs/github.com/aperturerobotics/protobuf-go-lite/json/index.ts +17 -11
  200. package/gs/github.com/pkg/errors/errors.ts +54 -30
  201. package/gs/go/scanner/index.test.ts +39 -56
  202. package/gs/go/scanner/index.ts +33 -5
  203. package/gs/go/scanner/parity.json +27 -0
  204. package/gs/go/token/index.ts +22 -6
  205. package/gs/hash/index.test.ts +20 -33
  206. package/gs/hash/index.ts +28 -0
  207. package/gs/hash/parity.json +21 -0
  208. package/gs/internal/byteorder/index.test.ts +2 -2
  209. package/gs/internal/byteorder/index.ts +2 -2
  210. package/gs/internal/goarch/index.test.ts +32 -0
  211. package/gs/internal/goarch/index.ts +45 -13
  212. package/gs/internal/goarch/parity.json +144 -0
  213. package/gs/io/fs/fs.ts +26 -14
  214. package/gs/io/fs/readdir.ts +4 -4
  215. package/gs/io/fs/sub.ts +8 -1
  216. package/gs/io/io.ts +1 -0
  217. package/gs/io/parity.json +162 -0
  218. package/gs/math/bits/index.test.ts +14 -1
  219. package/gs/math/bits/index.ts +23 -4
  220. package/gs/math/bits/parity.json +156 -0
  221. package/gs/mime/index.test.ts +90 -0
  222. package/gs/mime/index.ts +369 -6
  223. package/gs/mime/parity.json +36 -0
  224. package/gs/net/http/httptest/index.test.ts +98 -2
  225. package/gs/net/http/httptest/index.ts +101 -6
  226. package/gs/net/http/httptest/parity.json +15 -0
  227. package/gs/net/http/index.test.ts +781 -12
  228. package/gs/net/http/index.ts +1860 -139
  229. package/gs/net/http/meta.json +16 -1
  230. package/gs/net/http/parity.json +193 -0
  231. package/gs/os/dir_unix.gs.ts +1 -1
  232. package/gs/os/error.gs.ts +1 -1
  233. package/gs/os/exec.gs.ts +4 -8
  234. package/gs/os/exec_posix.gs.ts +1 -1
  235. package/gs/os/index.test.ts +9 -0
  236. package/gs/os/index.ts +1 -0
  237. package/gs/os/parity.json +9 -0
  238. package/gs/os/proc.gs.ts +18 -5
  239. package/gs/os/proc.test.ts +26 -0
  240. package/gs/os/root_js.gs.ts +1 -1
  241. package/gs/os/types.gs.ts +1 -1
  242. package/gs/os/types_js.gs.ts +1 -1
  243. package/gs/os/types_unix.gs.ts +1 -1
  244. package/gs/path/path.ts +11 -7
  245. package/gs/reflect/field.test.ts +37 -15
  246. package/gs/reflect/function-types.test.ts +518 -22
  247. package/gs/reflect/index.ts +8 -6
  248. package/gs/reflect/map.ts +20 -0
  249. package/gs/reflect/meta.json +6 -4
  250. package/gs/reflect/parity.json +234 -0
  251. package/gs/reflect/sliceat.test.ts +156 -0
  252. package/gs/reflect/structof.test.ts +401 -0
  253. package/gs/reflect/type.ts +1961 -317
  254. package/gs/reflect/typefor.test.ts +530 -10
  255. package/gs/reflect/types.ts +43 -18
  256. package/gs/reflect/value.ts +105 -45
  257. package/gs/reflect/visiblefields.ts +5 -168
  258. package/gs/runtime/parity.json +24 -0
  259. package/gs/runtime/pprof/index.test.ts +29 -7
  260. package/gs/runtime/pprof/index.ts +56 -30
  261. package/gs/runtime/pprof/parity.json +27 -0
  262. package/gs/runtime/runtime.test.ts +3 -1
  263. package/gs/runtime/runtime.ts +4 -3
  264. package/gs/runtime/trace/index.test.ts +5 -3
  265. package/gs/runtime/trace/index.ts +8 -20
  266. package/gs/runtime/trace/parity.json +36 -0
  267. package/gs/strconv/atoi.gs.ts +1 -1
  268. package/gs/strconv/complex.gs.ts +174 -0
  269. package/gs/strconv/complex.test.ts +65 -0
  270. package/gs/strconv/index.ts +1 -0
  271. package/gs/strconv/parity.json +120 -0
  272. package/gs/strings/builder.ts +1 -1
  273. package/gs/strings/parity.json +186 -0
  274. package/gs/strings/reader.ts +9 -5
  275. package/gs/strings/replace.ts +15 -7
  276. package/gs/strings/strings.test.ts +22 -2
  277. package/gs/strings/strings.ts +64 -6
  278. package/gs/sync/atomic/doc_64.gs.ts +6 -7
  279. package/gs/sync/atomic/doc_64.test.ts +43 -0
  280. package/gs/sync/atomic/type.gs.ts +9 -9
  281. package/gs/sync/atomic/value.gs.ts +2 -2
  282. package/gs/syscall/env.ts +29 -14
  283. package/gs/testing/testing.test.ts +67 -0
  284. package/gs/testing/testing.ts +87 -19
  285. package/gs/time/parity.json +225 -0
  286. package/gs/time/time.test.ts +20 -2
  287. package/gs/time/time.ts +49 -7
  288. package/gs/unique/index.ts +7 -1
  289. package/package.json +4 -2
  290. package/dist/gs/github.com/aperturerobotics/starpc/srpc/index.d.ts +0 -217
  291. package/dist/gs/github.com/aperturerobotics/starpc/srpc/index.js +0 -926
  292. package/dist/gs/github.com/aperturerobotics/starpc/srpc/index.js.map +0 -1
  293. package/gs/github.com/aperturerobotics/starpc/srpc/index.test.ts +0 -38
  294. package/gs/github.com/aperturerobotics/starpc/srpc/index.ts +0 -1361
  295. 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 0
756
+ return 3
751
757
  }
752
758
  if (Array.isArray(this.value)) {
753
- return 1
759
+ return 5
754
760
  }
755
761
  if (typeof this.value === 'object') {
756
- return 2
762
+ return 6
757
763
  }
758
764
  if (typeof this.value === 'string') {
759
- return 3
765
+ return 1
760
766
  }
761
767
  if (typeof this.value === 'number') {
762
- return 4
768
+ return 2
763
769
  }
764
770
  if (typeof this.value === 'boolean') {
765
- return 5
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
- msg: { kind: $.TypeKind.Basic, name: 'string' },
114
- stack: { kind: $.TypeKind.Pointer, elemType: 'stack' },
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
- error: {
236
- kind: $.TypeKind.Interface,
237
- name: 'GoError',
238
- methods: [
239
- {
240
- name: 'Error',
241
- args: [],
242
- returns: [{ type: { kind: $.TypeKind.Basic, name: 'string' } }],
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
- stack: { kind: $.TypeKind.Pointer, elemType: 'stack' },
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
- cause: {
410
- kind: $.TypeKind.Interface,
411
- name: 'GoError',
412
- methods: [
413
- {
414
- name: 'Error',
415
- args: [],
416
- returns: [{ type: { kind: $.TypeKind.Basic, name: 'string' } }],
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
- msg: { kind: $.TypeKind.Basic, name: 'string' },
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('adds and formats scanner errors', () => {
18
- const list: $.VarRef<ErrorList> = $.varRef(null)
19
-
20
- ErrorList_Add(
21
- list,
22
- $.markAsStructValue(
23
- new token.Position({
24
- Filename: 'test.go',
25
- Line: 1,
26
- Column: 1,
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('removes repeated line errors', () => {
37
- const list: $.VarRef<ErrorList> = $.varRef(null)
38
- const pos = $.markAsStructValue(
39
- new token.Position({
40
- Filename: 'test.go',
41
- Line: 1,
42
- Column: 1,
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
- ErrorList_Add(list, pos, 'first')
47
- ErrorList_Add(list, pos, 'second')
48
- ErrorList_RemoveMultiples(list)
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
- const list: $.VarRef<ErrorList> = $.varRef(null)
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
- it('provides a Scanner surface for generated go/parser code', () => {
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
- scanner.Init(file, null, null, 0)
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(scanner.Scan()).toEqual([file.Pos(0), token.EOF, ''])
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
  })
@@ -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: { type: 'go/token.Position' },
59
- Msg: { kind: $.TypeKind.Basic, name: 'string' },
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
- return $.newError(ErrorList_Error(list))
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
+ }
@@ -285,12 +285,28 @@ export class Position {
285
285
  },
286
286
  ],
287
287
  Position,
288
- {
289
- Filename: { kind: $.TypeKind.Basic, name: 'string' },
290
- Offset: { kind: $.TypeKind.Basic, name: 'int' },
291
- Line: { kind: $.TypeKind.Basic, name: 'int' },
292
- Column: { kind: $.TypeKind.Basic, name: 'int' },
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
 
@@ -1,37 +1,24 @@
1
1
  import { describe, expect, it } from 'vitest'
2
2
 
3
- import * as $ from '../builtin/index.js'
4
-
5
- import './index.js'
6
-
7
- class FakeHash {
8
- Write(p: $.Bytes): [number, $.GoError] {
9
- return [$.len(p), null]
10
- }
11
-
12
- Sum(b: $.Bytes): $.Bytes {
13
- return b
14
- }
15
-
16
- Reset(): void {}
17
-
18
- Size(): number {
19
- return 20
20
- }
21
-
22
- BlockSize(): number {
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(Number(0x0102030405060708n))
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(Number(0x0102030405060708n))
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 Number(
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 Number(
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
- // Architecture constants for JavaScript/WebAssembly target
2
- // This replaces the auto-generated version with appropriate values for JS
1
+ export type ArchFamilyType = number
3
2
 
4
- // Pointer size in bytes (64-bit in modern JavaScript environments)
5
- export const PtrSize = 8
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
- // JavaScript is little-endian
8
- export const BigEndian = false
15
+ export const GOARCH = 'wasm'
9
16
 
10
- // Architecture family
11
- export const ArchFamily = 'wasm'
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
- // Other common architecture constants
14
- export const Int64Align = 8
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