Skip to content

Instantly share code, notes, and snippets.

@p0nce
Created October 16, 2023 14:10
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save p0nce/fccc816e3e98f5001d0015c916aaba3e to your computer and use it in GitHub Desktop.
Save p0nce/fccc816e3e98f5001d0015c916aaba3e to your computer and use it in GitHub Desktop.
WASI preview1 experiment in D
// this describes how to call a WASI function like fd_write
module core.wasi.preview1;
version(WebAssembly):
extern(C): // disable D mangling
import ldc.attributes;
static assert(byte.alignof == 1);
static assert(ubyte.alignof == 1);
static assert(short.alignof == 2);
static assert(ushort.alignof == 2);
static assert(int.alignof == 4);
static assert(uint.alignof == 4);
static assert(long.alignof == 8);
static assert(ulong.alignof == 8);
alias __wasi_size_t = uint;
alias __wasi_filesize_t = ulong;
alias __wasi_timestamp_t = ulong;
alias __wasi_clockid_t = uint;
enum uint __WASI_CLOCKID_REALTIME = 0;
enum uint __WASI_CLOCKID_MONOTONIC = 1;
enum uint __WASI_CLOCKID_PROCESS_CPUTIME_ID = 2;
enum uint __WASI_CLOCKID_THREAD_CPUTIME_ID = 3;
alias __wasi_errno_t = ushort;
enum ushort __WASI_ERRNO_SUCCESS = 0;
enum ushort __WASI_ERRNO_2BIG = 1;
enum ushort __WASI_ERRNO_ACCES = 2;
enum ushort __WASI_ERRNO_ADDRINUSE = 3;
enum ushort __WASI_ERRNO_ADDRNOTAVAIL = 4;
enum ushort __WASI_ERRNO_AFNOSUPPORT = 5;
enum ushort __WASI_ERRNO_AGAIN = 6;
enum ushort __WASI_ERRNO_ALREADY = 7;
enum ushort __WASI_ERRNO_BADF = 8;
enum ushort __WASI_ERRNO_BADMSG = 9;
enum ushort __WASI_ERRNO_BUSY = 10;
enum ushort __WASI_ERRNO_CANCELED = 11;
enum ushort __WASI_ERRNO_CHILD = 12;
enum ushort __WASI_ERRNO_CONNABORTED = 13;
enum ushort __WASI_ERRNO_CONNREFUSED = 14;
enum ushort __WASI_ERRNO_CONNRESET = 15;
enum ushort __WASI_ERRNO_DEADLK = 16;
enum ushort __WASI_ERRNO_DESTADDRREQ = 17;
enum ushort __WASI_ERRNO_DOM = 18;
enum ushort __WASI_ERRNO_DQUOT = 19;
enum ushort __WASI_ERRNO_EXIST = 20;
enum ushort __WASI_ERRNO_FAULT = 21;
enum ushort __WASI_ERRNO_FBIG = 22;
enum ushort __WASI_ERRNO_HOSTUNREACH = 23;
enum ushort __WASI_ERRNO_IDRM = 24;
enum ushort __WASI_ERRNO_ILSEQ = 25;
enum ushort __WASI_ERRNO_INPROGRESS = 26;
enum ushort __WASI_ERRNO_INTR = 27;
enum ushort __WASI_ERRNO_INVAL = 28;
enum ushort __WASI_ERRNO_IO = 29;
enum ushort __WASI_ERRNO_ISCONN = 30;
enum ushort __WASI_ERRNO_ISDIR = 31;
enum ushort __WASI_ERRNO_LOOP = 32;
enum ushort __WASI_ERRNO_MFILE = 33;
enum ushort __WASI_ERRNO_MLINK = 34;
enum ushort __WASI_ERRNO_MSGSIZE = 35;
enum ushort __WASI_ERRNO_MULTIHOP = 36;
enum ushort __WASI_ERRNO_NAMETOOLONG = 37;
enum ushort __WASI_ERRNO_NETDOWN = 38;
enum ushort __WASI_ERRNO_NETRESET = 39;
enum ushort __WASI_ERRNO_NETUNREACH = 40;
enum ushort __WASI_ERRNO_NFILE = 41;
enum ushort __WASI_ERRNO_NOBUFS = 42;
enum ushort __WASI_ERRNO_NODEV = 43;
enum ushort __WASI_ERRNO_NOENT = 44;
enum ushort __WASI_ERRNO_NOEXEC = 45;
enum ushort __WASI_ERRNO_NOLCK = 46;
enum ushort __WASI_ERRNO_NOLINK = 47;
enum ushort __WASI_ERRNO_NOMEM = 48;
enum ushort __WASI_ERRNO_NOMSG = 49;
enum ushort __WASI_ERRNO_NOPROTOOPT = 50;
enum ushort __WASI_ERRNO_NOSPC = 51;
enum ushort __WASI_ERRNO_NOSYS = 52;
enum ushort __WASI_ERRNO_NOTCONN = 53;
enum ushort __WASI_ERRNO_NOTDIR = 54;
enum ushort __WASI_ERRNO_NOTEMPTY = 55;
enum ushort __WASI_ERRNO_NOTRECOVERABLE = 56;
enum ushort __WASI_ERRNO_NOTSOCK = 57;
enum ushort __WASI_ERRNO_NOTSUP = 58;
enum ushort __WASI_ERRNO_NOTTY = 59;
enum ushort __WASI_ERRNO_NXIO = 60;
enum ushort __WASI_ERRNO_OVERFLOW = 61;
enum ushort __WASI_ERRNO_OWNERDEAD = 62;
enum ushort __WASI_ERRNO_PERM = 63;
enum ushort __WASI_ERRNO_PIPE = 64;
enum ushort __WASI_ERRNO_PROTO = 65;
enum ushort __WASI_ERRNO_PROTONOSUPPORT = 66;
enum ushort __WASI_ERRNO_PROTOTYPE = 67;
enum ushort __WASI_ERRNO_RANGE = 68;
enum ushort __WASI_ERRNO_ROFS = 69;
enum ushort __WASI_ERRNO_SPIPE = 70;
enum ushort __WASI_ERRNO_SRCH = 71;
enum ushort __WASI_ERRNO_STALE = 72;
enum ushort __WASI_ERRNO_TIMEDOUT = 73;
enum ushort __WASI_ERRNO_TXTBSY = 74;
enum ushort __WASI_ERRNO_XDEV = 75;
enum ushort __WASI_ERRNO_NOTCAPABLE = 76;
alias __wasi_rights_t = ulong;
enum ulong __WASI_RIGHTS_FD_DATASYNC = 1;
enum ulong __WASI_RIGHTS_FD_READ = 2;
enum ulong __WASI_RIGHTS_FD_SEEK = 4;
enum ulong __WASI_RIGHTS_FD_FDSTAT_SET_FLAGS = 8;
enum ulong __WASI_RIGHTS_FD_SYNC = 16;
enum ulong __WASI_RIGHTS_FD_TELL = 32;
enum ulong __WASI_RIGHTS_FD_WRITE = 64;
enum ulong __WASI_RIGHTS_FD_ADVISE = 128;
enum ulong __WASI_RIGHTS_FD_ALLOCATE = 256;
enum ulong __WASI_RIGHTS_PATH_CREATE_DIRECTORY = 512;
enum ulong __WASI_RIGHTS_PATH_CREATE_FILE = 1024;
enum ulong __WASI_RIGHTS_PATH_LINK_SOURCE = 2048;
enum ulong __WASI_RIGHTS_PATH_LINK_TARGET = 4096;
enum ulong __WASI_RIGHTS_PATH_OPEN = 8192;
enum ulong __WASI_RIGHTS_FD_READDIR = 16384;
enum ulong __WASI_RIGHTS_PATH_READLINK = 32768;
enum ulong __WASI_RIGHTS_PATH_RENAME_SOURCE = 65536;
enum ulong __WASI_RIGHTS_PATH_RENAME_TARGET = 131072;
enum ulong __WASI_RIGHTS_PATH_FILESTAT_GET = 262144;
enum ulong __WASI_RIGHTS_PATH_FILESTAT_SET_SIZE = 524288;
enum ulong __WASI_RIGHTS_PATH_FILESTAT_SET_TIMES = 1048576;
enum ulong __WASI_RIGHTS_FD_FILESTAT_GET = 2097152;
enum ulong __WASI_RIGHTS_FD_FILESTAT_SET_SIZE = 4194304;
enum ulong __WASI_RIGHTS_FD_FILESTAT_SET_TIMES = 8388608;
enum ulong __WASI_RIGHTS_PATH_SYMLINK = 16777216;
enum ulong __WASI_RIGHTS_PATH_REMOVE_DIRECTORY = 33554432;
enum ulong __WASI_RIGHTS_PATH_UNLINK_FILE = 67108864;
enum ulong __WASI_RIGHTS_POLL_FD_READWRITE = 134217728;
enum ulong __WASI_RIGHTS_SOCK_SHUTDOWN = 268435456;
alias __wasi_fd_t = uint;
struct __wasi_iovec_t
{
/**
* The address of the buffer to be filled.
*/
ubyte* buf;
/**
* The length of the buffer to be filled.
*/
__wasi_size_t buf_len;
}
struct __wasi_ciovec_t
{
/**
* The address of the buffer to be written.
*/
const(ubyte)* buf;
/**
* The length of the buffer to be written.
*/
__wasi_size_t buf_len;
}
alias __wasi_filedelta_t = long;
alias __wasi_whence_t = ubyte;
enum ubyte __WASI_WHENCE_SET = 0;
enum ubyte __WASI_WHENCE_CUR = 1;
enum ubyte __WASI_WHENCE_END = 2;
alias __wasi_dircookie_t = ulong;
alias __wasi_dirnamlen_t = uint;
alias __wasi_inode_t = ulong;
@llvmAttr("wasm-import-module", "wasi_snapshot_preview1")
__wasi_errno_t fd_write(__wasi_fd_t fd, const(__wasi_ciovec_t)* iovs, size_t iovs_len, __wasi_size_t *nwritten);
@p0nce
Copy link
Author

p0nce commented Oct 16, 2023

Note that not all WASM runtime implement preview1 in the same way, but it seems to be on its way.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment