substrate-lang 0.9.4 → 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 (188) hide show
  1. package/README.md +1 -1
  2. package/build/compiler/{binary.cdd2ffb408dd@0+0.wasm → binary.2d43b43d1600@0+0.wasm} +0 -0
  3. package/build/compiler/checker.4dd4556dd421@0+0.wasm +0 -0
  4. package/build/compiler/{compile.da85f9bc4478@0+0.wasm → compile.5d8f6407af2a@0+0.wasm} +0 -0
  5. package/build/compiler/{core.0410ffbdc488@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.ba77430f659f@0+0.wasm → leb128.15d814b7b4f2@0+0.wasm} +0 -0
  9. package/build/compiler/{link.be6e641afa93@0+0.wasm → link.b826ea7c8f17@0+0.wasm} +0 -0
  10. package/build/compiler/{macros.b695763c0ca3@0+0.wasm → macros.b269e0c42784@0+0.wasm} +0 -0
  11. package/build/compiler/{main.cbbdf42e34c2@0+0.wasm → main.4fc52f204d54@0+0.wasm} +0 -0
  12. package/build/compiler/{ops.324f0a665fab@0+0.wasm → ops.515b5e05f646@0+0.wasm} +0 -0
  13. package/build/compiler/{path.1b5fd988b6f3@0+0.wasm → path.5a6286472cd4@0+0.wasm} +0 -0
  14. package/build/compiler/program +21 -21
  15. package/build/compiler/{prune.29dde307bdee@0+0.wasm → 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.b99787c2d180@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.f6c742932dde@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.fadc832db29f@0+0.wasm → syntax.32f3e40b61c7@0+0.wasm} +0 -0
  23. package/build/compiler/{writer.550227768eb9@0+0.wasm → writer.00b7802cbe39@0+0.wasm} +0 -0
  24. package/build/sub/{base64.454b045156d2@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.f18ad14060e9@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.0b0362932a75@0+0.wasm → html.a23126eb949a@0+0.wasm} +0 -0
  42. package/build/sub/{html.3b3c8d7d9971@0+0.wasm → html.e9ed37f34977@0+0.wasm} +0 -0
  43. package/build/sub/{inflate.3cfa17586072@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.e582eae03ec2@0+0.wasm → map.f455cca6a42a@0+0.wasm} +0 -0
  47. package/build/sub/pack.e02836264f6a@0+0.wasm +0 -0
  48. package/build/sub/{path.1b5fd988b6f3@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.d256e69e09e2@0+0.wasm → reader.694b03770bf0@0+0.wasm} +0 -0
  54. package/build/sub/{root.02141d04d568@0+0.wasm → root.f10a4906f460@0+0.wasm} +0 -0
  55. package/build/sub/{roots.e366210c01d6@0+0.wasm → roots.cefd10e93684@0+0.wasm} +0 -0
  56. package/build/sub/{sha256.f6c742932dde@0+0.wasm → sha256.a6c32b04d799@0+0.wasm} +0 -0
  57. package/build/sub/{sha512.9fee24e95460@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.fadc832db29f@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.8ff142d72fd7@0+0.wasm → text.1bc90482bd43@0+0.wasm} +0 -0
  68. package/build/sub/{timer.d3454726b3bf@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.e82afeb9e953@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 +30 -23
  75. package/std/browser/chromium.sub +5 -4
  76. package/std/browser/devtools.sub +24 -19
  77. package/std/compress/gzip.sub +18 -16
  78. package/std/compress/inflate.sub +7 -4
  79. package/std/crypto/password.sub +3 -3
  80. package/std/doc/doc.sub +2 -2
  81. package/std/encoding/json.sub +20 -8
  82. package/std/encoding/wire.sub +9 -7
  83. package/std/http/form.sub +2 -2
  84. package/std/http/multipart.sub +8 -10
  85. package/std/http/route.sub +9 -4
  86. package/std/http/server.sub +14 -11
  87. package/std/http/session.sub +2 -2
  88. package/std/http/static.sub +5 -5
  89. package/std/meta/derive.sub +0 -2
  90. package/std/meta/method.sub +41 -0
  91. package/std/meta/type-info.sub +30 -37
  92. package/std/package/files.sub +24 -25
  93. package/std/package/git.sub +26 -33
  94. package/std/package/hash.sub +8 -8
  95. package/std/package/manifest.sub +67 -42
  96. package/std/package/map.sub +1 -1
  97. package/std/package/pack.sub +13 -13
  98. package/std/package/read.sub +7 -6
  99. package/std/package/site.sub +7 -7
  100. package/std/package/store.sub +16 -12
  101. package/std/package.sub +6 -6
  102. package/std/test/browser.sub +9 -8
  103. package/std/test/build.sub +2 -2
  104. package/std/test/page.sub +31 -26
  105. package/std/test/run.sub +8 -7
  106. package/std/test/test.sub +12 -13
  107. package/std/vector/vector.sub +75 -0
  108. package/substrate/VERSION +1 -1
  109. package/substrate/compiler/checker.sub +40 -212
  110. package/substrate/compiler/compile.sub +3 -3
  111. package/substrate/compiler/expander.sub +32 -50
  112. package/substrate/compiler/main.sub +9 -9
  113. package/substrate/compiler/reader.sub +4 -4
  114. package/substrate/compiler/roots.sub +8 -8
  115. package/substrate/compiler/running.sub +1 -1
  116. package/substrate/compiler/serialize.sub +56 -49
  117. package/substrate/compiler/substrate.sub +53 -11
  118. package/substrate/host/errors.mjs +3 -2
  119. package/substrate/host/events.sub +3 -16
  120. package/substrate/host/fs.mjs +5 -4
  121. package/substrate/host/fs.sub +135 -102
  122. package/substrate/host/grants.mjs +1 -1
  123. package/substrate/host/grants.sub +8 -7
  124. package/substrate/host/modules/fake.mjs +1 -1
  125. package/substrate/host/modules/websocket.mjs +4 -4
  126. package/substrate/host/modules/websocket.sub +8 -6
  127. package/substrate/host/node/env.mjs +12 -6
  128. package/substrate/host/node/env.sub +21 -16
  129. package/substrate/host/node/fs.mjs +1 -1
  130. package/substrate/host/node/net.mjs +2 -2
  131. package/substrate/host/node/net.sub +13 -6
  132. package/substrate/host/node/process.mjs +4 -4
  133. package/substrate/host/node/process.sub +25 -24
  134. package/substrate/host/node/signal.mjs +3 -2
  135. package/substrate/host/node/signal.sub +9 -6
  136. package/substrate/host/node/watch.mjs +1 -1
  137. package/substrate/host/node/watch.sub +11 -9
  138. package/substrate/host/stream.sub +2 -0
  139. package/substrate/host/subhost-core.mjs +9 -1
  140. package/substrate/host/web/clipboard.mjs +2 -2
  141. package/substrate/host/web/clipboard.sub +10 -3
  142. package/substrate/host/web/files.mjs +2 -2
  143. package/substrate/host/web/files.sub +6 -2
  144. package/substrate/host/web/fs.mjs +3 -3
  145. package/substrate/host/web/location.mjs +3 -1
  146. package/substrate/host/web/location.sub +8 -4
  147. package/substrate/host/worker-side.mjs +3 -1
  148. package/substrate/host/worker.mjs +6 -5
  149. package/substrate/host/worker.sub +10 -10
  150. package/build/compiler/checker.2b0ea87ed311@0+0.wasm +0 -0
  151. package/build/compiler/expander.80707e1666d6@0+0.wasm +0 -0
  152. package/build/compiler/fs.5017b627cbd2@0+0.wasm +0 -0
  153. package/build/compiler/reader.d256e69e09e2@0+0.wasm +0 -0
  154. package/build/compiler/roots.e366210c01d6@0+0.wasm +0 -0
  155. package/build/compiler/serialize.a12536bbbe9a@0+0.wasm +0 -0
  156. package/build/compiler/substrate.728c690187f2@0+0.wasm +0 -0
  157. package/build/sub/build.115aeefc15e8@0+0.wasm +0 -0
  158. package/build/sub/chromium.fc0bfea0fbe6@0+0.wasm +0 -0
  159. package/build/sub/common.997c21b0b8cf@0+0.wasm +0 -0
  160. package/build/sub/deflate.3138a38325a1@0+0.wasm +0 -0
  161. package/build/sub/doc.e3f9a998cd91@0+0.wasm +0 -0
  162. package/build/sub/env.861d55fff974@0+0.wasm +0 -0
  163. package/build/sub/events.2c981f6f1ec7@0+0.wasm +0 -0
  164. package/build/sub/fetch.b0ce8f8b3da8@0+0.wasm +0 -0
  165. package/build/sub/fetch.d62aa5fc9623@0+0.wasm +0 -0
  166. package/build/sub/files.1706cc0941c0@0+0.wasm +0 -0
  167. package/build/sub/fs.5017b627cbd2@0+0.wasm +0 -0
  168. package/build/sub/git.1c5791236e35@0+0.wasm +0 -0
  169. package/build/sub/grants.cd99dff2854e@0+0.wasm +0 -0
  170. package/build/sub/gzip.9ebea150f218@0+0.wasm +0 -0
  171. package/build/sub/hash.ba8330dad9ff@0+0.wasm +0 -0
  172. package/build/sub/json.af2e0ae20084@0+0.wasm +0 -0
  173. package/build/sub/manifest.6e014ac19e5d@0+0.wasm +0 -0
  174. package/build/sub/pack.4295e4f5bdbd@0+0.wasm +0 -0
  175. package/build/sub/path.de22f6659534@0+0.wasm +0 -0
  176. package/build/sub/process.ca10ac0b8a62@0+0.wasm +0 -0
  177. package/build/sub/read.279fafcda508@0+0.wasm +0 -0
  178. package/build/sub/site.76aa8286c257@0+0.wasm +0 -0
  179. package/build/sub/site.e6e415bc3170@0+0.wasm +0 -0
  180. package/build/sub/store.c48db3345968@0+0.wasm +0 -0
  181. package/build/sub/stream.27fd2fe858e1@0+0.wasm +0 -0
  182. package/build/sub/sub.c0fb7310de12@0+0.wasm +0 -0
  183. package/build/sub/substrate.728c690187f2@0+0.wasm +0 -0
  184. package/build/sub/tar.692c0e8827cd@0+0.wasm +0 -0
  185. package/build/sub/test.1fd2ff8123bf@0+0.wasm +0 -0
  186. package/build/sub/upgrade.2a9219e6a45d@0+0.wasm +0 -0
  187. package/build/sub/worker.ea1e11f8f5e2@0+0.wasm +0 -0
  188. package/build/sub/writer.550227768eb9@0+0.wasm +0 -0
@@ -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
 
@@ -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
@@ -1045,8 +1043,8 @@
1045
1043
  (define (write-data [path datum] [d datum]) -> bool
1046
1044
  (let ([b (make-buffer)] [temp string] [ok #f])
1047
1045
  (sealed! (& b) d)
1048
- (when (>= (fs-make-temp-file (datum->string cache-directory) "" ".tmp" (& temp) 0) 0)
1049
- (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)))
1050
1048
  (unless ok (fs-remove temp #f 0))
1051
1049
  (free (-> temp bytes)))
1052
1050
  (buffer-free! (& b))
@@ -1330,13 +1328,13 @@
1330
1328
  (own-ref info))])))
