goscript 0.1.1 → 0.1.2

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 (356) hide show
  1. package/cmd/goscript/cmd-test.go +104 -11
  2. package/cmd/goscript/cmd-test_test.go +1 -1
  3. package/cmd/goscript/cmd_compile.go +9 -0
  4. package/compiler/compile-request.go +31 -0
  5. package/compiler/compiler.go +1 -1
  6. package/compiler/compliance_test.go +0 -2
  7. package/compiler/config.go +2 -0
  8. package/compiler/gotest/package-result.go +2 -0
  9. package/compiler/gotest/request.go +85 -20
  10. package/compiler/gotest/runner.go +733 -96
  11. package/compiler/gotest/runner_test.go +647 -3
  12. package/compiler/lowered-program.go +9 -2
  13. package/compiler/lowering.go +2001 -345
  14. package/compiler/override-facts.go +77 -27
  15. package/compiler/override-registry.go +5 -4
  16. package/compiler/override-registry_test.go +135 -0
  17. package/compiler/package-graph_test.go +62 -7
  18. package/compiler/package-test-graph-variant.go +40 -16
  19. package/compiler/package-test-graph.go +0 -5
  20. package/compiler/package-test-graph_test.go +61 -3
  21. package/compiler/runtime-contract.go +40 -0
  22. package/compiler/semantic-model-types.go +16 -0
  23. package/compiler/semantic-model.go +336 -91
  24. package/compiler/semantic-model_test.go +50 -1
  25. package/compiler/service.go +9 -3
  26. package/compiler/skeleton_test.go +1921 -298
  27. package/compiler/tsworkspace/owner-process-unix_test.go +72 -0
  28. package/compiler/tsworkspace/owner.go +8 -0
  29. package/compiler/tsworkspace/tool-process-other.go +14 -0
  30. package/compiler/tsworkspace/tool-process-unix.go +19 -0
  31. package/compiler/typescript-emitter.go +122 -9
  32. package/dist/gs/builtin/builtin.d.ts +20 -1
  33. package/dist/gs/builtin/builtin.js +246 -26
  34. package/dist/gs/builtin/builtin.js.map +1 -1
  35. package/dist/gs/builtin/channel.d.ts +24 -10
  36. package/dist/gs/builtin/channel.js +107 -25
  37. package/dist/gs/builtin/channel.js.map +1 -1
  38. package/dist/gs/builtin/defer.d.ts +1 -0
  39. package/dist/gs/builtin/defer.js +12 -2
  40. package/dist/gs/builtin/defer.js.map +1 -1
  41. package/dist/gs/builtin/hostio.d.ts +9 -0
  42. package/dist/gs/builtin/hostio.js +25 -0
  43. package/dist/gs/builtin/hostio.js.map +1 -1
  44. package/dist/gs/builtin/map.js +40 -6
  45. package/dist/gs/builtin/map.js.map +1 -1
  46. package/dist/gs/builtin/print.js.map +1 -1
  47. package/dist/gs/builtin/slice.d.ts +43 -9
  48. package/dist/gs/builtin/slice.js +437 -234
  49. package/dist/gs/builtin/slice.js.map +1 -1
  50. package/dist/gs/builtin/type.d.ts +2 -0
  51. package/dist/gs/builtin/type.js +47 -7
  52. package/dist/gs/builtin/type.js.map +1 -1
  53. package/dist/gs/builtin/varRef.d.ts +2 -0
  54. package/dist/gs/builtin/varRef.js.map +1 -1
  55. package/dist/gs/bytes/buffer.gs.js +28 -28
  56. package/dist/gs/bytes/buffer.gs.js.map +1 -1
  57. package/dist/gs/bytes/iter.gs.js +13 -13
  58. package/dist/gs/bytes/iter.gs.js.map +1 -1
  59. package/dist/gs/compress/zlib/index.d.ts +26 -0
  60. package/dist/gs/compress/zlib/index.js +168 -0
  61. package/dist/gs/compress/zlib/index.js.map +1 -0
  62. package/dist/gs/context/context.d.ts +1 -1
  63. package/dist/gs/context/context.js +8 -3
  64. package/dist/gs/context/context.js.map +1 -1
  65. package/dist/gs/crypto/ecdh/index.d.ts +52 -0
  66. package/dist/gs/crypto/ecdh/index.js +226 -0
  67. package/dist/gs/crypto/ecdh/index.js.map +1 -0
  68. package/dist/gs/crypto/ed25519/index.d.ts +34 -0
  69. package/dist/gs/crypto/ed25519/index.js +160 -0
  70. package/dist/gs/crypto/ed25519/index.js.map +1 -0
  71. package/dist/gs/crypto/internal/constanttime/index.d.ts +4 -0
  72. package/dist/gs/crypto/internal/constanttime/index.js +18 -0
  73. package/dist/gs/crypto/internal/constanttime/index.js.map +1 -0
  74. package/dist/gs/crypto/rand/index.d.ts +2 -0
  75. package/dist/gs/crypto/rand/index.js +85 -0
  76. package/dist/gs/crypto/rand/index.js.map +1 -1
  77. package/dist/gs/crypto/sha256/index.d.ts +8 -0
  78. package/dist/gs/crypto/sha256/index.js +118 -0
  79. package/dist/gs/crypto/sha256/index.js.map +1 -0
  80. package/dist/gs/crypto/sha512/index.d.ts +14 -0
  81. package/dist/gs/crypto/sha512/index.js +129 -0
  82. package/dist/gs/crypto/sha512/index.js.map +1 -0
  83. package/dist/gs/encoding/json/index.d.ts +3 -0
  84. package/dist/gs/encoding/json/index.js +15 -0
  85. package/dist/gs/encoding/json/index.js.map +1 -1
  86. package/dist/gs/errors/errors.js +29 -6
  87. package/dist/gs/errors/errors.js.map +1 -1
  88. package/dist/gs/fmt/fmt.js.map +1 -1
  89. package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/index.d.ts +7 -7
  90. package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/index.js +52 -18
  91. package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/index.js.map +1 -1
  92. package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/json/index.js +56 -20
  93. package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/json/index.js.map +1 -1
  94. package/dist/gs/github.com/aperturerobotics/starpc/srpc/index.d.ts +57 -3
  95. package/dist/gs/github.com/aperturerobotics/starpc/srpc/index.js +366 -1
  96. package/dist/gs/github.com/aperturerobotics/starpc/srpc/index.js.map +1 -1
  97. package/dist/gs/github.com/aperturerobotics/util/conc/index.d.ts +20 -0
  98. package/dist/gs/github.com/aperturerobotics/util/conc/index.js +134 -0
  99. package/dist/gs/github.com/aperturerobotics/util/conc/index.js.map +1 -0
  100. package/dist/gs/github.com/aperturerobotics/wasivm/wazero/kernel/runtime/browser/browser.js.map +1 -1
  101. package/dist/gs/github.com/hack-pad/safejs/internal/catch/index.d.ts +3 -0
  102. package/dist/gs/github.com/hack-pad/safejs/internal/catch/index.js +50 -0
  103. package/dist/gs/github.com/hack-pad/safejs/internal/catch/index.js.map +1 -0
  104. package/dist/gs/github.com/klauspost/compress/internal/le/index.js +3 -2
  105. package/dist/gs/github.com/klauspost/compress/internal/le/index.js.map +1 -1
  106. package/dist/gs/github.com/mr-tron/base58/base58/index.d.ts +27 -0
  107. package/dist/gs/github.com/mr-tron/base58/base58/index.js +172 -0
  108. package/dist/gs/github.com/mr-tron/base58/base58/index.js.map +1 -0
  109. package/dist/gs/github.com/zeebo/blake3/internal/consts/index.d.ts +21 -0
  110. package/dist/gs/github.com/zeebo/blake3/internal/consts/index.js +22 -0
  111. package/dist/gs/github.com/zeebo/blake3/internal/consts/index.js.map +1 -0
  112. package/dist/gs/go/token/index.js +11 -4
  113. package/dist/gs/go/token/index.js.map +1 -1
  114. package/dist/gs/hash/fnv/index.d.ts +57 -0
  115. package/dist/gs/hash/fnv/index.js +299 -0
  116. package/dist/gs/hash/fnv/index.js.map +1 -0
  117. package/dist/gs/hash/index.d.ts +17 -0
  118. package/dist/gs/hash/index.js +94 -0
  119. package/dist/gs/hash/index.js.map +1 -0
  120. package/dist/gs/io/fs/readlink.js +2 -6
  121. package/dist/gs/io/fs/readlink.js.map +1 -1
  122. package/dist/gs/io/fs/walk.js.map +1 -1
  123. package/dist/gs/io/io.js.map +1 -1
  124. package/dist/gs/iter/iter.d.ts +3 -2
  125. package/dist/gs/iter/iter.js.map +1 -1
  126. package/dist/gs/maps/iter.d.ts +5 -5
  127. package/dist/gs/maps/iter.js +48 -21
  128. package/dist/gs/maps/iter.js.map +1 -1
  129. package/dist/gs/maps/maps.d.ts +6 -6
  130. package/dist/gs/math/bits/index.js +14 -24
  131. package/dist/gs/math/bits/index.js.map +1 -1
  132. package/dist/gs/mime/index.js +3 -1
  133. package/dist/gs/mime/index.js.map +1 -1
  134. package/dist/gs/net/http/httptest/index.d.ts +20 -1
  135. package/dist/gs/net/http/httptest/index.js +83 -3
  136. package/dist/gs/net/http/httptest/index.js.map +1 -1
  137. package/dist/gs/net/http/index.d.ts +110 -6
  138. package/dist/gs/net/http/index.js +262 -16
  139. package/dist/gs/net/http/index.js.map +1 -1
  140. package/dist/gs/net/http/pprof/index.d.ts +8 -0
  141. package/dist/gs/net/http/pprof/index.js +59 -0
  142. package/dist/gs/net/http/pprof/index.js.map +1 -0
  143. package/dist/gs/os/error.gs.js +9 -7
  144. package/dist/gs/os/error.gs.js.map +1 -1
  145. package/dist/gs/os/types_js.gs.js +95 -15
  146. package/dist/gs/os/types_js.gs.js.map +1 -1
  147. package/dist/gs/path/filepath/match.js.map +1 -1
  148. package/dist/gs/path/filepath/path.d.ts +5 -3
  149. package/dist/gs/path/filepath/path.js +65 -10
  150. package/dist/gs/path/filepath/path.js.map +1 -1
  151. package/dist/gs/reflect/index.d.ts +3 -2
  152. package/dist/gs/reflect/index.js +2 -1
  153. package/dist/gs/reflect/index.js.map +1 -1
  154. package/dist/gs/reflect/iter.js +2 -2
  155. package/dist/gs/reflect/iter.js.map +1 -1
  156. package/dist/gs/reflect/map.js +26 -0
  157. package/dist/gs/reflect/map.js.map +1 -1
  158. package/dist/gs/reflect/type.d.ts +24 -5
  159. package/dist/gs/reflect/type.js +390 -38
  160. package/dist/gs/reflect/type.js.map +1 -1
  161. package/dist/gs/reflect/types.d.ts +1 -0
  162. package/dist/gs/reflect/types.js +3 -1
  163. package/dist/gs/reflect/types.js.map +1 -1
  164. package/dist/gs/reflect/value.d.ts +4 -1
  165. package/dist/gs/reflect/value.js +39 -1
  166. package/dist/gs/reflect/value.js.map +1 -1
  167. package/dist/gs/reflect/visiblefields.js +1 -1
  168. package/dist/gs/reflect/visiblefields.js.map +1 -1
  169. package/dist/gs/runtime/debug/index.d.ts +39 -0
  170. package/dist/gs/runtime/debug/index.js +58 -0
  171. package/dist/gs/runtime/debug/index.js.map +1 -1
  172. package/dist/gs/runtime/pprof/index.d.ts +20 -0
  173. package/dist/gs/runtime/pprof/index.js +85 -0
  174. package/dist/gs/runtime/pprof/index.js.map +1 -0
  175. package/dist/gs/runtime/trace/index.d.ts +19 -0
  176. package/dist/gs/runtime/trace/index.js +64 -0
  177. package/dist/gs/runtime/trace/index.js.map +1 -0
  178. package/dist/gs/slices/slices.d.ts +24 -9
  179. package/dist/gs/slices/slices.js +229 -24
  180. package/dist/gs/slices/slices.js.map +1 -1
  181. package/dist/gs/sort/slice.gs.d.ts +5 -3
  182. package/dist/gs/sort/slice.gs.js +55 -17
  183. package/dist/gs/sort/slice.gs.js.map +1 -1
  184. package/dist/gs/strings/builder.js +26 -17
  185. package/dist/gs/strings/builder.js.map +1 -1
  186. package/dist/gs/strings/iter.js +140 -75
  187. package/dist/gs/strings/iter.js.map +1 -1
  188. package/dist/gs/strings/replace.js +2 -2
  189. package/dist/gs/strings/replace.js.map +1 -1
  190. package/dist/gs/strings/strings.js +52 -6
  191. package/dist/gs/strings/strings.js.map +1 -1
  192. package/dist/gs/sync/sync.d.ts +6 -3
  193. package/dist/gs/sync/sync.js +39 -11
  194. package/dist/gs/sync/sync.js.map +1 -1
  195. package/dist/gs/syscall/errors.d.ts +116 -112
  196. package/dist/gs/syscall/errors.js +38 -1
  197. package/dist/gs/syscall/errors.js.map +1 -1
  198. package/dist/gs/syscall/fs.d.ts +2 -8
  199. package/dist/gs/syscall/fs.js.map +1 -1
  200. package/dist/gs/syscall/js/index.js +20 -12
  201. package/dist/gs/syscall/js/index.js.map +1 -1
  202. package/dist/gs/syscall/types.d.ts +4 -1
  203. package/dist/gs/syscall/types.js.map +1 -1
  204. package/dist/gs/testing/testing.d.ts +4 -3
  205. package/dist/gs/testing/testing.js +21 -4
  206. package/dist/gs/testing/testing.js.map +1 -1
  207. package/dist/gs/time/time.js +22 -0
  208. package/dist/gs/time/time.js.map +1 -1
  209. package/dist/gs/unicode/unicode.js.map +1 -1
  210. package/dist/gs/unique/index.js +7 -2
  211. package/dist/gs/unique/index.js.map +1 -1
  212. package/go.mod +8 -8
  213. package/go.sum +14 -23
  214. package/gs/builtin/builtin.ts +364 -37
  215. package/gs/builtin/channel.ts +161 -29
  216. package/gs/builtin/defer.ts +13 -2
  217. package/gs/builtin/hostio.test.ts +1 -0
  218. package/gs/builtin/hostio.ts +38 -0
  219. package/gs/builtin/map.ts +46 -6
  220. package/gs/builtin/print.ts +12 -3
  221. package/gs/builtin/runtime-contract.test.ts +257 -10
  222. package/gs/builtin/slice.test.ts +70 -0
  223. package/gs/builtin/slice.ts +566 -255
  224. package/gs/builtin/type.ts +53 -9
  225. package/gs/builtin/varRef.ts +2 -0
  226. package/gs/bytes/buffer.gs.ts +28 -28
  227. package/gs/bytes/iter.gs.ts +13 -14
  228. package/gs/compress/zlib/index.test.ts +28 -0
  229. package/gs/compress/zlib/index.ts +200 -0
  230. package/gs/compress/zlib/meta.json +3 -0
  231. package/gs/context/context.test.ts +31 -1
  232. package/gs/context/context.ts +9 -4
  233. package/gs/crypto/ecdh/index.test.ts +43 -0
  234. package/gs/crypto/ecdh/index.ts +274 -0
  235. package/gs/crypto/ed25519/index.test.ts +41 -0
  236. package/gs/crypto/ed25519/index.ts +238 -0
  237. package/gs/crypto/ed25519/meta.json +13 -0
  238. package/gs/crypto/internal/constanttime/index.test.ts +25 -0
  239. package/gs/crypto/internal/constanttime/index.ts +22 -0
  240. package/gs/crypto/rand/index.test.ts +89 -1
  241. package/gs/crypto/rand/index.ts +103 -1
  242. package/gs/crypto/rand/meta.json +4 -1
  243. package/gs/crypto/sha256/index.test.ts +78 -0
  244. package/gs/crypto/sha256/index.ts +150 -0
  245. package/gs/crypto/sha256/meta.json +9 -0
  246. package/gs/crypto/sha512/index.test.ts +31 -0
  247. package/gs/crypto/sha512/index.ts +161 -0
  248. package/gs/crypto/sha512/meta.json +11 -0
  249. package/gs/encoding/json/index.test.ts +25 -3
  250. package/gs/encoding/json/index.ts +21 -3
  251. package/gs/errors/errors.test.ts +4 -1
  252. package/gs/errors/errors.ts +32 -8
  253. package/gs/fmt/fmt.test.ts +3 -1
  254. package/gs/fmt/fmt.ts +1 -5
  255. package/gs/github.com/aperturerobotics/protobuf-go-lite/index.test.ts +62 -7
  256. package/gs/github.com/aperturerobotics/protobuf-go-lite/index.ts +78 -36
  257. package/gs/github.com/aperturerobotics/protobuf-go-lite/json/index.test.ts +32 -11
  258. package/gs/github.com/aperturerobotics/protobuf-go-lite/json/index.ts +122 -43
  259. package/gs/github.com/aperturerobotics/starpc/srpc/index.test.ts +31 -0
  260. package/gs/github.com/aperturerobotics/starpc/srpc/index.ts +518 -4
  261. package/gs/github.com/aperturerobotics/starpc/srpc/meta.json +6 -0
  262. package/gs/github.com/aperturerobotics/util/conc/index.test.ts +30 -0
  263. package/gs/github.com/aperturerobotics/util/conc/index.ts +172 -0
  264. package/gs/github.com/aperturerobotics/util/conc/meta.json +9 -0
  265. package/gs/github.com/aperturerobotics/wasivm/wazero/kernel/runtime/browser/browser.ts +1 -4
  266. package/gs/github.com/hack-pad/safejs/internal/catch/index.test.ts +35 -0
  267. package/gs/github.com/hack-pad/safejs/internal/catch/index.ts +65 -0
  268. package/gs/github.com/hack-pad/safejs/internal/catch/meta.json +9 -0
  269. package/gs/github.com/klauspost/compress/internal/le/index.test.ts +2 -1
  270. package/gs/github.com/klauspost/compress/internal/le/index.ts +6 -5
  271. package/gs/github.com/mr-tron/base58/base58/index.test.ts +70 -0
  272. package/gs/github.com/mr-tron/base58/base58/index.ts +231 -0
  273. package/gs/github.com/mr-tron/base58/base58/meta.json +3 -0
  274. package/gs/github.com/zeebo/blake3/internal/consts/index.test.ts +46 -0
  275. package/gs/github.com/zeebo/blake3/internal/consts/index.ts +26 -0
  276. package/gs/go/token/index.ts +17 -4
  277. package/gs/hash/fnv/index.test.ts +67 -0
  278. package/gs/hash/fnv/index.ts +351 -0
  279. package/gs/hash/fnv/meta.json +3 -0
  280. package/gs/hash/index.test.ts +37 -0
  281. package/gs/hash/index.ts +118 -0
  282. package/gs/hash/meta.json +5 -0
  283. package/gs/internal/byteorder/index.test.ts +6 -6
  284. package/gs/io/fs/readlink.ts +40 -48
  285. package/gs/io/fs/walk.ts +10 -2
  286. package/gs/io/io.ts +4 -1
  287. package/gs/iter/iter.ts +8 -2
  288. package/gs/maps/iter.ts +69 -26
  289. package/gs/maps/maps.test.ts +23 -0
  290. package/gs/maps/maps.ts +6 -6
  291. package/gs/math/bits/index.test.ts +20 -0
  292. package/gs/math/bits/index.ts +15 -28
  293. package/gs/mime/index.ts +8 -2
  294. package/gs/net/http/httptest/index.test.ts +53 -0
  295. package/gs/net/http/httptest/index.ts +98 -3
  296. package/gs/net/http/index.test.ts +129 -1
  297. package/gs/net/http/index.ts +370 -19
  298. package/gs/net/http/meta.json +6 -0
  299. package/gs/net/http/pprof/index.test.ts +47 -0
  300. package/gs/net/http/pprof/index.ts +65 -0
  301. package/gs/os/error.gs.ts +9 -10
  302. package/gs/os/error.test.ts +41 -0
  303. package/gs/os/file_unix_js.test.ts +55 -0
  304. package/gs/os/tempfile.gs.test.ts +37 -10
  305. package/gs/os/types_js.gs.ts +94 -15
  306. package/gs/path/filepath/match.ts +4 -1
  307. package/gs/path/filepath/meta.json +6 -0
  308. package/gs/path/filepath/path.test.ts +57 -2
  309. package/gs/path/filepath/path.ts +91 -12
  310. package/gs/reflect/field.test.ts +63 -0
  311. package/gs/reflect/index.ts +4 -1
  312. package/gs/reflect/iter.ts +2 -2
  313. package/gs/reflect/map.test.ts +24 -2
  314. package/gs/reflect/map.ts +35 -0
  315. package/gs/reflect/type.ts +543 -60
  316. package/gs/reflect/typefor.test.ts +100 -0
  317. package/gs/reflect/types.ts +3 -1
  318. package/gs/reflect/value.ts +50 -1
  319. package/gs/reflect/visiblefields.ts +1 -1
  320. package/gs/runtime/debug/index.test.ts +22 -1
  321. package/gs/runtime/debug/index.ts +88 -0
  322. package/gs/runtime/pprof/index.test.ts +36 -0
  323. package/gs/runtime/pprof/index.ts +104 -0
  324. package/gs/runtime/pprof/meta.json +6 -0
  325. package/gs/runtime/trace/index.test.ts +45 -0
  326. package/gs/runtime/trace/index.ts +97 -0
  327. package/gs/runtime/trace/meta.json +7 -0
  328. package/gs/slices/meta.json +2 -1
  329. package/gs/slices/slices.test.ts +86 -0
  330. package/gs/slices/slices.ts +284 -37
  331. package/gs/sort/slice.gs.ts +73 -23
  332. package/gs/sort/slice.test.ts +40 -0
  333. package/gs/strings/builder.test.ts +8 -0
  334. package/gs/strings/builder.ts +29 -17
  335. package/gs/strings/iter.test.ts +5 -7
  336. package/gs/strings/iter.ts +146 -71
  337. package/gs/strings/replace.test.ts +1 -4
  338. package/gs/strings/replace.ts +6 -6
  339. package/gs/strings/strings.test.ts +4 -0
  340. package/gs/strings/strings.ts +54 -6
  341. package/gs/sync/sync.test.ts +57 -1
  342. package/gs/sync/sync.ts +45 -13
  343. package/gs/syscall/errors.ts +158 -115
  344. package/gs/syscall/fs.ts +8 -8
  345. package/gs/syscall/js/index.ts +49 -22
  346. package/gs/syscall/net.test.ts +26 -0
  347. package/gs/syscall/types.ts +7 -2
  348. package/gs/testing/testing.test.ts +56 -0
  349. package/gs/testing/testing.ts +27 -10
  350. package/gs/time/meta.json +2 -2
  351. package/gs/time/time.test.ts +4 -0
  352. package/gs/time/time.ts +33 -2
  353. package/gs/unicode/unicode.test.ts +14 -3
  354. package/gs/unicode/unicode.ts +1 -5
  355. package/gs/unique/index.ts +9 -2
  356. package/package.json +3 -3
