substrate-lang 0.9.3 → 0.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (208) hide show
  1. package/README.md +1 -1
  2. package/build/compiler/binary.2d43b43d1600@0+0.wasm +0 -0
  3. package/build/compiler/checker.4dd4556dd421@0+0.wasm +0 -0
  4. package/build/compiler/compile.5d8f6407af2a@0+0.wasm +0 -0
  5. package/build/compiler/{core.fc3dab9d1846@0+0.wasm → core.f2defb75e00b@0+0.wasm} +0 -0
  6. package/build/compiler/expander.967ce443d379@0+0.wasm +0 -0
  7. package/build/compiler/fs.01b8aab4a9a8@0+0.wasm +0 -0
  8. package/build/compiler/{leb128.748b1c37277a@0+0.wasm → leb128.15d814b7b4f2@0+0.wasm} +0 -0
  9. package/build/compiler/{link.11b643d35670@0+0.wasm → link.b826ea7c8f17@0+0.wasm} +0 -0
  10. package/build/compiler/{macros.4083601c00db@0+0.wasm → macros.b269e0c42784@0+0.wasm} +0 -0
  11. package/build/compiler/{main.ed62cce43000@0+0.wasm → main.4fc52f204d54@0+0.wasm} +0 -0
  12. package/build/compiler/{ops.b361e858d8e1@0+0.wasm → ops.515b5e05f646@0+0.wasm} +0 -0
  13. package/build/compiler/{path.dcc4712bcc7b@0+0.wasm → path.5a6286472cd4@0+0.wasm} +0 -0
  14. package/build/compiler/program +21 -21
  15. package/build/compiler/prune.406215c3e4f8@0+0.wasm +0 -0
  16. package/build/compiler/reader.694b03770bf0@0+0.wasm +0 -0
  17. package/build/compiler/roots.cefd10e93684@0+0.wasm +0 -0
  18. package/build/compiler/{running.d73f7826cb74@0+0.wasm → running.0d25dbaec018@0+0.wasm} +0 -0
  19. package/build/compiler/serialize.b0d82f3d63d2@0+0.wasm +0 -0
  20. package/build/compiler/{sha256.5fc9d60f8bb2@0+0.wasm → sha256.a6c32b04d799@0+0.wasm} +0 -0
  21. package/build/compiler/substrate.5ee5d0b4d3e7@0+0.wasm +0 -0
  22. package/build/compiler/syntax.32f3e40b61c7@0+0.wasm +0 -0
  23. package/build/compiler/{writer.806bc85aa684@0+0.wasm → writer.00b7802cbe39@0+0.wasm} +0 -0
  24. package/build/sub/{base64.8fba03e1be0a@0+0.wasm → base64.a26bdcf60a2d@0+0.wasm} +0 -0
  25. package/build/sub/build.459c5b9412bd@0+0.wasm +0 -0
  26. package/build/sub/chromium.3d5818f2707d@0+0.wasm +0 -0
  27. package/build/sub/common.1edc613607a0@0+0.wasm +0 -0
  28. package/build/sub/deflate.23f7c4679260@0+0.wasm +0 -0
  29. package/build/sub/doc.0775df5de6fe@0+0.wasm +0 -0
  30. package/build/sub/{doc.566f9861828e@0+0.wasm → doc.ef9965d5d402@0+0.wasm} +0 -0
  31. package/build/sub/env.e5451da6e747@0+0.wasm +0 -0
  32. package/build/sub/events.bf5473ebf220@0+0.wasm +0 -0
  33. package/build/sub/fetch.7790d4943758@0+0.wasm +0 -0
  34. package/build/sub/fetch.96b2d10f025e@0+0.wasm +0 -0
  35. package/build/sub/files.ad0469fdf6fa@0+0.wasm +0 -0
  36. package/build/sub/fs.01b8aab4a9a8@0+0.wasm +0 -0
  37. package/build/sub/git.dc4c0e757ebe@0+0.wasm +0 -0
  38. package/build/sub/grants.c54776c0d7e3@0+0.wasm +0 -0
  39. package/build/sub/gzip.16e372eda1cf@0+0.wasm +0 -0
  40. package/build/sub/hash.660682e4f491@0+0.wasm +0 -0
  41. package/build/sub/{html.20baa1dc7ca6@0+0.wasm → html.a23126eb949a@0+0.wasm} +0 -0
  42. package/build/sub/{html.c1671a102b4d@0+0.wasm → html.e9ed37f34977@0+0.wasm} +0 -0
  43. package/build/sub/{inflate.8899e0933792@0+0.wasm → inflate.59bb61f14001@0+0.wasm} +0 -0
  44. package/build/sub/json.55590d2f518a@0+0.wasm +0 -0
  45. package/build/sub/manifest.ef317480deb0@0+0.wasm +0 -0
  46. package/build/sub/map.f455cca6a42a@0+0.wasm +0 -0
  47. package/build/sub/pack.e02836264f6a@0+0.wasm +0 -0
  48. package/build/sub/{path.dcc4712bcc7b@0+0.wasm → path.5a6286472cd4@0+0.wasm} +0 -0
  49. package/build/sub/path.6891ffea73ca@0+0.wasm +0 -0
  50. package/build/sub/process.7106571fa723@0+0.wasm +0 -0
  51. package/build/sub/program +48 -48
  52. package/build/sub/read.0b93933d62a2@0+0.wasm +0 -0
  53. package/build/sub/{reader.b535e61f99f4@0+0.wasm → reader.694b03770bf0@0+0.wasm} +0 -0
  54. package/build/sub/{root.9b713ec588c1@0+0.wasm → root.f10a4906f460@0+0.wasm} +0 -0
  55. package/build/sub/{roots.6d2942578055@0+0.wasm → roots.cefd10e93684@0+0.wasm} +0 -0
  56. package/build/sub/{sha256.5fc9d60f8bb2@0+0.wasm → sha256.a6c32b04d799@0+0.wasm} +0 -0
  57. package/build/sub/{sha512.b988b9dc6114@0+0.wasm → sha512.c24a792d7891@0+0.wasm} +0 -0
  58. package/build/sub/site.1732b58ec0e8@0+0.wasm +0 -0
  59. package/build/sub/site.ae3913b0b0f4@0+0.wasm +0 -0
  60. package/build/sub/store.a24d7a25daa6@0+0.wasm +0 -0
  61. package/build/sub/stream.126e3bd5d626@0+0.wasm +0 -0
  62. package/build/sub/sub.2e3092140706@0+0.wasm +0 -0
  63. package/build/sub/substrate.5ee5d0b4d3e7@0+0.wasm +0 -0
  64. package/build/sub/{syntax.9857f6784d63@0+0.wasm → syntax.32f3e40b61c7@0+0.wasm} +0 -0
  65. package/build/sub/tar.2a633861e654@0+0.wasm +0 -0
  66. package/build/sub/test.9bd59c73f65e@0+0.wasm +0 -0
  67. package/build/sub/{text.4ab70ac35b5a@0+0.wasm → text.1bc90482bd43@0+0.wasm} +0 -0
  68. package/build/sub/{timer.3809bb17a7a1@0+0.wasm → timer.f35eb62ae446@0+0.wasm} +0 -0
  69. package/build/sub/upgrade.39ee449b00d5@0+0.wasm +0 -0
  70. package/build/sub/{utf8.524c475ecd40@0+0.wasm → utf8.e7216bd054e1@0+0.wasm} +0 -0
  71. package/build/sub/worker.762a9d642af0@0+0.wasm +0 -0
  72. package/build/sub/writer.00b7802cbe39@0+0.wasm +0 -0
  73. package/package.json +1 -1
  74. package/std/archive/tar.sub +44 -44
  75. package/std/browser/chromium.sub +5 -4
  76. package/std/browser/devtools.sub +24 -19
  77. package/std/compress/deflate.sub +10 -12
  78. package/std/compress/gzip.sub +18 -16
  79. package/std/compress/inflate.sub +7 -4
  80. package/std/crypto/password.sub +3 -3
  81. package/std/doc/doc.sub +2 -2
  82. package/std/encoding/json.sub +64 -73
  83. package/std/encoding/wire.sub +15 -15
  84. package/std/http/checks.sub +3 -3
  85. package/std/http/conditional.sub +2 -4
  86. package/std/http/cookie.sub +5 -7
  87. package/std/http/form.sub +9 -12
  88. package/std/http/http.sub +17 -24
  89. package/std/http/multipart.sub +13 -15
  90. package/std/http/route.sub +18 -13
  91. package/std/http/server.sub +21 -23
  92. package/std/http/session.sub +3 -6
  93. package/std/http/sse-client.sub +9 -14
  94. package/std/http/static.sub +5 -5
  95. package/std/http/url.sub +10 -10
  96. package/std/http/websocket.sub +2 -5
  97. package/std/meta/derive.sub +0 -2
  98. package/std/meta/method.sub +41 -0
  99. package/std/meta/type-info.sub +30 -37
  100. package/std/package/files.sub +24 -25
  101. package/std/package/git.sub +26 -33
  102. package/std/package/hash.sub +9 -9
  103. package/std/package/manifest.sub +81 -57
  104. package/std/package/map.sub +5 -9
  105. package/std/package/pack.sub +13 -13
  106. package/std/package/path.sub +1 -4
  107. package/std/package/read.sub +10 -14
  108. package/std/package/site.sub +11 -11
  109. package/std/package/store.sub +16 -12
  110. package/std/package.sub +6 -6
  111. package/std/test/browser.sub +9 -8
  112. package/std/test/build.sub +2 -2
  113. package/std/test/compare.sub +9 -10
  114. package/std/test/page.sub +32 -27
  115. package/std/test/run.sub +9 -8
  116. package/std/test/test.sub +36 -30
  117. package/std/vector/vector.sub +75 -0
  118. package/substrate/VERSION +1 -1
  119. package/substrate/compiler/binary.sub +5 -14
  120. package/substrate/compiler/checker.sub +235 -222
  121. package/substrate/compiler/compile.sub +11 -11
  122. package/substrate/compiler/expander.sub +52 -78
  123. package/substrate/compiler/link.sub +2 -2
  124. package/substrate/compiler/main.sub +9 -9
  125. package/substrate/compiler/ops.sub +1 -1
  126. package/substrate/compiler/prune.sub +12 -17
  127. package/substrate/compiler/reader.sub +4 -4
  128. package/substrate/compiler/roots.sub +11 -10
  129. package/substrate/compiler/running.sub +1 -1
  130. package/substrate/compiler/serialize.sub +57 -50
  131. package/substrate/compiler/substrate.sub +60 -23
  132. package/substrate/compiler/syntax.sub +8 -21
  133. package/substrate/host/errors.mjs +3 -2
  134. package/substrate/host/events.sub +3 -16
  135. package/substrate/host/fs.mjs +5 -4
  136. package/substrate/host/fs.sub +142 -112
  137. package/substrate/host/grants.mjs +1 -1
  138. package/substrate/host/grants.sub +33 -33
  139. package/substrate/host/modules/fake.mjs +1 -1
  140. package/substrate/host/modules/websocket.mjs +4 -4
  141. package/substrate/host/modules/websocket.sub +8 -6
  142. package/substrate/host/node/env.mjs +12 -6
  143. package/substrate/host/node/env.sub +21 -16
  144. package/substrate/host/node/fs.mjs +1 -1
  145. package/substrate/host/node/net.mjs +2 -2
  146. package/substrate/host/node/net.sub +13 -6
  147. package/substrate/host/node/process.mjs +4 -4
  148. package/substrate/host/node/process.sub +28 -28
  149. package/substrate/host/node/signal.mjs +3 -2
  150. package/substrate/host/node/signal.sub +9 -6
  151. package/substrate/host/node/watch.mjs +1 -1
  152. package/substrate/host/node/watch.sub +11 -9
  153. package/substrate/host/stream.sub +2 -0
  154. package/substrate/host/subhost-core.mjs +9 -1
  155. package/substrate/host/web/clipboard.mjs +2 -2
  156. package/substrate/host/web/clipboard.sub +10 -3
  157. package/substrate/host/web/files.mjs +2 -2
  158. package/substrate/host/web/files.sub +6 -2
  159. package/substrate/host/web/fs.mjs +3 -3
  160. package/substrate/host/web/location.mjs +3 -1
  161. package/substrate/host/web/location.sub +8 -4
  162. package/substrate/host/worker-side.mjs +3 -1
  163. package/substrate/host/worker.mjs +6 -5
  164. package/substrate/host/worker.sub +10 -10
  165. package/build/compiler/binary.3823f89ce414@0+0.wasm +0 -0
  166. package/build/compiler/checker.592d37dcbec9@0+0.wasm +0 -0
  167. package/build/compiler/compile.86a2b03b0c9b@0+0.wasm +0 -0
  168. package/build/compiler/expander.689d326e5a1b@0+0.wasm +0 -0
  169. package/build/compiler/fs.563034be70c3@0+0.wasm +0 -0
  170. package/build/compiler/prune.d4a3f9834095@0+0.wasm +0 -0
  171. package/build/compiler/reader.b535e61f99f4@0+0.wasm +0 -0
  172. package/build/compiler/roots.6d2942578055@0+0.wasm +0 -0
  173. package/build/compiler/serialize.b2196de75bc8@0+0.wasm +0 -0
  174. package/build/compiler/substrate.4c780d6dd6d4@0+0.wasm +0 -0
  175. package/build/compiler/syntax.9857f6784d63@0+0.wasm +0 -0
  176. package/build/sub/build.84ac996eda63@0+0.wasm +0 -0
  177. package/build/sub/chromium.e4db7d29897c@0+0.wasm +0 -0
  178. package/build/sub/common.91ddee6b7a67@0+0.wasm +0 -0
  179. package/build/sub/deflate.fc8075e3aed1@0+0.wasm +0 -0
  180. package/build/sub/doc.0b48bbac404b@0+0.wasm +0 -0
  181. package/build/sub/env.f051f8166526@0+0.wasm +0 -0
  182. package/build/sub/events.f952172735e0@0+0.wasm +0 -0
  183. package/build/sub/fetch.097f1cc9502d@0+0.wasm +0 -0
  184. package/build/sub/fetch.5d2f427c995e@0+0.wasm +0 -0
  185. package/build/sub/files.30e55182c5df@0+0.wasm +0 -0
  186. package/build/sub/fs.563034be70c3@0+0.wasm +0 -0
  187. package/build/sub/git.48aefa1644be@0+0.wasm +0 -0
  188. package/build/sub/grants.5bf25700d47c@0+0.wasm +0 -0
  189. package/build/sub/gzip.69588e97c35a@0+0.wasm +0 -0
  190. package/build/sub/hash.3f0d118da63f@0+0.wasm +0 -0
  191. package/build/sub/json.f15a29d99d8d@0+0.wasm +0 -0
  192. package/build/sub/manifest.cf7471880377@0+0.wasm +0 -0
  193. package/build/sub/map.dc516eec27ff@0+0.wasm +0 -0
  194. package/build/sub/pack.55992e8cc09c@0+0.wasm +0 -0
  195. package/build/sub/path.b7a8e1cf3aaa@0+0.wasm +0 -0
  196. package/build/sub/process.aea2c88cb7a0@0+0.wasm +0 -0
  197. package/build/sub/read.cd1e693f4fb4@0+0.wasm +0 -0
  198. package/build/sub/site.7c6d8c7747af@0+0.wasm +0 -0
  199. package/build/sub/site.81548474c323@0+0.wasm +0 -0
  200. package/build/sub/store.d4e845ff24ac@0+0.wasm +0 -0
  201. package/build/sub/stream.4c07247477f7@0+0.wasm +0 -0
  202. package/build/sub/sub.b57e17b6876b@0+0.wasm +0 -0
  203. package/build/sub/substrate.4c780d6dd6d4@0+0.wasm +0 -0
  204. package/build/sub/tar.e482cf873cfc@0+0.wasm +0 -0
  205. package/build/sub/test.0d9c079bb309@0+0.wasm +0 -0
  206. package/build/sub/upgrade.18a5aa0dae89@0+0.wasm +0 -0
  207. package/build/sub/worker.f1190de21b21@0+0.wasm +0 -0
  208. package/build/sub/writer.806bc85aa684@0+0.wasm +0 -0
