substrate-lang 0.9.3 → 0.9.4

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 (136) hide show
  1. package/build/compiler/binary.cdd2ffb408dd@0+0.wasm +0 -0
  2. package/build/compiler/checker.2b0ea87ed311@0+0.wasm +0 -0
  3. package/build/compiler/compile.da85f9bc4478@0+0.wasm +0 -0
  4. package/build/compiler/{core.fc3dab9d1846@0+0.wasm → core.0410ffbdc488@0+0.wasm} +0 -0
  5. package/build/compiler/expander.80707e1666d6@0+0.wasm +0 -0
  6. package/build/compiler/{fs.563034be70c3@0+0.wasm → fs.5017b627cbd2@0+0.wasm} +0 -0
  7. package/build/compiler/{leb128.748b1c37277a@0+0.wasm → leb128.ba77430f659f@0+0.wasm} +0 -0
  8. package/build/compiler/{link.11b643d35670@0+0.wasm → link.be6e641afa93@0+0.wasm} +0 -0
  9. package/build/compiler/{macros.4083601c00db@0+0.wasm → macros.b695763c0ca3@0+0.wasm} +0 -0
  10. package/build/compiler/{main.ed62cce43000@0+0.wasm → main.cbbdf42e34c2@0+0.wasm} +0 -0
  11. package/build/compiler/{ops.b361e858d8e1@0+0.wasm → ops.324f0a665fab@0+0.wasm} +0 -0
  12. package/build/compiler/{path.dcc4712bcc7b@0+0.wasm → path.1b5fd988b6f3@0+0.wasm} +0 -0
  13. package/build/compiler/program +21 -21
  14. package/build/compiler/prune.29dde307bdee@0+0.wasm +0 -0
  15. package/build/compiler/{reader.b535e61f99f4@0+0.wasm → reader.d256e69e09e2@0+0.wasm} +0 -0
  16. package/build/compiler/{roots.6d2942578055@0+0.wasm → roots.e366210c01d6@0+0.wasm} +0 -0
  17. package/build/compiler/{running.d73f7826cb74@0+0.wasm → running.b99787c2d180@0+0.wasm} +0 -0
  18. package/build/compiler/serialize.a12536bbbe9a@0+0.wasm +0 -0
  19. package/build/compiler/{sha256.5fc9d60f8bb2@0+0.wasm → sha256.f6c742932dde@0+0.wasm} +0 -0
  20. package/build/compiler/{substrate.4c780d6dd6d4@0+0.wasm → substrate.728c690187f2@0+0.wasm} +0 -0
  21. package/build/compiler/syntax.fadc832db29f@0+0.wasm +0 -0
  22. package/build/compiler/{writer.806bc85aa684@0+0.wasm → writer.550227768eb9@0+0.wasm} +0 -0
  23. package/build/sub/{base64.8fba03e1be0a@0+0.wasm → base64.454b045156d2@0+0.wasm} +0 -0
  24. package/build/sub/build.115aeefc15e8@0+0.wasm +0 -0
  25. package/build/sub/{chromium.e4db7d29897c@0+0.wasm → chromium.fc0bfea0fbe6@0+0.wasm} +0 -0
  26. package/build/sub/{common.91ddee6b7a67@0+0.wasm → common.997c21b0b8cf@0+0.wasm} +0 -0
  27. package/build/sub/deflate.3138a38325a1@0+0.wasm +0 -0
  28. package/build/sub/{doc.0b48bbac404b@0+0.wasm → doc.e3f9a998cd91@0+0.wasm} +0 -0
  29. package/build/sub/{doc.566f9861828e@0+0.wasm → doc.f18ad14060e9@0+0.wasm} +0 -0
  30. package/build/sub/env.861d55fff974@0+0.wasm +0 -0
  31. package/build/sub/events.2c981f6f1ec7@0+0.wasm +0 -0
  32. package/build/sub/{fetch.5d2f427c995e@0+0.wasm → fetch.b0ce8f8b3da8@0+0.wasm} +0 -0
  33. package/build/sub/fetch.d62aa5fc9623@0+0.wasm +0 -0
  34. package/build/sub/{files.30e55182c5df@0+0.wasm → files.1706cc0941c0@0+0.wasm} +0 -0
  35. package/build/sub/{fs.563034be70c3@0+0.wasm → fs.5017b627cbd2@0+0.wasm} +0 -0
  36. package/build/sub/{git.48aefa1644be@0+0.wasm → git.1c5791236e35@0+0.wasm} +0 -0
  37. package/build/sub/{grants.5bf25700d47c@0+0.wasm → grants.cd99dff2854e@0+0.wasm} +0 -0
  38. package/build/sub/{gzip.69588e97c35a@0+0.wasm → gzip.9ebea150f218@0+0.wasm} +0 -0
  39. package/build/sub/hash.ba8330dad9ff@0+0.wasm +0 -0
  40. package/build/sub/{html.20baa1dc7ca6@0+0.wasm → html.0b0362932a75@0+0.wasm} +0 -0
  41. package/build/sub/{html.c1671a102b4d@0+0.wasm → html.3b3c8d7d9971@0+0.wasm} +0 -0
  42. package/build/sub/{inflate.8899e0933792@0+0.wasm → inflate.3cfa17586072@0+0.wasm} +0 -0
  43. package/build/sub/{json.f15a29d99d8d@0+0.wasm → json.af2e0ae20084@0+0.wasm} +0 -0
  44. package/build/sub/manifest.6e014ac19e5d@0+0.wasm +0 -0
  45. package/build/sub/map.e582eae03ec2@0+0.wasm +0 -0
  46. package/build/sub/{pack.55992e8cc09c@0+0.wasm → pack.4295e4f5bdbd@0+0.wasm} +0 -0
  47. package/build/sub/{path.dcc4712bcc7b@0+0.wasm → path.1b5fd988b6f3@0+0.wasm} +0 -0
  48. package/build/sub/path.de22f6659534@0+0.wasm +0 -0
  49. package/build/sub/process.ca10ac0b8a62@0+0.wasm +0 -0
  50. package/build/sub/program +48 -48
  51. package/build/sub/read.279fafcda508@0+0.wasm +0 -0
  52. package/build/sub/{reader.b535e61f99f4@0+0.wasm → reader.d256e69e09e2@0+0.wasm} +0 -0
  53. package/build/sub/{root.9b713ec588c1@0+0.wasm → root.02141d04d568@0+0.wasm} +0 -0
  54. package/build/sub/{roots.6d2942578055@0+0.wasm → roots.e366210c01d6@0+0.wasm} +0 -0
  55. package/build/sub/{sha256.5fc9d60f8bb2@0+0.wasm → sha256.f6c742932dde@0+0.wasm} +0 -0
  56. package/build/sub/{sha512.b988b9dc6114@0+0.wasm → sha512.9fee24e95460@0+0.wasm} +0 -0
  57. package/build/sub/site.76aa8286c257@0+0.wasm +0 -0
  58. package/build/sub/{site.7c6d8c7747af@0+0.wasm → site.e6e415bc3170@0+0.wasm} +0 -0
  59. package/build/sub/{store.d4e845ff24ac@0+0.wasm → store.c48db3345968@0+0.wasm} +0 -0
  60. package/build/sub/{stream.4c07247477f7@0+0.wasm → stream.27fd2fe858e1@0+0.wasm} +0 -0
  61. package/build/sub/{sub.b57e17b6876b@0+0.wasm → sub.c0fb7310de12@0+0.wasm} +0 -0
  62. package/build/sub/{substrate.4c780d6dd6d4@0+0.wasm → substrate.728c690187f2@0+0.wasm} +0 -0
  63. package/build/sub/{syntax.9857f6784d63@0+0.wasm → syntax.fadc832db29f@0+0.wasm} +0 -0
  64. package/build/sub/tar.692c0e8827cd@0+0.wasm +0 -0
  65. package/build/sub/{test.0d9c079bb309@0+0.wasm → test.1fd2ff8123bf@0+0.wasm} +0 -0
  66. package/build/sub/{text.4ab70ac35b5a@0+0.wasm → text.8ff142d72fd7@0+0.wasm} +0 -0
  67. package/build/sub/{timer.3809bb17a7a1@0+0.wasm → timer.d3454726b3bf@0+0.wasm} +0 -0
  68. package/build/sub/{upgrade.18a5aa0dae89@0+0.wasm → upgrade.2a9219e6a45d@0+0.wasm} +0 -0
  69. package/build/sub/{utf8.524c475ecd40@0+0.wasm → utf8.e82afeb9e953@0+0.wasm} +0 -0
  70. package/build/sub/worker.ea1e11f8f5e2@0+0.wasm +0 -0
  71. package/build/sub/writer.550227768eb9@0+0.wasm +0 -0
  72. package/package.json +1 -1
  73. package/std/archive/tar.sub +14 -21
  74. package/std/compress/deflate.sub +10 -12
  75. package/std/encoding/json.sub +44 -65
  76. package/std/encoding/wire.sub +6 -8
  77. package/std/http/checks.sub +3 -3
  78. package/std/http/conditional.sub +2 -4
  79. package/std/http/cookie.sub +5 -7
  80. package/std/http/form.sub +7 -10
  81. package/std/http/http.sub +17 -24
  82. package/std/http/multipart.sub +5 -5
  83. package/std/http/route.sub +9 -9
  84. package/std/http/server.sub +7 -12
  85. package/std/http/session.sub +1 -4
  86. package/std/http/sse-client.sub +9 -14
  87. package/std/http/url.sub +10 -10
  88. package/std/http/websocket.sub +2 -5
  89. package/std/meta/type-info.sub +10 -10
  90. package/std/package/hash.sub +1 -1
  91. package/std/package/manifest.sub +14 -15
  92. package/std/package/map.sub +4 -8
  93. package/std/package/path.sub +1 -4
  94. package/std/package/read.sub +3 -8
  95. package/std/package/site.sub +5 -5
  96. package/std/test/compare.sub +9 -10
  97. package/std/test/page.sub +1 -1
  98. package/std/test/run.sub +1 -1
  99. package/std/test/test.sub +24 -17
  100. package/substrate/VERSION +1 -1
  101. package/substrate/compiler/binary.sub +5 -14
  102. package/substrate/compiler/checker.sub +204 -19
  103. package/substrate/compiler/compile.sub +8 -8
  104. package/substrate/compiler/expander.sub +21 -29
  105. package/substrate/compiler/link.sub +2 -2
  106. package/substrate/compiler/ops.sub +1 -1
  107. package/substrate/compiler/prune.sub +12 -17
  108. package/substrate/compiler/roots.sub +3 -2
  109. package/substrate/compiler/serialize.sub +1 -1
  110. package/substrate/compiler/substrate.sub +8 -13
  111. package/substrate/compiler/syntax.sub +8 -21
  112. package/substrate/host/fs.sub +8 -11
  113. package/substrate/host/grants.sub +25 -26
  114. package/substrate/host/node/process.sub +5 -6
  115. package/build/compiler/binary.3823f89ce414@0+0.wasm +0 -0
  116. package/build/compiler/checker.592d37dcbec9@0+0.wasm +0 -0
  117. package/build/compiler/compile.86a2b03b0c9b@0+0.wasm +0 -0
  118. package/build/compiler/expander.689d326e5a1b@0+0.wasm +0 -0
  119. package/build/compiler/prune.d4a3f9834095@0+0.wasm +0 -0
  120. package/build/compiler/serialize.b2196de75bc8@0+0.wasm +0 -0
  121. package/build/compiler/syntax.9857f6784d63@0+0.wasm +0 -0
  122. package/build/sub/build.84ac996eda63@0+0.wasm +0 -0
  123. package/build/sub/deflate.fc8075e3aed1@0+0.wasm +0 -0
  124. package/build/sub/env.f051f8166526@0+0.wasm +0 -0
  125. package/build/sub/events.f952172735e0@0+0.wasm +0 -0
  126. package/build/sub/fetch.097f1cc9502d@0+0.wasm +0 -0
  127. package/build/sub/hash.3f0d118da63f@0+0.wasm +0 -0
  128. package/build/sub/manifest.cf7471880377@0+0.wasm +0 -0
  129. package/build/sub/map.dc516eec27ff@0+0.wasm +0 -0
  130. package/build/sub/path.b7a8e1cf3aaa@0+0.wasm +0 -0
  131. package/build/sub/process.aea2c88cb7a0@0+0.wasm +0 -0
  132. package/build/sub/read.cd1e693f4fb4@0+0.wasm +0 -0
  133. package/build/sub/site.81548474c323@0+0.wasm +0 -0
  134. package/build/sub/tar.e482cf873cfc@0+0.wasm +0 -0
  135. package/build/sub/worker.f1190de21b21@0+0.wasm +0 -0
  136. package/build/sub/writer.806bc85aa684@0+0.wasm +0 -0
