You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
53 lines
2.6 KiB
53 lines
2.6 KiB
;; Repeatedly open and close `test.bin`.
|
|
(module
|
|
(import "wasi_snapshot_preview1" "path_open"
|
|
(func $__wasi_path_open (param i32 i32 i32 i32 i32 i64 i64 i32 i32) (result i32)))
|
|
(import "wasi_snapshot_preview1" "fd_read"
|
|
(func $__wasi_fd_read (param i32 i32 i32 i32) (result i32)))
|
|
(import "wasi_snapshot_preview1" "fd_close"
|
|
(func $__wasi_fd_close (param i32) (result i32)))
|
|
(func (export "run") (param $iters i64) (result i64)
|
|
(local $i i64)
|
|
(local.set $i (i64.const 0))
|
|
(loop $cont
|
|
;; Open the file `test.bin` under the same directory as this WAT
|
|
;; file; this assumes some prior set up of the preopens in
|
|
;; `wasi.rs`. See https://github.com/WebAssembly/WASI/blob/d8da230b/phases/snapshot/witx/wasi_snapshot_preview1.witx#L346.
|
|
(call $__wasi_path_open
|
|
;; The fd of the preopen under which to search for the file;
|
|
;; the first three are the `std*` ones.
|
|
(i32.const 3)
|
|
;; The lookup flags (i.e., whether to follow symlinks).
|
|
(i32.const 0)
|
|
;; The path to the file under the initial fd.
|
|
(i32.const 0)
|
|
(i32.const 8)
|
|
;; The open flags; in this case we will only attempt to read but
|
|
;; this may attempt to create the file if it does not exist, see
|
|
;; https://github.com/WebAssembly/WASI/blob/d8da230b/phases/snapshot/witxtypenames.witx#L444).
|
|
(i32.const 0)
|
|
;; The base rights and the inheriting rights: here we only set
|
|
;; the bits for the FD_READ and FD_READDIR capabilities.
|
|
(i64.const 0x2002)
|
|
(i64.const 0x2002)
|
|
;; The file descriptor flags (e.g., whether to append, sync,
|
|
;; etc.); see https://github.com/WebAssembly/WASI/blob/d8da230b/phases/snapshot/witx/typenames.witx#L385
|
|
(i32.const 0)
|
|
;; The address at which to store the opened fd (if the call
|
|
;; succeeds)
|
|
(i32.const 16))
|
|
(if (then unreachable))
|
|
|
|
;; Close the open file handle we stored at offset 16.
|
|
(call $__wasi_fd_close (i32.load (i32.const 16)))
|
|
(if (then unreachable))
|
|
|
|
;; Continue looping until $i reaches $iters.
|
|
(local.set $i (i64.add (local.get $i) (i64.const 1)))
|
|
(br_if $cont (i64.lt_u (local.get $i) (local.get $iters)))
|
|
)
|
|
(local.get $i)
|
|
)
|
|
(data (i32.const 0) "test.bin")
|
|
(memory (export "memory") 1)
|
|
)
|
|
|