@@ -8,7 +8,7 @@
8
8
  [atoms (ptr hash-table)] [pairs (ptr hash-table)] [scopes (ptr hash-table)] [table datum])
9
9
 
10
10
  (define (make-serializer) -> (ptr serializer)
11
- (let ([s (cast (ptr serializer) (arena-alloc (current-arena) (sizeof serializer)))])
11
+ (let ([s (new (current-arena) serializer)])
12
12
  (set! (-> s out) (make-buffer))
13
13
  (set! (-> s count) 0)
14
14
  (set! (-> s shared) (make-table))
@@ -20,11 +20,11 @@
20
20
  s))
21
21
 
22
22
  (define (scope-index! [s (ptr serializer)] [sc u32]) -> u32
23
- (let ([known (hash-ref (-> s scopes) (+ (cast u64 sc) 1))])
23
+ (let ([known (hash-find (-> s scopes) (+ (cast u64 sc) 1))])
24
24
  (if (!= known 0)
25
- (- known 1)
25
+ (@ known)
26
26
  (let ([i (-> (-> s scopes) count)])
27
- (hash-set! (-> s scopes) (+ (cast u64 sc) 1) (+ i 1))
27
+ (hash-set! (-> s scopes) (+ (cast u64 sc) 1) i)
28
28
  (set! (-> s table) (cons (make-integer sc) (-> s table)))
29
29
  i))))
30
30
 
@@ -33,16 +33,23 @@
33
33
  (define (added! [s (ptr serializer)] [t (ptr hash-table)] [key u64]) -> u32
34
34
  (let ([i (-> s count)])
35
35
  (+= (-> s count) 1)
36
- (hash-set! t key (+ i 1))
36
+ (hash-set! t key i)
37
37
  i))
38
38
 
39
- (define (shared-index [s (ptr serializer)] [key datum]) -> u32
40
- (let ([i (datum-get (-> s shared) key)]) (if (== i 0) 0 (+ (cast u32 (integer-value i)) 1))))
39
+ (struct shared-entry [key datum] [index u32] [next (ptr shared-entry)])
40
+
41
+ (define (shared-find [s (ptr serializer)] [key datum]) -> (ptr u32)
42
+ (let ([e (cast (ptr shared-entry) (hash-ref (-> s shared) (datum-hash key)))])
43
+ (while (!= e 0)
44
+ (when (equal? (-> e key) key) (return (& (-> e index))))
45
+ (set! e (-> e next)))
46
+ 0))
41
47
 
42
48
  (define (shared-added! [s (ptr serializer)] [key datum]) -> u32
43
- (let ([i (-> s count)])
49
+ (let* ([t (-> s shared)] [h (datum-hash key)] [i (-> s count)]
50
+ [e (new (-> t arena) (shared-entry #:key key #:index i #:next (cast (ptr shared-entry) (hash-ref t h))))])
51
+ (hash-set! t h (cast u32 e))
44
52
  (+= (-> s count) 1)
45
- (datum-put! (-> s shared) key (make-integer i))
46
53
  i))
47
54
 
48
55
  (define (bytes! [p (ptr buffer)] [b (slice u8)])
@@ -52,70 +59,70 @@
52
59
  (define (small [n i64]) -> datum (make-integer n))
53
60
 
54
61
  (define (serialize! [s (ptr serializer)] [d datum]) -> u32
55
- (let ([p (& (-> s out))] [i u32 0])
62
+ (let ([p (& (-> s out))] [known (ptr u32) 0])
56
63
  (cond
57
64
  [(== d '#f)
58
- (set! i (shared-index s `(0)))
59
- (if (!= i 0) (- i 1) (begin (buffer-add-byte! p 0) (shared-added! s `(0))))]
65
+ (set! known (shared-find s `(0)))
66
+ (if (!= known 0) (@ known) (begin (buffer-add-byte! p 0) (shared-added! s `(0))))]
60
67
  [(fixnum? d)
61
68
  (let ([key (+ (cast u64 (integer-value d)) 1099511627776)])
62
- (set! i (hash-ref (-> s fixnums) key))
63
- (if (!= i 0)
64
- (- i 1)
69
+ (set! known (hash-find (-> s fixnums) key))
70
+ (if (!= known 0)
71
+ (@ known)
65
72
  (begin (buffer-add-byte! p 1) (write-sleb p (integer-value d)) (added! s (-> s fixnums) key))))]
66
73
  [(integer? d)
67
74
  (let* ([negative (integer-negative? d)] [v (integer-value d)]
68
75
  [magnitude (if negative (- 0 v) v)]
69
76
  [key `(10 ,(small negative) ,(make-unsigned-integer (cast u64 magnitude)))])
70
- (set! i (shared-index s key))
71
- (if (!= i 0)
72
- (- i 1)
77
+ (set! known (shared-find s key))
78
+ (if (!= known 0)
79
+ (@ known)
73
80
  (begin (buffer-add-byte! p 10)
74
81
  (buffer-add-byte! p negative)
75
82
  (for ([k u32 0]) (< k 8) (+= k 1)
76
83
  (buffer-add-byte! p (cast i32 (bit-and (>> (cast u64 magnitude) (* 8 k)) 255))))
77
84
  (shared-added! s key))))]
78
85
  [(== d (boolean #t))
79
- (set! i (shared-index s `(2)))
80
- (if (!= i 0) (- i 1) (begin (buffer-add-byte! p 2) (shared-added! s `(2))))]
86
+ (set! known (shared-find s `(2)))
87
+ (if (!= known 0) (@ known) (begin (buffer-add-byte! p 2) (shared-added! s `(2))))]
81
88
  [(null? d)
82
- (set! i (shared-index s `(3)))
83
- (if (!= i 0) (- i 1) (begin (buffer-add-byte! p 3) (shared-added! s `(3))))]
89
+ (set! known (shared-find s `(3)))
90
+ (if (!= known 0) (@ known) (begin (buffer-add-byte! p 3) (shared-added! s `(3))))]
84
91
  [(char? d)
85
92
  (let ([key `(4 ,d)])
86
- (set! i (shared-index s key))
87
- (if (!= i 0)
88
- (- i 1)
93
+ (set! known (shared-find s key))
94
+ (if (!= known 0)
95
+ (@ known)
89
96
  (begin (buffer-add-byte! p 4) (write-uleb p (char->integer d)) (shared-added! s key))))]
90
97
  [(pair? d) (serialize-list! s d)]
91
98
  [(symbol? d)
92
- (set! i (hash-ref (-> s atoms) (cast u64 d)))
93
- (if (!= i 0)
94
- (- i 1)
99
+ (set! known (hash-find (-> s atoms) (cast u64 d)))
100
+ (if (!= known 0)
101
+ (@ known)
95
102
  (begin (buffer-add-byte! p 6) (bytes! p (cast (slice u8) (symbol->string d))) (added! s (-> s atoms) (cast u64 d))))]
96
103
  [(string? d)
97
104
  (let ([key `(7 ,d)])
98
- (set! i (shared-index s key))
99
- (if (!= i 0)
100
- (- i 1)
105
+ (set! known (shared-find s key))
106
+ (if (!= known 0)
107
+ (@ known)
101
108
  (begin (buffer-add-byte! p 7) (bytes! p (cast (slice u8) (datum->string d))) (shared-added! s key))))]
102
109
  [(bytes? d)
103
110
  (let ([key `(14 ,d)])
104
- (set! i (shared-index s key))
105
- (if (!= i 0)
106
- (- i 1)
111
+ (set! known (shared-find s key))
112
+ (if (!= known 0)
113
+ (@ known)
107
114
  (begin (buffer-add-byte! p 14) (bytes! p (datum->bytes d)) (shared-added! s key))))]
108
115
  [(keyword? d)
109
- (set! i (hash-ref (-> s atoms) (cast u64 d)))
110
- (if (!= i 0)
111
- (- i 1)
116
+ (set! known (hash-find (-> s atoms) (cast u64 d)))
117
+ (if (!= known 0)
118
+ (@ known)
112
119
  (begin (buffer-add-byte! p 13) (bytes! p (cast (slice u8) (keyword->string d))) (added! s (-> s atoms) (cast u64 d))))]
113
120
  [(syntax? d) (serialize-syntax! s d)]
114
121
  [(flonum? d)
115
122
  (let* ([bits (f64-bits (flonum-value d))] [key `(11 ,(make-integer bits))])
116
- (set! i (shared-index s key))
117
- (if (!= i 0)
118
- (- i 1)
123
+ (set! known (shared-find s key))
124
+ (if (!= known 0)
125
+ (@ known)
119
126
  (begin (buffer-add-byte! p 11)
120
127
  (for ([k u32 0]) (< k 8) (+= k 1)
121
128
  (buffer-add-byte! p (cast i32 (bit-and (>> (cast u64 bits) (* 8 k)) 255))))
@@ -123,7 +130,7 @@
123
130
  [else (raise-compile-error 0 (format-message "internal: serialize: cannot quote ~s" (cons d nil))) 0])))
124
131
 
125
132
  (define (serialize-list! [s (ptr serializer)] [d datum]) -> u32
126
- (let ([cars nil] [l d] [b u32 0] [key u64 0] [i u32 0] [p (& (-> s out))])
133
+ (let ([cars nil] [l d] [b u32 0] [key u64 0] [known (ptr u32) 0] [p (& (-> s out))])
127
134
  (while (pair? l)
128
135
  (set! cars (cons (make-integer (serialize! s (car l))) cars))
129
136
  (set! l (cdr l)))
@@ -131,9 +138,9 @@
131
138
  (while (pair? cars)
132
139
  (let ([a (cast u32 (integer-value (car cars)))])
133
140
  (set! key (bit-or (<< (+ (cast u64 a) 1) 32) b))
134
- (set! i (hash-ref (-> s pairs) key))
135
- (set! b (if (!= i 0)
136
- (- i 1)
141
+ (set! known (hash-find (-> s pairs) key))
142
+ (set! b (if (!= known 0)
143
+ (@ known)
137
144
  (begin (buffer-add-byte! p 5) (write-uleb p a) (write-uleb p b) (added! s (-> s pairs) key)))))
138
145
  (set! cars (cdr cars)))
139
146
  b))
@@ -144,10 +151,10 @@
144
151
  [l (serialize-srcloc! s (syntax-srcloc d))]
145
152
  [r (serialize! s (syntax-props d))]
146
153
  [key `(8 ,(small e) ,(small sc) ,(small l) ,(small r))]
147
- [i (shared-index s key)]
154
+ [known (shared-find s key)]
148
155
  [p (& (-> s out))])
149
- (if (!= i 0)
150
- (- i 1)
156
+ (if (!= known 0)
157
+ (@ known)
151
158
  (begin (buffer-add-byte! p 8) (write-uleb p e) (write-uleb p sc) (write-uleb p l) (write-uleb p r)
152
159
  (shared-added! s key)))))
153
160
 
@@ -162,10 +169,10 @@
162
169
  (serialize! s 0)
163
170
  (let* ([src (serialize! s (-> l source))]
164
171
  [key `(9 ,(small src) ,(small (-> l line)) ,(small (-> l col)) ,(small (-> l pos)) ,(small (-> l span)))]
165
- [i (shared-index s key)]
172
+ [known (shared-find s key)]
166
173
  [p (& (-> s out))])
167
- (if (!= i 0)
168
- (- i 1)
174
+ (if (!= known 0)
175
+ (@ known)
169
176
  (begin (buffer-add-byte! p 9)
170
177
  (write-uleb p src)
171
178
  (write-sleb p (-> l line))
@@ -1,6 +1,6 @@
1
1
  ;; Substrate in one module: the language, its runtime and its library.
2
2
 
3
- (provide define struct union variant match exception throw try lambda inst typedef const let let* set!
3
+ (provide define struct union variant enum match exception throw try lambda typedef const let let* set!
4
4
  if return values import supply
5
5
  #%datum #%top-interaction #%module-begin
6
6
  when unless cond case while for break continue rethrow and or not cast sizeof offsetof array-of slice @ & ->
@@ -12,12 +12,15 @@
12
12
  printf print-bytes
13
13
  output-to! test expect expect-equal test-failed test-skipped
14
14
  buffer-add-entries! entry-strings
15
+ error error-fail! error-text error-free! host-failed!
16
+ error-missing error-unreachable error-refused error-timeout error-invalid error-aborted error-denied
17
+ error-in-use error-other error-not-granted error-exists
15
18
  sqrt fabs floor ceil trunc nearbyint copysign sqrtf fabsf floorf ceilf truncf nearbyintf copysignf
16
19
  malloc calloc realloc free try-malloc try-calloc try-realloc memcpy memset memcmp
17
- arena make-arena arena-alloc arena-start! arena-free new
20
+ arena make-arena arena-alloc arena-start! arena-free new copy
18
21
  buffer make-buffer buffer-add! buffer-add-byte! buffer-add-string! buffer-add-utf-8! buffer-add-u32! buffer-add-f32!
19
22
  buffer-bytes buffer-string
20
- buffer-reserve buffer-free! buffer-trim! hash-bytes hash-table hash-ref hash-set! hash-clear! hash-free!
23
+ buffer-reserve buffer-free! buffer-trim! hash-bytes hash-table hash-find hash-ref hash-set! hash-clear! hash-free!
21
24
  string-copy
22
25
  f64-bits bits-f64 f32-bits digit-value digits? digits-integer read-decimal decimal-flonum shortest-digits
23
26
  write-digits write-flonum write-string)
@@ -25,9 +28,9 @@
25
28
  ;; ---- the forms ----
26
29
 
27
30
  (define-syntax forms (quote-syntax (#%form forms)))
28
- (forms #%module-begin #%top-interaction define struct union variant match exception
29
- throw try lambda inst substrate-struct-check typedef const let let* #%datum when unless cond case array-of slice
30
- while for cast sizeof offsetof -> & set! @ break continue rethrow new printf test expect expect-equal
31
+ (forms #%module-begin #%top-interaction define struct union variant enum match exception
32
+ throw try lambda substrate-struct-check typedef const let let* #%datum when unless cond case array-of slice
33
+ while for cast sizeof offsetof -> & set! @ break continue rethrow new copy printf test expect expect-equal
31
34
  + - * / % == != < <= > >= and or not bit-and bit-or bit-xor bit-not << >>
32
35
  += -= *= /= %= <<= >>= bit-and= bit-or= bit-xor=)
33
36
 
@@ -44,6 +47,7 @@
44
47
  (constant (const NAME TYPE VALUE))
45
48
  (type (struct NAME FIELD ...))
46
49
  (type (variant NAME CASE ...))
50
+ (type (enum NAME CASE ...))
47
51
  (type (typedef NAME TYPE))
48
52
  (exception (exception NAME TYPE ...))
49
53
  (macro (define-syntax NAME _))
@@ -85,10 +89,45 @@
85
89
 
86
90
  (func (reset-stack!) (set! sp (i32.add stack-base 4194304)))
87
91
 
92
+ ;; ---- errors ----
93
+ ;; A fallible function returns #t, or #f with an error as its last argument. Callers can pass a null pointer (0) when
94
+ ;; they do not need the error. They can do the same for an id the function creates. Error codes are defined here.
95
+
96
+ (const error-missing i32 1)
97
+ (const error-unreachable i32 2)
98
+ (const error-refused i32 3)
99
+ (const error-timeout i32 4)
100
+ (const error-invalid i32 5)
101
+ (const error-aborted i32 6)
102
+ (const error-denied i32 7)
103
+ (const error-in-use i32 8)
104
+ (const error-other i32 9)
105
+ (const error-not-granted i32 10)
106
+ (const error-exists i32 11)
107
+
108
+ (struct error [code i32] [message buffer])
109
+
110
+ (define (error-fail! [e (ptr error)] [code i32] [why string]) -> bool
111
+ (when (!= e 0)
112
+ (set! (-> e code) code)
113
+ (set! (-> e message length) 0)
114
+ (buffer-add-string! (& (-> e message)) why))
115
+ #f)
116
+
117
+ (define (error-text [e (ptr error)]) -> string (buffer-string (& (-> e message))))
118
+
119
+ (define (error-free! [e (ptr error)]) (buffer-free! (& (-> e message))))
120
+
121
+ (define (host-failed! [why (ptr string)] [e (ptr error)]) -> bool
122
+ (error-fail! e (failure_code) (@ why))
123
+ (free (-> why bytes))
124
+ #f)
125
+
88
126
  ;; ---- the host ----
89
127
  ;; Every program may call these host functions without a grant. A call that gives a string or bytes gives them in a
90
128
  ;; block from malloc for the caller to free; its pointer is 0 when there are none. A call that can fail stores the
91
- ;; reason at err as such a string, unless err is 0. Lists are slices of strings.
129
+ ;; reason at err as such a string, unless err is 0. failure_code then gives the failure's code. Lists are slices of
130
+ ;; strings.
92
131
 
93
132
  (import write "host" "write" (i32 i32 i32 -> i32))
94
133
  (import trap "host" "trap" (i32 i32 ->))
@@ -100,6 +139,7 @@
100
139
  (import program_modules "host" "program_modules" (i32 -> i32))
101
140
  (import module_bytes "host" "module_bytes" (i32 i32 i32 -> i32))
102
141
  (import compiled_file "host" "compiled_file" (i32 i32 i32 -> i32))
142
+ (import failure_code "host" "failure_code" (-> i32))
103
143
 
104
144
  (define (host-write [fd i32] [b (slice u8)]) #:inline -> i32 (write fd (cast i32 (-> b items)) (cast i32 (-> b length))))
105
145
  (define (host-trap [s string]) #:inline (trap (cast i32 (-> s bytes)) (cast i32 (-> s length))))
@@ -127,15 +167,15 @@
127
167
  ;; is a worker, in which case its parent gets the reason when the worker ends.
128
168
  (define (host-exit [code i32] [reason string]) #:inline
129
169
  (exit code (cast i32 (-> reason bytes)) (cast i32 (-> reason length))))
130
- (define (host-instantiate [name string] [code (slice u8)] [imports (slice string)] [compile-time bool] [err (ptr string)])
131
- -> i32
132
- (let ([b (make-buffer)] [r 0])
170
+ (define (host-instantiate [name string] [code (slice u8)] [imports (slice string)] [compile-time bool]
171
+ [err (ptr error)]) -> bool
172
+ (let ([b (make-buffer)] [r 0] [why string])
133
173
  (buffer-add-entries! (& b) imports)
134
174
  (set! r (instantiate (cast i32 (-> name bytes)) (cast i32 (-> name length)) (cast i32 (-> code items))
135
175
  (cast i32 (-> code length)) (cast i32 (-> b bytes)) (cast i32 (-> b length)) compile-time
136
- (cast i32 err)))
176
+ (cast i32 (& why))))
137
177
  (buffer-free! (& b))
138
- r))
178
+ (or (== r 0) (host-failed! (& why) err))))
139
179
  (define (host-export-index [instance string] [field string]) #:inline -> i32
140
180
  (export_index (cast i32 (-> instance bytes)) (cast i32 (-> instance length)) (cast i32 (-> field bytes))
141
181
  (cast i32 (-> field length))))
@@ -183,10 +223,7 @@
183
223
 
184
224
  ;; ---- strings and slices ----
185
225
 
186
- (define (string-copy [s string]) -> string
187
- (let ([p (cast (ptr u8) (malloc (-> s length)))])
188
- (memcpy p (-> s bytes) (-> s length))
189
- (cast string (slice p (-> s length)))))
226
+ (define (string-copy [s string]) -> string (copy 0 s))
190
227
 
191
228
  ;; The checker's code calls these to compare strings by their bytes, and to trap on an index or a part out of range.
192
229
 
@@ -588,15 +625,18 @@
588
625
 
589
626
  (struct hash-table [keys (ptr u64)] [values (ptr u32)] [count u32] [capacity u32] [shift u32] [arena (ptr arena)])
590
627
 
591
- (define (hash-ref [t (ptr hash-table)] [key u64]) #:inline -> u32
628
+ (define (hash-find [t (ptr hash-table)] [key u64]) #:inline -> (ptr u32)
592
629
  (if (== (-> t capacity) 0)
593
630
  0
594
631
  (let* ([keys (-> t keys)] [mask (- (-> t capacity) 1)] [i (cast u32 (>> (* key 11400714819323198485) (-> t shift)))])
595
632
  (while (!= (@ keys i) 0)
596
- (when (== (@ keys i) key) (return (@ (-> t values) i)))
633
+ (when (== (@ keys i) key) (return (+ (-> t values) i)))
597
634
  (set! i (bit-and (+ i 1) mask)))
598
635
  0)))
599
636
 
637
+ (define (hash-ref [t (ptr hash-table)] [key u64]) #:inline -> u32
638
+ (let ([p (hash-find t key)]) (if (== p 0) 0 (@ p))))
639
+
600
640
  (define (hash-set! [t (ptr hash-table)] [key u64] [value u32])
601
641
  (when (>= (* 2 (+ (-> t count) 1)) (-> t capacity)) (hash-grow t))
602
642
  (let* ([keys (-> t keys)] [mask (- (-> t capacity) 1)] [i (cast u32 (>> (* key 11400714819323198485) (-> t shift)))])
@@ -977,7 +1017,7 @@
977
1017
  (+ ten-powers (* 2 (+ q 348))))
978
1018
 
979
1019
  (define (make-ten-powers) -> (ptr u64)
980
- (let* ([t (cast (ptr u64) (malloc 11136))] [limbs (array u64 44)] [x (slice limbs)])
1020
+ (let* ([t (-> (new 0 u64 1392) items)] [limbs (array u64 44)] [x (slice limbs)])
981
1021
  (memset limbs 0 352)
982
1022
  (set! (@ x 0) 1)
983
1023
  (for ([q 0]) (<= q 347) (+= q 1)
@@ -1020,10 +1060,7 @@
1020
1060
  [else (bit-or (<< (cast u64 (+ e2 1075)) 52) (- mant 4503599627370496))])))
1021
1061
 
1022
1062
  ;; A number is 32-bit limbs, least significant first, each in a u64.
1023
- (define (big-new [a (ptr arena)] [len u32]) -> (slice u64)
1024
- (let ([x (cast (ptr u64) (arena-alloc a (* 8 len)))])
1025
- (memset x 0 (* 8 len))
1026
- (slice x len)))
1063
+ (define (big-new [a (ptr arena)] [len u32]) -> (slice u64) (new a u64 len))
1027
1064
 
1028
1065
  (define (big-mul-add! [x (slice u64)] [k u64] [c u64])
1029
1066
  (for ([i u32 0]) (< i (-> x length)) (+= i 1)
@@ -90,7 +90,7 @@
90
90
  (define (in-run-arena?) -> bool (== current (& run-arena)))
91
91
 
92
92
  (define (begin-module-arena)
93
- (let ([m (cast (ptr module-arena) (malloc (sizeof module-arena)))])
93
+ (let ([m (new 0 module-arena)])
94
94
  (set! (-> m arena) (make-arena))
95
95
  (set! (-> m outer) innermost)
96
96
  (set! innermost m)
@@ -302,7 +302,7 @@
302
302
 
303
303
  ;; ---- tables in an arena ----
304
304
  (define (make-table) -> (ptr hash-table)
305
- (let ([t (cast (ptr hash-table) (memset (arena-alloc current (sizeof hash-table)) 0 (sizeof hash-table)))])
305
+ (let ([t (new current hash-table)])
306
306
  (set! (-> t arena) current)
307
307
  t))
308
308
 
@@ -322,7 +322,7 @@
322
322
  (set! (-> e value) value)
323
323
  (return))
324
324
  (set! e (-> e next)))
325
- (set! e (cast (ptr entry) (arena-alloc (-> t arena) (sizeof entry))))
325
+ (set! e (new (-> t arena) entry))
326
326
  (set! (-> e key) key)
327
327
  (set! (-> e value) value)
328
328
  (set! (-> e next) first)
@@ -341,10 +341,7 @@
341
341
  (define symbols hash-table)
342
342
  (define keywords hash-table)
343
343
 
344
- (define (kept-text [s string]) -> string
345
- (let ([p (cast (ptr u8) (arena-alloc (& run-arena) (-> s length)))])
346
- (memcpy p (-> s bytes) (-> s length))
347
- (cast string (slice p (-> s length)))))
344
+ (define (kept-text [s string]) -> string (copy (& run-arena) s))
348
345
 
349
346
  (define (held-text [s string]) -> string
350
347
  (let ([p (held-bytes (-> s length))])
@@ -519,11 +516,7 @@
519
516
  ;; ---- changes to scopes ----
520
517
 
521
518
  (define (new-change [sc u32] [kind u32] [next (ptr change)]) -> (ptr change)
522
- (let ([c (cast (ptr change) (arena-alloc current (sizeof change)))])
523
- (set! (-> c scope) sc)
524
- (set! (-> c kind) kind)
525
- (set! (-> c next) next)
526
- c))
519
+ (new current (change #:scope sc #:kind kind #:next next)))
527
520
 
528
521
  (define (changes-add [cs (ptr change)] [sc u32] [kind u32]) -> (ptr change)
529
522
  (cond [(== cs 0) (new-change sc kind 0)]
@@ -600,13 +593,7 @@
600
593
  (make-cell (syntax e scopes loc props 0)))
601
594
 
602
595
  (define (make-srcloc [source datum] [line u32] [col u32] [pos u32] [span u32]) -> (ptr srcloc)
603
- (let ([l (cast (ptr srcloc) (arena-alloc current (sizeof srcloc)))])
604
- (set! (-> l source) source)
605
- (set! (-> l line) line)
606
- (set! (-> l col) col)
607
- (set! (-> l pos) pos)
608
- (set! (-> l span) span)
609
- l))
596
+ (new current (srcloc #:source source #:line line #:col col #:pos pos #:span span)))
610
597
 
611
598
  (define (syntax-e [s datum]) #:copied -> datum
612
599
  (match (cell-of s)
@@ -730,7 +717,7 @@
730
717
  (define (keep-srcloc [l (ptr srcloc)]) -> (ptr srcloc)
731
718
  (if (== l 0)
732
719
  0
733
- (let ([kept (cast (ptr srcloc) (arena-alloc (& run-arena) (sizeof srcloc)))])
720
+ (let ([kept (new (& run-arena) srcloc)])
734
721
  (set! (@ kept) (@ l))
735
722
  kept)))
736
723
 
@@ -1098,7 +1085,7 @@
1098
1085
  (define (deserialize [bytes (ptr u8)] [n u32]) -> (ptr datum)
1099
1086
  (set! in-bytes bytes)
1100
1087
  (set! in-at 0)
1101
- (let* ([count (cast u32 (in-uleb))] [objs (cast (ptr u32) (arena-alloc current (* 4 (+ count 1))))])
1088
+ (let* ([count (cast u32 (in-uleb))] [objs (-> (new current u32 (+ count 1)) items)])
1102
1089
  (for ([i u32 0]) (< i count) (+= i 1) (set! (@ objs i) (in-entry objs)))
1103
1090
  (cast (ptr datum) objs)))
1104
1091
 
@@ -1,7 +1,7 @@
1
- // The error codes of failed events (events.sub), and errorOf, which gives a JavaScript error its code.
1
+ // The error codes (compiler/substrate.sub), and errorOf, which gives a JavaScript error its code.
2
2
  export const errors = {
3
3
  missing: 1, unreachable: 2, refused: 3, timeout: 4, invalid: 5, aborted: 6, denied: 7, inUse: 8, other: 9,
4
- notGranted: 10,
4
+ notGranted: 10, exists: 11,
5
5
  };
6
6
 
7
7
  const unreachable = new Set(['ENOTFOUND', 'EAI_AGAIN', 'EHOSTUNREACH', 'ENETUNREACH']);
@@ -13,6 +13,7 @@ export function errorOf(e) {
13
13
  if (e.name === 'NotAllowedError' || e.name === 'SecurityError') return errors.denied;
14
14
  if (e.code === 'ENOENT' || e.code === 'ENOTDIR') return errors.missing;
15
15
  if (e.code === 'EACCES' || e.code === 'EPERM') return errors.denied;
16
+ if (e.code === 'EEXIST') return errors.exists;
16
17
  if (e.code === 'ECONNREFUSED') return errors.refused;
17
18
  if (e.code === 'EADDRINUSE') return errors.inUse;
18
19
  if (e.code === 'ECONNRESET' || e.code === 'EPIPE') return errors.aborted;
@@ -1,27 +1,14 @@
1
1
  ;; Events from the host. events-take gives the current event's bytes as host calls give them, events-take-text its
2
2
  ;; text and events-take-strings its list; event-handler! sets the handler for a source's untagged events, and a tagged
3
- ;; event goes to its tag's handler (compiler/substrate.sub). A failed event's value is one of the error codes here,
4
- ;; and its text is the reason.
3
+ ;; event goes to its tag's handler (compiler/substrate.sub). A failed event's value is one of the error codes
4
+ ;; (compiler/substrate.sub), and its text is the reason.
5
5
  ;; Sources: dom 1, gpu 2, worker 3, audio 4, timer 5, fetch 6, websocket 7, stream 8, net 9, process 10, storage 11,
6
6
  ;; location 12, clipboard 13, files 14.
7
7
 
8
- (provide events-take events-take! events-take-text events-take-strings event-handler!
9
- error-missing error-unreachable error-refused error-timeout error-invalid error-aborted error-denied
10
- error-in-use error-other error-not-granted)
8
+ (provide events-take events-take! events-take-text events-take-strings event-handler!)
11
9
 
12
10
  (import take "events" "take" (i32 -> i32))
13
11
 
14
- (const error-missing i32 1)
15
- (const error-unreachable i32 2)
16
- (const error-refused i32 3)
17
- (const error-timeout i32 4)
18
- (const error-invalid i32 5)
19
- (const error-aborted i32 6)
20
- (const error-denied i32 7)
21
- (const error-in-use i32 8)
22
- (const error-other i32 9)
23
- (const error-not-granted i32 10)
24
-
25
12
  (define defaults (array handler 64))
26
13
 
27
14
  (define (by-source [source u32] [kind u32] [id u32] [tag (ptr void)] [value i32])
@@ -1,5 +1,6 @@
1
1
  // The host module "fs" (fs.sub), over the files that node/fs.mjs or web/fs.mjs gives.
2
2
  import { joined } from './entries.mjs';
3
+ import { errors, errorOf } from './errors.mjs';
3
4
 
4
5
  const utf8 = new TextEncoder();
5
6
 
@@ -22,7 +23,7 @@ export function fsModule(files) {
22
23
  return f();
23
24
  } catch (e) {
24
25
  if (e instanceof WebAssembly.RuntimeError) throw e;
25
- caller.fail(err, `${path}: ${e.message}`);
26
+ caller.fail(err, `${path}: ${e.message}`, errorOf(e));
26
27
  return failed;
27
28
  }
28
29
  };
@@ -31,7 +32,7 @@ export function fsModule(files) {
31
32
  const using = (h, err, f, failed = -1) => {
32
33
  const open = handles.get(h);
33
34
  if (open) return attempt(open.path, err, () => f(open.file), failed);
34
- caller.fail(err, `file ${h}: Bad file descriptor`);
35
+ caller.fail(err, `file ${h}: Bad file descriptor`, errors.invalid);
35
36
  return failed;
36
37
  };
37
38
  const bytesAt = (ptr, len) => caller.memory().subarray(caller.u(ptr), caller.u(ptr) + len);
@@ -81,7 +82,7 @@ export function fsModule(files) {
81
82
  file_stream(h, write, start, tag, err) {
82
83
  const open = handles.get(h);
83
84
  if (!open) {
84
- caller.fail(err, `file ${h}: Bad file descriptor`);
85
+ caller.fail(err, `file ${h}: Bad file descriptor`, errors.invalid);
85
86
  return 0;
86
87
  }
87
88
  handles.delete(h);
@@ -90,7 +91,7 @@ export function fsModule(files) {
90
91
  } catch (e) {
91
92
  if (e instanceof WebAssembly.RuntimeError) throw e;
92
93
  attempt(open.path, 0, () => open.file.close());
93
- caller.fail(err, `${open.path}: ${e.message}`);
94
+ caller.fail(err, `${open.path}: ${e.message}`, errorOf(e));
94
95
  return 0;
95
96
  }
96
97
  },