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.
- package/README.md +1 -1
- package/build/compiler/binary.2d43b43d1600@0+0.wasm +0 -0
- package/build/compiler/checker.4dd4556dd421@0+0.wasm +0 -0
- package/build/compiler/compile.5d8f6407af2a@0+0.wasm +0 -0
- package/build/compiler/{core.fc3dab9d1846@0+0.wasm → core.f2defb75e00b@0+0.wasm} +0 -0
- package/build/compiler/expander.967ce443d379@0+0.wasm +0 -0
- package/build/compiler/fs.01b8aab4a9a8@0+0.wasm +0 -0
- package/build/compiler/{leb128.748b1c37277a@0+0.wasm → leb128.15d814b7b4f2@0+0.wasm} +0 -0
- package/build/compiler/{link.11b643d35670@0+0.wasm → link.b826ea7c8f17@0+0.wasm} +0 -0
- package/build/compiler/{macros.4083601c00db@0+0.wasm → macros.b269e0c42784@0+0.wasm} +0 -0
- package/build/compiler/{main.ed62cce43000@0+0.wasm → main.4fc52f204d54@0+0.wasm} +0 -0
- package/build/compiler/{ops.b361e858d8e1@0+0.wasm → ops.515b5e05f646@0+0.wasm} +0 -0
- package/build/compiler/{path.dcc4712bcc7b@0+0.wasm → path.5a6286472cd4@0+0.wasm} +0 -0
- package/build/compiler/program +21 -21
- package/build/compiler/prune.406215c3e4f8@0+0.wasm +0 -0
- package/build/compiler/reader.694b03770bf0@0+0.wasm +0 -0
- package/build/compiler/roots.cefd10e93684@0+0.wasm +0 -0
- package/build/compiler/{running.d73f7826cb74@0+0.wasm → running.0d25dbaec018@0+0.wasm} +0 -0
- package/build/compiler/serialize.b0d82f3d63d2@0+0.wasm +0 -0
- package/build/compiler/{sha256.5fc9d60f8bb2@0+0.wasm → sha256.a6c32b04d799@0+0.wasm} +0 -0
- package/build/compiler/substrate.5ee5d0b4d3e7@0+0.wasm +0 -0
- package/build/compiler/syntax.32f3e40b61c7@0+0.wasm +0 -0
- package/build/compiler/{writer.806bc85aa684@0+0.wasm → writer.00b7802cbe39@0+0.wasm} +0 -0
- package/build/sub/{base64.8fba03e1be0a@0+0.wasm → base64.a26bdcf60a2d@0+0.wasm} +0 -0
- package/build/sub/build.459c5b9412bd@0+0.wasm +0 -0
- package/build/sub/chromium.3d5818f2707d@0+0.wasm +0 -0
- package/build/sub/common.1edc613607a0@0+0.wasm +0 -0
- package/build/sub/deflate.23f7c4679260@0+0.wasm +0 -0
- package/build/sub/doc.0775df5de6fe@0+0.wasm +0 -0
- package/build/sub/{doc.566f9861828e@0+0.wasm → doc.ef9965d5d402@0+0.wasm} +0 -0
- package/build/sub/env.e5451da6e747@0+0.wasm +0 -0
- package/build/sub/events.bf5473ebf220@0+0.wasm +0 -0
- package/build/sub/fetch.7790d4943758@0+0.wasm +0 -0
- package/build/sub/fetch.96b2d10f025e@0+0.wasm +0 -0
- package/build/sub/files.ad0469fdf6fa@0+0.wasm +0 -0
- package/build/sub/fs.01b8aab4a9a8@0+0.wasm +0 -0
- package/build/sub/git.dc4c0e757ebe@0+0.wasm +0 -0
- package/build/sub/grants.c54776c0d7e3@0+0.wasm +0 -0
- package/build/sub/gzip.16e372eda1cf@0+0.wasm +0 -0
- package/build/sub/hash.660682e4f491@0+0.wasm +0 -0
- package/build/sub/{html.20baa1dc7ca6@0+0.wasm → html.a23126eb949a@0+0.wasm} +0 -0
- package/build/sub/{html.c1671a102b4d@0+0.wasm → html.e9ed37f34977@0+0.wasm} +0 -0
- package/build/sub/{inflate.8899e0933792@0+0.wasm → inflate.59bb61f14001@0+0.wasm} +0 -0
- package/build/sub/json.55590d2f518a@0+0.wasm +0 -0
- package/build/sub/manifest.ef317480deb0@0+0.wasm +0 -0
- package/build/sub/map.f455cca6a42a@0+0.wasm +0 -0
- package/build/sub/pack.e02836264f6a@0+0.wasm +0 -0
- package/build/sub/{path.dcc4712bcc7b@0+0.wasm → path.5a6286472cd4@0+0.wasm} +0 -0
- package/build/sub/path.6891ffea73ca@0+0.wasm +0 -0
- package/build/sub/process.7106571fa723@0+0.wasm +0 -0
- package/build/sub/program +48 -48
- package/build/sub/read.0b93933d62a2@0+0.wasm +0 -0
- package/build/sub/{reader.b535e61f99f4@0+0.wasm → reader.694b03770bf0@0+0.wasm} +0 -0
- package/build/sub/{root.9b713ec588c1@0+0.wasm → root.f10a4906f460@0+0.wasm} +0 -0
- package/build/sub/{roots.6d2942578055@0+0.wasm → roots.cefd10e93684@0+0.wasm} +0 -0
- package/build/sub/{sha256.5fc9d60f8bb2@0+0.wasm → sha256.a6c32b04d799@0+0.wasm} +0 -0
- package/build/sub/{sha512.b988b9dc6114@0+0.wasm → sha512.c24a792d7891@0+0.wasm} +0 -0
- package/build/sub/site.1732b58ec0e8@0+0.wasm +0 -0
- package/build/sub/site.ae3913b0b0f4@0+0.wasm +0 -0
- package/build/sub/store.a24d7a25daa6@0+0.wasm +0 -0
- package/build/sub/stream.126e3bd5d626@0+0.wasm +0 -0
- package/build/sub/sub.2e3092140706@0+0.wasm +0 -0
- package/build/sub/substrate.5ee5d0b4d3e7@0+0.wasm +0 -0
- package/build/sub/{syntax.9857f6784d63@0+0.wasm → syntax.32f3e40b61c7@0+0.wasm} +0 -0
- package/build/sub/tar.2a633861e654@0+0.wasm +0 -0
- package/build/sub/test.9bd59c73f65e@0+0.wasm +0 -0
- package/build/sub/{text.4ab70ac35b5a@0+0.wasm → text.1bc90482bd43@0+0.wasm} +0 -0
- package/build/sub/{timer.3809bb17a7a1@0+0.wasm → timer.f35eb62ae446@0+0.wasm} +0 -0
- package/build/sub/upgrade.39ee449b00d5@0+0.wasm +0 -0
- package/build/sub/{utf8.524c475ecd40@0+0.wasm → utf8.e7216bd054e1@0+0.wasm} +0 -0
- package/build/sub/worker.762a9d642af0@0+0.wasm +0 -0
- package/build/sub/writer.00b7802cbe39@0+0.wasm +0 -0
- package/package.json +1 -1
- package/std/archive/tar.sub +44 -44
- package/std/browser/chromium.sub +5 -4
- package/std/browser/devtools.sub +24 -19
- package/std/compress/deflate.sub +10 -12
- package/std/compress/gzip.sub +18 -16
- package/std/compress/inflate.sub +7 -4
- package/std/crypto/password.sub +3 -3
- package/std/doc/doc.sub +2 -2
- package/std/encoding/json.sub +64 -73
- package/std/encoding/wire.sub +15 -15
- package/std/http/checks.sub +3 -3
- package/std/http/conditional.sub +2 -4
- package/std/http/cookie.sub +5 -7
- package/std/http/form.sub +9 -12
- package/std/http/http.sub +17 -24
- package/std/http/multipart.sub +13 -15
- package/std/http/route.sub +18 -13
- package/std/http/server.sub +21 -23
- package/std/http/session.sub +3 -6
- package/std/http/sse-client.sub +9 -14
- package/std/http/static.sub +5 -5
- package/std/http/url.sub +10 -10
- package/std/http/websocket.sub +2 -5
- package/std/meta/derive.sub +0 -2
- package/std/meta/method.sub +41 -0
- package/std/meta/type-info.sub +30 -37
- package/std/package/files.sub +24 -25
- package/std/package/git.sub +26 -33
- package/std/package/hash.sub +9 -9
- package/std/package/manifest.sub +81 -57
- package/std/package/map.sub +5 -9
- package/std/package/pack.sub +13 -13
- package/std/package/path.sub +1 -4
- package/std/package/read.sub +10 -14
- package/std/package/site.sub +11 -11
- package/std/package/store.sub +16 -12
- package/std/package.sub +6 -6
- package/std/test/browser.sub +9 -8
- package/std/test/build.sub +2 -2
- package/std/test/compare.sub +9 -10
- package/std/test/page.sub +32 -27
- package/std/test/run.sub +9 -8
- package/std/test/test.sub +36 -30
- package/std/vector/vector.sub +75 -0
- package/substrate/VERSION +1 -1
- package/substrate/compiler/binary.sub +5 -14
- package/substrate/compiler/checker.sub +235 -222
- package/substrate/compiler/compile.sub +11 -11
- package/substrate/compiler/expander.sub +52 -78
- package/substrate/compiler/link.sub +2 -2
- package/substrate/compiler/main.sub +9 -9
- package/substrate/compiler/ops.sub +1 -1
- package/substrate/compiler/prune.sub +12 -17
- package/substrate/compiler/reader.sub +4 -4
- package/substrate/compiler/roots.sub +11 -10
- package/substrate/compiler/running.sub +1 -1
- package/substrate/compiler/serialize.sub +57 -50
- package/substrate/compiler/substrate.sub +60 -23
- package/substrate/compiler/syntax.sub +8 -21
- package/substrate/host/errors.mjs +3 -2
- package/substrate/host/events.sub +3 -16
- package/substrate/host/fs.mjs +5 -4
- package/substrate/host/fs.sub +142 -112
- package/substrate/host/grants.mjs +1 -1
- package/substrate/host/grants.sub +33 -33
- package/substrate/host/modules/fake.mjs +1 -1
- package/substrate/host/modules/websocket.mjs +4 -4
- package/substrate/host/modules/websocket.sub +8 -6
- package/substrate/host/node/env.mjs +12 -6
- package/substrate/host/node/env.sub +21 -16
- package/substrate/host/node/fs.mjs +1 -1
- package/substrate/host/node/net.mjs +2 -2
- package/substrate/host/node/net.sub +13 -6
- package/substrate/host/node/process.mjs +4 -4
- package/substrate/host/node/process.sub +28 -28
- package/substrate/host/node/signal.mjs +3 -2
- package/substrate/host/node/signal.sub +9 -6
- package/substrate/host/node/watch.mjs +1 -1
- package/substrate/host/node/watch.sub +11 -9
- package/substrate/host/stream.sub +2 -0
- package/substrate/host/subhost-core.mjs +9 -1
- package/substrate/host/web/clipboard.mjs +2 -2
- package/substrate/host/web/clipboard.sub +10 -3
- package/substrate/host/web/files.mjs +2 -2
- package/substrate/host/web/files.sub +6 -2
- package/substrate/host/web/fs.mjs +3 -3
- package/substrate/host/web/location.mjs +3 -1
- package/substrate/host/web/location.sub +8 -4
- package/substrate/host/worker-side.mjs +3 -1
- package/substrate/host/worker.mjs +6 -5
- package/substrate/host/worker.sub +10 -10
- package/build/compiler/binary.3823f89ce414@0+0.wasm +0 -0
- package/build/compiler/checker.592d37dcbec9@0+0.wasm +0 -0
- package/build/compiler/compile.86a2b03b0c9b@0+0.wasm +0 -0
- package/build/compiler/expander.689d326e5a1b@0+0.wasm +0 -0
- package/build/compiler/fs.563034be70c3@0+0.wasm +0 -0
- package/build/compiler/prune.d4a3f9834095@0+0.wasm +0 -0
- package/build/compiler/reader.b535e61f99f4@0+0.wasm +0 -0
- package/build/compiler/roots.6d2942578055@0+0.wasm +0 -0
- package/build/compiler/serialize.b2196de75bc8@0+0.wasm +0 -0
- package/build/compiler/substrate.4c780d6dd6d4@0+0.wasm +0 -0
- package/build/compiler/syntax.9857f6784d63@0+0.wasm +0 -0
- package/build/sub/build.84ac996eda63@0+0.wasm +0 -0
- package/build/sub/chromium.e4db7d29897c@0+0.wasm +0 -0
- package/build/sub/common.91ddee6b7a67@0+0.wasm +0 -0
- package/build/sub/deflate.fc8075e3aed1@0+0.wasm +0 -0
- package/build/sub/doc.0b48bbac404b@0+0.wasm +0 -0
- package/build/sub/env.f051f8166526@0+0.wasm +0 -0
- package/build/sub/events.f952172735e0@0+0.wasm +0 -0
- package/build/sub/fetch.097f1cc9502d@0+0.wasm +0 -0
- package/build/sub/fetch.5d2f427c995e@0+0.wasm +0 -0
- package/build/sub/files.30e55182c5df@0+0.wasm +0 -0
- package/build/sub/fs.563034be70c3@0+0.wasm +0 -0
- package/build/sub/git.48aefa1644be@0+0.wasm +0 -0
- package/build/sub/grants.5bf25700d47c@0+0.wasm +0 -0
- package/build/sub/gzip.69588e97c35a@0+0.wasm +0 -0
- package/build/sub/hash.3f0d118da63f@0+0.wasm +0 -0
- package/build/sub/json.f15a29d99d8d@0+0.wasm +0 -0
- package/build/sub/manifest.cf7471880377@0+0.wasm +0 -0
- package/build/sub/map.dc516eec27ff@0+0.wasm +0 -0
- package/build/sub/pack.55992e8cc09c@0+0.wasm +0 -0
- package/build/sub/path.b7a8e1cf3aaa@0+0.wasm +0 -0
- package/build/sub/process.aea2c88cb7a0@0+0.wasm +0 -0
- package/build/sub/read.cd1e693f4fb4@0+0.wasm +0 -0
- package/build/sub/site.7c6d8c7747af@0+0.wasm +0 -0
- package/build/sub/site.81548474c323@0+0.wasm +0 -0
- package/build/sub/store.d4e845ff24ac@0+0.wasm +0 -0
- package/build/sub/stream.4c07247477f7@0+0.wasm +0 -0
- package/build/sub/sub.b57e17b6876b@0+0.wasm +0 -0
- package/build/sub/substrate.4c780d6dd6d4@0+0.wasm +0 -0
- package/build/sub/tar.e482cf873cfc@0+0.wasm +0 -0
- package/build/sub/test.0d9c079bb309@0+0.wasm +0 -0
- package/build/sub/upgrade.18a5aa0dae89@0+0.wasm +0 -0
- package/build/sub/worker.f1190de21b21@0+0.wasm +0 -0
- package/build/sub/writer.806bc85aa684@0+0.wasm +0 -0
package/std/browser/devtools.sub
CHANGED
|
@@ -27,11 +27,12 @@
|
|
|
27
27
|
(define socket-head event-head)
|
|
28
28
|
|
|
29
29
|
(define (relay)
|
|
30
|
-
(let ([why
|
|
30
|
+
(let ([why error] [id u32 0])
|
|
31
31
|
(event-handler! worker-source from-parent)
|
|
32
32
|
(set! (-> socket-head handle) from-socket)
|
|
33
|
-
(
|
|
34
|
-
|
|
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
|
|
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
|
-
(
|
|
69
|
-
|
|
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
|
-
(
|
|
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
|
|
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)] [
|
|
147
|
-
(
|
|
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 ([
|
|
154
|
-
(if (==
|
|
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
|
|
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
|
-
(
|
|
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
|
|
174
|
-
(
|
|
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)] [
|
|
182
|
-
(
|
|
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))]
|
package/std/compress/deflate.sub
CHANGED
|
@@ -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-
|
|
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
|
-
(
|
|
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) (
|
|
159
|
-
(set! (-> d head) (
|
|
160
|
-
(set! (-> d prev) (
|
|
161
|
-
(set! (-> d syms) (
|
|
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
|
|
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
|
|
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
|
|
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)
|
package/std/compress/gzip.sub
CHANGED
|
@@ -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
|
|
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-
|
|
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
|
|
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]) ->
|
|
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
|
-
(
|
|
123
|
-
|
|
124
|
-
(
|
|
125
|
-
|
|
126
|
-
(
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
(
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
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))
|
package/std/compress/inflate.sub
CHANGED
|
@@ -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
|
|
3
|
-
|
|
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)]) ->
|
|
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)
|
package/std/crypto/password.sub
CHANGED
|
@@ -62,10 +62,10 @@
|
|
|
62
62
|
(set! last j)
|
|
63
63
|
(when (== first j)
|
|
64
64
|
(when (== running 0)
|
|
65
|
-
(let ([why
|
|
65
|
+
(let ([why error] [id u32 0])
|
|
66
66
|
(set! (-> listener handle) answered)
|
|
67
|
-
(
|
|
68
|
-
(
|
|
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)]
|
|
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 (
|
|
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))
|
package/std/encoding/json.sub
CHANGED
|
@@ -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 [
|
|
25
|
+
(struct json-error [error error] [offset u32] [line u32] [column u32])
|
|
26
26
|
|
|
27
27
|
;; ---- the token reader ----
|
|
28
28
|
|
|
29
|
-
(
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
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
|
-
(
|
|
44
|
-
|
|
45
|
-
|
|
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
|
|
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
|
|
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)])
|
|
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)]) ->
|
|
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]) ->
|
|
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
|
|
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
|
|
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
|
|
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)]) ->
|
|
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)]) ->
|
|
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]) ->
|
|
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
|
-
(
|
|
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] [
|
|
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
|
|
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
|
-
(
|
|
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 (
|
|
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 (
|
|
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 (
|
|
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 (
|
|
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 (
|
|
672
|
-
(for ([i u32 0]) (< i count) (+= i 1) (copy-into! a (
|
|
673
|
-
(set! items
|
|
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 (
|
|
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 (
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
-
(
|
|
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
|
|
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
|
|
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
|
|
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 (
|
|
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
|
|
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 (
|
|
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
|
|
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))
|