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
@@ -27,11 +27,12 @@
27
27
  (define socket-head event-head)
28
28
 
29
29
  (define (relay)
30
- (let ([why string])
30
+ (let ([why error] [id u32 0])
31
31
  (event-handler! worker-source from-parent)
32
32
  (set! (-> socket-head handle) from-socket)
33
- (set! socket (websocket-connect (@ (host-args) 0) 0 (cast (ptr void) (& socket-head)) (& why)))
34
- (when (== socket 0) (host-exit 1 why))))
33
+ (unless (websocket-connect (@ (host-args) 0) 0 (cast (ptr void) (& socket-head)) (& id) (& why))
34
+ (host-exit 1 (error-text (& why))))
35
+ (set! socket id)))
35
36
 
36
37
  (define (from-parent [source u32] [kind u32] [id u32] [tag (ptr void)] [value i32])
37
38
  (when (and (== kind worker-message) (== id 0))
@@ -55,7 +56,7 @@
55
56
  ;; ---- the connection ----
56
57
 
57
58
  (define (devtools-connect [d (ptr devtools)] [address string] [handler (fn ((ptr devtools) string (ptr json-value) string))]
58
- [state (ptr void)] [err (ptr string)]) -> bool
59
+ [state (ptr void)] [err (ptr error)]) -> bool
59
60
  (let ([text string] [deadline (+ (clock-monotonic) patience)])
60
61
  (set! (-> d head handle) relay-heard)
61
62
  (set! (-> d next) 0)
@@ -65,11 +66,13 @@
65
66
  (set! (-> d awaited) (make-buffer))
66
67
  (set! (-> d kept) (make-buffer))
67
68
  (set! (-> d why) "")
68
- (set! (-> d relay) (worker-start relay (cast (slice u8) address) 0 (cast (ptr void) (& (-> d head))) err))
69
- (when (== (-> d relay) 0) (return #f))
69
+ (unless (worker-start relay (cast (slice u8) address) 0 (cast (ptr void) (& (-> d head))) (& (-> d relay)) err)
70
+ (return #f))
70
71
  (while #t
71
72
  (unless (next! d deadline (& text))
72
- (set! (@ err) (if (> (-> d why length) 0) (-> d why) "Chromium did not take a DevTools connection within 30 s"))
73
+ (if (> (-> d why length) 0)
74
+ (error-fail! err error-other (-> d why))
75
+ (error-fail! err error-timeout "Chromium did not take a DevTools connection within 30 s"))
73
76
  (devtools-close d)
74
77
  (return #f))
75
78
  (let ([open (== text "open")])
@@ -137,49 +140,51 @@
137
140
  (-> d next)))
138
141
 
139
142
  (define (devtools-call [d (ptr devtools)] [a (ptr arena)] [method string] [parameters string] [session string]
140
- [result (ptr (ptr json-value))] [err (ptr string)]) -> bool
143
+ [result (ptr (ptr json-value))] [err (ptr error)]) -> bool
141
144
  (let ([id (devtools-send d method parameters session)] [deadline (+ (clock-monotonic) patience)] [text string]
142
145
  [ok #f] [done #f])
143
146
  (buffer-add-u32! (& (-> d awaited)) id)
144
147
  (while (not done)
145
148
  (cond [(or (taken! d id (& text)) (next! d deadline (& text)))
146
- (let ([e (make-arena)] [je json-error] [m (ptr json-value) 0] [rid i64 0])
147
- (set! m (json-parse (& e) text (& je)))
149
+ (let ([e (make-arena)] [m (ptr json-value) 0] [rid i64 0])
150
+ (json-parse (& e) text (& m) 0)
148
151
  (free (-> text bytes))
149
152
  (cond [(== m 0) (begin)]
150
153
  [(json-as-i64 (json-get m "id") (& rid))
151
154
  (cond [(== (cast u32 rid) id)
152
155
  (set! done #t)
153
- (let ([error (json-get m "error")] [r (json-get m "result")] [why string])
154
- (if (== error 0)
156
+ (let ([refusal (json-get m "error")] [r (json-get m "result")] [why string])
157
+ (if (== refusal 0)
155
158
  (begin
156
159
  (set! (@ result) (if (== r 0) 0 (json-copy a r)))
157
160
  (set! ok #t))
158
- (let ([b (make-buffer)] [message (json-get error "message")])
161
+ (let ([b (make-buffer)] [message (json-get refusal "message")])
159
162
  (json-as-string message (& why))
160
163
  (buffer-add-string! (& b) method)
161
164
  (buffer-add-string! (& b) ": ")
162
165
  (buffer-add-string! (& b) why)
163
- (set! (@ err) (buffer-string (& b))))))]
166
+ (error-fail! err error-other (buffer-string (& b)))
167
+ (buffer-free! (& b)))))]
164
168
  [(awaited? d (cast u32 rid)) (kept! d (cast u32 rid) m)]
165
169
  [else (begin)])]
166
170
  [else (heard! d m)])
167
171
  (arena-free (& e)))]
168
172
  [else
169
173
  (set! done #t)
170
- (let ([b (make-buffer)])
174
+ (let ([b (make-buffer)] [late (== (-> d why length) 0)])
171
175
  (buffer-add-string! (& b) method)
172
176
  (buffer-add-string! (& b) ": ")
173
- (buffer-add-string! (& b) (if (> (-> d why length) 0) (-> d why) "Chromium did not answer within 30 s"))
174
- (set! (@ err) (buffer-string (& b))))]))
177
+ (buffer-add-string! (& b) (if late "Chromium did not answer within 30 s" (-> d why)))
178
+ (error-fail! err (if late error-timeout error-other) (buffer-string (& b)))
179
+ (buffer-free! (& b)))]))
175
180
  (-= (-> d awaited length) 4)
176
181
  ok))
177
182
 
178
183
  (define (devtools-pump [d (ptr devtools)] [ms f64])
179
184
  (let ([deadline (+ (clock-monotonic) ms)] [text string])
180
185
  (while (next! d deadline (& text))
181
- (let ([e (make-arena)] [je json-error] [m (ptr json-value) 0] [rid i64 0])
182
- (set! m (json-parse (& e) text (& je)))
186
+ (let ([e (make-arena)] [m (ptr json-value) 0] [rid i64 0])
187
+ (json-parse (& e) text (& m) 0)
183
188
  (free (-> text bytes))
184
189
  (cond [(== m 0) (begin)]
185
190
  [(json-as-i64 (json-get m "id") (& rid)) (when (awaited? d (cast u32 rid)) (kept! d (cast u32 rid) m))]
@@ -3,12 +3,10 @@
3
3
  ;; whichever is shortest. deflate! adds in's compressed form to out: deflate-none may hold some back, deflate-sync sends
4
4
  ;; everything and ends at a whole byte, deflate-finish ends the stream. deflater-reset! starts another stream, and
5
5
  ;; deflate-alone! compresses bytes as if nothing came before, ending as a sync, so one deflater serves many streams.
6
- (provide deflater deflater-init! deflater-free! deflater-reset! deflate! deflate-alone! deflate-none deflate-sync
7
- deflate-finish)
6
+ (provide deflater deflater-init! deflater-free! deflater-reset! deflate! deflate-alone! deflate-flush deflate-none
7
+ deflate-sync deflate-finish)
8
8
 
9
- (const deflate-none i32 0)
10
- (const deflate-sync i32 1)
11
- (const deflate-finish i32 2)
9
+ (enum deflate-flush deflate-none deflate-sync deflate-finish)
12
10
 
13
11
  (const wsize u32 32768)
14
12
  (const wmask u32 32767)
@@ -155,10 +153,10 @@
155
153
  (set! (-> d lazy) (@ settings (+ (* l 4) 1)))
156
154
  (set! (-> d nice) (@ settings (+ (* l 4) 2)))
157
155
  (set! (-> d chain) (@ settings (+ (* l 4) 3))))
158
- (set! (-> d window) (cast (ptr u8) (malloc (+ (* 2 wsize) 272))))
159
- (set! (-> d head) (cast (ptr u16) (calloc hash-size 2)))
160
- (set! (-> d prev) (cast (ptr u16) (calloc wsize 2)))
161
- (set! (-> d syms) (cast (ptr u32) (malloc (* (+ most-symbols 1) 4))))
156
+ (set! (-> d window) (malloc (+ (* 2 wsize) 272)))
157
+ (set! (-> d head) (-> (new 0 u16 hash-size) items))
158
+ (set! (-> d prev) (-> (new 0 u16 wsize) items))
159
+ (set! (-> d syms) (malloc (* (+ most-symbols 1) (sizeof u32))))
162
160
  (set! (-> d strstart) 1)
163
161
  (deflater-reset! d))
164
162
 
@@ -432,7 +430,7 @@
432
430
  ;; ---- matching ----
433
431
 
434
432
  ;; greedy! takes a match wherever it finds one, and returns #t when it waits for more of the stream.
435
- (define (greedy! [d (ptr deflater)] [out (ptr buffer)] [in (slice u8)] [at (ptr u32)] [flush i32]) -> bool
433
+ (define (greedy! [d (ptr deflater)] [out (ptr buffer)] [in (slice u8)] [at (ptr u32)] [flush deflate-flush]) -> bool
436
434
  (while #t
437
435
  (when (< (-> d lookahead) min-lookahead)
438
436
  (fill! d in at)
@@ -459,7 +457,7 @@
459
457
  #f)
460
458
 
461
459
  ;; lazy! takes a match only when the next position has none longer.
462
- (define (lazy! [d (ptr deflater)] [out (ptr buffer)] [in (slice u8)] [at (ptr u32)] [flush i32]) -> bool
460
+ (define (lazy! [d (ptr deflater)] [out (ptr buffer)] [in (slice u8)] [at (ptr u32)] [flush deflate-flush]) -> bool
463
461
  (while #t
464
462
  (when (< (-> d lookahead) min-lookahead)
465
463
  (fill! d in at)
@@ -497,7 +495,7 @@
497
495
  (set! (-> d available) #f))
498
496
  #f)
499
497
 
500
- (define (deflate! [d (ptr deflater)] [out (ptr buffer)] [in (slice u8)] [flush i32])
498
+ (define (deflate! [d (ptr deflater)] [out (ptr buffer)] [in (slice u8)] [flush deflate-flush])
501
499
  (let ([at u32 0])
502
500
  (when (if (>= (-> d level) 4) (lazy! d out in (& at) flush) (greedy! d out in (& at) flush)) (return))
503
501
  (cond [(== flush deflate-finish)
@@ -1,9 +1,9 @@
1
1
  ;; The gzip format (RFC 1952) around DEFLATE data, and its CRC-32. gunzip! decodes whole gzip data, each member in
2
- ;; turn, adding at most most bytes to out, and returns 0 or a negative code whose message gzip-message gives.
2
+ ;; turn, adding at most most bytes to out.
3
3
  (require-unqualified "inflate.sub")
4
4
  (require-unqualified "deflate.sub")
5
5
 
6
- (provide crc32 gunzip! gzip-message gzip-start! gzip-end! gzip!)
6
+ (provide crc32 gunzip! gzip-start! gzip-end! gzip!)
7
7
 
8
8
  ;; CRC-32 with eight tables, slicing eight bytes at a time.
9
9
  (define tables (array u32 2048))
@@ -82,7 +82,9 @@
82
82
  [(-105) "incorrect data check"]
83
83
  [(-106) "incorrect length check"]
84
84
  [(-107) "unexpected end of data"]
85
- [else (inflate-message code)]))
85
+ [else "no error"]))
86
+
87
+ (define (refused [err (ptr error)] [code i32]) -> bool (error-fail! err error-invalid (gzip-message code)))
86
88
 
87
89
  (define (le32 [p (ptr u8)]) -> u32
88
90
  (bit-or (cast u32 (@ p 0)) (<< (cast u32 (@ p 1)) 8) (<< (cast u32 (@ p 2)) 16) (<< (cast u32 (@ p 3)) 24)))
@@ -114,19 +116,19 @@
114
116
  (+= i 2))
115
117
  (cast i32 i)))
116
118
 
117
- (define (gunzip! [out (ptr buffer)] [in (slice u8)] [most u32]) -> i32
119
+ (define (gunzip! [out (ptr buffer)] [in (slice u8)] [most u32] [err (ptr error)]) -> bool
118
120
  (let ([at u32 0] [start (-> out length)])
119
121
  (while #t
120
122
  (let* ([rest (slice in at)] [h (header-length rest)] [used u32 0] [begun (-> out length)])
121
- (when (< h 0) (return h))
122
- (let ([result (inflate! out (slice rest (cast u32 h)) (- most (- begun start)) (& used))])
123
- (unless (== result 0) (return result))
124
- (let ([trailer (+ (cast u32 h) used)])
125
- (when (< (- (-> rest length) trailer) 4) (return short-header))
126
- (unless (== (le32 (+ (-> rest items) trailer)) (crc32 0 (slice (buffer-bytes out) begun)))
127
- (return bad-data-check))
128
- (when (< (- (-> rest length) trailer) 8) (return short-header))
129
- (unless (== (le32 (+ (-> rest items) trailer 4)) (- (-> out length) begun)) (return bad-length-check))
130
- (+= at (+ trailer 8))
131
- (when (== at (-> in length)) (return 0))))))
132
- 0))
123
+ (when (< h 0) (return (refused err h)))
124
+ (unless (inflate! out (slice rest (cast u32 h)) (- most (- begun start)) (& used) err) (return #f))
125
+ (let ([trailer (+ (cast u32 h) used)])
126
+ (when (< (- (-> rest length) trailer) 4) (return (refused err short-header)))
127
+ (unless (== (le32 (+ (-> rest items) trailer)) (crc32 0 (slice (buffer-bytes out) begun)))
128
+ (return (refused err bad-data-check)))
129
+ (when (< (- (-> rest length) trailer) 8) (return (refused err short-header)))
130
+ (unless (== (le32 (+ (-> rest items) trailer 4)) (- (-> out length) begun))
131
+ (return (refused err bad-length-check)))
132
+ (+= at (+ trailer 8))
133
+ (when (== at (-> in length)) (return #t)))))
134
+ #t))
@@ -1,7 +1,6 @@
1
1
  ;; DEFLATE decoding (RFC 1951) of whole buffers, with lookup tables as zlib and libdeflate decode. inflate! decodes the
2
- ;; data at the start of in, adding at most most bytes to out, sets used to the bytes it took, and returns 0 or a negative
3
- ;; code whose message, zlib's, inflate-message gives.
4
- (provide inflate! inflate-message)
2
+ ;; data at the start of in, adding at most most bytes to out, and sets used to the bytes it took.
3
+ (provide inflate!)
5
4
 
6
5
  ;; Table entries hold a code's length in bits, an op and a value. Op 0 is a literal, 16 plus a count of extra bits a
7
6
  ;; base length or distance, 32 the end of a block, 64 plus a width a link to the table of that many bits at the value,
@@ -279,7 +278,11 @@
279
278
  (+= (-> out length) n)))))])))
280
279
  0))
281
280
 
282
- (define (inflate! [out (ptr buffer)] [in (slice u8)] [most u32] [used (ptr u32)]) -> i32
281
+ (define (inflate! [out (ptr buffer)] [in (slice u8)] [most u32] [used (ptr u32)] [err (ptr error)]) -> bool
282
+ (let ([code (inflate-code! out in most used)])
283
+ (or (== code 0) (error-fail! err (if (== code too-large) error-other error-invalid) (inflate-message code)))))
284
+
285
+ (define (inflate-code! [out (ptr buffer)] [in (slice u8)] [most u32] [used (ptr u32)]) -> i32
283
286
  (let ([r reader] [last #f] [result i32 0])
284
287
  (unless fixed (fixed!))
285
288
  (set! (-> r bits) 0)
@@ -62,10 +62,10 @@
62
62
  (set! last j)
63
63
  (when (== first j)
64
64
  (when (== running 0)
65
- (let ([why string])
65
+ (let ([why error] [id u32 0])
66
66
  (set! (-> listener handle) answered)
67
- (set! running (worker-start password-worker 0 0 (& listener) (& why)))
68
- (when (== running 0) (host-trap why))))
67
+ (unless (worker-start password-worker 0 0 (& listener) (& id) (& why)) (host-trap (error-text (& why))))
68
+ (set! running id)))
69
69
  (send-first!)))
70
70
 
71
71
  (define (unpadded! [b (ptr buffer)] [bytes (slice u8)])
package/std/doc/doc.sub CHANGED
@@ -45,7 +45,7 @@
45
45
  id))
46
46
 
47
47
  (define (text-of [id datum]) -> string
48
- (let ([b (slice u8)] [why string]) (if (< (fs-read-file (datum->string (host-file id)) (& b) (& why)) 0) "" (cast string b))))
48
+ (let ([b (slice u8)]) (if (fs-read-file (datum->string (host-file id)) (& b) 0) (cast string b) "")))
49
49
 
50
50
  (define (forms-of [text string] [id datum]) -> datum (program-forms (read-all text (string->symbol (datum->string id)))))
51
51
 
@@ -103,7 +103,7 @@
103
103
  (define (described [id datum]) -> datum
104
104
  (let ([known (assoc id descriptions)] [info fs-info] [forms datum 0] [d datum 0] [spec datum 0] [next datum 0])
105
105
  (unless (== known 0) (return (cdr known)))
106
- (when (and (== (fs-stat (datum->string (host-file id)) (& info) 0) 0) (== (-> info kind) fs-file))
106
+ (when (and (fs-stat (datum->string (host-file id)) (& info) 0) (== (-> info kind) fs-file))
107
107
  (set! forms (forms-of (text-of id) id))
108
108
  (set! d (doc-forms-of forms))
109
109
  (set! spec (language-of forms))
@@ -8,7 +8,7 @@
8
8
  json-parse json-write! json-get json-at json-count json-as-i64 json-as-f64 json-as-string json-as-bool
9
9
  json-push! json-add! json-insert! json-replace! json-replace-at! json-remove! json-remove-at! json-copy
10
10
  json-equal? json-reader json-reader-start! json-reader-free! json-next! json-skip!
11
- json-token-error json-token-end json-token-start-array json-token-end-array json-token-start-object
11
+ json-token json-token-error json-token-end json-token-start-array json-token-end-array json-token-start-object
12
12
  json-token-end-object json-token-key json-token-string json-token-number json-token-true json-token-false
13
13
  json-token-null)
14
14
 
@@ -22,40 +22,24 @@
22
22
 
23
23
  (struct json-member [key string] [value json-value])
24
24
 
25
- (struct json-error [message string] [offset u32] [line u32] [column u32])
25
+ (struct json-error [error error] [offset u32] [line u32] [column u32])
26
26
 
27
27
  ;; ---- the token reader ----
28
28
 
29
- (const json-token-error u32 0)
30
- (const json-token-end u32 1)
31
- (const json-token-start-array u32 2)
32
- (const json-token-end-array u32 3)
33
- (const json-token-start-object u32 4)
34
- (const json-token-end-object u32 5)
35
- (const json-token-key u32 6)
36
- (const json-token-string u32 7)
37
- (const json-token-number u32 8)
38
- (const json-token-true u32 9)
39
- (const json-token-false u32 10)
40
- (const json-token-null u32 11)
29
+ (enum json-token
30
+ json-token-error json-token-end json-token-start-array json-token-end-array json-token-start-object
31
+ json-token-end-object json-token-key json-token-string json-token-number json-token-true json-token-false
32
+ json-token-null)
41
33
 
42
34
  ;; What may come next, after Go's tokenState.
43
- (const top-value u32 0)
44
- (const top-end u32 1)
45
- (const array-start u32 2)
46
- (const array-value u32 3)
47
- (const array-comma u32 4)
48
- (const object-start u32 5)
49
- (const object-key u32 6)
50
- (const object-colon u32 7)
51
- (const object-value u32 8)
52
- (const object-comma u32 9)
53
- (const failed u32 10)
35
+ (enum token-state
36
+ top-value top-end array-start array-value array-comma object-start object-key object-colon object-value object-comma
37
+ failed)
54
38
 
55
39
  (const depth-limit u32 1000)
56
40
 
57
- (struct json-reader [text string] [at u32] [state u32] [depth u32] [kinds (array u8 1000)] [token string] [number f64]
58
- [scratch buffer] [error json-error])
41
+ (struct json-reader [text string] [at u32] [state token-state] [depth u32] [kinds (array u8 1000)] [token string]
42
+ [number f64] [scratch buffer] [error json-error])
59
43
 
60
44
  (define (json-reader-start! [r (ptr json-reader)] [text string])
61
45
  (set! (-> r text) text)
@@ -65,14 +49,17 @@
65
49
  (set! (-> r token) "")
66
50
  (set! (-> r number) 0.0)
67
51
  (set! (-> r scratch) (make-buffer))
68
- (set! (-> r error message) "")
52
+ (set! (-> r error error code) 0)
53
+ (set! (-> r error error message) (make-buffer))
69
54
  (set! (-> r error offset) 0)
70
55
  (set! (-> r error line) 0)
71
56
  (set! (-> r error column) 0))
72
57
 
73
- (define (json-reader-free! [r (ptr json-reader)]) (buffer-free! (& (-> r scratch))))
58
+ (define (json-reader-free! [r (ptr json-reader)])
59
+ (buffer-free! (& (-> r scratch)))
60
+ (error-free! (& (-> r error error))))
74
61
 
75
- (define (json-next! [r (ptr json-reader)]) -> u32
62
+ (define (json-next! [r (ptr json-reader)]) -> json-token
76
63
  (let ([s (-> r state)] [c (space! r)])
77
64
  (cond [(or (== s array-value) (== s object-value))
78
65
  (cond [(== c #\,)
@@ -121,7 +108,7 @@
121
108
  (set! (-> r at) i)
122
109
  256))
123
110
 
124
- (define (value! [r (ptr json-reader)] [c u32]) -> u32
111
+ (define (value! [r (ptr json-reader)] [c u32]) -> json-token
125
112
  (cond [(== c #\")
126
113
  (+= (-> r at) 1)
127
114
  (if (string! r) (after-value! r json-token-string) json-token-error)]
@@ -134,7 +121,7 @@
134
121
  [(== c 256) (if (== (-> r depth) 0) (fail! r "the text has no value") (ended! r))]
135
122
  [else (fail! r "expected a value")]))
136
123
 
137
- (define (word! [r (ptr json-reader)] [w string] [t u32]) -> u32
124
+ (define (word! [r (ptr json-reader)] [w string] [t json-token]) -> json-token
138
125
  (let ([end (+ (-> r at) (-> w length))])
139
126
  (if (and (<= end (-> r text length)) (== (memcmp (+ (-> r text bytes) (-> r at)) (-> w bytes) (-> w length)) 0))
140
127
  (begin
@@ -142,13 +129,13 @@
142
129
  (after-value! r t))
143
130
  (fail! r "expected a value"))))
144
131
 
145
- (define (after-value! [r (ptr json-reader)] [t u32]) -> u32
132
+ (define (after-value! [r (ptr json-reader)] [t json-token]) -> json-token
146
133
  (set! (-> r state) (cond [(== (-> r depth) 0) top-end]
147
134
  [(== (@ (-> r kinds) (- (-> r depth) 1)) 1) array-value]
148
135
  [else object-value]))
149
136
  t)
150
137
 
151
- (define (open! [r (ptr json-reader)] [kind u32] [t u32]) -> u32
138
+ (define (open! [r (ptr json-reader)] [kind u32] [t json-token]) -> json-token
152
139
  (when (== (-> r depth) depth-limit) (return (fail! r "nested too deeply")))
153
140
  (set! (@ (-> r kinds) (-> r depth)) kind)
154
141
  (+= (-> r depth) 1)
@@ -156,20 +143,20 @@
156
143
  (set! (-> r state) (if (== kind 1) array-start object-start))
157
144
  t)
158
145
 
159
- (define (close! [r (ptr json-reader)]) -> u32
146
+ (define (close! [r (ptr json-reader)]) -> json-token
160
147
  (-= (-> r depth) 1)
161
148
  (after-value! r (if (== (@ (-> r kinds) (-> r depth)) 1) json-token-end-array json-token-end-object)))
162
149
 
163
- (define (ended! [r (ptr json-reader)]) -> u32
150
+ (define (ended! [r (ptr json-reader)]) -> json-token
164
151
  (fail! r (if (== (@ (-> r kinds) (- (-> r depth) 1)) 1) "the text ends inside an array" "the text ends inside an object")))
165
152
 
166
- (define (fail! [r (ptr json-reader)] [message string]) -> u32
153
+ (define (fail! [r (ptr json-reader)] [message string]) -> json-token
167
154
  (let ([p (-> r text bytes)] [line u32 1] [from u32 0])
168
155
  (for ([i u32 0]) (< i (-> r at)) (+= i 1)
169
156
  (when (== (@ p i) 10)
170
157
  (+= line 1)
171
158
  (set! from (+ i 1))))
172
- (set! (-> r error message) message)
159
+ (error-fail! (& (-> r error error)) error-invalid message)
173
160
  (set! (-> r error offset) (-> r at))
174
161
  (set! (-> r error line) line)
175
162
  (set! (-> r error column) (+ (- (-> r at) from) 1))
@@ -178,6 +165,14 @@
178
165
 
179
166
  (define (reject! [r (ptr json-reader)] [message string]) -> bool (fail! r message) #f)
180
167
 
168
+ (define (failed-into! [r (ptr json-reader)] [err (ptr json-error)]) -> bool
169
+ (unless (== err 0)
170
+ (error-fail! (& (-> err error)) (-> r error error code) (error-text (& (-> r error error))))
171
+ (set! (-> err offset) (-> r error offset))
172
+ (set! (-> err line) (-> r error line))
173
+ (set! (-> err column) (-> r error column)))
174
+ #f)
175
+
181
176
  (define (string! [r (ptr json-reader)]) -> bool
182
177
  (let ([p (-> r text bytes)] [start (-> r at)] [i (-> r at)] [end (-> r text length)] [c u32 0] [k u32 0])
183
178
  (while (< i end)
@@ -320,14 +315,11 @@
320
315
 
321
316
  ;; ---- parsing ----
322
317
 
323
- (define (arena-text [a (ptr arena)] [s string]) -> string
324
- (let* ([n (-> s length)] [q (cast (ptr u8) (arena-alloc a n))])
325
- (memcpy q (-> s bytes) n)
326
- (cast string (slice q n))))
318
+ (define (arena-text [a (ptr arena)] [s string]) -> string (copy a s))
327
319
 
328
- (define (json-parse [a (ptr arena)] [text string] [err (ptr json-error)]) -> (ptr json-value)
320
+ (define (json-parse [a (ptr arena)] [text string] [value (ptr (ptr json-value))] [err (ptr json-error)]) -> bool
329
321
  (let ([r json-reader] [values (make-buffer)] [members (make-buffer)] [starts (array u32 1000)]
330
- [root (ptr json-value) 0] [t u32 0] [v json-value (json-null)] [k u32 0] [m json-member] [placed #f])
322
+ [root (ptr json-value) 0] [t json-token] [v json-value (json-null)] [k u32 0] [m json-member] [placed #f])
331
323
  (json-reader-start! (& r) text)
332
324
  (while #t
333
325
  (set! t (json-next! (& r)))
@@ -364,12 +356,12 @@
364
356
  (set! (-> members length) (* (@ starts (-> r depth)) (sizeof json-member)))]
365
357
  [(== t json-token-end) (break)]
366
358
  [else
367
- (when (!= err 0) (set! (@ err) (-> r error)))
359
+ (failed-into! (& r) err)
368
360
  (set! root 0)
369
361
  (break)])
370
362
  (when placed
371
363
  (cond [(== (-> r depth) 0)
372
- (set! root (cast (ptr json-value) (arena-alloc a (sizeof json-value))))
364
+ (set! root (new a json-value))
373
365
  (set! (@ root) v)]
374
366
  [(== (@ (-> r kinds) (- (-> r depth) 1)) 1)
375
367
  (buffer-add! (& values) (slice (cast (ptr u8) (& v)) (sizeof json-value)))]
@@ -379,13 +371,12 @@
379
371
  (json-reader-free! (& r))
380
372
  (buffer-free! (& values))
381
373
  (buffer-free! (& members))
382
- root))
374
+ (set! (@ value) root)
375
+ (!= root 0)))
383
376
 
384
377
  ;; The k items of size bytes from index from of bytes, copied into a, or 0 for none.
385
378
  (define (block [a (ptr arena)] [bytes (ptr u8)] [from u32] [k u32] [size u32]) -> (ptr void)
386
- (if (== k 0)
387
- 0
388
- (memcpy (arena-alloc a (* k size)) (+ bytes (* from size)) (* k size))))
379
+ (if (== k 0) 0 (-> (copy a (slice (+ bytes (* from size)) (* k size))) items)))
389
380
 
390
381
  ;; ---- writing ----
391
382
 
@@ -597,7 +588,7 @@
597
588
  (when (> i count) (return #f))
598
589
  (when (== count room)
599
590
  (set! room (if (== room 0) 4 (* 2 room)))
600
- (let ([q (cast (ptr json-value) (arena-alloc a (* room (sizeof json-value))))])
591
+ (let ([q (-> (new a json-value room) items)])
601
592
  (when (> count 0) (memcpy q p (* count (sizeof json-value))))
602
593
  (set! p q)))
603
594
  (memcpy (+ p i 1) (+ p i) (* (- count i) (sizeof json-value)))
@@ -613,7 +604,7 @@
613
604
  (let ([p (-> members items)] [count (-> members length)])
614
605
  (when (== count room)
615
606
  (set! room (if (== room 0) 4 (* 2 room)))
616
- (let ([q (cast (ptr json-member) (arena-alloc a (* room (sizeof json-member))))])
607
+ (let ([q (-> (new a json-member room) items)])
617
608
  (when (> count 0) (memcpy q p (* count (sizeof json-member))))
618
609
  (set! p q)))
619
610
  (let ([m (+ p count)])
@@ -660,7 +651,7 @@
660
651
  [_ #f]))
661
652
 
662
653
  (define (json-copy [a (ptr arena)] [v (ptr json-value)]) -> (ptr json-value)
663
- (let ([out (cast (ptr json-value) (arena-alloc a (sizeof json-value)))])
654
+ (let ([out (new a json-value)])
664
655
  (copy-into! a out v)
665
656
  out))
666
657
 
@@ -668,17 +659,17 @@
668
659
  (if (== v 0) (set! (@ out) (json-null)) (set! (@ out) (@ v)))
669
660
  (match out
670
661
  [(json-array items room)
671
- (let* ([count (-> items length)] [p (cast (ptr json-value) (arena-alloc a (* count (sizeof json-value))))])
672
- (for ([i u32 0]) (< i count) (+= i 1) (copy-into! a (+ p i) (& (@ items i))))
673
- (set! items (slice p count))
662
+ (let* ([count (-> items length)] [p (new a json-value count)])
663
+ (for ([i u32 0]) (< i count) (+= i 1) (copy-into! a (& (@ p i)) (& (@ items i))))
664
+ (set! items p)
674
665
  (set! room count))]
675
666
  [(json-object members room)
676
- (let* ([count (-> members length)] [p (cast (ptr json-member) (arena-alloc a (* count (sizeof json-member))))])
667
+ (let* ([count (-> members length)] [p (new a json-member count)])
677
668
  (for ([i u32 0]) (< i count) (+= i 1)
678
- (let ([m (& (@ members i))] [q (+ p i)])
669
+ (let ([m (& (@ members i))] [q (& (@ p i))])
679
670
  (set! (-> q key) (arena-text a (-> m key)))
680
671
  (copy-into! a (& (-> q value)) (& (-> m value)))))
681
- (set! members (slice p count))
672
+ (set! members p)
682
673
  (set! room count))]
683
674
  [_ (own! a out)]))
684
675
 
@@ -709,17 +700,17 @@
709
700
 
710
701
  ;; ---- reading into types ----
711
702
 
712
- (define (expect! [r (ptr json-reader)] [t u32] [want u32] [message string]) -> bool
703
+ (define (expect! [r (ptr json-reader)] [t json-token] [want json-token] [message string]) -> bool
713
704
  (cond [(== t want) #t]
714
705
  [(== t json-token-error) #f]
715
706
  [else (reject! r message)]))
716
707
 
717
- (define (take-unsigned! [r (ptr json-reader)] [t u32] [most u64] [to (ptr u64)]) -> bool
708
+ (define (take-unsigned! [r (ptr json-reader)] [t json-token] [most u64] [to (ptr u64)]) -> bool
718
709
  (and (expect! r t json-token-number "expected a number")
719
710
  (or (and (digits? (-> r token) 10) (digits-integer (-> r token) 10 #f to) (<= (@ to) most))
720
711
  (reject! r "expected an integer within the field's type"))))
721
712
 
722
- (define (take-signed! [r (ptr json-reader)] [t u32] [least i64] [most i64] [to (ptr i64)]) -> bool
713
+ (define (take-signed! [r (ptr json-reader)] [t json-token] [least i64] [most i64] [to (ptr i64)]) -> bool
723
714
  (unless (expect! r t json-token-number "expected a number") (return #f))
724
715
  (let* ([negative (== (@ (-> r token) 0) #\-)] [digits (slice (-> r token) (if negative 1 0))] [k u64 0])
725
716
  (or (and (digits? digits 10) (digits-integer digits 10 negative (& k))
@@ -727,23 +718,23 @@
727
718
  (begin (set! (@ to) (cast i64 k)) #t))
728
719
  (reject! r "expected an integer within the field's type"))))
729
720
 
730
- (define (take-float! [r (ptr json-reader)] [t u32] [to (ptr f64)]) -> bool
721
+ (define (take-float! [r (ptr json-reader)] [t json-token] [to (ptr f64)]) -> bool
731
722
  (and (expect! r t json-token-number "expected a number")
732
723
  (begin (set! (@ to) (-> r number)) #t)))
733
724
 
734
- (define (take-bool! [r (ptr json-reader)] [t u32] [to (ptr bool)]) -> bool
725
+ (define (take-bool! [r (ptr json-reader)] [t json-token] [to (ptr bool)]) -> bool
735
726
  (cond [(== t json-token-true) (set! (@ to) #t) #t]
736
727
  [(== t json-token-false) (set! (@ to) #f) #t]
737
728
  [else (expect! r t json-token-true "expected true or false")]))
738
729
 
739
- (define (take-text! [r (ptr json-reader)] [a (ptr arena)] [t u32] [to (ptr string)]) -> bool
730
+ (define (take-text! [r (ptr json-reader)] [a (ptr arena)] [t json-token] [to (ptr string)]) -> bool
740
731
  (and (expect! r t json-token-string "expected a string")
741
732
  (begin (set! (@ to) (arena-text a (-> r token))) #t)))
742
733
 
743
734
  (define (end-of-text! [r (ptr json-reader)]) -> bool (== (json-next! r) json-token-end))
744
735
 
745
736
  (define (finish! [r (ptr json-reader)] [ok bool] [err (ptr json-error)]) -> bool
746
- (when (and (not ok) (!= err 0)) (set! (@ err) (-> r error)))
737
+ (unless ok (failed-into! r err))
747
738
  (json-reader-free! r)
748
739
  ok)
749
740
 
@@ -786,7 +777,7 @@
786
777
  (define (struct-code [t datum] [fields datum]) -> datum
787
778
  `(,#`(define (#,(derive-name t '"json-write!") [b (ptr buffer)] [v (ptr #,t)])
788
779
  #,@(object-write fields (for/list ([f fields]) #`(-> v #,(car f)))))
789
- ,#`(define (#,(derive-name t '"json-read-from!") [r (ptr json-reader)] [a (ptr arena)] [token u32] [v (ptr #,t)]) -> bool
780
+ ,#`(define (#,(derive-name t '"json-read-from!") [r (ptr json-reader)] [a (ptr arena)] [token json-token] [v (ptr #,t)]) -> bool
790
781
  #,(object-read #`token fields (for/list ([f fields]) #`(-> v #,(car f))))
791
782
  #t)
792
783
  ,(entry t)))
@@ -812,7 +803,7 @@
812
803
  objects))))))
813
804
  `(,#`(define (#,(derive-name t '"json-write!") [b (ptr buffer)] [v (ptr #,t)])
814
805
  (match v #,@(reverse writes)))
815
- ,#`(define (#,(derive-name t '"json-read-from!") [r (ptr json-reader)] [a (ptr arena)] [token u32] [v (ptr #,t)]) -> bool
806
+ ,#`(define (#,(derive-name t '"json-read-from!") [r (ptr json-reader)] [a (ptr arena)] [token json-token] [v (ptr #,t)]) -> bool
816
807
  (cond [(== token json-token-string)
817
808
  (cond #,@(reverse names)
818
809
  [else (return (reject! r "unknown case"))])]
@@ -861,7 +852,7 @@
861
852
  (return (reject! r #,(literal (format "missing field ~a" `(,(syntax-e (car f))))))))
862
853
  checks))))
863
854
  (+= i 1))
864
- #`(let ([#,seen (array bool #,n)] [#,k u32 0])
855
+ #`(let ([#,seen (array bool #,n)] [#,k json-token])
865
856
  (memset #,seen 0 #,n)
866
857
  #,@(reverse defaults)
867
858
  (unless (expect! r #,token json-token-start-object "expected an object") (return #f))
@@ -918,20 +909,20 @@
918
909
  (let ([q (derive-fresh 'q)] [e (type-syntax (cadr type))])
919
910
  #`(if (== #,u json-token-null)
920
911
  (set! #,p 0)
921
- (let ([#,q (cast (ptr #,e) (arena-alloc a (sizeof #,e)))])
912
+ (let ([#,q (new a #,e)])
922
913
  #,(read-code (cadr type) #`(@ #,q) where u)
923
914
  (set! #,p #,q))))]
924
915
  [(== (car type) 'slice)
925
916
  (let ([items (derive-fresh 'items)] [count (derive-fresh 'count)] [room (derive-fresh 'room)] [w (derive-fresh 'w)]
926
917
  [more (derive-fresh 'more)] [e (type-syntax (cadr type))])
927
- #`(let ([#,items (ptr #,e) 0] [#,count u32 0] [#,room u32 0] [#,w u32 0])
918
+ #`(let ([#,items (ptr #,e) 0] [#,count u32 0] [#,room u32 0] [#,w json-token])
928
919
  (unless (expect! r #,u json-token-start-array "expected an array") (return #f))
929
920
  (while #t
930
921
  (set! #,w (json-next! r))
931
922
  (when (== #,w json-token-end-array) (break))
932
923
  (when (== #,count #,room)
933
924
  (set! #,room (if (== #,room 0) 4 (* 2 #,room)))
934
- (let ([#,more (cast (ptr #,e) (arena-alloc a (* #,room (sizeof #,e))))])
925
+ (let ([#,more (-> (new a #,e #,room) items)])
935
926
  (when (> #,count 0) (memcpy #,more #,items (* #,count (sizeof #,e))))
936
927
  (set! #,items #,more)))
937
928
  #,(read-code (cadr type) #`(@ #,items #,count) where w)
@@ -940,7 +931,7 @@
940
931
  [(== (car type) 'array)
941
932
  (let ([i (derive-fresh 'i)] [w (derive-fresh 'w)] [n (literal (caddr type))]
942
933
  [message (literal (format "expected an array of ~a items" `(,(caddr type))))])
943
- #`(let ([#,w u32 0])
934
+ #`(let ([#,w json-token])
944
935
  (unless (expect! r #,u json-token-start-array "expected an array") (return #f))
945
936
  (for ([#,i u32 0]) (< #,i #,n) (+= #,i 1)
946
937
  (set! #,w (json-next! r))