diff --git a/std/assembly/bindings/wasi.ts b/std/assembly/bindings/wasi.ts new file mode 100644 index 00000000..c5976ed1 --- /dev/null +++ b/std/assembly/bindings/wasi.ts @@ -0,0 +1,676 @@ +// see: https://github.com/CraneStation/wasmtime-wasi/blob/wasi/docs/WASI-api.md + +/** Read command-line argument data. */ +export declare function args_get(argv: uintptr_t, argv_buf: uintptr_t): errno; +/** Return command-line argument data sizes. */ +export declare function args_sizes_get(argc: uintptr_t, argv_buf_size_ptr: uintptr_t): errno; + +/** Return the resolution of a clock. */ +export declare function clock_res_get(clock: clockid, resolution: uintptr_t): errno; +/** Return the time value of a clock. */ +export declare function clock_time_get(clock: clockid, precision: timestamp_t, time: uintptr_t): errno; + +/** Read environment variable data. */ +export declare function environ_get(environ: uintptr_t, environ_buf: uintptr_t): errno; +/** Return command-line argument data sizes. */ +export declare function environ_sizes_get(environ_count: uintptr_t, environ_buf_size: uintptr_t): errno; + +/** Provide file advisory information on a file descriptor. */ +export declare function fd_advise(fd: fd_t, offset: filesize_t, len: filesize_t, advice: advice): errno; +/** Provide file advisory information on a file descriptor. */ +export declare function fd_allocate(fd: fd_t, offset: filesize_t, len: filesize_t): errno; +/** Close a file descriptor. */ +export declare function fd_close(fd: fd_t): errno; +/** Synchronize the data of a file to disk. */ +export declare function fd_datasync(fd: fd_t): errno; +/** Get the attributes of a file descriptor. */ +export declare function fd_fdstat_get(fd: fd_t, buf: uintptr_t): errno; +/** Adjust the flags associated with a file descriptor. */ +export declare function fd_fdstat_set_flags(fd: fd_t, flags: fdflags): errno; +/** Adjust the rights associated with a file descriptor. */ +export declare function fd_fdstat_set_rights(fd: fd_t, fs_rights_base: rights, fs_rights_inheriting: rights): errno; +/** Return the attributes of an open file. */ +export declare function fd_filestat_get(fd: fd_t, buf: uintptr_t): errno; +/** Adjust the size of an open file. If this increases the file's size, the extra bytes are filled with zeros. */ +export declare function fd_filestat_set_size(fd: fd_t, size: filesize_t): errno; +/** Adjust the timestamps of an open file or directory. */ +export declare function fd_filestat_set_times(fd: fd_t, st_atim: timestamp_t, st_mtim: timestamp_t, fstflags: fstflags): errno; +/** Read from a file descriptor, without using and updating the file descriptor's offset. */ +export declare function fd_pread(fd: fd_t, iovs: uintptr_t, iovs_len: size_t, offset: filesize_t, nread: uintptr_t): errno; +/** Return a description of the given preopened file descriptor. */ +export declare function fd_prestat_get(fd: fd_t, buf: uintptr_t): errno; +/** Return a description of the given preopened file descriptor. */ +export declare function fd_prestat_dir_name(fd: fd_t, path: uintptr_t, path_len: size_t): errno; +/** Write to a file descriptor, without using and updating the file descriptor's offset. */ +export declare function fd_pwrite(fd: fd_t, iovs: uintptr_t, iovs_len: size_t, offset: filesize_t, nwritten: uintptr_t): errno; +/** Read from a file descriptor. */ +export declare function fd_read(fd: fd_t, iovs: uintptr_t, iovs_len: size_t, nread: uintptr_t): errno; +/** Read directory entries from a directory. */ +export declare function fd_readdir(fd: fd_t, buf: uintptr_t, buf_len: size_t, cookie: dircookie_t, buf_used: uintptr_t): errno; +/** Atomically replace a file descriptor by renumbering another file descriptor. */ +export declare function fd_renumber(from: fd_t, to: fd_t): errno; +/** Move the offset of a file descriptor. */ +export declare function fd_seek(fd: fd_t, offset: filedelta_t, whence: whence, newoffset: uintptr_t): errno; +/** Synchronize the data and metadata of a file to disk. */ +export declare function fd_sync(fd: fd_t): errno; +/** Return the current offset of a file descriptor. */ +export declare function fd_tell(fd: fd_t, newoffset: uintptr_t): errno; +/** Write to a file descriptor. */ +export declare function fd_write(fd: fd_t, iovs: uintptr_t, iovs_len: size_t, nwritten: uintptr_t): errno; + +/* Create a directory. */ +export declare function path_create_directory(fd: fd_t, path: uintptr_t, path_len: size_t): errno; +/** Return the attributes of a file or directory. */ +export declare function path_filestat_get(fd: fd_t, flags: lookupflags, path: uintptr_t, path_len: size_t, buf: uintptr_t): errno; +/** Adjust the timestamps of a file or directory. */ +export declare function path_filestat_set_times(fd: fd_t, flags: lookupflags, path: uintptr_t, path_len: size_t, st_atim: timestamp_t, st_mtim: timestamp_t, fstflags: fstflags): errno; +/** Create a hard link. */ +export declare function path_link(fd0: fd_t, flags0: lookupflags, path0: uintptr_t, path_len0: size_t, fd1: fd_t, path1: uintptr_t, path_len: size_t): errno; +/** Open a file or directory. */ +export declare function path_open(dirfd: fd_t, dirflags: lookupflags, path: uintptr_t, path_len: size_t, oflags: oflags, fs_rights_base: rights, fs_rights_inheriting: rights, fs_flags: fdflags, fd: fd_t): errno; +/** Read the contents of a symbolic link. */ +export declare function path_readlink(fd: fd_t, path: uintptr_t, path_len: size_t, buf: uintptr_t, buf_len: size_t, buf_used: uintptr_t): errno; +/** Remove a directory. */ +export declare function path_remove_directory(fd: fd_t, path: uintptr_t, path_len: size_t): errno; +/** Rename a file or directory. */ +export declare function path_rename(fd0: fd_t, path0: uintptr_t, path_len0: size_t, fd1: fd_t, path1: uintptr_t, path_len1: size_t): errno; +/** Create a symbolic link. */ +export declare function path_symlink(path0: uintptr_t, path_len0: size_t, fd: fd_t, path1: uintptr_t, path_len1: size_t): errno; +/** Unlink a file. */ +export declare function path_unlink_file(fd: fd_t, path: uintptr_t, path_len: size_t): errno; + +/** Concurrently poll for the occurrence of a set of events. */ +export declare function poll_oneoff(in_: uintptr_t, out: uintptr_t, nsubscriptions: size_t, nevents: uintptr_t): errno; + +/** Terminate the process normally. An exit code of 0 indicates successful termination of the program. The meanings of other values is dependent on the environment. */ +export declare function proc_exit(rval: u32): void; +/** Send a signal to the process of the calling thread. */ +export declare function proc_raise(sig: signal): errno; + +/** Write high-quality random data into a buffer. */ +export declare function random_get(buf: uintptr_t, buf_len: size_t): errno; + +/** Temporarily yield execution of the calling thread. */ +export declare function sched_yield(): errno; + +/** Receive a message from a socket. */ +export declare function sock_recv(sock: fd_t, ri_data: uintptr_t, ri_data_len: size_t, ri_flags: riflags, ro_datalen: uintptr_t, ro_flags: roflags): errno; +/** Send a message on a socket. */ +export declare function sock_send(sock: fd_t, si_data: uintptr_t, si_data_len: size_t, si_flags: siflags, so_datalen: uintptr_t): errno; +/** Shut down socket send and receive channels. */ +export declare function sock_shutdown(sock: fd_t, how: sdflags): errno; + +// === Types ====================================================================================== + +/** File or memory access pattern advisory information. */ +export const enum advice { + /** The application has no advice to give on its behavior with respect to the specified data. */ + NORMAL = 0, + /** The application expects to access the specified data sequentially from lower offsets to higher offsets. */ + SEQUENTIAL = 1, + /** The application expects to access the specified data in a random order. */ + RANDOM = 2, + /** The application expects to access the specified data in the near future. */ + WILLNEED = 3, + /** The application expects that it will not access the specified data in the near future. */ + DONTNEED = 4, + /** The application expects to access the specified data once and then not reuse it thereafter. */ + NOREUSE = 5 +} +export type advice_t = u8; + +/** Identifiers for clocks. */ +export const enum clockid { + /** The clock measuring real time. Time value zero corresponds with 1970-01-01T00:00:00Z. */ + REALTIME = 0, + /** The store-wide monotonic clock. Absolute value has no meaning. */ + MONOTONIC = 1, + /** The CPU-time clock associated with the current process. */ + PROCESS_CPUTIME_ID = 2, + /** The CPU-time clock associated with the current thread. */ + THREAD_CPUTIME_ID = 3 +} +export type clockid_t = u32; + +/** Identifier for a device containing a file system. Can be used in combination with `inode` to uniquely identify a file or directory in the filesystem. */ +export type device_t = u64; + +/** A reference to the offset of a directory entry. */ +export type dircookie_t = u64; + +/** A directory entry. */ +@unmanaged export class dirent { + /** The offset of the next directory entry stored in this directory. */ + d_next: dircookie_t; + /** The serial number of the file referred to by this directory entry. */ + d_ino: inode_t; + /** The length of the name of the directory entry. */ + d_namlen: u32; + /** The type of the file referred to by this directory entry. */ + d_type: filetype_t; +} + +/** Error codes returned by functions. */ +export const enum errno { + /** No error occurred. System call completed successfully. */ + SUCCESS = 0, + /** Argument list too long. */ + TOOBIG = 1, + /** Permission denied. */ + ACCES = 2, + /** Address in use. */ + ADDRINUSE = 3, + /** Address not available. */ + ADDRNOTAVAIL = 4, + /** Address family not supported. */ + AFNOSUPPORT = 5, + /** Resource unavailable, or operation would block. */ + AGAIN = 6, + /** Connection already in progress. */ + ALREADY = 7, + /** Bad file descriptor. */ + BADF = 8, + /** Bad message. */ + BADMSG = 9, + /** Device or resource busy. */ + BUSY = 10, + /** Operation canceled. */ + CANCELED = 11, + /** No child processes. */ + CHILD = 12, + /** Connection aborted. */ + CONNABORTED = 13, + /** Connection refused. */ + CONNREFUSED = 14, + /** Connection reset. */ + CONNRESET = 15, + /** Resource deadlock would occur. */ + DEADLK = 16, + /** Destination address required. */ + DESTADDRREQ = 17, + /** Mathematics argument out of domain of function. */ + DOM = 18, + /** Reserved. */ + DQUOT = 19, + /** File exists. */ + EXIST = 20, + /** Bad address. */ + FAULT = 21, + /** File too large. */ + FBIG = 22, + /** Host is unreachable. */ + HOSTUNREACH = 23, + /** Identifier removed. */ + IDRM = 24, + /** Illegal byte sequence. */ + ILSEQ = 25, + /** Operation in progress. */ + INPROGRESS = 26, + /** Interrupted function. */ + INTR = 27, + /** Invalid argument. */ + INVAL = 28, + /** I/O error. */ + IO = 29, + /** Socket is connected. */ + ISCONN = 30, + /** Is a directory. */ + ISDIR = 31, + /** Too many levels of symbolic links. */ + LOOP = 32, + /** File descriptor value too large. */ + MFILE = 33, + /** Too many links. */ + MLINK = 34, + /** Message too large. */ + MSGSIZE = 35, + /** Reserved. */ + MULTIHOP = 36, + /** Filename too long. */ + NAMETOOLONG = 37, + /** Network is down. */ + NETDOWN = 38, + /** Connection aborted by network. */ + NETRESET = 39, + /** Network unreachable. */ + NETUNREACH = 40, + /** Too many files open in system. */ + NFILE = 41, + /** No buffer space available. */ + NOBUFS = 42, + /** No such device. */ + NODEV = 43, + /** No such file or directory. */ + NOENT = 44, + /** Executable file format error. */ + NOEXEC = 45, + /** No locks available. */ + NOLCK = 46, + /** Reserved. */ + NOLINK = 47, + /** Not enough space. */ + NOMEM = 48, + /** No message of the desired type. */ + NOMSG = 49, + /** Protocol not available. */ + NOPROTOOPT = 50, + /** No space left on device. */ + NOSPC = 51, + /** Function not supported. */ + NOSYS = 52, + /** The socket is not connected. */ + NOTCONN = 53, + /** Not a directory or a symbolic link to a directory. */ + NOTDIR = 54, + /** Directory not empty. */ + NOTEMPTY = 55, + /** State not recoverable. */ + NOTRECOVERABLE = 56, + /** Not a socket. */ + NOTSOCK = 57, + /** Not supported, or operation not supported on socket. */ + NOTSUP = 58, + /** Inappropriate I/O control operation. */ + NOTTY = 59, + /** No such device or address. */ + NXIO = 60, + /** Value too large to be stored in data type. */ + OVERFLOW = 61, + /** Previous owner died. */ + OWNERDEAD = 62, + /** Operation not permitted. */ + PERM = 63, + /** Broken pipe. */ + PIPE = 64, + /** Protocol error. */ + PROTO = 65, + /** Protocol not supported. */ + PROTONOSUPPORT = 66, + /** Protocol wrong type for socket. */ + PROTOTYPE = 67, + /** Result too large. */ + RANGE = 68, + /** Read-only file system. */ + ROFS = 69, + /** Invalid seek. */ + SPIPE = 70, + /** No such process. */ + SRCH = 71, + /** Reserved. */ + STALE = 72, + /** Connection timed out. */ + TIMEDOUT = 73, + /** Text file busy. */ + TXTBSY = 74, + /** Cross-device link. */ + XDEV = 75, + /** Extension: Capabilities insufficient. */ + NOTCAPABLE = 76 +} +export type errno_t = u16; + +/** An event that occurred. */ +@unmanaged export class event { + userdata: userdata_t; + error: errno_t; + type: eventtype_t; +} + +/** An event that occurred when type is `eventtype.FD_READ` or `eventtype.FD_WRITE`. */ +@unmanaged export class rwevent extends event { + nbytes: filesize_t; + flags: eventrwflags_t; +} + +/** The state of the file descriptor subscribed to with `eventtype.FD_READ` or `eventtype.FD_WRITE`. */ +export const enum eventrwflags { + /** The peer of this socket has closed or disconnected. */ + HANGUP = 1 +} +export type eventrwflags_t = u16; + +/** Type of a subscription to an event or its occurrence. */ +export const enum eventtype { + /** The time value of clock has reached the timestamp. */ + CLOCK = 0, + /** File descriptor has data available for reading. */ + FD_READ = 1, + /** File descriptor has capacity available for writing */ + FD_WRITE = 2 +} +export type eventtype_t = u8; + +/** Exit code generated by a process when exiting. */ +export type exitcode_t = u32; + +/** A file descriptor number. */ +export type fd_t = u32; + +/** File descriptor flags. */ +export const enum fdflags { + /** Append mode: Data written to the file is always appended to the file's end. */ + APPEND = 1, + /** Write according to synchronized I/O data integrity completion. Only the data stored in the file is synchronized. */ + DSYNC = 2, + /** Non-blocking mode. */ + NONBLOCK = 4, + /** Synchronized read I/O operations. */ + RSYNC = 8, + /** Write according to synchronized I/O file integrity completion. */ + SYNC = 16 +} +export type fdflags_t = u16; + +/** File descriptor attributes. */ +@unmanaged export class fdstat { + /** File type. */ + fs_filetype: filetype_t; + /** File descriptor flags. */ + fs_flags: fdflags_t; + /** Rights that apply to this file descriptor. */ + fs_rights_base: rights_t; + /** Maximum set of rights that may be installed on new file descriptors that are created through this file descriptor, e.g., through `path_open`. */ + fs_rights_inheriting: rights_t; +} + +/** Relative offset within a file. */ +export type filedelta_t = i64; + +/** Non-negative file size or length of a region within a file. */ +export type filesize_t = u64; + +/** File attributes. */ +@unmanaged export class filestat { + /** Device ID of device containing the file. */ + st_dev: device_t; + /** File serial number. */ + st_ino: inode_t; + /** File type. */ + st_filetype: filetype_t; + /** Number of hard links to the file. */ + st_nlink: linkcount_t; + /** For regular files, the file size in bytes. For symbolic links, the length in bytes of the pathname contained in the symbolic link. */ + st_size: filesize_t; + /** Last data access timestamp. */ + st_atim: timestamp_t; + /** Last data modification timestamp. */ + st_mtim: timestamp_t; + /** Last file status change timestamp. */ + st_ctim: timestamp_t; +} + +/** The type of a file descriptor or file. */ +export const enum filetype { + /** The type of the file descriptor or file is unknown or is different from any of the other types specified. */ + UNKNOWN = 0, + /** The file descriptor or file refers to a block device inode. */ + BLOCK_DEVICE = 1, + /** The file descriptor or file refers to a character device inode. */ + CHARACTER_DEVICE = 2, + /** The file descriptor or file refers to a directory inode. */ + DIRECTORY = 3, + /** The file descriptor or file refers to a regular file inode. */ + REGULAR_FILE = 4, + /** The file descriptor or file refers to a datagram socket. */ + SOCKET_DGRAM = 5, + /** The file descriptor or file refers to a byte-stream socket. */ + SOCKET_STREAM = 6, + /** The file refers to a symbolic link inode. */ + SYMBOLIC_LINK = 7 +} +export type filetype_t = u8; + +/** Which file time attributes to adjust. */ +export const enum fstflags { + /** Adjust the last data access timestamp to the value stored in `filestat#st_atim`. */ + SET_ATIM = 1, + /** Adjust the last data access timestamp to the time of clock `clockid.REALTIME`. */ + SET_ATIM_NOW = 2, + /** Adjust the last data modification timestamp to the value stored in `filestat#st_mtim`. */ + SET_MTIM = 4, + /** Adjust the last data modification timestamp to the time of clock `clockid.REALTIME`. */ + SET_MTIM_NOW = 8 +} +export type fstflags_t = u16; + +/** File serial number that is unique within its file system. */ +export type inode_t = u64; + +/** A region of memory for scatter/gather reads. */ +@unmanaged export class iovec { + /** The address of the buffer to be filled. */ + buf: uintptr_t; + /** The length of the buffer to be filled. */ + buf_len: size_t; +} + +/** Number of hard links to an inode. */ +export type linkcount_t = u32; + +/** Flags determining the method of how paths are resolved. */ +export const enum lookupflags { + /** As long as the resolved path corresponds to a symbolic link, it is expanded. */ + SYMLINK_FOLLOW = 1 +} +export type lookupflags_t = u32; + +/** Open flags. */ +export const enum oflags { + /** Create file if it does not exist. */ + CREAT = 1, + /** Fail if not a directory. */ + DIRECTORY = 2, + /** Fail if file already exists. */ + EXCL = 4, + /** Truncate file to size 0. */ + TRUNC = 8 +} +export type oflags_t = u16; + +/** Flags provided to `sock_recv`. */ +export const enum riflags { + /** Returns the message without removing it from the socket's receive queue. */ + RECV_PEEK = 1, + /** On byte-stream sockets, block until the full amount of data can be returned. */ + RECV_WAITALL = 2 +} +export type riflags_t = u16; + +/** File descriptor rights, determining which actions may be performed. */ +export const enum rights { + /** The right to invoke `fd_datasync`. */ + FD_DATASYNC = 1, + /** The right to invoke `fd_read` and `sock_recv`. */ + FD_READ = 2, + /** The right to invoke `fd_seek`. This flag implies `rights.FD_TELL`. */ + FD_SEEK = 4, + /** The right to invoke `fd_fdstat_set_flags`. */ + FD_FDSTAT_SET_FLAGS = 8, + /** The right to invoke `fd_sync`. */ + FD_SYNC = 16, + /** The right to invoke `fd_seek` in such a way that the file offset remains unaltered (i.e., `whence.CUR` with offset zero), or to invoke `fd_tell`). */ + FD_TELL = 32, + /** The right to invoke `fd_write` and `sock_send`. If `rights.FD_SEEK` is set, includes the right to invoke `fd_pwrite`. */ + FD_WRITE = 64, + /** The right to invoke `fd_advise`. */ + FD_ADVISE = 128, + /** The right to invoke `fd_allocate`. */ + FD_ALLOCATE = 256, + /** The right to invoke `path_create_directory`. */ + PATH_CREATE_DIRECTORY = 512, + /** If `rights.PATH_OPEN` is set, the right to invoke `path_open` with `oflags.CREAT`. */ + PATH_CREATE_FILE = 1024, + /** The right to invoke `path_link` with the file descriptor as the source directory. */ + PATH_LINK_SOURCE = 2048, + /** The right to invoke `path_link` with the file descriptor as the target directory. */ + PATH_LINK_TARGET = 4096, + /** The right to invoke `path_open`. */ + PATH_OPEN = 8192, + /** The right to invoke `fd_readdir`. */ + FD_READDIR = 16384, + /** The right to invoke `path_readlink`. */ + PATH_READLINK = 32768, + /** The right to invoke `path_rename` with the file descriptor as the source directory. */ + PATH_RENAME_SOURCE = 65536, + /** The right to invoke `path_rename` with the file descriptor as the target directory. */ + PATH_RENAME_TARGET = 131072, + /** The right to invoke `path_filestat_get`. */ + PATH_FILESTAT_GET = 262144, + /** The right to change a file's size (there is no `path_filestat_set_size`). If `rights.PATH_OPEN` is set, includes the right to invoke `path_open` with `oflags.TRUNC`. */ + PATH_FILESTAT_SET_SIZE = 524288, + /** The right to invoke `path_filestat_set_times`. */ + PATH_FILESTAT_SET_TIMES = 1048576, + /** The right to invoke `fd_filestat_get`. */ + FD_FILESTAT_GET = 2097152, + /** The right to invoke `fd_filestat_set_size`. */ + FD_FILESTAT_SET_SIZE = 4194304, + /** The right to invoke `fd_filestat_set_times`. */ + FD_FILESTAT_SET_TIMES = 8388608, + /** The right to invoke `path_symlink`. */ + RIGHT_PATH_SYMLINK = 16777216, + /** The right to invoke `path_remove_directory`. */ + PATH_REMOVE_DIRECTORY = 33554432, + /** The right to invoke `path_unlink_file`. */ + PATH_UNLINK_FILE = 67108864, + /** If `rights.FD_READ` is set, includes the right to invoke `poll_oneoff` to subscribe to `eventtype.FD_READ`. If `rights.FD_WRITE` is set, includes the right to invoke `poll_oneoff` to subscribe to `eventtype.FD_WRITE`. */ + POLL_FD_READWRITE = 134217728, + /** The right to invoke `sock_shutdown`. */ + SOCK_SHUTDOWN = 268435456 +} +export type rights_t = u64; + +/** Flags returned by `sock_recv`. */ +export const enum roflags { + /** Message data has been truncated. */ + DATA_TRUNCATED = 1 +} +export type roflags_t = u16; + +/** Which channels on a socket to shut down. */ +export const enum sdflags { + /** Disables further receive operations. */ + SHUT_RD = 1, + /** Disables further send operations. */ + SHUT_WR = 2 +} +export type sdflags_t = u8; + +/** Flags provided to `sock_send`. */ +export const enum siflags { + // As there are currently no flags defined, it must be set to zero. +} +export type siflags_t = u16; + +/** Signal condition. */ +export const enum signal { + /** Hangup. */ + HUP = 1, + /** Terminate interrupt signal. */ + INT = 2, + /** Terminal quit signal. */ + QUIT = 3, + /** Illegal instruction. */ + ILL = 4, + /** Trace/breakpoint trap. */ + TRAP = 5, + /** Process abort signal. */ + ABRT = 6, + /** Access to an undefined portion of a memory object. */ + BUS = 7, + /** Erroneous arithmetic operation. */ + FPE = 8, + /** Kill. */ + KILL = 9, + /** User-defined signal 1. */ + USR1 = 10, + /** Invalid memory reference. */ + SEGV = 11, + /** User-defined signal 2. */ + USR2 = 12, + /** Write on a pipe with no one to read it. */ + PIPE = 13, + /** Alarm clock. */ + ALRM = 14, + /** Termination signal. */ + TERM = 15, + /** Child process terminated, stopped, or continued. */ + CHLD = 16, + /** Continue executing, if stopped. */ + CONT = 17, + /** Stop executing. */ + STOP = 18, + /** Terminal stop signal. */ + TSTP = 19, + /** Background process attempting read. */ + TTIN = 20, + /** Background process attempting write. */ + TTOU = 21, + /** High bandwidth data is available at a socket. */ + URG = 22, + /** CPU time limit exceeded. */ + XCPU = 23, + /** File size limit exceeded. */ + XFSZ = 24, + /** Virtual timer expired. */ + VTALRM = 25, + PROF = 26, + WINCH = 27, + POLL = 28, + PWR = 29, + /** Bad system call. */ + SYS = 30 +} +export type signal_t = u8; + +/** Flags determining how to interpret the timestamp provided in `subscription_t::u.clock.timeout. */ +export const enum subclockflags { + SUBSCRIPTION_CLOCK_ABSTIME = 1 +} +export type subclockflags_t = u16; + +/** Subscription to an event. */ +@unmanaged export class subscription { + userdata: userdata_t; + type: eventtype_t; +} + +/* Subscription to an event of type `eventtype.CLOCK`.**/ +@unmanaged export class clocksubscription extends subscription { + /** The user-defined unique identifier of the clock. */ + identifier: userdata_t; + /** The clock against which to compare the timestamp. */ + clock_id: clockid_t; + /** The absolute or relative timestamp. */ + timeout: timestamp_t; + /** The amount of time that the implementation may wait additionally to coalesce with other events. */ + precision: timestamp_t; + /** Flags specifying whether the timeout is absolute or relative. */ + flags: subclockflags_t; +} + +/* Subscription to an event of type `eventtype.FD_READ` or `eventtype.FD_WRITE`.**/ +@unmanaged export class fdsubscription extends subscription { + /** The file descriptor on which to wait for it to become ready for reading or writing. */ + fd_readwrite: fd_t; +} + +/** Timestamp in nanoseconds. */ +export type timestamp_t = u64; + +/** User-provided value that may be attached to objects that is retained when extracted from the implementation. */ +export type userdata_t = u64; + +/** The position relative to which to set the offset of the file descriptor. */ +export const enum whence { + /** Seek relative to current position. */ + CUR = 0, + /** Seek relative to end-of-file. */ + END = 1, + /** Seek relative to start-of-file. */ + SET = 2 +} +export type whence_t = u8; + +// glue +export type uintptr_t = usize; +export type size_t = usize; diff --git a/tests/compiler/wasi.optimized.wat b/tests/compiler/wasi.optimized.wat new file mode 100644 index 00000000..587c7142 --- /dev/null +++ b/tests/compiler/wasi.optimized.wat @@ -0,0 +1,11 @@ +(module + (type $FUNCSIG$v (func)) + (memory $0 0) + (table $0 1 funcref) + (elem (i32.const 0) $null) + (export "memory" (memory $0)) + (export "table" (table $0)) + (func $null (; 0 ;) (type $FUNCSIG$v) + nop + ) +) diff --git a/tests/compiler/wasi.ts b/tests/compiler/wasi.ts new file mode 100644 index 00000000..11fee06d --- /dev/null +++ b/tests/compiler/wasi.ts @@ -0,0 +1 @@ +import "bindings/wasi"; diff --git a/tests/compiler/wasi.untouched.wat b/tests/compiler/wasi.untouched.wat new file mode 100644 index 00000000..4560a6a1 --- /dev/null +++ b/tests/compiler/wasi.untouched.wat @@ -0,0 +1,11 @@ +(module + (type $FUNCSIG$v (func)) + (memory $0 0) + (table $0 1 funcref) + (elem (i32.const 0) $null) + (global $~lib/memory/HEAP_BASE i32 (i32.const 8)) + (export "memory" (memory $0)) + (export "table" (table $0)) + (func $null (; 0 ;) (type $FUNCSIG$v) + ) +)