substrate-lang 0.9.3 → 0.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/build/compiler/binary.2d43b43d1600@0+0.wasm +0 -0
- package/build/compiler/checker.4dd4556dd421@0+0.wasm +0 -0
- package/build/compiler/compile.5d8f6407af2a@0+0.wasm +0 -0
- package/build/compiler/{core.fc3dab9d1846@0+0.wasm → core.f2defb75e00b@0+0.wasm} +0 -0
- package/build/compiler/expander.967ce443d379@0+0.wasm +0 -0
- package/build/compiler/fs.01b8aab4a9a8@0+0.wasm +0 -0
- package/build/compiler/{leb128.748b1c37277a@0+0.wasm → leb128.15d814b7b4f2@0+0.wasm} +0 -0
- package/build/compiler/{link.11b643d35670@0+0.wasm → link.b826ea7c8f17@0+0.wasm} +0 -0
- package/build/compiler/{macros.4083601c00db@0+0.wasm → macros.b269e0c42784@0+0.wasm} +0 -0
- package/build/compiler/{main.ed62cce43000@0+0.wasm → main.4fc52f204d54@0+0.wasm} +0 -0
- package/build/compiler/{ops.b361e858d8e1@0+0.wasm → ops.515b5e05f646@0+0.wasm} +0 -0
- package/build/compiler/{path.dcc4712bcc7b@0+0.wasm → path.5a6286472cd4@0+0.wasm} +0 -0
- package/build/compiler/program +21 -21
- package/build/compiler/prune.406215c3e4f8@0+0.wasm +0 -0
- package/build/compiler/reader.694b03770bf0@0+0.wasm +0 -0
- package/build/compiler/roots.cefd10e93684@0+0.wasm +0 -0
- package/build/compiler/{running.d73f7826cb74@0+0.wasm → running.0d25dbaec018@0+0.wasm} +0 -0
- package/build/compiler/serialize.b0d82f3d63d2@0+0.wasm +0 -0
- package/build/compiler/{sha256.5fc9d60f8bb2@0+0.wasm → sha256.a6c32b04d799@0+0.wasm} +0 -0
- package/build/compiler/substrate.5ee5d0b4d3e7@0+0.wasm +0 -0
- package/build/compiler/syntax.32f3e40b61c7@0+0.wasm +0 -0
- package/build/compiler/{writer.806bc85aa684@0+0.wasm → writer.00b7802cbe39@0+0.wasm} +0 -0
- package/build/sub/{base64.8fba03e1be0a@0+0.wasm → base64.a26bdcf60a2d@0+0.wasm} +0 -0
- package/build/sub/build.459c5b9412bd@0+0.wasm +0 -0
- package/build/sub/chromium.3d5818f2707d@0+0.wasm +0 -0
- package/build/sub/common.1edc613607a0@0+0.wasm +0 -0
- package/build/sub/deflate.23f7c4679260@0+0.wasm +0 -0
- package/build/sub/doc.0775df5de6fe@0+0.wasm +0 -0
- package/build/sub/{doc.566f9861828e@0+0.wasm → doc.ef9965d5d402@0+0.wasm} +0 -0
- package/build/sub/env.e5451da6e747@0+0.wasm +0 -0
- package/build/sub/events.bf5473ebf220@0+0.wasm +0 -0
- package/build/sub/fetch.7790d4943758@0+0.wasm +0 -0
- package/build/sub/fetch.96b2d10f025e@0+0.wasm +0 -0
- package/build/sub/files.ad0469fdf6fa@0+0.wasm +0 -0
- package/build/sub/fs.01b8aab4a9a8@0+0.wasm +0 -0
- package/build/sub/git.dc4c0e757ebe@0+0.wasm +0 -0
- package/build/sub/grants.c54776c0d7e3@0+0.wasm +0 -0
- package/build/sub/gzip.16e372eda1cf@0+0.wasm +0 -0
- package/build/sub/hash.660682e4f491@0+0.wasm +0 -0
- package/build/sub/{html.20baa1dc7ca6@0+0.wasm → html.a23126eb949a@0+0.wasm} +0 -0
- package/build/sub/{html.c1671a102b4d@0+0.wasm → html.e9ed37f34977@0+0.wasm} +0 -0
- package/build/sub/{inflate.8899e0933792@0+0.wasm → inflate.59bb61f14001@0+0.wasm} +0 -0
- package/build/sub/json.55590d2f518a@0+0.wasm +0 -0
- package/build/sub/manifest.ef317480deb0@0+0.wasm +0 -0
- package/build/sub/map.f455cca6a42a@0+0.wasm +0 -0
- package/build/sub/pack.e02836264f6a@0+0.wasm +0 -0
- package/build/sub/{path.dcc4712bcc7b@0+0.wasm → path.5a6286472cd4@0+0.wasm} +0 -0
- package/build/sub/path.6891ffea73ca@0+0.wasm +0 -0
- package/build/sub/process.7106571fa723@0+0.wasm +0 -0
- package/build/sub/program +48 -48
- package/build/sub/read.0b93933d62a2@0+0.wasm +0 -0
- package/build/sub/{reader.b535e61f99f4@0+0.wasm → reader.694b03770bf0@0+0.wasm} +0 -0
- package/build/sub/{root.9b713ec588c1@0+0.wasm → root.f10a4906f460@0+0.wasm} +0 -0
- package/build/sub/{roots.6d2942578055@0+0.wasm → roots.cefd10e93684@0+0.wasm} +0 -0
- package/build/sub/{sha256.5fc9d60f8bb2@0+0.wasm → sha256.a6c32b04d799@0+0.wasm} +0 -0
- package/build/sub/{sha512.b988b9dc6114@0+0.wasm → sha512.c24a792d7891@0+0.wasm} +0 -0
- package/build/sub/site.1732b58ec0e8@0+0.wasm +0 -0
- package/build/sub/site.ae3913b0b0f4@0+0.wasm +0 -0
- package/build/sub/store.a24d7a25daa6@0+0.wasm +0 -0
- package/build/sub/stream.126e3bd5d626@0+0.wasm +0 -0
- package/build/sub/sub.2e3092140706@0+0.wasm +0 -0
- package/build/sub/substrate.5ee5d0b4d3e7@0+0.wasm +0 -0
- package/build/sub/{syntax.9857f6784d63@0+0.wasm → syntax.32f3e40b61c7@0+0.wasm} +0 -0
- package/build/sub/tar.2a633861e654@0+0.wasm +0 -0
- package/build/sub/test.9bd59c73f65e@0+0.wasm +0 -0
- package/build/sub/{text.4ab70ac35b5a@0+0.wasm → text.1bc90482bd43@0+0.wasm} +0 -0
- package/build/sub/{timer.3809bb17a7a1@0+0.wasm → timer.f35eb62ae446@0+0.wasm} +0 -0
- package/build/sub/upgrade.39ee449b00d5@0+0.wasm +0 -0
- package/build/sub/{utf8.524c475ecd40@0+0.wasm → utf8.e7216bd054e1@0+0.wasm} +0 -0
- package/build/sub/worker.762a9d642af0@0+0.wasm +0 -0
- package/build/sub/writer.00b7802cbe39@0+0.wasm +0 -0
- package/package.json +1 -1
- package/std/archive/tar.sub +44 -44
- package/std/browser/chromium.sub +5 -4
- package/std/browser/devtools.sub +24 -19
- package/std/compress/deflate.sub +10 -12
- package/std/compress/gzip.sub +18 -16
- package/std/compress/inflate.sub +7 -4
- package/std/crypto/password.sub +3 -3
- package/std/doc/doc.sub +2 -2
- package/std/encoding/json.sub +64 -73
- package/std/encoding/wire.sub +15 -15
- package/std/http/checks.sub +3 -3
- package/std/http/conditional.sub +2 -4
- package/std/http/cookie.sub +5 -7
- package/std/http/form.sub +9 -12
- package/std/http/http.sub +17 -24
- package/std/http/multipart.sub +13 -15
- package/std/http/route.sub +18 -13
- package/std/http/server.sub +21 -23
- package/std/http/session.sub +3 -6
- package/std/http/sse-client.sub +9 -14
- package/std/http/static.sub +5 -5
- package/std/http/url.sub +10 -10
- package/std/http/websocket.sub +2 -5
- package/std/meta/derive.sub +0 -2
- package/std/meta/method.sub +41 -0
- package/std/meta/type-info.sub +30 -37
- package/std/package/files.sub +24 -25
- package/std/package/git.sub +26 -33
- package/std/package/hash.sub +9 -9
- package/std/package/manifest.sub +81 -57
- package/std/package/map.sub +5 -9
- package/std/package/pack.sub +13 -13
- package/std/package/path.sub +1 -4
- package/std/package/read.sub +10 -14
- package/std/package/site.sub +11 -11
- package/std/package/store.sub +16 -12
- package/std/package.sub +6 -6
- package/std/test/browser.sub +9 -8
- package/std/test/build.sub +2 -2
- package/std/test/compare.sub +9 -10
- package/std/test/page.sub +32 -27
- package/std/test/run.sub +9 -8
- package/std/test/test.sub +36 -30
- package/std/vector/vector.sub +75 -0
- package/substrate/VERSION +1 -1
- package/substrate/compiler/binary.sub +5 -14
- package/substrate/compiler/checker.sub +235 -222
- package/substrate/compiler/compile.sub +11 -11
- package/substrate/compiler/expander.sub +52 -78
- package/substrate/compiler/link.sub +2 -2
- package/substrate/compiler/main.sub +9 -9
- package/substrate/compiler/ops.sub +1 -1
- package/substrate/compiler/prune.sub +12 -17
- package/substrate/compiler/reader.sub +4 -4
- package/substrate/compiler/roots.sub +11 -10
- package/substrate/compiler/running.sub +1 -1
- package/substrate/compiler/serialize.sub +57 -50
- package/substrate/compiler/substrate.sub +60 -23
- package/substrate/compiler/syntax.sub +8 -21
- package/substrate/host/errors.mjs +3 -2
- package/substrate/host/events.sub +3 -16
- package/substrate/host/fs.mjs +5 -4
- package/substrate/host/fs.sub +142 -112
- package/substrate/host/grants.mjs +1 -1
- package/substrate/host/grants.sub +33 -33
- package/substrate/host/modules/fake.mjs +1 -1
- package/substrate/host/modules/websocket.mjs +4 -4
- package/substrate/host/modules/websocket.sub +8 -6
- package/substrate/host/node/env.mjs +12 -6
- package/substrate/host/node/env.sub +21 -16
- package/substrate/host/node/fs.mjs +1 -1
- package/substrate/host/node/net.mjs +2 -2
- package/substrate/host/node/net.sub +13 -6
- package/substrate/host/node/process.mjs +4 -4
- package/substrate/host/node/process.sub +28 -28
- package/substrate/host/node/signal.mjs +3 -2
- package/substrate/host/node/signal.sub +9 -6
- package/substrate/host/node/watch.mjs +1 -1
- package/substrate/host/node/watch.sub +11 -9
- package/substrate/host/stream.sub +2 -0
- package/substrate/host/subhost-core.mjs +9 -1
- package/substrate/host/web/clipboard.mjs +2 -2
- package/substrate/host/web/clipboard.sub +10 -3
- package/substrate/host/web/files.mjs +2 -2
- package/substrate/host/web/files.sub +6 -2
- package/substrate/host/web/fs.mjs +3 -3
- package/substrate/host/web/location.mjs +3 -1
- package/substrate/host/web/location.sub +8 -4
- package/substrate/host/worker-side.mjs +3 -1
- package/substrate/host/worker.mjs +6 -5
- package/substrate/host/worker.sub +10 -10
- package/build/compiler/binary.3823f89ce414@0+0.wasm +0 -0
- package/build/compiler/checker.592d37dcbec9@0+0.wasm +0 -0
- package/build/compiler/compile.86a2b03b0c9b@0+0.wasm +0 -0
- package/build/compiler/expander.689d326e5a1b@0+0.wasm +0 -0
- package/build/compiler/fs.563034be70c3@0+0.wasm +0 -0
- package/build/compiler/prune.d4a3f9834095@0+0.wasm +0 -0
- package/build/compiler/reader.b535e61f99f4@0+0.wasm +0 -0
- package/build/compiler/roots.6d2942578055@0+0.wasm +0 -0
- package/build/compiler/serialize.b2196de75bc8@0+0.wasm +0 -0
- package/build/compiler/substrate.4c780d6dd6d4@0+0.wasm +0 -0
- package/build/compiler/syntax.9857f6784d63@0+0.wasm +0 -0
- package/build/sub/build.84ac996eda63@0+0.wasm +0 -0
- package/build/sub/chromium.e4db7d29897c@0+0.wasm +0 -0
- package/build/sub/common.91ddee6b7a67@0+0.wasm +0 -0
- package/build/sub/deflate.fc8075e3aed1@0+0.wasm +0 -0
- package/build/sub/doc.0b48bbac404b@0+0.wasm +0 -0
- package/build/sub/env.f051f8166526@0+0.wasm +0 -0
- package/build/sub/events.f952172735e0@0+0.wasm +0 -0
- package/build/sub/fetch.097f1cc9502d@0+0.wasm +0 -0
- package/build/sub/fetch.5d2f427c995e@0+0.wasm +0 -0
- package/build/sub/files.30e55182c5df@0+0.wasm +0 -0
- package/build/sub/fs.563034be70c3@0+0.wasm +0 -0
- package/build/sub/git.48aefa1644be@0+0.wasm +0 -0
- package/build/sub/grants.5bf25700d47c@0+0.wasm +0 -0
- package/build/sub/gzip.69588e97c35a@0+0.wasm +0 -0
- package/build/sub/hash.3f0d118da63f@0+0.wasm +0 -0
- package/build/sub/json.f15a29d99d8d@0+0.wasm +0 -0
- package/build/sub/manifest.cf7471880377@0+0.wasm +0 -0
- package/build/sub/map.dc516eec27ff@0+0.wasm +0 -0
- package/build/sub/pack.55992e8cc09c@0+0.wasm +0 -0
- package/build/sub/path.b7a8e1cf3aaa@0+0.wasm +0 -0
- package/build/sub/process.aea2c88cb7a0@0+0.wasm +0 -0
- package/build/sub/read.cd1e693f4fb4@0+0.wasm +0 -0
- package/build/sub/site.7c6d8c7747af@0+0.wasm +0 -0
- package/build/sub/site.81548474c323@0+0.wasm +0 -0
- package/build/sub/store.d4e845ff24ac@0+0.wasm +0 -0
- package/build/sub/stream.4c07247477f7@0+0.wasm +0 -0
- package/build/sub/sub.b57e17b6876b@0+0.wasm +0 -0
- package/build/sub/substrate.4c780d6dd6d4@0+0.wasm +0 -0
- package/build/sub/tar.e482cf873cfc@0+0.wasm +0 -0
- package/build/sub/test.0d9c079bb309@0+0.wasm +0 -0
- package/build/sub/upgrade.18a5aa0dae89@0+0.wasm +0 -0
- package/build/sub/worker.f1190de21b21@0+0.wasm +0 -0
- package/build/sub/writer.806bc85aa684@0+0.wasm +0 -0
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
[atoms (ptr hash-table)] [pairs (ptr hash-table)] [scopes (ptr hash-table)] [table datum])
|
|
9
9
|
|
|
10
10
|
(define (make-serializer) -> (ptr serializer)
|
|
11
|
-
(let ([s (
|
|
11
|
+
(let ([s (new (current-arena) serializer)])
|
|
12
12
|
(set! (-> s out) (make-buffer))
|
|
13
13
|
(set! (-> s count) 0)
|
|
14
14
|
(set! (-> s shared) (make-table))
|
|
@@ -20,11 +20,11 @@
|
|
|
20
20
|
s))
|
|
21
21
|
|
|
22
22
|
(define (scope-index! [s (ptr serializer)] [sc u32]) -> u32
|
|
23
|
-
(let ([known (hash-
|
|
23
|
+
(let ([known (hash-find (-> s scopes) (+ (cast u64 sc) 1))])
|
|
24
24
|
(if (!= known 0)
|
|
25
|
-
(
|
|
25
|
+
(@ known)
|
|
26
26
|
(let ([i (-> (-> s scopes) count)])
|
|
27
|
-
(hash-set! (-> s scopes) (+ (cast u64 sc) 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
|
|
36
|
+
(hash-set! t key i)
|
|
37
37
|
i))
|
|
38
38
|
|
|
39
|
-
(
|
|
40
|
-
|
|
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))] [
|
|
62
|
+
(let ([p (& (-> s out))] [known (ptr u32) 0])
|
|
56
63
|
(cond
|
|
57
64
|
[(== d '#f)
|
|
58
|
-
(set!
|
|
59
|
-
(if (!=
|
|
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!
|
|
63
|
-
(if (!=
|
|
64
|
-
(
|
|
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!
|
|
71
|
-
(if (!=
|
|
72
|
-
(
|
|
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!
|
|
80
|
-
(if (!=
|
|
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!
|
|
83
|
-
(if (!=
|
|
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!
|
|
87
|
-
(if (!=
|
|
88
|
-
(
|
|
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!
|
|
93
|
-
(if (!=
|
|
94
|
-
(
|
|
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!
|
|
99
|
-
(if (!=
|
|
100
|
-
(
|
|
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!
|
|
105
|
-
(if (!=
|
|
106
|
-
(
|
|
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!
|
|
110
|
-
(if (!=
|
|
111
|
-
(
|
|
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!
|
|
117
|
-
(if (!=
|
|
118
|
-
(
|
|
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] [
|
|
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!
|
|
135
|
-
(set! b (if (!=
|
|
136
|
-
(
|
|
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
|
-
[
|
|
154
|
+
[known (shared-find s key)]
|
|
148
155
|
[p (& (-> s out))])
|
|
149
|
-
(if (!=
|
|
150
|
-
(
|
|
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
|
-
[
|
|
172
|
+
[known (shared-find s key)]
|
|
166
173
|
[p (& (-> s out))])
|
|
167
|
-
(if (!=
|
|
168
|
-
(
|
|
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 match exception throw try lambda
|
|
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
|
-
arena make-arena arena-alloc arena-start! arena-free new
|
|
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)
|
|
@@ -25,9 +28,9 @@
|
|
|
25
28
|
;; ---- the forms ----
|
|
26
29
|
|
|
27
30
|
(define-syntax forms (quote-syntax (#%form forms)))
|
|
28
|
-
(forms #%module-begin #%top-interaction define struct union variant match exception
|
|
29
|
-
throw try lambda
|
|
30
|
-
while for cast sizeof offsetof -> & set! @ break continue rethrow new printf test expect expect-equal
|
|
31
|
+
(forms #%module-begin #%top-interaction define struct union variant enum match exception
|
|
32
|
+
throw try lambda substrate-struct-check typedef const let let* #%datum when unless cond case array-of slice
|
|
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=)
|
|
33
36
|
|
|
@@ -44,6 +47,7 @@
|
|
|
44
47
|
(constant (const NAME TYPE VALUE))
|
|
45
48
|
(type (struct NAME FIELD ...))
|
|
46
49
|
(type (variant NAME CASE ...))
|
|
50
|
+
(type (enum NAME CASE ...))
|
|
47
51
|
(type (typedef NAME TYPE))
|
|
48
52
|
(exception (exception NAME TYPE ...))
|
|
49
53
|
(macro (define-syntax NAME _))
|
|
@@ -85,10 +89,45 @@
|
|
|
85
89
|
|
|
86
90
|
(func (reset-stack!) (set! sp (i32.add stack-base 4194304)))
|
|
87
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
|
+
|
|
88
126
|
;; ---- the host ----
|
|
89
127
|
;; Every program may call these host functions without a grant. A call that gives a string or bytes gives them in a
|
|
90
128
|
;; block from malloc for the caller to free; its pointer is 0 when there are none. A call that can fail stores the
|
|
91
|
-
;; reason at err as such a string, unless err is 0. Lists are slices of
|
|
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.
|
|
92
131
|
|
|
93
132
|
(import write "host" "write" (i32 i32 i32 -> i32))
|
|
94
133
|
(import trap "host" "trap" (i32 i32 ->))
|
|
@@ -100,6 +139,7 @@
|
|
|
100
139
|
(import program_modules "host" "program_modules" (i32 -> i32))
|
|
101
140
|
(import module_bytes "host" "module_bytes" (i32 i32 i32 -> i32))
|
|
102
141
|
(import compiled_file "host" "compiled_file" (i32 i32 i32 -> i32))
|
|
142
|
+
(import failure_code "host" "failure_code" (-> i32))
|
|
103
143
|
|
|
104
144
|
(define (host-write [fd i32] [b (slice u8)]) #:inline -> i32 (write fd (cast i32 (-> b items)) (cast i32 (-> b length))))
|
|
105
145
|
(define (host-trap [s string]) #:inline (trap (cast i32 (-> s bytes)) (cast i32 (-> s length))))
|
|
@@ -127,15 +167,15 @@
|
|
|
127
167
|
;; is a worker, in which case its parent gets the reason when the worker ends.
|
|
128
168
|
(define (host-exit [code i32] [reason string]) #:inline
|
|
129
169
|
(exit code (cast i32 (-> reason bytes)) (cast i32 (-> reason length))))
|
|
130
|
-
(define (host-instantiate [name string] [code (slice u8)] [imports (slice string)] [compile-time bool]
|
|
131
|
-
|
|
132
|
-
(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])
|
|
133
173
|
(buffer-add-entries! (& b) imports)
|
|
134
174
|
(set! r (instantiate (cast i32 (-> name bytes)) (cast i32 (-> name length)) (cast i32 (-> code items))
|
|
135
175
|
(cast i32 (-> code length)) (cast i32 (-> b bytes)) (cast i32 (-> b length)) compile-time
|
|
136
|
-
(cast i32
|
|
176
|
+
(cast i32 (& why))))
|
|
137
177
|
(buffer-free! (& b))
|
|
138
|
-
r))
|
|
178
|
+
(or (== r 0) (host-failed! (& why) err))))
|
|
139
179
|
(define (host-export-index [instance string] [field string]) #:inline -> i32
|
|
140
180
|
(export_index (cast i32 (-> instance bytes)) (cast i32 (-> instance length)) (cast i32 (-> field bytes))
|
|
141
181
|
(cast i32 (-> field length))))
|
|
@@ -183,10 +223,7 @@
|
|
|
183
223
|
|
|
184
224
|
;; ---- strings and slices ----
|
|
185
225
|
|
|
186
|
-
(define (string-copy [s string]) -> string
|
|
187
|
-
(let ([p (cast (ptr u8) (malloc (-> s length)))])
|
|
188
|
-
(memcpy p (-> s bytes) (-> s length))
|
|
189
|
-
(cast string (slice p (-> s length)))))
|
|
226
|
+
(define (string-copy [s string]) -> string (copy 0 s))
|
|
190
227
|
|
|
191
228
|
;; The checker's code calls these to compare strings by their bytes, and to trap on an index or a part out of range.
|
|
192
229
|
|
|
@@ -588,15 +625,18 @@
|
|
|
588
625
|
|
|
589
626
|
(struct hash-table [keys (ptr u64)] [values (ptr u32)] [count u32] [capacity u32] [shift u32] [arena (ptr arena)])
|
|
590
627
|
|
|
591
|
-
(define (hash-
|
|
628
|
+
(define (hash-find [t (ptr hash-table)] [key u64]) #:inline -> (ptr u32)
|
|
592
629
|
(if (== (-> t capacity) 0)
|
|
593
630
|
0
|
|
594
631
|
(let* ([keys (-> t keys)] [mask (- (-> t capacity) 1)] [i (cast u32 (>> (* key 11400714819323198485) (-> t shift)))])
|
|
595
632
|
(while (!= (@ keys i) 0)
|
|
596
|
-
(when (== (@ keys i) key) (return (
|
|
633
|
+
(when (== (@ keys i) key) (return (+ (-> t values) i)))
|
|
597
634
|
(set! i (bit-and (+ i 1) mask)))
|
|
598
635
|
0)))
|
|
599
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
|
+
|
|
600
640
|
(define (hash-set! [t (ptr hash-table)] [key u64] [value u32])
|
|
601
641
|
(when (>= (* 2 (+ (-> t count) 1)) (-> t capacity)) (hash-grow t))
|
|
602
642
|
(let* ([keys (-> t keys)] [mask (- (-> t capacity) 1)] [i (cast u32 (>> (* key 11400714819323198485) (-> t shift)))])
|
|
@@ -977,7 +1017,7 @@
|
|
|
977
1017
|
(+ ten-powers (* 2 (+ q 348))))
|
|
978
1018
|
|
|
979
1019
|
(define (make-ten-powers) -> (ptr u64)
|
|
980
|
-
(let* ([t (
|
|
1020
|
+
(let* ([t (-> (new 0 u64 1392) items)] [limbs (array u64 44)] [x (slice limbs)])
|
|
981
1021
|
(memset limbs 0 352)
|
|
982
1022
|
(set! (@ x 0) 1)
|
|
983
1023
|
(for ([q 0]) (<= q 347) (+= q 1)
|
|
@@ -1020,10 +1060,7 @@
|
|
|
1020
1060
|
[else (bit-or (<< (cast u64 (+ e2 1075)) 52) (- mant 4503599627370496))])))
|
|
1021
1061
|
|
|
1022
1062
|
;; A number is 32-bit limbs, least significant first, each in a u64.
|
|
1023
|
-
(define (big-new [a (ptr arena)] [len u32]) -> (slice u64)
|
|
1024
|
-
(let ([x (cast (ptr u64) (arena-alloc a (* 8 len)))])
|
|
1025
|
-
(memset x 0 (* 8 len))
|
|
1026
|
-
(slice x len)))
|
|
1063
|
+
(define (big-new [a (ptr arena)] [len u32]) -> (slice u64) (new a u64 len))
|
|
1027
1064
|
|
|
1028
1065
|
(define (big-mul-add! [x (slice u64)] [k u64] [c u64])
|
|
1029
1066
|
(for ([i u32 0]) (< i (-> x length)) (+= i 1)
|
|
@@ -90,7 +90,7 @@
|
|
|
90
90
|
(define (in-run-arena?) -> bool (== current (& run-arena)))
|
|
91
91
|
|
|
92
92
|
(define (begin-module-arena)
|
|
93
|
-
(let ([m (
|
|
93
|
+
(let ([m (new 0 module-arena)])
|
|
94
94
|
(set! (-> m arena) (make-arena))
|
|
95
95
|
(set! (-> m outer) innermost)
|
|
96
96
|
(set! innermost m)
|
|
@@ -302,7 +302,7 @@
|
|
|
302
302
|
|
|
303
303
|
;; ---- tables in an arena ----
|
|
304
304
|
(define (make-table) -> (ptr hash-table)
|
|
305
|
-
(let ([t (
|
|
305
|
+
(let ([t (new current hash-table)])
|
|
306
306
|
(set! (-> t arena) current)
|
|
307
307
|
t))
|
|
308
308
|
|
|
@@ -322,7 +322,7 @@
|
|
|
322
322
|
(set! (-> e value) value)
|
|
323
323
|
(return))
|
|
324
324
|
(set! e (-> e next)))
|
|
325
|
-
(set! e (
|
|
325
|
+
(set! e (new (-> t arena) entry))
|
|
326
326
|
(set! (-> e key) key)
|
|
327
327
|
(set! (-> e value) value)
|
|
328
328
|
(set! (-> e next) first)
|
|
@@ -341,10 +341,7 @@
|
|
|
341
341
|
(define symbols hash-table)
|
|
342
342
|
(define keywords hash-table)
|
|
343
343
|
|
|
344
|
-
(define (kept-text [s string]) -> string
|
|
345
|
-
(let ([p (cast (ptr u8) (arena-alloc (& run-arena) (-> s length)))])
|
|
346
|
-
(memcpy p (-> s bytes) (-> s length))
|
|
347
|
-
(cast string (slice p (-> s length)))))
|
|
344
|
+
(define (kept-text [s string]) -> string (copy (& run-arena) s))
|
|
348
345
|
|
|
349
346
|
(define (held-text [s string]) -> string
|
|
350
347
|
(let ([p (held-bytes (-> s length))])
|
|
@@ -519,11 +516,7 @@
|
|
|
519
516
|
;; ---- changes to scopes ----
|
|
520
517
|
|
|
521
518
|
(define (new-change [sc u32] [kind u32] [next (ptr change)]) -> (ptr change)
|
|
522
|
-
(
|
|
523
|
-
(set! (-> c scope) sc)
|
|
524
|
-
(set! (-> c kind) kind)
|
|
525
|
-
(set! (-> c next) next)
|
|
526
|
-
c))
|
|
519
|
+
(new current (change #:scope sc #:kind kind #:next next)))
|
|
527
520
|
|
|
528
521
|
(define (changes-add [cs (ptr change)] [sc u32] [kind u32]) -> (ptr change)
|
|
529
522
|
(cond [(== cs 0) (new-change sc kind 0)]
|
|
@@ -600,13 +593,7 @@
|
|
|
600
593
|
(make-cell (syntax e scopes loc props 0)))
|
|
601
594
|
|
|
602
595
|
(define (make-srcloc [source datum] [line u32] [col u32] [pos u32] [span u32]) -> (ptr srcloc)
|
|
603
|
-
(
|
|
604
|
-
(set! (-> l source) source)
|
|
605
|
-
(set! (-> l line) line)
|
|
606
|
-
(set! (-> l col) col)
|
|
607
|
-
(set! (-> l pos) pos)
|
|
608
|
-
(set! (-> l span) span)
|
|
609
|
-
l))
|
|
596
|
+
(new current (srcloc #:source source #:line line #:col col #:pos pos #:span span)))
|
|
610
597
|
|
|
611
598
|
(define (syntax-e [s datum]) #:copied -> datum
|
|
612
599
|
(match (cell-of s)
|
|
@@ -730,7 +717,7 @@
|
|
|
730
717
|
(define (keep-srcloc [l (ptr srcloc)]) -> (ptr srcloc)
|
|
731
718
|
(if (== l 0)
|
|
732
719
|
0
|
|
733
|
-
(let ([kept (
|
|
720
|
+
(let ([kept (new (& run-arena) srcloc)])
|
|
734
721
|
(set! (@ kept) (@ l))
|
|
735
722
|
kept)))
|
|
736
723
|
|
|
@@ -1098,7 +1085,7 @@
|
|
|
1098
1085
|
(define (deserialize [bytes (ptr u8)] [n u32]) -> (ptr datum)
|
|
1099
1086
|
(set! in-bytes bytes)
|
|
1100
1087
|
(set! in-at 0)
|
|
1101
|
-
(let* ([count (cast u32 (in-uleb))] [objs (
|
|
1088
|
+
(let* ([count (cast u32 (in-uleb))] [objs (-> (new current u32 (+ count 1)) items)])
|
|
1102
1089
|
(for ([i u32 0]) (< i count) (+= i 1) (set! (@ objs i) (in-entry objs)))
|
|
1103
1090
|
(cast (ptr datum) objs)))
|
|
1104
1091
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
// The error codes
|
|
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;
|
|
@@ -1,27 +1,14 @@
|
|
|
1
1
|
;; Events from the host. events-take gives the current event's bytes as host calls give them, events-take-text its
|
|
2
2
|
;; text and events-take-strings its list; event-handler! sets the handler for a source's untagged events, and a tagged
|
|
3
|
-
;; event goes to its tag's handler (compiler/substrate.sub). A failed event's value is one of the error codes
|
|
4
|
-
;; and its text is the reason.
|
|
3
|
+
;; event goes to its tag's handler (compiler/substrate.sub). A failed event's value is one of the error codes
|
|
4
|
+
;; (compiler/substrate.sub), and its text is the reason.
|
|
5
5
|
;; Sources: dom 1, gpu 2, worker 3, audio 4, timer 5, fetch 6, websocket 7, stream 8, net 9, process 10, storage 11,
|
|
6
6
|
;; location 12, clipboard 13, files 14.
|
|
7
7
|
|
|
8
|
-
(provide events-take events-take! events-take-text events-take-strings event-handler!
|
|
9
|
-
error-missing error-unreachable error-refused error-timeout error-invalid error-aborted error-denied
|
|
10
|
-
error-in-use error-other error-not-granted)
|
|
8
|
+
(provide events-take events-take! events-take-text events-take-strings event-handler!)
|
|
11
9
|
|
|
12
10
|
(import take "events" "take" (i32 -> i32))
|
|
13
11
|
|
|
14
|
-
(const error-missing i32 1)
|
|
15
|
-
(const error-unreachable i32 2)
|
|
16
|
-
(const error-refused i32 3)
|
|
17
|
-
(const error-timeout i32 4)
|
|
18
|
-
(const error-invalid i32 5)
|
|
19
|
-
(const error-aborted i32 6)
|
|
20
|
-
(const error-denied i32 7)
|
|
21
|
-
(const error-in-use i32 8)
|
|
22
|
-
(const error-other i32 9)
|
|
23
|
-
(const error-not-granted i32 10)
|
|
24
|
-
|
|
25
12
|
(define defaults (array handler 64))
|
|
26
13
|
|
|
27
14
|
(define (by-source [source u32] [kind u32] [id u32] [tag (ptr void)] [value i32])
|
package/substrate/host/fs.mjs
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
// The host module "fs" (fs.sub), over the files that node/fs.mjs or web/fs.mjs gives.
|
|
2
2
|
import { joined } from './entries.mjs';
|
|
3
|
+
import { errors, errorOf } from './errors.mjs';
|
|
3
4
|
|
|
4
5
|
const utf8 = new TextEncoder();
|
|
5
6
|
|
|
@@ -22,7 +23,7 @@ export function fsModule(files) {
|
|
|
22
23
|
return f();
|
|
23
24
|
} catch (e) {
|
|
24
25
|
if (e instanceof WebAssembly.RuntimeError) throw e;
|
|
25
|
-
caller.fail(err, `${path}: ${e.message}
|
|
26
|
+
caller.fail(err, `${path}: ${e.message}`, errorOf(e));
|
|
26
27
|
return failed;
|
|
27
28
|
}
|
|
28
29
|
};
|
|
@@ -31,7 +32,7 @@ export function fsModule(files) {
|
|
|
31
32
|
const using = (h, err, f, failed = -1) => {
|
|
32
33
|
const open = handles.get(h);
|
|
33
34
|
if (open) return attempt(open.path, err, () => f(open.file), failed);
|
|
34
|
-
caller.fail(err, `file ${h}: Bad file descriptor
|
|
35
|
+
caller.fail(err, `file ${h}: Bad file descriptor`, errors.invalid);
|
|
35
36
|
return failed;
|
|
36
37
|
};
|
|
37
38
|
const bytesAt = (ptr, len) => caller.memory().subarray(caller.u(ptr), caller.u(ptr) + len);
|
|
@@ -81,7 +82,7 @@ export function fsModule(files) {
|
|
|
81
82
|
file_stream(h, write, start, tag, err) {
|
|
82
83
|
const open = handles.get(h);
|
|
83
84
|
if (!open) {
|
|
84
|
-
caller.fail(err, `file ${h}: Bad file descriptor
|
|
85
|
+
caller.fail(err, `file ${h}: Bad file descriptor`, errors.invalid);
|
|
85
86
|
return 0;
|
|
86
87
|
}
|
|
87
88
|
handles.delete(h);
|
|
@@ -90,7 +91,7 @@ export function fsModule(files) {
|
|
|
90
91
|
} catch (e) {
|
|
91
92
|
if (e instanceof WebAssembly.RuntimeError) throw e;
|
|
92
93
|
attempt(open.path, 0, () => open.file.close());
|
|
93
|
-
caller.fail(err, `${open.path}: ${e.message}
|
|
94
|
+
caller.fail(err, `${open.path}: ${e.message}`, errorOf(e));
|
|
94
95
|
return 0;
|
|
95
96
|
}
|
|
96
97
|
},
|