1331
1329
 
1332
1330
  (define (own-ref [info datum]) -> datum
1333
- (let ([i (hash-ref own-numbers (cast u64 info))])
1334
- (when (== i 0)
1335
- (set! own-list (cons info own-list))
1336
- (+= own-count 1)
1337
- (set! i own-count)
1338
- (hash-set! own-numbers (cast u64 info) i))
1339
- `(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))))
1340
1338
 
1341
1339
  (define (info->list [info datum]) -> datum
1342
1340
  (cond [(func-info? info)
@@ -1860,12 +1858,12 @@
1860
1858
  (define (included-text [s datum]) -> datum
1861
1859
  (let ([l (syntax->list s)])
1862
1860
  (unless (and (!= l 0) (== (length l) 2) (string-literal? (cadr l))) (no-match s "(include-text \"file\")"))
1863
- (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]
1864
1862
  [b (slice u8)] [text datum 0] [me (the-module)])
1865
1863
  (check-module! (if (in-session?) 0 (-> me path)) id spec)
1866
1864
  (note-resolved! from (syntax-e spec) id)
1867
- (when (< (fs-read-file (datum->string (host-file id)) (& b) (& why)) 0)
1868
- (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)))))
1869
1867
  (set! text (string->datum (cast string b)))
1870
1868
  (free (-> b items))
1871
1869
  (when (== (assoc id (-> me included)) 0)
@@ -2017,12 +2015,12 @@
2017
2015
  (ensure-wasm-module! (car l) 0 t)
2018
2016
  (set! l (cdr l))))))
2019
2017
 
2020
- (define (instantiate-bytes [name string] [code (slice u8)] [imports (slice string)] [compile-time bool] [err (ptr string)])
2021
- -> bool
2022
- (== (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))
2023
2021
 
2024
2022
  (define (instantiate! [name datum] [bytes datum] [imports datum] [scopes datum] [t u32] [where datum] [compile-time bool])
2025
- (let* ([map (import-map imports t)] [n (* 2 (length map))] [pairs (new 0 string n)] [i u32 0] [ok #f] [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])
2026
2024
  (while (pair? map)
2027
2025
  (set! (@ pairs i) (datum->string (car (car map))))
2028
2026
  (set! (@ pairs (+ i 1)) (datum->string (cdr (car map))))
@@ -2038,8 +2036,8 @@
2038
2036
  (free (-> pairs items))
2039
2037
  (unless ok
2040
2038
  (if session-running
2041
- (fail-at where "~a" (list1 (session-failure (host-error why))))
2042
- (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))))))))
2043
2041
 
2044
2042
  (define (scope-map-of [scopes datum] [t u32]) -> (ptr u32)
2045
2043
  (let ([p (-> (new (current-arena) u32 (+ (length scopes) 1)) items)] [i u32 0] [sc u32 0] [o datum 0])
@@ -2167,14 +2165,9 @@
2167
2165
  [(and (!= m 0) (or (== (car m) 'core) (== (car m) 'prim))) (shape-of (cadr m) s api-phase)]
2168
2166
  [else 0])))
2169
2167
 
2170
- (define (query-scope-shape [m datum] [remember bool]) -> datum
2171
- (let ([known (if remember (cast datum (hash-ref (-> current scopes) (cast u64 (cadr m)))) 0)])
2172
- (if (!= known 0)
2173
- known
2174
- (begin
2175
- (scope-shape m api-phase nil)
2176
- (when remember (hash-set! (-> current scopes) (cast u64 (cadr m)) (cast u32 m)))
2177
- m))))
2168
+ (define (query-scope-shape [m datum]) -> datum
2169
+ (scope-shape m api-phase nil)
2170
+ m)
2178
2171
 
2179
2172
  ;; ---- checked code ----
2180
2173
 
@@ -2704,9 +2697,9 @@
2704
2697
 
2705
2698
  (define (query-inline-call [info datum] [args datum]) -> datum (inline-call info args api-phase))
2706
2699
 
2707
- (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))
2708
2701
 
2709
- (define (expand-head [s datum] [phase i32] [remember bool]) -> datum
2702
+ (define (expand-head [s datum] [phase i32]) -> datum
2710
2703
  (let ([e (syntax-e s)])
2711
2704
  (cond
2712
2705
  [(symbol? e)
@@ -2717,7 +2710,7 @@
2717
2710
  [('compile-time-value)
2718
2711
  (let ([t (transformer-of m)])
2719
2712
  (when (== t 0) (fail-at s "~a is bound to a compile-time value: read it with syntax-local-value" (list1 e)))
2720
- (head-transformer s t s phase remember))]
2713
+ (head-transformer s t s phase))]
2721
2714
  [('func) `(func ,(cadr m))]
2722
2715
  [('tag) (fail-at s "~a is a tag: throw it with (throw ~a arg ...)" `(,e ,e))]
2723
2716
  [('core 'prim) (fail-at s "bad use of ~a" (list1 e))]
@@ -2725,7 +2718,7 @@
2725
2718
  [else (unbound s e phase)]))]
