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
@@ -111,7 +111,7 @@
111
111
  ;; ---- per-function state ----
112
112
 
113
113
  (define (new-fctx [params datum] [results datum]) -> (ptr fctx)
114
- (let ([fc (cast (ptr fctx) (arena-alloc (current-arena) (sizeof fctx)))])
114
+ (let ([fc (new (current-arena) fctx)])
115
115
  (set! (-> fc locals) (make-table))
116
116
  (set! (-> fc extra) nil)
117
117
  (set! (-> fc next) 0)
@@ -147,7 +147,7 @@
147
147
  (define compiling datum 0)
148
148
 
149
149
  (define (push-label [key datum] [kind datum] [type datum] [next (ptr label)]) -> (ptr label)
150
- (let ([l (cast (ptr label) (arena-alloc (current-arena) (sizeof label)))])
150
+ (let ([l (new (current-arena) label)])
151
151
  (set! (-> l key) key)
152
152
  (set! (-> l kind) kind)
153
153
  (set! (-> l type) type)
@@ -177,7 +177,7 @@
177
177
  (define (synth-of [d datum]) -> (ptr synth) (cast (ptr synth) (record-pointer d)))
178
178
 
179
179
  (define (new-mstate [self datum]) -> (ptr mstate)
180
- (let ([ms (cast (ptr mstate) (arena-alloc (current-arena) (sizeof mstate)))])
180
+ (let ([ms (new (current-arena) mstate)])
181
181
  (set! (-> ms self) self)
182
182
  (set! (-> ms func-imports) nil)
183
183
  (set! (-> ms global-imports) nil)
@@ -240,7 +240,7 @@
240
240
  (set! (-> ms table-loc) current-loc)))
241
241
 
242
242
  (define (new-synth! [ms (ptr mstate)] [kind datum] [info datum]) -> datum
243
- (let ([s (cast (ptr synth) (arena-alloc (current-arena) (sizeof synth)))])
243
+ (let ([s (new (current-arena) synth)])
244
244
  (set! (-> s self) (make-record-in (current-arena) synth-kind s))
245
245
  (set! (-> s kind) kind)
246
246
  (set! (-> s info) info)
@@ -626,7 +626,7 @@
626
626
 
627
627
  (define (compile-function [ms (ptr mstate)] [info datum] [params datum] [body datum]) -> (ptr compiled)
628
628
  (let ([fc (new-fctx params (func-info-results info))]
629
- [cf (cast (ptr compiled) (arena-alloc (current-arena) (sizeof compiled)))])
629
+ [cf (new (current-arena) compiled)])
630
630
  (set! (-> ms fname) (func-info-name info))
631
631
  (set! compiling (func-info-name info))
632
632
  (set! current-loc 0)
@@ -757,7 +757,7 @@
757
757
  (set-tag-info-export! (cadr f) (export-name! ms (tag-info-name (cadr f)))))
758
758
  tag-forms)
759
759
  (set! constants (constant-inits ms global-forms))
760
- (set! last (cast (ptr compiled) (arena-alloc (current-arena) (sizeof compiled))))
760
+ (set! last (new (current-arena) compiled))
761
761
  (set! (-> last next) 0)
762
762
  (set! first last)
763
763
  (for-each (lambda ([f datum])
@@ -814,7 +814,7 @@
814
814
  (define (table-functions! [ms (ptr mstate)] [last (ptr compiled)] [segment i64]) -> (ptr compiled)
815
815
  (let ([ts (reverse (-> ms tables))])
816
816
  (while (pair? ts)
817
- (let ([t (car ts)] [a (new-asm)] [cf (cast (ptr compiled) (arena-alloc (current-arena) (sizeof compiled)))])
817
+ (let ([t (car ts)] [a (new-asm)] [cf (new (current-arena) compiled)])
818
818
  (instr! a `(i32.const ,(caddr t)))
819
819
  (instr! a `(call ,(list-ref t 4)))
820
820
  (instr! a `(global.set ,(car t)))
@@ -933,9 +933,9 @@
933
933
  ;; ---- linking ----
934
934
 
935
935
  (define (index-of [t (ptr hash-table)] [key datum] [what string]) -> datum
936
- (let ([i (hash-ref t (cast u64 key))])
936
+ (let ([i (hash-find t (cast u64 key))])
937
937
  (when (== i 0) (fail "internal: ~a has no index" (cons (string->datum what) nil)))
938
- (small (- i 1))))
938
+ (small (@ i))))
939
939
 
940
940
  (define (type-index [lk (ptr linker)] [sig datum]) -> datum
941
941
  (let ([known (datum-get (-> lk func-type-index) sig)])
@@ -965,7 +965,7 @@
965
965
 
966
966
  (define (number! [t (ptr hash-table)] [items datum] [n u32]) -> u32
967
967
  (while (pair? items)
968
- (hash-set! t (cast u64 (car items)) (+ n 1))
968
+ (hash-set! t (cast u64 (car items)) n)
969
969
  (+= n 1)
970
970
  (set! items (cdr items)))
971
971
  n)
@@ -973,7 +973,7 @@
973
973
  (define (link-module [ms (ptr mstate)] [compiled (ptr compiled)] [start-fc (ptr fctx)] [setup (ptr asm)]
974
974
  [literal-segment datum] [global-forms datum] [tag-forms datum] [memory-form datum]
975
975
  [table-form datum] [constants (ptr hash-table)]) -> datum
976
- (let* ([lk (cast (ptr linker) (arena-alloc (current-arena) (sizeof linker)))]
976
+ (let* ([lk (new (current-arena) linker)]
977
977
  [has-start (or (> (asm-size setup) 0) (> (asm-size (-> start-fc asm)) 0))]
978
978
  [func-imports (reverse (-> ms func-imports))]
979
979
  [global-imports (reverse (-> ms global-imports))]
@@ -87,7 +87,7 @@
87
87
  (const unit-kind u32 20)
88
88
 
89
89
  (define (new-unit [path datum] [name datum]) -> datum
90
- (let ([m (cast (ptr unit) (arena-alloc (& run-arena) (sizeof unit)))])
90
+ (let ([m (new (& run-arena) unit)])
91
91
  (set! (-> m self) (make-record unit-kind m))
92
92
  (set! (-> m path) (keep path))
93
93
  (set! (-> m name) (keep name))
@@ -113,7 +113,7 @@
113
113
  (struct comp [module datum] [use-site-scopes datum] [phase-forms datum] [memories datum]
114
114
  [tables datum] [provide-ids datum] [require-names datum]
115
115
  [ns datum] [instances (ptr hash-table)] [values (ptr hash-table)] [wasm-module-counter u32] [storage-wasm-modules datum]
116
- [checking (ptr void)] [language datum] [expansions (ptr hash-table)] [scopes (ptr hash-table)])
116
+ [checking (ptr void)] [language datum])
117
117
 
118
118
  (define current (ptr comp) 0)
119
119
 
@@ -122,7 +122,7 @@
122
122
  (define namespace-counter u32 0)
123
123
 
124
124
  (define (new-comp [m datum]) -> (ptr comp)
125
- (let ([c (cast (ptr comp) (arena-alloc (current-arena) (sizeof comp)))])
125
+ (let ([c (new (current-arena) comp)])
126
126
  (set! (-> c module) m)
127
127
  (set! (-> c use-site-scopes) nil)
128
128
  (set! (-> c phase-forms) nil)
@@ -138,8 +138,6 @@
138
138
  (set! (-> c storage-wasm-modules) nil)
139
139
  (set! (-> c checking) 0)
140
140
  (set! (-> c language) 0)
141
- (set! (-> c expansions) (make-table))
142
- (set! (-> c scopes) (make-table))
143
141
  c))
144
142
 
145
143
  ;; Scopes for local binding forms get odd numbers, and all other scopes get even numbers. This lets
@@ -353,19 +351,16 @@
353
351
  (cast (ptr binding) (hash-ref (& bindings) (slot-key sym slot))))
354
352
 
355
353
  (define (bind-raw! [sym datum] [scopes (ptr scope-set)] [phase i32] [meaning datum]) -> (ptr binding)
356
- (let ([b (cast (ptr binding) (arena-alloc (& run-arena) (sizeof binding)))] [k (slot-key sym (binding-slot scopes))])
357
- (set! (-> b scopes) scopes)
358
- (set! (-> b phase) phase)
359
- (set! (-> b key) (keep (fresh-key!)))
360
- (set! (-> b meaning) (keep meaning))
361
- (set! (-> b next) (cast (ptr binding) (hash-ref (& bindings) k)))
354
+ (let* ([k (slot-key sym (binding-slot scopes))]
355
+ [b (new (& run-arena) (binding #:scopes scopes #:phase phase #:key (keep (fresh-key!)) #:meaning (keep meaning)
356
+ #:next (cast (ptr binding) (hash-ref (& bindings) k))))])
362
357
  (hash-set! (& bindings) k (cast u32 b))
363
358
  b))
364
359
 
365
360
  (define (bind-module-level! [sym datum] [scopes (ptr scope-set)] [phase i32] [meaning datum]) -> (ptr binding)
366
361
  (let ([b (bind-raw! sym scopes phase meaning)])
367
362
  (when (!= current 0)
368
- (let ([e (cast (ptr module-entry) (arena-alloc (& run-arena) (sizeof module-entry)))] [m (the-module)])
363
+ (let ([e (new (& run-arena) module-entry)] [m (the-module)])
369
364
  (set! (-> e symbol) sym)
370
365
  (set! (-> e scopes) scopes)
371
366
  (set! (-> e phase) phase)
@@ -815,7 +810,7 @@
815
810
  (define (imported-kind [kind datum]) -> datum (if (== kind 'memory) 'memory-import 'table-import))
816
811
 
817
812
  (define (add-wasm-module! [m datum] [phase i32] [compiled datum])
818
- (let ([l (cast (ptr wasm-module) (arena-alloc (& run-arena) (sizeof wasm-module)))] [u (unit-of m)])
813
+ (let ([l (new (& run-arena) wasm-module)] [u (unit-of m)])
819
814
  (set! (-> l phase) phase)
820
815
  (set! (-> l bytes) (keep (car compiled)))
821
816
  (set! (-> l imports) (keep (cadr compiled)))
@@ -1048,8 +1043,8 @@
1048
1043
  (define (write-data [path datum] [d datum]) -> bool
1049
1044
  (let ([b (make-buffer)] [temp string] [ok #f])
1050
1045
  (sealed! (& b) d)
1051
- (when (>= (fs-make-temp-file (datum->string cache-directory) "" ".tmp" (& temp) 0) 0)
1052
- (set! ok (and (>= (fs-write-file temp (buffer-bytes (& b)) 0) 0) (>= (fs-rename temp (datum->string path) 0) 0)))
1046
+ (when (fs-make-temp-file (datum->string cache-directory) "" ".tmp" (& temp) 0)
1047
+ (set! ok (and (fs-write-file temp (buffer-bytes (& b)) 0) (fs-rename temp (datum->string path) 0)))
1053
1048
  (unless ok (fs-remove temp #f 0))
1054
1049
  (free (-> temp bytes)))
1055
1050
  (buffer-free! (& b))
@@ -1333,13 +1328,13 @@
1333
1328
  (own-ref info))])))
1334
1329
 
1335
1330
  (define (own-ref [info datum]) -> datum
1336
- (let ([i (hash-ref own-numbers (cast u64 info))])
1337
- (when (== i 0)
1338
- (set! own-list (cons info own-list))
1339
- (+= own-count 1)
1340
- (set! i own-count)
1341
- (hash-set! own-numbers (cast u64 info) i))
1342
- `(own ,(make-integer (- i 1)))))
1331
+ (let ([known (hash-find own-numbers (cast u64 info))] [i own-count])
1332
+ (if (!= known 0)
1333
+ (set! i (@ known))
1334
+ (begin (set! own-list (cons info own-list))
1335
+ (+= own-count 1)
1336
+ (hash-set! own-numbers (cast u64 info) i)))
1337
+ `(own ,(make-integer i))))
1343
1338
 
1344
1339
  (define (info->list [info datum]) -> datum
1345
1340
  (cond [(func-info? info)
@@ -1391,10 +1386,7 @@
1391
1386
  (define loading datum 0)
1392
1387
  (define loaded-infos (ptr datum) 0)
1393
1388
 
1394
- (define (zeroed-array [n u32]) -> (ptr datum)
1395
- (let ([a (cast (ptr datum) (arena-alloc (current-arena) (* 4 (+ n 1))))])
1396
- (for ([i u32 0]) (< i n) (+= i 1) (set! (@ a i) 0))
1397
- a))
1389
+ (define (zeroed-array [n u32]) -> (ptr datum) (-> (new (current-arena) datum (+ n 1)) items))
1398
1390
 
1399
1391
  (define (load-module! [m datum] [d datum])
1400
1392
  (let* ([u (unit-of m)] [infos (section d 'infos)] [ni (length infos)]
@@ -1423,7 +1415,7 @@
1423
1415
  (for-each (lambda ([e datum])
1424
1416
  (let* ([scopes (scope-set-of (cadr e))] [phase (cast i32 (integer-value (caddr e)))]
1425
1417
  [b (bind-raw! (car e) scopes phase (decode (cadddr e)))]
1426
- [me (cast (ptr module-entry) (arena-alloc (& run-arena) (sizeof module-entry)))])
1418
+ [me (new (& run-arena) module-entry)])
1427
1419
  (set! (-> me symbol) (car e))
1428
1420
  (set! (-> me scopes) scopes)
1429
1421
  (set! (-> me phase) phase)
@@ -1520,7 +1512,7 @@
1520
1512
  (define current-body (ptr body) 0)
1521
1513
 
1522
1514
  (define (expand-body [forms datum] [phase i32]) -> datum
1523
- (let ([b (cast (ptr body) (arena-alloc (current-arena) (sizeof body)))] [saved current-body] [out datum 0])
1515
+ (let ([b (new (current-arena) body)] [saved current-body] [out datum 0])
1524
1516
  (set! (-> b phase) phase)
1525
1517
  (set! (-> b syntax) to-syntax)
1526
1518
  (set! (-> b items) nil)
@@ -1866,12 +1858,12 @@
1866
1858
  (define (included-text [s datum]) -> datum
1867
1859
  (let ([l (syntax->list s)])
1868
1860
  (unless (and (!= l 0) (== (length l) 2) (string-literal? (cadr l))) (no-match s "(include-text \"file\")"))
1869
- (let* ([spec (cadr l)] [from (module-source-file s spec)] [id (module-path-from from spec)] [why string]
1861
+ (let* ([spec (cadr l)] [from (module-source-file s spec)] [id (module-path-from from spec)] [why error]
1870
1862
  [b (slice u8)] [text datum 0] [me (the-module)])
1871
1863
  (check-module! (if (in-session?) 0 (-> me path)) id spec)
1872
1864
  (note-resolved! from (syntax-e spec) id)
1873
- (when (< (fs-read-file (datum->string (host-file id)) (& b) (& why)) 0)
1874
- (fail-at spec "cannot read ~s: ~a" `(,(syntax-e spec) ,(host-error why))))
1865
+ (unless (fs-read-file (datum->string (host-file id)) (& b) (& why))
1866
+ (fail-at spec "cannot read ~s: ~a" `(,(syntax-e spec) ,(host-error (& why)))))
1875
1867
  (set! text (string->datum (cast string b)))
1876
1868
  (free (-> b items))
1877
1869
  (when (== (assoc id (-> me included)) 0)
@@ -2023,34 +2015,32 @@
2023
2015
  (ensure-wasm-module! (car l) 0 t)
2024
2016
  (set! l (cdr l))))))
2025
2017
 
2026
- (define (instantiate-bytes [name string] [code (slice u8)] [imports (slice string)] [compile-time bool] [err (ptr string)])
2027
- -> bool
2028
- (== (host-instantiate name code imports compile-time err) 0))
2018
+ (define (instantiate-bytes [name string] [code (slice u8)] [imports (slice string)] [compile-time bool]
2019
+ [err (ptr error)]) -> bool
2020
+ (host-instantiate name code imports compile-time err))
2029
2021
 
2030
2022
  (define (instantiate! [name datum] [bytes datum] [imports datum] [scopes datum] [t u32] [where datum] [compile-time bool])
2031
- (let* ([map (import-map imports t)] [n (* 2 (length map))] [pairs (cast (ptr string) (malloc (* n 8)))] [i u32 0] [ok #f]
2032
- [why string])
2023
+ (let* ([map (import-map imports t)] [n (* 2 (length map))] [pairs (new 0 string n)] [i u32 0] [ok #f] [why error])
2033
2024
  (while (pair? map)
2034
2025
  (set! (@ pairs i) (datum->string (car (car map))))
2035
2026
  (set! (@ pairs (+ i 1)) (datum->string (cdr (car map))))
2036
2027
  (+= i 2)
2037
2028
  (set! map (cdr map)))
2038
2029
  (set-scope-map! (slice (scope-map-of scopes t) (length scopes)))
2039
- (try (set! ok (instantiate-bytes (datum->string name) (datum->bytes bytes) (slice pairs n) compile-time
2040
- (& why)))
2030
+ (try (set! ok (instantiate-bytes (datum->string name) (datum->bytes bytes) pairs compile-time (& why)))
2041
2031
  [catch compile-error (message blamed loc)
2042
2032
  (set-scope-map! 0)
2043
- (free pairs)
2033
+ (free (-> pairs items))
2044
2034
  (throw compile-error message blamed loc)])
2045
2035
  (set-scope-map! 0)
2046
- (free pairs)
2036
+ (free (-> pairs items))
2047
2037
  (unless ok
2048
2038
  (if session-running
2049
- (fail-at where "~a" (list1 (session-failure (host-error why))))
2050
- (fail-at where "compile-time code failed: ~a" (list1 (host-error why)))))))
2039
+ (fail-at where "~a" (list1 (session-failure (host-error (& why)))))
2040
+ (fail-at where "compile-time code failed: ~a" (list1 (host-error (& why))))))))
2051
2041
 
2052
2042
  (define (scope-map-of [scopes datum] [t u32]) -> (ptr u32)
2053
- (let ([p (cast (ptr u32) (arena-alloc (current-arena) (* 4 (+ (length scopes) 1))))] [i u32 0] [sc u32 0] [o datum 0])
2043
+ (let ([p (-> (new (current-arena) u32 (+ (length scopes) 1)) items)] [i u32 0] [sc u32 0] [o datum 0])
2054
2044
  (while (pair? scopes)
2055
2045
  (set! sc (cast u32 (integer-value (car scopes))))
2056
2046
  (set! o (scope-origin sc))
@@ -2175,14 +2165,9 @@
2175
2165
  [(and (!= m 0) (or (== (car m) 'core) (== (car m) 'prim))) (shape-of (cadr m) s api-phase)]
2176
2166
  [else 0])))
2177
2167
 
2178
- (define (query-scope-shape [m datum] [remember bool]) -> datum
2179
- (let ([known (if remember (cast datum (hash-ref (-> current scopes) (cast u64 (cadr m)))) 0)])
2180
- (if (!= known 0)
2181
- known
2182
- (begin
2183
- (scope-shape m api-phase nil)
2184
- (when remember (hash-set! (-> current scopes) (cast u64 (cadr m)) (cast u32 m)))
2185
- m))))
2168
+ (define (query-scope-shape [m datum]) -> datum
2169
+ (scope-shape m api-phase nil)
2170
+ m)
2186
2171
 
2187
2172
  ;; ---- checked code ----
2188
2173
 
@@ -2712,9 +2697,9 @@
2712
2697
 
2713
2698
  (define (query-inline-call [info datum] [args datum]) -> datum (inline-call info args api-phase))
2714
2699
 
2715
- (define (query-expand-head [s datum] [remember bool]) -> datum (expand-head s api-phase remember))
2700
+ (define (query-expand-head [s datum]) -> datum (expand-head s api-phase))
2716
2701
 
2717
- (define (expand-head [s datum] [phase i32] [remember bool]) -> datum
2702
+ (define (expand-head [s datum] [phase i32]) -> datum
2718
2703
  (let ([e (syntax-e s)])
2719
2704
  (cond
2720
2705
  [(symbol? e)
@@ -2725,7 +2710,7 @@
2725
2710
  [('compile-time-value)
2726
2711
  (let ([t (transformer-of m)])
2727
2712
  (when (== t 0) (fail-at s "~a is bound to a compile-time value: read it with syntax-local-value" (list1 e)))
2728
- (head-transformer s t s phase remember))]
2713
+ (head-transformer s t s phase))]
2729
2714
  [('func) `(func ,(cadr m))]
2730
2715
  [('tag) (fail-at s "~a is a tag: throw it with (throw ~a arg ...)" `(,e ,e))]
2731
2716
  [('core 'prim) (fail-at s "bad use of ~a" (list1 e))]
@@ -2733,7 +2718,7 @@
2733
2718
  [else (unbound s e phase)]))]
2734
2719
  [(pair? e)
2735
2720
  (let* ([head (car e)] [m (if (identifier? head) (meaning-of head phase) 0)] [t (transformer-of m)])
2736
- (cond [(!= t 0) (head-transformer head t s phase remember)]
2721
+ (cond [(!= t 0) (head-transformer head t s phase)]
2737
2722
  [(and (!= m 0) (== (car m) 'core) (== (cadr m) 'include-text)) `(macro ,(included-text s))]
2738
2723
  [(and (!= m 0) (== (car m) 'core)) `(core ,(cadr m) ,s)]
2739
2724
  [(and (!= m 0) (== (car m) 'prim)) `(prim ,(cadr m) ,s)]
@@ -2742,38 +2727,27 @@
2742
2727
  (if (!= m 0)
2743
2728
  (fail-at s "#%app is bound here, but not to a macro or the core form" nil)
2744
2729
  (unbound head '#%app phase)))
2745
- (expand-head (syntax-rewrap s (cons (implicit-id s '#%app) e)) phase remember)]))]
2730
+ (expand-head (syntax-rewrap s (cons (implicit-id s '#%app) e)) phase)]))]
2746
2731
  [(null? e) (fail-at s "empty form ()" nil)]
2747
2732
  [(literal? e)
2748
2733
  (let* ([id (implicit-id s '#%datum)] [m (meaning-of id phase)] [t (transformer-of m)] [form (syntax-rewrap s `(,id ,s))])
2749
- (cond [(!= t 0) (head-transformer id t form phase remember)]
2734
+ (cond [(!= t 0) (head-transformer id t form phase)]
2750
2735
  [(and (!= m 0) (== (car m) 'core)) `(core #%datum ,form)]
2751
2736
  [else (fail-at s "the literal ~s needs #%datum, which is ~a here"
2752
2737
  `(,(syntax->datum s) ,(if (!= m 0) '"not a macro or the core form" '"unbound")))]))]
2753
2738
  [(keyword? e) (fail-at s "~s: keyword misused as an expression" (list1 e))]
2754
2739
  [else (fail-at s "~s is not an expression" (list1 (syntax->datum s)))])))
2755
2740
 
2756
- (define (head-transformer [head datum] [t datum] [s datum] [phase i32] [remember bool]) -> datum
2741
+ (define (head-transformer [head datum] [t datum] [s datum] [phase i32]) -> datum
2757
2742
  (if (form-value? t)
2758
2743
  (let ([l (syntax->list t)]) `(form ,(syntax-e (cadr l)) ,(if (pair? (cddr l)) (caddr l) 0) ,s ,t))
2759
- `(macro ,(if remember (remembered-expansion head t s phase) (apply-macro head t s phase #f)))))
2744
+ `(macro ,(apply-macro head t s phase #f))))
2760
2745
 
2761
- (define (query-apply-form [t datum] [s datum] [remember bool]) -> datum
2762
- (if remember
2763
- (remembered-expansion (if (pair? (syntax-e s)) (car (syntax-e s)) s) t s api-phase)
2764
- (apply-form t s api-phase)))
2746
+ (define (query-apply-form [t datum] [s datum]) -> datum (apply-form t s api-phase))
2765
2747
 
2766
2748
  (define (apply-form [t datum] [s datum] [phase i32]) -> datum
2767
2749
  (apply-macro (if (pair? (syntax-e s)) (car (syntax-e s)) s) t s phase #f))
2768
2750
 
2769
- (define (remembered-expansion [head datum] [t datum] [s datum] [phase i32]) -> datum
2770
- (let ([known (cast datum (hash-ref (-> current expansions) (cast u64 s)))])
2771
- (if (!= known 0)
2772
- known
2773
- (let ([x (apply-macro head t s phase #f)])
2774
- (hash-set! (-> current expansions) (cast u64 s) (cast u32 x))
2775
- x))))
2776
-
2777
2751
  (define (query-local-expand [s datum]) -> datum
2778
2752
  (unless (syntax? s) (fail-at api-where "local-expand: expected syntax" nil))
2779
2753
  (let ([saved-output to-syntax] [out datum 0])
@@ -2881,23 +2855,23 @@
2881
2855
  (define (module-names [m datum]) -> (ptr names)
2882
2856
  (let ([head (-> (unit-of m) entries)] [known (cast (ptr names) (hash-ref (& name-tables) (cast u64 m)))])
2883
2857
  (when (and (!= known 0) (== (-> known upto) head)) (return known))
2884
- (let ([saved (use-arena (& run-arena))] [n known] [new nil] [e head])
2858
+ (let ([saved (use-arena (& run-arena))] [n known] [added nil] [e head])
2885
2859
  (when (!= n 0)
2886
2860
  (while (and (!= e 0) (!= e (-> n upto)))
2887
- (set! new (cons (cast datum e) new))
2861
+ (set! added (cons (cast datum e) added))
2888
2862
  (set! e (-> e next)))
2889
2863
  (when (!= e (-> n upto)) (set! n 0)))
2890
2864
  (when (== n 0)
2891
- (set! n (cast (ptr names) (arena-alloc (& run-arena) (sizeof names))))
2865
+ (set! n (new (& run-arena) names))
2892
2866
  (set! (-> n by-base) (make-table))
2893
2867
  (set! (-> n by-name) (make-table))
2894
2868
  (set! (-> n counts) (make-table))
2895
- (set! new nil)
2869
+ (set! added nil)
2896
2870
  (set! e head)
2897
2871
  (while (!= e 0)
2898
- (set! new (cons (cast datum e) new))
2872
+ (set! added (cons (cast datum e) added))
2899
2873
  (set! e (-> e next))))
2900
- (name-entries! m n new)
2874
+ (name-entries! m n added)
2901
2875
  (set! (-> n upto) head)
2902
2876
  (hash-set! (& name-tables) (cast u64 m) (cast u32 n))
2903
2877
  (use-arena saved)
@@ -2966,7 +2940,7 @@
2966
2940
  (fail-at s "unbound identifier ~a~a" `(,sym ,(if (> phase 0) (format " at phase ~a" (list1 (make-integer phase))) '""))))
2967
2941
 
2968
2942
  (define (expand-expr [s datum] [phase i32]) -> datum
2969
- (let ([h (expand-head s phase #f)])
2943
+ (let ([h (expand-head s phase)])
2970
2944
  (case (car h)
2971
2945
  [('local) (with-local-binding s (cadr h))]
2972
2946
  [('global 'func) (with-local-binding s 0)]
@@ -251,8 +251,8 @@
251
251
  [nkept u32 0] [base u32 0])
252
252
  (set! (-> k nf) (+ (-> s nfimports) ndefined))
253
253
  (set! (-> k ng) (+ (-> s ngimports) (length (-> s globals))))
254
- (set! (-> k fmap) (cast (ptr u32) (malloc (* 4 (+ (-> k nf) 1)))))
255
- (set! (-> k gmap) (cast (ptr u32) (malloc (* 4 (+ (-> k ng) 1)))))
254
+ (set! (-> k fmap) (-> (new 0 u32 (+ (-> k nf) 1)) items))
255
+ (set! (-> k gmap) (-> (new 0 u32 (+ (-> k ng) 1)) items))
256
256
  (set! (-> k kept) nil)
257
257
  (set! (-> k hooks) nil)
258
258
  (set! (-> k sp) 0)
@@ -39,22 +39,22 @@
39
39
  path))
40
40
 
41
41
  (define (write-file [path datum] [b (slice u8)])
42
- (let ([why string])
43
- (when (< (fs-write-file (datum->string path) b (& why)) 0)
44
- (raise-compile-error 0 (format-message "cannot write ~a" (cons (host-error why) nil))))))
42
+ (let ([why error])
43
+ (unless (fs-write-file (datum->string path) b (& why))
44
+ (raise-compile-error 0 (format-message "cannot write ~a" (cons (host-error (& why)) nil))))))
45
45
 
46
46
  (define (read-file [path datum]) -> datum
47
- (let ([b (slice u8)] [why string] [s datum 0])
48
- (when (< (fs-read-file (datum->string path) (& b) (& why)) 0)
49
- (raise-compile-error 0 (format-message "cannot read ~a" (cons (host-error why) nil))))
47
+ (let ([b (slice u8)] [why error] [s datum 0])
48
+ (unless (fs-read-file (datum->string path) (& b) (& why))
49
+ (raise-compile-error 0 (format-message "cannot read ~a" (cons (host-error (& why)) nil))))
50
50
  (set! s (string->datum (cast string b)))
51
51
  (free (-> b items))
52
52
  s))
53
53
 
54
54
  (define (make-dir [path datum])
55
- (let ([why string])
56
- (when (< (fs-make-dir (datum->string path) (& why)) 0)
57
- (raise-compile-error 0 (format-message "cannot make ~a" (cons (host-error why) nil))))))
55
+ (let ([why error])
56
+ (unless (fs-make-dir (datum->string path) (& why))
57
+ (raise-compile-error 0 (format-message "cannot make ~a" (cons (host-error (& why)) nil))))))
58
58
 
59
59
  (define (joined [strings datum]) -> datum
60
60
  (let ([b (make-buffer)] [s datum 0])
@@ -15,7 +15,7 @@
15
15
  memory.copy memory.fill))
16
16
 
17
17
  (define (def! [name datum] [code datum] [params datum] [results datum] [align i32])
18
- (let ([op (cast (ptr prim-op) (arena-alloc (& run-arena) (sizeof prim-op)))])
18
+ (let ([op (new (& run-arena) prim-op)])
19
19
  (set! (-> op name) name)
20
20
  (set! (-> op code) code)
21
21
  (set! (-> op params) params)
@@ -18,7 +18,7 @@
18
18
  (define (unreadable) (raise-compile-error 0 "internal: a program's wasm module cannot be read"))
19
19
 
20
20
  (define (new-wasm [name datum] [bytes datum]) -> (ptr wasm)
21
- (let ([w (cast (ptr wasm) (arena-alloc (current-arena) (sizeof wasm)))] [id u32 0] [head u32 0] [next u32 0])
21
+ (let ([w (new (current-arena) wasm)] [id u32 0] [head u32 0] [next u32 0])
22
22
  (set! (-> w name) name)
23
23
  (set! (-> w bytes) (datum->bytes bytes))
24
24
  (set! (-> w sections) nil)
@@ -66,20 +66,15 @@
66
66
  [(== id 9) (read-elems!)]
67
67
  [(== id 10) (read-bodies! w)])
68
68
  (set! ss (cdr ss)))
69
- (set! (-> w live) (cast (ptr bool) (arena-alloc (current-arena) (+ (-> w nimports) (-> w count) 1))))
70
- (memset (-> w live) 0 (+ (-> w nimports) (-> w count) 1))
71
- (set! (-> w table-functions) (cast (ptr bool) (arena-alloc (current-arena) (+ (-> w nimports) (-> w count) 1))))
72
- (memset (-> w table-functions) 0 (+ (-> w nimports) (-> w count) 1))
69
+ (set! (-> w live) (-> (new (current-arena) bool (+ (-> w nimports) (-> w count) 1)) items))
70
+ (set! (-> w table-functions) (-> (new (current-arena) bool (+ (-> w nimports) (-> w count) 1)) items))
73
71
  (for-each (lambda ([t datum]) (set! (@ (-> w table-functions) (cast u32 (integer-value (car t)))) #t)) (-> w tables))
74
- (set! (-> w valued) (cast (ptr bool) (arena-alloc (current-arena) (+ (-> w nimports) (-> w count) 1))))
75
- (memset (-> w valued) 0 (+ (-> w nimports) (-> w count) 1))
76
- (set! (-> w read-globals) (cast (ptr bool) (arena-alloc (current-arena) (+ (-> w nglobals) 1))))
77
- (memset (-> w read-globals) 0 (+ (-> w nglobals) 1))
78
- (set! (-> w read-datas) (cast (ptr bool) (arena-alloc (current-arena) (+ (-> w ndatas) 1))))
79
- (memset (-> w read-datas) 0 (+ (-> w ndatas) 1))
72
+ (set! (-> w valued) (-> (new (current-arena) bool (+ (-> w nimports) (-> w count) 1)) items))
73
+ (set! (-> w read-globals) (-> (new (current-arena) bool (+ (-> w nglobals) 1)) items))
74
+ (set! (-> w read-datas) (-> (new (current-arena) bool (+ (-> w ndatas) 1)) items))
80
75
  (set! (-> w sites) (make-buffer))
81
- (set! (-> w site-starts) (cast (ptr u32) (arena-alloc (current-arena) (* 4 (+ (-> w count) 1)))))
82
- (set! (-> w site-ends) (cast (ptr u32) (arena-alloc (current-arena) (* 4 (+ (-> w count) 1)))))))
76
+ (set! (-> w site-starts) (-> (new (current-arena) u32 (+ (-> w count) 1)) items))
77
+ (set! (-> w site-ends) (-> (new (current-arena) u32 (+ (-> w count) 1)) items))))
83
78
 
84
79
  ;; Each import's span is its kind and its bytes' start and end.
85
80
  (define (read-imports! [w (ptr wasm)])
@@ -125,8 +120,8 @@
125
120
  (define (read-bodies! [w (ptr wasm)])
126
121
  (let ([n (uleb)] [size u32 0])
127
122
  (set! (-> w count) n)
128
- (set! (-> w starts) (cast (ptr u32) (arena-alloc (current-arena) (* 4 (+ n 1)))))
129
- (set! (-> w ends) (cast (ptr u32) (arena-alloc (current-arena) (* 4 (+ n 1)))))
123
+ (set! (-> w starts) (-> (new (current-arena) u32 (+ n 1)) items))
124
+ (set! (-> w ends) (-> (new (current-arena) u32 (+ n 1)) items))
130
125
  (for ([k u32 0]) (< k n) (+= k 1)
131
126
  (set! size (uleb))
132
127
  (set! (@ (-> w starts) k) (position))
@@ -335,7 +330,7 @@
335
330
 
336
331
  (define (renumber! [w (ptr wasm)])
337
332
  (let ([total (+ (-> w nimports) (-> w count))] [next u32 0])
338
- (set! (-> w indexes) (cast (ptr u32) (arena-alloc (current-arena) (* 4 (+ total 1)))))
333
+ (set! (-> w indexes) (-> (new (current-arena) u32 (+ total 1)) items))
339
334
  (for ([i u32 0]) (< i total) (+= i 1)
340
335
  (set! (@ (-> w indexes) i) next)
341
336
  (when (@ (-> w live) i) (+= next 1)))))
@@ -371,7 +366,7 @@
371
366
  (define (rewritten [w (ptr wasm)]) -> datum
372
367
  (let ([out (make-buffer)] [ss (-> w sections)] [news (ptr u32) 0] [s datum 0])
373
368
  (renumber! w)
374
- (set! news (cast (ptr u32) (arena-alloc (current-arena) (* 4 (+ (-> w count) 1)))))
369
+ (set! news (-> (new (current-arena) u32 (+ (-> w count) 1)) items))
375
370
  (buffer-add! (& out) (slice (-> w bytes) 0 8))
376
371
  (while (pair? ss)
377
372
  (let* ([sec (car ss)] [id (integer-value (car sec))] [head (cast u32 (integer-value (cadr sec)))]
@@ -269,10 +269,10 @@
269
269
  head))
270
270
 
271
271
  (define (read-file [path datum]) -> datum
272
- (let* ([why string] [b (slice u8)] [forms datum 0])
273
- (when (< (fs-read-file (datum->string path) (& b) (& why)) 0)
274
- (let ([reason (string->datum why)])
275
- (free (-> why bytes))
272
+ (let* ([why error] [b (slice u8)] [forms datum 0])
273
+ (unless (fs-read-file (datum->string path) (& b) (& why))
274
+ (let ([reason (string->datum (error-text (& why)))])
275
+ (error-free! (& why))
276
276
  (raise-compile-error 0 (format-message "cannot read ~a" (list1 reason)))))
277
277
  (set! forms (read-all (cast string b) (string->symbol (datum->string path))))
278
278
  (free (-> b items))
@@ -37,16 +37,16 @@
37
37
  (read-all (datum->string text) source))
38
38
 
39
39
  (define (file-text [file datum]) -> datum
40
- (let* ([why string] [b (slice u8)] [s datum 0])
41
- (when (< (fs-read-file (datum->string file) (& b) (& why)) 0)
42
- (fail-at 0 "cannot read the module ~a" (list1 (host-error why))))
40
+ (let* ([why error] [b (slice u8)] [s datum 0])
41
+ (unless (fs-read-file (datum->string file) (& b) (& why))
42
+ (fail-at 0 "cannot read the module ~a" (list1 (host-error (& why)))))
43
43
  (set! s (string->datum (cast string b)))
44
44
  (free (-> b items))
45
45
  s))
46
46
 
47
- (define (host-error [why string]) -> datum
48
- (let ([s (string->datum why)])
49
- (free (-> why bytes))
47
+ (define (host-error [why (ptr error)]) -> datum
48
+ (let ([s (string->datum (error-text why))])
49
+ (error-free! why)
50
50
  s))
51
51
 
52
52
  ;; ---- paths ----
@@ -58,7 +58,7 @@
58
58
  (if (and (path-absolute? w s) (not (and w (== (path-root w s) "/"))))
59
59
  (set! d (string->datum (path-normal w s)))
60
60
  (begin
61
- (when (< (fs-cwd (& cwd) 0) 0) (fail-at 0 "internal: there is no current directory" nil))
61
+ (unless (fs-cwd (& cwd) 0) (fail-at 0 "internal: there is no current directory" nil))
62
62
  (set! d (string->datum (path-resolved w cwd s)))
63
63
  (free (-> cwd bytes))))
64
64
  d))
@@ -351,9 +351,10 @@
351
351
  name
352
352
  (string->datum (path-joined (path-windows?) (datum->string dir) (datum->string name)))))
353
353
 
354
- (define (kind-of [path datum]) -> i32
354
+ (define (kind-of [path datum]) -> fs-kind
355
355
  (let ([info fs-info])
356
- (if (< (fs-stat (datum->string path) (& info) 0) 0) 0 (-> info kind))))
356
+ (fs-stat (datum->string path) (& info) 0)
357
+ (-> info kind)))
357
358
 
358
359
  (define (clean-name? [s string]) -> bool
359
360
  (let ([start u32 0])
@@ -486,6 +487,6 @@
486
487
  (let ([p (datum->string path)] [info fs-info] [found #f])
487
488
  (for ([i u32 1]) (and (not found) (<= i (-> p length))) (+= i 1)
488
489
  (when (or (== i (-> p length)) (== (@ p i) #\/))
489
- (set! found (and (== (fs-lstat (datum->string (file-in dir (substring path 0 i))) (& info) 0) 0)
490
+ (set! found (and (fs-lstat (datum->string (file-in dir (substring path 0 i))) (& info) 0)
490
491
  (== (-> info kind) fs-link)))))
491
492
  found))
@@ -8,7 +8,7 @@
8
8
 
9
9
  (define (file-bytes [path datum]) -> datum
10
10
  (let ([b (slice u8)] [d datum '#f])
11
- (when (== (fs-read-file (datum->string path) (& b) 0) 0)
11
+ (when (fs-read-file (datum->string path) (& b) 0)
12
12
  (set! d (bytes->datum b))
13
13
  (free (-> b items)))
14
14
  d))