@@ -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
 
@@ -26,36 +26,20 @@
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)
@@ -72,7 +56,7 @@
72
56
 
73
57
  (define (json-reader-free! [r (ptr json-reader)]) (buffer-free! (& (-> r scratch))))
74
58
 
75
- (define (json-next! [r (ptr json-reader)]) -> u32
59
+ (define (json-next! [r (ptr json-reader)]) -> json-token
76
60
  (let ([s (-> r state)] [c (space! r)])
77
61
  (cond [(or (== s array-value) (== s object-value))
78
62
  (cond [(== c #\,)
@@ -121,7 +105,7 @@
121
105
  (set! (-> r at) i)
122
106
  256))
123
107
 
124
- (define (value! [r (ptr json-reader)] [c u32]) -> u32
108
+ (define (value! [r (ptr json-reader)] [c u32]) -> json-token
125
109
  (cond [(== c #\")
126
110
  (+= (-> r at) 1)
127
111
  (if (string! r) (after-value! r json-token-string) json-token-error)]
@@ -134,7 +118,7 @@
134
118
  [(== c 256) (if (== (-> r depth) 0) (fail! r "the text has no value") (ended! r))]
135
119
  [else (fail! r "expected a value")]))
136
120
 
137
- (define (word! [r (ptr json-reader)] [w string] [t u32]) -> u32
121
+ (define (word! [r (ptr json-reader)] [w string] [t json-token]) -> json-token
138
122
  (let ([end (+ (-> r at) (-> w length))])
139
123
  (if (and (<= end (-> r text length)) (== (memcmp (+ (-> r text bytes) (-> r at)) (-> w bytes) (-> w length)) 0))
140
124
  (begin
@@ -142,13 +126,13 @@
142
126
  (after-value! r t))
143
127
  (fail! r "expected a value"))))
144
128
 
145
- (define (after-value! [r (ptr json-reader)] [t u32]) -> u32
129
+ (define (after-value! [r (ptr json-reader)] [t json-token]) -> json-token
146
130
  (set! (-> r state) (cond [(== (-> r depth) 0) top-end]
147
131
  [(== (@ (-> r kinds) (- (-> r depth) 1)) 1) array-value]
148
132
  [else object-value]))
149
133
  t)
150
134
 
151
- (define (open! [r (ptr json-reader)] [kind u32] [t u32]) -> u32
135
+ (define (open! [r (ptr json-reader)] [kind u32] [t json-token]) -> json-token
152
136
  (when (== (-> r depth) depth-limit) (return (fail! r "nested too deeply")))
153
137
  (set! (@ (-> r kinds) (-> r depth)) kind)
154
138
  (+= (-> r depth) 1)
@@ -156,14 +140,14 @@
156
140
  (set! (-> r state) (if (== kind 1) array-start object-start))
157
141
  t)
158
142
 
159
- (define (close! [r (ptr json-reader)]) -> u32
143
+ (define (close! [r (ptr json-reader)]) -> json-token
160
144
  (-= (-> r depth) 1)
161
145
  (after-value! r (if (== (@ (-> r kinds) (-> r depth)) 1) json-token-end-array json-token-end-object)))
162
146
 
163
- (define (ended! [r (ptr json-reader)]) -> u32
147
+ (define (ended! [r (ptr json-reader)]) -> json-token
164
148
  (fail! r (if (== (@ (-> r kinds) (- (-> r depth) 1)) 1) "the text ends inside an array" "the text ends inside an object")))
165
149
 
166
- (define (fail! [r (ptr json-reader)] [message string]) -> u32
150
+ (define (fail! [r (ptr json-reader)] [message string]) -> json-token
167
151
  (let ([p (-> r text bytes)] [line u32 1] [from u32 0])
168
152
  (for ([i u32 0]) (< i (-> r at)) (+= i 1)
169
153
  (when (== (@ p i) 10)
@@ -320,14 +304,11 @@
320
304
 
321
305
  ;; ---- parsing ----
322
306
 
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))))
307
+ (define (arena-text [a (ptr arena)] [s string]) -> string (copy a s))
327
308
 
328
309
  (define (json-parse [a (ptr arena)] [text string] [err (ptr json-error)]) -> (ptr json-value)
329
310
  (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])
311
+ [root (ptr json-value) 0] [t json-token] [v json-value (json-null)] [k u32 0] [m json-member] [placed #f])
331
312
  (json-reader-start! (& r) text)
332
313
  (while #t
333
314
  (set! t (json-next! (& r)))
@@ -369,7 +350,7 @@
369
350
  (break)])
370
351
  (when placed
371
352
  (cond [(== (-> r depth) 0)
372
- (set! root (cast (ptr json-value) (arena-alloc a (sizeof json-value))))
353
+ (set! root (new a json-value))
373
354
  (set! (@ root) v)]
374
355
  [(== (@ (-> r kinds) (- (-> r depth) 1)) 1)
375
356
  (buffer-add! (& values) (slice (cast (ptr u8) (& v)) (sizeof json-value)))]
@@ -383,9 +364,7 @@
383
364
 
384
365
  ;; The k items of size bytes from index from of bytes, copied into a, or 0 for none.
385
366
  (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))))
367
+ (if (== k 0) 0 (-> (copy a (slice (+ bytes (* from size)) (* k size))) items)))
389
368
 
390
369
  ;; ---- writing ----
391
370
 
@@ -597,7 +576,7 @@
597
576
  (when (> i count) (return #f))
598
577
  (when (== count room)
599
578
  (set! room (if (== room 0) 4 (* 2 room)))
600
- (let ([q (cast (ptr json-value) (arena-alloc a (* room (sizeof json-value))))])
579
+ (let ([q (-> (new a json-value room) items)])
601
580
  (when (> count 0) (memcpy q p (* count (sizeof json-value))))
602
581
  (set! p q)))
603
582
  (memcpy (+ p i 1) (+ p i) (* (- count i) (sizeof json-value)))
@@ -613,7 +592,7 @@
613
592
  (let ([p (-> members items)] [count (-> members length)])
614
593
  (when (== count room)
615
594
  (set! room (if (== room 0) 4 (* 2 room)))
616
- (let ([q (cast (ptr json-member) (arena-alloc a (* room (sizeof json-member))))])
595
+ (let ([q (-> (new a json-member room) items)])
617
596
  (when (> count 0) (memcpy q p (* count (sizeof json-member))))
618
597
  (set! p q)))
619
598
  (let ([m (+ p count)])
@@ -660,7 +639,7 @@
660
639
  [_ #f]))
661
640
 
662
641
  (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)))])
642
+ (let ([out (new a json-value)])
664
643
  (copy-into! a out v)
665
644
  out))
666
645
 
@@ -668,17 +647,17 @@
668
647
  (if (== v 0) (set! (@ out) (json-null)) (set! (@ out) (@ v)))
669
648
  (match out
670
649
  [(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))
650
+ (let* ([count (-> items length)] [p (new a json-value count)])
651
+ (for ([i u32 0]) (< i count) (+= i 1) (copy-into! a (& (@ p i)) (& (@ items i))))
652
+ (set! items p)
674
653
  (set! room count))]
675
654
  [(json-object members room)
676
- (let* ([count (-> members length)] [p (cast (ptr json-member) (arena-alloc a (* count (sizeof json-member))))])
655
+ (let* ([count (-> members length)] [p (new a json-member count)])
677
656
  (for ([i u32 0]) (< i count) (+= i 1)
678
- (let ([m (& (@ members i))] [q (+ p i)])
657
+ (let ([m (& (@ members i))] [q (& (@ p i))])
679
658
  (set! (-> q key) (arena-text a (-> m key)))
680
659
  (copy-into! a (& (-> q value)) (& (-> m value)))))
681
- (set! members (slice p count))
660
+ (set! members p)
682
661
  (set! room count))]
683
662
  [_ (own! a out)]))
684
663
 
@@ -709,17 +688,17 @@
709
688
 
710
689
  ;; ---- reading into types ----
711
690
 
712
- (define (expect! [r (ptr json-reader)] [t u32] [want u32] [message string]) -> bool
691
+ (define (expect! [r (ptr json-reader)] [t json-token] [want json-token] [message string]) -> bool
713
692
  (cond [(== t want) #t]
714
693
  [(== t json-token-error) #f]
715
694
  [else (reject! r message)]))
716
695
 
717
- (define (take-unsigned! [r (ptr json-reader)] [t u32] [most u64] [to (ptr u64)]) -> bool
696
+ (define (take-unsigned! [r (ptr json-reader)] [t json-token] [most u64] [to (ptr u64)]) -> bool
718
697
  (and (expect! r t json-token-number "expected a number")
719
698
  (or (and (digits? (-> r token) 10) (digits-integer (-> r token) 10 #f to) (<= (@ to) most))
720
699
  (reject! r "expected an integer within the field's type"))))
721
700
 
722
- (define (take-signed! [r (ptr json-reader)] [t u32] [least i64] [most i64] [to (ptr i64)]) -> bool
701
+ (define (take-signed! [r (ptr json-reader)] [t json-token] [least i64] [most i64] [to (ptr i64)]) -> bool
723
702
  (unless (expect! r t json-token-number "expected a number") (return #f))
724
703
  (let* ([negative (== (@ (-> r token) 0) #\-)] [digits (slice (-> r token) (if negative 1 0))] [k u64 0])
725
704
  (or (and (digits? digits 10) (digits-integer digits 10 negative (& k))
@@ -727,16 +706,16 @@
727
706
  (begin (set! (@ to) (cast i64 k)) #t))
728
707
  (reject! r "expected an integer within the field's type"))))
729
708
 
730
- (define (take-float! [r (ptr json-reader)] [t u32] [to (ptr f64)]) -> bool
709
+ (define (take-float! [r (ptr json-reader)] [t json-token] [to (ptr f64)]) -> bool
731
710
  (and (expect! r t json-token-number "expected a number")
732
711
  (begin (set! (@ to) (-> r number)) #t)))
733
712
 
734
- (define (take-bool! [r (ptr json-reader)] [t u32] [to (ptr bool)]) -> bool
713
+ (define (take-bool! [r (ptr json-reader)] [t json-token] [to (ptr bool)]) -> bool
735
714
  (cond [(== t json-token-true) (set! (@ to) #t) #t]
736
715
  [(== t json-token-false) (set! (@ to) #f) #t]
737
716
  [else (expect! r t json-token-true "expected true or false")]))
738
717
 
739
- (define (take-text! [r (ptr json-reader)] [a (ptr arena)] [t u32] [to (ptr string)]) -> bool
718
+ (define (take-text! [r (ptr json-reader)] [a (ptr arena)] [t json-token] [to (ptr string)]) -> bool
740
719
  (and (expect! r t json-token-string "expected a string")
741
720
  (begin (set! (@ to) (arena-text a (-> r token))) #t)))
742
721
 
@@ -786,7 +765,7 @@
786
765
  (define (struct-code [t datum] [fields datum]) -> datum
787
766
  `(,#`(define (#,(derive-name t '"json-write!") [b (ptr buffer)] [v (ptr #,t)])
788
767
  #,@(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
768
+ ,#`(define (#,(derive-name t '"json-read-from!") [r (ptr json-reader)] [a (ptr arena)] [token json-token] [v (ptr #,t)]) -> bool
790
769
  #,(object-read #`token fields (for/list ([f fields]) #`(-> v #,(car f))))
791
770
  #t)
792
771
  ,(entry t)))
@@ -812,7 +791,7 @@
812
791
  objects))))))
813
792
  `(,#`(define (#,(derive-name t '"json-write!") [b (ptr buffer)] [v (ptr #,t)])
814
793
  (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
794
+ ,#`(define (#,(derive-name t '"json-read-from!") [r (ptr json-reader)] [a (ptr arena)] [token json-token] [v (ptr #,t)]) -> bool
816
795
  (cond [(== token json-token-string)
817
796
  (cond #,@(reverse names)
818
797
  [else (return (reject! r "unknown case"))])]
@@ -861,7 +840,7 @@
861
840
  (return (reject! r #,(literal (format "missing field ~a" `(,(syntax-e (car f))))))))
862
841
  checks))))
863
842
  (+= i 1))
864
- #`(let ([#,seen (array bool #,n)] [#,k u32 0])
843
+ #`(let ([#,seen (array bool #,n)] [#,k json-token])
865
844
  (memset #,seen 0 #,n)
866
845
  #,@(reverse defaults)
867
846
  (unless (expect! r #,token json-token-start-object "expected an object") (return #f))
@@ -918,20 +897,20 @@
918
897
  (let ([q (derive-fresh 'q)] [e (type-syntax (cadr type))])
919
898
  #`(if (== #,u json-token-null)
920
899
  (set! #,p 0)
921
- (let ([#,q (cast (ptr #,e) (arena-alloc a (sizeof #,e)))])
900
+ (let ([#,q (new a #,e)])
922
901
  #,(read-code (cadr type) #`(@ #,q) where u)
923
902
  (set! #,p #,q))))]
924
903
  [(== (car type) 'slice)
925
904
  (let ([items (derive-fresh 'items)] [count (derive-fresh 'count)] [room (derive-fresh 'room)] [w (derive-fresh 'w)]
926
905
  [more (derive-fresh 'more)] [e (type-syntax (cadr type))])
927
- #`(let ([#,items (ptr #,e) 0] [#,count u32 0] [#,room u32 0] [#,w u32 0])
906
+ #`(let ([#,items (ptr #,e) 0] [#,count u32 0] [#,room u32 0] [#,w json-token])
928
907
  (unless (expect! r #,u json-token-start-array "expected an array") (return #f))
929
908
  (while #t
930
909
  (set! #,w (json-next! r))
931
910
  (when (== #,w json-token-end-array) (break))
932
911
  (when (== #,count #,room)
933
912
  (set! #,room (if (== #,room 0) 4 (* 2 #,room)))
934
- (let ([#,more (cast (ptr #,e) (arena-alloc a (* #,room (sizeof #,e))))])
913
+ (let ([#,more (-> (new a #,e #,room) items)])
935
914
  (when (> #,count 0) (memcpy #,more #,items (* #,count (sizeof #,e))))
936
915
  (set! #,items #,more)))
937
916
  #,(read-code (cadr type) #`(@ #,items #,count) where w)
@@ -940,7 +919,7 @@
940
919
  [(== (car type) 'array)
941
920
  (let ([i (derive-fresh 'i)] [w (derive-fresh 'w)] [n (literal (caddr type))]
942
921
  [message (literal (format "expected an array of ~a items" `(,(caddr type))))])
943
- #`(let ([#,w u32 0])
922
+ #`(let ([#,w json-token])
944
923
  (unless (expect! r #,u json-token-start-array "expected an array") (return #f))
945
924
  (for ([#,i u32 0]) (< #,i #,n) (+= #,i 1)
946
925
  (set! #,w (json-next! r))
@@ -96,11 +96,9 @@
96
96
  (unless (take-count! r (& n)) (return #f))
97
97
  (let ([s (slice (-> r bytes) (-> r at) (+ (-> r at) n))])
98
98
  (unless (utf-8? s) (return (refuse! r start "a string is not UTF-8")))
99
- (let ([p (cast (ptr u8) (arena-alloc a n))])
100
- (memcpy p (-> s items) n)
101
- (set! (@ to) (cast string (slice p n)))
102
- (+= (-> r at) n)
103
- #t))))
99
+ (set! (@ to) (cast string (copy a s)))
100
+ (+= (-> r at) n)
101
+ #t)))
104
102
 
105
103
  ;; ---- the wire form ----
106
104
 
@@ -210,7 +208,7 @@
210
208
  #`(let ([#,present #f])
211
209
  (unless (take-flag! r (& #,present) "an option's tag is neither 0 nor 1") (return #f))
212
210
  (if #,present
213
- (let ([#,q (cast (ptr #,u) (arena-alloc a (sizeof #,u)))])
211
+ (let ([#,q (new a #,u)])
214
212
  #,(read-code (cadr type) #`(@ #,q) where)
215
213
  (set! #,p #,q))
216
214
  (set! #,p 0))))]
@@ -218,9 +216,9 @@
218
216
  (let ([n (derive-fresh 'n)] [items (derive-fresh 'items)] [i (derive-fresh 'i)] [u (type-syntax (cadr type))])
219
217
  #`(let ([#,n u32 0])
220
218
  (unless (take-count! r (& #,n)) (return #f))
221
- (let ([#,items (cast (ptr #,u) (arena-alloc a (* #,n (sizeof #,u))))])
219
+ (let ([#,items (new a #,u #,n)])
222
220
  (for ([#,i u32 0]) (< #,i #,n) (+= #,i 1) #,(read-code (cadr type) #`(@ #,items #,i) where))
223
- (set! #,p (slice #,items #,n)))))]
221
+ (set! #,p #,items))))]
224
222
  [(== (car type) 'array)
225
223
  (let ([i (derive-fresh 'i)])
226
224
  #`(for ([#,i u32 0]) (< #,i #,(literal (caddr type))) (+= #,i 1)
@@ -200,12 +200,12 @@
200
200
 
201
201
  ;; The table starts with 64 buckets and doubles, up to most, when three quarters full.
202
202
  (define (grow! [l (ptr http-limit)] [size u32])
203
- (let ([old (-> l buckets)] [n (-> l size)] [new (cast (ptr bucket) (calloc size (sizeof bucket)))])
203
+ (let ([old (-> l buckets)] [n (-> l size)] [more (-> (new 0 bucket size) items)])
204
204
  (for ([i u32 0]) (< i n) (+= i 1)
205
205
  (let ([b (& (@ old i))])
206
- (when (-> b used) (memcpy (slot new size (slice (cast (ptr u8) (-> b key)) (-> b length))) b (sizeof bucket)))))
206
+ (when (-> b used) (memcpy (slot more size (slice (cast (ptr u8) (-> b key)) (-> b length))) b (sizeof bucket)))))
207
207
  (free old)
208
- (set! (-> l buckets) new)
208
+ (set! (-> l buckets) more)
209
209
  (set! (-> l size) size)))
210
210
 
211
211
  (define (bucket-of [l (ptr http-limit)] [key (slice u8)]) -> (ptr bucket)
@@ -53,13 +53,11 @@
53
53
  (define (second-of [ms f64]) -> f64 (* (floor (/ ms 1000.0)) 1000.0))
54
54
 
55
55
  (define (http-conditional! [r (ptr http-request)] [etag string] [modified f64]) -> bool
56
- (let* ([a (& (-> r arena))] [copy (cast (ptr u8) (arena-alloc a (-> etag length)))]
57
- [read? (or (== (-> r method) "GET") (== (-> r method) "HEAD"))]
56
+ (let* ([a (& (-> r arena))] [read? (or (== (-> r method) "GET") (== (-> r method) "HEAD"))]
58
57
  [if-match (http-request-header r "if-match")] [if-none-match (http-request-header r "if-none-match")]
59
58
  [unmodified (date-of r "if-unmodified-since")] [since (date-of r "if-modified-since")]
60
59
  [changed (second-of modified)] [status i32 0])
61
- (memcpy copy (-> etag bytes) (-> etag length))
62
- (set! (-> r etag) (cast string (slice copy (-> etag length))))
60
+ (set! (-> r etag) (copy a etag))
63
61
  (set! (-> r modified) modified)
64
62
  (cond [(> (-> if-match length) 0) (unless (matches? if-match etag #t) (set! status 412))]
65
63
  [(and (>= unmodified 0.0) (> modified 0.0) (> changed unmodified)) (set! status 412)])
@@ -3,16 +3,14 @@
3
3
  (require-unqualified "http.sub")
4
4
  (require-unqualified "server.sub")
5
5
 
6
- (provide http-cookie http-request-cookie http-set-cookie! http-same-site-lax http-same-site-strict
7
- http-same-site-none)
6
+ (provide http-cookie http-request-cookie http-set-cookie! http-same-site http-same-site-default http-same-site-lax
7
+ http-same-site-strict http-same-site-none)
8
8
 
9
- (const http-same-site-lax i32 1)
10
- (const http-same-site-strict i32 2)
11
- (const http-same-site-none i32 3)
9
+ (enum http-same-site http-same-site-default http-same-site-lax http-same-site-strict http-same-site-none)
12
10
 
13
- ;; max-age is in seconds: 0 leaves it out, and below 0 ends the cookie now. same-site 0 leaves it out.
11
+ ;; max-age is in seconds: 0 leaves it out, and below 0 ends the cookie now. http-same-site-default leaves SameSite out.
14
12
  (struct http-cookie [name string] [value string] [path string] [domain string] [max-age i64] [secure bool]
15
- [http-only bool] [same-site i32])
13
+ [http-only bool] [same-site http-same-site])
16
14
 
17
15
  (define separators string "()<>@,;:\\\"/[]?={}")
18
16
 
package/std/http/form.sub CHANGED
@@ -111,11 +111,11 @@
111
111
  (check! (cadr type) name)
112
112
  (let ([e (type-syntax (cadr type))])
113
113
  (if (upload? (cadr type))
114
- #`(let ([#,q (cast (ptr http-upload) (arena-alloc a (sizeof http-upload)))])
114
+ #`(let ([#,q (new a http-upload)])
115
115
  (set! #,p (if (file parts #,key 0 #,q) #,q 0)))
116
116
  #`(let ([#,s string])
117
117
  (if (text pairs parts #,key 0 (& #,s))
118
- (let ([#,q (cast (ptr #,e) (arena-alloc a (sizeof #,e)))])
118
+ (let ([#,q (new a #,e)])
119
119
  #,(value-code (cadr type) s #`(@ #,q) key)
120
120
  (set! #,p #,q))
121
121
  (set! #,p 0)))))]
@@ -123,17 +123,14 @@
123
123
  (check! (cadr type) name)
124
124
  (let ([e (type-syntax (cadr type))])
125
125
  (if (upload? (cadr type))
126
- #`(let* ([#,n (files parts #,key)]
127
- [#,items (cast (ptr http-upload) (arena-alloc a (* #,n (sizeof http-upload))))])
128
- (for ([#,k u32 0]) (< #,k #,n) (+= #,k 1) (file parts #,key #,k (+ #,items #,k)))
129
- (set! #,p (slice #,items #,n)))
130
- #`(let* ([#,n (texts pairs parts #,key)]
131
- [#,items (cast (ptr #,e) (arena-alloc a (* #,n (sizeof #,e))))]
132
- [#,s string])
126
+ #`(let* ([#,n (files parts #,key)] [#,items (new a http-upload #,n)])
127
+ (for ([#,k u32 0]) (< #,k #,n) (+= #,k 1) (file parts #,key #,k (& (@ #,items #,k))))
128
+ (set! #,p #,items))
129
+ #`(let* ([#,n (texts pairs parts #,key)] [#,items (new a #,e #,n)] [#,s string])
133
130
  (for ([#,k u32 0]) (< #,k #,n) (+= #,k 1)
134
131
  (text pairs parts #,key #,k (& #,s))
135
132
  #,(value-code (cadr type) s #`(@ #,items #,k) key))
136
- (set! #,p (slice #,items #,n)))))]
133
+ (set! #,p #,items))))]
137
134
  [(== type 'bool)
138
135
  #`(let ([#,s string])
139
136
  (if (text pairs parts #,key 0 (& #,s))
package/std/http/http.sub CHANGED
@@ -18,18 +18,11 @@
18
18
  (struct http-head [line buffer] [names (ptr string)] [values (ptr string)] [room u32] [count u32]
19
19
  [method string] [target string] [version string] [status i32] [reason string])
20
20
 
21
- (const state-head i32 0)
22
- (const state-length i32 1)
23
- (const state-chunk-size i32 2)
24
- (const state-chunk-data i32 3)
25
- (const state-chunk-end i32 4)
26
- (const state-trailers i32 5)
27
- (const state-until-close i32 6)
28
- (const state-stopped i32 7)
29
- (const state-refused i32 8)
30
- (const state-no-body i32 9)
31
-
32
- (struct http-parser [head http-head] [line buffer] [state i32] [remaining i64] [excess i64] [user (ptr void)]
21
+ (enum parser-state
22
+ state-head state-length state-chunk-size state-chunk-data state-chunk-end state-trailers state-until-close
23
+ state-stopped state-refused state-no-body)
24
+
25
+ (struct http-parser [head http-head] [line buffer] [state parser-state] [remaining i64] [excess i64] [user (ptr void)]
33
26
  [on-head (fn ((ptr http-parser)))] [on-body (fn ((ptr http-parser) (slice u8)))] [on-end (fn ((ptr http-parser)))])
34
27
 
35
28
  ;; ---- text ----
@@ -102,14 +95,14 @@
102
95
  (when (and (< i n) (== (@ value i) #\=))
103
96
  (+= i 1)
104
97
  (if (and (< i n) (== (@ value i) #\"))
105
- (let ([p (cast (ptr u8) (arena-alloc a (- n i)))] [k u32 0])
98
+ (let ([p (new a u8 (- n i))] [k u32 0])
106
99
  (+= i 1)
107
100
  (while (and (< i n) (!= (@ value i) #\"))
108
101
  (when (and (== (@ value i) #\\) (< (+ i 1) n)) (+= i 1))
109
102
  (set! (@ p k) (@ value i))
110
103
  (+= k 1)
111
104
  (+= i 1))
112
- (set! found (cast string (slice p k))))
105
+ (set! found (cast string (slice p 0 k))))
113
106
  (begin
114
107
  (set! start i)
115
108
  (while (and (< i n) (!= (@ value i) #\;)) (+= i 1))
@@ -201,22 +194,22 @@
201
194
 
202
195
  ;; to becomes a copy of from with its own text and room for just its headers, which http-head-free! frees.
203
196
  (define (http-head-copy! [to (ptr http-head)] [from (ptr http-head)])
204
- (let ([old (-> from line bytes)] [new (ptr u8) 0] [n (-> from count)])
197
+ (let ([old (-> from line bytes)] [text (ptr u8) 0] [n (-> from count)])
205
198
  (set! (-> to line) (make-buffer))
206
199
  (buffer-add! (& (-> to line)) (buffer-bytes (& (-> from line))))
207
- (set! new (-> to line bytes))
208
- (set! (-> to names) (cast (ptr string) (malloc (* n (sizeof string)))))
209
- (set! (-> to values) (cast (ptr string) (malloc (* n (sizeof string)))))
200
+ (set! text (-> to line bytes))
201
+ (set! (-> to names) (-> (new 0 string n) items))
202
+ (set! (-> to values) (-> (new 0 string n) items))
210
203
  (set! (-> to room) n)
211
204
  (for ([i u32 0]) (< i (-> from count)) (+= i 1)
212
- (set! (@ (-> to names) i) (moved (@ (-> from names) i) old new))
213
- (set! (@ (-> to values) i) (moved (@ (-> from values) i) old new)))
205
+ (set! (@ (-> to names) i) (moved (@ (-> from names) i) old text))
206
+ (set! (@ (-> to values) i) (moved (@ (-> from values) i) old text)))
214
207
  (set! (-> to count) (-> from count))
215
- (set! (-> to method) (moved (-> from method) old new))
216
- (set! (-> to target) (moved (-> from target) old new))
217
- (set! (-> to version) (moved (-> from version) old new))
208
+ (set! (-> to method) (moved (-> from method) old text))
209
+ (set! (-> to target) (moved (-> from target) old text))
210
+ (set! (-> to version) (moved (-> from version) old text))
218
211
  (set! (-> to status) (-> from status))
219
- (set! (-> to reason) (moved (-> from reason) old new))))
212
+ (set! (-> to reason) (moved (-> from reason) old text))))
220
213
 
221
214
  (define (moved [s string] [old (ptr u8)] [new (ptr u8)]) -> string
222
215
  (if (== (-> s length) 0) "" (cast string (slice (+ new (- (cast u32 (-> s bytes)) (cast u32 old))) (-> s length)))))
@@ -27,10 +27,10 @@
27
27
  -1))
28
28
 
29
29
  (define (joined [a (ptr arena)] [front string] [back string]) -> string
30
- (let ([p (cast (ptr u8) (arena-alloc a (+ (-> front length) (-> back length))))])
31
- (memcpy p (-> front bytes) (-> front length))
32
- (memcpy (+ p (-> front length)) (-> back bytes) (-> back length))
33
- (cast string (slice p (+ (-> front length) (-> back length))))))
30
+ (let ([p (new a u8 (+ (-> front length) (-> back length)))])
31
+ (memcpy (-> p items) (-> front bytes) (-> front length))
32
+ (memcpy (+ (-> p items) (-> front length)) (-> back bytes) (-> back length))
33
+ (cast string p)))
34
34
 
35
35
  (define (base-name [s string]) -> string
36
36
  (let ([i (-> s length)])
@@ -97,7 +97,7 @@
97
97
  (when (> (-> part name length) 0)
98
98
  (when (== count room)
99
99
  (set! room (if (== room 0) 4 (* 2 room)))
100
- (let ([more (cast (ptr multipart-part) (arena-alloc a (* room (sizeof multipart-part))))])
100
+ (let ([more (-> (new a multipart-part room) items)])
101
101
  (when (> count 0) (memcpy more items (* count (sizeof multipart-part))))
102
102
  (set! items more)))
103
103
  (set! (@ items count) part)
@@ -18,20 +18,20 @@
18
18
  (define (route-rest [a (ptr arena)] [segments (slice string)] [i u32]) -> string
19
19
  (let ([n u32 0] [at u32 0])
20
20
  (for ([k u32 i]) (< k (-> segments length)) (+= k 1) (+= n (+ (-> (@ segments k) length) 1)))
21
- (let ([p (cast (ptr u8) (arena-alloc a n))])
21
+ (let ([p (new a u8 n)])
22
22
  (for ([k u32 i]) (< k (-> segments length)) (+= k 1)
23
23
  (when (> k i)
24
24
  (set! (@ p at) #\/)
25
25
  (+= at 1))
26
- (memcpy (+ p at) (-> (@ segments k) bytes) (-> (@ segments k) length))
26
+ (memcpy (+ (-> p items) at) (-> (@ segments k) bytes) (-> (@ segments k) length))
27
27
  (+= at (-> (@ segments k) length)))
28
- (cast string (slice p at)))))
28
+ (cast string (slice p 0 at)))))
29
29
 
30
30
  (define (route-slashed [a (ptr arena)] [segments (slice string)]) -> (slice string)
31
- (let* ([n (-> segments length)] [items (cast (ptr string) (arena-alloc a (* (+ n 1) (sizeof string))))])
31
+ (let* ([n (-> segments length)] [items (new a string (+ n 1))])
32
32
  (for ([i u32 0]) (< i n) (+= i 1) (set! (@ items i) (@ segments i)))
33
33
  (set! (@ items n) "")
34
- (slice items (+ n 1))))
34
+ items))
35
35
 
36
36
  (define (route-moved! [r (ptr http-request)] [path string])
37
37
  (let ([b (make-buffer)] [target (-> r target)])
@@ -440,7 +440,7 @@
440
440
  #,@(if (== body 0)
441
441
  `(,#`(unless (route-typed? r #,(literal (boolean (!= json 0)))) (return)))
442
442
  nil)
443
- (let ([#,args (cast (ptr #,given) (arena-alloc (& (-> r arena)) (sizeof #,given)))])
443
+ (let ([#,args (new (& (-> r arena)) #,given)])
444
444
  #,@(for/list ([x values]) #`(set! (-> #,args #,x) #,x))
445
445
  (set! (-> r route) (cast (ptr void) #,args))
446
446
  (http-read-body! r #,(if (== limit 0) (number 0) limit) #,read)))
@@ -448,7 +448,7 @@
448
448
  [start #`(define (#,(start-of r) [r (ptr http-request)] #,@(formals ps))
449
449
  #,(if (== query 0)
450
450
  ending
451
- #`(let ([#,q (cast (ptr #,query) (arena-alloc (& (-> r arena)) (sizeof #,query)))]
451
+ #`(let ([#,q (new (& (-> r arena)) #,query)]
452
452
  [#,e form-error])
453
453
  (unless (#,(derived query '"form-read" 'form where) (& (-> r arena))
454
454
  (url-form-parse (& (-> r arena)) (url-query (-> r target))) no-parts #,q
@@ -462,14 +462,14 @@
462
462
  (let* ([#,args (cast (ptr #,given) (-> r route))] #,@(for/list ([x values]) #`[#,x (-> #,args #,x)]))
463
463
  #,(cond [(!= body 0) (handler-call handler values `(,#'bytes))]
464
464
  [(!= json 0)
465
- #`(let ([#,value (cast (ptr #,json) (arena-alloc (& (-> r arena)) (sizeof #,json)))]
465
+ #`(let ([#,value (new (& (-> r arena)) #,json)]
466
466
  [#,e json-error])
467
467
  (unless (#,(derived json '"json-read" 'json where) (& (-> r arena)) (cast string bytes)
468
468
  #,value (& #,e))
469
469
  (return (route-json-refused! r (& #,e))))
470
470
  #,(handler-call handler values `(,value)))]
471
471
  [else
472
- #`(let ([#,value (cast (ptr #,form) (arena-alloc (& (-> r arena)) (sizeof #,form)))]
472
+ #`(let ([#,value (new (& (-> r arena)) #,form)]
473
473
  [#,e form-error] [pairs (slice url-pair)] [parts (slice multipart-part)])
474
474
  (unless (route-form-fields r bytes (& pairs) (& parts)) (return))
475
475
  (unless (#,(derived form '"form-read" 'form where) (& (-> r arena)) pairs parts #,value