2726
2719
  [(pair? e)
2727
2720
  (let* ([head (car e)] [m (if (identifier? head) (meaning-of head phase) 0)] [t (transformer-of m)])
2728
- (cond [(!= t 0) (head-transformer head t s phase remember)]
2721
+ (cond [(!= t 0) (head-transformer head t s phase)]
2729
2722
  [(and (!= m 0) (== (car m) 'core) (== (cadr m) 'include-text)) `(macro ,(included-text s))]
2730
2723
  [(and (!= m 0) (== (car m) 'core)) `(core ,(cadr m) ,s)]
2731
2724
  [(and (!= m 0) (== (car m) 'prim)) `(prim ,(cadr m) ,s)]
@@ -2734,38 +2727,27 @@
2734
2727
  (if (!= m 0)
2735
2728
  (fail-at s "#%app is bound here, but not to a macro or the core form" nil)
2736
2729
  (unbound head '#%app phase)))
2737
- (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)]))]
2738
2731
  [(null? e) (fail-at s "empty form ()" nil)]
2739
2732
  [(literal? e)
2740
2733
  (let* ([id (implicit-id s '#%datum)] [m (meaning-of id phase)] [t (transformer-of m)] [form (syntax-rewrap s `(,id ,s))])
2741
- (cond [(!= t 0) (head-transformer id t form phase remember)]
2734
+ (cond [(!= t 0) (head-transformer id t form phase)]
2742
2735
  [(and (!= m 0) (== (car m) 'core)) `(core #%datum ,form)]
2743
2736
  [else (fail-at s "the literal ~s needs #%datum, which is ~a here"
2744
2737
  `(,(syntax->datum s) ,(if (!= m 0) '"not a macro or the core form" '"unbound")))]))]
2745
2738
  [(keyword? e) (fail-at s "~s: keyword misused as an expression" (list1 e))]
2746
2739
  [else (fail-at s "~s is not an expression" (list1 (syntax->datum s)))])))
2747
2740
 
2748
- (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
2749
2742
  (if (form-value? t)
2750
2743
  (let ([l (syntax->list t)]) `(form ,(syntax-e (cadr l)) ,(if (pair? (cddr l)) (caddr l) 0) ,s ,t))
2751
- `(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))))
2752
2745
 
2753
- (define (query-apply-form [t datum] [s datum] [remember bool]) -> datum
2754
- (if remember
2755
- (remembered-expansion (if (pair? (syntax-e s)) (car (syntax-e s)) s) t s api-phase)
2756
- (apply-form t s api-phase)))
2746
+ (define (query-apply-form [t datum] [s datum]) -> datum (apply-form t s api-phase))
2757
2747
 
2758
2748
  (define (apply-form [t datum] [s datum] [phase i32]) -> datum
2759
2749
  (apply-macro (if (pair? (syntax-e s)) (car (syntax-e s)) s) t s phase #f))
2760
2750
 
2761
- (define (remembered-expansion [head datum] [t datum] [s datum] [phase i32]) -> datum
2762
- (let ([known (cast datum (hash-ref (-> current expansions) (cast u64 s)))])
2763
- (if (!= known 0)
2764
- known
2765
- (let ([x (apply-macro head t s phase #f)])
2766
- (hash-set! (-> current expansions) (cast u64 s) (cast u32 x))
2767
- x))))
2768
-
2769
2751
  (define (query-local-expand [s datum]) -> datum
2770
2752
  (unless (syntax? s) (fail-at api-where "local-expand: expected syntax" nil))
2771
2753
  (let ([saved-output to-syntax] [out datum 0])
@@ -2958,7 +2940,7 @@
2958
2940
  (fail-at s "unbound identifier ~a~a" `(,sym ,(if (> phase 0) (format " at phase ~a" (list1 (make-integer phase))) '""))))
2959
2941
 
2960
2942
  (define (expand-expr [s datum] [phase i32]) -> datum
2961
- (let ([h (expand-head s phase #f)])
2943
+ (let ([h (expand-head s phase)])
2962
2944
  (case (car h)
2963
2945
  [('local) (with-local-binding s (cadr h))]
2964
2946
  [('global 'func) (with-local-binding s 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])
@@ -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))
@@ -487,6 +487,6 @@
487
487
  (let ([p (datum->string path)] [info fs-info] [found #f])
488
488
  (for ([i u32 1]) (and (not found) (<= i (-> p length))) (+= i 1)
489
489
  (when (or (== i (-> p length)) (== (@ p i) #\/))
490
- (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)
491
491
  (== (-> info kind) fs-link)))))
492
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))
@@ -20,11 +20,11 @@
20
20
  s))
21
21
 
22
22
  (define (scope-index! [s (ptr serializer)] [sc u32]) -> u32
23
- (let ([known (hash-ref (-> s scopes) (+ (cast u64 sc) 1))])
23
+ (let ([known (hash-find (-> s scopes) (+ (cast u64 sc) 1))])
24
24
  (if (!= known 0)
25
- (- known 1)
25
+ (@ known)
26
26
  (let ([i (-> (-> s scopes) count)])
27
- (hash-set! (-> s scopes) (+ (cast u64 sc) 1) (+ i 1))
27
+ (hash-set! (-> s scopes) (+ (cast u64 sc) 1) i)
28
28
  (set! (-> s table) (cons (make-integer sc) (-> s table)))
29
29
  i))))
30
30
 
@@ -33,16 +33,23 @@
33
33
  (define (added! [s (ptr serializer)] [t (ptr hash-table)] [key u64]) -> u32
34
34
  (let ([i (-> s count)])
35
35
  (+= (-> s count) 1)
36
- (hash-set! t key (+ i 1))
36
+ (hash-set! t key i)
37
37
  i))
38
38
 
39
- (define (shared-index [s (ptr serializer)] [key datum]) -> u32
40
- (let ([i (datum-get (-> s shared) key)]) (if (== i 0) 0 (+ (cast u32 (integer-value i)) 1))))
39
+ (struct shared-entry [key datum] [index u32] [next (ptr shared-entry)])
40
+
41
+ (define (shared-find [s (ptr serializer)] [key datum]) -> (ptr u32)
42
+ (let ([e (cast (ptr shared-entry) (hash-ref (-> s shared) (datum-hash key)))])
43
+ (while (!= e 0)
44
+ (when (equal? (-> e key) key) (return (& (-> e index))))
45
+ (set! e (-> e next)))
46
+ 0))
41
47
 
42
48
  (define (shared-added! [s (ptr serializer)] [key datum]) -> u32
43
- (let ([i (-> s count)])
49
+ (let* ([t (-> s shared)] [h (datum-hash key)] [i (-> s count)]
50
+ [e (new (-> t arena) (shared-entry #:key key #:index i #:next (cast (ptr shared-entry) (hash-ref t h))))])
51
+ (hash-set! t h (cast u32 e))
44
52
  (+= (-> s count) 1)
45
- (datum-put! (-> s shared) key (make-integer i))
46
53
  i))
47
54
 
48
55
  (define (bytes! [p (ptr buffer)] [b (slice u8)])
@@ -52,70 +59,70 @@
52
59
  (define (small [n i64]) -> datum (make-integer n))
53
60
 
54
61
  (define (serialize! [s (ptr serializer)] [d datum]) -> u32
55
- (let ([p (& (-> s out))] [i u32 0])
62
+ (let ([p (& (-> s out))] [known (ptr u32) 0])
56
63
  (cond
57
64
  [(== d '#f)
58
- (set! i (shared-index s `(0)))
59
- (if (!= i 0) (- i 1) (begin (buffer-add-byte! p 0) (shared-added! s `(0))))]
65
+ (set! known (shared-find s `(0)))
66
+ (if (!= known 0) (@ known) (begin (buffer-add-byte! p 0) (shared-added! s `(0))))]
60
67
  [(fixnum? d)
61
68
  (let ([key (+ (cast u64 (integer-value d)) 1099511627776)])
62
- (set! i (hash-ref (-> s fixnums) key))
63
- (if (!= i 0)
64
- (- i 1)
69
+ (set! known (hash-find (-> s fixnums) key))
70
+ (if (!= known 0)
71
+ (@ known)
65
72
  (begin (buffer-add-byte! p 1) (write-sleb p (integer-value d)) (added! s (-> s fixnums) key))))]
66
73
  [(integer? d)
67
74
  (let* ([negative (integer-negative? d)] [v (integer-value d)]
68
75
  [magnitude (if negative (- 0 v) v)]
69
76
  [key `(10 ,(small negative) ,(make-unsigned-integer (cast u64 magnitude)))])
70
- (set! i (shared-index s key))
71
- (if (!= i 0)
72
- (- i 1)
77
+ (set! known (shared-find s key))
78
+ (if (!= known 0)
79
+ (@ known)
73
80
  (begin (buffer-add-byte! p 10)
74
81
  (buffer-add-byte! p negative)
75
82
  (for ([k u32 0]) (< k 8) (+= k 1)
76
83
  (buffer-add-byte! p (cast i32 (bit-and (>> (cast u64 magnitude) (* 8 k)) 255))))
77
84
  (shared-added! s key))))]
78
85
  [(== d (boolean #t))
79
- (set! i (shared-index s `(2)))
80
- (if (!= i 0) (- i 1) (begin (buffer-add-byte! p 2) (shared-added! s `(2))))]
86
+ (set! known (shared-find s `(2)))
87
+ (if (!= known 0) (@ known) (begin (buffer-add-byte! p 2) (shared-added! s `(2))))]
81
88
  [(null? d)
82
- (set! i (shared-index s `(3)))
83
- (if (!= i 0) (- i 1) (begin (buffer-add-byte! p 3) (shared-added! s `(3))))]
89
+ (set! known (shared-find s `(3)))
90
+ (if (!= known 0) (@ known) (begin (buffer-add-byte! p 3) (shared-added! s `(3))))]
84
91
  [(char? d)
85
92
  (let ([key `(4 ,d)])
86
- (set! i (shared-index s key))
87
- (if (!= i 0)
88
- (- i 1)
93
+ (set! known (shared-find s key))
94
+ (if (!= known 0)
95
+ (@ known)
89
96
  (begin (buffer-add-byte! p 4) (write-uleb p (char->integer d)) (shared-added! s key))))]
90
97
  [(pair? d) (serialize-list! s d)]
91
98
  [(symbol? d)
92
- (set! i (hash-ref (-> s atoms) (cast u64 d)))
93
- (if (!= i 0)
94
- (- i 1)
99
+ (set! known (hash-find (-> s atoms) (cast u64 d)))
100
+ (if (!= known 0)
101
+ (@ known)
95
102
  (begin (buffer-add-byte! p 6) (bytes! p (cast (slice u8) (symbol->string d))) (added! s (-> s atoms) (cast u64 d))))]
96
103
  [(string? d)
97
104
  (let ([key `(7 ,d)])
98
- (set! i (shared-index s key))
99
- (if (!= i 0)
100
- (- i 1)
105
+ (set! known (shared-find s key))
106
+ (if (!= known 0)
107
+ (@ known)
101
108
  (begin (buffer-add-byte! p 7) (bytes! p (cast (slice u8) (datum->string d))) (shared-added! s key))))]
102
109
  [(bytes? d)
103
110
  (let ([key `(14 ,d)])
104
- (set! i (shared-index s key))
105
- (if (!= i 0)
106
- (- i 1)
111
+ (set! known (shared-find s key))
112
+ (if (!= known 0)
113
+ (@ known)
107
114
  (begin (buffer-add-byte! p 14) (bytes! p (datum->bytes d)) (shared-added! s key))))]
108
115
  [(keyword? d)
109
- (set! i (hash-ref (-> s atoms) (cast u64 d)))
110
- (if (!= i 0)
111
- (- i 1)
116
+ (set! known (hash-find (-> s atoms) (cast u64 d)))
117
+ (if (!= known 0)
118
+ (@ known)
112
119
  (begin (buffer-add-byte! p 13) (bytes! p (cast (slice u8) (keyword->string d))) (added! s (-> s atoms) (cast u64 d))))]
113
120
  [(syntax? d) (serialize-syntax! s d)]
114
121
  [(flonum? d)
115
122
  (let* ([bits (f64-bits (flonum-value d))] [key `(11 ,(make-integer bits))])
116
- (set! i (shared-index s key))
117
- (if (!= i 0)
118
- (- i 1)
123
+ (set! known (shared-find s key))
124
+ (if (!= known 0)
125
+ (@ known)
119
126
  (begin (buffer-add-byte! p 11)
120
127
  (for ([k u32 0]) (< k 8) (+= k 1)
121
128
  (buffer-add-byte! p (cast i32 (bit-and (>> (cast u64 bits) (* 8 k)) 255))))
@@ -123,7 +130,7 @@
123
130
  [else (raise-compile-error 0 (format-message "internal: serialize: cannot quote ~s" (cons d nil))) 0])))
124
131
 
125
132
  (define (serialize-list! [s (ptr serializer)] [d datum]) -> u32
126
- (let ([cars nil] [l d] [b u32 0] [key u64 0] [i u32 0] [p (& (-> s out))])
133
+ (let ([cars nil] [l d] [b u32 0] [key u64 0] [known (ptr u32) 0] [p (& (-> s out))])
127
134
  (while (pair? l)
128
135
  (set! cars (cons (make-integer (serialize! s (car l))) cars))
129
136
  (set! l (cdr l)))
@@ -131,9 +138,9 @@
131
138
  (while (pair? cars)
132
139
  (let ([a (cast u32 (integer-value (car cars)))])
133
140
  (set! key (bit-or (<< (+ (cast u64 a) 1) 32) b))
134
- (set! i (hash-ref (-> s pairs) key))
135
- (set! b (if (!= i 0)
136
- (- i 1)
141
+ (set! known (hash-find (-> s pairs) key))
142
+ (set! b (if (!= known 0)
143
+ (@ known)
137
144
  (begin (buffer-add-byte! p 5) (write-uleb p a) (write-uleb p b) (added! s (-> s pairs) key)))))
138
145
  (set! cars (cdr cars)))
139
146
  b))
@@ -144,10 +151,10 @@
144
151
  [l (serialize-srcloc! s (syntax-srcloc d))]
145
152
  [r (serialize! s (syntax-props d))]
146
153
  [key `(8 ,(small e) ,(small sc) ,(small l) ,(small r))]
147
- [i (shared-index s key)]
154
+ [known (shared-find s key)]
148
155
  [p (& (-> s out))])
149
- (if (!= i 0)
150
- (- i 1)
156
+ (if (!= known 0)
157
+ (@ known)
151
158
  (begin (buffer-add-byte! p 8) (write-uleb p e) (write-uleb p sc) (write-uleb p l) (write-uleb p r)
152
159
  (shared-added! s key)))))
153
160
 
@@ -162,10 +169,10 @@
162
169
  (serialize! s 0)
163
170
  (let* ([src (serialize! s (-> l source))]
164
171
  [key `(9 ,(small src) ,(small (-> l line)) ,(small (-> l col)) ,(small (-> l pos)) ,(small (-> l span)))]
165
- [i (shared-index s key)]
172
+ [known (shared-find s key)]
166
173
  [p (& (-> s out))])
167
- (if (!= i 0)
168
- (- i 1)
174
+ (if (!= known 0)
175
+ (@ known)
169
176
  (begin (buffer-add-byte! p 9)
170
177
  (write-uleb p src)
171
178
  (write-sleb p (-> l line))
@@ -1,6 +1,6 @@
1
1
  ;; Substrate in one module: the language, its runtime and its library.
2
2
 
3
- (provide define struct union variant enum match exception throw try lambda inst typedef const let let* set!
3
+ (provide define struct union variant enum match exception throw try lambda typedef const let let* set!
4
4
  if return values import supply
5
5
  #%datum #%top-interaction #%module-begin
6
6
  when unless cond case while for break continue rethrow and or not cast sizeof offsetof array-of slice @ & ->
@@ -12,12 +12,15 @@
12
12
  printf print-bytes
13
13
  output-to! test expect expect-equal test-failed test-skipped
14
14
  buffer-add-entries! entry-strings
15
+ error error-fail! error-text error-free! host-failed!
16
+ error-missing error-unreachable error-refused error-timeout error-invalid error-aborted error-denied
17
+ error-in-use error-other error-not-granted error-exists
15
18
  sqrt fabs floor ceil trunc nearbyint copysign sqrtf fabsf floorf ceilf truncf nearbyintf copysignf
16
19
  malloc calloc realloc free try-malloc try-calloc try-realloc memcpy memset memcmp
17
20
  arena make-arena arena-alloc arena-start! arena-free new copy
18
21
  buffer make-buffer buffer-add! buffer-add-byte! buffer-add-string! buffer-add-utf-8! buffer-add-u32! buffer-add-f32!
19
22
  buffer-bytes buffer-string
20
- buffer-reserve buffer-free! buffer-trim! hash-bytes hash-table hash-ref hash-set! hash-clear! hash-free!
23
+ buffer-reserve buffer-free! buffer-trim! hash-bytes hash-table hash-find hash-ref hash-set! hash-clear! hash-free!
21
24
  string-copy
22
25
  f64-bits bits-f64 f32-bits digit-value digits? digits-integer read-decimal decimal-flonum shortest-digits
23
26
  write-digits write-flonum write-string)
@@ -26,7 +29,7 @@
26
29
 
27
30
  (define-syntax forms (quote-syntax (#%form forms)))
28
31
  (forms #%module-begin #%top-interaction define struct union variant enum match exception
29
- throw try lambda inst substrate-struct-check typedef const let let* #%datum when unless cond case array-of slice
32
+ throw try lambda substrate-struct-check typedef const let let* #%datum when unless cond case array-of slice
30
33
  while for cast sizeof offsetof -> & set! @ break continue rethrow new copy printf test expect expect-equal
31
34
  + - * / % == != < <= > >= and or not bit-and bit-or bit-xor bit-not << >>
32
35
  += -= *= /= %= <<= >>= bit-and= bit-or= bit-xor=)
@@ -86,10 +89,45 @@
86
89
 
87
90
  (func (reset-stack!) (set! sp (i32.add stack-base 4194304)))
88
91
 
92
+ ;; ---- errors ----
93
+ ;; A fallible function returns #t, or #f with an error as its last argument. Callers can pass a null pointer (0) when
94
+ ;; they do not need the error. They can do the same for an id the function creates. Error codes are defined here.
95
+
96
+ (const error-missing i32 1)
97
+ (const error-unreachable i32 2)
98
+ (const error-refused i32 3)
99
+ (const error-timeout i32 4)
100
+ (const error-invalid i32 5)
101
+ (const error-aborted i32 6)
102
+ (const error-denied i32 7)
103
+ (const error-in-use i32 8)
104
+ (const error-other i32 9)
105
+ (const error-not-granted i32 10)
106
+ (const error-exists i32 11)
107
+
108
+ (struct error [code i32] [message buffer])
109
+
110
+ (define (error-fail! [e (ptr error)] [code i32] [why string]) -> bool
111
+ (when (!= e 0)
112
+ (set! (-> e code) code)
113
+ (set! (-> e message length) 0)
114
+ (buffer-add-string! (& (-> e message)) why))
115
+ #f)
116
+
117
+ (define (error-text [e (ptr error)]) -> string (buffer-string (& (-> e message))))
118
+
119
+ (define (error-free! [e (ptr error)]) (buffer-free! (& (-> e message))))
120
+
121
+ (define (host-failed! [why (ptr string)] [e (ptr error)]) -> bool
122
+ (error-fail! e (failure_code) (@ why))
123
+ (free (-> why bytes))
124
+ #f)
125
+
89
126
  ;; ---- the host ----
90
127
  ;; Every program may call these host functions without a grant. A call that gives a string or bytes gives them in a
91
128
  ;; block from malloc for the caller to free; its pointer is 0 when there are none. A call that can fail stores the
92
- ;; reason at err as such a string, unless err is 0. Lists are slices of strings.
129
+ ;; reason at err as such a string, unless err is 0. failure_code then gives the failure's code. Lists are slices of
130
+ ;; strings.
93
131
 
94
132
  (import write "host" "write" (i32 i32 i32 -> i32))
95
133
  (import trap "host" "trap" (i32 i32 ->))
@@ -101,6 +139,7 @@
101
139
  (import program_modules "host" "program_modules" (i32 -> i32))
102
140
  (import module_bytes "host" "module_bytes" (i32 i32 i32 -> i32))
103
141
  (import compiled_file "host" "compiled_file" (i32 i32 i32 -> i32))
142
+ (import failure_code "host" "failure_code" (-> i32))
104
143
 
105
144
  (define (host-write [fd i32] [b (slice u8)]) #:inline -> i32 (write fd (cast i32 (-> b items)) (cast i32 (-> b length))))
106
145
  (define (host-trap [s string]) #:inline (trap (cast i32 (-> s bytes)) (cast i32 (-> s length))))
@@ -128,15 +167,15 @@
128
167
  ;; is a worker, in which case its parent gets the reason when the worker ends.
129
168
  (define (host-exit [code i32] [reason string]) #:inline
130
169
  (exit code (cast i32 (-> reason bytes)) (cast i32 (-> reason length))))
131
- (define (host-instantiate [name string] [code (slice u8)] [imports (slice string)] [compile-time bool] [err (ptr string)])
132
- -> i32
133
- (let ([b (make-buffer)] [r 0])
170
+ (define (host-instantiate [name string] [code (slice u8)] [imports (slice string)] [compile-time bool]
171
+ [err (ptr error)]) -> bool
172
+ (let ([b (make-buffer)] [r 0] [why string])
134
173
  (buffer-add-entries! (& b) imports)
135
174
  (set! r (instantiate (cast i32 (-> name bytes)) (cast i32 (-> name length)) (cast i32 (-> code items))
136
175
  (cast i32 (-> code length)) (cast i32 (-> b bytes)) (cast i32 (-> b length)) compile-time
137
- (cast i32 err)))
176
+ (cast i32 (& why))))
138
177
  (buffer-free! (& b))
139
- r))
178
+ (or (== r 0) (host-failed! (& why) err))))
140
179
  (define (host-export-index [instance string] [field string]) #:inline -> i32
141
180
  (export_index (cast i32 (-> instance bytes)) (cast i32 (-> instance length)) (cast i32 (-> field bytes))
142
181
  (cast i32 (-> field length))))
@@ -586,15 +625,18 @@
586
625
 
587
626
  (struct hash-table [keys (ptr u64)] [values (ptr u32)] [count u32] [capacity u32] [shift u32] [arena (ptr arena)])
588
627
 
589
- (define (hash-ref [t (ptr hash-table)] [key u64]) #:inline -> u32
628
+ (define (hash-find [t (ptr hash-table)] [key u64]) #:inline -> (ptr u32)
590
629
  (if (== (-> t capacity) 0)
591
630
  0
592
631
  (let* ([keys (-> t keys)] [mask (- (-> t capacity) 1)] [i (cast u32 (>> (* key 11400714819323198485) (-> t shift)))])
593
632
  (while (!= (@ keys i) 0)
594
- (when (== (@ keys i) key) (return (@ (-> t values) i)))
633
+ (when (== (@ keys i) key) (return (+ (-> t values) i)))
595
634
  (set! i (bit-and (+ i 1) mask)))
596
635
  0)))
597
636
 
637
+ (define (hash-ref [t (ptr hash-table)] [key u64]) #:inline -> u32
638
+ (let ([p (hash-find t key)]) (if (== p 0) 0 (@ p))))
639
+
598
640
  (define (hash-set! [t (ptr hash-table)] [key u64] [value u32])
599
641
  (when (>= (* 2 (+ (-> t count) 1)) (-> t capacity)) (hash-grow t))
600
642
  (let* ([keys (-> t keys)] [mask (- (-> t capacity) 1)] [i (cast u32 (>> (* key 11400714819323198485) (-> t shift)))])
@@ -1,7 +1,7 @@
1
- // The error codes of failed events (events.sub), and errorOf, which gives a JavaScript error its code.
1
+ // The error codes (compiler/substrate.sub), and errorOf, which gives a JavaScript error its code.
2
2
  export const errors = {
3
3
  missing: 1, unreachable: 2, refused: 3, timeout: 4, invalid: 5, aborted: 6, denied: 7, inUse: 8, other: 9,
4
- notGranted: 10,
4
+ notGranted: 10, exists: 11,
5
5
  };
6
6
 
7
7
  const unreachable = new Set(['ENOTFOUND', 'EAI_AGAIN', 'EHOSTUNREACH', 'ENETUNREACH']);
@@ -13,6 +13,7 @@ export function errorOf(e) {
13
13
  if (e.name === 'NotAllowedError' || e.name === 'SecurityError') return errors.denied;
14
14
  if (e.code === 'ENOENT' || e.code === 'ENOTDIR') return errors.missing;
15
15
  if (e.code === 'EACCES' || e.code === 'EPERM') return errors.denied;
16
+ if (e.code === 'EEXIST') return errors.exists;
16
17
  if (e.code === 'ECONNREFUSED') return errors.refused;
17
18
  if (e.code === 'EADDRINUSE') return errors.inUse;
18
19
  if (e.code === 'ECONNRESET' || e.code === 'EPIPE') return errors.aborted;