@@ -1,9 +1,12 @@
1
1
  import { afterEach, describe, expect, it, vi } from 'vitest'
2
2
 
3
3
  import {
4
+ append,
4
5
  bytesToUint8Array,
6
+ type Bytes,
5
7
  byte,
6
8
  cap,
9
+ cloneArrayValue,
7
10
  cloneStructValue,
8
11
  callGenericMethod,
9
12
  chanRecvWithOk,
@@ -11,6 +14,7 @@ import {
11
14
  genericZero,
12
15
  goSlice,
13
16
  int,
17
+ arrayPointerFromIndexRef,
14
18
  indexAddress,
15
19
  indexRef,
16
20
  interfaceValue,
@@ -22,6 +26,7 @@ import {
22
26
  mapSet,
23
27
  markAsStructValue,
24
28
  namedFunction,
29
+ namedValueInterfaceValue,
25
30
  newError,
26
31
  pointerValue,
27
32
  print,
@@ -30,13 +35,19 @@ import {
30
35
  registerInterfaceType,
31
36
  registerStructType,
32
37
  resetHostRuntimeForTests,
38
+ selectStatement,
33
39
  sliceToArray,
40
+ sliceHeaderRef,
41
+ stringHeaderRef,
34
42
  TypeKind,
35
43
  typeAssert,
44
+ typeAssertTuple,
36
45
  typedNil,
37
46
  uint,
38
47
  uint64Add,
39
48
  uint64And,
49
+ uint64Div,
50
+ uint64Mod,
40
51
  uint64Mul,
41
52
  uint64Or,
42
53
  uint64Shl,
@@ -112,11 +123,17 @@ describe('builtin runtime contract helpers', () => {
112
123
  it('exposes numeric, varref, map, and error helpers', () => {
113
124
  expect(int(1.9)).toBe(1)
114
125
  expect(int(3n)).toBe(3)
126
+ expect(uint(257, 8)).toBe(1)
127
+ expect(uint(-1.9, 8)).toBe(255)
128
+ expect(uint(0x1_0000_0005, 32)).toBe(5)
129
+ expect(uint(42, 64)).toBe(42)
115
130
  expect(uint(-1n, 8)).toBe(255)
116
131
  expect(byte(257)).toBe(1)
117
132
  expect(uint(uint64Shl(1n, 63), 32)).toBe(0)
118
133
  expect(uint(uint64Shr(uint64Shl(1n, 63), 60), 32)).toBe(8)
119
134
  expect(uint(uint64Mul(0xffffffffffffffffn, 3), 32)).toBe(0xfffffffd)
135
+ expect(uint64Div(0xffffffffffffffffn, 4114)).toBe(4483895010624587)
136
+ expect(uint64Mod(0xffffffffffffffffn, 4114)).toBe(697)
120
137
  expect(uint(uint64Add(0xffffffffffffffffn, 2), 32)).toBe(1)
121
138
  expect(uint(uint64Sub(1n, 2), 32)).toBe(0xffffffff)
122
139
  expect(uint(uint64And(0xf0n, 0x3cn), 32)).toBe(0x30)
@@ -147,12 +164,49 @@ describe('builtin runtime contract helpers', () => {
147
164
  }),
148
165
  ).toEqual({ value: nilNamedSlice, ok: true })
149
166
  expect(pointerValue({ ok: true })).toEqual({ ok: true })
167
+ const namedPointerBox = namedValueInterfaceValue(
168
+ varRef(new Uint8Array([1, 2])),
169
+ '*main.Bytes',
170
+ {},
171
+ )
172
+ expect(pointerValue(namedPointerBox)).toEqual(new Uint8Array([1, 2]))
173
+ const namedPointerMethodBox = namedValueInterfaceValue(
174
+ varRef(new Uint8Array([1, 2, 3])),
175
+ '*main.Bytes',
176
+ { Len: (receiver: any) => len(receiver.value) },
177
+ )
178
+ expect(pointerValue(namedPointerMethodBox)).toBe(namedPointerMethodBox)
179
+ expect(pointerValue(namedPointerMethodBox).Len()).toBe(3)
180
+ expect(len(pointerValue(namedPointerMethodBox))).toBe(3)
181
+ expect(bytesToUint8Array(pointerValue(namedPointerMethodBox))).toEqual(
182
+ new Uint8Array([1, 2, 3]),
183
+ )
184
+ expect(bytesToUint8Array(goSlice(pointerValue(namedPointerMethodBox), 1))).toEqual(
185
+ new Uint8Array([2, 3]),
186
+ )
187
+ const namedStringBox = namedValueInterfaceValue('id', 'main.Name', {
188
+ String: (receiver: string) => `name:${receiver}`,
189
+ })
190
+ expect(pointerValue(namedStringBox)).toBe(namedStringBox)
191
+ expect(pointerValue(namedStringBox).String()).toBe('name:id')
150
192
  expect(cloneStructValue({ clone: () => ({ ok: true }) })).toEqual({
151
193
  ok: true,
152
194
  })
153
195
  expect(
154
196
  cloneStructValue({ __goscriptClone: () => ({ internal: true }) }),
155
197
  ).toEqual({ internal: true })
198
+ const fixedBytes = new Uint8Array([1, 2, 3])
199
+ const clonedBytes = cloneArrayValue(fixedBytes)
200
+ expect(clonedBytes).toEqual(fixedBytes)
201
+ expect(clonedBytes).not.toBe(fixedBytes)
202
+ const fixedWords = [
203
+ [1, 2],
204
+ [3, 4],
205
+ ]
206
+ const clonedWords = cloneArrayValue(fixedWords)
207
+ expect(clonedWords).toEqual(fixedWords)
208
+ expect(clonedWords).not.toBe(fixedWords)
209
+ expect(clonedWords[0]).not.toBe(fixedWords[0])
156
210
  expect(() => pointerValue(null)).toThrow('nil pointer dereference')
157
211
  const unsupported = unsupportedPointerRef<number>(0)
158
212
  expect(() => unsupported.value).toThrow('unsafe pointer dereference')
@@ -173,6 +227,110 @@ describe('builtin runtime contract helpers', () => {
173
227
  ])
174
228
  })
175
229
 
230
+ it('matches struct map keys by Go comparable value', () => {
231
+ class Key {
232
+ public _fields: {
233
+ name: ReturnType<typeof varRef<string>>
234
+ id: ReturnType<typeof varRef<number>>
235
+ }
236
+
237
+ constructor(name: string, id: number) {
238
+ this._fields = {
239
+ name: varRef(name),
240
+ id: varRef(id),
241
+ }
242
+ }
243
+ }
244
+
245
+ const m = makeMap<Key, string>()
246
+ mapSet(m, markAsStructValue(new Key('so-1', 7)), 'pending')
247
+ mapSet(m, markAsStructValue(new Key('so-1', 7)), 'accepted')
248
+
249
+ expect(m.size).toBe(1)
250
+ expect(mapGet(m, markAsStructValue(new Key('so-1', 7)), '')).toEqual([
251
+ 'accepted',
252
+ true,
253
+ ])
254
+ expect(mapGet(m, markAsStructValue(new Key('so-2', 7)), '')).toEqual([
255
+ '',
256
+ false,
257
+ ])
258
+ })
259
+
260
+ it('does not compare runtime internals as generated struct values', () => {
261
+ class RuntimeType {
262
+ constructor(
263
+ private readonly name: string,
264
+ public readonly _fields: unknown[],
265
+ ) {}
266
+
267
+ String(): string {
268
+ return this.name
269
+ }
270
+ }
271
+
272
+ const m = makeMap<RuntimeType, string>()
273
+ mapSet(m, new RuntimeType('gob.wireType', []), 'wire')
274
+
275
+ expect(mapGet(m, new RuntimeType('gob.arrayType', []), '')).toEqual([
276
+ '',
277
+ false,
278
+ ])
279
+ })
280
+
281
+ it('tries duplicate runtime type registrations for colliding package names', () => {
282
+ class HashInterfaceImpl {
283
+ Write(_p: Bytes): [number, null] {
284
+ return [0, null]
285
+ }
286
+ }
287
+ class HashMessage {}
288
+
289
+ registerInterfaceType('collision.Hash', null, [
290
+ {
291
+ name: 'Write',
292
+ args: [
293
+ {
294
+ name: 'p',
295
+ type: {
296
+ kind: TypeKind.Slice,
297
+ elemType: { kind: TypeKind.Basic, name: 'uint8' },
298
+ },
299
+ },
300
+ ],
301
+ returns: [],
302
+ },
303
+ ])
304
+ registerStructType(
305
+ 'collision.Hash',
306
+ new HashMessage(),
307
+ [],
308
+ HashMessage,
309
+ {},
310
+ )
311
+
312
+ expect(typeAssertTuple(new HashInterfaceImpl(), 'collision.Hash')[1]).toBe(
313
+ true,
314
+ )
315
+ expect(
316
+ typeAssertTuple(markAsStructValue(new HashMessage()), 'collision.Hash')[1],
317
+ ).toBe(true)
318
+ })
319
+
320
+ it('asserts interface-boxed named primitive values by declared type', () => {
321
+ const boxed = namedValueInterfaceValue(13, 'main.MyInt', {
322
+ Double: (receiver: number) => receiver * 2,
323
+ })
324
+
325
+ expect(
326
+ typeAssertTuple<number>(boxed, {
327
+ kind: TypeKind.Basic,
328
+ name: 'int',
329
+ typeName: 'main.MyInt',
330
+ }),
331
+ ).toEqual([13, true])
332
+ })
333
+
176
334
  it('exposes addressable slice and array index references', () => {
177
335
  const values = [1, 2, 3]
178
336
  const second = indexRef(values, 1)
@@ -199,8 +357,46 @@ describe('builtin runtime contract helpers', () => {
199
357
  fullBytes![7] = 12
200
358
  expect((byteBacking as Uint8Array)[7]).toBe(12)
201
359
 
360
+ const arrayPointer = arrayPointerFromIndexRef(indexRef(byteBacking, 1), 3)
361
+ const arrayView = pointerValue(arrayPointer) as Uint8Array
362
+ expect(len(arrayView)).toBe(3)
363
+ arrayView[2] = 19
364
+ expect((byteBacking as Uint8Array)[3]).toBe(19)
365
+
202
366
  shortBytes![0] = 14
203
367
  expect(bytesToUint8Array(shortBytes)).toEqual(new Uint8Array([14, 0]))
368
+
369
+ class Entry {
370
+ value = ''
371
+ }
372
+ const entries = makeSlice<Entry>(1, 3, undefined, () => new Entry())
373
+ const expanded = goSlice(entries, 0, 3)
374
+ const extra = indexRef(expanded, 2)
375
+ extra.value.value = 'zero-backed'
376
+ expect(pointerValue(extra).value).toBe('zero-backed')
377
+
378
+ const base = makeSlice<number>(1, 4, 'number')
379
+ base![0] = 7
380
+ const beforeAppend = goSlice(base, 0, 1)
381
+ const afterAppend = append(beforeAppend, 8, 9)
382
+ expect(len(beforeAppend)).toBe(1)
383
+ expect(len(afterAppend)).toBe(3)
384
+ expect([...afterAppend!]).toEqual([7, 8, 9])
385
+ expect(beforeAppend![0]).toBe(7)
386
+
387
+ const splitLeft = goSlice(afterAppend, 0, 1, 1)
388
+ expect(len(splitLeft)).toBe(1)
389
+ expect(cap(splitLeft)).toBe(1)
390
+ expect([...splitLeft!]).toEqual([7])
391
+
392
+ const text = varRef('abc')
393
+ const headerBytes = varRef(makeSlice<number>(0, 0, 'byte'))
394
+ const strh = pointerValue(stringHeaderRef(text))
395
+ const sh = pointerValue(sliceHeaderRef(headerBytes))
396
+ sh.Data = strh.Data
397
+ sh.Len = strh.Len
398
+ sh.Cap = strh.Len
399
+ expect(bytesToUint8Array(headerBytes.value)).toEqual(new Uint8Array([97, 98, 99]))
204
400
  })
205
401
 
206
402
  it('exposes stable synthetic slice index addresses', () => {
@@ -259,6 +455,21 @@ describe('builtin runtime contract helpers', () => {
259
455
  expect(typeAssert<Runner>(new Runner(), runnerInterface).ok).toBe(true)
260
456
  expect(typeAssert<Runner>(null, runnerInterface).ok).toBe(false)
261
457
 
458
+ const emptyInterface = registerInterfaceType('phase5.EmptyInterface', null, [])
459
+ const fn = functionValue(() => 'ok', {
460
+ kind: TypeKind.Function,
461
+ params: [],
462
+ results: [{ kind: TypeKind.Basic, name: 'string' }],
463
+ })
464
+ expect(typeAssert<typeof fn>(fn, emptyInterface)).toEqual({
465
+ ok: true,
466
+ value: fn,
467
+ })
468
+ expect(typeAssert<number>(3, emptyInterface)).toEqual({
469
+ ok: true,
470
+ value: 3,
471
+ })
472
+
262
473
  const nil = typedNil('*main.Example')
263
474
  expect(nil.__isTypedNil).toBe(true)
264
475
  expect(nil.__goType).toBe('*main.Example')
@@ -285,11 +496,9 @@ describe('builtin runtime contract helpers', () => {
285
496
  [{ name: 'Name', args: [], returns: [{ type: 'string' }] }],
286
497
  TypedDog,
287
498
  )
288
- const dogInterface = registerInterfaceType(
289
- 'phase5.DogInterface',
290
- null,
291
- [{ name: 'Name', args: [], returns: [{ type: 'string' }] }],
292
- )
499
+ const dogInterface = registerInterfaceType('phase5.DogInterface', null, [
500
+ { name: 'Name', args: [], returns: [{ type: 'string' }] },
501
+ ])
293
502
  const nilDog = interfaceValue<{ Name(): string } | null>(
294
503
  null,
295
504
  '*phase5.TypedDog',
@@ -304,11 +513,16 @@ describe('builtin runtime contract helpers', () => {
304
513
  }),
305
514
  ).toEqual({ value: null, ok: true })
306
515
 
307
- const greet = namedFunction((name: string) => `hello ${name}`, 'phase5.Greet')
308
- expect(typeAssert<typeof greet>(greet, {
309
- kind: TypeKind.Function,
310
- name: 'phase5.Greet',
311
- }).ok).toBe(true)
516
+ const greet = namedFunction(
517
+ (name: string) => `hello ${name}`,
518
+ 'phase5.Greet',
519
+ )
520
+ expect(
521
+ typeAssert<typeof greet>(greet, {
522
+ kind: TypeKind.Function,
523
+ name: 'phase5.Greet',
524
+ }).ok,
525
+ ).toBe(true)
312
526
  expect(
313
527
  typeAssert<{ Name: string }>(
314
528
  { Name: 'Alice' },
@@ -346,11 +560,44 @@ describe('builtin runtime contract helpers', () => {
346
560
 
347
561
  it('exposes channel helpers used by future lowering', async () => {
348
562
  const channel = makeChannel<number>(1, 0, 'both')
563
+ expect(cap(channel)).toBe(1)
349
564
  await channel.send(7)
350
565
  expect(len(channel)).toBe(1)
566
+ expect(cap(channel)).toBe(1)
351
567
  expect(await chanRecvWithOk(channel)).toEqual({ value: 7, ok: true })
352
568
  expect(len(channel)).toBe(0)
353
569
  channel.close()
354
570
  expect(await chanRecvWithOk(channel)).toEqual({ value: 0, ok: false })
355
571
  })
572
+
573
+ it('cancels losing select receive cases', async () => {
574
+ const signal = makeChannel<string>(1, '', 'both')
575
+ const timeout = makeChannel<string>(0, '', 'both')
576
+ queueMicrotask(() => timeout.close())
577
+
578
+ await selectStatement(
579
+ [
580
+ {
581
+ id: 0,
582
+ isSend: false,
583
+ channel: signal,
584
+ onSelected: async () => 'signal',
585
+ },
586
+ {
587
+ id: 1,
588
+ isSend: false,
589
+ channel: timeout,
590
+ onSelected: async () => 'timeout',
591
+ },
592
+ ],
593
+ false,
594
+ )
595
+
596
+ await signal.send('value')
597
+ const received = await Promise.race([
598
+ signal.receive(),
599
+ new Promise<string>((resolve) => setTimeout(() => resolve('timeout'), 20)),
600
+ ])
601
+ expect(received).toBe('value')
602
+ })
356
603
  })
@@ -0,0 +1,70 @@
1
+ import { describe, expect, it } from 'vitest'
2
+
3
+ import { makeMap, mapGet, mapSet } from './map.js'
4
+ import {
5
+ bytesToString,
6
+ copy,
7
+ indexString,
8
+ len,
9
+ sliceString,
10
+ stringCompare,
11
+ stringEqual,
12
+ stringToBytes,
13
+ } from './slice.js'
14
+
15
+ describe('builtin string byte representation', () => {
16
+ it('round-trips non-UTF-8 byte strings without external provenance', () => {
17
+ const original = new Uint8Array([0, 255, 128, 65, 66])
18
+ const str = bytesToString(original)
19
+
20
+ expect(Array.from(stringToBytes(str))).toEqual(Array.from(original))
21
+ expect(len(str)).toBe(original.length)
22
+ expect(indexString(str, 1)).toBe(255)
23
+ expect(Array.from(stringToBytes(sliceString(str, 1, 4)))).toEqual([
24
+ 255, 128, 65,
25
+ ])
26
+ })
27
+
28
+ it('copies UTF-8 strings by bytes', () => {
29
+ const dst = new Uint8Array(3)
30
+
31
+ expect(copy(dst, '你')).toBe(3)
32
+ expect(Array.from(dst)).toEqual([0xe4, 0xbd, 0xa0])
33
+ })
34
+
35
+ it('compares byte-backed string aliases by bytes', () => {
36
+ const peerID = new Uint8Array([0, 255, 65])
37
+
38
+ expect(stringEqual(peerID, bytesToString(peerID))).toBe(true)
39
+ expect(stringEqual(peerID, '')).toBe(false)
40
+ expect(stringEqual(new Uint8Array(0), '')).toBe(true)
41
+ })
42
+
43
+ it('matches byte-backed strings as map keys', () => {
44
+ const raw = new Uint8Array([10, 36, 8, 1, 18, 32, 222, 187])
45
+ const key = bytesToString(raw)
46
+ const m = makeMap<string, string>()
47
+
48
+ mapSet(m, key, 'cached')
49
+
50
+ expect(mapGet(m, bytesToString(raw), '')).toEqual(['cached', true])
51
+ })
52
+
53
+ it('orders byte-backed strings by Go string bytes', () => {
54
+ expect(
55
+ stringCompare(new Uint8Array([0, 255]), new Uint8Array([1])),
56
+ ).toBeLessThan(0)
57
+ expect(
58
+ stringCompare(new Uint8Array([1]), new Uint8Array([0, 255])),
59
+ ).toBeGreaterThan(0)
60
+ expect(
61
+ stringCompare(new Uint8Array([1, 2]), new Uint8Array([1, 2, 0])),
62
+ ).toBeLessThan(0)
63
+ expect(
64
+ stringCompare(
65
+ bytesToString(new Uint8Array([255])),
66
+ new Uint8Array([255]),
67
+ ),
68
+ ).toBe(0)
69
+ })
70
+ })