From 1674287d79f02af8f5a714c02a5b864b6992d2c9 Mon Sep 17 00:00:00 2001 From: Demetrius Kanios Date: Wed, 15 Jul 2026 17:15:53 -0700 Subject: [PATCH 1/2] druntime: Use WASIp2 directly instead of POSIX emulation --- druntime/src/core/internal/abort.d | 64 +- .../core/sys/wasi/p2/cli/environment/common.d | 9 + .../sys/wasi/p2/cli/environment/imports.d | 95 ++ .../src/core/sys/wasi/p2/cli/exit/common.d | 9 + .../src/core/sys/wasi/p2/cli/exit/imports.d | 48 + .../core/sys/wasi/p2/cli/imports/package.d | 509 +++++++++ .../src/core/sys/wasi/p2/cli/stderr/common.d | 10 + .../src/core/sys/wasi/p2/cli/stderr/imports.d | 29 + .../src/core/sys/wasi/p2/cli/stdin/common.d | 10 + .../src/core/sys/wasi/p2/cli/stdin/imports.d | 29 + .../src/core/sys/wasi/p2/cli/stdout/common.d | 10 + .../src/core/sys/wasi/p2/cli/stdout/imports.d | 29 + .../sys/wasi/p2/cli/terminal_input/common.d | 13 + .../sys/wasi/p2/cli/terminal_input/imports.d | 59 ++ .../sys/wasi/p2/cli/terminal_output/common.d | 13 + .../sys/wasi/p2/cli/terminal_output/imports.d | 59 ++ .../sys/wasi/p2/cli/terminal_stderr/common.d | 11 + .../sys/wasi/p2/cli/terminal_stderr/imports.d | 41 + .../sys/wasi/p2/cli/terminal_stdin/common.d | 11 + .../sys/wasi/p2/cli/terminal_stdin/imports.d | 41 + .../sys/wasi/p2/cli/terminal_stdout/common.d | 11 + .../sys/wasi/p2/cli/terminal_stdout/imports.d | 41 + .../wasi/p2/clocks/monotonic_clock/common.d | 20 + .../wasi/p2/clocks/monotonic_clock/imports.d | 65 ++ .../sys/wasi/p2/clocks/wall_clock/common.d | 34 + .../sys/wasi/p2/clocks/wall_clock/imports.d | 47 + .../sys/wasi/p2/filesystem/preopens/common.d | 10 + .../sys/wasi/p2/filesystem/preopens/imports.d | 44 + .../sys/wasi/p2/filesystem/types/common.d | 533 ++++++++++ .../sys/wasi/p2/filesystem/types/imports.d | 989 ++++++++++++++++++ .../src/core/sys/wasi/p2/io/error/common.d | 9 + .../src/core/sys/wasi/p2/io/error/imports.d | 71 ++ .../src/core/sys/wasi/p2/io/poll/common.d | 9 + .../src/core/sys/wasi/p2/io/poll/imports.d | 94 ++ .../src/core/sys/wasi/p2/io/streams/common.d | 11 + .../src/core/sys/wasi/p2/io/streams/imports.d | 667 ++++++++++++ .../core/sys/wasi/p2/random/insecure/common.d | 9 + .../sys/wasi/p2/random/insecure/imports.d | 39 + .../sys/wasi/p2/random/insecure_seed/common.d | 9 + .../wasi/p2/random/insecure_seed/imports.d | 29 + .../core/sys/wasi/p2/random/random/common.d | 9 + .../core/sys/wasi/p2/random/random/imports.d | 39 + .../wasi/p2/sockets/instance_network/common.d | 10 + .../p2/sockets/instance_network/imports.d | 29 + .../wasi/p2/sockets/ip_name_lookup/common.d | 21 + .../wasi/p2/sockets/ip_name_lookup/imports.d | 164 +++ .../core/sys/wasi/p2/sockets/network/common.d | 307 ++++++ .../sys/wasi/p2/sockets/network/imports.d | 83 ++ .../src/core/sys/wasi/p2/sockets/tcp/common.d | 53 + .../core/sys/wasi/p2/sockets/tcp/imports.d | 875 ++++++++++++++++ .../p2/sockets/tcp_create_socket/common.d | 21 + .../p2/sockets/tcp_create_socket/imports.d | 46 + .../src/core/sys/wasi/p2/sockets/udp/common.d | 78 ++ .../core/sys/wasi/p2/sockets/udp/imports.d | 846 +++++++++++++++ .../p2/sockets/udp_create_socket/common.d | 21 + .../p2/sockets/udp_create_socket/imports.d | 46 + druntime/src/core/sys/wasi/wit_common.d | 453 ++++++++ druntime/src/core/thread/wasi_impl.d | 33 +- druntime/src/core/time.d | 97 +- 59 files changed, 6918 insertions(+), 153 deletions(-) create mode 100644 druntime/src/core/sys/wasi/p2/cli/environment/common.d create mode 100644 druntime/src/core/sys/wasi/p2/cli/environment/imports.d create mode 100644 druntime/src/core/sys/wasi/p2/cli/exit/common.d create mode 100644 druntime/src/core/sys/wasi/p2/cli/exit/imports.d create mode 100644 druntime/src/core/sys/wasi/p2/cli/imports/package.d create mode 100644 druntime/src/core/sys/wasi/p2/cli/stderr/common.d create mode 100644 druntime/src/core/sys/wasi/p2/cli/stderr/imports.d create mode 100644 druntime/src/core/sys/wasi/p2/cli/stdin/common.d create mode 100644 druntime/src/core/sys/wasi/p2/cli/stdin/imports.d create mode 100644 druntime/src/core/sys/wasi/p2/cli/stdout/common.d create mode 100644 druntime/src/core/sys/wasi/p2/cli/stdout/imports.d create mode 100644 druntime/src/core/sys/wasi/p2/cli/terminal_input/common.d create mode 100644 druntime/src/core/sys/wasi/p2/cli/terminal_input/imports.d create mode 100644 druntime/src/core/sys/wasi/p2/cli/terminal_output/common.d create mode 100644 druntime/src/core/sys/wasi/p2/cli/terminal_output/imports.d create mode 100644 druntime/src/core/sys/wasi/p2/cli/terminal_stderr/common.d create mode 100644 druntime/src/core/sys/wasi/p2/cli/terminal_stderr/imports.d create mode 100644 druntime/src/core/sys/wasi/p2/cli/terminal_stdin/common.d create mode 100644 druntime/src/core/sys/wasi/p2/cli/terminal_stdin/imports.d create mode 100644 druntime/src/core/sys/wasi/p2/cli/terminal_stdout/common.d create mode 100644 druntime/src/core/sys/wasi/p2/cli/terminal_stdout/imports.d create mode 100644 druntime/src/core/sys/wasi/p2/clocks/monotonic_clock/common.d create mode 100644 druntime/src/core/sys/wasi/p2/clocks/monotonic_clock/imports.d create mode 100644 druntime/src/core/sys/wasi/p2/clocks/wall_clock/common.d create mode 100644 druntime/src/core/sys/wasi/p2/clocks/wall_clock/imports.d create mode 100644 druntime/src/core/sys/wasi/p2/filesystem/preopens/common.d create mode 100644 druntime/src/core/sys/wasi/p2/filesystem/preopens/imports.d create mode 100644 druntime/src/core/sys/wasi/p2/filesystem/types/common.d create mode 100644 druntime/src/core/sys/wasi/p2/filesystem/types/imports.d create mode 100644 druntime/src/core/sys/wasi/p2/io/error/common.d create mode 100644 druntime/src/core/sys/wasi/p2/io/error/imports.d create mode 100644 druntime/src/core/sys/wasi/p2/io/poll/common.d create mode 100644 druntime/src/core/sys/wasi/p2/io/poll/imports.d create mode 100644 druntime/src/core/sys/wasi/p2/io/streams/common.d create mode 100644 druntime/src/core/sys/wasi/p2/io/streams/imports.d create mode 100644 druntime/src/core/sys/wasi/p2/random/insecure/common.d create mode 100644 druntime/src/core/sys/wasi/p2/random/insecure/imports.d create mode 100644 druntime/src/core/sys/wasi/p2/random/insecure_seed/common.d create mode 100644 druntime/src/core/sys/wasi/p2/random/insecure_seed/imports.d create mode 100644 druntime/src/core/sys/wasi/p2/random/random/common.d create mode 100644 druntime/src/core/sys/wasi/p2/random/random/imports.d create mode 100644 druntime/src/core/sys/wasi/p2/sockets/instance_network/common.d create mode 100644 druntime/src/core/sys/wasi/p2/sockets/instance_network/imports.d create mode 100644 druntime/src/core/sys/wasi/p2/sockets/ip_name_lookup/common.d create mode 100644 druntime/src/core/sys/wasi/p2/sockets/ip_name_lookup/imports.d create mode 100644 druntime/src/core/sys/wasi/p2/sockets/network/common.d create mode 100644 druntime/src/core/sys/wasi/p2/sockets/network/imports.d create mode 100644 druntime/src/core/sys/wasi/p2/sockets/tcp/common.d create mode 100644 druntime/src/core/sys/wasi/p2/sockets/tcp/imports.d create mode 100644 druntime/src/core/sys/wasi/p2/sockets/tcp_create_socket/common.d create mode 100644 druntime/src/core/sys/wasi/p2/sockets/tcp_create_socket/imports.d create mode 100644 druntime/src/core/sys/wasi/p2/sockets/udp/common.d create mode 100644 druntime/src/core/sys/wasi/p2/sockets/udp/imports.d create mode 100644 druntime/src/core/sys/wasi/p2/sockets/udp_create_socket/common.d create mode 100644 druntime/src/core/sys/wasi/p2/sockets/udp_create_socket/imports.d create mode 100644 druntime/src/core/sys/wasi/wit_common.d diff --git a/druntime/src/core/internal/abort.d b/druntime/src/core/internal/abort.d index 60e71679f8b1..82aabc9d7c64 100644 --- a/druntime/src/core/internal/abort.d +++ b/druntime/src/core/internal/abort.d @@ -54,63 +54,21 @@ void abort(scope string msg, scope string filename = __FILE__, size_t line = __L cast(void)fdWrite(2, iovecs[], bytesWritten); } } - } else version (WASIp2) { - // currently depends on wasi-libc being linked in to provide these "syscalls" - // TODO: detach this from wasi-libc - extern(C) struct wasip2_list_u8_t { - ubyte* ptr; - size_t len; - } - extern(C) struct streams_own_output_stream_t { - int __handle; - } - extern(C) struct streams_borrow_output_stream_t { - int __handle; - } - alias streams_own_output_stream_t stderr_own_output_stream_t; - extern(C) struct io_error_own_error_t { - int __handle; - } - alias io_error_own_error_t streams_own_error_t; - - extern(C) struct streams_stream_error_t { - ubyte tag; - - union Val { - streams_own_error_t last_operation_failed; - } - Val val; - } - - pragma(mangle, "streams_output_stream_drop_own") - extern(C) static void streams_output_stream_drop_own(streams_own_output_stream_t handle) @nogc nothrow; - pragma(mangle, "streams_borrow_output_stream") - extern(C) static streams_borrow_output_stream_t streams_borrow_output_stream(streams_own_output_stream_t handle) @nogc nothrow; - pragma(mangle, "stderr_get_stderr") - extern(C) static stderr_own_output_stream_t stderr_get_stderr() @nogc nothrow; - pragma(mangle, "io_error_error_drop_own") - extern(C) static void io_error_error_drop_own(io_error_own_error_t handle) @nogc nothrow; - pragma(mangle, "streams_stream_error_free") - extern(C) static void streams_stream_error_free(streams_stream_error_t *ptr) @nogc nothrow; - pragma(mangle, "streams_method_output_stream_blocking_write_and_flush") - extern(C) static bool streams_method_output_stream_blocking_write_and_flush(streams_borrow_output_stream_t self, wasip2_list_u8_t *contents, streams_stream_error_t *err) @nogc nothrow; - + } + else version (WASIp2) + { + import core.sys.wasi.p2.cli.stderr.imports : getStderr; + import core.sys.wasi.wit_common : witFree, witList; static void writeStr(scope const(char)[][] m...) @nogc nothrow @trusted { - auto stderr_own = stderr_get_stderr(); - scope(exit) streams_output_stream_drop_own(stderr_own); - - auto stderr = streams_borrow_output_stream(stderr_own); + auto stderr = getStderr(); + scope(exit) stderr.drop; foreach (s; m) { - wasip2_list_u8_t contents; - contents.ptr = cast(ubyte*)s.ptr; - contents.len = s.length; - streams_stream_error_t err; - bool success = streams_method_output_stream_blocking_write_and_flush(stderr, &contents, &err); - if (!success) { - streams_stream_error_free(&err); - } + auto result = stderr.blockingWriteAndFlush((cast(const(ubyte)[])s).witList); + scope(exit) result.witFree; + + // ignore errors } } } diff --git a/druntime/src/core/sys/wasi/p2/cli/environment/common.d b/druntime/src/core/sys/wasi/p2/cli/environment/common.d new file mode 100644 index 000000000000..8220d1339e81 --- /dev/null +++ b/druntime/src/core/sys/wasi/p2/cli/environment/common.d @@ -0,0 +1,9 @@ +/++ + ++/ +module core.sys.wasi.p2.cli.environment.common; + +import core.sys.wasi.wit_common; + + +package (core.sys.wasi.p2) void __wit_bindgen_component_type_force_link() pure @nogc nothrow => imported!"core.sys.wasi.p2.cli.imports".__wit_bindgen_component_type_force_link(); diff --git a/druntime/src/core/sys/wasi/p2/cli/environment/imports.d b/druntime/src/core/sys/wasi/p2/cli/environment/imports.d new file mode 100644 index 000000000000..80ac08388c7d --- /dev/null +++ b/druntime/src/core/sys/wasi/p2/cli/environment/imports.d @@ -0,0 +1,95 @@ +/++ + ++/ +module core.sys.wasi.p2.cli.environment.imports; + +import core.sys.wasi.wit_common; + +public import core.sys.wasi.p2.cli.environment.common; + + +package (core.sys.wasi.p2) void __wit_bindgen_component_type_force_link() pure @nogc nothrow => imported!"core.sys.wasi.p2.cli.imports".__wit_bindgen_component_type_force_link(); + +/++ +Get the POSIX-style environment variables. + +Each environment variable is provided as a pair of string variable names +and string value. + +Morally, these are a value import, but until value imports are available +in the component model, this import function should return the same +values each time it is called. ++/ +WitList!(Tuple!(WitString, WitString)) getEnvironment() @nogc nothrow { + align(size_t.sizeof) void[(2*size_t.sizeof)] _retArea = void; + __import_getEnvironment(_retArea.ptr); + auto _listSrcPtr4 = *(cast(void**)(_retArea.ptr + 0)); + auto _listLen4 = *(cast(size_t*)(_retArea.ptr + size_t.sizeof)); + auto _list4 = core.sys.wasi.wit_common.mallocSlice!(Tuple!(WitString, WitString))(_listLen4); + foreach (_elem0_idx, ref _elem0; _list4) { + const auto _base0 = _listSrcPtr4 + _elem0_idx * (4*size_t.sizeof); + auto _ptr1 = cast(char*)(*(cast(void**)(_base0 + 0))); + auto _len1 = *(cast(size_t*)(_base0 + size_t.sizeof)); + auto _ptr2 = cast(char*)(*(cast(void**)(_base0 + (2*size_t.sizeof)))); + auto _len2 = *(cast(size_t*)(_base0 + (3*size_t.sizeof))); + auto _tuple3 = Tuple!(WitString, WitString)( + WitString(_ptr1[0.._len1]), + WitString(_ptr2[0.._len2]), + ); + _elem0 = _tuple3; + } + auto _flush5 = WitList!(Tuple!(WitString, WitString))(_list4); + return _flush5; +} +/// ditto +@wasmImport!("wasi:cli/environment@0.2.12", "get-environment") +pragma(mangle, "__wit_import_wasi:cli__environment@0.2.12__get_environment") +private extern(C) void __import_getEnvironment(void*) @nogc nothrow; + +/++ +Get the POSIX-style arguments to the program. ++/ +WitList!(WitString) getArguments() @nogc nothrow { + align(size_t.sizeof) void[(2*size_t.sizeof)] _retArea = void; + __import_getArguments(_retArea.ptr); + auto _listSrcPtr2 = *(cast(void**)(_retArea.ptr + 0)); + auto _listLen2 = *(cast(size_t*)(_retArea.ptr + size_t.sizeof)); + auto _list2 = core.sys.wasi.wit_common.mallocSlice!(WitString)(_listLen2); + foreach (_elem0_idx, ref _elem0; _list2) { + const auto _base0 = _listSrcPtr2 + _elem0_idx * (2*size_t.sizeof); + auto _ptr1 = cast(char*)(*(cast(void**)(_base0 + 0))); + auto _len1 = *(cast(size_t*)(_base0 + size_t.sizeof)); + _elem0 = WitString(_ptr1[0.._len1]); + } + auto _flush3 = WitList!(WitString)(_list2); + return _flush3; +} +/// ditto +@wasmImport!("wasi:cli/environment@0.2.12", "get-arguments") +pragma(mangle, "__wit_import_wasi:cli__environment@0.2.12__get_arguments") +private extern(C) void __import_getArguments(void*) @nogc nothrow; + +/++ +Return a path that programs should use as their initial current working +directory, interpreting `.` as shorthand for this. ++/ +Option!(WitString) initialCwd() @nogc nothrow { + align(size_t.sizeof) void[(3*size_t.sizeof)] _retArea = void; + __import_initialCwd(_retArea.ptr); + Option!(WitString) _option3 = void; + bool _isSome3 = (cast(uint)(*(cast(ubyte*)(_retArea.ptr + 0)))) != 0; + if (_isSome3) { + auto _ptr2 = cast(char*)(*(cast(void**)(_retArea.ptr + size_t.sizeof))); + auto _len2 = *(cast(size_t*)(_retArea.ptr + (2*size_t.sizeof))); + + _option3 = Option!(WitString).some(WitString(_ptr2[0.._len2])); + } else { + _option3 = Option!(WitString).none; + } + auto _flush4 = _option3; + return _flush4; +} +/// ditto +@wasmImport!("wasi:cli/environment@0.2.12", "initial-cwd") +pragma(mangle, "__wit_import_wasi:cli__environment@0.2.12__initial_cwd") +private extern(C) void __import_initialCwd(void*) @nogc nothrow; diff --git a/druntime/src/core/sys/wasi/p2/cli/exit/common.d b/druntime/src/core/sys/wasi/p2/cli/exit/common.d new file mode 100644 index 000000000000..3ad74c95aa64 --- /dev/null +++ b/druntime/src/core/sys/wasi/p2/cli/exit/common.d @@ -0,0 +1,9 @@ +/++ + ++/ +module core.sys.wasi.p2.cli.exit.common; + +import core.sys.wasi.wit_common; + + +package (core.sys.wasi.p2) void __wit_bindgen_component_type_force_link() pure @nogc nothrow => imported!"core.sys.wasi.p2.cli.imports".__wit_bindgen_component_type_force_link(); diff --git a/druntime/src/core/sys/wasi/p2/cli/exit/imports.d b/druntime/src/core/sys/wasi/p2/cli/exit/imports.d new file mode 100644 index 000000000000..e772785fbfe9 --- /dev/null +++ b/druntime/src/core/sys/wasi/p2/cli/exit/imports.d @@ -0,0 +1,48 @@ +/++ + ++/ +module core.sys.wasi.p2.cli.exit.imports; + +import core.sys.wasi.wit_common; + +public import core.sys.wasi.p2.cli.exit.common; + + +package (core.sys.wasi.p2) void __wit_bindgen_component_type_force_link() pure @nogc nothrow => imported!"core.sys.wasi.p2.cli.imports".__wit_bindgen_component_type_force_link(); + +/++ +Exit the current instance and any linked instances. ++/ +void exit(in Result!(void, void) status) @nogc nothrow { + uint _resultPart4; + if (status.isErr) { + + _resultPart4 = 1; + } else { + + _resultPart4 = 0; + } + __import_exit(_resultPart4); +} +/// ditto +@wasmImport!("wasi:cli/exit@0.2.12", "exit") +pragma(mangle, "__wit_import_wasi:cli__exit@0.2.12__exit") +private extern(C) void __import_exit(uint) @nogc nothrow; + +/++ +Exit the current instance and any linked instances, reporting the +specified status code to the host. + +The meaning of the code depends on the context, with 0 usually meaning +"success", and other values indicating various types of failure. + +This function does not return; the effect is analogous to a trap, but +without the connotation that something bad has happened. ++/ +void exitWithCode(ubyte statusCode) @nogc nothrow { + __import_exitWithCode(cast(uint)(statusCode)); +} +/// ditto +@wasmImport!("wasi:cli/exit@0.2.12", "exit-with-code") +pragma(mangle, "__wit_import_wasi:cli__exit@0.2.12__exit_with_code") +private extern(C) void __import_exitWithCode(uint) @nogc nothrow; diff --git a/druntime/src/core/sys/wasi/p2/cli/imports/package.d b/druntime/src/core/sys/wasi/p2/cli/imports/package.d new file mode 100644 index 000000000000..a0c975075494 --- /dev/null +++ b/druntime/src/core/sys/wasi/p2/cli/imports/package.d @@ -0,0 +1,509 @@ +/++ + ++/ +module core.sys.wasi.p2.cli.imports; + +import core.sys.wasi.wit_common; + +public import core.sys.wasi.p2.cli.environment.imports; +public import core.sys.wasi.p2.cli.exit.imports; +public import core.sys.wasi.p2.io.error.imports; +public import core.sys.wasi.p2.io.poll.imports; +public import core.sys.wasi.p2.io.streams.imports; +public import core.sys.wasi.p2.cli.stdin.imports; +public import core.sys.wasi.p2.cli.stdout.imports; +public import core.sys.wasi.p2.cli.stderr.imports; +public import core.sys.wasi.p2.cli.terminal_input.imports; +public import core.sys.wasi.p2.cli.terminal_output.imports; +public import core.sys.wasi.p2.cli.terminal_stdin.imports; +public import core.sys.wasi.p2.cli.terminal_stdout.imports; +public import core.sys.wasi.p2.cli.terminal_stderr.imports; +public import core.sys.wasi.p2.clocks.monotonic_clock.imports; +public import core.sys.wasi.p2.clocks.wall_clock.imports; +public import core.sys.wasi.p2.filesystem.types.imports; +public import core.sys.wasi.p2.filesystem.preopens.imports; +public import core.sys.wasi.p2.sockets.network.imports; +public import core.sys.wasi.p2.sockets.instance_network.imports; +public import core.sys.wasi.p2.sockets.udp.imports; +public import core.sys.wasi.p2.sockets.udp_create_socket.imports; +public import core.sys.wasi.p2.sockets.tcp.imports; +public import core.sys.wasi.p2.sockets.tcp_create_socket.imports; +public import core.sys.wasi.p2.sockets.ip_name_lookup.imports; +public import core.sys.wasi.p2.random.random.imports; +public import core.sys.wasi.p2.random.insecure.imports; +public import core.sys.wasi.p2.random.insecure_seed.imports; + + + +private alias AliasSeq(T...) = T; +template Exports(Impl...) { + alias InterfaceExports = AliasSeq!( + + ); +} + +pragma(inline, false) +package(core.sys.wasi.p2) void __wit_bindgen_component_type_force_link() pure @nogc nothrow {} + + +package(core.sys.wasi.p2) void __wit_bindgen_component_type() { + imported!"ldc.llvmasm".__irEx!( + "", + "", + `!wasm.custom_sections = !{!0} + !0 = !{!"component-type:wit-bindgen:0.57.1:wasi:cli@0.2.12:imports:", !"` + ~`\00\61\73\6D\0D\00\01\00\00\19\16\77\69\74\2D\63\6F\6D\70\6F\6E\65\6E\74` + ~`\2D\65\6E\63\6F\64\69\6E\67\04\00\07\E4\53\01\41\02\01\41\47\01\42\0A\01` + ~`\6F\02\73\73\01\70\00\01\40\00\00\01\04\00\0F\67\65\74\2D\65\6E\76\69\72` + ~`\6F\6E\6D\65\6E\74\01\02\01\70\73\01\40\00\00\03\04\00\0D\67\65\74\2D\61` + ~`\72\67\75\6D\65\6E\74\73\01\04\01\6B\73\01\40\00\00\05\04\00\0B\69\6E\69` + ~`\74\69\61\6C\2D\63\77\64\01\06\03\00\1B\77\61\73\69\3A\63\6C\69\2F\65\6E` + ~`\76\69\72\6F\6E\6D\65\6E\74\40\30\2E\32\2E\31\32\05\00\01\42\05\01\6A\00` + ~`\00\01\40\01\06\73\74\61\74\75\73\00\01\00\04\00\04\65\78\69\74\01\01\01` + ~`\40\01\0B\73\74\61\74\75\73\2D\63\6F\64\65\7D\01\00\04\00\0E\65\78\69\74` + ~`\2D\77\69\74\68\2D\63\6F\64\65\01\02\03\00\14\77\61\73\69\3A\63\6C\69\2F` + ~`\65\78\69\74\40\30\2E\32\2E\31\32\05\01\01\42\04\04\00\05\65\72\72\6F\72` + ~`\03\01\01\68\00\01\40\01\04\73\65\6C\66\01\00\73\04\00\1D\5B\6D\65\74\68` + ~`\6F\64\5D\65\72\72\6F\72\2E\74\6F\2D\64\65\62\75\67\2D\73\74\72\69\6E\67` + ~`\01\02\03\00\14\77\61\73\69\3A\69\6F\2F\65\72\72\6F\72\40\30\2E\32\2E\31` + ~`\32\05\02\01\42\0A\04\00\08\70\6F\6C\6C\61\62\6C\65\03\01\01\68\00\01\40` + ~`\01\04\73\65\6C\66\01\00\7F\04\00\16\5B\6D\65\74\68\6F\64\5D\70\6F\6C\6C` + ~`\61\62\6C\65\2E\72\65\61\64\79\01\02\01\40\01\04\73\65\6C\66\01\01\00\04` + ~`\00\16\5B\6D\65\74\68\6F\64\5D\70\6F\6C\6C\61\62\6C\65\2E\62\6C\6F\63\6B` + ~`\01\03\01\70\01\01\70\79\01\40\01\02\69\6E\04\00\05\04\00\04\70\6F\6C\6C` + ~`\01\06\03\00\13\77\61\73\69\3A\69\6F\2F\70\6F\6C\6C\40\30\2E\32\2E\31\32` + ~`\05\03\02\03\00\02\05\65\72\72\6F\72\02\03\00\03\08\70\6F\6C\6C\61\62\6C` + ~`\65\01\42\28\02\03\02\01\04\04\00\05\65\72\72\6F\72\03\00\00\02\03\02\01` + ~`\05\04\00\08\70\6F\6C\6C\61\62\6C\65\03\00\02\01\69\01\01\71\02\15\6C\61` + ~`\73\74\2D\6F\70\65\72\61\74\69\6F\6E\2D\66\61\69\6C\65\64\01\04\00\06\63` + ~`\6C\6F\73\65\64\00\00\04\00\0C\73\74\72\65\61\6D\2D\65\72\72\6F\72\03\00` + ~`\05\04\00\0C\69\6E\70\75\74\2D\73\74\72\65\61\6D\03\01\04\00\0D\6F\75\74` + ~`\70\75\74\2D\73\74\72\65\61\6D\03\01\01\68\07\01\70\7D\01\6A\01\0A\01\06` + ~`\01\40\02\04\73\65\6C\66\09\03\6C\65\6E\77\00\0B\04\00\19\5B\6D\65\74\68` + ~`\6F\64\5D\69\6E\70\75\74\2D\73\74\72\65\61\6D\2E\72\65\61\64\01\0C\04\00` + ~`\22\5B\6D\65\74\68\6F\64\5D\69\6E\70\75\74\2D\73\74\72\65\61\6D\2E\62\6C` + ~`\6F\63\6B\69\6E\67\2D\72\65\61\64\01\0C\01\6A\01\77\01\06\01\40\02\04\73` + ~`\65\6C\66\09\03\6C\65\6E\77\00\0D\04\00\19\5B\6D\65\74\68\6F\64\5D\69\6E` + ~`\70\75\74\2D\73\74\72\65\61\6D\2E\73\6B\69\70\01\0E\04\00\22\5B\6D\65\74` + ~`\68\6F\64\5D\69\6E\70\75\74\2D\73\74\72\65\61\6D\2E\62\6C\6F\63\6B\69\6E` + ~`\67\2D\73\6B\69\70\01\0E\01\69\03\01\40\01\04\73\65\6C\66\09\00\0F\04\00` + ~`\1E\5B\6D\65\74\68\6F\64\5D\69\6E\70\75\74\2D\73\74\72\65\61\6D\2E\73\75` + ~`\62\73\63\72\69\62\65\01\10\01\68\08\01\40\01\04\73\65\6C\66\11\00\0D\04` + ~`\00\21\5B\6D\65\74\68\6F\64\5D\6F\75\74\70\75\74\2D\73\74\72\65\61\6D\2E` + ~`\63\68\65\63\6B\2D\77\72\69\74\65\01\12\01\6A\00\01\06\01\40\02\04\73\65` + ~`\6C\66\11\08\63\6F\6E\74\65\6E\74\73\0A\00\13\04\00\1B\5B\6D\65\74\68\6F` + ~`\64\5D\6F\75\74\70\75\74\2D\73\74\72\65\61\6D\2E\77\72\69\74\65\01\14\04` + ~`\00\2E\5B\6D\65\74\68\6F\64\5D\6F\75\74\70\75\74\2D\73\74\72\65\61\6D\2E` + ~`\62\6C\6F\63\6B\69\6E\67\2D\77\72\69\74\65\2D\61\6E\64\2D\66\6C\75\73\68` + ~`\01\14\01\40\01\04\73\65\6C\66\11\00\13\04\00\1B\5B\6D\65\74\68\6F\64\5D` + ~`\6F\75\74\70\75\74\2D\73\74\72\65\61\6D\2E\66\6C\75\73\68\01\15\04\00\24` + ~`\5B\6D\65\74\68\6F\64\5D\6F\75\74\70\75\74\2D\73\74\72\65\61\6D\2E\62\6C` + ~`\6F\63\6B\69\6E\67\2D\66\6C\75\73\68\01\15\01\40\01\04\73\65\6C\66\11\00` + ~`\0F\04\00\1F\5B\6D\65\74\68\6F\64\5D\6F\75\74\70\75\74\2D\73\74\72\65\61` + ~`\6D\2E\73\75\62\73\63\72\69\62\65\01\16\01\40\02\04\73\65\6C\66\11\03\6C` + ~`\65\6E\77\00\13\04\00\22\5B\6D\65\74\68\6F\64\5D\6F\75\74\70\75\74\2D\73` + ~`\74\72\65\61\6D\2E\77\72\69\74\65\2D\7A\65\72\6F\65\73\01\17\04\00\35\5B` + ~`\6D\65\74\68\6F\64\5D\6F\75\74\70\75\74\2D\73\74\72\65\61\6D\2E\62\6C\6F` + ~`\63\6B\69\6E\67\2D\77\72\69\74\65\2D\7A\65\72\6F\65\73\2D\61\6E\64\2D\66` + ~`\6C\75\73\68\01\17\01\40\03\04\73\65\6C\66\11\03\73\72\63\09\03\6C\65\6E` + ~`\77\00\0D\04\00\1C\5B\6D\65\74\68\6F\64\5D\6F\75\74\70\75\74\2D\73\74\72` + ~`\65\61\6D\2E\73\70\6C\69\63\65\01\18\04\00\25\5B\6D\65\74\68\6F\64\5D\6F` + ~`\75\74\70\75\74\2D\73\74\72\65\61\6D\2E\62\6C\6F\63\6B\69\6E\67\2D\73\70` + ~`\6C\69\63\65\01\18\03\00\16\77\61\73\69\3A\69\6F\2F\73\74\72\65\61\6D\73` + ~`\40\30\2E\32\2E\31\32\05\06\02\03\00\04\0C\69\6E\70\75\74\2D\73\74\72\65` + ~`\61\6D\01\42\05\02\03\02\01\07\04\00\0C\69\6E\70\75\74\2D\73\74\72\65\61` + ~`\6D\03\00\00\01\69\01\01\40\00\00\02\04\00\09\67\65\74\2D\73\74\64\69\6E` + ~`\01\03\03\00\15\77\61\73\69\3A\63\6C\69\2F\73\74\64\69\6E\40\30\2E\32\2E` + ~`\31\32\05\08\02\03\00\04\0D\6F\75\74\70\75\74\2D\73\74\72\65\61\6D\01\42` + ~`\05\02\03\02\01\09\04\00\0D\6F\75\74\70\75\74\2D\73\74\72\65\61\6D\03\00` + ~`\00\01\69\01\01\40\00\00\02\04\00\0A\67\65\74\2D\73\74\64\6F\75\74\01\03` + ~`\03\00\16\77\61\73\69\3A\63\6C\69\2F\73\74\64\6F\75\74\40\30\2E\32\2E\31` + ~`\32\05\0A\01\42\05\02\03\02\01\09\04\00\0D\6F\75\74\70\75\74\2D\73\74\72` + ~`\65\61\6D\03\00\00\01\69\01\01\40\00\00\02\04\00\0A\67\65\74\2D\73\74\64` + ~`\65\72\72\01\03\03\00\16\77\61\73\69\3A\63\6C\69\2F\73\74\64\65\72\72\40` + ~`\30\2E\32\2E\31\32\05\0B\01\42\01\04\00\0E\74\65\72\6D\69\6E\61\6C\2D\69` + ~`\6E\70\75\74\03\01\03\00\1E\77\61\73\69\3A\63\6C\69\2F\74\65\72\6D\69\6E` + ~`\61\6C\2D\69\6E\70\75\74\40\30\2E\32\2E\31\32\05\0C\01\42\01\04\00\0F\74` + ~`\65\72\6D\69\6E\61\6C\2D\6F\75\74\70\75\74\03\01\03\00\1F\77\61\73\69\3A` + ~`\63\6C\69\2F\74\65\72\6D\69\6E\61\6C\2D\6F\75\74\70\75\74\40\30\2E\32\2E` + ~`\31\32\05\0D\02\03\00\08\0E\74\65\72\6D\69\6E\61\6C\2D\69\6E\70\75\74\01` + ~`\42\06\02\03\02\01\0E\04\00\0E\74\65\72\6D\69\6E\61\6C\2D\69\6E\70\75\74` + ~`\03\00\00\01\69\01\01\6B\02\01\40\00\00\03\04\00\12\67\65\74\2D\74\65\72` + ~`\6D\69\6E\61\6C\2D\73\74\64\69\6E\01\04\03\00\1E\77\61\73\69\3A\63\6C\69` + ~`\2F\74\65\72\6D\69\6E\61\6C\2D\73\74\64\69\6E\40\30\2E\32\2E\31\32\05\0F` + ~`\02\03\00\09\0F\74\65\72\6D\69\6E\61\6C\2D\6F\75\74\70\75\74\01\42\06\02` + ~`\03\02\01\10\04\00\0F\74\65\72\6D\69\6E\61\6C\2D\6F\75\74\70\75\74\03\00` + ~`\00\01\69\01\01\6B\02\01\40\00\00\03\04\00\13\67\65\74\2D\74\65\72\6D\69` + ~`\6E\61\6C\2D\73\74\64\6F\75\74\01\04\03\00\1F\77\61\73\69\3A\63\6C\69\2F` + ~`\74\65\72\6D\69\6E\61\6C\2D\73\74\64\6F\75\74\40\30\2E\32\2E\31\32\05\11` + ~`\01\42\06\02\03\02\01\10\04\00\0F\74\65\72\6D\69\6E\61\6C\2D\6F\75\74\70` + ~`\75\74\03\00\00\01\69\01\01\6B\02\01\40\00\00\03\04\00\13\67\65\74\2D\74` + ~`\65\72\6D\69\6E\61\6C\2D\73\74\64\65\72\72\01\04\03\00\1F\77\61\73\69\3A` + ~`\63\6C\69\2F\74\65\72\6D\69\6E\61\6C\2D\73\74\64\65\72\72\40\30\2E\32\2E` + ~`\31\32\05\12\01\42\0F\02\03\02\01\05\04\00\08\70\6F\6C\6C\61\62\6C\65\03` + ~`\00\00\01\77\04\00\07\69\6E\73\74\61\6E\74\03\00\02\01\77\04\00\08\64\75` + ~`\72\61\74\69\6F\6E\03\00\04\01\40\00\00\03\04\00\03\6E\6F\77\01\06\01\40` + ~`\00\00\05\04\00\0A\72\65\73\6F\6C\75\74\69\6F\6E\01\07\01\69\01\01\40\01` + ~`\04\77\68\65\6E\03\00\08\04\00\11\73\75\62\73\63\72\69\62\65\2D\69\6E\73` + ~`\74\61\6E\74\01\09\01\40\01\04\77\68\65\6E\05\00\08\04\00\12\73\75\62\73` + ~`\63\72\69\62\65\2D\64\75\72\61\74\69\6F\6E\01\0A\03\00\22\77\61\73\69\3A` + ~`\63\6C\6F\63\6B\73\2F\6D\6F\6E\6F\74\6F\6E\69\63\2D\63\6C\6F\63\6B\40\30` + ~`\2E\32\2E\31\32\05\13\01\42\05\01\72\02\07\73\65\63\6F\6E\64\73\77\0B\6E` + ~`\61\6E\6F\73\65\63\6F\6E\64\73\79\04\00\08\64\61\74\65\74\69\6D\65\03\00` + ~`\00\01\40\00\00\01\04\00\03\6E\6F\77\01\02\04\00\0A\72\65\73\6F\6C\75\74` + ~`\69\6F\6E\01\02\03\00\1D\77\61\73\69\3A\63\6C\6F\63\6B\73\2F\77\61\6C\6C` + ~`\2D\63\6C\6F\63\6B\40\30\2E\32\2E\31\32\05\14\02\03\00\04\05\65\72\72\6F` + ~`\72\02\03\00\0E\08\64\61\74\65\74\69\6D\65\01\42\72\02\03\02\01\07\04\00` + ~`\0C\69\6E\70\75\74\2D\73\74\72\65\61\6D\03\00\00\02\03\02\01\09\04\00\0D` + ~`\6F\75\74\70\75\74\2D\73\74\72\65\61\6D\03\00\02\02\03\02\01\15\04\00\05` + ~`\65\72\72\6F\72\03\00\04\02\03\02\01\16\04\00\08\64\61\74\65\74\69\6D\65` + ~`\03\00\06\01\77\04\00\08\66\69\6C\65\73\69\7A\65\03\00\08\01\6D\08\07\75` + ~`\6E\6B\6E\6F\77\6E\0C\62\6C\6F\63\6B\2D\64\65\76\69\63\65\10\63\68\61\72` + ~`\61\63\74\65\72\2D\64\65\76\69\63\65\09\64\69\72\65\63\74\6F\72\79\04\66` + ~`\69\66\6F\0D\73\79\6D\62\6F\6C\69\63\2D\6C\69\6E\6B\0C\72\65\67\75\6C\61` + ~`\72\2D\66\69\6C\65\06\73\6F\63\6B\65\74\04\00\0F\64\65\73\63\72\69\70\74` + ~`\6F\72\2D\74\79\70\65\03\00\0A\01\6E\06\04\72\65\61\64\05\77\72\69\74\65` + ~`\13\66\69\6C\65\2D\69\6E\74\65\67\72\69\74\79\2D\73\79\6E\63\13\64\61\74` + ~`\61\2D\69\6E\74\65\67\72\69\74\79\2D\73\79\6E\63\14\72\65\71\75\65\73\74` + ~`\65\64\2D\77\72\69\74\65\2D\73\79\6E\63\10\6D\75\74\61\74\65\2D\64\69\72` + ~`\65\63\74\6F\72\79\04\00\10\64\65\73\63\72\69\70\74\6F\72\2D\66\6C\61\67` + ~`\73\03\00\0C\01\6E\01\0E\73\79\6D\6C\69\6E\6B\2D\66\6F\6C\6C\6F\77\04\00` + ~`\0A\70\61\74\68\2D\66\6C\61\67\73\03\00\0E\01\6E\04\06\63\72\65\61\74\65` + ~`\09\64\69\72\65\63\74\6F\72\79\09\65\78\63\6C\75\73\69\76\65\08\74\72\75` + ~`\6E\63\61\74\65\04\00\0A\6F\70\65\6E\2D\66\6C\61\67\73\03\00\10\01\77\04` + ~`\00\0A\6C\69\6E\6B\2D\63\6F\75\6E\74\03\00\12\01\6B\07\01\72\06\04\74\79` + ~`\70\65\0B\0A\6C\69\6E\6B\2D\63\6F\75\6E\74\13\04\73\69\7A\65\09\15\64\61` + ~`\74\61\2D\61\63\63\65\73\73\2D\74\69\6D\65\73\74\61\6D\70\14\1B\64\61\74` + ~`\61\2D\6D\6F\64\69\66\69\63\61\74\69\6F\6E\2D\74\69\6D\65\73\74\61\6D\70` + ~`\14\17\73\74\61\74\75\73\2D\63\68\61\6E\67\65\2D\74\69\6D\65\73\74\61\6D` + ~`\70\14\04\00\0F\64\65\73\63\72\69\70\74\6F\72\2D\73\74\61\74\03\00\15\01` + ~`\71\03\09\6E\6F\2D\63\68\61\6E\67\65\00\00\03\6E\6F\77\00\00\09\74\69\6D` + ~`\65\73\74\61\6D\70\01\07\00\04\00\0D\6E\65\77\2D\74\69\6D\65\73\74\61\6D` + ~`\70\03\00\17\01\72\02\04\74\79\70\65\0B\04\6E\61\6D\65\73\04\00\0F\64\69` + ~`\72\65\63\74\6F\72\79\2D\65\6E\74\72\79\03\00\19\01\6D\25\06\61\63\63\65` + ~`\73\73\0B\77\6F\75\6C\64\2D\62\6C\6F\63\6B\07\61\6C\72\65\61\64\79\0E\62` + ~`\61\64\2D\64\65\73\63\72\69\70\74\6F\72\04\62\75\73\79\08\64\65\61\64\6C` + ~`\6F\63\6B\05\71\75\6F\74\61\05\65\78\69\73\74\0E\66\69\6C\65\2D\74\6F\6F` + ~`\2D\6C\61\72\67\65\15\69\6C\6C\65\67\61\6C\2D\62\79\74\65\2D\73\65\71\75` + ~`\65\6E\63\65\0B\69\6E\2D\70\72\6F\67\72\65\73\73\0B\69\6E\74\65\72\72\75` + ~`\70\74\65\64\07\69\6E\76\61\6C\69\64\02\69\6F\0C\69\73\2D\64\69\72\65\63` + ~`\74\6F\72\79\04\6C\6F\6F\70\0E\74\6F\6F\2D\6D\61\6E\79\2D\6C\69\6E\6B\73` + ~`\0C\6D\65\73\73\61\67\65\2D\73\69\7A\65\0D\6E\61\6D\65\2D\74\6F\6F\2D\6C` + ~`\6F\6E\67\09\6E\6F\2D\64\65\76\69\63\65\08\6E\6F\2D\65\6E\74\72\79\07\6E` + ~`\6F\2D\6C\6F\63\6B\13\69\6E\73\75\66\66\69\63\69\65\6E\74\2D\6D\65\6D\6F` + ~`\72\79\12\69\6E\73\75\66\66\69\63\69\65\6E\74\2D\73\70\61\63\65\0D\6E\6F` + ~`\74\2D\64\69\72\65\63\74\6F\72\79\09\6E\6F\74\2D\65\6D\70\74\79\0F\6E\6F` + ~`\74\2D\72\65\63\6F\76\65\72\61\62\6C\65\0B\75\6E\73\75\70\70\6F\72\74\65` + ~`\64\06\6E\6F\2D\74\74\79\0E\6E\6F\2D\73\75\63\68\2D\64\65\76\69\63\65\08` + ~`\6F\76\65\72\66\6C\6F\77\0D\6E\6F\74\2D\70\65\72\6D\69\74\74\65\64\04\70` + ~`\69\70\65\09\72\65\61\64\2D\6F\6E\6C\79\0C\69\6E\76\61\6C\69\64\2D\73\65` + ~`\65\6B\0E\74\65\78\74\2D\66\69\6C\65\2D\62\75\73\79\0C\63\72\6F\73\73\2D` + ~`\64\65\76\69\63\65\04\00\0A\65\72\72\6F\72\2D\63\6F\64\65\03\00\1B\01\6D` + ~`\06\06\6E\6F\72\6D\61\6C\0A\73\65\71\75\65\6E\74\69\61\6C\06\72\61\6E\64` + ~`\6F\6D\09\77\69\6C\6C\2D\6E\65\65\64\09\64\6F\6E\74\2D\6E\65\65\64\08\6E` + ~`\6F\2D\72\65\75\73\65\04\00\06\61\64\76\69\63\65\03\00\1D\01\72\02\05\6C` + ~`\6F\77\65\72\77\05\75\70\70\65\72\77\04\00\13\6D\65\74\61\64\61\74\61\2D` + ~`\68\61\73\68\2D\76\61\6C\75\65\03\00\1F\04\00\0A\64\65\73\63\72\69\70\74` + ~`\6F\72\03\01\04\00\16\64\69\72\65\63\74\6F\72\79\2D\65\6E\74\72\79\2D\73` + ~`\74\72\65\61\6D\03\01\01\68\21\01\69\01\01\6A\01\24\01\1C\01\40\02\04\73` + ~`\65\6C\66\23\06\6F\66\66\73\65\74\09\00\25\04\00\22\5B\6D\65\74\68\6F\64` + ~`\5D\64\65\73\63\72\69\70\74\6F\72\2E\72\65\61\64\2D\76\69\61\2D\73\74\72` + ~`\65\61\6D\01\26\01\69\03\01\6A\01\27\01\1C\01\40\02\04\73\65\6C\66\23\06` + ~`\6F\66\66\73\65\74\09\00\28\04\00\23\5B\6D\65\74\68\6F\64\5D\64\65\73\63` + ~`\72\69\70\74\6F\72\2E\77\72\69\74\65\2D\76\69\61\2D\73\74\72\65\61\6D\01` + ~`\29\01\40\01\04\73\65\6C\66\23\00\28\04\00\24\5B\6D\65\74\68\6F\64\5D\64` + ~`\65\73\63\72\69\70\74\6F\72\2E\61\70\70\65\6E\64\2D\76\69\61\2D\73\74\72` + ~`\65\61\6D\01\2A\01\6A\00\01\1C\01\40\04\04\73\65\6C\66\23\06\6F\66\66\73` + ~`\65\74\09\06\6C\65\6E\67\74\68\09\06\61\64\76\69\63\65\1E\00\2B\04\00\19` + ~`\5B\6D\65\74\68\6F\64\5D\64\65\73\63\72\69\70\74\6F\72\2E\61\64\76\69\73` + ~`\65\01\2C\01\40\01\04\73\65\6C\66\23\00\2B\04\00\1C\5B\6D\65\74\68\6F\64` + ~`\5D\64\65\73\63\72\69\70\74\6F\72\2E\73\79\6E\63\2D\64\61\74\61\01\2D\01` + ~`\6A\01\0D\01\1C\01\40\01\04\73\65\6C\66\23\00\2E\04\00\1C\5B\6D\65\74\68` + ~`\6F\64\5D\64\65\73\63\72\69\70\74\6F\72\2E\67\65\74\2D\66\6C\61\67\73\01` + ~`\2F\01\6A\01\0B\01\1C\01\40\01\04\73\65\6C\66\23\00\30\04\00\1B\5B\6D\65` + ~`\74\68\6F\64\5D\64\65\73\63\72\69\70\74\6F\72\2E\67\65\74\2D\74\79\70\65` + ~`\01\31\01\40\02\04\73\65\6C\66\23\04\73\69\7A\65\09\00\2B\04\00\1B\5B\6D` + ~`\65\74\68\6F\64\5D\64\65\73\63\72\69\70\74\6F\72\2E\73\65\74\2D\73\69\7A` + ~`\65\01\32\01\40\03\04\73\65\6C\66\23\15\64\61\74\61\2D\61\63\63\65\73\73` + ~`\2D\74\69\6D\65\73\74\61\6D\70\18\1B\64\61\74\61\2D\6D\6F\64\69\66\69\63` + ~`\61\74\69\6F\6E\2D\74\69\6D\65\73\74\61\6D\70\18\00\2B\04\00\1C\5B\6D\65` + ~`\74\68\6F\64\5D\64\65\73\63\72\69\70\74\6F\72\2E\73\65\74\2D\74\69\6D\65` + ~`\73\01\33\01\70\7D\01\6F\02\34\7F\01\6A\01\35\01\1C\01\40\03\04\73\65\6C` + ~`\66\23\06\6C\65\6E\67\74\68\09\06\6F\66\66\73\65\74\09\00\36\04\00\17\5B` + ~`\6D\65\74\68\6F\64\5D\64\65\73\63\72\69\70\74\6F\72\2E\72\65\61\64\01\37` + ~`\01\6A\01\09\01\1C\01\40\03\04\73\65\6C\66\23\06\62\75\66\66\65\72\34\06` + ~`\6F\66\66\73\65\74\09\00\38\04\00\18\5B\6D\65\74\68\6F\64\5D\64\65\73\63` + ~`\72\69\70\74\6F\72\2E\77\72\69\74\65\01\39\01\69\22\01\6A\01\3A\01\1C\01` + ~`\40\01\04\73\65\6C\66\23\00\3B\04\00\21\5B\6D\65\74\68\6F\64\5D\64\65\73` + ~`\63\72\69\70\74\6F\72\2E\72\65\61\64\2D\64\69\72\65\63\74\6F\72\79\01\3C` + ~`\04\00\17\5B\6D\65\74\68\6F\64\5D\64\65\73\63\72\69\70\74\6F\72\2E\73\79` + ~`\6E\63\01\2D\01\40\02\04\73\65\6C\66\23\04\70\61\74\68\73\00\2B\04\00\26` + ~`\5B\6D\65\74\68\6F\64\5D\64\65\73\63\72\69\70\74\6F\72\2E\63\72\65\61\74` + ~`\65\2D\64\69\72\65\63\74\6F\72\79\2D\61\74\01\3D\01\6A\01\16\01\1C\01\40` + ~`\01\04\73\65\6C\66\23\00\3E\04\00\17\5B\6D\65\74\68\6F\64\5D\64\65\73\63` + ~`\72\69\70\74\6F\72\2E\73\74\61\74\01\3F\01\40\03\04\73\65\6C\66\23\0A\70` + ~`\61\74\68\2D\66\6C\61\67\73\0F\04\70\61\74\68\73\00\3E\04\00\1A\5B\6D\65` + ~`\74\68\6F\64\5D\64\65\73\63\72\69\70\74\6F\72\2E\73\74\61\74\2D\61\74\01` + ~`\40\01\40\05\04\73\65\6C\66\23\0A\70\61\74\68\2D\66\6C\61\67\73\0F\04\70` + ~`\61\74\68\73\15\64\61\74\61\2D\61\63\63\65\73\73\2D\74\69\6D\65\73\74\61` + ~`\6D\70\18\1B\64\61\74\61\2D\6D\6F\64\69\66\69\63\61\74\69\6F\6E\2D\74\69` + ~`\6D\65\73\74\61\6D\70\18\00\2B\04\00\1F\5B\6D\65\74\68\6F\64\5D\64\65\73` + ~`\63\72\69\70\74\6F\72\2E\73\65\74\2D\74\69\6D\65\73\2D\61\74\01\41\01\40` + ~`\05\04\73\65\6C\66\23\0E\6F\6C\64\2D\70\61\74\68\2D\66\6C\61\67\73\0F\08` + ~`\6F\6C\64\2D\70\61\74\68\73\0E\6E\65\77\2D\64\65\73\63\72\69\70\74\6F\72` + ~`\23\08\6E\65\77\2D\70\61\74\68\73\00\2B\04\00\1A\5B\6D\65\74\68\6F\64\5D` + ~`\64\65\73\63\72\69\70\74\6F\72\2E\6C\69\6E\6B\2D\61\74\01\42\01\69\21\01` + ~`\6A\01\C3\00\01\1C\01\40\05\04\73\65\6C\66\23\0A\70\61\74\68\2D\66\6C\61` + ~`\67\73\0F\04\70\61\74\68\73\0A\6F\70\65\6E\2D\66\6C\61\67\73\11\05\66\6C` + ~`\61\67\73\0D\00\C4\00\04\00\1A\5B\6D\65\74\68\6F\64\5D\64\65\73\63\72\69` + ~`\70\74\6F\72\2E\6F\70\65\6E\2D\61\74\01\45\01\6A\01\73\01\1C\01\40\02\04` + ~`\73\65\6C\66\23\04\70\61\74\68\73\00\C6\00\04\00\1E\5B\6D\65\74\68\6F\64` + ~`\5D\64\65\73\63\72\69\70\74\6F\72\2E\72\65\61\64\6C\69\6E\6B\2D\61\74\01` + ~`\47\04\00\26\5B\6D\65\74\68\6F\64\5D\64\65\73\63\72\69\70\74\6F\72\2E\72` + ~`\65\6D\6F\76\65\2D\64\69\72\65\63\74\6F\72\79\2D\61\74\01\3D\01\40\04\04` + ~`\73\65\6C\66\23\08\6F\6C\64\2D\70\61\74\68\73\0E\6E\65\77\2D\64\65\73\63` + ~`\72\69\70\74\6F\72\23\08\6E\65\77\2D\70\61\74\68\73\00\2B\04\00\1C\5B\6D` + ~`\65\74\68\6F\64\5D\64\65\73\63\72\69\70\74\6F\72\2E\72\65\6E\61\6D\65\2D` + ~`\61\74\01\48\01\40\03\04\73\65\6C\66\23\08\6F\6C\64\2D\70\61\74\68\73\08` + ~`\6E\65\77\2D\70\61\74\68\73\00\2B\04\00\1D\5B\6D\65\74\68\6F\64\5D\64\65` + ~`\73\63\72\69\70\74\6F\72\2E\73\79\6D\6C\69\6E\6B\2D\61\74\01\49\04\00\21` + ~`\5B\6D\65\74\68\6F\64\5D\64\65\73\63\72\69\70\74\6F\72\2E\75\6E\6C\69\6E` + ~`\6B\2D\66\69\6C\65\2D\61\74\01\3D\01\40\02\04\73\65\6C\66\23\05\6F\74\68` + ~`\65\72\23\00\7F\04\00\21\5B\6D\65\74\68\6F\64\5D\64\65\73\63\72\69\70\74` + ~`\6F\72\2E\69\73\2D\73\61\6D\65\2D\6F\62\6A\65\63\74\01\4A\01\6A\01\20\01` + ~`\1C\01\40\01\04\73\65\6C\66\23\00\CB\00\04\00\20\5B\6D\65\74\68\6F\64\5D` + ~`\64\65\73\63\72\69\70\74\6F\72\2E\6D\65\74\61\64\61\74\61\2D\68\61\73\68` + ~`\01\4C\01\40\03\04\73\65\6C\66\23\0A\70\61\74\68\2D\66\6C\61\67\73\0F\04` + ~`\70\61\74\68\73\00\CB\00\04\00\23\5B\6D\65\74\68\6F\64\5D\64\65\73\63\72` + ~`\69\70\74\6F\72\2E\6D\65\74\61\64\61\74\61\2D\68\61\73\68\2D\61\74\01\4D` + ~`\01\68\22\01\6B\1A\01\6A\01\CF\00\01\1C\01\40\01\04\73\65\6C\66\CE\00\00` + ~`\D0\00\04\00\33\5B\6D\65\74\68\6F\64\5D\64\69\72\65\63\74\6F\72\79\2D\65` + ~`\6E\74\72\79\2D\73\74\72\65\61\6D\2E\72\65\61\64\2D\64\69\72\65\63\74\6F` + ~`\72\79\2D\65\6E\74\72\79\01\51\01\68\05\01\6B\1C\01\40\01\03\65\72\72\D2` + ~`\00\00\D3\00\04\00\15\66\69\6C\65\73\79\73\74\65\6D\2D\65\72\72\6F\72\2D` + ~`\63\6F\64\65\01\54\03\00\1C\77\61\73\69\3A\66\69\6C\65\73\79\73\74\65\6D` + ~`\2F\74\79\70\65\73\40\30\2E\32\2E\31\32\05\17\02\03\00\0F\0A\64\65\73\63` + ~`\72\69\70\74\6F\72\01\42\07\02\03\02\01\18\04\00\0A\64\65\73\63\72\69\70` + ~`\74\6F\72\03\00\00\01\69\01\01\6F\02\02\73\01\70\03\01\40\00\00\04\04\00` + ~`\0F\67\65\74\2D\64\69\72\65\63\74\6F\72\69\65\73\01\05\03\00\1F\77\61\73` + ~`\69\3A\66\69\6C\65\73\79\73\74\65\6D\2F\70\72\65\6F\70\65\6E\73\40\30\2E` + ~`\32\2E\31\32\05\19\01\42\17\02\03\02\01\04\04\00\05\65\72\72\6F\72\03\00` + ~`\00\04\00\07\6E\65\74\77\6F\72\6B\03\01\01\6D\15\07\75\6E\6B\6E\6F\77\6E` + ~`\0D\61\63\63\65\73\73\2D\64\65\6E\69\65\64\0D\6E\6F\74\2D\73\75\70\70\6F` + ~`\72\74\65\64\10\69\6E\76\61\6C\69\64\2D\61\72\67\75\6D\65\6E\74\0D\6F\75` + ~`\74\2D\6F\66\2D\6D\65\6D\6F\72\79\07\74\69\6D\65\6F\75\74\14\63\6F\6E\63` + ~`\75\72\72\65\6E\63\79\2D\63\6F\6E\66\6C\69\63\74\0F\6E\6F\74\2D\69\6E\2D` + ~`\70\72\6F\67\72\65\73\73\0B\77\6F\75\6C\64\2D\62\6C\6F\63\6B\0D\69\6E\76` + ~`\61\6C\69\64\2D\73\74\61\74\65\10\6E\65\77\2D\73\6F\63\6B\65\74\2D\6C\69` + ~`\6D\69\74\14\61\64\64\72\65\73\73\2D\6E\6F\74\2D\62\69\6E\64\61\62\6C\65` + ~`\0E\61\64\64\72\65\73\73\2D\69\6E\2D\75\73\65\12\72\65\6D\6F\74\65\2D\75` + ~`\6E\72\65\61\63\68\61\62\6C\65\12\63\6F\6E\6E\65\63\74\69\6F\6E\2D\72\65` + ~`\66\75\73\65\64\10\63\6F\6E\6E\65\63\74\69\6F\6E\2D\72\65\73\65\74\12\63` + ~`\6F\6E\6E\65\63\74\69\6F\6E\2D\61\62\6F\72\74\65\64\12\64\61\74\61\67\72` + ~`\61\6D\2D\74\6F\6F\2D\6C\61\72\67\65\11\6E\61\6D\65\2D\75\6E\72\65\73\6F` + ~`\6C\76\61\62\6C\65\1A\74\65\6D\70\6F\72\61\72\79\2D\72\65\73\6F\6C\76\65` + ~`\72\2D\66\61\69\6C\75\72\65\1A\70\65\72\6D\61\6E\65\6E\74\2D\72\65\73\6F` + ~`\6C\76\65\72\2D\66\61\69\6C\75\72\65\04\00\0A\65\72\72\6F\72\2D\63\6F\64` + ~`\65\03\00\03\01\6D\02\04\69\70\76\34\04\69\70\76\36\04\00\11\69\70\2D\61` + ~`\64\64\72\65\73\73\2D\66\61\6D\69\6C\79\03\00\05\01\6F\04\7D\7D\7D\7D\04` + ~`\00\0C\69\70\76\34\2D\61\64\64\72\65\73\73\03\00\07\01\6F\08\7B\7B\7B\7B` + ~`\7B\7B\7B\7B\04\00\0C\69\70\76\36\2D\61\64\64\72\65\73\73\03\00\09\01\71` + ~`\02\04\69\70\76\34\01\08\00\04\69\70\76\36\01\0A\00\04\00\0A\69\70\2D\61` + ~`\64\64\72\65\73\73\03\00\0B\01\72\02\04\70\6F\72\74\7B\07\61\64\64\72\65` + ~`\73\73\08\04\00\13\69\70\76\34\2D\73\6F\63\6B\65\74\2D\61\64\64\72\65\73` + ~`\73\03\00\0D\01\72\04\04\70\6F\72\74\7B\09\66\6C\6F\77\2D\69\6E\66\6F\79` + ~`\07\61\64\64\72\65\73\73\0A\08\73\63\6F\70\65\2D\69\64\79\04\00\13\69\70` + ~`\76\36\2D\73\6F\63\6B\65\74\2D\61\64\64\72\65\73\73\03\00\0F\01\71\02\04` + ~`\69\70\76\34\01\0E\00\04\69\70\76\36\01\10\00\04\00\11\69\70\2D\73\6F\63` + ~`\6B\65\74\2D\61\64\64\72\65\73\73\03\00\11\01\68\01\01\6B\04\01\40\01\03` + ~`\65\72\72\13\00\14\04\00\12\6E\65\74\77\6F\72\6B\2D\65\72\72\6F\72\2D\63` + ~`\6F\64\65\01\15\03\00\1B\77\61\73\69\3A\73\6F\63\6B\65\74\73\2F\6E\65\74` + ~`\77\6F\72\6B\40\30\2E\32\2E\31\32\05\1A\02\03\00\11\07\6E\65\74\77\6F\72` + ~`\6B\01\42\05\02\03\02\01\1B\04\00\07\6E\65\74\77\6F\72\6B\03\00\00\01\69` + ~`\01\01\40\00\00\02\04\00\10\69\6E\73\74\61\6E\63\65\2D\6E\65\74\77\6F\72` + ~`\6B\01\03\03\00\24\77\61\73\69\3A\73\6F\63\6B\65\74\73\2F\69\6E\73\74\61` + ~`\6E\63\65\2D\6E\65\74\77\6F\72\6B\40\30\2E\32\2E\31\32\05\1C\02\03\00\11` + ~`\0A\65\72\72\6F\72\2D\63\6F\64\65\02\03\00\11\11\69\70\2D\73\6F\63\6B\65` + ~`\74\2D\61\64\64\72\65\73\73\02\03\00\11\11\69\70\2D\61\64\64\72\65\73\73` + ~`\2D\66\61\6D\69\6C\79\01\42\44\02\03\02\01\05\04\00\08\70\6F\6C\6C\61\62` + ~`\6C\65\03\00\00\02\03\02\01\1B\04\00\07\6E\65\74\77\6F\72\6B\03\00\02\02` + ~`\03\02\01\1D\04\00\0A\65\72\72\6F\72\2D\63\6F\64\65\03\00\04\02\03\02\01` + ~`\1E\04\00\11\69\70\2D\73\6F\63\6B\65\74\2D\61\64\64\72\65\73\73\03\00\06` + ~`\02\03\02\01\1F\04\00\11\69\70\2D\61\64\64\72\65\73\73\2D\66\61\6D\69\6C` + ~`\79\03\00\08\01\70\7D\01\72\02\04\64\61\74\61\0A\0E\72\65\6D\6F\74\65\2D` + ~`\61\64\64\72\65\73\73\07\04\00\11\69\6E\63\6F\6D\69\6E\67\2D\64\61\74\61` + ~`\67\72\61\6D\03\00\0B\01\6B\07\01\72\02\04\64\61\74\61\0A\0E\72\65\6D\6F` + ~`\74\65\2D\61\64\64\72\65\73\73\0D\04\00\11\6F\75\74\67\6F\69\6E\67\2D\64` + ~`\61\74\61\67\72\61\6D\03\00\0E\04\00\0A\75\64\70\2D\73\6F\63\6B\65\74\03` + ~`\01\04\00\18\69\6E\63\6F\6D\69\6E\67\2D\64\61\74\61\67\72\61\6D\2D\73\74` + ~`\72\65\61\6D\03\01\04\00\18\6F\75\74\67\6F\69\6E\67\2D\64\61\74\61\67\72` + ~`\61\6D\2D\73\74\72\65\61\6D\03\01\01\68\10\01\68\03\01\6A\00\01\05\01\40` + ~`\03\04\73\65\6C\66\13\07\6E\65\74\77\6F\72\6B\14\0D\6C\6F\63\61\6C\2D\61` + ~`\64\64\72\65\73\73\07\00\15\04\00\1D\5B\6D\65\74\68\6F\64\5D\75\64\70\2D` + ~`\73\6F\63\6B\65\74\2E\73\74\61\72\74\2D\62\69\6E\64\01\16\01\40\01\04\73` + ~`\65\6C\66\13\00\15\04\00\1E\5B\6D\65\74\68\6F\64\5D\75\64\70\2D\73\6F\63` + ~`\6B\65\74\2E\66\69\6E\69\73\68\2D\62\69\6E\64\01\17\01\69\11\01\69\12\01` + ~`\6F\02\18\19\01\6A\01\1A\01\05\01\40\02\04\73\65\6C\66\13\0E\72\65\6D\6F` + ~`\74\65\2D\61\64\64\72\65\73\73\0D\00\1B\04\00\19\5B\6D\65\74\68\6F\64\5D` + ~`\75\64\70\2D\73\6F\63\6B\65\74\2E\73\74\72\65\61\6D\01\1C\01\6A\01\07\01` + ~`\05\01\40\01\04\73\65\6C\66\13\00\1D\04\00\20\5B\6D\65\74\68\6F\64\5D\75` + ~`\64\70\2D\73\6F\63\6B\65\74\2E\6C\6F\63\61\6C\2D\61\64\64\72\65\73\73\01` + ~`\1E\04\00\21\5B\6D\65\74\68\6F\64\5D\75\64\70\2D\73\6F\63\6B\65\74\2E\72` + ~`\65\6D\6F\74\65\2D\61\64\64\72\65\73\73\01\1E\01\40\01\04\73\65\6C\66\13` + ~`\00\09\04\00\21\5B\6D\65\74\68\6F\64\5D\75\64\70\2D\73\6F\63\6B\65\74\2E` + ~`\61\64\64\72\65\73\73\2D\66\61\6D\69\6C\79\01\1F\01\6A\01\7D\01\05\01\40` + ~`\01\04\73\65\6C\66\13\00\20\04\00\24\5B\6D\65\74\68\6F\64\5D\75\64\70\2D` + ~`\73\6F\63\6B\65\74\2E\75\6E\69\63\61\73\74\2D\68\6F\70\2D\6C\69\6D\69\74` + ~`\01\21\01\40\02\04\73\65\6C\66\13\05\76\61\6C\75\65\7D\00\15\04\00\28\5B` + ~`\6D\65\74\68\6F\64\5D\75\64\70\2D\73\6F\63\6B\65\74\2E\73\65\74\2D\75\6E` + ~`\69\63\61\73\74\2D\68\6F\70\2D\6C\69\6D\69\74\01\22\01\6A\01\77\01\05\01` + ~`\40\01\04\73\65\6C\66\13\00\23\04\00\26\5B\6D\65\74\68\6F\64\5D\75\64\70` + ~`\2D\73\6F\63\6B\65\74\2E\72\65\63\65\69\76\65\2D\62\75\66\66\65\72\2D\73` + ~`\69\7A\65\01\24\01\40\02\04\73\65\6C\66\13\05\76\61\6C\75\65\77\00\15\04` + ~`\00\2A\5B\6D\65\74\68\6F\64\5D\75\64\70\2D\73\6F\63\6B\65\74\2E\73\65\74` + ~`\2D\72\65\63\65\69\76\65\2D\62\75\66\66\65\72\2D\73\69\7A\65\01\25\04\00` + ~`\23\5B\6D\65\74\68\6F\64\5D\75\64\70\2D\73\6F\63\6B\65\74\2E\73\65\6E\64` + ~`\2D\62\75\66\66\65\72\2D\73\69\7A\65\01\24\04\00\27\5B\6D\65\74\68\6F\64` + ~`\5D\75\64\70\2D\73\6F\63\6B\65\74\2E\73\65\74\2D\73\65\6E\64\2D\62\75\66` + ~`\66\65\72\2D\73\69\7A\65\01\25\01\69\01\01\40\01\04\73\65\6C\66\13\00\26` + ~`\04\00\1C\5B\6D\65\74\68\6F\64\5D\75\64\70\2D\73\6F\63\6B\65\74\2E\73\75` + ~`\62\73\63\72\69\62\65\01\27\01\68\11\01\70\0C\01\6A\01\29\01\05\01\40\02` + ~`\04\73\65\6C\66\28\0B\6D\61\78\2D\72\65\73\75\6C\74\73\77\00\2A\04\00\28` + ~`\5B\6D\65\74\68\6F\64\5D\69\6E\63\6F\6D\69\6E\67\2D\64\61\74\61\67\72\61` + ~`\6D\2D\73\74\72\65\61\6D\2E\72\65\63\65\69\76\65\01\2B\01\40\01\04\73\65` + ~`\6C\66\28\00\26\04\00\2A\5B\6D\65\74\68\6F\64\5D\69\6E\63\6F\6D\69\6E\67` + ~`\2D\64\61\74\61\67\72\61\6D\2D\73\74\72\65\61\6D\2E\73\75\62\73\63\72\69` + ~`\62\65\01\2C\01\68\12\01\40\01\04\73\65\6C\66\2D\00\23\04\00\2B\5B\6D\65` + ~`\74\68\6F\64\5D\6F\75\74\67\6F\69\6E\67\2D\64\61\74\61\67\72\61\6D\2D\73` + ~`\74\72\65\61\6D\2E\63\68\65\63\6B\2D\73\65\6E\64\01\2E\01\70\0F\01\40\02` + ~`\04\73\65\6C\66\2D\09\64\61\74\61\67\72\61\6D\73\2F\00\23\04\00\25\5B\6D` + ~`\65\74\68\6F\64\5D\6F\75\74\67\6F\69\6E\67\2D\64\61\74\61\67\72\61\6D\2D` + ~`\73\74\72\65\61\6D\2E\73\65\6E\64\01\30\01\40\01\04\73\65\6C\66\2D\00\26` + ~`\04\00\2A\5B\6D\65\74\68\6F\64\5D\6F\75\74\67\6F\69\6E\67\2D\64\61\74\61` + ~`\67\72\61\6D\2D\73\74\72\65\61\6D\2E\73\75\62\73\63\72\69\62\65\01\31\03` + ~`\00\17\77\61\73\69\3A\73\6F\63\6B\65\74\73\2F\75\64\70\40\30\2E\32\2E\31` + ~`\32\05\20\02\03\00\13\0A\75\64\70\2D\73\6F\63\6B\65\74\01\42\0C\02\03\02` + ~`\01\1B\04\00\07\6E\65\74\77\6F\72\6B\03\00\00\02\03\02\01\1D\04\00\0A\65` + ~`\72\72\6F\72\2D\63\6F\64\65\03\00\02\02\03\02\01\1F\04\00\11\69\70\2D\61` + ~`\64\64\72\65\73\73\2D\66\61\6D\69\6C\79\03\00\04\02\03\02\01\21\04\00\0A` + ~`\75\64\70\2D\73\6F\63\6B\65\74\03\00\06\01\69\07\01\6A\01\08\01\03\01\40` + ~`\01\0E\61\64\64\72\65\73\73\2D\66\61\6D\69\6C\79\05\00\09\04\00\11\63\72` + ~`\65\61\74\65\2D\75\64\70\2D\73\6F\63\6B\65\74\01\0A\03\00\25\77\61\73\69` + ~`\3A\73\6F\63\6B\65\74\73\2F\75\64\70\2D\63\72\65\61\74\65\2D\73\6F\63\6B` + ~`\65\74\40\30\2E\32\2E\31\32\05\22\02\03\00\0D\08\64\75\72\61\74\69\6F\6E` + ~`\01\42\54\02\03\02\01\07\04\00\0C\69\6E\70\75\74\2D\73\74\72\65\61\6D\03` + ~`\00\00\02\03\02\01\09\04\00\0D\6F\75\74\70\75\74\2D\73\74\72\65\61\6D\03` + ~`\00\02\02\03\02\01\05\04\00\08\70\6F\6C\6C\61\62\6C\65\03\00\04\02\03\02` + ~`\01\23\04\00\08\64\75\72\61\74\69\6F\6E\03\00\06\02\03\02\01\1B\04\00\07` + ~`\6E\65\74\77\6F\72\6B\03\00\08\02\03\02\01\1D\04\00\0A\65\72\72\6F\72\2D` + ~`\63\6F\64\65\03\00\0A\02\03\02\01\1E\04\00\11\69\70\2D\73\6F\63\6B\65\74` + ~`\2D\61\64\64\72\65\73\73\03\00\0C\02\03\02\01\1F\04\00\11\69\70\2D\61\64` + ~`\64\72\65\73\73\2D\66\61\6D\69\6C\79\03\00\0E\01\6D\03\07\72\65\63\65\69` + ~`\76\65\04\73\65\6E\64\04\62\6F\74\68\04\00\0D\73\68\75\74\64\6F\77\6E\2D` + ~`\74\79\70\65\03\00\10\04\00\0A\74\63\70\2D\73\6F\63\6B\65\74\03\01\01\68` + ~`\12\01\68\09\01\6A\00\01\0B\01\40\03\04\73\65\6C\66\13\07\6E\65\74\77\6F` + ~`\72\6B\14\0D\6C\6F\63\61\6C\2D\61\64\64\72\65\73\73\0D\00\15\04\00\1D\5B` + ~`\6D\65\74\68\6F\64\5D\74\63\70\2D\73\6F\63\6B\65\74\2E\73\74\61\72\74\2D` + ~`\62\69\6E\64\01\16\01\40\01\04\73\65\6C\66\13\00\15\04\00\1E\5B\6D\65\74` + ~`\68\6F\64\5D\74\63\70\2D\73\6F\63\6B\65\74\2E\66\69\6E\69\73\68\2D\62\69` + ~`\6E\64\01\17\01\40\03\04\73\65\6C\66\13\07\6E\65\74\77\6F\72\6B\14\0E\72` + ~`\65\6D\6F\74\65\2D\61\64\64\72\65\73\73\0D\00\15\04\00\20\5B\6D\65\74\68` + ~`\6F\64\5D\74\63\70\2D\73\6F\63\6B\65\74\2E\73\74\61\72\74\2D\63\6F\6E\6E` + ~`\65\63\74\01\18\01\69\01\01\69\03\01\6F\02\19\1A\01\6A\01\1B\01\0B\01\40` + ~`\01\04\73\65\6C\66\13\00\1C\04\00\21\5B\6D\65\74\68\6F\64\5D\74\63\70\2D` + ~`\73\6F\63\6B\65\74\2E\66\69\6E\69\73\68\2D\63\6F\6E\6E\65\63\74\01\1D\04` + ~`\00\1F\5B\6D\65\74\68\6F\64\5D\74\63\70\2D\73\6F\63\6B\65\74\2E\73\74\61` + ~`\72\74\2D\6C\69\73\74\65\6E\01\17\04\00\20\5B\6D\65\74\68\6F\64\5D\74\63` + ~`\70\2D\73\6F\63\6B\65\74\2E\66\69\6E\69\73\68\2D\6C\69\73\74\65\6E\01\17` + ~`\01\69\12\01\6F\03\1E\19\1A\01\6A\01\1F\01\0B\01\40\01\04\73\65\6C\66\13` + ~`\00\20\04\00\19\5B\6D\65\74\68\6F\64\5D\74\63\70\2D\73\6F\63\6B\65\74\2E` + ~`\61\63\63\65\70\74\01\21\01\6A\01\0D\01\0B\01\40\01\04\73\65\6C\66\13\00` + ~`\22\04\00\20\5B\6D\65\74\68\6F\64\5D\74\63\70\2D\73\6F\63\6B\65\74\2E\6C` + ~`\6F\63\61\6C\2D\61\64\64\72\65\73\73\01\23\04\00\21\5B\6D\65\74\68\6F\64` + ~`\5D\74\63\70\2D\73\6F\63\6B\65\74\2E\72\65\6D\6F\74\65\2D\61\64\64\72\65` + ~`\73\73\01\23\01\40\01\04\73\65\6C\66\13\00\7F\04\00\1F\5B\6D\65\74\68\6F` + ~`\64\5D\74\63\70\2D\73\6F\63\6B\65\74\2E\69\73\2D\6C\69\73\74\65\6E\69\6E` + ~`\67\01\24\01\40\01\04\73\65\6C\66\13\00\0F\04\00\21\5B\6D\65\74\68\6F\64` + ~`\5D\74\63\70\2D\73\6F\63\6B\65\74\2E\61\64\64\72\65\73\73\2D\66\61\6D\69` + ~`\6C\79\01\25\01\40\02\04\73\65\6C\66\13\05\76\61\6C\75\65\77\00\15\04\00` + ~`\2A\5B\6D\65\74\68\6F\64\5D\74\63\70\2D\73\6F\63\6B\65\74\2E\73\65\74\2D` + ~`\6C\69\73\74\65\6E\2D\62\61\63\6B\6C\6F\67\2D\73\69\7A\65\01\26\01\6A\01` + ~`\7F\01\0B\01\40\01\04\73\65\6C\66\13\00\27\04\00\25\5B\6D\65\74\68\6F\64` + ~`\5D\74\63\70\2D\73\6F\63\6B\65\74\2E\6B\65\65\70\2D\61\6C\69\76\65\2D\65` + ~`\6E\61\62\6C\65\64\01\28\01\40\02\04\73\65\6C\66\13\05\76\61\6C\75\65\7F` + ~`\00\15\04\00\29\5B\6D\65\74\68\6F\64\5D\74\63\70\2D\73\6F\63\6B\65\74\2E` + ~`\73\65\74\2D\6B\65\65\70\2D\61\6C\69\76\65\2D\65\6E\61\62\6C\65\64\01\29` + ~`\01\6A\01\07\01\0B\01\40\01\04\73\65\6C\66\13\00\2A\04\00\27\5B\6D\65\74` + ~`\68\6F\64\5D\74\63\70\2D\73\6F\63\6B\65\74\2E\6B\65\65\70\2D\61\6C\69\76` + ~`\65\2D\69\64\6C\65\2D\74\69\6D\65\01\2B\01\40\02\04\73\65\6C\66\13\05\76` + ~`\61\6C\75\65\07\00\15\04\00\2B\5B\6D\65\74\68\6F\64\5D\74\63\70\2D\73\6F` + ~`\63\6B\65\74\2E\73\65\74\2D\6B\65\65\70\2D\61\6C\69\76\65\2D\69\64\6C\65` + ~`\2D\74\69\6D\65\01\2C\04\00\26\5B\6D\65\74\68\6F\64\5D\74\63\70\2D\73\6F` + ~`\63\6B\65\74\2E\6B\65\65\70\2D\61\6C\69\76\65\2D\69\6E\74\65\72\76\61\6C` + ~`\01\2B\04\00\2A\5B\6D\65\74\68\6F\64\5D\74\63\70\2D\73\6F\63\6B\65\74\2E` + ~`\73\65\74\2D\6B\65\65\70\2D\61\6C\69\76\65\2D\69\6E\74\65\72\76\61\6C\01` + ~`\2C\01\6A\01\79\01\0B\01\40\01\04\73\65\6C\66\13\00\2D\04\00\23\5B\6D\65` + ~`\74\68\6F\64\5D\74\63\70\2D\73\6F\63\6B\65\74\2E\6B\65\65\70\2D\61\6C\69` + ~`\76\65\2D\63\6F\75\6E\74\01\2E\01\40\02\04\73\65\6C\66\13\05\76\61\6C\75` + ~`\65\79\00\15\04\00\27\5B\6D\65\74\68\6F\64\5D\74\63\70\2D\73\6F\63\6B\65` + ~`\74\2E\73\65\74\2D\6B\65\65\70\2D\61\6C\69\76\65\2D\63\6F\75\6E\74\01\2F` + ~`\01\6A\01\7D\01\0B\01\40\01\04\73\65\6C\66\13\00\30\04\00\1C\5B\6D\65\74` + ~`\68\6F\64\5D\74\63\70\2D\73\6F\63\6B\65\74\2E\68\6F\70\2D\6C\69\6D\69\74` + ~`\01\31\01\40\02\04\73\65\6C\66\13\05\76\61\6C\75\65\7D\00\15\04\00\20\5B` + ~`\6D\65\74\68\6F\64\5D\74\63\70\2D\73\6F\63\6B\65\74\2E\73\65\74\2D\68\6F` + ~`\70\2D\6C\69\6D\69\74\01\32\01\6A\01\77\01\0B\01\40\01\04\73\65\6C\66\13` + ~`\00\33\04\00\26\5B\6D\65\74\68\6F\64\5D\74\63\70\2D\73\6F\63\6B\65\74\2E` + ~`\72\65\63\65\69\76\65\2D\62\75\66\66\65\72\2D\73\69\7A\65\01\34\04\00\2A` + ~`\5B\6D\65\74\68\6F\64\5D\74\63\70\2D\73\6F\63\6B\65\74\2E\73\65\74\2D\72` + ~`\65\63\65\69\76\65\2D\62\75\66\66\65\72\2D\73\69\7A\65\01\26\04\00\23\5B` + ~`\6D\65\74\68\6F\64\5D\74\63\70\2D\73\6F\63\6B\65\74\2E\73\65\6E\64\2D\62` + ~`\75\66\66\65\72\2D\73\69\7A\65\01\34\04\00\27\5B\6D\65\74\68\6F\64\5D\74` + ~`\63\70\2D\73\6F\63\6B\65\74\2E\73\65\74\2D\73\65\6E\64\2D\62\75\66\66\65` + ~`\72\2D\73\69\7A\65\01\26\01\69\05\01\40\01\04\73\65\6C\66\13\00\35\04\00` + ~`\1C\5B\6D\65\74\68\6F\64\5D\74\63\70\2D\73\6F\63\6B\65\74\2E\73\75\62\73` + ~`\63\72\69\62\65\01\36\01\40\02\04\73\65\6C\66\13\0D\73\68\75\74\64\6F\77` + ~`\6E\2D\74\79\70\65\11\00\15\04\00\1B\5B\6D\65\74\68\6F\64\5D\74\63\70\2D` + ~`\73\6F\63\6B\65\74\2E\73\68\75\74\64\6F\77\6E\01\37\03\00\17\77\61\73\69` + ~`\3A\73\6F\63\6B\65\74\73\2F\74\63\70\40\30\2E\32\2E\31\32\05\24\02\03\00` + ~`\15\0A\74\63\70\2D\73\6F\63\6B\65\74\01\42\0C\02\03\02\01\1B\04\00\07\6E` + ~`\65\74\77\6F\72\6B\03\00\00\02\03\02\01\1D\04\00\0A\65\72\72\6F\72\2D\63` + ~`\6F\64\65\03\00\02\02\03\02\01\1F\04\00\11\69\70\2D\61\64\64\72\65\73\73` + ~`\2D\66\61\6D\69\6C\79\03\00\04\02\03\02\01\25\04\00\0A\74\63\70\2D\73\6F` + ~`\63\6B\65\74\03\00\06\01\69\07\01\6A\01\08\01\03\01\40\01\0E\61\64\64\72` + ~`\65\73\73\2D\66\61\6D\69\6C\79\05\00\09\04\00\11\63\72\65\61\74\65\2D\74` + ~`\63\70\2D\73\6F\63\6B\65\74\01\0A\03\00\25\77\61\73\69\3A\73\6F\63\6B\65` + ~`\74\73\2F\74\63\70\2D\63\72\65\61\74\65\2D\73\6F\63\6B\65\74\40\30\2E\32` + ~`\2E\31\32\05\26\02\03\00\11\0A\69\70\2D\61\64\64\72\65\73\73\01\42\16\02` + ~`\03\02\01\05\04\00\08\70\6F\6C\6C\61\62\6C\65\03\00\00\02\03\02\01\1B\04` + ~`\00\07\6E\65\74\77\6F\72\6B\03\00\02\02\03\02\01\1D\04\00\0A\65\72\72\6F` + ~`\72\2D\63\6F\64\65\03\00\04\02\03\02\01\27\04\00\0A\69\70\2D\61\64\64\72` + ~`\65\73\73\03\00\06\04\00\16\72\65\73\6F\6C\76\65\2D\61\64\64\72\65\73\73` + ~`\2D\73\74\72\65\61\6D\03\01\01\68\08\01\6B\07\01\6A\01\0A\01\05\01\40\01` + ~`\04\73\65\6C\66\09\00\0B\04\00\33\5B\6D\65\74\68\6F\64\5D\72\65\73\6F\6C` + ~`\76\65\2D\61\64\64\72\65\73\73\2D\73\74\72\65\61\6D\2E\72\65\73\6F\6C\76` + ~`\65\2D\6E\65\78\74\2D\61\64\64\72\65\73\73\01\0C\01\69\01\01\40\01\04\73` + ~`\65\6C\66\09\00\0D\04\00\28\5B\6D\65\74\68\6F\64\5D\72\65\73\6F\6C\76\65` + ~`\2D\61\64\64\72\65\73\73\2D\73\74\72\65\61\6D\2E\73\75\62\73\63\72\69\62` + ~`\65\01\0E\01\68\03\01\69\08\01\6A\01\10\01\05\01\40\02\07\6E\65\74\77\6F` + ~`\72\6B\0F\04\6E\61\6D\65\73\00\11\04\00\11\72\65\73\6F\6C\76\65\2D\61\64` + ~`\64\72\65\73\73\65\73\01\12\03\00\22\77\61\73\69\3A\73\6F\63\6B\65\74\73` + ~`\2F\69\70\2D\6E\61\6D\65\2D\6C\6F\6F\6B\75\70\40\30\2E\32\2E\31\32\05\28` + ~`\01\42\05\01\70\7D\01\40\01\03\6C\65\6E\77\00\00\04\00\10\67\65\74\2D\72` + ~`\61\6E\64\6F\6D\2D\62\79\74\65\73\01\01\01\40\00\00\77\04\00\0E\67\65\74` + ~`\2D\72\61\6E\64\6F\6D\2D\75\36\34\01\02\03\00\19\77\61\73\69\3A\72\61\6E` + ~`\64\6F\6D\2F\72\61\6E\64\6F\6D\40\30\2E\32\2E\31\32\05\29\01\42\05\01\70` + ~`\7D\01\40\01\03\6C\65\6E\77\00\00\04\00\19\67\65\74\2D\69\6E\73\65\63\75` + ~`\72\65\2D\72\61\6E\64\6F\6D\2D\62\79\74\65\73\01\01\01\40\00\00\77\04\00` + ~`\17\67\65\74\2D\69\6E\73\65\63\75\72\65\2D\72\61\6E\64\6F\6D\2D\75\36\34` + ~`\01\02\03\00\1B\77\61\73\69\3A\72\61\6E\64\6F\6D\2F\69\6E\73\65\63\75\72` + ~`\65\40\30\2E\32\2E\31\32\05\2A\01\42\03\01\6F\02\77\77\01\40\00\00\00\04` + ~`\00\0D\69\6E\73\65\63\75\72\65\2D\73\65\65\64\01\01\03\00\20\77\61\73\69` + ~`\3A\72\61\6E\64\6F\6D\2F\69\6E\73\65\63\75\72\65\2D\73\65\65\64\40\30\2E` + ~`\32\2E\31\32\05\2B\04\00\17\77\61\73\69\3A\63\6C\69\2F\69\6D\70\6F\72\74` + ~`\73\40\30\2E\32\2E\31\32\04\00\0B\0D\01\00\07\69\6D\70\6F\72\74\73\03\00` + ~`\00\00\44\09\70\72\6F\64\75\63\65\72\73\01\0C\70\72\6F\63\65\73\73\65\64` + ~`\2D\62\79\02\0D\77\69\74\2D\63\6F\6D\70\6F\6E\65\6E\74\07\30\2E\32\34\37` + ~`\2E\30\0D\77\69\74\2D\62\69\6E\64\67\65\6E\2D\64\06\30\2E\35\37\2E\31"}`, + void + ); +} diff --git a/druntime/src/core/sys/wasi/p2/cli/stderr/common.d b/druntime/src/core/sys/wasi/p2/cli/stderr/common.d new file mode 100644 index 000000000000..16487628d9ed --- /dev/null +++ b/druntime/src/core/sys/wasi/p2/cli/stderr/common.d @@ -0,0 +1,10 @@ +/++ + ++/ +module core.sys.wasi.p2.cli.stderr.common; + +import core.sys.wasi.wit_common; + +static import core.sys.wasi.p2.io.streams.common; + +package (core.sys.wasi.p2) void __wit_bindgen_component_type_force_link() pure @nogc nothrow => imported!"core.sys.wasi.p2.cli.imports".__wit_bindgen_component_type_force_link(); diff --git a/druntime/src/core/sys/wasi/p2/cli/stderr/imports.d b/druntime/src/core/sys/wasi/p2/cli/stderr/imports.d new file mode 100644 index 000000000000..8d91407b6806 --- /dev/null +++ b/druntime/src/core/sys/wasi/p2/cli/stderr/imports.d @@ -0,0 +1,29 @@ +/++ + ++/ +module core.sys.wasi.p2.cli.stderr.imports; + +import core.sys.wasi.wit_common; + +public import core.sys.wasi.p2.cli.stderr.common; + +static import core.sys.wasi.p2.io.streams.imports; + +package (core.sys.wasi.p2) void __wit_bindgen_component_type_force_link() pure @nogc nothrow => imported!"core.sys.wasi.p2.cli.imports".__wit_bindgen_component_type_force_link(); + +/++ + ++/ +alias OutputStream = core.sys.wasi.p2.io.streams.imports.OutputStream; + +/++ + ++/ +OutputStream getStderr() @nogc nothrow { + auto _ret = __import_getStderr(); + return OutputStream(_ret); +} +/// ditto +@wasmImport!("wasi:cli/stderr@0.2.12", "get-stderr") +pragma(mangle, "__wit_import_wasi:cli__stderr@0.2.12__get_stderr") +private extern(C) uint __import_getStderr() @nogc nothrow; diff --git a/druntime/src/core/sys/wasi/p2/cli/stdin/common.d b/druntime/src/core/sys/wasi/p2/cli/stdin/common.d new file mode 100644 index 000000000000..7a5a2e52d6a7 --- /dev/null +++ b/druntime/src/core/sys/wasi/p2/cli/stdin/common.d @@ -0,0 +1,10 @@ +/++ + ++/ +module core.sys.wasi.p2.cli.stdin.common; + +import core.sys.wasi.wit_common; + +static import core.sys.wasi.p2.io.streams.common; + +package (core.sys.wasi.p2) void __wit_bindgen_component_type_force_link() pure @nogc nothrow => imported!"core.sys.wasi.p2.cli.imports".__wit_bindgen_component_type_force_link(); diff --git a/druntime/src/core/sys/wasi/p2/cli/stdin/imports.d b/druntime/src/core/sys/wasi/p2/cli/stdin/imports.d new file mode 100644 index 000000000000..915034185a4e --- /dev/null +++ b/druntime/src/core/sys/wasi/p2/cli/stdin/imports.d @@ -0,0 +1,29 @@ +/++ + ++/ +module core.sys.wasi.p2.cli.stdin.imports; + +import core.sys.wasi.wit_common; + +public import core.sys.wasi.p2.cli.stdin.common; + +static import core.sys.wasi.p2.io.streams.imports; + +package (core.sys.wasi.p2) void __wit_bindgen_component_type_force_link() pure @nogc nothrow => imported!"core.sys.wasi.p2.cli.imports".__wit_bindgen_component_type_force_link(); + +/++ + ++/ +alias InputStream = core.sys.wasi.p2.io.streams.imports.InputStream; + +/++ + ++/ +InputStream getStdin() @nogc nothrow { + auto _ret = __import_getStdin(); + return InputStream(_ret); +} +/// ditto +@wasmImport!("wasi:cli/stdin@0.2.12", "get-stdin") +pragma(mangle, "__wit_import_wasi:cli__stdin@0.2.12__get_stdin") +private extern(C) uint __import_getStdin() @nogc nothrow; diff --git a/druntime/src/core/sys/wasi/p2/cli/stdout/common.d b/druntime/src/core/sys/wasi/p2/cli/stdout/common.d new file mode 100644 index 000000000000..1a7057a3e38e --- /dev/null +++ b/druntime/src/core/sys/wasi/p2/cli/stdout/common.d @@ -0,0 +1,10 @@ +/++ + ++/ +module core.sys.wasi.p2.cli.stdout.common; + +import core.sys.wasi.wit_common; + +static import core.sys.wasi.p2.io.streams.common; + +package (core.sys.wasi.p2) void __wit_bindgen_component_type_force_link() pure @nogc nothrow => imported!"core.sys.wasi.p2.cli.imports".__wit_bindgen_component_type_force_link(); diff --git a/druntime/src/core/sys/wasi/p2/cli/stdout/imports.d b/druntime/src/core/sys/wasi/p2/cli/stdout/imports.d new file mode 100644 index 000000000000..a5a3215db47d --- /dev/null +++ b/druntime/src/core/sys/wasi/p2/cli/stdout/imports.d @@ -0,0 +1,29 @@ +/++ + ++/ +module core.sys.wasi.p2.cli.stdout.imports; + +import core.sys.wasi.wit_common; + +public import core.sys.wasi.p2.cli.stdout.common; + +static import core.sys.wasi.p2.io.streams.imports; + +package (core.sys.wasi.p2) void __wit_bindgen_component_type_force_link() pure @nogc nothrow => imported!"core.sys.wasi.p2.cli.imports".__wit_bindgen_component_type_force_link(); + +/++ + ++/ +alias OutputStream = core.sys.wasi.p2.io.streams.imports.OutputStream; + +/++ + ++/ +OutputStream getStdout() @nogc nothrow { + auto _ret = __import_getStdout(); + return OutputStream(_ret); +} +/// ditto +@wasmImport!("wasi:cli/stdout@0.2.12", "get-stdout") +pragma(mangle, "__wit_import_wasi:cli__stdout@0.2.12__get_stdout") +private extern(C) uint __import_getStdout() @nogc nothrow; diff --git a/druntime/src/core/sys/wasi/p2/cli/terminal_input/common.d b/druntime/src/core/sys/wasi/p2/cli/terminal_input/common.d new file mode 100644 index 000000000000..a66671ee2fcb --- /dev/null +++ b/druntime/src/core/sys/wasi/p2/cli/terminal_input/common.d @@ -0,0 +1,13 @@ +/++ +Terminal input. + +In the future, this may include functions for disabling echoing, +disabling input buffering so that keyboard events are sent through +immediately, querying supported features, and so on. ++/ +module core.sys.wasi.p2.cli.terminal_input.common; + +import core.sys.wasi.wit_common; + + +package (core.sys.wasi.p2) void __wit_bindgen_component_type_force_link() pure @nogc nothrow => imported!"core.sys.wasi.p2.cli.imports".__wit_bindgen_component_type_force_link(); diff --git a/druntime/src/core/sys/wasi/p2/cli/terminal_input/imports.d b/druntime/src/core/sys/wasi/p2/cli/terminal_input/imports.d new file mode 100644 index 000000000000..9b6076fc1a50 --- /dev/null +++ b/druntime/src/core/sys/wasi/p2/cli/terminal_input/imports.d @@ -0,0 +1,59 @@ +/++ +Terminal input. + +In the future, this may include functions for disabling echoing, +disabling input buffering so that keyboard events are sent through +immediately, querying supported features, and so on. ++/ +module core.sys.wasi.p2.cli.terminal_input.imports; + +import core.sys.wasi.wit_common; + +public import core.sys.wasi.p2.cli.terminal_input.common; + + +package (core.sys.wasi.p2) void __wit_bindgen_component_type_force_link() pure @nogc nothrow => imported!"core.sys.wasi.p2.cli.imports".__wit_bindgen_component_type_force_link(); + +/++ +The input side of a terminal. ++/ +struct TerminalInput { + @nogc nothrow: + + package(core.sys.wasi.p2) uint __handle = 0; + + package(core.sys.wasi.p2) this(uint handle) { + __handle = handle; + } + + @disable this(); + + + void drop() { + __import_drop(__handle); + } + @wasmImport!("wasi:cli/terminal-input@0.2.12", "[resource-drop]terminal-input") + pragma(mangle, "__wit_import_wasi:cli__terminal_input@0.2.12__:resource_drop:terminal_input") + static private extern(C) void __import_drop(uint); + + alias witFree = drop; + // TODO: make RAII? disable copy for the own + + Borrow borrow() => Borrow(__handle); + alias borrow this; + + struct Borrow { + @nogc nothrow: + + package(core.sys.wasi.p2) uint __handle = 0; + + package(core.sys.wasi.p2) this(uint handle) { + __handle = handle; + } + + @disable this(); + + void witFree() {} + Borrow witClone() const { return Borrow(__handle); } + } +} diff --git a/druntime/src/core/sys/wasi/p2/cli/terminal_output/common.d b/druntime/src/core/sys/wasi/p2/cli/terminal_output/common.d new file mode 100644 index 000000000000..9967840a22d6 --- /dev/null +++ b/druntime/src/core/sys/wasi/p2/cli/terminal_output/common.d @@ -0,0 +1,13 @@ +/++ +Terminal output. + +In the future, this may include functions for querying the terminal +size, being notified of terminal size changes, querying supported +features, and so on. ++/ +module core.sys.wasi.p2.cli.terminal_output.common; + +import core.sys.wasi.wit_common; + + +package (core.sys.wasi.p2) void __wit_bindgen_component_type_force_link() pure @nogc nothrow => imported!"core.sys.wasi.p2.cli.imports".__wit_bindgen_component_type_force_link(); diff --git a/druntime/src/core/sys/wasi/p2/cli/terminal_output/imports.d b/druntime/src/core/sys/wasi/p2/cli/terminal_output/imports.d new file mode 100644 index 000000000000..1e08bac0b91b --- /dev/null +++ b/druntime/src/core/sys/wasi/p2/cli/terminal_output/imports.d @@ -0,0 +1,59 @@ +/++ +Terminal output. + +In the future, this may include functions for querying the terminal +size, being notified of terminal size changes, querying supported +features, and so on. ++/ +module core.sys.wasi.p2.cli.terminal_output.imports; + +import core.sys.wasi.wit_common; + +public import core.sys.wasi.p2.cli.terminal_output.common; + + +package (core.sys.wasi.p2) void __wit_bindgen_component_type_force_link() pure @nogc nothrow => imported!"core.sys.wasi.p2.cli.imports".__wit_bindgen_component_type_force_link(); + +/++ +The output side of a terminal. ++/ +struct TerminalOutput { + @nogc nothrow: + + package(core.sys.wasi.p2) uint __handle = 0; + + package(core.sys.wasi.p2) this(uint handle) { + __handle = handle; + } + + @disable this(); + + + void drop() { + __import_drop(__handle); + } + @wasmImport!("wasi:cli/terminal-output@0.2.12", "[resource-drop]terminal-output") + pragma(mangle, "__wit_import_wasi:cli__terminal_output@0.2.12__:resource_drop:terminal_output") + static private extern(C) void __import_drop(uint); + + alias witFree = drop; + // TODO: make RAII? disable copy for the own + + Borrow borrow() => Borrow(__handle); + alias borrow this; + + struct Borrow { + @nogc nothrow: + + package(core.sys.wasi.p2) uint __handle = 0; + + package(core.sys.wasi.p2) this(uint handle) { + __handle = handle; + } + + @disable this(); + + void witFree() {} + Borrow witClone() const { return Borrow(__handle); } + } +} diff --git a/druntime/src/core/sys/wasi/p2/cli/terminal_stderr/common.d b/druntime/src/core/sys/wasi/p2/cli/terminal_stderr/common.d new file mode 100644 index 000000000000..130f2b495ad0 --- /dev/null +++ b/druntime/src/core/sys/wasi/p2/cli/terminal_stderr/common.d @@ -0,0 +1,11 @@ +/++ +An interface providing an optional `terminal-output` for stderr as a +link-time authority. ++/ +module core.sys.wasi.p2.cli.terminal_stderr.common; + +import core.sys.wasi.wit_common; + +static import core.sys.wasi.p2.cli.terminal_output.common; + +package (core.sys.wasi.p2) void __wit_bindgen_component_type_force_link() pure @nogc nothrow => imported!"core.sys.wasi.p2.cli.imports".__wit_bindgen_component_type_force_link(); diff --git a/druntime/src/core/sys/wasi/p2/cli/terminal_stderr/imports.d b/druntime/src/core/sys/wasi/p2/cli/terminal_stderr/imports.d new file mode 100644 index 000000000000..9c79c433c39f --- /dev/null +++ b/druntime/src/core/sys/wasi/p2/cli/terminal_stderr/imports.d @@ -0,0 +1,41 @@ +/++ +An interface providing an optional `terminal-output` for stderr as a +link-time authority. ++/ +module core.sys.wasi.p2.cli.terminal_stderr.imports; + +import core.sys.wasi.wit_common; + +public import core.sys.wasi.p2.cli.terminal_stderr.common; + +static import core.sys.wasi.p2.cli.terminal_output.imports; + +package (core.sys.wasi.p2) void __wit_bindgen_component_type_force_link() pure @nogc nothrow => imported!"core.sys.wasi.p2.cli.imports".__wit_bindgen_component_type_force_link(); + +/++ + ++/ +alias TerminalOutput = core.sys.wasi.p2.cli.terminal_output.imports.TerminalOutput; + +/++ +If stderr is connected to a terminal, return a `terminal-output` handle +allowing further interaction with it. ++/ +Option!(TerminalOutput) getTerminalStderr() @nogc nothrow { + align(4) void[8] _retArea = void; + __import_getTerminalStderr(_retArea.ptr); + Option!(TerminalOutput) _option2 = void; + bool _isSome2 = (cast(uint)(*(cast(ubyte*)(_retArea.ptr + 0)))) != 0; + if (_isSome2) { + + _option2 = Option!(TerminalOutput).some(TerminalOutput(*(cast(uint*)(_retArea.ptr + 4)))); + } else { + _option2 = Option!(TerminalOutput).none; + } + auto _flush3 = _option2; + return _flush3; +} +/// ditto +@wasmImport!("wasi:cli/terminal-stderr@0.2.12", "get-terminal-stderr") +pragma(mangle, "__wit_import_wasi:cli__terminal_stderr@0.2.12__get_terminal_stderr") +private extern(C) void __import_getTerminalStderr(void*) @nogc nothrow; diff --git a/druntime/src/core/sys/wasi/p2/cli/terminal_stdin/common.d b/druntime/src/core/sys/wasi/p2/cli/terminal_stdin/common.d new file mode 100644 index 000000000000..00dff88581d1 --- /dev/null +++ b/druntime/src/core/sys/wasi/p2/cli/terminal_stdin/common.d @@ -0,0 +1,11 @@ +/++ +An interface providing an optional `terminal-input` for stdin as a +link-time authority. ++/ +module core.sys.wasi.p2.cli.terminal_stdin.common; + +import core.sys.wasi.wit_common; + +static import core.sys.wasi.p2.cli.terminal_input.common; + +package (core.sys.wasi.p2) void __wit_bindgen_component_type_force_link() pure @nogc nothrow => imported!"core.sys.wasi.p2.cli.imports".__wit_bindgen_component_type_force_link(); diff --git a/druntime/src/core/sys/wasi/p2/cli/terminal_stdin/imports.d b/druntime/src/core/sys/wasi/p2/cli/terminal_stdin/imports.d new file mode 100644 index 000000000000..2f1a4bdeae45 --- /dev/null +++ b/druntime/src/core/sys/wasi/p2/cli/terminal_stdin/imports.d @@ -0,0 +1,41 @@ +/++ +An interface providing an optional `terminal-input` for stdin as a +link-time authority. ++/ +module core.sys.wasi.p2.cli.terminal_stdin.imports; + +import core.sys.wasi.wit_common; + +public import core.sys.wasi.p2.cli.terminal_stdin.common; + +static import core.sys.wasi.p2.cli.terminal_input.imports; + +package (core.sys.wasi.p2) void __wit_bindgen_component_type_force_link() pure @nogc nothrow => imported!"core.sys.wasi.p2.cli.imports".__wit_bindgen_component_type_force_link(); + +/++ + ++/ +alias TerminalInput = core.sys.wasi.p2.cli.terminal_input.imports.TerminalInput; + +/++ +If stdin is connected to a terminal, return a `terminal-input` handle +allowing further interaction with it. ++/ +Option!(TerminalInput) getTerminalStdin() @nogc nothrow { + align(4) void[8] _retArea = void; + __import_getTerminalStdin(_retArea.ptr); + Option!(TerminalInput) _option2 = void; + bool _isSome2 = (cast(uint)(*(cast(ubyte*)(_retArea.ptr + 0)))) != 0; + if (_isSome2) { + + _option2 = Option!(TerminalInput).some(TerminalInput(*(cast(uint*)(_retArea.ptr + 4)))); + } else { + _option2 = Option!(TerminalInput).none; + } + auto _flush3 = _option2; + return _flush3; +} +/// ditto +@wasmImport!("wasi:cli/terminal-stdin@0.2.12", "get-terminal-stdin") +pragma(mangle, "__wit_import_wasi:cli__terminal_stdin@0.2.12__get_terminal_stdin") +private extern(C) void __import_getTerminalStdin(void*) @nogc nothrow; diff --git a/druntime/src/core/sys/wasi/p2/cli/terminal_stdout/common.d b/druntime/src/core/sys/wasi/p2/cli/terminal_stdout/common.d new file mode 100644 index 000000000000..6f286327791f --- /dev/null +++ b/druntime/src/core/sys/wasi/p2/cli/terminal_stdout/common.d @@ -0,0 +1,11 @@ +/++ +An interface providing an optional `terminal-output` for stdout as a +link-time authority. ++/ +module core.sys.wasi.p2.cli.terminal_stdout.common; + +import core.sys.wasi.wit_common; + +static import core.sys.wasi.p2.cli.terminal_output.common; + +package (core.sys.wasi.p2) void __wit_bindgen_component_type_force_link() pure @nogc nothrow => imported!"core.sys.wasi.p2.cli.imports".__wit_bindgen_component_type_force_link(); diff --git a/druntime/src/core/sys/wasi/p2/cli/terminal_stdout/imports.d b/druntime/src/core/sys/wasi/p2/cli/terminal_stdout/imports.d new file mode 100644 index 000000000000..21f7122af14e --- /dev/null +++ b/druntime/src/core/sys/wasi/p2/cli/terminal_stdout/imports.d @@ -0,0 +1,41 @@ +/++ +An interface providing an optional `terminal-output` for stdout as a +link-time authority. ++/ +module core.sys.wasi.p2.cli.terminal_stdout.imports; + +import core.sys.wasi.wit_common; + +public import core.sys.wasi.p2.cli.terminal_stdout.common; + +static import core.sys.wasi.p2.cli.terminal_output.imports; + +package (core.sys.wasi.p2) void __wit_bindgen_component_type_force_link() pure @nogc nothrow => imported!"core.sys.wasi.p2.cli.imports".__wit_bindgen_component_type_force_link(); + +/++ + ++/ +alias TerminalOutput = core.sys.wasi.p2.cli.terminal_output.imports.TerminalOutput; + +/++ +If stdout is connected to a terminal, return a `terminal-output` handle +allowing further interaction with it. ++/ +Option!(TerminalOutput) getTerminalStdout() @nogc nothrow { + align(4) void[8] _retArea = void; + __import_getTerminalStdout(_retArea.ptr); + Option!(TerminalOutput) _option2 = void; + bool _isSome2 = (cast(uint)(*(cast(ubyte*)(_retArea.ptr + 0)))) != 0; + if (_isSome2) { + + _option2 = Option!(TerminalOutput).some(TerminalOutput(*(cast(uint*)(_retArea.ptr + 4)))); + } else { + _option2 = Option!(TerminalOutput).none; + } + auto _flush3 = _option2; + return _flush3; +} +/// ditto +@wasmImport!("wasi:cli/terminal-stdout@0.2.12", "get-terminal-stdout") +pragma(mangle, "__wit_import_wasi:cli__terminal_stdout@0.2.12__get_terminal_stdout") +private extern(C) void __import_getTerminalStdout(void*) @nogc nothrow; diff --git a/druntime/src/core/sys/wasi/p2/clocks/monotonic_clock/common.d b/druntime/src/core/sys/wasi/p2/clocks/monotonic_clock/common.d new file mode 100644 index 000000000000..d3bdc7c296b7 --- /dev/null +++ b/druntime/src/core/sys/wasi/p2/clocks/monotonic_clock/common.d @@ -0,0 +1,20 @@ +/++ + ++/ +module core.sys.wasi.p2.clocks.monotonic_clock.common; + +import core.sys.wasi.wit_common; + +static import core.sys.wasi.p2.io.poll.common; + +package (core.sys.wasi.p2) void __wit_bindgen_component_type_force_link() pure @nogc nothrow => imported!"core.sys.wasi.p2.cli.imports".__wit_bindgen_component_type_force_link(); + +/++ + ++/ +alias Instant = ulong; + +/++ + ++/ +alias Duration = ulong; diff --git a/druntime/src/core/sys/wasi/p2/clocks/monotonic_clock/imports.d b/druntime/src/core/sys/wasi/p2/clocks/monotonic_clock/imports.d new file mode 100644 index 000000000000..6296f3e9fba5 --- /dev/null +++ b/druntime/src/core/sys/wasi/p2/clocks/monotonic_clock/imports.d @@ -0,0 +1,65 @@ +/++ + ++/ +module core.sys.wasi.p2.clocks.monotonic_clock.imports; + +import core.sys.wasi.wit_common; + +public import core.sys.wasi.p2.clocks.monotonic_clock.common; + +static import core.sys.wasi.p2.io.poll.imports; + +package (core.sys.wasi.p2) void __wit_bindgen_component_type_force_link() pure @nogc nothrow => imported!"core.sys.wasi.p2.cli.imports".__wit_bindgen_component_type_force_link(); + +/++ + ++/ +alias Pollable = core.sys.wasi.p2.io.poll.imports.Pollable; + +/++ + ++/ +Instant now() @nogc nothrow { + auto _ret = __import_now(); + return _ret; +} +/// ditto +@wasmImport!("wasi:clocks/monotonic-clock@0.2.12", "now") +pragma(mangle, "__wit_import_wasi:clocks__monotonic_clock@0.2.12__now") +private extern(C) ulong __import_now() @nogc nothrow; + +/++ + ++/ +Duration resolution() @nogc nothrow { + auto _ret = __import_resolution(); + return _ret; +} +/// ditto +@wasmImport!("wasi:clocks/monotonic-clock@0.2.12", "resolution") +pragma(mangle, "__wit_import_wasi:clocks__monotonic_clock@0.2.12__resolution") +private extern(C) ulong __import_resolution() @nogc nothrow; + +/++ + ++/ +Pollable subscribeInstant(in Instant when) @nogc nothrow { + auto _ret = __import_subscribeInstant(when); + return Pollable(_ret); +} +/// ditto +@wasmImport!("wasi:clocks/monotonic-clock@0.2.12", "subscribe-instant") +pragma(mangle, "__wit_import_wasi:clocks__monotonic_clock@0.2.12__subscribe_instant") +private extern(C) uint __import_subscribeInstant(ulong) @nogc nothrow; + +/++ + ++/ +Pollable subscribeDuration(in Duration when) @nogc nothrow { + auto _ret = __import_subscribeDuration(when); + return Pollable(_ret); +} +/// ditto +@wasmImport!("wasi:clocks/monotonic-clock@0.2.12", "subscribe-duration") +pragma(mangle, "__wit_import_wasi:clocks__monotonic_clock@0.2.12__subscribe_duration") +private extern(C) uint __import_subscribeDuration(ulong) @nogc nothrow; diff --git a/druntime/src/core/sys/wasi/p2/clocks/wall_clock/common.d b/druntime/src/core/sys/wasi/p2/clocks/wall_clock/common.d new file mode 100644 index 000000000000..e0116a83ce8b --- /dev/null +++ b/druntime/src/core/sys/wasi/p2/clocks/wall_clock/common.d @@ -0,0 +1,34 @@ +/++ + ++/ +module core.sys.wasi.p2.clocks.wall_clock.common; + +import core.sys.wasi.wit_common; + + +package (core.sys.wasi.p2) void __wit_bindgen_component_type_force_link() pure @nogc nothrow => imported!"core.sys.wasi.p2.cli.imports".__wit_bindgen_component_type_force_link(); + +/++ + ++/ +struct Datetime { + /++ + + +/ + ulong seconds; + + /++ + + +/ + uint nanoseconds; + + void witFree() @nogc nothrow { + } + + Datetime witClone() const @nogc nothrow { + Datetime clone = void; + clone.seconds = this.seconds.witClone; + clone.nanoseconds = this.nanoseconds.witClone; + return clone; + } +} diff --git a/druntime/src/core/sys/wasi/p2/clocks/wall_clock/imports.d b/druntime/src/core/sys/wasi/p2/clocks/wall_clock/imports.d new file mode 100644 index 000000000000..e98f67a13b87 --- /dev/null +++ b/druntime/src/core/sys/wasi/p2/clocks/wall_clock/imports.d @@ -0,0 +1,47 @@ +/++ + ++/ +module core.sys.wasi.p2.clocks.wall_clock.imports; + +import core.sys.wasi.wit_common; + +public import core.sys.wasi.p2.clocks.wall_clock.common; + + +package (core.sys.wasi.p2) void __wit_bindgen_component_type_force_link() pure @nogc nothrow => imported!"core.sys.wasi.p2.cli.imports".__wit_bindgen_component_type_force_link(); + +/++ + ++/ +Datetime now() @nogc nothrow { + align(8) void[16] _retArea = void; + __import_now(_retArea.ptr); + Datetime _record0 = { + seconds: *(cast(ulong*)(_retArea.ptr + 0)), + nanoseconds: *(cast(uint*)(_retArea.ptr + 8)), + }; + auto _flush1 = _record0; + return _flush1; +} +/// ditto +@wasmImport!("wasi:clocks/wall-clock@0.2.12", "now") +pragma(mangle, "__wit_import_wasi:clocks__wall_clock@0.2.12__now") +private extern(C) void __import_now(void*) @nogc nothrow; + +/++ + ++/ +Datetime resolution() @nogc nothrow { + align(8) void[16] _retArea = void; + __import_resolution(_retArea.ptr); + Datetime _record0 = { + seconds: *(cast(ulong*)(_retArea.ptr + 0)), + nanoseconds: *(cast(uint*)(_retArea.ptr + 8)), + }; + auto _flush1 = _record0; + return _flush1; +} +/// ditto +@wasmImport!("wasi:clocks/wall-clock@0.2.12", "resolution") +pragma(mangle, "__wit_import_wasi:clocks__wall_clock@0.2.12__resolution") +private extern(C) void __import_resolution(void*) @nogc nothrow; diff --git a/druntime/src/core/sys/wasi/p2/filesystem/preopens/common.d b/druntime/src/core/sys/wasi/p2/filesystem/preopens/common.d new file mode 100644 index 000000000000..9e9b979cc389 --- /dev/null +++ b/druntime/src/core/sys/wasi/p2/filesystem/preopens/common.d @@ -0,0 +1,10 @@ +/++ + ++/ +module core.sys.wasi.p2.filesystem.preopens.common; + +import core.sys.wasi.wit_common; + +static import core.sys.wasi.p2.filesystem.types.common; + +package (core.sys.wasi.p2) void __wit_bindgen_component_type_force_link() pure @nogc nothrow => imported!"core.sys.wasi.p2.cli.imports".__wit_bindgen_component_type_force_link(); diff --git a/druntime/src/core/sys/wasi/p2/filesystem/preopens/imports.d b/druntime/src/core/sys/wasi/p2/filesystem/preopens/imports.d new file mode 100644 index 000000000000..c9edfb1e699d --- /dev/null +++ b/druntime/src/core/sys/wasi/p2/filesystem/preopens/imports.d @@ -0,0 +1,44 @@ +/++ + ++/ +module core.sys.wasi.p2.filesystem.preopens.imports; + +import core.sys.wasi.wit_common; + +public import core.sys.wasi.p2.filesystem.preopens.common; + +static import core.sys.wasi.p2.filesystem.types.imports; + +package (core.sys.wasi.p2) void __wit_bindgen_component_type_force_link() pure @nogc nothrow => imported!"core.sys.wasi.p2.cli.imports".__wit_bindgen_component_type_force_link(); + +/++ + ++/ +alias Descriptor = core.sys.wasi.p2.filesystem.types.imports.Descriptor; + +/++ + ++/ +WitList!(Tuple!(Descriptor, WitString)) getDirectories() @nogc nothrow { + align(size_t.sizeof) void[(2*size_t.sizeof)] _retArea = void; + __import_getDirectories(_retArea.ptr); + auto _listSrcPtr3 = *(cast(void**)(_retArea.ptr + 0)); + auto _listLen3 = *(cast(size_t*)(_retArea.ptr + size_t.sizeof)); + auto _list3 = core.sys.wasi.wit_common.mallocSlice!(Tuple!(Descriptor, WitString))(_listLen3); + foreach (_elem0_idx, ref _elem0; _list3) { + const auto _base0 = _listSrcPtr3 + _elem0_idx * (3*size_t.sizeof); + auto _ptr1 = cast(char*)(*(cast(void**)(_base0 + size_t.sizeof))); + auto _len1 = *(cast(size_t*)(_base0 + (2*size_t.sizeof))); + auto _tuple2 = Tuple!(Descriptor, WitString)( + Descriptor(*(cast(uint*)(_base0 + 0))), + WitString(_ptr1[0.._len1]), + ); + _elem0 = _tuple2; + } + auto _flush4 = WitList!(Tuple!(Descriptor, WitString))(_list3); + return _flush4; +} +/// ditto +@wasmImport!("wasi:filesystem/preopens@0.2.12", "get-directories") +pragma(mangle, "__wit_import_wasi:filesystem__preopens@0.2.12__get_directories") +private extern(C) void __import_getDirectories(void*) @nogc nothrow; diff --git a/druntime/src/core/sys/wasi/p2/filesystem/types/common.d b/druntime/src/core/sys/wasi/p2/filesystem/types/common.d new file mode 100644 index 000000000000..e039a68d756c --- /dev/null +++ b/druntime/src/core/sys/wasi/p2/filesystem/types/common.d @@ -0,0 +1,533 @@ +/++ + ++/ +module core.sys.wasi.p2.filesystem.types.common; + +import core.sys.wasi.wit_common; + +static import core.sys.wasi.p2.io.streams.common; +static import core.sys.wasi.p2.clocks.wall_clock.common; + +package (core.sys.wasi.p2) void __wit_bindgen_component_type_force_link() pure @nogc nothrow => imported!"core.sys.wasi.p2.cli.imports".__wit_bindgen_component_type_force_link(); + +/++ + ++/ +alias Datetime = core.sys.wasi.p2.clocks.wall_clock.common.Datetime; + +/++ + ++/ +alias Filesize = ulong; + +/++ + ++/ +enum DescriptorType : ubyte { + /++ + + +/ + unknown, + + /++ + + +/ + blockDevice, + + /++ + + +/ + characterDevice, + + /++ + + +/ + directory, + + /++ + + +/ + fifo, + + /++ + + +/ + symbolicLink, + + /++ + + +/ + regularFile, + + /++ + + +/ + socket, +} +/++ + ++/ +struct DescriptorFlags { + mixin WitFlags!ubyte; + + /++ + + +/ + enum read = DescriptorFlags[0]; + + /++ + + +/ + enum write = DescriptorFlags[1]; + + /++ + + +/ + enum fileIntegritySync = DescriptorFlags[2]; + + /++ + + +/ + enum dataIntegritySync = DescriptorFlags[3]; + + /++ + + +/ + enum requestedWriteSync = DescriptorFlags[4]; + + /++ + + +/ + enum mutateDirectory = DescriptorFlags[5]; +} + +/++ + ++/ +struct PathFlags { + mixin WitFlags!ubyte; + + /++ + + +/ + enum symlinkFollow = PathFlags[0]; +} + +/++ + ++/ +struct OpenFlags { + mixin WitFlags!ubyte; + + /++ + + +/ + enum create = OpenFlags[0]; + + /++ + + +/ + enum directory = OpenFlags[1]; + + /++ + + +/ + enum exclusive = OpenFlags[2]; + + /++ + + +/ + enum truncate = OpenFlags[3]; +} + +/++ + ++/ +alias LinkCount = ulong; + +/++ + ++/ +struct DescriptorStat { + /++ + + +/ + DescriptorType type; + + /++ + + +/ + LinkCount linkCount; + + /++ + + +/ + Filesize size; + + /++ + + +/ + Option!(Datetime) dataAccessTimestamp; + + /++ + + +/ + Option!(Datetime) dataModificationTimestamp; + + /++ + + +/ + Option!(Datetime) statusChangeTimestamp; + + void witFree() @nogc nothrow { + } + + DescriptorStat witClone() const @nogc nothrow { + DescriptorStat clone = void; + clone.type = this.type.witClone; + clone.linkCount = this.linkCount.witClone; + clone.size = this.size.witClone; + clone.dataAccessTimestamp = this.dataAccessTimestamp.witClone; + clone.dataModificationTimestamp = this.dataModificationTimestamp.witClone; + clone.statusChangeTimestamp = this.statusChangeTimestamp.witClone; + return clone; + } +} + +/++ + ++/ +struct NewTimestamp { + mixin WitVariant!( + void, // noChange + void, // now + Datetime, // timestamp + ); + +public: + enum Tag : ubyte { + /++ + + +/ + noChange, + + /++ + + +/ + now, + + /++ + + +/ + timestamp, + } + Tag tag() const @safe @nogc nothrow pure => _tag; + + /++ + + +/ + alias noChange = _create!(Tag.noChange); + /// ditto + bool isNoChange() const => _tag == Tag.noChange; + + /++ + + +/ + alias now = _create!(Tag.now); + /// ditto + bool isNow() const => _tag == Tag.now; + + /++ + + +/ + alias timestamp = _create!(Tag.timestamp); + /// ditto + bool isTimestamp() const => _tag == Tag.timestamp; + ///ditto + alias getTimestamp = _get!(Tag.timestamp); + + void witFree() @nogc nothrow { + } + + NewTimestamp witClone() const @nogc nothrow { + final switch (_tag) { + case Tag.noChange: return _create!(Tag.noChange); break; + case Tag.now: return _create!(Tag.now); break; + case Tag.timestamp: return _create!(Tag.timestamp)(this._get!(Tag.timestamp).witClone); break; + } + } +} + +/++ + ++/ +struct DirectoryEntry { + /++ + + +/ + DescriptorType type; + + /++ + + +/ + WitString name; + + void witFree() @nogc nothrow { + name.witFree; + } + + DirectoryEntry witClone() const @nogc nothrow { + DirectoryEntry clone = void; + clone.type = this.type.witClone; + clone.name = this.name.witClone; + return clone; + } +} + +/++ + ++/ +enum ErrorCode : ubyte { + /++ + + +/ + access, + + /++ + + +/ + wouldBlock, + + /++ + + +/ + already, + + /++ + + +/ + badDescriptor, + + /++ + + +/ + busy, + + /++ + + +/ + deadlock, + + /++ + + +/ + quota, + + /++ + + +/ + exist, + + /++ + + +/ + fileTooLarge, + + /++ + + +/ + illegalByteSequence, + + /++ + + +/ + inProgress, + + /++ + + +/ + interrupted, + + /++ + + +/ + invalid, + + /++ + + +/ + io, + + /++ + + +/ + isDirectory, + + /++ + + +/ + loop, + + /++ + + +/ + tooManyLinks, + + /++ + + +/ + messageSize, + + /++ + + +/ + nameTooLong, + + /++ + + +/ + noDevice, + + /++ + + +/ + noEntry, + + /++ + + +/ + noLock, + + /++ + + +/ + insufficientMemory, + + /++ + + +/ + insufficientSpace, + + /++ + + +/ + notDirectory, + + /++ + + +/ + notEmpty, + + /++ + + +/ + notRecoverable, + + /++ + + +/ + unsupported, + + /++ + + +/ + noTty, + + /++ + + +/ + noSuchDevice, + + /++ + + +/ + overflow, + + /++ + + +/ + notPermitted, + + /++ + + +/ + pipe, + + /++ + + +/ + readOnly, + + /++ + + +/ + invalidSeek, + + /++ + + +/ + textFileBusy, + + /++ + + +/ + crossDevice, +} +/++ + ++/ +enum Advice : ubyte { + /++ + + +/ + normal, + + /++ + + +/ + sequential, + + /++ + + +/ + random, + + /++ + + +/ + willNeed, + + /++ + + +/ + dontNeed, + + /++ + + +/ + noReuse, +} +/++ + ++/ +struct MetadataHashValue { + /++ + + +/ + ulong lower; + + /++ + + +/ + ulong upper; + + void witFree() @nogc nothrow { + } + + MetadataHashValue witClone() const @nogc nothrow { + MetadataHashValue clone = void; + clone.lower = this.lower.witClone; + clone.upper = this.upper.witClone; + return clone; + } +} diff --git a/druntime/src/core/sys/wasi/p2/filesystem/types/imports.d b/druntime/src/core/sys/wasi/p2/filesystem/types/imports.d new file mode 100644 index 000000000000..c9e693c40ee5 --- /dev/null +++ b/druntime/src/core/sys/wasi/p2/filesystem/types/imports.d @@ -0,0 +1,989 @@ +/++ + ++/ +module core.sys.wasi.p2.filesystem.types.imports; + +import core.sys.wasi.wit_common; + +public import core.sys.wasi.p2.filesystem.types.common; + +static import core.sys.wasi.p2.io.streams.imports; +static import core.sys.wasi.p2.clocks.wall_clock.imports; + +package (core.sys.wasi.p2) void __wit_bindgen_component_type_force_link() pure @nogc nothrow => imported!"core.sys.wasi.p2.cli.imports".__wit_bindgen_component_type_force_link(); + +/++ + ++/ +alias InputStream = core.sys.wasi.p2.io.streams.imports.InputStream; + +/++ + ++/ +alias OutputStream = core.sys.wasi.p2.io.streams.imports.OutputStream; + +/++ + ++/ +alias Error_ = core.sys.wasi.p2.io.streams.imports.Error_; + +/++ + ++/ +struct Descriptor { + @nogc nothrow: + + package(core.sys.wasi.p2) uint __handle = 0; + + package(core.sys.wasi.p2) this(uint handle) { + __handle = handle; + } + + @disable this(); + + + void drop() { + __import_drop(__handle); + } + @wasmImport!("wasi:filesystem/types@0.2.12", "[resource-drop]descriptor") + pragma(mangle, "__wit_import_wasi:filesystem__types@0.2.12__:resource_drop:descriptor") + static private extern(C) void __import_drop(uint); + + alias witFree = drop; + // TODO: make RAII? disable copy for the own + + Borrow borrow() => Borrow(__handle); + alias borrow this; + + struct Borrow { + @nogc nothrow: + + package(core.sys.wasi.p2) uint __handle = 0; + + package(core.sys.wasi.p2) this(uint handle) { + __handle = handle; + } + + @disable this(); + + void witFree() {} + Borrow witClone() const { return Borrow(__handle); } + + /++ + + +/ + Result!(InputStream, ErrorCode) readViaStream(in Filesize offset) @nogc nothrow { + align(4) void[8] _retArea = void; + __import_readViaStream(this.__handle, offset, _retArea.ptr); + Result!(InputStream, ErrorCode) _result2 = void; + bool _isErr2 = (cast(uint)(*(cast(ubyte*)(_retArea.ptr + 0)))) != 0; + if (_isErr2) { + + _result2 = Result!(InputStream, ErrorCode).err(cast(ErrorCode)(cast(uint)(*(cast(ubyte*)(_retArea.ptr + 4))))); + } else { + + _result2 = Result!(InputStream, ErrorCode).ok(InputStream(*(cast(uint*)(_retArea.ptr + 4)))); + } + auto _flush3 = _result2; + return _flush3; + } + /// ditto + @wasmImport!("wasi:filesystem/types@0.2.12", "[method]descriptor.read-via-stream") + pragma(mangle, "__wit_import_wasi:filesystem__types@0.2.12__:method:descriptor.read_via_stream") + static private extern(C) void __import_readViaStream(uint, ulong, void*) @nogc nothrow; + + /++ + + +/ + Result!(OutputStream, ErrorCode) writeViaStream(in Filesize offset) @nogc nothrow { + align(4) void[8] _retArea = void; + __import_writeViaStream(this.__handle, offset, _retArea.ptr); + Result!(OutputStream, ErrorCode) _result2 = void; + bool _isErr2 = (cast(uint)(*(cast(ubyte*)(_retArea.ptr + 0)))) != 0; + if (_isErr2) { + + _result2 = Result!(OutputStream, ErrorCode).err(cast(ErrorCode)(cast(uint)(*(cast(ubyte*)(_retArea.ptr + 4))))); + } else { + + _result2 = Result!(OutputStream, ErrorCode).ok(OutputStream(*(cast(uint*)(_retArea.ptr + 4)))); + } + auto _flush3 = _result2; + return _flush3; + } + /// ditto + @wasmImport!("wasi:filesystem/types@0.2.12", "[method]descriptor.write-via-stream") + pragma(mangle, "__wit_import_wasi:filesystem__types@0.2.12__:method:descriptor.write_via_stream") + static private extern(C) void __import_writeViaStream(uint, ulong, void*) @nogc nothrow; + + /++ + + +/ + Result!(OutputStream, ErrorCode) appendViaStream() @nogc nothrow { + align(4) void[8] _retArea = void; + __import_appendViaStream(this.__handle, _retArea.ptr); + Result!(OutputStream, ErrorCode) _result2 = void; + bool _isErr2 = (cast(uint)(*(cast(ubyte*)(_retArea.ptr + 0)))) != 0; + if (_isErr2) { + + _result2 = Result!(OutputStream, ErrorCode).err(cast(ErrorCode)(cast(uint)(*(cast(ubyte*)(_retArea.ptr + 4))))); + } else { + + _result2 = Result!(OutputStream, ErrorCode).ok(OutputStream(*(cast(uint*)(_retArea.ptr + 4)))); + } + auto _flush3 = _result2; + return _flush3; + } + /// ditto + @wasmImport!("wasi:filesystem/types@0.2.12", "[method]descriptor.append-via-stream") + pragma(mangle, "__wit_import_wasi:filesystem__types@0.2.12__:method:descriptor.append_via_stream") + static private extern(C) void __import_appendViaStream(uint, void*) @nogc nothrow; + + /++ + + +/ + Result!(void, ErrorCode) advise(in Filesize offset, in Filesize length, in Advice advice) @nogc nothrow { + align(1) void[2] _retArea = void; + __import_advise(this.__handle, offset, length, cast(uint)(advice), _retArea.ptr); + Result!(void, ErrorCode) _result2 = void; + bool _isErr2 = (cast(uint)(*(cast(ubyte*)(_retArea.ptr + 0)))) != 0; + if (_isErr2) { + + _result2 = Result!(void, ErrorCode).err(cast(ErrorCode)(cast(uint)(*(cast(ubyte*)(_retArea.ptr + 1))))); + } else { + + _result2 = Result!(void, ErrorCode).ok(); + } + auto _flush3 = _result2; + return _flush3; + } + /// ditto + @wasmImport!("wasi:filesystem/types@0.2.12", "[method]descriptor.advise") + pragma(mangle, "__wit_import_wasi:filesystem__types@0.2.12__:method:descriptor.advise") + static private extern(C) void __import_advise(uint, ulong, ulong, uint, void*) @nogc nothrow; + + /++ + + +/ + Result!(void, ErrorCode) syncData() @nogc nothrow { + align(1) void[2] _retArea = void; + __import_syncData(this.__handle, _retArea.ptr); + Result!(void, ErrorCode) _result2 = void; + bool _isErr2 = (cast(uint)(*(cast(ubyte*)(_retArea.ptr + 0)))) != 0; + if (_isErr2) { + + _result2 = Result!(void, ErrorCode).err(cast(ErrorCode)(cast(uint)(*(cast(ubyte*)(_retArea.ptr + 1))))); + } else { + + _result2 = Result!(void, ErrorCode).ok(); + } + auto _flush3 = _result2; + return _flush3; + } + /// ditto + @wasmImport!("wasi:filesystem/types@0.2.12", "[method]descriptor.sync-data") + pragma(mangle, "__wit_import_wasi:filesystem__types@0.2.12__:method:descriptor.sync_data") + static private extern(C) void __import_syncData(uint, void*) @nogc nothrow; + + /++ + + +/ + Result!(DescriptorFlags, ErrorCode) getFlags() @nogc nothrow { + align(1) void[2] _retArea = void; + __import_getFlags(this.__handle, _retArea.ptr); + Result!(DescriptorFlags, ErrorCode) _result2 = void; + bool _isErr2 = (cast(uint)(*(cast(ubyte*)(_retArea.ptr + 0)))) != 0; + if (_isErr2) { + + _result2 = Result!(DescriptorFlags, ErrorCode).err(cast(ErrorCode)(cast(uint)(*(cast(ubyte*)(_retArea.ptr + 1))))); + } else { + + _result2 = Result!(DescriptorFlags, ErrorCode).ok(DescriptorFlags(cast(ubyte)(cast(uint)(*(cast(ubyte*)(_retArea.ptr + 1)))))); + } + auto _flush3 = _result2; + return _flush3; + } + /// ditto + @wasmImport!("wasi:filesystem/types@0.2.12", "[method]descriptor.get-flags") + pragma(mangle, "__wit_import_wasi:filesystem__types@0.2.12__:method:descriptor.get_flags") + static private extern(C) void __import_getFlags(uint, void*) @nogc nothrow; + + /++ + + +/ + Result!(DescriptorType, ErrorCode) getType() @nogc nothrow { + align(1) void[2] _retArea = void; + __import_getType(this.__handle, _retArea.ptr); + Result!(DescriptorType, ErrorCode) _result2 = void; + bool _isErr2 = (cast(uint)(*(cast(ubyte*)(_retArea.ptr + 0)))) != 0; + if (_isErr2) { + + _result2 = Result!(DescriptorType, ErrorCode).err(cast(ErrorCode)(cast(uint)(*(cast(ubyte*)(_retArea.ptr + 1))))); + } else { + + _result2 = Result!(DescriptorType, ErrorCode).ok(cast(DescriptorType)(cast(uint)(*(cast(ubyte*)(_retArea.ptr + 1))))); + } + auto _flush3 = _result2; + return _flush3; + } + /// ditto + @wasmImport!("wasi:filesystem/types@0.2.12", "[method]descriptor.get-type") + pragma(mangle, "__wit_import_wasi:filesystem__types@0.2.12__:method:descriptor.get_type") + static private extern(C) void __import_getType(uint, void*) @nogc nothrow; + + /++ + + +/ + Result!(void, ErrorCode) setSize(in Filesize size) @nogc nothrow { + align(1) void[2] _retArea = void; + __import_setSize(this.__handle, size, _retArea.ptr); + Result!(void, ErrorCode) _result2 = void; + bool _isErr2 = (cast(uint)(*(cast(ubyte*)(_retArea.ptr + 0)))) != 0; + if (_isErr2) { + + _result2 = Result!(void, ErrorCode).err(cast(ErrorCode)(cast(uint)(*(cast(ubyte*)(_retArea.ptr + 1))))); + } else { + + _result2 = Result!(void, ErrorCode).ok(); + } + auto _flush3 = _result2; + return _flush3; + } + /// ditto + @wasmImport!("wasi:filesystem/types@0.2.12", "[method]descriptor.set-size") + pragma(mangle, "__wit_import_wasi:filesystem__types@0.2.12__:method:descriptor.set_size") + static private extern(C) void __import_setSize(uint, ulong, void*) @nogc nothrow; + + /++ + + +/ + Result!(void, ErrorCode) setTimes(in NewTimestamp dataAccessTimestamp, in NewTimestamp dataModificationTimestamp) @nogc nothrow { + align(1) void[2] _retArea = void; + uint _variantPart6 = void; + ulong _variantPart7 = void; + uint _variantPart8 = void; + alias _Tag9 = NewTimestamp.Tag; + final switch (dataAccessTimestamp.tag) { + case _Tag9.noChange: { + _variantPart6 = 0; + _variantPart7 = 0; + _variantPart8 = 0; + break; + } + case _Tag9.now: { + _variantPart6 = 1; + _variantPart7 = 0; + _variantPart8 = 0; + break; + } + case _Tag9.timestamp: { + const ref Datetime _payload5 = dataAccessTimestamp.getTimestamp(); + _variantPart6 = 2; + _variantPart7 = _payload5.seconds; + _variantPart8 = _payload5.nanoseconds; + break; + } + } + uint _variantPart16 = void; + ulong _variantPart17 = void; + uint _variantPart18 = void; + alias _Tag19 = NewTimestamp.Tag; + final switch (dataModificationTimestamp.tag) { + case _Tag19.noChange: { + _variantPart16 = 0; + _variantPart17 = 0; + _variantPart18 = 0; + break; + } + case _Tag19.now: { + _variantPart16 = 1; + _variantPart17 = 0; + _variantPart18 = 0; + break; + } + case _Tag19.timestamp: { + const ref Datetime _payload15 = dataModificationTimestamp.getTimestamp(); + _variantPart16 = 2; + _variantPart17 = _payload15.seconds; + _variantPart18 = _payload15.nanoseconds; + break; + } + } + __import_setTimes(this.__handle, _variantPart6, _variantPart7, _variantPart8, _variantPart16, _variantPart17, _variantPart18, _retArea.ptr); + Result!(void, ErrorCode) _result22 = void; + bool _isErr22 = (cast(uint)(*(cast(ubyte*)(_retArea.ptr + 0)))) != 0; + if (_isErr22) { + + _result22 = Result!(void, ErrorCode).err(cast(ErrorCode)(cast(uint)(*(cast(ubyte*)(_retArea.ptr + 1))))); + } else { + + _result22 = Result!(void, ErrorCode).ok(); + } + auto _flush23 = _result22; + return _flush23; + } + /// ditto + @wasmImport!("wasi:filesystem/types@0.2.12", "[method]descriptor.set-times") + pragma(mangle, "__wit_import_wasi:filesystem__types@0.2.12__:method:descriptor.set_times") + static private extern(C) void __import_setTimes(uint, uint, ulong, uint, uint, ulong, uint, void*) @nogc nothrow; + + /++ + + +/ + Result!(Tuple!(WitList!(ubyte), bool), ErrorCode) read(in Filesize length, in Filesize offset) @nogc nothrow { + align(size_t.sizeof) void[(4*size_t.sizeof)] _retArea = void; + __import_read(this.__handle, length, offset, _retArea.ptr); + Result!(Tuple!(WitList!(ubyte), bool), ErrorCode) _result4 = void; + bool _isErr4 = (cast(uint)(*(cast(ubyte*)(_retArea.ptr + 0)))) != 0; + if (_isErr4) { + + _result4 = Result!(Tuple!(WitList!(ubyte), bool), ErrorCode).err(cast(ErrorCode)(cast(uint)(*(cast(ubyte*)(_retArea.ptr + size_t.sizeof))))); + } else { + auto _ptr1 = cast(ubyte*)(*(cast(void**)(_retArea.ptr + size_t.sizeof))); + auto _len1 = *(cast(size_t*)(_retArea.ptr + (2*size_t.sizeof))); + auto _tuple2 = Tuple!(WitList!(ubyte), bool)( + WitList!(ubyte)(_ptr1[0.._len1]), + (cast(uint)(*(cast(ubyte*)(_retArea.ptr + (3*size_t.sizeof))))) != 0, + ); + + _result4 = Result!(Tuple!(WitList!(ubyte), bool), ErrorCode).ok(_tuple2); + } + auto _flush5 = _result4; + return _flush5; + } + /// ditto + @wasmImport!("wasi:filesystem/types@0.2.12", "[method]descriptor.read") + pragma(mangle, "__wit_import_wasi:filesystem__types@0.2.12__:method:descriptor.read") + static private extern(C) void __import_read(uint, ulong, ulong, void*) @nogc nothrow; + + /++ + + +/ + Result!(Filesize, ErrorCode) write(in WitList!(ubyte) buffer, in Filesize offset) @nogc nothrow { + align(8) void[16] _retArea = void; + __import_write(this.__handle, cast(void*)(buffer.ptr), buffer.length, offset, _retArea.ptr); + Result!(Filesize, ErrorCode) _result2 = void; + bool _isErr2 = (cast(uint)(*(cast(ubyte*)(_retArea.ptr + 0)))) != 0; + if (_isErr2) { + + _result2 = Result!(Filesize, ErrorCode).err(cast(ErrorCode)(cast(uint)(*(cast(ubyte*)(_retArea.ptr + 8))))); + } else { + + _result2 = Result!(Filesize, ErrorCode).ok(*(cast(ulong*)(_retArea.ptr + 8))); + } + auto _flush3 = _result2; + return _flush3; + } + /// ditto + @wasmImport!("wasi:filesystem/types@0.2.12", "[method]descriptor.write") + pragma(mangle, "__wit_import_wasi:filesystem__types@0.2.12__:method:descriptor.write") + static private extern(C) void __import_write(uint, void*, size_t, ulong, void*) @nogc nothrow; + + /++ + + +/ + Result!(DirectoryEntryStream, ErrorCode) readDirectory() @nogc nothrow { + align(4) void[8] _retArea = void; + __import_readDirectory(this.__handle, _retArea.ptr); + Result!(DirectoryEntryStream, ErrorCode) _result2 = void; + bool _isErr2 = (cast(uint)(*(cast(ubyte*)(_retArea.ptr + 0)))) != 0; + if (_isErr2) { + + _result2 = Result!(DirectoryEntryStream, ErrorCode).err(cast(ErrorCode)(cast(uint)(*(cast(ubyte*)(_retArea.ptr + 4))))); + } else { + + _result2 = Result!(DirectoryEntryStream, ErrorCode).ok(DirectoryEntryStream(*(cast(uint*)(_retArea.ptr + 4)))); + } + auto _flush3 = _result2; + return _flush3; + } + /// ditto + @wasmImport!("wasi:filesystem/types@0.2.12", "[method]descriptor.read-directory") + pragma(mangle, "__wit_import_wasi:filesystem__types@0.2.12__:method:descriptor.read_directory") + static private extern(C) void __import_readDirectory(uint, void*) @nogc nothrow; + + /++ + + +/ + Result!(void, ErrorCode) sync() @nogc nothrow { + align(1) void[2] _retArea = void; + __import_sync(this.__handle, _retArea.ptr); + Result!(void, ErrorCode) _result2 = void; + bool _isErr2 = (cast(uint)(*(cast(ubyte*)(_retArea.ptr + 0)))) != 0; + if (_isErr2) { + + _result2 = Result!(void, ErrorCode).err(cast(ErrorCode)(cast(uint)(*(cast(ubyte*)(_retArea.ptr + 1))))); + } else { + + _result2 = Result!(void, ErrorCode).ok(); + } + auto _flush3 = _result2; + return _flush3; + } + /// ditto + @wasmImport!("wasi:filesystem/types@0.2.12", "[method]descriptor.sync") + pragma(mangle, "__wit_import_wasi:filesystem__types@0.2.12__:method:descriptor.sync") + static private extern(C) void __import_sync(uint, void*) @nogc nothrow; + + /++ + + +/ + Result!(void, ErrorCode) createDirectoryAt(in WitString path) @nogc nothrow { + align(1) void[2] _retArea = void; + __import_createDirectoryAt(this.__handle, cast(void*)(path.ptr), path.length, _retArea.ptr); + Result!(void, ErrorCode) _result2 = void; + bool _isErr2 = (cast(uint)(*(cast(ubyte*)(_retArea.ptr + 0)))) != 0; + if (_isErr2) { + + _result2 = Result!(void, ErrorCode).err(cast(ErrorCode)(cast(uint)(*(cast(ubyte*)(_retArea.ptr + 1))))); + } else { + + _result2 = Result!(void, ErrorCode).ok(); + } + auto _flush3 = _result2; + return _flush3; + } + /// ditto + @wasmImport!("wasi:filesystem/types@0.2.12", "[method]descriptor.create-directory-at") + pragma(mangle, "__wit_import_wasi:filesystem__types@0.2.12__:method:descriptor.create_directory_at") + static private extern(C) void __import_createDirectoryAt(uint, void*, size_t, void*) @nogc nothrow; + + /++ + + +/ + Result!(DescriptorStat, ErrorCode) stat() @nogc nothrow { + align(8) void[104] _retArea = void; + __import_stat(this.__handle, _retArea.ptr); + Result!(DescriptorStat, ErrorCode) _result15 = void; + bool _isErr15 = (cast(uint)(*(cast(ubyte*)(_retArea.ptr + 0)))) != 0; + if (_isErr15) { + + _result15 = Result!(DescriptorStat, ErrorCode).err(cast(ErrorCode)(cast(uint)(*(cast(ubyte*)(_retArea.ptr + 8))))); + } else { + Option!(Datetime) _option4 = void; + bool _isSome4 = (cast(uint)(*(cast(ubyte*)(_retArea.ptr + 32)))) != 0; + if (_isSome4) { + core.sys.wasi.p2.clocks.wall_clock.imports.Datetime _record3 = { + seconds: *(cast(ulong*)(_retArea.ptr + 40)), + nanoseconds: *(cast(uint*)(_retArea.ptr + 48)), + }; + + _option4 = Option!(Datetime).some(_record3); + } else { + _option4 = Option!(Datetime).none; + } + Option!(Datetime) _option8 = void; + bool _isSome8 = (cast(uint)(*(cast(ubyte*)(_retArea.ptr + 56)))) != 0; + if (_isSome8) { + core.sys.wasi.p2.clocks.wall_clock.imports.Datetime _record7 = { + seconds: *(cast(ulong*)(_retArea.ptr + 64)), + nanoseconds: *(cast(uint*)(_retArea.ptr + 72)), + }; + + _option8 = Option!(Datetime).some(_record7); + } else { + _option8 = Option!(Datetime).none; + } + Option!(Datetime) _option12 = void; + bool _isSome12 = (cast(uint)(*(cast(ubyte*)(_retArea.ptr + 80)))) != 0; + if (_isSome12) { + core.sys.wasi.p2.clocks.wall_clock.imports.Datetime _record11 = { + seconds: *(cast(ulong*)(_retArea.ptr + 88)), + nanoseconds: *(cast(uint*)(_retArea.ptr + 96)), + }; + + _option12 = Option!(Datetime).some(_record11); + } else { + _option12 = Option!(Datetime).none; + } + DescriptorStat _record13 = { + type: cast(DescriptorType)(cast(uint)(*(cast(ubyte*)(_retArea.ptr + 8)))), + linkCount: *(cast(ulong*)(_retArea.ptr + 16)), + size: *(cast(ulong*)(_retArea.ptr + 24)), + dataAccessTimestamp: _option4, + dataModificationTimestamp: _option8, + statusChangeTimestamp: _option12, + }; + + _result15 = Result!(DescriptorStat, ErrorCode).ok(_record13); + } + auto _flush16 = _result15; + return _flush16; + } + /// ditto + @wasmImport!("wasi:filesystem/types@0.2.12", "[method]descriptor.stat") + pragma(mangle, "__wit_import_wasi:filesystem__types@0.2.12__:method:descriptor.stat") + static private extern(C) void __import_stat(uint, void*) @nogc nothrow; + + /++ + + +/ + Result!(DescriptorStat, ErrorCode) statAt(in PathFlags pathFlags, in WitString path) @nogc nothrow { + align(8) void[104] _retArea = void; + __import_statAt(this.__handle, cast(uint)(pathFlags.bits), cast(void*)(path.ptr), path.length, _retArea.ptr); + Result!(DescriptorStat, ErrorCode) _result15 = void; + bool _isErr15 = (cast(uint)(*(cast(ubyte*)(_retArea.ptr + 0)))) != 0; + if (_isErr15) { + + _result15 = Result!(DescriptorStat, ErrorCode).err(cast(ErrorCode)(cast(uint)(*(cast(ubyte*)(_retArea.ptr + 8))))); + } else { + Option!(Datetime) _option4 = void; + bool _isSome4 = (cast(uint)(*(cast(ubyte*)(_retArea.ptr + 32)))) != 0; + if (_isSome4) { + core.sys.wasi.p2.clocks.wall_clock.imports.Datetime _record3 = { + seconds: *(cast(ulong*)(_retArea.ptr + 40)), + nanoseconds: *(cast(uint*)(_retArea.ptr + 48)), + }; + + _option4 = Option!(Datetime).some(_record3); + } else { + _option4 = Option!(Datetime).none; + } + Option!(Datetime) _option8 = void; + bool _isSome8 = (cast(uint)(*(cast(ubyte*)(_retArea.ptr + 56)))) != 0; + if (_isSome8) { + core.sys.wasi.p2.clocks.wall_clock.imports.Datetime _record7 = { + seconds: *(cast(ulong*)(_retArea.ptr + 64)), + nanoseconds: *(cast(uint*)(_retArea.ptr + 72)), + }; + + _option8 = Option!(Datetime).some(_record7); + } else { + _option8 = Option!(Datetime).none; + } + Option!(Datetime) _option12 = void; + bool _isSome12 = (cast(uint)(*(cast(ubyte*)(_retArea.ptr + 80)))) != 0; + if (_isSome12) { + core.sys.wasi.p2.clocks.wall_clock.imports.Datetime _record11 = { + seconds: *(cast(ulong*)(_retArea.ptr + 88)), + nanoseconds: *(cast(uint*)(_retArea.ptr + 96)), + }; + + _option12 = Option!(Datetime).some(_record11); + } else { + _option12 = Option!(Datetime).none; + } + DescriptorStat _record13 = { + type: cast(DescriptorType)(cast(uint)(*(cast(ubyte*)(_retArea.ptr + 8)))), + linkCount: *(cast(ulong*)(_retArea.ptr + 16)), + size: *(cast(ulong*)(_retArea.ptr + 24)), + dataAccessTimestamp: _option4, + dataModificationTimestamp: _option8, + statusChangeTimestamp: _option12, + }; + + _result15 = Result!(DescriptorStat, ErrorCode).ok(_record13); + } + auto _flush16 = _result15; + return _flush16; + } + /// ditto + @wasmImport!("wasi:filesystem/types@0.2.12", "[method]descriptor.stat-at") + pragma(mangle, "__wit_import_wasi:filesystem__types@0.2.12__:method:descriptor.stat_at") + static private extern(C) void __import_statAt(uint, uint, void*, size_t, void*) @nogc nothrow; + + /++ + + +/ + Result!(void, ErrorCode) setTimesAt(in PathFlags pathFlags, in WitString path, in NewTimestamp dataAccessTimestamp, in NewTimestamp dataModificationTimestamp) @nogc nothrow { + align(1) void[2] _retArea = void; + uint _variantPart6 = void; + ulong _variantPart7 = void; + uint _variantPart8 = void; + alias _Tag9 = NewTimestamp.Tag; + final switch (dataAccessTimestamp.tag) { + case _Tag9.noChange: { + _variantPart6 = 0; + _variantPart7 = 0; + _variantPart8 = 0; + break; + } + case _Tag9.now: { + _variantPart6 = 1; + _variantPart7 = 0; + _variantPart8 = 0; + break; + } + case _Tag9.timestamp: { + const ref Datetime _payload5 = dataAccessTimestamp.getTimestamp(); + _variantPart6 = 2; + _variantPart7 = _payload5.seconds; + _variantPart8 = _payload5.nanoseconds; + break; + } + } + uint _variantPart16 = void; + ulong _variantPart17 = void; + uint _variantPart18 = void; + alias _Tag19 = NewTimestamp.Tag; + final switch (dataModificationTimestamp.tag) { + case _Tag19.noChange: { + _variantPart16 = 0; + _variantPart17 = 0; + _variantPart18 = 0; + break; + } + case _Tag19.now: { + _variantPart16 = 1; + _variantPart17 = 0; + _variantPart18 = 0; + break; + } + case _Tag19.timestamp: { + const ref Datetime _payload15 = dataModificationTimestamp.getTimestamp(); + _variantPart16 = 2; + _variantPart17 = _payload15.seconds; + _variantPart18 = _payload15.nanoseconds; + break; + } + } + __import_setTimesAt(this.__handle, cast(uint)(pathFlags.bits), cast(void*)(path.ptr), path.length, _variantPart6, _variantPart7, _variantPart8, _variantPart16, _variantPart17, _variantPart18, _retArea.ptr); + Result!(void, ErrorCode) _result22 = void; + bool _isErr22 = (cast(uint)(*(cast(ubyte*)(_retArea.ptr + 0)))) != 0; + if (_isErr22) { + + _result22 = Result!(void, ErrorCode).err(cast(ErrorCode)(cast(uint)(*(cast(ubyte*)(_retArea.ptr + 1))))); + } else { + + _result22 = Result!(void, ErrorCode).ok(); + } + auto _flush23 = _result22; + return _flush23; + } + /// ditto + @wasmImport!("wasi:filesystem/types@0.2.12", "[method]descriptor.set-times-at") + pragma(mangle, "__wit_import_wasi:filesystem__types@0.2.12__:method:descriptor.set_times_at") + static private extern(C) void __import_setTimesAt(uint, uint, void*, size_t, uint, ulong, uint, uint, ulong, uint, void*) @nogc nothrow; + + /++ + + +/ + Result!(void, ErrorCode) linkAt(in PathFlags oldPathFlags, in WitString oldPath, in Descriptor.Borrow newDescriptor, in WitString newPath) @nogc nothrow { + align(1) void[2] _retArea = void; + __import_linkAt(this.__handle, cast(uint)(oldPathFlags.bits), cast(void*)(oldPath.ptr), oldPath.length, newDescriptor.__handle, cast(void*)(newPath.ptr), newPath.length, _retArea.ptr); + Result!(void, ErrorCode) _result2 = void; + bool _isErr2 = (cast(uint)(*(cast(ubyte*)(_retArea.ptr + 0)))) != 0; + if (_isErr2) { + + _result2 = Result!(void, ErrorCode).err(cast(ErrorCode)(cast(uint)(*(cast(ubyte*)(_retArea.ptr + 1))))); + } else { + + _result2 = Result!(void, ErrorCode).ok(); + } + auto _flush3 = _result2; + return _flush3; + } + /// ditto + @wasmImport!("wasi:filesystem/types@0.2.12", "[method]descriptor.link-at") + pragma(mangle, "__wit_import_wasi:filesystem__types@0.2.12__:method:descriptor.link_at") + static private extern(C) void __import_linkAt(uint, uint, void*, size_t, uint, void*, size_t, void*) @nogc nothrow; + + /++ + + +/ + Result!(Descriptor, ErrorCode) openAt(in PathFlags pathFlags, in WitString path, in OpenFlags openFlags, in DescriptorFlags flags) @nogc nothrow { + align(4) void[8] _retArea = void; + __import_openAt(this.__handle, cast(uint)(pathFlags.bits), cast(void*)(path.ptr), path.length, cast(uint)(openFlags.bits), cast(uint)(flags.bits), _retArea.ptr); + Result!(Descriptor, ErrorCode) _result2 = void; + bool _isErr2 = (cast(uint)(*(cast(ubyte*)(_retArea.ptr + 0)))) != 0; + if (_isErr2) { + + _result2 = Result!(Descriptor, ErrorCode).err(cast(ErrorCode)(cast(uint)(*(cast(ubyte*)(_retArea.ptr + 4))))); + } else { + + _result2 = Result!(Descriptor, ErrorCode).ok(Descriptor(*(cast(uint*)(_retArea.ptr + 4)))); + } + auto _flush3 = _result2; + return _flush3; + } + /// ditto + @wasmImport!("wasi:filesystem/types@0.2.12", "[method]descriptor.open-at") + pragma(mangle, "__wit_import_wasi:filesystem__types@0.2.12__:method:descriptor.open_at") + static private extern(C) void __import_openAt(uint, uint, void*, size_t, uint, uint, void*) @nogc nothrow; + + /++ + + +/ + Result!(WitString, ErrorCode) readlinkAt(in WitString path) @nogc nothrow { + align(size_t.sizeof) void[(3*size_t.sizeof)] _retArea = void; + __import_readlinkAt(this.__handle, cast(void*)(path.ptr), path.length, _retArea.ptr); + Result!(WitString, ErrorCode) _result3 = void; + bool _isErr3 = (cast(uint)(*(cast(ubyte*)(_retArea.ptr + 0)))) != 0; + if (_isErr3) { + + _result3 = Result!(WitString, ErrorCode).err(cast(ErrorCode)(cast(uint)(*(cast(ubyte*)(_retArea.ptr + size_t.sizeof))))); + } else { + auto _ptr1 = cast(char*)(*(cast(void**)(_retArea.ptr + size_t.sizeof))); + auto _len1 = *(cast(size_t*)(_retArea.ptr + (2*size_t.sizeof))); + + _result3 = Result!(WitString, ErrorCode).ok(WitString(_ptr1[0.._len1])); + } + auto _flush4 = _result3; + return _flush4; + } + /// ditto + @wasmImport!("wasi:filesystem/types@0.2.12", "[method]descriptor.readlink-at") + pragma(mangle, "__wit_import_wasi:filesystem__types@0.2.12__:method:descriptor.readlink_at") + static private extern(C) void __import_readlinkAt(uint, void*, size_t, void*) @nogc nothrow; + + /++ + + +/ + Result!(void, ErrorCode) removeDirectoryAt(in WitString path) @nogc nothrow { + align(1) void[2] _retArea = void; + __import_removeDirectoryAt(this.__handle, cast(void*)(path.ptr), path.length, _retArea.ptr); + Result!(void, ErrorCode) _result2 = void; + bool _isErr2 = (cast(uint)(*(cast(ubyte*)(_retArea.ptr + 0)))) != 0; + if (_isErr2) { + + _result2 = Result!(void, ErrorCode).err(cast(ErrorCode)(cast(uint)(*(cast(ubyte*)(_retArea.ptr + 1))))); + } else { + + _result2 = Result!(void, ErrorCode).ok(); + } + auto _flush3 = _result2; + return _flush3; + } + /// ditto + @wasmImport!("wasi:filesystem/types@0.2.12", "[method]descriptor.remove-directory-at") + pragma(mangle, "__wit_import_wasi:filesystem__types@0.2.12__:method:descriptor.remove_directory_at") + static private extern(C) void __import_removeDirectoryAt(uint, void*, size_t, void*) @nogc nothrow; + + /++ + + +/ + Result!(void, ErrorCode) renameAt(in WitString oldPath, in Descriptor.Borrow newDescriptor, in WitString newPath) @nogc nothrow { + align(1) void[2] _retArea = void; + __import_renameAt(this.__handle, cast(void*)(oldPath.ptr), oldPath.length, newDescriptor.__handle, cast(void*)(newPath.ptr), newPath.length, _retArea.ptr); + Result!(void, ErrorCode) _result2 = void; + bool _isErr2 = (cast(uint)(*(cast(ubyte*)(_retArea.ptr + 0)))) != 0; + if (_isErr2) { + + _result2 = Result!(void, ErrorCode).err(cast(ErrorCode)(cast(uint)(*(cast(ubyte*)(_retArea.ptr + 1))))); + } else { + + _result2 = Result!(void, ErrorCode).ok(); + } + auto _flush3 = _result2; + return _flush3; + } + /// ditto + @wasmImport!("wasi:filesystem/types@0.2.12", "[method]descriptor.rename-at") + pragma(mangle, "__wit_import_wasi:filesystem__types@0.2.12__:method:descriptor.rename_at") + static private extern(C) void __import_renameAt(uint, void*, size_t, uint, void*, size_t, void*) @nogc nothrow; + + /++ + + +/ + Result!(void, ErrorCode) symlinkAt(in WitString oldPath, in WitString newPath) @nogc nothrow { + align(1) void[2] _retArea = void; + __import_symlinkAt(this.__handle, cast(void*)(oldPath.ptr), oldPath.length, cast(void*)(newPath.ptr), newPath.length, _retArea.ptr); + Result!(void, ErrorCode) _result2 = void; + bool _isErr2 = (cast(uint)(*(cast(ubyte*)(_retArea.ptr + 0)))) != 0; + if (_isErr2) { + + _result2 = Result!(void, ErrorCode).err(cast(ErrorCode)(cast(uint)(*(cast(ubyte*)(_retArea.ptr + 1))))); + } else { + + _result2 = Result!(void, ErrorCode).ok(); + } + auto _flush3 = _result2; + return _flush3; + } + /// ditto + @wasmImport!("wasi:filesystem/types@0.2.12", "[method]descriptor.symlink-at") + pragma(mangle, "__wit_import_wasi:filesystem__types@0.2.12__:method:descriptor.symlink_at") + static private extern(C) void __import_symlinkAt(uint, void*, size_t, void*, size_t, void*) @nogc nothrow; + + /++ + + +/ + Result!(void, ErrorCode) unlinkFileAt(in WitString path) @nogc nothrow { + align(1) void[2] _retArea = void; + __import_unlinkFileAt(this.__handle, cast(void*)(path.ptr), path.length, _retArea.ptr); + Result!(void, ErrorCode) _result2 = void; + bool _isErr2 = (cast(uint)(*(cast(ubyte*)(_retArea.ptr + 0)))) != 0; + if (_isErr2) { + + _result2 = Result!(void, ErrorCode).err(cast(ErrorCode)(cast(uint)(*(cast(ubyte*)(_retArea.ptr + 1))))); + } else { + + _result2 = Result!(void, ErrorCode).ok(); + } + auto _flush3 = _result2; + return _flush3; + } + /// ditto + @wasmImport!("wasi:filesystem/types@0.2.12", "[method]descriptor.unlink-file-at") + pragma(mangle, "__wit_import_wasi:filesystem__types@0.2.12__:method:descriptor.unlink_file_at") + static private extern(C) void __import_unlinkFileAt(uint, void*, size_t, void*) @nogc nothrow; + + /++ + + +/ + bool isSameObject(in Descriptor.Borrow other) @nogc nothrow { + auto _ret = __import_isSameObject(this.__handle, other.__handle); + return (_ret) != 0; + } + /// ditto + @wasmImport!("wasi:filesystem/types@0.2.12", "[method]descriptor.is-same-object") + pragma(mangle, "__wit_import_wasi:filesystem__types@0.2.12__:method:descriptor.is_same_object") + static private extern(C) uint __import_isSameObject(uint, uint) @nogc nothrow; + + /++ + + +/ + Result!(MetadataHashValue, ErrorCode) metadataHash() @nogc nothrow { + align(8) void[24] _retArea = void; + __import_metadataHash(this.__handle, _retArea.ptr); + Result!(MetadataHashValue, ErrorCode) _result3 = void; + bool _isErr3 = (cast(uint)(*(cast(ubyte*)(_retArea.ptr + 0)))) != 0; + if (_isErr3) { + + _result3 = Result!(MetadataHashValue, ErrorCode).err(cast(ErrorCode)(cast(uint)(*(cast(ubyte*)(_retArea.ptr + 8))))); + } else { + MetadataHashValue _record1 = { + lower: *(cast(ulong*)(_retArea.ptr + 8)), + upper: *(cast(ulong*)(_retArea.ptr + 16)), + }; + + _result3 = Result!(MetadataHashValue, ErrorCode).ok(_record1); + } + auto _flush4 = _result3; + return _flush4; + } + /// ditto + @wasmImport!("wasi:filesystem/types@0.2.12", "[method]descriptor.metadata-hash") + pragma(mangle, "__wit_import_wasi:filesystem__types@0.2.12__:method:descriptor.metadata_hash") + static private extern(C) void __import_metadataHash(uint, void*) @nogc nothrow; + + /++ + + +/ + Result!(MetadataHashValue, ErrorCode) metadataHashAt(in PathFlags pathFlags, in WitString path) @nogc nothrow { + align(8) void[24] _retArea = void; + __import_metadataHashAt(this.__handle, cast(uint)(pathFlags.bits), cast(void*)(path.ptr), path.length, _retArea.ptr); + Result!(MetadataHashValue, ErrorCode) _result3 = void; + bool _isErr3 = (cast(uint)(*(cast(ubyte*)(_retArea.ptr + 0)))) != 0; + if (_isErr3) { + + _result3 = Result!(MetadataHashValue, ErrorCode).err(cast(ErrorCode)(cast(uint)(*(cast(ubyte*)(_retArea.ptr + 8))))); + } else { + MetadataHashValue _record1 = { + lower: *(cast(ulong*)(_retArea.ptr + 8)), + upper: *(cast(ulong*)(_retArea.ptr + 16)), + }; + + _result3 = Result!(MetadataHashValue, ErrorCode).ok(_record1); + } + auto _flush4 = _result3; + return _flush4; + } + /// ditto + @wasmImport!("wasi:filesystem/types@0.2.12", "[method]descriptor.metadata-hash-at") + pragma(mangle, "__wit_import_wasi:filesystem__types@0.2.12__:method:descriptor.metadata_hash_at") + static private extern(C) void __import_metadataHashAt(uint, uint, void*, size_t, void*) @nogc nothrow; + } +} + +/++ + ++/ +struct DirectoryEntryStream { + @nogc nothrow: + + package(core.sys.wasi.p2) uint __handle = 0; + + package(core.sys.wasi.p2) this(uint handle) { + __handle = handle; + } + + @disable this(); + + + void drop() { + __import_drop(__handle); + } + @wasmImport!("wasi:filesystem/types@0.2.12", "[resource-drop]directory-entry-stream") + pragma(mangle, "__wit_import_wasi:filesystem__types@0.2.12__:resource_drop:directory_entry_stream") + static private extern(C) void __import_drop(uint); + + alias witFree = drop; + // TODO: make RAII? disable copy for the own + + Borrow borrow() => Borrow(__handle); + alias borrow this; + + struct Borrow { + @nogc nothrow: + + package(core.sys.wasi.p2) uint __handle = 0; + + package(core.sys.wasi.p2) this(uint handle) { + __handle = handle; + } + + @disable this(); + + void witFree() {} + Borrow witClone() const { return Borrow(__handle); } + + /++ + + +/ + Result!(Option!(DirectoryEntry), ErrorCode) readDirectoryEntry() @nogc nothrow { + align(size_t.sizeof) void[(5*size_t.sizeof)] _retArea = void; + __import_readDirectoryEntry(this.__handle, _retArea.ptr); + Result!(Option!(DirectoryEntry), ErrorCode) _result7 = void; + bool _isErr7 = (cast(uint)(*(cast(ubyte*)(_retArea.ptr + 0)))) != 0; + if (_isErr7) { + + _result7 = Result!(Option!(DirectoryEntry), ErrorCode).err(cast(ErrorCode)(cast(uint)(*(cast(ubyte*)(_retArea.ptr + size_t.sizeof))))); + } else { + Option!(DirectoryEntry) _option5 = void; + bool _isSome5 = (cast(uint)(*(cast(ubyte*)(_retArea.ptr + size_t.sizeof)))) != 0; + if (_isSome5) { + auto _ptr3 = cast(char*)(*(cast(void**)(_retArea.ptr + (3*size_t.sizeof)))); + auto _len3 = *(cast(size_t*)(_retArea.ptr + (4*size_t.sizeof))); + DirectoryEntry _record4 = { + type: cast(DescriptorType)(cast(uint)(*(cast(ubyte*)(_retArea.ptr + (2*size_t.sizeof))))), + name: WitString(_ptr3[0.._len3]), + }; + + _option5 = Option!(DirectoryEntry).some(_record4); + } else { + _option5 = Option!(DirectoryEntry).none; + } + + _result7 = Result!(Option!(DirectoryEntry), ErrorCode).ok(_option5); + } + auto _flush8 = _result7; + return _flush8; + } + /// ditto + @wasmImport!("wasi:filesystem/types@0.2.12", "[method]directory-entry-stream.read-directory-entry") + pragma(mangle, "__wit_import_wasi:filesystem__types@0.2.12__:method:directory_entry_stream.read_directory_entry") + static private extern(C) void __import_readDirectoryEntry(uint, void*) @nogc nothrow; + } +} + +/++ + ++/ +Option!(ErrorCode) filesystemErrorCode(in Error_.Borrow err) @nogc nothrow { + align(1) void[2] _retArea = void; + __import_filesystemErrorCode(err.__handle, _retArea.ptr); + Option!(ErrorCode) _option2 = void; + bool _isSome2 = (cast(uint)(*(cast(ubyte*)(_retArea.ptr + 0)))) != 0; + if (_isSome2) { + + _option2 = Option!(ErrorCode).some(cast(ErrorCode)(cast(uint)(*(cast(ubyte*)(_retArea.ptr + 1))))); + } else { + _option2 = Option!(ErrorCode).none; + } + auto _flush3 = _option2; + return _flush3; +} +/// ditto +@wasmImport!("wasi:filesystem/types@0.2.12", "filesystem-error-code") +pragma(mangle, "__wit_import_wasi:filesystem__types@0.2.12__filesystem_error_code") +private extern(C) void __import_filesystemErrorCode(uint, void*) @nogc nothrow; diff --git a/druntime/src/core/sys/wasi/p2/io/error/common.d b/druntime/src/core/sys/wasi/p2/io/error/common.d new file mode 100644 index 000000000000..45df87e2931b --- /dev/null +++ b/druntime/src/core/sys/wasi/p2/io/error/common.d @@ -0,0 +1,9 @@ +/++ + ++/ +module core.sys.wasi.p2.io.error.common; + +import core.sys.wasi.wit_common; + + +package (core.sys.wasi.p2) void __wit_bindgen_component_type_force_link() pure @nogc nothrow => imported!"core.sys.wasi.p2.cli.imports".__wit_bindgen_component_type_force_link(); diff --git a/druntime/src/core/sys/wasi/p2/io/error/imports.d b/druntime/src/core/sys/wasi/p2/io/error/imports.d new file mode 100644 index 000000000000..0749dbb89617 --- /dev/null +++ b/druntime/src/core/sys/wasi/p2/io/error/imports.d @@ -0,0 +1,71 @@ +/++ + ++/ +module core.sys.wasi.p2.io.error.imports; + +import core.sys.wasi.wit_common; + +public import core.sys.wasi.p2.io.error.common; + + +package (core.sys.wasi.p2) void __wit_bindgen_component_type_force_link() pure @nogc nothrow => imported!"core.sys.wasi.p2.cli.imports".__wit_bindgen_component_type_force_link(); + +/++ + ++/ +struct Error_ { + @nogc nothrow: + + package(core.sys.wasi.p2) uint __handle = 0; + + package(core.sys.wasi.p2) this(uint handle) { + __handle = handle; + } + + @disable this(); + + + void drop() { + __import_drop(__handle); + } + @wasmImport!("wasi:io/error@0.2.12", "[resource-drop]error") + pragma(mangle, "__wit_import_wasi:io__error@0.2.12__:resource_drop:error") + static private extern(C) void __import_drop(uint); + + alias witFree = drop; + // TODO: make RAII? disable copy for the own + + Borrow borrow() => Borrow(__handle); + alias borrow this; + + struct Borrow { + @nogc nothrow: + + package(core.sys.wasi.p2) uint __handle = 0; + + package(core.sys.wasi.p2) this(uint handle) { + __handle = handle; + } + + @disable this(); + + void witFree() {} + Borrow witClone() const { return Borrow(__handle); } + + /++ + + +/ + WitString toDebugString() @nogc nothrow { + align(size_t.sizeof) void[(2*size_t.sizeof)] _retArea = void; + __import_toDebugString(this.__handle, _retArea.ptr); + auto _ptr0 = cast(char*)(*(cast(void**)(_retArea.ptr + 0))); + auto _len0 = *(cast(size_t*)(_retArea.ptr + size_t.sizeof)); + auto _flush1 = WitString(_ptr0[0.._len0]); + return _flush1; + } + /// ditto + @wasmImport!("wasi:io/error@0.2.12", "[method]error.to-debug-string") + pragma(mangle, "__wit_import_wasi:io__error@0.2.12__:method:error.to_debug_string") + static private extern(C) void __import_toDebugString(uint, void*) @nogc nothrow; + } +} diff --git a/druntime/src/core/sys/wasi/p2/io/poll/common.d b/druntime/src/core/sys/wasi/p2/io/poll/common.d new file mode 100644 index 000000000000..6a680156b2c9 --- /dev/null +++ b/druntime/src/core/sys/wasi/p2/io/poll/common.d @@ -0,0 +1,9 @@ +/++ + ++/ +module core.sys.wasi.p2.io.poll.common; + +import core.sys.wasi.wit_common; + + +package (core.sys.wasi.p2) void __wit_bindgen_component_type_force_link() pure @nogc nothrow => imported!"core.sys.wasi.p2.cli.imports".__wit_bindgen_component_type_force_link(); diff --git a/druntime/src/core/sys/wasi/p2/io/poll/imports.d b/druntime/src/core/sys/wasi/p2/io/poll/imports.d new file mode 100644 index 000000000000..c1f33942f764 --- /dev/null +++ b/druntime/src/core/sys/wasi/p2/io/poll/imports.d @@ -0,0 +1,94 @@ +/++ + ++/ +module core.sys.wasi.p2.io.poll.imports; + +import core.sys.wasi.wit_common; + +public import core.sys.wasi.p2.io.poll.common; + + +package (core.sys.wasi.p2) void __wit_bindgen_component_type_force_link() pure @nogc nothrow => imported!"core.sys.wasi.p2.cli.imports".__wit_bindgen_component_type_force_link(); + +/++ + ++/ +struct Pollable { + @nogc nothrow: + + package(core.sys.wasi.p2) uint __handle = 0; + + package(core.sys.wasi.p2) this(uint handle) { + __handle = handle; + } + + @disable this(); + + + void drop() { + __import_drop(__handle); + } + @wasmImport!("wasi:io/poll@0.2.12", "[resource-drop]pollable") + pragma(mangle, "__wit_import_wasi:io__poll@0.2.12__:resource_drop:pollable") + static private extern(C) void __import_drop(uint); + + alias witFree = drop; + // TODO: make RAII? disable copy for the own + + Borrow borrow() => Borrow(__handle); + alias borrow this; + + struct Borrow { + @nogc nothrow: + + package(core.sys.wasi.p2) uint __handle = 0; + + package(core.sys.wasi.p2) this(uint handle) { + __handle = handle; + } + + @disable this(); + + void witFree() {} + Borrow witClone() const { return Borrow(__handle); } + + /++ + + +/ + bool ready() @nogc nothrow { + auto _ret = __import_ready(this.__handle); + return (_ret) != 0; + } + /// ditto + @wasmImport!("wasi:io/poll@0.2.12", "[method]pollable.ready") + pragma(mangle, "__wit_import_wasi:io__poll@0.2.12__:method:pollable.ready") + static private extern(C) uint __import_ready(uint) @nogc nothrow; + + /++ + + +/ + void block() @nogc nothrow { + __import_block(this.__handle); + } + /// ditto + @wasmImport!("wasi:io/poll@0.2.12", "[method]pollable.block") + pragma(mangle, "__wit_import_wasi:io__poll@0.2.12__:method:pollable.block") + static private extern(C) void __import_block(uint) @nogc nothrow; + } +} + +/++ + ++/ +WitList!(uint) poll(in WitList!(Pollable.Borrow) in_) @nogc nothrow { + align(size_t.sizeof) void[(2*size_t.sizeof)] _retArea = void; + __import_poll(cast(void*)(in_.ptr), in_.length, _retArea.ptr); + auto _ptr0 = cast(uint*)(*(cast(void**)(_retArea.ptr + 0))); + auto _len0 = *(cast(size_t*)(_retArea.ptr + size_t.sizeof)); + auto _flush1 = WitList!(uint)(_ptr0[0.._len0]); + return _flush1; +} +/// ditto +@wasmImport!("wasi:io/poll@0.2.12", "poll") +pragma(mangle, "__wit_import_wasi:io__poll@0.2.12__poll") +private extern(C) void __import_poll(void*, size_t, void*) @nogc nothrow; diff --git a/druntime/src/core/sys/wasi/p2/io/streams/common.d b/druntime/src/core/sys/wasi/p2/io/streams/common.d new file mode 100644 index 000000000000..8aea295b02d7 --- /dev/null +++ b/druntime/src/core/sys/wasi/p2/io/streams/common.d @@ -0,0 +1,11 @@ +/++ + ++/ +module core.sys.wasi.p2.io.streams.common; + +import core.sys.wasi.wit_common; + +static import core.sys.wasi.p2.io.error.common; +static import core.sys.wasi.p2.io.poll.common; + +package (core.sys.wasi.p2) void __wit_bindgen_component_type_force_link() pure @nogc nothrow => imported!"core.sys.wasi.p2.cli.imports".__wit_bindgen_component_type_force_link(); diff --git a/druntime/src/core/sys/wasi/p2/io/streams/imports.d b/druntime/src/core/sys/wasi/p2/io/streams/imports.d new file mode 100644 index 000000000000..a2a1a14cc463 --- /dev/null +++ b/druntime/src/core/sys/wasi/p2/io/streams/imports.d @@ -0,0 +1,667 @@ +/++ + ++/ +module core.sys.wasi.p2.io.streams.imports; + +import core.sys.wasi.wit_common; + +public import core.sys.wasi.p2.io.streams.common; + +static import core.sys.wasi.p2.io.error.imports; +static import core.sys.wasi.p2.io.poll.imports; + +package (core.sys.wasi.p2) void __wit_bindgen_component_type_force_link() pure @nogc nothrow => imported!"core.sys.wasi.p2.cli.imports".__wit_bindgen_component_type_force_link(); + +/++ + ++/ +alias Error_ = core.sys.wasi.p2.io.error.imports.Error_; + +/++ + ++/ +alias Pollable = core.sys.wasi.p2.io.poll.imports.Pollable; + +/++ + ++/ +struct StreamError { + mixin WitVariant!( + Error_, // lastOperationFailed + void, // closed + ); + +public: + enum Tag : ubyte { + /++ + + +/ + lastOperationFailed, + + /++ + + +/ + closed, + } + Tag tag() const @safe @nogc nothrow pure => _tag; + + /++ + + +/ + alias lastOperationFailed = _create!(Tag.lastOperationFailed); + /// ditto + bool isLastOperationFailed() const => _tag == Tag.lastOperationFailed; + ///ditto + alias getLastOperationFailed = _get!(Tag.lastOperationFailed); + + /++ + + +/ + alias closed = _create!(Tag.closed); + /// ditto + bool isClosed() const => _tag == Tag.closed; + + void witFree() @nogc nothrow { + switch (_tag) with (Tag) { + case lastOperationFailed: _get!(Tag.lastOperationFailed).witFree; break; + default: break; + } + } +} + +/++ + ++/ +struct InputStream { + @nogc nothrow: + + package(core.sys.wasi.p2) uint __handle = 0; + + package(core.sys.wasi.p2) this(uint handle) { + __handle = handle; + } + + @disable this(); + + + void drop() { + __import_drop(__handle); + } + @wasmImport!("wasi:io/streams@0.2.12", "[resource-drop]input-stream") + pragma(mangle, "__wit_import_wasi:io__streams@0.2.12__:resource_drop:input_stream") + static private extern(C) void __import_drop(uint); + + alias witFree = drop; + // TODO: make RAII? disable copy for the own + + Borrow borrow() => Borrow(__handle); + alias borrow this; + + struct Borrow { + @nogc nothrow: + + package(core.sys.wasi.p2) uint __handle = 0; + + package(core.sys.wasi.p2) this(uint handle) { + __handle = handle; + } + + @disable this(); + + void witFree() {} + Borrow witClone() const { return Borrow(__handle); } + + /++ + + +/ + Result!(WitList!(ubyte), StreamError) read(ulong len) @nogc nothrow { + align(size_t.sizeof) void[(3*size_t.sizeof)] _retArea = void; + __import_read(this.__handle, len, _retArea.ptr); + Result!(WitList!(ubyte), StreamError) _result8 = void; + bool _isErr8 = (cast(uint)(*(cast(ubyte*)(_retArea.ptr + 0)))) != 0; + if (_isErr8) { + StreamError _variant5 = void; + auto _tag5 = cast(uint)(*(cast(ubyte*)(_retArea.ptr + size_t.sizeof))); + alias _Tag5 = StreamError.Tag; + final switch (cast(StreamError.Tag)_tag5) { + case _Tag5.lastOperationFailed: { + auto _payload6 = Error_(*(cast(uint*)(_retArea.ptr + (4+1*size_t.sizeof)))); + _variant5 = StreamError.lastOperationFailed(_payload6); + break; + } + case _Tag5.closed: { + _variant5 = StreamError.closed(); + break; + } + } + + _result8 = Result!(WitList!(ubyte), StreamError).err(_variant5); + } else { + auto _ptr1 = cast(ubyte*)(*(cast(void**)(_retArea.ptr + size_t.sizeof))); + auto _len1 = *(cast(size_t*)(_retArea.ptr + (2*size_t.sizeof))); + + _result8 = Result!(WitList!(ubyte), StreamError).ok(WitList!(ubyte)(_ptr1[0.._len1])); + } + auto _flush9 = _result8; + return _flush9; + } + /// ditto + @wasmImport!("wasi:io/streams@0.2.12", "[method]input-stream.read") + pragma(mangle, "__wit_import_wasi:io__streams@0.2.12__:method:input_stream.read") + static private extern(C) void __import_read(uint, ulong, void*) @nogc nothrow; + + /++ + + +/ + Result!(WitList!(ubyte), StreamError) blockingRead(ulong len) @nogc nothrow { + align(size_t.sizeof) void[(3*size_t.sizeof)] _retArea = void; + __import_blockingRead(this.__handle, len, _retArea.ptr); + Result!(WitList!(ubyte), StreamError) _result8 = void; + bool _isErr8 = (cast(uint)(*(cast(ubyte*)(_retArea.ptr + 0)))) != 0; + if (_isErr8) { + StreamError _variant5 = void; + auto _tag5 = cast(uint)(*(cast(ubyte*)(_retArea.ptr + size_t.sizeof))); + alias _Tag5 = StreamError.Tag; + final switch (cast(StreamError.Tag)_tag5) { + case _Tag5.lastOperationFailed: { + auto _payload6 = Error_(*(cast(uint*)(_retArea.ptr + (4+1*size_t.sizeof)))); + _variant5 = StreamError.lastOperationFailed(_payload6); + break; + } + case _Tag5.closed: { + _variant5 = StreamError.closed(); + break; + } + } + + _result8 = Result!(WitList!(ubyte), StreamError).err(_variant5); + } else { + auto _ptr1 = cast(ubyte*)(*(cast(void**)(_retArea.ptr + size_t.sizeof))); + auto _len1 = *(cast(size_t*)(_retArea.ptr + (2*size_t.sizeof))); + + _result8 = Result!(WitList!(ubyte), StreamError).ok(WitList!(ubyte)(_ptr1[0.._len1])); + } + auto _flush9 = _result8; + return _flush9; + } + /// ditto + @wasmImport!("wasi:io/streams@0.2.12", "[method]input-stream.blocking-read") + pragma(mangle, "__wit_import_wasi:io__streams@0.2.12__:method:input_stream.blocking_read") + static private extern(C) void __import_blockingRead(uint, ulong, void*) @nogc nothrow; + + /++ + + +/ + Result!(ulong, StreamError) skip(ulong len) @nogc nothrow { + align(8) void[16] _retArea = void; + __import_skip(this.__handle, len, _retArea.ptr); + Result!(ulong, StreamError) _result7 = void; + bool _isErr7 = (cast(uint)(*(cast(ubyte*)(_retArea.ptr + 0)))) != 0; + if (_isErr7) { + StreamError _variant4 = void; + auto _tag4 = cast(uint)(*(cast(ubyte*)(_retArea.ptr + 8))); + alias _Tag4 = StreamError.Tag; + final switch (cast(StreamError.Tag)_tag4) { + case _Tag4.lastOperationFailed: { + auto _payload5 = Error_(*(cast(uint*)(_retArea.ptr + 12))); + _variant4 = StreamError.lastOperationFailed(_payload5); + break; + } + case _Tag4.closed: { + _variant4 = StreamError.closed(); + break; + } + } + + _result7 = Result!(ulong, StreamError).err(_variant4); + } else { + + _result7 = Result!(ulong, StreamError).ok(*(cast(ulong*)(_retArea.ptr + 8))); + } + auto _flush8 = _result7; + return _flush8; + } + /// ditto + @wasmImport!("wasi:io/streams@0.2.12", "[method]input-stream.skip") + pragma(mangle, "__wit_import_wasi:io__streams@0.2.12__:method:input_stream.skip") + static private extern(C) void __import_skip(uint, ulong, void*) @nogc nothrow; + + /++ + + +/ + Result!(ulong, StreamError) blockingSkip(ulong len) @nogc nothrow { + align(8) void[16] _retArea = void; + __import_blockingSkip(this.__handle, len, _retArea.ptr); + Result!(ulong, StreamError) _result7 = void; + bool _isErr7 = (cast(uint)(*(cast(ubyte*)(_retArea.ptr + 0)))) != 0; + if (_isErr7) { + StreamError _variant4 = void; + auto _tag4 = cast(uint)(*(cast(ubyte*)(_retArea.ptr + 8))); + alias _Tag4 = StreamError.Tag; + final switch (cast(StreamError.Tag)_tag4) { + case _Tag4.lastOperationFailed: { + auto _payload5 = Error_(*(cast(uint*)(_retArea.ptr + 12))); + _variant4 = StreamError.lastOperationFailed(_payload5); + break; + } + case _Tag4.closed: { + _variant4 = StreamError.closed(); + break; + } + } + + _result7 = Result!(ulong, StreamError).err(_variant4); + } else { + + _result7 = Result!(ulong, StreamError).ok(*(cast(ulong*)(_retArea.ptr + 8))); + } + auto _flush8 = _result7; + return _flush8; + } + /// ditto + @wasmImport!("wasi:io/streams@0.2.12", "[method]input-stream.blocking-skip") + pragma(mangle, "__wit_import_wasi:io__streams@0.2.12__:method:input_stream.blocking_skip") + static private extern(C) void __import_blockingSkip(uint, ulong, void*) @nogc nothrow; + + /++ + + +/ + Pollable subscribe() @nogc nothrow { + auto _ret = __import_subscribe(this.__handle); + return Pollable(_ret); + } + /// ditto + @wasmImport!("wasi:io/streams@0.2.12", "[method]input-stream.subscribe") + pragma(mangle, "__wit_import_wasi:io__streams@0.2.12__:method:input_stream.subscribe") + static private extern(C) uint __import_subscribe(uint) @nogc nothrow; + } +} + +/++ + ++/ +struct OutputStream { + @nogc nothrow: + + package(core.sys.wasi.p2) uint __handle = 0; + + package(core.sys.wasi.p2) this(uint handle) { + __handle = handle; + } + + @disable this(); + + + void drop() { + __import_drop(__handle); + } + @wasmImport!("wasi:io/streams@0.2.12", "[resource-drop]output-stream") + pragma(mangle, "__wit_import_wasi:io__streams@0.2.12__:resource_drop:output_stream") + static private extern(C) void __import_drop(uint); + + alias witFree = drop; + // TODO: make RAII? disable copy for the own + + Borrow borrow() => Borrow(__handle); + alias borrow this; + + struct Borrow { + @nogc nothrow: + + package(core.sys.wasi.p2) uint __handle = 0; + + package(core.sys.wasi.p2) this(uint handle) { + __handle = handle; + } + + @disable this(); + + void witFree() {} + Borrow witClone() const { return Borrow(__handle); } + + /++ + + +/ + Result!(ulong, StreamError) checkWrite() @nogc nothrow { + align(8) void[16] _retArea = void; + __import_checkWrite(this.__handle, _retArea.ptr); + Result!(ulong, StreamError) _result7 = void; + bool _isErr7 = (cast(uint)(*(cast(ubyte*)(_retArea.ptr + 0)))) != 0; + if (_isErr7) { + StreamError _variant4 = void; + auto _tag4 = cast(uint)(*(cast(ubyte*)(_retArea.ptr + 8))); + alias _Tag4 = StreamError.Tag; + final switch (cast(StreamError.Tag)_tag4) { + case _Tag4.lastOperationFailed: { + auto _payload5 = Error_(*(cast(uint*)(_retArea.ptr + 12))); + _variant4 = StreamError.lastOperationFailed(_payload5); + break; + } + case _Tag4.closed: { + _variant4 = StreamError.closed(); + break; + } + } + + _result7 = Result!(ulong, StreamError).err(_variant4); + } else { + + _result7 = Result!(ulong, StreamError).ok(*(cast(ulong*)(_retArea.ptr + 8))); + } + auto _flush8 = _result7; + return _flush8; + } + /// ditto + @wasmImport!("wasi:io/streams@0.2.12", "[method]output-stream.check-write") + pragma(mangle, "__wit_import_wasi:io__streams@0.2.12__:method:output_stream.check_write") + static private extern(C) void __import_checkWrite(uint, void*) @nogc nothrow; + + /++ + + +/ + Result!(void, StreamError) write(in WitList!(ubyte) contents) @nogc nothrow { + align(4) void[12] _retArea = void; + __import_write(this.__handle, cast(void*)(contents.ptr), contents.length, _retArea.ptr); + Result!(void, StreamError) _result7 = void; + bool _isErr7 = (cast(uint)(*(cast(ubyte*)(_retArea.ptr + 0)))) != 0; + if (_isErr7) { + StreamError _variant4 = void; + auto _tag4 = cast(uint)(*(cast(ubyte*)(_retArea.ptr + 4))); + alias _Tag4 = StreamError.Tag; + final switch (cast(StreamError.Tag)_tag4) { + case _Tag4.lastOperationFailed: { + auto _payload5 = Error_(*(cast(uint*)(_retArea.ptr + 8))); + _variant4 = StreamError.lastOperationFailed(_payload5); + break; + } + case _Tag4.closed: { + _variant4 = StreamError.closed(); + break; + } + } + + _result7 = Result!(void, StreamError).err(_variant4); + } else { + + _result7 = Result!(void, StreamError).ok(); + } + auto _flush8 = _result7; + return _flush8; + } + /// ditto + @wasmImport!("wasi:io/streams@0.2.12", "[method]output-stream.write") + pragma(mangle, "__wit_import_wasi:io__streams@0.2.12__:method:output_stream.write") + static private extern(C) void __import_write(uint, void*, size_t, void*) @nogc nothrow; + + /++ + + +/ + Result!(void, StreamError) blockingWriteAndFlush(in WitList!(ubyte) contents) @nogc nothrow { + align(4) void[12] _retArea = void; + __import_blockingWriteAndFlush(this.__handle, cast(void*)(contents.ptr), contents.length, _retArea.ptr); + Result!(void, StreamError) _result7 = void; + bool _isErr7 = (cast(uint)(*(cast(ubyte*)(_retArea.ptr + 0)))) != 0; + if (_isErr7) { + StreamError _variant4 = void; + auto _tag4 = cast(uint)(*(cast(ubyte*)(_retArea.ptr + 4))); + alias _Tag4 = StreamError.Tag; + final switch (cast(StreamError.Tag)_tag4) { + case _Tag4.lastOperationFailed: { + auto _payload5 = Error_(*(cast(uint*)(_retArea.ptr + 8))); + _variant4 = StreamError.lastOperationFailed(_payload5); + break; + } + case _Tag4.closed: { + _variant4 = StreamError.closed(); + break; + } + } + + _result7 = Result!(void, StreamError).err(_variant4); + } else { + + _result7 = Result!(void, StreamError).ok(); + } + auto _flush8 = _result7; + return _flush8; + } + /// ditto + @wasmImport!("wasi:io/streams@0.2.12", "[method]output-stream.blocking-write-and-flush") + pragma(mangle, "__wit_import_wasi:io__streams@0.2.12__:method:output_stream.blocking_write_and_flush") + static private extern(C) void __import_blockingWriteAndFlush(uint, void*, size_t, void*) @nogc nothrow; + + /++ + + +/ + Result!(void, StreamError) flush() @nogc nothrow { + align(4) void[12] _retArea = void; + __import_flush(this.__handle, _retArea.ptr); + Result!(void, StreamError) _result7 = void; + bool _isErr7 = (cast(uint)(*(cast(ubyte*)(_retArea.ptr + 0)))) != 0; + if (_isErr7) { + StreamError _variant4 = void; + auto _tag4 = cast(uint)(*(cast(ubyte*)(_retArea.ptr + 4))); + alias _Tag4 = StreamError.Tag; + final switch (cast(StreamError.Tag)_tag4) { + case _Tag4.lastOperationFailed: { + auto _payload5 = Error_(*(cast(uint*)(_retArea.ptr + 8))); + _variant4 = StreamError.lastOperationFailed(_payload5); + break; + } + case _Tag4.closed: { + _variant4 = StreamError.closed(); + break; + } + } + + _result7 = Result!(void, StreamError).err(_variant4); + } else { + + _result7 = Result!(void, StreamError).ok(); + } + auto _flush8 = _result7; + return _flush8; + } + /// ditto + @wasmImport!("wasi:io/streams@0.2.12", "[method]output-stream.flush") + pragma(mangle, "__wit_import_wasi:io__streams@0.2.12__:method:output_stream.flush") + static private extern(C) void __import_flush(uint, void*) @nogc nothrow; + + /++ + + +/ + Result!(void, StreamError) blockingFlush() @nogc nothrow { + align(4) void[12] _retArea = void; + __import_blockingFlush(this.__handle, _retArea.ptr); + Result!(void, StreamError) _result7 = void; + bool _isErr7 = (cast(uint)(*(cast(ubyte*)(_retArea.ptr + 0)))) != 0; + if (_isErr7) { + StreamError _variant4 = void; + auto _tag4 = cast(uint)(*(cast(ubyte*)(_retArea.ptr + 4))); + alias _Tag4 = StreamError.Tag; + final switch (cast(StreamError.Tag)_tag4) { + case _Tag4.lastOperationFailed: { + auto _payload5 = Error_(*(cast(uint*)(_retArea.ptr + 8))); + _variant4 = StreamError.lastOperationFailed(_payload5); + break; + } + case _Tag4.closed: { + _variant4 = StreamError.closed(); + break; + } + } + + _result7 = Result!(void, StreamError).err(_variant4); + } else { + + _result7 = Result!(void, StreamError).ok(); + } + auto _flush8 = _result7; + return _flush8; + } + /// ditto + @wasmImport!("wasi:io/streams@0.2.12", "[method]output-stream.blocking-flush") + pragma(mangle, "__wit_import_wasi:io__streams@0.2.12__:method:output_stream.blocking_flush") + static private extern(C) void __import_blockingFlush(uint, void*) @nogc nothrow; + + /++ + + +/ + Pollable subscribe() @nogc nothrow { + auto _ret = __import_subscribe(this.__handle); + return Pollable(_ret); + } + /// ditto + @wasmImport!("wasi:io/streams@0.2.12", "[method]output-stream.subscribe") + pragma(mangle, "__wit_import_wasi:io__streams@0.2.12__:method:output_stream.subscribe") + static private extern(C) uint __import_subscribe(uint) @nogc nothrow; + + /++ + + +/ + Result!(void, StreamError) writeZeroes(ulong len) @nogc nothrow { + align(4) void[12] _retArea = void; + __import_writeZeroes(this.__handle, len, _retArea.ptr); + Result!(void, StreamError) _result7 = void; + bool _isErr7 = (cast(uint)(*(cast(ubyte*)(_retArea.ptr + 0)))) != 0; + if (_isErr7) { + StreamError _variant4 = void; + auto _tag4 = cast(uint)(*(cast(ubyte*)(_retArea.ptr + 4))); + alias _Tag4 = StreamError.Tag; + final switch (cast(StreamError.Tag)_tag4) { + case _Tag4.lastOperationFailed: { + auto _payload5 = Error_(*(cast(uint*)(_retArea.ptr + 8))); + _variant4 = StreamError.lastOperationFailed(_payload5); + break; + } + case _Tag4.closed: { + _variant4 = StreamError.closed(); + break; + } + } + + _result7 = Result!(void, StreamError).err(_variant4); + } else { + + _result7 = Result!(void, StreamError).ok(); + } + auto _flush8 = _result7; + return _flush8; + } + /// ditto + @wasmImport!("wasi:io/streams@0.2.12", "[method]output-stream.write-zeroes") + pragma(mangle, "__wit_import_wasi:io__streams@0.2.12__:method:output_stream.write_zeroes") + static private extern(C) void __import_writeZeroes(uint, ulong, void*) @nogc nothrow; + + /++ + + +/ + Result!(void, StreamError) blockingWriteZeroesAndFlush(ulong len) @nogc nothrow { + align(4) void[12] _retArea = void; + __import_blockingWriteZeroesAndFlush(this.__handle, len, _retArea.ptr); + Result!(void, StreamError) _result7 = void; + bool _isErr7 = (cast(uint)(*(cast(ubyte*)(_retArea.ptr + 0)))) != 0; + if (_isErr7) { + StreamError _variant4 = void; + auto _tag4 = cast(uint)(*(cast(ubyte*)(_retArea.ptr + 4))); + alias _Tag4 = StreamError.Tag; + final switch (cast(StreamError.Tag)_tag4) { + case _Tag4.lastOperationFailed: { + auto _payload5 = Error_(*(cast(uint*)(_retArea.ptr + 8))); + _variant4 = StreamError.lastOperationFailed(_payload5); + break; + } + case _Tag4.closed: { + _variant4 = StreamError.closed(); + break; + } + } + + _result7 = Result!(void, StreamError).err(_variant4); + } else { + + _result7 = Result!(void, StreamError).ok(); + } + auto _flush8 = _result7; + return _flush8; + } + /// ditto + @wasmImport!("wasi:io/streams@0.2.12", "[method]output-stream.blocking-write-zeroes-and-flush") + pragma(mangle, "__wit_import_wasi:io__streams@0.2.12__:method:output_stream.blocking_write_zeroes_and_flush") + static private extern(C) void __import_blockingWriteZeroesAndFlush(uint, ulong, void*) @nogc nothrow; + + /++ + + +/ + Result!(ulong, StreamError) splice(in InputStream.Borrow src, ulong len) @nogc nothrow { + align(8) void[16] _retArea = void; + __import_splice(this.__handle, src.__handle, len, _retArea.ptr); + Result!(ulong, StreamError) _result7 = void; + bool _isErr7 = (cast(uint)(*(cast(ubyte*)(_retArea.ptr + 0)))) != 0; + if (_isErr7) { + StreamError _variant4 = void; + auto _tag4 = cast(uint)(*(cast(ubyte*)(_retArea.ptr + 8))); + alias _Tag4 = StreamError.Tag; + final switch (cast(StreamError.Tag)_tag4) { + case _Tag4.lastOperationFailed: { + auto _payload5 = Error_(*(cast(uint*)(_retArea.ptr + 12))); + _variant4 = StreamError.lastOperationFailed(_payload5); + break; + } + case _Tag4.closed: { + _variant4 = StreamError.closed(); + break; + } + } + + _result7 = Result!(ulong, StreamError).err(_variant4); + } else { + + _result7 = Result!(ulong, StreamError).ok(*(cast(ulong*)(_retArea.ptr + 8))); + } + auto _flush8 = _result7; + return _flush8; + } + /// ditto + @wasmImport!("wasi:io/streams@0.2.12", "[method]output-stream.splice") + pragma(mangle, "__wit_import_wasi:io__streams@0.2.12__:method:output_stream.splice") + static private extern(C) void __import_splice(uint, uint, ulong, void*) @nogc nothrow; + + /++ + + +/ + Result!(ulong, StreamError) blockingSplice(in InputStream.Borrow src, ulong len) @nogc nothrow { + align(8) void[16] _retArea = void; + __import_blockingSplice(this.__handle, src.__handle, len, _retArea.ptr); + Result!(ulong, StreamError) _result7 = void; + bool _isErr7 = (cast(uint)(*(cast(ubyte*)(_retArea.ptr + 0)))) != 0; + if (_isErr7) { + StreamError _variant4 = void; + auto _tag4 = cast(uint)(*(cast(ubyte*)(_retArea.ptr + 8))); + alias _Tag4 = StreamError.Tag; + final switch (cast(StreamError.Tag)_tag4) { + case _Tag4.lastOperationFailed: { + auto _payload5 = Error_(*(cast(uint*)(_retArea.ptr + 12))); + _variant4 = StreamError.lastOperationFailed(_payload5); + break; + } + case _Tag4.closed: { + _variant4 = StreamError.closed(); + break; + } + } + + _result7 = Result!(ulong, StreamError).err(_variant4); + } else { + + _result7 = Result!(ulong, StreamError).ok(*(cast(ulong*)(_retArea.ptr + 8))); + } + auto _flush8 = _result7; + return _flush8; + } + /// ditto + @wasmImport!("wasi:io/streams@0.2.12", "[method]output-stream.blocking-splice") + pragma(mangle, "__wit_import_wasi:io__streams@0.2.12__:method:output_stream.blocking_splice") + static private extern(C) void __import_blockingSplice(uint, uint, ulong, void*) @nogc nothrow; + } +} diff --git a/druntime/src/core/sys/wasi/p2/random/insecure/common.d b/druntime/src/core/sys/wasi/p2/random/insecure/common.d new file mode 100644 index 000000000000..14017453c348 --- /dev/null +++ b/druntime/src/core/sys/wasi/p2/random/insecure/common.d @@ -0,0 +1,9 @@ +/++ + ++/ +module core.sys.wasi.p2.random.insecure.common; + +import core.sys.wasi.wit_common; + + +package (core.sys.wasi.p2) void __wit_bindgen_component_type_force_link() pure @nogc nothrow => imported!"core.sys.wasi.p2.cli.imports".__wit_bindgen_component_type_force_link(); diff --git a/druntime/src/core/sys/wasi/p2/random/insecure/imports.d b/druntime/src/core/sys/wasi/p2/random/insecure/imports.d new file mode 100644 index 000000000000..7320372a633a --- /dev/null +++ b/druntime/src/core/sys/wasi/p2/random/insecure/imports.d @@ -0,0 +1,39 @@ +/++ + ++/ +module core.sys.wasi.p2.random.insecure.imports; + +import core.sys.wasi.wit_common; + +public import core.sys.wasi.p2.random.insecure.common; + + +package (core.sys.wasi.p2) void __wit_bindgen_component_type_force_link() pure @nogc nothrow => imported!"core.sys.wasi.p2.cli.imports".__wit_bindgen_component_type_force_link(); + +/++ + ++/ +WitList!(ubyte) getInsecureRandomBytes(ulong len) @nogc nothrow { + align(size_t.sizeof) void[(2*size_t.sizeof)] _retArea = void; + __import_getInsecureRandomBytes(len, _retArea.ptr); + auto _ptr0 = cast(ubyte*)(*(cast(void**)(_retArea.ptr + 0))); + auto _len0 = *(cast(size_t*)(_retArea.ptr + size_t.sizeof)); + auto _flush1 = WitList!(ubyte)(_ptr0[0.._len0]); + return _flush1; +} +/// ditto +@wasmImport!("wasi:random/insecure@0.2.12", "get-insecure-random-bytes") +pragma(mangle, "__wit_import_wasi:random__insecure@0.2.12__get_insecure_random_bytes") +private extern(C) void __import_getInsecureRandomBytes(ulong, void*) @nogc nothrow; + +/++ + ++/ +ulong getInsecureRandomU64() @nogc nothrow { + auto _ret = __import_getInsecureRandomU64(); + return _ret; +} +/// ditto +@wasmImport!("wasi:random/insecure@0.2.12", "get-insecure-random-u64") +pragma(mangle, "__wit_import_wasi:random__insecure@0.2.12__get_insecure_random_u64") +private extern(C) ulong __import_getInsecureRandomU64() @nogc nothrow; diff --git a/druntime/src/core/sys/wasi/p2/random/insecure_seed/common.d b/druntime/src/core/sys/wasi/p2/random/insecure_seed/common.d new file mode 100644 index 000000000000..4af6d6c834c2 --- /dev/null +++ b/druntime/src/core/sys/wasi/p2/random/insecure_seed/common.d @@ -0,0 +1,9 @@ +/++ + ++/ +module core.sys.wasi.p2.random.insecure_seed.common; + +import core.sys.wasi.wit_common; + + +package (core.sys.wasi.p2) void __wit_bindgen_component_type_force_link() pure @nogc nothrow => imported!"core.sys.wasi.p2.cli.imports".__wit_bindgen_component_type_force_link(); diff --git a/druntime/src/core/sys/wasi/p2/random/insecure_seed/imports.d b/druntime/src/core/sys/wasi/p2/random/insecure_seed/imports.d new file mode 100644 index 000000000000..0ec6d81f6247 --- /dev/null +++ b/druntime/src/core/sys/wasi/p2/random/insecure_seed/imports.d @@ -0,0 +1,29 @@ +/++ + ++/ +module core.sys.wasi.p2.random.insecure_seed.imports; + +import core.sys.wasi.wit_common; + +public import core.sys.wasi.p2.random.insecure_seed.common; + + +package (core.sys.wasi.p2) void __wit_bindgen_component_type_force_link() pure @nogc nothrow => imported!"core.sys.wasi.p2.cli.imports".__wit_bindgen_component_type_force_link(); + +/++ + ++/ +Tuple!(ulong, ulong) insecureSeed() @nogc nothrow { + align(8) void[16] _retArea = void; + __import_insecureSeed(_retArea.ptr); + auto _tuple0 = Tuple!(ulong, ulong)( + *(cast(ulong*)(_retArea.ptr + 0)), + *(cast(ulong*)(_retArea.ptr + 8)), + ); + auto _flush1 = _tuple0; + return _flush1; +} +/// ditto +@wasmImport!("wasi:random/insecure-seed@0.2.12", "insecure-seed") +pragma(mangle, "__wit_import_wasi:random__insecure_seed@0.2.12__insecure_seed") +private extern(C) void __import_insecureSeed(void*) @nogc nothrow; diff --git a/druntime/src/core/sys/wasi/p2/random/random/common.d b/druntime/src/core/sys/wasi/p2/random/random/common.d new file mode 100644 index 000000000000..a333d0ae362d --- /dev/null +++ b/druntime/src/core/sys/wasi/p2/random/random/common.d @@ -0,0 +1,9 @@ +/++ + ++/ +module core.sys.wasi.p2.random.random.common; + +import core.sys.wasi.wit_common; + + +package (core.sys.wasi.p2) void __wit_bindgen_component_type_force_link() pure @nogc nothrow => imported!"core.sys.wasi.p2.cli.imports".__wit_bindgen_component_type_force_link(); diff --git a/druntime/src/core/sys/wasi/p2/random/random/imports.d b/druntime/src/core/sys/wasi/p2/random/random/imports.d new file mode 100644 index 000000000000..0a11cb22ee86 --- /dev/null +++ b/druntime/src/core/sys/wasi/p2/random/random/imports.d @@ -0,0 +1,39 @@ +/++ + ++/ +module core.sys.wasi.p2.random.random.imports; + +import core.sys.wasi.wit_common; + +public import core.sys.wasi.p2.random.random.common; + + +package (core.sys.wasi.p2) void __wit_bindgen_component_type_force_link() pure @nogc nothrow => imported!"core.sys.wasi.p2.cli.imports".__wit_bindgen_component_type_force_link(); + +/++ + ++/ +WitList!(ubyte) getRandomBytes(ulong len) @nogc nothrow { + align(size_t.sizeof) void[(2*size_t.sizeof)] _retArea = void; + __import_getRandomBytes(len, _retArea.ptr); + auto _ptr0 = cast(ubyte*)(*(cast(void**)(_retArea.ptr + 0))); + auto _len0 = *(cast(size_t*)(_retArea.ptr + size_t.sizeof)); + auto _flush1 = WitList!(ubyte)(_ptr0[0.._len0]); + return _flush1; +} +/// ditto +@wasmImport!("wasi:random/random@0.2.12", "get-random-bytes") +pragma(mangle, "__wit_import_wasi:random__random@0.2.12__get_random_bytes") +private extern(C) void __import_getRandomBytes(ulong, void*) @nogc nothrow; + +/++ + ++/ +ulong getRandomU64() @nogc nothrow { + auto _ret = __import_getRandomU64(); + return _ret; +} +/// ditto +@wasmImport!("wasi:random/random@0.2.12", "get-random-u64") +pragma(mangle, "__wit_import_wasi:random__random@0.2.12__get_random_u64") +private extern(C) ulong __import_getRandomU64() @nogc nothrow; diff --git a/druntime/src/core/sys/wasi/p2/sockets/instance_network/common.d b/druntime/src/core/sys/wasi/p2/sockets/instance_network/common.d new file mode 100644 index 000000000000..f2c2a89f3220 --- /dev/null +++ b/druntime/src/core/sys/wasi/p2/sockets/instance_network/common.d @@ -0,0 +1,10 @@ +/++ + ++/ +module core.sys.wasi.p2.sockets.instance_network.common; + +import core.sys.wasi.wit_common; + +static import core.sys.wasi.p2.sockets.network.common; + +package (core.sys.wasi.p2) void __wit_bindgen_component_type_force_link() pure @nogc nothrow => imported!"core.sys.wasi.p2.cli.imports".__wit_bindgen_component_type_force_link(); diff --git a/druntime/src/core/sys/wasi/p2/sockets/instance_network/imports.d b/druntime/src/core/sys/wasi/p2/sockets/instance_network/imports.d new file mode 100644 index 000000000000..c243f47ccf89 --- /dev/null +++ b/druntime/src/core/sys/wasi/p2/sockets/instance_network/imports.d @@ -0,0 +1,29 @@ +/++ + ++/ +module core.sys.wasi.p2.sockets.instance_network.imports; + +import core.sys.wasi.wit_common; + +public import core.sys.wasi.p2.sockets.instance_network.common; + +static import core.sys.wasi.p2.sockets.network.imports; + +package (core.sys.wasi.p2) void __wit_bindgen_component_type_force_link() pure @nogc nothrow => imported!"core.sys.wasi.p2.cli.imports".__wit_bindgen_component_type_force_link(); + +/++ + ++/ +alias Network = core.sys.wasi.p2.sockets.network.imports.Network; + +/++ + ++/ +Network instanceNetwork() @nogc nothrow { + auto _ret = __import_instanceNetwork(); + return Network(_ret); +} +/// ditto +@wasmImport!("wasi:sockets/instance-network@0.2.12", "instance-network") +pragma(mangle, "__wit_import_wasi:sockets__instance_network@0.2.12__instance_network") +private extern(C) uint __import_instanceNetwork() @nogc nothrow; diff --git a/druntime/src/core/sys/wasi/p2/sockets/ip_name_lookup/common.d b/druntime/src/core/sys/wasi/p2/sockets/ip_name_lookup/common.d new file mode 100644 index 000000000000..01ca4ecb6e06 --- /dev/null +++ b/druntime/src/core/sys/wasi/p2/sockets/ip_name_lookup/common.d @@ -0,0 +1,21 @@ +/++ + ++/ +module core.sys.wasi.p2.sockets.ip_name_lookup.common; + +import core.sys.wasi.wit_common; + +static import core.sys.wasi.p2.io.poll.common; +static import core.sys.wasi.p2.sockets.network.common; + +package (core.sys.wasi.p2) void __wit_bindgen_component_type_force_link() pure @nogc nothrow => imported!"core.sys.wasi.p2.cli.imports".__wit_bindgen_component_type_force_link(); + +/++ + ++/ +alias ErrorCode = core.sys.wasi.p2.sockets.network.common.ErrorCode; + +/++ + ++/ +alias IpAddress = core.sys.wasi.p2.sockets.network.common.IpAddress; diff --git a/druntime/src/core/sys/wasi/p2/sockets/ip_name_lookup/imports.d b/druntime/src/core/sys/wasi/p2/sockets/ip_name_lookup/imports.d new file mode 100644 index 000000000000..12593eae19e4 --- /dev/null +++ b/druntime/src/core/sys/wasi/p2/sockets/ip_name_lookup/imports.d @@ -0,0 +1,164 @@ +/++ + ++/ +module core.sys.wasi.p2.sockets.ip_name_lookup.imports; + +import core.sys.wasi.wit_common; + +public import core.sys.wasi.p2.sockets.ip_name_lookup.common; + +static import core.sys.wasi.p2.io.poll.imports; +static import core.sys.wasi.p2.sockets.network.imports; + +package (core.sys.wasi.p2) void __wit_bindgen_component_type_force_link() pure @nogc nothrow => imported!"core.sys.wasi.p2.cli.imports".__wit_bindgen_component_type_force_link(); + +/++ + ++/ +alias Pollable = core.sys.wasi.p2.io.poll.imports.Pollable; + +/++ + ++/ +alias Network = core.sys.wasi.p2.sockets.network.imports.Network; + +/++ + ++/ +struct ResolveAddressStream { + @nogc nothrow: + + package(core.sys.wasi.p2) uint __handle = 0; + + package(core.sys.wasi.p2) this(uint handle) { + __handle = handle; + } + + @disable this(); + + + void drop() { + __import_drop(__handle); + } + @wasmImport!("wasi:sockets/ip-name-lookup@0.2.12", "[resource-drop]resolve-address-stream") + pragma(mangle, "__wit_import_wasi:sockets__ip_name_lookup@0.2.12__:resource_drop:resolve_address_stream") + static private extern(C) void __import_drop(uint); + + alias witFree = drop; + // TODO: make RAII? disable copy for the own + + Borrow borrow() => Borrow(__handle); + alias borrow this; + + struct Borrow { + @nogc nothrow: + + package(core.sys.wasi.p2) uint __handle = 0; + + package(core.sys.wasi.p2) this(uint handle) { + __handle = handle; + } + + @disable this(); + + void witFree() {} + Borrow witClone() const { return Borrow(__handle); } + + /++ + + +/ + Result!(Option!(IpAddress), ErrorCode) resolveNextAddress() @nogc nothrow { + align(2) void[22] _retArea = void; + __import_resolveNextAddress(this.__handle, _retArea.ptr); + Result!(Option!(IpAddress), ErrorCode) _result12 = void; + bool _isErr12 = (cast(uint)(*(cast(ubyte*)(_retArea.ptr + 0)))) != 0; + if (_isErr12) { + + _result12 = Result!(Option!(IpAddress), ErrorCode).err(cast(core.sys.wasi.p2.sockets.network.imports.ErrorCode)(cast(uint)(*(cast(ubyte*)(_retArea.ptr + 2))))); + } else { + Option!(IpAddress) _option10 = void; + bool _isSome10 = (cast(uint)(*(cast(ubyte*)(_retArea.ptr + 2)))) != 0; + if (_isSome10) { + core.sys.wasi.p2.sockets.network.imports.IpAddress _variant7 = void; + auto _tag7 = cast(uint)(*(cast(ubyte*)(_retArea.ptr + 4))); + alias _Tag7 = core.sys.wasi.p2.sockets.network.imports.IpAddress.Tag; + final switch (cast(core.sys.wasi.p2.sockets.network.imports.IpAddress.Tag)_tag7) { + case _Tag7.ipv4: { + auto _tuple4 = core.sys.wasi.p2.sockets.network.imports.Ipv4Address( + cast(ubyte)(cast(uint)(*(cast(ubyte*)(_retArea.ptr + 6)))), + cast(ubyte)(cast(uint)(*(cast(ubyte*)(_retArea.ptr + 7)))), + cast(ubyte)(cast(uint)(*(cast(ubyte*)(_retArea.ptr + 8)))), + cast(ubyte)(cast(uint)(*(cast(ubyte*)(_retArea.ptr + 9)))), + ); + auto _payload8 = _tuple4; + _variant7 = core.sys.wasi.p2.sockets.network.imports.IpAddress.ipv4(_payload8); + break; + } + case _Tag7.ipv6: { + auto _tuple6 = core.sys.wasi.p2.sockets.network.imports.Ipv6Address( + cast(ushort)(cast(uint)(*(cast(ushort*)(_retArea.ptr + 6)))), + cast(ushort)(cast(uint)(*(cast(ushort*)(_retArea.ptr + 8)))), + cast(ushort)(cast(uint)(*(cast(ushort*)(_retArea.ptr + 10)))), + cast(ushort)(cast(uint)(*(cast(ushort*)(_retArea.ptr + 12)))), + cast(ushort)(cast(uint)(*(cast(ushort*)(_retArea.ptr + 14)))), + cast(ushort)(cast(uint)(*(cast(ushort*)(_retArea.ptr + 16)))), + cast(ushort)(cast(uint)(*(cast(ushort*)(_retArea.ptr + 18)))), + cast(ushort)(cast(uint)(*(cast(ushort*)(_retArea.ptr + 20)))), + ); + auto _payload9 = _tuple6; + _variant7 = core.sys.wasi.p2.sockets.network.imports.IpAddress.ipv6(_payload9); + break; + } + } + + _option10 = Option!(IpAddress).some(_variant7); + } else { + _option10 = Option!(IpAddress).none; + } + + _result12 = Result!(Option!(IpAddress), ErrorCode).ok(_option10); + } + auto _flush13 = _result12; + return _flush13; + } + /// ditto + @wasmImport!("wasi:sockets/ip-name-lookup@0.2.12", "[method]resolve-address-stream.resolve-next-address") + pragma(mangle, "__wit_import_wasi:sockets__ip_name_lookup@0.2.12__:method:resolve_address_stream.resolve_next_address") + static private extern(C) void __import_resolveNextAddress(uint, void*) @nogc nothrow; + + /++ + + +/ + Pollable subscribe() @nogc nothrow { + auto _ret = __import_subscribe(this.__handle); + return Pollable(_ret); + } + /// ditto + @wasmImport!("wasi:sockets/ip-name-lookup@0.2.12", "[method]resolve-address-stream.subscribe") + pragma(mangle, "__wit_import_wasi:sockets__ip_name_lookup@0.2.12__:method:resolve_address_stream.subscribe") + static private extern(C) uint __import_subscribe(uint) @nogc nothrow; + } +} + +/++ + ++/ +Result!(ResolveAddressStream, ErrorCode) resolveAddresses(in Network.Borrow network, in WitString name) @nogc nothrow { + align(4) void[8] _retArea = void; + __import_resolveAddresses(network.__handle, cast(void*)(name.ptr), name.length, _retArea.ptr); + Result!(ResolveAddressStream, ErrorCode) _result2 = void; + bool _isErr2 = (cast(uint)(*(cast(ubyte*)(_retArea.ptr + 0)))) != 0; + if (_isErr2) { + + _result2 = Result!(ResolveAddressStream, ErrorCode).err(cast(core.sys.wasi.p2.sockets.network.imports.ErrorCode)(cast(uint)(*(cast(ubyte*)(_retArea.ptr + 4))))); + } else { + + _result2 = Result!(ResolveAddressStream, ErrorCode).ok(ResolveAddressStream(*(cast(uint*)(_retArea.ptr + 4)))); + } + auto _flush3 = _result2; + return _flush3; +} +/// ditto +@wasmImport!("wasi:sockets/ip-name-lookup@0.2.12", "resolve-addresses") +pragma(mangle, "__wit_import_wasi:sockets__ip_name_lookup@0.2.12__resolve_addresses") +private extern(C) void __import_resolveAddresses(uint, void*, size_t, void*) @nogc nothrow; diff --git a/druntime/src/core/sys/wasi/p2/sockets/network/common.d b/druntime/src/core/sys/wasi/p2/sockets/network/common.d new file mode 100644 index 000000000000..ecc97289d3bb --- /dev/null +++ b/druntime/src/core/sys/wasi/p2/sockets/network/common.d @@ -0,0 +1,307 @@ +/++ + ++/ +module core.sys.wasi.p2.sockets.network.common; + +import core.sys.wasi.wit_common; + +static import core.sys.wasi.p2.io.error.common; + +package (core.sys.wasi.p2) void __wit_bindgen_component_type_force_link() pure @nogc nothrow => imported!"core.sys.wasi.p2.cli.imports".__wit_bindgen_component_type_force_link(); + +/++ + ++/ +enum ErrorCode : ubyte { + /++ + + +/ + unknown, + + /++ + + +/ + accessDenied, + + /++ + + +/ + notSupported, + + /++ + + +/ + invalidArgument, + + /++ + + +/ + outOfMemory, + + /++ + + +/ + timeout, + + /++ + + +/ + concurrencyConflict, + + /++ + + +/ + notInProgress, + + /++ + + +/ + wouldBlock, + + /++ + + +/ + invalidState, + + /++ + + +/ + newSocketLimit, + + /++ + + +/ + addressNotBindable, + + /++ + + +/ + addressInUse, + + /++ + + +/ + remoteUnreachable, + + /++ + + +/ + connectionRefused, + + /++ + + +/ + connectionReset, + + /++ + + +/ + connectionAborted, + + /++ + + +/ + datagramTooLarge, + + /++ + + +/ + nameUnresolvable, + + /++ + + +/ + temporaryResolverFailure, + + /++ + + +/ + permanentResolverFailure, +} +/++ + ++/ +enum IpAddressFamily : ubyte { + /++ + + +/ + ipv4, + + /++ + + +/ + ipv6, +} +/++ + ++/ +alias Ipv4Address = Tuple!(ubyte, ubyte, ubyte, ubyte); +/++ + ++/ +alias Ipv6Address = Tuple!(ushort, ushort, ushort, ushort, ushort, ushort, ushort, ushort); +/++ + ++/ +struct IpAddress { + mixin WitVariant!( + Ipv4Address, // ipv4 + Ipv6Address, // ipv6 + ); + +public: + enum Tag : ubyte { + /++ + + +/ + ipv4, + + /++ + + +/ + ipv6, + } + Tag tag() const @safe @nogc nothrow pure => _tag; + + /++ + + +/ + alias ipv4 = _create!(Tag.ipv4); + /// ditto + bool isIpv4() const => _tag == Tag.ipv4; + ///ditto + alias getIpv4 = _get!(Tag.ipv4); + + /++ + + +/ + alias ipv6 = _create!(Tag.ipv6); + /// ditto + bool isIpv6() const => _tag == Tag.ipv6; + ///ditto + alias getIpv6 = _get!(Tag.ipv6); + + void witFree() @nogc nothrow { + } + + IpAddress witClone() const @nogc nothrow { + final switch (_tag) { + case Tag.ipv4: return _create!(Tag.ipv4)(this._get!(Tag.ipv4).witClone); break; + case Tag.ipv6: return _create!(Tag.ipv6)(this._get!(Tag.ipv6).witClone); break; + } + } +} + +/++ + ++/ +struct Ipv4SocketAddress { + /++ + + +/ + ushort port; + + /++ + + +/ + Ipv4Address address; + + void witFree() @nogc nothrow { + } + + Ipv4SocketAddress witClone() const @nogc nothrow { + Ipv4SocketAddress clone = void; + clone.port = this.port.witClone; + clone.address = this.address.witClone; + return clone; + } +} + +/++ + ++/ +struct Ipv6SocketAddress { + /++ + + +/ + ushort port; + + /++ + + +/ + uint flowInfo; + + /++ + + +/ + Ipv6Address address; + + /++ + + +/ + uint scopeId; + + void witFree() @nogc nothrow { + } + + Ipv6SocketAddress witClone() const @nogc nothrow { + Ipv6SocketAddress clone = void; + clone.port = this.port.witClone; + clone.flowInfo = this.flowInfo.witClone; + clone.address = this.address.witClone; + clone.scopeId = this.scopeId.witClone; + return clone; + } +} + +/++ + ++/ +struct IpSocketAddress { + mixin WitVariant!( + Ipv4SocketAddress, // ipv4 + Ipv6SocketAddress, // ipv6 + ); + +public: + enum Tag : ubyte { + /++ + + +/ + ipv4, + + /++ + + +/ + ipv6, + } + Tag tag() const @safe @nogc nothrow pure => _tag; + + /++ + + +/ + alias ipv4 = _create!(Tag.ipv4); + /// ditto + bool isIpv4() const => _tag == Tag.ipv4; + ///ditto + alias getIpv4 = _get!(Tag.ipv4); + + /++ + + +/ + alias ipv6 = _create!(Tag.ipv6); + /// ditto + bool isIpv6() const => _tag == Tag.ipv6; + ///ditto + alias getIpv6 = _get!(Tag.ipv6); + + void witFree() @nogc nothrow { + } + + IpSocketAddress witClone() const @nogc nothrow { + final switch (_tag) { + case Tag.ipv4: return _create!(Tag.ipv4)(this._get!(Tag.ipv4).witClone); break; + case Tag.ipv6: return _create!(Tag.ipv6)(this._get!(Tag.ipv6).witClone); break; + } + } +} diff --git a/druntime/src/core/sys/wasi/p2/sockets/network/imports.d b/druntime/src/core/sys/wasi/p2/sockets/network/imports.d new file mode 100644 index 000000000000..08535327bde0 --- /dev/null +++ b/druntime/src/core/sys/wasi/p2/sockets/network/imports.d @@ -0,0 +1,83 @@ +/++ + ++/ +module core.sys.wasi.p2.sockets.network.imports; + +import core.sys.wasi.wit_common; + +public import core.sys.wasi.p2.sockets.network.common; + +static import core.sys.wasi.p2.io.error.imports; + +package (core.sys.wasi.p2) void __wit_bindgen_component_type_force_link() pure @nogc nothrow => imported!"core.sys.wasi.p2.cli.imports".__wit_bindgen_component_type_force_link(); + +/++ + ++/ +alias Error_ = core.sys.wasi.p2.io.error.imports.Error_; + +/++ + ++/ +struct Network { + @nogc nothrow: + + package(core.sys.wasi.p2) uint __handle = 0; + + package(core.sys.wasi.p2) this(uint handle) { + __handle = handle; + } + + @disable this(); + + + void drop() { + __import_drop(__handle); + } + @wasmImport!("wasi:sockets/network@0.2.12", "[resource-drop]network") + pragma(mangle, "__wit_import_wasi:sockets__network@0.2.12__:resource_drop:network") + static private extern(C) void __import_drop(uint); + + alias witFree = drop; + // TODO: make RAII? disable copy for the own + + Borrow borrow() => Borrow(__handle); + alias borrow this; + + struct Borrow { + @nogc nothrow: + + package(core.sys.wasi.p2) uint __handle = 0; + + package(core.sys.wasi.p2) this(uint handle) { + __handle = handle; + } + + @disable this(); + + void witFree() {} + Borrow witClone() const { return Borrow(__handle); } + } +} + +/++ + ++/ +Option!(ErrorCode) networkErrorCode(in Error_.Borrow err) @nogc nothrow { + align(1) void[2] _retArea = void; + __import_networkErrorCode(err.__handle, _retArea.ptr); + Option!(ErrorCode) _option2 = void; + bool _isSome2 = (cast(uint)(*(cast(ubyte*)(_retArea.ptr + 0)))) != 0; + if (_isSome2) { + + _option2 = Option!(ErrorCode).some(cast(ErrorCode)(cast(uint)(*(cast(ubyte*)(_retArea.ptr + 1))))); + } else { + _option2 = Option!(ErrorCode).none; + } + auto _flush3 = _option2; + return _flush3; +} +/// ditto +@wasmImport!("wasi:sockets/network@0.2.12", "network-error-code") +pragma(mangle, "__wit_import_wasi:sockets__network@0.2.12__network_error_code") +private extern(C) void __import_networkErrorCode(uint, void*) @nogc nothrow; diff --git a/druntime/src/core/sys/wasi/p2/sockets/tcp/common.d b/druntime/src/core/sys/wasi/p2/sockets/tcp/common.d new file mode 100644 index 000000000000..244dad406594 --- /dev/null +++ b/druntime/src/core/sys/wasi/p2/sockets/tcp/common.d @@ -0,0 +1,53 @@ +/++ + ++/ +module core.sys.wasi.p2.sockets.tcp.common; + +import core.sys.wasi.wit_common; + +static import core.sys.wasi.p2.io.poll.common; +static import core.sys.wasi.p2.io.streams.common; +static import core.sys.wasi.p2.clocks.monotonic_clock.common; +static import core.sys.wasi.p2.sockets.network.common; + +package (core.sys.wasi.p2) void __wit_bindgen_component_type_force_link() pure @nogc nothrow => imported!"core.sys.wasi.p2.cli.imports".__wit_bindgen_component_type_force_link(); + +/++ + ++/ +alias Duration = core.sys.wasi.p2.clocks.monotonic_clock.common.Duration; + +/++ + ++/ +alias ErrorCode = core.sys.wasi.p2.sockets.network.common.ErrorCode; + +/++ + ++/ +alias IpSocketAddress = core.sys.wasi.p2.sockets.network.common.IpSocketAddress; + +/++ + ++/ +alias IpAddressFamily = core.sys.wasi.p2.sockets.network.common.IpAddressFamily; + +/++ + ++/ +enum ShutdownType : ubyte { + /++ + + +/ + receive, + + /++ + + +/ + send, + + /++ + + +/ + both, +} diff --git a/druntime/src/core/sys/wasi/p2/sockets/tcp/imports.d b/druntime/src/core/sys/wasi/p2/sockets/tcp/imports.d new file mode 100644 index 000000000000..50528ef734a8 --- /dev/null +++ b/druntime/src/core/sys/wasi/p2/sockets/tcp/imports.d @@ -0,0 +1,875 @@ +/++ + ++/ +module core.sys.wasi.p2.sockets.tcp.imports; + +import core.sys.wasi.wit_common; + +public import core.sys.wasi.p2.sockets.tcp.common; + +static import core.sys.wasi.p2.io.poll.imports; +static import core.sys.wasi.p2.io.streams.imports; +static import core.sys.wasi.p2.clocks.monotonic_clock.imports; +static import core.sys.wasi.p2.sockets.network.imports; + +package (core.sys.wasi.p2) void __wit_bindgen_component_type_force_link() pure @nogc nothrow => imported!"core.sys.wasi.p2.cli.imports".__wit_bindgen_component_type_force_link(); + +/++ + ++/ +alias InputStream = core.sys.wasi.p2.io.streams.imports.InputStream; + +/++ + ++/ +alias OutputStream = core.sys.wasi.p2.io.streams.imports.OutputStream; + +/++ + ++/ +alias Pollable = core.sys.wasi.p2.io.poll.imports.Pollable; + +/++ + ++/ +alias Network = core.sys.wasi.p2.sockets.network.imports.Network; + +/++ + ++/ +struct TcpSocket { + @nogc nothrow: + + package(core.sys.wasi.p2) uint __handle = 0; + + package(core.sys.wasi.p2) this(uint handle) { + __handle = handle; + } + + @disable this(); + + + void drop() { + __import_drop(__handle); + } + @wasmImport!("wasi:sockets/tcp@0.2.12", "[resource-drop]tcp-socket") + pragma(mangle, "__wit_import_wasi:sockets__tcp@0.2.12__:resource_drop:tcp_socket") + static private extern(C) void __import_drop(uint); + + alias witFree = drop; + // TODO: make RAII? disable copy for the own + + Borrow borrow() => Borrow(__handle); + alias borrow this; + + struct Borrow { + @nogc nothrow: + + package(core.sys.wasi.p2) uint __handle = 0; + + package(core.sys.wasi.p2) this(uint handle) { + __handle = handle; + } + + @disable this(); + + void witFree() {} + Borrow witClone() const { return Borrow(__handle); } + + /++ + + +/ + Result!(void, ErrorCode) startBind(in Network.Borrow network, in IpSocketAddress localAddress) @nogc nothrow { + align(1) void[2] _retArea = void; + uint _variantPart4 = void; + uint _variantPart5 = void; + uint _variantPart6 = void; + uint _variantPart7 = void; + uint _variantPart8 = void; + uint _variantPart9 = void; + uint _variantPart10 = void; + uint _variantPart11 = void; + uint _variantPart12 = void; + uint _variantPart13 = void; + uint _variantPart14 = void; + uint _variantPart15 = void; + alias _Tag16 = core.sys.wasi.p2.sockets.network.imports.IpSocketAddress.Tag; + final switch (localAddress.tag) { + case _Tag16.ipv4: { + const ref core.sys.wasi.p2.sockets.network.imports.Ipv4SocketAddress _payload1 = localAddress.getIpv4(); + _variantPart4 = 0; + _variantPart5 = cast(uint)(_payload1.port); + _variantPart6 = cast(uint)(_payload1.address[0]); + _variantPart7 = cast(uint)(_payload1.address[1]); + _variantPart8 = cast(uint)(_payload1.address[2]); + _variantPart9 = cast(uint)(_payload1.address[3]); + _variantPart10 = 0; + _variantPart11 = 0; + _variantPart12 = 0; + _variantPart13 = 0; + _variantPart14 = 0; + _variantPart15 = 0; + break; + } + case _Tag16.ipv6: { + const ref core.sys.wasi.p2.sockets.network.imports.Ipv6SocketAddress _payload3 = localAddress.getIpv6(); + _variantPart4 = 1; + _variantPart5 = cast(uint)(_payload3.port); + _variantPart6 = _payload3.flowInfo; + _variantPart7 = cast(uint)(_payload3.address[0]); + _variantPart8 = cast(uint)(_payload3.address[1]); + _variantPart9 = cast(uint)(_payload3.address[2]); + _variantPart10 = cast(uint)(_payload3.address[3]); + _variantPart11 = cast(uint)(_payload3.address[4]); + _variantPart12 = cast(uint)(_payload3.address[5]); + _variantPart13 = cast(uint)(_payload3.address[6]); + _variantPart14 = cast(uint)(_payload3.address[7]); + _variantPart15 = _payload3.scopeId; + break; + } + } + __import_startBind(this.__handle, network.__handle, _variantPart4, _variantPart5, _variantPart6, _variantPart7, _variantPart8, _variantPart9, _variantPart10, _variantPart11, _variantPart12, _variantPart13, _variantPart14, _variantPart15, _retArea.ptr); + Result!(void, ErrorCode) _result19 = void; + bool _isErr19 = (cast(uint)(*(cast(ubyte*)(_retArea.ptr + 0)))) != 0; + if (_isErr19) { + + _result19 = Result!(void, ErrorCode).err(cast(core.sys.wasi.p2.sockets.network.imports.ErrorCode)(cast(uint)(*(cast(ubyte*)(_retArea.ptr + 1))))); + } else { + + _result19 = Result!(void, ErrorCode).ok(); + } + auto _flush20 = _result19; + return _flush20; + } + /// ditto + @wasmImport!("wasi:sockets/tcp@0.2.12", "[method]tcp-socket.start-bind") + pragma(mangle, "__wit_import_wasi:sockets__tcp@0.2.12__:method:tcp_socket.start_bind") + static private extern(C) void __import_startBind(uint, uint, uint, uint, uint, uint, uint, uint, uint, uint, uint, uint, uint, uint, void*) @nogc nothrow; + + /++ + + +/ + Result!(void, ErrorCode) finishBind() @nogc nothrow { + align(1) void[2] _retArea = void; + __import_finishBind(this.__handle, _retArea.ptr); + Result!(void, ErrorCode) _result2 = void; + bool _isErr2 = (cast(uint)(*(cast(ubyte*)(_retArea.ptr + 0)))) != 0; + if (_isErr2) { + + _result2 = Result!(void, ErrorCode).err(cast(core.sys.wasi.p2.sockets.network.imports.ErrorCode)(cast(uint)(*(cast(ubyte*)(_retArea.ptr + 1))))); + } else { + + _result2 = Result!(void, ErrorCode).ok(); + } + auto _flush3 = _result2; + return _flush3; + } + /// ditto + @wasmImport!("wasi:sockets/tcp@0.2.12", "[method]tcp-socket.finish-bind") + pragma(mangle, "__wit_import_wasi:sockets__tcp@0.2.12__:method:tcp_socket.finish_bind") + static private extern(C) void __import_finishBind(uint, void*) @nogc nothrow; + + /++ + + +/ + Result!(void, ErrorCode) startConnect(in Network.Borrow network, in IpSocketAddress remoteAddress) @nogc nothrow { + align(1) void[2] _retArea = void; + uint _variantPart4 = void; + uint _variantPart5 = void; + uint _variantPart6 = void; + uint _variantPart7 = void; + uint _variantPart8 = void; + uint _variantPart9 = void; + uint _variantPart10 = void; + uint _variantPart11 = void; + uint _variantPart12 = void; + uint _variantPart13 = void; + uint _variantPart14 = void; + uint _variantPart15 = void; + alias _Tag16 = core.sys.wasi.p2.sockets.network.imports.IpSocketAddress.Tag; + final switch (remoteAddress.tag) { + case _Tag16.ipv4: { + const ref core.sys.wasi.p2.sockets.network.imports.Ipv4SocketAddress _payload1 = remoteAddress.getIpv4(); + _variantPart4 = 0; + _variantPart5 = cast(uint)(_payload1.port); + _variantPart6 = cast(uint)(_payload1.address[0]); + _variantPart7 = cast(uint)(_payload1.address[1]); + _variantPart8 = cast(uint)(_payload1.address[2]); + _variantPart9 = cast(uint)(_payload1.address[3]); + _variantPart10 = 0; + _variantPart11 = 0; + _variantPart12 = 0; + _variantPart13 = 0; + _variantPart14 = 0; + _variantPart15 = 0; + break; + } + case _Tag16.ipv6: { + const ref core.sys.wasi.p2.sockets.network.imports.Ipv6SocketAddress _payload3 = remoteAddress.getIpv6(); + _variantPart4 = 1; + _variantPart5 = cast(uint)(_payload3.port); + _variantPart6 = _payload3.flowInfo; + _variantPart7 = cast(uint)(_payload3.address[0]); + _variantPart8 = cast(uint)(_payload3.address[1]); + _variantPart9 = cast(uint)(_payload3.address[2]); + _variantPart10 = cast(uint)(_payload3.address[3]); + _variantPart11 = cast(uint)(_payload3.address[4]); + _variantPart12 = cast(uint)(_payload3.address[5]); + _variantPart13 = cast(uint)(_payload3.address[6]); + _variantPart14 = cast(uint)(_payload3.address[7]); + _variantPart15 = _payload3.scopeId; + break; + } + } + __import_startConnect(this.__handle, network.__handle, _variantPart4, _variantPart5, _variantPart6, _variantPart7, _variantPart8, _variantPart9, _variantPart10, _variantPart11, _variantPart12, _variantPart13, _variantPart14, _variantPart15, _retArea.ptr); + Result!(void, ErrorCode) _result19 = void; + bool _isErr19 = (cast(uint)(*(cast(ubyte*)(_retArea.ptr + 0)))) != 0; + if (_isErr19) { + + _result19 = Result!(void, ErrorCode).err(cast(core.sys.wasi.p2.sockets.network.imports.ErrorCode)(cast(uint)(*(cast(ubyte*)(_retArea.ptr + 1))))); + } else { + + _result19 = Result!(void, ErrorCode).ok(); + } + auto _flush20 = _result19; + return _flush20; + } + /// ditto + @wasmImport!("wasi:sockets/tcp@0.2.12", "[method]tcp-socket.start-connect") + pragma(mangle, "__wit_import_wasi:sockets__tcp@0.2.12__:method:tcp_socket.start_connect") + static private extern(C) void __import_startConnect(uint, uint, uint, uint, uint, uint, uint, uint, uint, uint, uint, uint, uint, uint, void*) @nogc nothrow; + + /++ + + +/ + Result!(Tuple!(InputStream, OutputStream), ErrorCode) finishConnect() @nogc nothrow { + align(4) void[12] _retArea = void; + __import_finishConnect(this.__handle, _retArea.ptr); + Result!(Tuple!(InputStream, OutputStream), ErrorCode) _result3 = void; + bool _isErr3 = (cast(uint)(*(cast(ubyte*)(_retArea.ptr + 0)))) != 0; + if (_isErr3) { + + _result3 = Result!(Tuple!(InputStream, OutputStream), ErrorCode).err(cast(core.sys.wasi.p2.sockets.network.imports.ErrorCode)(cast(uint)(*(cast(ubyte*)(_retArea.ptr + 4))))); + } else { + auto _tuple1 = Tuple!(InputStream, OutputStream)( + InputStream(*(cast(uint*)(_retArea.ptr + 4))), + OutputStream(*(cast(uint*)(_retArea.ptr + 8))), + ); + + _result3 = Result!(Tuple!(InputStream, OutputStream), ErrorCode).ok(_tuple1); + } + auto _flush4 = _result3; + return _flush4; + } + /// ditto + @wasmImport!("wasi:sockets/tcp@0.2.12", "[method]tcp-socket.finish-connect") + pragma(mangle, "__wit_import_wasi:sockets__tcp@0.2.12__:method:tcp_socket.finish_connect") + static private extern(C) void __import_finishConnect(uint, void*) @nogc nothrow; + + /++ + + +/ + Result!(void, ErrorCode) startListen() @nogc nothrow { + align(1) void[2] _retArea = void; + __import_startListen(this.__handle, _retArea.ptr); + Result!(void, ErrorCode) _result2 = void; + bool _isErr2 = (cast(uint)(*(cast(ubyte*)(_retArea.ptr + 0)))) != 0; + if (_isErr2) { + + _result2 = Result!(void, ErrorCode).err(cast(core.sys.wasi.p2.sockets.network.imports.ErrorCode)(cast(uint)(*(cast(ubyte*)(_retArea.ptr + 1))))); + } else { + + _result2 = Result!(void, ErrorCode).ok(); + } + auto _flush3 = _result2; + return _flush3; + } + /// ditto + @wasmImport!("wasi:sockets/tcp@0.2.12", "[method]tcp-socket.start-listen") + pragma(mangle, "__wit_import_wasi:sockets__tcp@0.2.12__:method:tcp_socket.start_listen") + static private extern(C) void __import_startListen(uint, void*) @nogc nothrow; + + /++ + + +/ + Result!(void, ErrorCode) finishListen() @nogc nothrow { + align(1) void[2] _retArea = void; + __import_finishListen(this.__handle, _retArea.ptr); + Result!(void, ErrorCode) _result2 = void; + bool _isErr2 = (cast(uint)(*(cast(ubyte*)(_retArea.ptr + 0)))) != 0; + if (_isErr2) { + + _result2 = Result!(void, ErrorCode).err(cast(core.sys.wasi.p2.sockets.network.imports.ErrorCode)(cast(uint)(*(cast(ubyte*)(_retArea.ptr + 1))))); + } else { + + _result2 = Result!(void, ErrorCode).ok(); + } + auto _flush3 = _result2; + return _flush3; + } + /// ditto + @wasmImport!("wasi:sockets/tcp@0.2.12", "[method]tcp-socket.finish-listen") + pragma(mangle, "__wit_import_wasi:sockets__tcp@0.2.12__:method:tcp_socket.finish_listen") + static private extern(C) void __import_finishListen(uint, void*) @nogc nothrow; + + /++ + + +/ + Result!(Tuple!(TcpSocket, InputStream, OutputStream), ErrorCode) accept() @nogc nothrow { + align(4) void[16] _retArea = void; + __import_accept(this.__handle, _retArea.ptr); + Result!(Tuple!(TcpSocket, InputStream, OutputStream), ErrorCode) _result3 = void; + bool _isErr3 = (cast(uint)(*(cast(ubyte*)(_retArea.ptr + 0)))) != 0; + if (_isErr3) { + + _result3 = Result!(Tuple!(TcpSocket, InputStream, OutputStream), ErrorCode).err(cast(core.sys.wasi.p2.sockets.network.imports.ErrorCode)(cast(uint)(*(cast(ubyte*)(_retArea.ptr + 4))))); + } else { + auto _tuple1 = Tuple!(TcpSocket, InputStream, OutputStream)( + TcpSocket(*(cast(uint*)(_retArea.ptr + 4))), + InputStream(*(cast(uint*)(_retArea.ptr + 8))), + OutputStream(*(cast(uint*)(_retArea.ptr + 12))), + ); + + _result3 = Result!(Tuple!(TcpSocket, InputStream, OutputStream), ErrorCode).ok(_tuple1); + } + auto _flush4 = _result3; + return _flush4; + } + /// ditto + @wasmImport!("wasi:sockets/tcp@0.2.12", "[method]tcp-socket.accept") + pragma(mangle, "__wit_import_wasi:sockets__tcp@0.2.12__:method:tcp_socket.accept") + static private extern(C) void __import_accept(uint, void*) @nogc nothrow; + + /++ + + +/ + Result!(IpSocketAddress, ErrorCode) localAddress() @nogc nothrow { + align(4) void[36] _retArea = void; + __import_localAddress(this.__handle, _retArea.ptr); + Result!(IpSocketAddress, ErrorCode) _result11 = void; + bool _isErr11 = (cast(uint)(*(cast(ubyte*)(_retArea.ptr + 0)))) != 0; + if (_isErr11) { + + _result11 = Result!(IpSocketAddress, ErrorCode).err(cast(core.sys.wasi.p2.sockets.network.imports.ErrorCode)(cast(uint)(*(cast(ubyte*)(_retArea.ptr + 4))))); + } else { + core.sys.wasi.p2.sockets.network.imports.IpSocketAddress _variant7 = void; + auto _tag7 = cast(uint)(*(cast(ubyte*)(_retArea.ptr + 4))); + alias _Tag7 = core.sys.wasi.p2.sockets.network.imports.IpSocketAddress.Tag; + final switch (cast(core.sys.wasi.p2.sockets.network.imports.IpSocketAddress.Tag)_tag7) { + case _Tag7.ipv4: { + auto _tuple2 = core.sys.wasi.p2.sockets.network.imports.Ipv4Address( + cast(ubyte)(cast(uint)(*(cast(ubyte*)(_retArea.ptr + 10)))), + cast(ubyte)(cast(uint)(*(cast(ubyte*)(_retArea.ptr + 11)))), + cast(ubyte)(cast(uint)(*(cast(ubyte*)(_retArea.ptr + 12)))), + cast(ubyte)(cast(uint)(*(cast(ubyte*)(_retArea.ptr + 13)))), + ); + core.sys.wasi.p2.sockets.network.imports.Ipv4SocketAddress _record3 = { + port: cast(ushort)(cast(uint)(*(cast(ushort*)(_retArea.ptr + 8)))), + address: _tuple2, + }; + auto _payload8 = _record3; + _variant7 = core.sys.wasi.p2.sockets.network.imports.IpSocketAddress.ipv4(_payload8); + break; + } + case _Tag7.ipv6: { + auto _tuple5 = core.sys.wasi.p2.sockets.network.imports.Ipv6Address( + cast(ushort)(cast(uint)(*(cast(ushort*)(_retArea.ptr + 16)))), + cast(ushort)(cast(uint)(*(cast(ushort*)(_retArea.ptr + 18)))), + cast(ushort)(cast(uint)(*(cast(ushort*)(_retArea.ptr + 20)))), + cast(ushort)(cast(uint)(*(cast(ushort*)(_retArea.ptr + 22)))), + cast(ushort)(cast(uint)(*(cast(ushort*)(_retArea.ptr + 24)))), + cast(ushort)(cast(uint)(*(cast(ushort*)(_retArea.ptr + 26)))), + cast(ushort)(cast(uint)(*(cast(ushort*)(_retArea.ptr + 28)))), + cast(ushort)(cast(uint)(*(cast(ushort*)(_retArea.ptr + 30)))), + ); + core.sys.wasi.p2.sockets.network.imports.Ipv6SocketAddress _record6 = { + port: cast(ushort)(cast(uint)(*(cast(ushort*)(_retArea.ptr + 8)))), + flowInfo: *(cast(uint*)(_retArea.ptr + 12)), + address: _tuple5, + scopeId: *(cast(uint*)(_retArea.ptr + 32)), + }; + auto _payload9 = _record6; + _variant7 = core.sys.wasi.p2.sockets.network.imports.IpSocketAddress.ipv6(_payload9); + break; + } + } + + _result11 = Result!(IpSocketAddress, ErrorCode).ok(_variant7); + } + auto _flush12 = _result11; + return _flush12; + } + /// ditto + @wasmImport!("wasi:sockets/tcp@0.2.12", "[method]tcp-socket.local-address") + pragma(mangle, "__wit_import_wasi:sockets__tcp@0.2.12__:method:tcp_socket.local_address") + static private extern(C) void __import_localAddress(uint, void*) @nogc nothrow; + + /++ + + +/ + Result!(IpSocketAddress, ErrorCode) remoteAddress() @nogc nothrow { + align(4) void[36] _retArea = void; + __import_remoteAddress(this.__handle, _retArea.ptr); + Result!(IpSocketAddress, ErrorCode) _result11 = void; + bool _isErr11 = (cast(uint)(*(cast(ubyte*)(_retArea.ptr + 0)))) != 0; + if (_isErr11) { + + _result11 = Result!(IpSocketAddress, ErrorCode).err(cast(core.sys.wasi.p2.sockets.network.imports.ErrorCode)(cast(uint)(*(cast(ubyte*)(_retArea.ptr + 4))))); + } else { + core.sys.wasi.p2.sockets.network.imports.IpSocketAddress _variant7 = void; + auto _tag7 = cast(uint)(*(cast(ubyte*)(_retArea.ptr + 4))); + alias _Tag7 = core.sys.wasi.p2.sockets.network.imports.IpSocketAddress.Tag; + final switch (cast(core.sys.wasi.p2.sockets.network.imports.IpSocketAddress.Tag)_tag7) { + case _Tag7.ipv4: { + auto _tuple2 = core.sys.wasi.p2.sockets.network.imports.Ipv4Address( + cast(ubyte)(cast(uint)(*(cast(ubyte*)(_retArea.ptr + 10)))), + cast(ubyte)(cast(uint)(*(cast(ubyte*)(_retArea.ptr + 11)))), + cast(ubyte)(cast(uint)(*(cast(ubyte*)(_retArea.ptr + 12)))), + cast(ubyte)(cast(uint)(*(cast(ubyte*)(_retArea.ptr + 13)))), + ); + core.sys.wasi.p2.sockets.network.imports.Ipv4SocketAddress _record3 = { + port: cast(ushort)(cast(uint)(*(cast(ushort*)(_retArea.ptr + 8)))), + address: _tuple2, + }; + auto _payload8 = _record3; + _variant7 = core.sys.wasi.p2.sockets.network.imports.IpSocketAddress.ipv4(_payload8); + break; + } + case _Tag7.ipv6: { + auto _tuple5 = core.sys.wasi.p2.sockets.network.imports.Ipv6Address( + cast(ushort)(cast(uint)(*(cast(ushort*)(_retArea.ptr + 16)))), + cast(ushort)(cast(uint)(*(cast(ushort*)(_retArea.ptr + 18)))), + cast(ushort)(cast(uint)(*(cast(ushort*)(_retArea.ptr + 20)))), + cast(ushort)(cast(uint)(*(cast(ushort*)(_retArea.ptr + 22)))), + cast(ushort)(cast(uint)(*(cast(ushort*)(_retArea.ptr + 24)))), + cast(ushort)(cast(uint)(*(cast(ushort*)(_retArea.ptr + 26)))), + cast(ushort)(cast(uint)(*(cast(ushort*)(_retArea.ptr + 28)))), + cast(ushort)(cast(uint)(*(cast(ushort*)(_retArea.ptr + 30)))), + ); + core.sys.wasi.p2.sockets.network.imports.Ipv6SocketAddress _record6 = { + port: cast(ushort)(cast(uint)(*(cast(ushort*)(_retArea.ptr + 8)))), + flowInfo: *(cast(uint*)(_retArea.ptr + 12)), + address: _tuple5, + scopeId: *(cast(uint*)(_retArea.ptr + 32)), + }; + auto _payload9 = _record6; + _variant7 = core.sys.wasi.p2.sockets.network.imports.IpSocketAddress.ipv6(_payload9); + break; + } + } + + _result11 = Result!(IpSocketAddress, ErrorCode).ok(_variant7); + } + auto _flush12 = _result11; + return _flush12; + } + /// ditto + @wasmImport!("wasi:sockets/tcp@0.2.12", "[method]tcp-socket.remote-address") + pragma(mangle, "__wit_import_wasi:sockets__tcp@0.2.12__:method:tcp_socket.remote_address") + static private extern(C) void __import_remoteAddress(uint, void*) @nogc nothrow; + + /++ + + +/ + bool isListening() @nogc nothrow { + auto _ret = __import_isListening(this.__handle); + return (_ret) != 0; + } + /// ditto + @wasmImport!("wasi:sockets/tcp@0.2.12", "[method]tcp-socket.is-listening") + pragma(mangle, "__wit_import_wasi:sockets__tcp@0.2.12__:method:tcp_socket.is_listening") + static private extern(C) uint __import_isListening(uint) @nogc nothrow; + + /++ + + +/ + IpAddressFamily addressFamily() @nogc nothrow { + auto _ret = __import_addressFamily(this.__handle); + return cast(core.sys.wasi.p2.sockets.network.imports.IpAddressFamily)(_ret); + } + /// ditto + @wasmImport!("wasi:sockets/tcp@0.2.12", "[method]tcp-socket.address-family") + pragma(mangle, "__wit_import_wasi:sockets__tcp@0.2.12__:method:tcp_socket.address_family") + static private extern(C) uint __import_addressFamily(uint) @nogc nothrow; + + /++ + + +/ + Result!(void, ErrorCode) setListenBacklogSize(ulong value) @nogc nothrow { + align(1) void[2] _retArea = void; + __import_setListenBacklogSize(this.__handle, value, _retArea.ptr); + Result!(void, ErrorCode) _result2 = void; + bool _isErr2 = (cast(uint)(*(cast(ubyte*)(_retArea.ptr + 0)))) != 0; + if (_isErr2) { + + _result2 = Result!(void, ErrorCode).err(cast(core.sys.wasi.p2.sockets.network.imports.ErrorCode)(cast(uint)(*(cast(ubyte*)(_retArea.ptr + 1))))); + } else { + + _result2 = Result!(void, ErrorCode).ok(); + } + auto _flush3 = _result2; + return _flush3; + } + /// ditto + @wasmImport!("wasi:sockets/tcp@0.2.12", "[method]tcp-socket.set-listen-backlog-size") + pragma(mangle, "__wit_import_wasi:sockets__tcp@0.2.12__:method:tcp_socket.set_listen_backlog_size") + static private extern(C) void __import_setListenBacklogSize(uint, ulong, void*) @nogc nothrow; + + /++ + + +/ + Result!(bool, ErrorCode) keepAliveEnabled() @nogc nothrow { + align(1) void[2] _retArea = void; + __import_keepAliveEnabled(this.__handle, _retArea.ptr); + Result!(bool, ErrorCode) _result2 = void; + bool _isErr2 = (cast(uint)(*(cast(ubyte*)(_retArea.ptr + 0)))) != 0; + if (_isErr2) { + + _result2 = Result!(bool, ErrorCode).err(cast(core.sys.wasi.p2.sockets.network.imports.ErrorCode)(cast(uint)(*(cast(ubyte*)(_retArea.ptr + 1))))); + } else { + + _result2 = Result!(bool, ErrorCode).ok((cast(uint)(*(cast(ubyte*)(_retArea.ptr + 1)))) != 0); + } + auto _flush3 = _result2; + return _flush3; + } + /// ditto + @wasmImport!("wasi:sockets/tcp@0.2.12", "[method]tcp-socket.keep-alive-enabled") + pragma(mangle, "__wit_import_wasi:sockets__tcp@0.2.12__:method:tcp_socket.keep_alive_enabled") + static private extern(C) void __import_keepAliveEnabled(uint, void*) @nogc nothrow; + + /++ + + +/ + Result!(void, ErrorCode) setKeepAliveEnabled(bool value) @nogc nothrow { + align(1) void[2] _retArea = void; + __import_setKeepAliveEnabled(this.__handle, cast(uint)(value), _retArea.ptr); + Result!(void, ErrorCode) _result2 = void; + bool _isErr2 = (cast(uint)(*(cast(ubyte*)(_retArea.ptr + 0)))) != 0; + if (_isErr2) { + + _result2 = Result!(void, ErrorCode).err(cast(core.sys.wasi.p2.sockets.network.imports.ErrorCode)(cast(uint)(*(cast(ubyte*)(_retArea.ptr + 1))))); + } else { + + _result2 = Result!(void, ErrorCode).ok(); + } + auto _flush3 = _result2; + return _flush3; + } + /// ditto + @wasmImport!("wasi:sockets/tcp@0.2.12", "[method]tcp-socket.set-keep-alive-enabled") + pragma(mangle, "__wit_import_wasi:sockets__tcp@0.2.12__:method:tcp_socket.set_keep_alive_enabled") + static private extern(C) void __import_setKeepAliveEnabled(uint, uint, void*) @nogc nothrow; + + /++ + + +/ + Result!(Duration, ErrorCode) keepAliveIdleTime() @nogc nothrow { + align(8) void[16] _retArea = void; + __import_keepAliveIdleTime(this.__handle, _retArea.ptr); + Result!(Duration, ErrorCode) _result2 = void; + bool _isErr2 = (cast(uint)(*(cast(ubyte*)(_retArea.ptr + 0)))) != 0; + if (_isErr2) { + + _result2 = Result!(Duration, ErrorCode).err(cast(core.sys.wasi.p2.sockets.network.imports.ErrorCode)(cast(uint)(*(cast(ubyte*)(_retArea.ptr + 8))))); + } else { + + _result2 = Result!(Duration, ErrorCode).ok(*(cast(ulong*)(_retArea.ptr + 8))); + } + auto _flush3 = _result2; + return _flush3; + } + /// ditto + @wasmImport!("wasi:sockets/tcp@0.2.12", "[method]tcp-socket.keep-alive-idle-time") + pragma(mangle, "__wit_import_wasi:sockets__tcp@0.2.12__:method:tcp_socket.keep_alive_idle_time") + static private extern(C) void __import_keepAliveIdleTime(uint, void*) @nogc nothrow; + + /++ + + +/ + Result!(void, ErrorCode) setKeepAliveIdleTime(in Duration value) @nogc nothrow { + align(1) void[2] _retArea = void; + __import_setKeepAliveIdleTime(this.__handle, value, _retArea.ptr); + Result!(void, ErrorCode) _result2 = void; + bool _isErr2 = (cast(uint)(*(cast(ubyte*)(_retArea.ptr + 0)))) != 0; + if (_isErr2) { + + _result2 = Result!(void, ErrorCode).err(cast(core.sys.wasi.p2.sockets.network.imports.ErrorCode)(cast(uint)(*(cast(ubyte*)(_retArea.ptr + 1))))); + } else { + + _result2 = Result!(void, ErrorCode).ok(); + } + auto _flush3 = _result2; + return _flush3; + } + /// ditto + @wasmImport!("wasi:sockets/tcp@0.2.12", "[method]tcp-socket.set-keep-alive-idle-time") + pragma(mangle, "__wit_import_wasi:sockets__tcp@0.2.12__:method:tcp_socket.set_keep_alive_idle_time") + static private extern(C) void __import_setKeepAliveIdleTime(uint, ulong, void*) @nogc nothrow; + + /++ + + +/ + Result!(Duration, ErrorCode) keepAliveInterval() @nogc nothrow { + align(8) void[16] _retArea = void; + __import_keepAliveInterval(this.__handle, _retArea.ptr); + Result!(Duration, ErrorCode) _result2 = void; + bool _isErr2 = (cast(uint)(*(cast(ubyte*)(_retArea.ptr + 0)))) != 0; + if (_isErr2) { + + _result2 = Result!(Duration, ErrorCode).err(cast(core.sys.wasi.p2.sockets.network.imports.ErrorCode)(cast(uint)(*(cast(ubyte*)(_retArea.ptr + 8))))); + } else { + + _result2 = Result!(Duration, ErrorCode).ok(*(cast(ulong*)(_retArea.ptr + 8))); + } + auto _flush3 = _result2; + return _flush3; + } + /// ditto + @wasmImport!("wasi:sockets/tcp@0.2.12", "[method]tcp-socket.keep-alive-interval") + pragma(mangle, "__wit_import_wasi:sockets__tcp@0.2.12__:method:tcp_socket.keep_alive_interval") + static private extern(C) void __import_keepAliveInterval(uint, void*) @nogc nothrow; + + /++ + + +/ + Result!(void, ErrorCode) setKeepAliveInterval(in Duration value) @nogc nothrow { + align(1) void[2] _retArea = void; + __import_setKeepAliveInterval(this.__handle, value, _retArea.ptr); + Result!(void, ErrorCode) _result2 = void; + bool _isErr2 = (cast(uint)(*(cast(ubyte*)(_retArea.ptr + 0)))) != 0; + if (_isErr2) { + + _result2 = Result!(void, ErrorCode).err(cast(core.sys.wasi.p2.sockets.network.imports.ErrorCode)(cast(uint)(*(cast(ubyte*)(_retArea.ptr + 1))))); + } else { + + _result2 = Result!(void, ErrorCode).ok(); + } + auto _flush3 = _result2; + return _flush3; + } + /// ditto + @wasmImport!("wasi:sockets/tcp@0.2.12", "[method]tcp-socket.set-keep-alive-interval") + pragma(mangle, "__wit_import_wasi:sockets__tcp@0.2.12__:method:tcp_socket.set_keep_alive_interval") + static private extern(C) void __import_setKeepAliveInterval(uint, ulong, void*) @nogc nothrow; + + /++ + + +/ + Result!(uint, ErrorCode) keepAliveCount() @nogc nothrow { + align(4) void[8] _retArea = void; + __import_keepAliveCount(this.__handle, _retArea.ptr); + Result!(uint, ErrorCode) _result2 = void; + bool _isErr2 = (cast(uint)(*(cast(ubyte*)(_retArea.ptr + 0)))) != 0; + if (_isErr2) { + + _result2 = Result!(uint, ErrorCode).err(cast(core.sys.wasi.p2.sockets.network.imports.ErrorCode)(cast(uint)(*(cast(ubyte*)(_retArea.ptr + 4))))); + } else { + + _result2 = Result!(uint, ErrorCode).ok(*(cast(uint*)(_retArea.ptr + 4))); + } + auto _flush3 = _result2; + return _flush3; + } + /// ditto + @wasmImport!("wasi:sockets/tcp@0.2.12", "[method]tcp-socket.keep-alive-count") + pragma(mangle, "__wit_import_wasi:sockets__tcp@0.2.12__:method:tcp_socket.keep_alive_count") + static private extern(C) void __import_keepAliveCount(uint, void*) @nogc nothrow; + + /++ + + +/ + Result!(void, ErrorCode) setKeepAliveCount(uint value) @nogc nothrow { + align(1) void[2] _retArea = void; + __import_setKeepAliveCount(this.__handle, value, _retArea.ptr); + Result!(void, ErrorCode) _result2 = void; + bool _isErr2 = (cast(uint)(*(cast(ubyte*)(_retArea.ptr + 0)))) != 0; + if (_isErr2) { + + _result2 = Result!(void, ErrorCode).err(cast(core.sys.wasi.p2.sockets.network.imports.ErrorCode)(cast(uint)(*(cast(ubyte*)(_retArea.ptr + 1))))); + } else { + + _result2 = Result!(void, ErrorCode).ok(); + } + auto _flush3 = _result2; + return _flush3; + } + /// ditto + @wasmImport!("wasi:sockets/tcp@0.2.12", "[method]tcp-socket.set-keep-alive-count") + pragma(mangle, "__wit_import_wasi:sockets__tcp@0.2.12__:method:tcp_socket.set_keep_alive_count") + static private extern(C) void __import_setKeepAliveCount(uint, uint, void*) @nogc nothrow; + + /++ + + +/ + Result!(ubyte, ErrorCode) hopLimit() @nogc nothrow { + align(1) void[2] _retArea = void; + __import_hopLimit(this.__handle, _retArea.ptr); + Result!(ubyte, ErrorCode) _result2 = void; + bool _isErr2 = (cast(uint)(*(cast(ubyte*)(_retArea.ptr + 0)))) != 0; + if (_isErr2) { + + _result2 = Result!(ubyte, ErrorCode).err(cast(core.sys.wasi.p2.sockets.network.imports.ErrorCode)(cast(uint)(*(cast(ubyte*)(_retArea.ptr + 1))))); + } else { + + _result2 = Result!(ubyte, ErrorCode).ok(cast(ubyte)(cast(uint)(*(cast(ubyte*)(_retArea.ptr + 1))))); + } + auto _flush3 = _result2; + return _flush3; + } + /// ditto + @wasmImport!("wasi:sockets/tcp@0.2.12", "[method]tcp-socket.hop-limit") + pragma(mangle, "__wit_import_wasi:sockets__tcp@0.2.12__:method:tcp_socket.hop_limit") + static private extern(C) void __import_hopLimit(uint, void*) @nogc nothrow; + + /++ + + +/ + Result!(void, ErrorCode) setHopLimit(ubyte value) @nogc nothrow { + align(1) void[2] _retArea = void; + __import_setHopLimit(this.__handle, cast(uint)(value), _retArea.ptr); + Result!(void, ErrorCode) _result2 = void; + bool _isErr2 = (cast(uint)(*(cast(ubyte*)(_retArea.ptr + 0)))) != 0; + if (_isErr2) { + + _result2 = Result!(void, ErrorCode).err(cast(core.sys.wasi.p2.sockets.network.imports.ErrorCode)(cast(uint)(*(cast(ubyte*)(_retArea.ptr + 1))))); + } else { + + _result2 = Result!(void, ErrorCode).ok(); + } + auto _flush3 = _result2; + return _flush3; + } + /// ditto + @wasmImport!("wasi:sockets/tcp@0.2.12", "[method]tcp-socket.set-hop-limit") + pragma(mangle, "__wit_import_wasi:sockets__tcp@0.2.12__:method:tcp_socket.set_hop_limit") + static private extern(C) void __import_setHopLimit(uint, uint, void*) @nogc nothrow; + + /++ + + +/ + Result!(ulong, ErrorCode) receiveBufferSize() @nogc nothrow { + align(8) void[16] _retArea = void; + __import_receiveBufferSize(this.__handle, _retArea.ptr); + Result!(ulong, ErrorCode) _result2 = void; + bool _isErr2 = (cast(uint)(*(cast(ubyte*)(_retArea.ptr + 0)))) != 0; + if (_isErr2) { + + _result2 = Result!(ulong, ErrorCode).err(cast(core.sys.wasi.p2.sockets.network.imports.ErrorCode)(cast(uint)(*(cast(ubyte*)(_retArea.ptr + 8))))); + } else { + + _result2 = Result!(ulong, ErrorCode).ok(*(cast(ulong*)(_retArea.ptr + 8))); + } + auto _flush3 = _result2; + return _flush3; + } + /// ditto + @wasmImport!("wasi:sockets/tcp@0.2.12", "[method]tcp-socket.receive-buffer-size") + pragma(mangle, "__wit_import_wasi:sockets__tcp@0.2.12__:method:tcp_socket.receive_buffer_size") + static private extern(C) void __import_receiveBufferSize(uint, void*) @nogc nothrow; + + /++ + + +/ + Result!(void, ErrorCode) setReceiveBufferSize(ulong value) @nogc nothrow { + align(1) void[2] _retArea = void; + __import_setReceiveBufferSize(this.__handle, value, _retArea.ptr); + Result!(void, ErrorCode) _result2 = void; + bool _isErr2 = (cast(uint)(*(cast(ubyte*)(_retArea.ptr + 0)))) != 0; + if (_isErr2) { + + _result2 = Result!(void, ErrorCode).err(cast(core.sys.wasi.p2.sockets.network.imports.ErrorCode)(cast(uint)(*(cast(ubyte*)(_retArea.ptr + 1))))); + } else { + + _result2 = Result!(void, ErrorCode).ok(); + } + auto _flush3 = _result2; + return _flush3; + } + /// ditto + @wasmImport!("wasi:sockets/tcp@0.2.12", "[method]tcp-socket.set-receive-buffer-size") + pragma(mangle, "__wit_import_wasi:sockets__tcp@0.2.12__:method:tcp_socket.set_receive_buffer_size") + static private extern(C) void __import_setReceiveBufferSize(uint, ulong, void*) @nogc nothrow; + + /++ + + +/ + Result!(ulong, ErrorCode) sendBufferSize() @nogc nothrow { + align(8) void[16] _retArea = void; + __import_sendBufferSize(this.__handle, _retArea.ptr); + Result!(ulong, ErrorCode) _result2 = void; + bool _isErr2 = (cast(uint)(*(cast(ubyte*)(_retArea.ptr + 0)))) != 0; + if (_isErr2) { + + _result2 = Result!(ulong, ErrorCode).err(cast(core.sys.wasi.p2.sockets.network.imports.ErrorCode)(cast(uint)(*(cast(ubyte*)(_retArea.ptr + 8))))); + } else { + + _result2 = Result!(ulong, ErrorCode).ok(*(cast(ulong*)(_retArea.ptr + 8))); + } + auto _flush3 = _result2; + return _flush3; + } + /// ditto + @wasmImport!("wasi:sockets/tcp@0.2.12", "[method]tcp-socket.send-buffer-size") + pragma(mangle, "__wit_import_wasi:sockets__tcp@0.2.12__:method:tcp_socket.send_buffer_size") + static private extern(C) void __import_sendBufferSize(uint, void*) @nogc nothrow; + + /++ + + +/ + Result!(void, ErrorCode) setSendBufferSize(ulong value) @nogc nothrow { + align(1) void[2] _retArea = void; + __import_setSendBufferSize(this.__handle, value, _retArea.ptr); + Result!(void, ErrorCode) _result2 = void; + bool _isErr2 = (cast(uint)(*(cast(ubyte*)(_retArea.ptr + 0)))) != 0; + if (_isErr2) { + + _result2 = Result!(void, ErrorCode).err(cast(core.sys.wasi.p2.sockets.network.imports.ErrorCode)(cast(uint)(*(cast(ubyte*)(_retArea.ptr + 1))))); + } else { + + _result2 = Result!(void, ErrorCode).ok(); + } + auto _flush3 = _result2; + return _flush3; + } + /// ditto + @wasmImport!("wasi:sockets/tcp@0.2.12", "[method]tcp-socket.set-send-buffer-size") + pragma(mangle, "__wit_import_wasi:sockets__tcp@0.2.12__:method:tcp_socket.set_send_buffer_size") + static private extern(C) void __import_setSendBufferSize(uint, ulong, void*) @nogc nothrow; + + /++ + + +/ + Pollable subscribe() @nogc nothrow { + auto _ret = __import_subscribe(this.__handle); + return Pollable(_ret); + } + /// ditto + @wasmImport!("wasi:sockets/tcp@0.2.12", "[method]tcp-socket.subscribe") + pragma(mangle, "__wit_import_wasi:sockets__tcp@0.2.12__:method:tcp_socket.subscribe") + static private extern(C) uint __import_subscribe(uint) @nogc nothrow; + + /++ + + +/ + Result!(void, ErrorCode) shutdown(in ShutdownType shutdownType) @nogc nothrow { + align(1) void[2] _retArea = void; + __import_shutdown(this.__handle, cast(uint)(shutdownType), _retArea.ptr); + Result!(void, ErrorCode) _result2 = void; + bool _isErr2 = (cast(uint)(*(cast(ubyte*)(_retArea.ptr + 0)))) != 0; + if (_isErr2) { + + _result2 = Result!(void, ErrorCode).err(cast(core.sys.wasi.p2.sockets.network.imports.ErrorCode)(cast(uint)(*(cast(ubyte*)(_retArea.ptr + 1))))); + } else { + + _result2 = Result!(void, ErrorCode).ok(); + } + auto _flush3 = _result2; + return _flush3; + } + /// ditto + @wasmImport!("wasi:sockets/tcp@0.2.12", "[method]tcp-socket.shutdown") + pragma(mangle, "__wit_import_wasi:sockets__tcp@0.2.12__:method:tcp_socket.shutdown") + static private extern(C) void __import_shutdown(uint, uint, void*) @nogc nothrow; + } +} diff --git a/druntime/src/core/sys/wasi/p2/sockets/tcp_create_socket/common.d b/druntime/src/core/sys/wasi/p2/sockets/tcp_create_socket/common.d new file mode 100644 index 000000000000..007e56ccd5c2 --- /dev/null +++ b/druntime/src/core/sys/wasi/p2/sockets/tcp_create_socket/common.d @@ -0,0 +1,21 @@ +/++ + ++/ +module core.sys.wasi.p2.sockets.tcp_create_socket.common; + +import core.sys.wasi.wit_common; + +static import core.sys.wasi.p2.sockets.network.common; +static import core.sys.wasi.p2.sockets.tcp.common; + +package (core.sys.wasi.p2) void __wit_bindgen_component_type_force_link() pure @nogc nothrow => imported!"core.sys.wasi.p2.cli.imports".__wit_bindgen_component_type_force_link(); + +/++ + ++/ +alias ErrorCode = core.sys.wasi.p2.sockets.network.common.ErrorCode; + +/++ + ++/ +alias IpAddressFamily = core.sys.wasi.p2.sockets.network.common.IpAddressFamily; diff --git a/druntime/src/core/sys/wasi/p2/sockets/tcp_create_socket/imports.d b/druntime/src/core/sys/wasi/p2/sockets/tcp_create_socket/imports.d new file mode 100644 index 000000000000..008e767af8e1 --- /dev/null +++ b/druntime/src/core/sys/wasi/p2/sockets/tcp_create_socket/imports.d @@ -0,0 +1,46 @@ +/++ + ++/ +module core.sys.wasi.p2.sockets.tcp_create_socket.imports; + +import core.sys.wasi.wit_common; + +public import core.sys.wasi.p2.sockets.tcp_create_socket.common; + +static import core.sys.wasi.p2.sockets.network.imports; +static import core.sys.wasi.p2.sockets.tcp.imports; + +package (core.sys.wasi.p2) void __wit_bindgen_component_type_force_link() pure @nogc nothrow => imported!"core.sys.wasi.p2.cli.imports".__wit_bindgen_component_type_force_link(); + +/++ + ++/ +alias Network = core.sys.wasi.p2.sockets.network.imports.Network; + +/++ + ++/ +alias TcpSocket = core.sys.wasi.p2.sockets.tcp.imports.TcpSocket; + +/++ + ++/ +Result!(TcpSocket, ErrorCode) createTcpSocket(in IpAddressFamily addressFamily) @nogc nothrow { + align(4) void[8] _retArea = void; + __import_createTcpSocket(cast(uint)(addressFamily), _retArea.ptr); + Result!(TcpSocket, ErrorCode) _result2 = void; + bool _isErr2 = (cast(uint)(*(cast(ubyte*)(_retArea.ptr + 0)))) != 0; + if (_isErr2) { + + _result2 = Result!(TcpSocket, ErrorCode).err(cast(core.sys.wasi.p2.sockets.network.imports.ErrorCode)(cast(uint)(*(cast(ubyte*)(_retArea.ptr + 4))))); + } else { + + _result2 = Result!(TcpSocket, ErrorCode).ok(TcpSocket(*(cast(uint*)(_retArea.ptr + 4)))); + } + auto _flush3 = _result2; + return _flush3; +} +/// ditto +@wasmImport!("wasi:sockets/tcp-create-socket@0.2.12", "create-tcp-socket") +pragma(mangle, "__wit_import_wasi:sockets__tcp_create_socket@0.2.12__create_tcp_socket") +private extern(C) void __import_createTcpSocket(uint, void*) @nogc nothrow; diff --git a/druntime/src/core/sys/wasi/p2/sockets/udp/common.d b/druntime/src/core/sys/wasi/p2/sockets/udp/common.d new file mode 100644 index 000000000000..67c84802d472 --- /dev/null +++ b/druntime/src/core/sys/wasi/p2/sockets/udp/common.d @@ -0,0 +1,78 @@ +/++ + ++/ +module core.sys.wasi.p2.sockets.udp.common; + +import core.sys.wasi.wit_common; + +static import core.sys.wasi.p2.io.poll.common; +static import core.sys.wasi.p2.sockets.network.common; + +package (core.sys.wasi.p2) void __wit_bindgen_component_type_force_link() pure @nogc nothrow => imported!"core.sys.wasi.p2.cli.imports".__wit_bindgen_component_type_force_link(); + +/++ + ++/ +alias ErrorCode = core.sys.wasi.p2.sockets.network.common.ErrorCode; + +/++ + ++/ +alias IpSocketAddress = core.sys.wasi.p2.sockets.network.common.IpSocketAddress; + +/++ + ++/ +alias IpAddressFamily = core.sys.wasi.p2.sockets.network.common.IpAddressFamily; + +/++ + ++/ +struct IncomingDatagram { + /++ + + +/ + WitList!(ubyte) data; + + /++ + + +/ + IpSocketAddress remoteAddress; + + void witFree() @nogc nothrow { + data.witFree; + } + + IncomingDatagram witClone() const @nogc nothrow { + IncomingDatagram clone = void; + clone.data = this.data.witClone; + clone.remoteAddress = this.remoteAddress.witClone; + return clone; + } +} + +/++ + ++/ +struct OutgoingDatagram { + /++ + + +/ + WitList!(ubyte) data; + + /++ + + +/ + Option!(IpSocketAddress) remoteAddress; + + void witFree() @nogc nothrow { + data.witFree; + } + + OutgoingDatagram witClone() const @nogc nothrow { + OutgoingDatagram clone = void; + clone.data = this.data.witClone; + clone.remoteAddress = this.remoteAddress.witClone; + return clone; + } +} diff --git a/druntime/src/core/sys/wasi/p2/sockets/udp/imports.d b/druntime/src/core/sys/wasi/p2/sockets/udp/imports.d new file mode 100644 index 000000000000..981ed0e0d607 --- /dev/null +++ b/druntime/src/core/sys/wasi/p2/sockets/udp/imports.d @@ -0,0 +1,846 @@ +/++ + ++/ +module core.sys.wasi.p2.sockets.udp.imports; + +import core.sys.wasi.wit_common; + +public import core.sys.wasi.p2.sockets.udp.common; + +static import core.sys.wasi.p2.io.poll.imports; +static import core.sys.wasi.p2.sockets.network.imports; + +package (core.sys.wasi.p2) void __wit_bindgen_component_type_force_link() pure @nogc nothrow => imported!"core.sys.wasi.p2.cli.imports".__wit_bindgen_component_type_force_link(); + +/++ + ++/ +alias Pollable = core.sys.wasi.p2.io.poll.imports.Pollable; + +/++ + ++/ +alias Network = core.sys.wasi.p2.sockets.network.imports.Network; + +/++ + ++/ +struct UdpSocket { + @nogc nothrow: + + package(core.sys.wasi.p2) uint __handle = 0; + + package(core.sys.wasi.p2) this(uint handle) { + __handle = handle; + } + + @disable this(); + + + void drop() { + __import_drop(__handle); + } + @wasmImport!("wasi:sockets/udp@0.2.12", "[resource-drop]udp-socket") + pragma(mangle, "__wit_import_wasi:sockets__udp@0.2.12__:resource_drop:udp_socket") + static private extern(C) void __import_drop(uint); + + alias witFree = drop; + // TODO: make RAII? disable copy for the own + + Borrow borrow() => Borrow(__handle); + alias borrow this; + + struct Borrow { + @nogc nothrow: + + package(core.sys.wasi.p2) uint __handle = 0; + + package(core.sys.wasi.p2) this(uint handle) { + __handle = handle; + } + + @disable this(); + + void witFree() {} + Borrow witClone() const { return Borrow(__handle); } + + /++ + + +/ + Result!(void, ErrorCode) startBind(in Network.Borrow network, in IpSocketAddress localAddress) @nogc nothrow { + align(1) void[2] _retArea = void; + uint _variantPart4 = void; + uint _variantPart5 = void; + uint _variantPart6 = void; + uint _variantPart7 = void; + uint _variantPart8 = void; + uint _variantPart9 = void; + uint _variantPart10 = void; + uint _variantPart11 = void; + uint _variantPart12 = void; + uint _variantPart13 = void; + uint _variantPart14 = void; + uint _variantPart15 = void; + alias _Tag16 = core.sys.wasi.p2.sockets.network.imports.IpSocketAddress.Tag; + final switch (localAddress.tag) { + case _Tag16.ipv4: { + const ref core.sys.wasi.p2.sockets.network.imports.Ipv4SocketAddress _payload1 = localAddress.getIpv4(); + _variantPart4 = 0; + _variantPart5 = cast(uint)(_payload1.port); + _variantPart6 = cast(uint)(_payload1.address[0]); + _variantPart7 = cast(uint)(_payload1.address[1]); + _variantPart8 = cast(uint)(_payload1.address[2]); + _variantPart9 = cast(uint)(_payload1.address[3]); + _variantPart10 = 0; + _variantPart11 = 0; + _variantPart12 = 0; + _variantPart13 = 0; + _variantPart14 = 0; + _variantPart15 = 0; + break; + } + case _Tag16.ipv6: { + const ref core.sys.wasi.p2.sockets.network.imports.Ipv6SocketAddress _payload3 = localAddress.getIpv6(); + _variantPart4 = 1; + _variantPart5 = cast(uint)(_payload3.port); + _variantPart6 = _payload3.flowInfo; + _variantPart7 = cast(uint)(_payload3.address[0]); + _variantPart8 = cast(uint)(_payload3.address[1]); + _variantPart9 = cast(uint)(_payload3.address[2]); + _variantPart10 = cast(uint)(_payload3.address[3]); + _variantPart11 = cast(uint)(_payload3.address[4]); + _variantPart12 = cast(uint)(_payload3.address[5]); + _variantPart13 = cast(uint)(_payload3.address[6]); + _variantPart14 = cast(uint)(_payload3.address[7]); + _variantPart15 = _payload3.scopeId; + break; + } + } + __import_startBind(this.__handle, network.__handle, _variantPart4, _variantPart5, _variantPart6, _variantPart7, _variantPart8, _variantPart9, _variantPart10, _variantPart11, _variantPart12, _variantPart13, _variantPart14, _variantPart15, _retArea.ptr); + Result!(void, ErrorCode) _result19 = void; + bool _isErr19 = (cast(uint)(*(cast(ubyte*)(_retArea.ptr + 0)))) != 0; + if (_isErr19) { + + _result19 = Result!(void, ErrorCode).err(cast(core.sys.wasi.p2.sockets.network.imports.ErrorCode)(cast(uint)(*(cast(ubyte*)(_retArea.ptr + 1))))); + } else { + + _result19 = Result!(void, ErrorCode).ok(); + } + auto _flush20 = _result19; + return _flush20; + } + /// ditto + @wasmImport!("wasi:sockets/udp@0.2.12", "[method]udp-socket.start-bind") + pragma(mangle, "__wit_import_wasi:sockets__udp@0.2.12__:method:udp_socket.start_bind") + static private extern(C) void __import_startBind(uint, uint, uint, uint, uint, uint, uint, uint, uint, uint, uint, uint, uint, uint, void*) @nogc nothrow; + + /++ + + +/ + Result!(void, ErrorCode) finishBind() @nogc nothrow { + align(1) void[2] _retArea = void; + __import_finishBind(this.__handle, _retArea.ptr); + Result!(void, ErrorCode) _result2 = void; + bool _isErr2 = (cast(uint)(*(cast(ubyte*)(_retArea.ptr + 0)))) != 0; + if (_isErr2) { + + _result2 = Result!(void, ErrorCode).err(cast(core.sys.wasi.p2.sockets.network.imports.ErrorCode)(cast(uint)(*(cast(ubyte*)(_retArea.ptr + 1))))); + } else { + + _result2 = Result!(void, ErrorCode).ok(); + } + auto _flush3 = _result2; + return _flush3; + } + /// ditto + @wasmImport!("wasi:sockets/udp@0.2.12", "[method]udp-socket.finish-bind") + pragma(mangle, "__wit_import_wasi:sockets__udp@0.2.12__:method:udp_socket.finish_bind") + static private extern(C) void __import_finishBind(uint, void*) @nogc nothrow; + + /++ + + +/ + Result!(Tuple!(IncomingDatagramStream, OutgoingDatagramStream), ErrorCode) stream(in Option!(IpSocketAddress) remoteAddress) @nogc nothrow { + align(4) void[12] _retArea = void; + uint _option21 = void; + uint _option22 = void; + uint _option23 = void; + uint _option24 = void; + uint _option25 = void; + uint _option26 = void; + uint _option27 = void; + uint _option28 = void; + uint _option29 = void; + uint _option30 = void; + uint _option31 = void; + uint _option32 = void; + uint _option33 = void; + if (remoteAddress.isSome) { + ref _payload3 = remoteAddress.unwrap(); + uint _variantPart8 = void; + uint _variantPart9 = void; + uint _variantPart10 = void; + uint _variantPart11 = void; + uint _variantPart12 = void; + uint _variantPart13 = void; + uint _variantPart14 = void; + uint _variantPart15 = void; + uint _variantPart16 = void; + uint _variantPart17 = void; + uint _variantPart18 = void; + uint _variantPart19 = void; + alias _Tag20 = core.sys.wasi.p2.sockets.network.imports.IpSocketAddress.Tag; + final switch (_payload3.tag) { + case _Tag20.ipv4: { + const ref core.sys.wasi.p2.sockets.network.imports.Ipv4SocketAddress _payload5 = _payload3.getIpv4(); + _variantPart8 = 0; + _variantPart9 = cast(uint)(_payload5.port); + _variantPart10 = cast(uint)(_payload5.address[0]); + _variantPart11 = cast(uint)(_payload5.address[1]); + _variantPart12 = cast(uint)(_payload5.address[2]); + _variantPart13 = cast(uint)(_payload5.address[3]); + _variantPart14 = 0; + _variantPart15 = 0; + _variantPart16 = 0; + _variantPart17 = 0; + _variantPart18 = 0; + _variantPart19 = 0; + break; + } + case _Tag20.ipv6: { + const ref core.sys.wasi.p2.sockets.network.imports.Ipv6SocketAddress _payload7 = _payload3.getIpv6(); + _variantPart8 = 1; + _variantPart9 = cast(uint)(_payload7.port); + _variantPart10 = _payload7.flowInfo; + _variantPart11 = cast(uint)(_payload7.address[0]); + _variantPart12 = cast(uint)(_payload7.address[1]); + _variantPart13 = cast(uint)(_payload7.address[2]); + _variantPart14 = cast(uint)(_payload7.address[3]); + _variantPart15 = cast(uint)(_payload7.address[4]); + _variantPart16 = cast(uint)(_payload7.address[5]); + _variantPart17 = cast(uint)(_payload7.address[6]); + _variantPart18 = cast(uint)(_payload7.address[7]); + _variantPart19 = _payload7.scopeId; + break; + } + } + _option21 = 1; + _option22 = _variantPart8; + _option23 = _variantPart9; + _option24 = _variantPart10; + _option25 = _variantPart11; + _option26 = _variantPart12; + _option27 = _variantPart13; + _option28 = _variantPart14; + _option29 = _variantPart15; + _option30 = _variantPart16; + _option31 = _variantPart17; + _option32 = _variantPart18; + _option33 = _variantPart19; + } else { + _option21 = 0; + _option22 = 0; + _option23 = 0; + _option24 = 0; + _option25 = 0; + _option26 = 0; + _option27 = 0; + _option28 = 0; + _option29 = 0; + _option30 = 0; + _option31 = 0; + _option32 = 0; + _option33 = 0; + } + __import_stream(this.__handle, _option21, _option22, _option23, _option24, _option25, _option26, _option27, _option28, _option29, _option30, _option31, _option32, _option33, _retArea.ptr); + Result!(Tuple!(IncomingDatagramStream, OutgoingDatagramStream), ErrorCode) _result37 = void; + bool _isErr37 = (cast(uint)(*(cast(ubyte*)(_retArea.ptr + 0)))) != 0; + if (_isErr37) { + + _result37 = Result!(Tuple!(IncomingDatagramStream, OutgoingDatagramStream), ErrorCode).err(cast(core.sys.wasi.p2.sockets.network.imports.ErrorCode)(cast(uint)(*(cast(ubyte*)(_retArea.ptr + 4))))); + } else { + auto _tuple35 = Tuple!(IncomingDatagramStream, OutgoingDatagramStream)( + IncomingDatagramStream(*(cast(uint*)(_retArea.ptr + 4))), + OutgoingDatagramStream(*(cast(uint*)(_retArea.ptr + 8))), + ); + + _result37 = Result!(Tuple!(IncomingDatagramStream, OutgoingDatagramStream), ErrorCode).ok(_tuple35); + } + auto _flush38 = _result37; + return _flush38; + } + /// ditto + @wasmImport!("wasi:sockets/udp@0.2.12", "[method]udp-socket.stream") + pragma(mangle, "__wit_import_wasi:sockets__udp@0.2.12__:method:udp_socket.stream") + static private extern(C) void __import_stream(uint, uint, uint, uint, uint, uint, uint, uint, uint, uint, uint, uint, uint, uint, void*) @nogc nothrow; + + /++ + + +/ + Result!(IpSocketAddress, ErrorCode) localAddress() @nogc nothrow { + align(4) void[36] _retArea = void; + __import_localAddress(this.__handle, _retArea.ptr); + Result!(IpSocketAddress, ErrorCode) _result11 = void; + bool _isErr11 = (cast(uint)(*(cast(ubyte*)(_retArea.ptr + 0)))) != 0; + if (_isErr11) { + + _result11 = Result!(IpSocketAddress, ErrorCode).err(cast(core.sys.wasi.p2.sockets.network.imports.ErrorCode)(cast(uint)(*(cast(ubyte*)(_retArea.ptr + 4))))); + } else { + core.sys.wasi.p2.sockets.network.imports.IpSocketAddress _variant7 = void; + auto _tag7 = cast(uint)(*(cast(ubyte*)(_retArea.ptr + 4))); + alias _Tag7 = core.sys.wasi.p2.sockets.network.imports.IpSocketAddress.Tag; + final switch (cast(core.sys.wasi.p2.sockets.network.imports.IpSocketAddress.Tag)_tag7) { + case _Tag7.ipv4: { + auto _tuple2 = core.sys.wasi.p2.sockets.network.imports.Ipv4Address( + cast(ubyte)(cast(uint)(*(cast(ubyte*)(_retArea.ptr + 10)))), + cast(ubyte)(cast(uint)(*(cast(ubyte*)(_retArea.ptr + 11)))), + cast(ubyte)(cast(uint)(*(cast(ubyte*)(_retArea.ptr + 12)))), + cast(ubyte)(cast(uint)(*(cast(ubyte*)(_retArea.ptr + 13)))), + ); + core.sys.wasi.p2.sockets.network.imports.Ipv4SocketAddress _record3 = { + port: cast(ushort)(cast(uint)(*(cast(ushort*)(_retArea.ptr + 8)))), + address: _tuple2, + }; + auto _payload8 = _record3; + _variant7 = core.sys.wasi.p2.sockets.network.imports.IpSocketAddress.ipv4(_payload8); + break; + } + case _Tag7.ipv6: { + auto _tuple5 = core.sys.wasi.p2.sockets.network.imports.Ipv6Address( + cast(ushort)(cast(uint)(*(cast(ushort*)(_retArea.ptr + 16)))), + cast(ushort)(cast(uint)(*(cast(ushort*)(_retArea.ptr + 18)))), + cast(ushort)(cast(uint)(*(cast(ushort*)(_retArea.ptr + 20)))), + cast(ushort)(cast(uint)(*(cast(ushort*)(_retArea.ptr + 22)))), + cast(ushort)(cast(uint)(*(cast(ushort*)(_retArea.ptr + 24)))), + cast(ushort)(cast(uint)(*(cast(ushort*)(_retArea.ptr + 26)))), + cast(ushort)(cast(uint)(*(cast(ushort*)(_retArea.ptr + 28)))), + cast(ushort)(cast(uint)(*(cast(ushort*)(_retArea.ptr + 30)))), + ); + core.sys.wasi.p2.sockets.network.imports.Ipv6SocketAddress _record6 = { + port: cast(ushort)(cast(uint)(*(cast(ushort*)(_retArea.ptr + 8)))), + flowInfo: *(cast(uint*)(_retArea.ptr + 12)), + address: _tuple5, + scopeId: *(cast(uint*)(_retArea.ptr + 32)), + }; + auto _payload9 = _record6; + _variant7 = core.sys.wasi.p2.sockets.network.imports.IpSocketAddress.ipv6(_payload9); + break; + } + } + + _result11 = Result!(IpSocketAddress, ErrorCode).ok(_variant7); + } + auto _flush12 = _result11; + return _flush12; + } + /// ditto + @wasmImport!("wasi:sockets/udp@0.2.12", "[method]udp-socket.local-address") + pragma(mangle, "__wit_import_wasi:sockets__udp@0.2.12__:method:udp_socket.local_address") + static private extern(C) void __import_localAddress(uint, void*) @nogc nothrow; + + /++ + + +/ + Result!(IpSocketAddress, ErrorCode) remoteAddress() @nogc nothrow { + align(4) void[36] _retArea = void; + __import_remoteAddress(this.__handle, _retArea.ptr); + Result!(IpSocketAddress, ErrorCode) _result11 = void; + bool _isErr11 = (cast(uint)(*(cast(ubyte*)(_retArea.ptr + 0)))) != 0; + if (_isErr11) { + + _result11 = Result!(IpSocketAddress, ErrorCode).err(cast(core.sys.wasi.p2.sockets.network.imports.ErrorCode)(cast(uint)(*(cast(ubyte*)(_retArea.ptr + 4))))); + } else { + core.sys.wasi.p2.sockets.network.imports.IpSocketAddress _variant7 = void; + auto _tag7 = cast(uint)(*(cast(ubyte*)(_retArea.ptr + 4))); + alias _Tag7 = core.sys.wasi.p2.sockets.network.imports.IpSocketAddress.Tag; + final switch (cast(core.sys.wasi.p2.sockets.network.imports.IpSocketAddress.Tag)_tag7) { + case _Tag7.ipv4: { + auto _tuple2 = core.sys.wasi.p2.sockets.network.imports.Ipv4Address( + cast(ubyte)(cast(uint)(*(cast(ubyte*)(_retArea.ptr + 10)))), + cast(ubyte)(cast(uint)(*(cast(ubyte*)(_retArea.ptr + 11)))), + cast(ubyte)(cast(uint)(*(cast(ubyte*)(_retArea.ptr + 12)))), + cast(ubyte)(cast(uint)(*(cast(ubyte*)(_retArea.ptr + 13)))), + ); + core.sys.wasi.p2.sockets.network.imports.Ipv4SocketAddress _record3 = { + port: cast(ushort)(cast(uint)(*(cast(ushort*)(_retArea.ptr + 8)))), + address: _tuple2, + }; + auto _payload8 = _record3; + _variant7 = core.sys.wasi.p2.sockets.network.imports.IpSocketAddress.ipv4(_payload8); + break; + } + case _Tag7.ipv6: { + auto _tuple5 = core.sys.wasi.p2.sockets.network.imports.Ipv6Address( + cast(ushort)(cast(uint)(*(cast(ushort*)(_retArea.ptr + 16)))), + cast(ushort)(cast(uint)(*(cast(ushort*)(_retArea.ptr + 18)))), + cast(ushort)(cast(uint)(*(cast(ushort*)(_retArea.ptr + 20)))), + cast(ushort)(cast(uint)(*(cast(ushort*)(_retArea.ptr + 22)))), + cast(ushort)(cast(uint)(*(cast(ushort*)(_retArea.ptr + 24)))), + cast(ushort)(cast(uint)(*(cast(ushort*)(_retArea.ptr + 26)))), + cast(ushort)(cast(uint)(*(cast(ushort*)(_retArea.ptr + 28)))), + cast(ushort)(cast(uint)(*(cast(ushort*)(_retArea.ptr + 30)))), + ); + core.sys.wasi.p2.sockets.network.imports.Ipv6SocketAddress _record6 = { + port: cast(ushort)(cast(uint)(*(cast(ushort*)(_retArea.ptr + 8)))), + flowInfo: *(cast(uint*)(_retArea.ptr + 12)), + address: _tuple5, + scopeId: *(cast(uint*)(_retArea.ptr + 32)), + }; + auto _payload9 = _record6; + _variant7 = core.sys.wasi.p2.sockets.network.imports.IpSocketAddress.ipv6(_payload9); + break; + } + } + + _result11 = Result!(IpSocketAddress, ErrorCode).ok(_variant7); + } + auto _flush12 = _result11; + return _flush12; + } + /// ditto + @wasmImport!("wasi:sockets/udp@0.2.12", "[method]udp-socket.remote-address") + pragma(mangle, "__wit_import_wasi:sockets__udp@0.2.12__:method:udp_socket.remote_address") + static private extern(C) void __import_remoteAddress(uint, void*) @nogc nothrow; + + /++ + + +/ + IpAddressFamily addressFamily() @nogc nothrow { + auto _ret = __import_addressFamily(this.__handle); + return cast(core.sys.wasi.p2.sockets.network.imports.IpAddressFamily)(_ret); + } + /// ditto + @wasmImport!("wasi:sockets/udp@0.2.12", "[method]udp-socket.address-family") + pragma(mangle, "__wit_import_wasi:sockets__udp@0.2.12__:method:udp_socket.address_family") + static private extern(C) uint __import_addressFamily(uint) @nogc nothrow; + + /++ + + +/ + Result!(ubyte, ErrorCode) unicastHopLimit() @nogc nothrow { + align(1) void[2] _retArea = void; + __import_unicastHopLimit(this.__handle, _retArea.ptr); + Result!(ubyte, ErrorCode) _result2 = void; + bool _isErr2 = (cast(uint)(*(cast(ubyte*)(_retArea.ptr + 0)))) != 0; + if (_isErr2) { + + _result2 = Result!(ubyte, ErrorCode).err(cast(core.sys.wasi.p2.sockets.network.imports.ErrorCode)(cast(uint)(*(cast(ubyte*)(_retArea.ptr + 1))))); + } else { + + _result2 = Result!(ubyte, ErrorCode).ok(cast(ubyte)(cast(uint)(*(cast(ubyte*)(_retArea.ptr + 1))))); + } + auto _flush3 = _result2; + return _flush3; + } + /// ditto + @wasmImport!("wasi:sockets/udp@0.2.12", "[method]udp-socket.unicast-hop-limit") + pragma(mangle, "__wit_import_wasi:sockets__udp@0.2.12__:method:udp_socket.unicast_hop_limit") + static private extern(C) void __import_unicastHopLimit(uint, void*) @nogc nothrow; + + /++ + + +/ + Result!(void, ErrorCode) setUnicastHopLimit(ubyte value) @nogc nothrow { + align(1) void[2] _retArea = void; + __import_setUnicastHopLimit(this.__handle, cast(uint)(value), _retArea.ptr); + Result!(void, ErrorCode) _result2 = void; + bool _isErr2 = (cast(uint)(*(cast(ubyte*)(_retArea.ptr + 0)))) != 0; + if (_isErr2) { + + _result2 = Result!(void, ErrorCode).err(cast(core.sys.wasi.p2.sockets.network.imports.ErrorCode)(cast(uint)(*(cast(ubyte*)(_retArea.ptr + 1))))); + } else { + + _result2 = Result!(void, ErrorCode).ok(); + } + auto _flush3 = _result2; + return _flush3; + } + /// ditto + @wasmImport!("wasi:sockets/udp@0.2.12", "[method]udp-socket.set-unicast-hop-limit") + pragma(mangle, "__wit_import_wasi:sockets__udp@0.2.12__:method:udp_socket.set_unicast_hop_limit") + static private extern(C) void __import_setUnicastHopLimit(uint, uint, void*) @nogc nothrow; + + /++ + + +/ + Result!(ulong, ErrorCode) receiveBufferSize() @nogc nothrow { + align(8) void[16] _retArea = void; + __import_receiveBufferSize(this.__handle, _retArea.ptr); + Result!(ulong, ErrorCode) _result2 = void; + bool _isErr2 = (cast(uint)(*(cast(ubyte*)(_retArea.ptr + 0)))) != 0; + if (_isErr2) { + + _result2 = Result!(ulong, ErrorCode).err(cast(core.sys.wasi.p2.sockets.network.imports.ErrorCode)(cast(uint)(*(cast(ubyte*)(_retArea.ptr + 8))))); + } else { + + _result2 = Result!(ulong, ErrorCode).ok(*(cast(ulong*)(_retArea.ptr + 8))); + } + auto _flush3 = _result2; + return _flush3; + } + /// ditto + @wasmImport!("wasi:sockets/udp@0.2.12", "[method]udp-socket.receive-buffer-size") + pragma(mangle, "__wit_import_wasi:sockets__udp@0.2.12__:method:udp_socket.receive_buffer_size") + static private extern(C) void __import_receiveBufferSize(uint, void*) @nogc nothrow; + + /++ + + +/ + Result!(void, ErrorCode) setReceiveBufferSize(ulong value) @nogc nothrow { + align(1) void[2] _retArea = void; + __import_setReceiveBufferSize(this.__handle, value, _retArea.ptr); + Result!(void, ErrorCode) _result2 = void; + bool _isErr2 = (cast(uint)(*(cast(ubyte*)(_retArea.ptr + 0)))) != 0; + if (_isErr2) { + + _result2 = Result!(void, ErrorCode).err(cast(core.sys.wasi.p2.sockets.network.imports.ErrorCode)(cast(uint)(*(cast(ubyte*)(_retArea.ptr + 1))))); + } else { + + _result2 = Result!(void, ErrorCode).ok(); + } + auto _flush3 = _result2; + return _flush3; + } + /// ditto + @wasmImport!("wasi:sockets/udp@0.2.12", "[method]udp-socket.set-receive-buffer-size") + pragma(mangle, "__wit_import_wasi:sockets__udp@0.2.12__:method:udp_socket.set_receive_buffer_size") + static private extern(C) void __import_setReceiveBufferSize(uint, ulong, void*) @nogc nothrow; + + /++ + + +/ + Result!(ulong, ErrorCode) sendBufferSize() @nogc nothrow { + align(8) void[16] _retArea = void; + __import_sendBufferSize(this.__handle, _retArea.ptr); + Result!(ulong, ErrorCode) _result2 = void; + bool _isErr2 = (cast(uint)(*(cast(ubyte*)(_retArea.ptr + 0)))) != 0; + if (_isErr2) { + + _result2 = Result!(ulong, ErrorCode).err(cast(core.sys.wasi.p2.sockets.network.imports.ErrorCode)(cast(uint)(*(cast(ubyte*)(_retArea.ptr + 8))))); + } else { + + _result2 = Result!(ulong, ErrorCode).ok(*(cast(ulong*)(_retArea.ptr + 8))); + } + auto _flush3 = _result2; + return _flush3; + } + /// ditto + @wasmImport!("wasi:sockets/udp@0.2.12", "[method]udp-socket.send-buffer-size") + pragma(mangle, "__wit_import_wasi:sockets__udp@0.2.12__:method:udp_socket.send_buffer_size") + static private extern(C) void __import_sendBufferSize(uint, void*) @nogc nothrow; + + /++ + + +/ + Result!(void, ErrorCode) setSendBufferSize(ulong value) @nogc nothrow { + align(1) void[2] _retArea = void; + __import_setSendBufferSize(this.__handle, value, _retArea.ptr); + Result!(void, ErrorCode) _result2 = void; + bool _isErr2 = (cast(uint)(*(cast(ubyte*)(_retArea.ptr + 0)))) != 0; + if (_isErr2) { + + _result2 = Result!(void, ErrorCode).err(cast(core.sys.wasi.p2.sockets.network.imports.ErrorCode)(cast(uint)(*(cast(ubyte*)(_retArea.ptr + 1))))); + } else { + + _result2 = Result!(void, ErrorCode).ok(); + } + auto _flush3 = _result2; + return _flush3; + } + /// ditto + @wasmImport!("wasi:sockets/udp@0.2.12", "[method]udp-socket.set-send-buffer-size") + pragma(mangle, "__wit_import_wasi:sockets__udp@0.2.12__:method:udp_socket.set_send_buffer_size") + static private extern(C) void __import_setSendBufferSize(uint, ulong, void*) @nogc nothrow; + + /++ + + +/ + Pollable subscribe() @nogc nothrow { + auto _ret = __import_subscribe(this.__handle); + return Pollable(_ret); + } + /// ditto + @wasmImport!("wasi:sockets/udp@0.2.12", "[method]udp-socket.subscribe") + pragma(mangle, "__wit_import_wasi:sockets__udp@0.2.12__:method:udp_socket.subscribe") + static private extern(C) uint __import_subscribe(uint) @nogc nothrow; + } +} + +/++ + ++/ +struct IncomingDatagramStream { + @nogc nothrow: + + package(core.sys.wasi.p2) uint __handle = 0; + + package(core.sys.wasi.p2) this(uint handle) { + __handle = handle; + } + + @disable this(); + + + void drop() { + __import_drop(__handle); + } + @wasmImport!("wasi:sockets/udp@0.2.12", "[resource-drop]incoming-datagram-stream") + pragma(mangle, "__wit_import_wasi:sockets__udp@0.2.12__:resource_drop:incoming_datagram_stream") + static private extern(C) void __import_drop(uint); + + alias witFree = drop; + // TODO: make RAII? disable copy for the own + + Borrow borrow() => Borrow(__handle); + alias borrow this; + + struct Borrow { + @nogc nothrow: + + package(core.sys.wasi.p2) uint __handle = 0; + + package(core.sys.wasi.p2) this(uint handle) { + __handle = handle; + } + + @disable this(); + + void witFree() {} + Borrow witClone() const { return Borrow(__handle); } + + /++ + + +/ + Result!(WitList!(IncomingDatagram), ErrorCode) receive(ulong maxResults) @nogc nothrow { + align(size_t.sizeof) void[(3*size_t.sizeof)] _retArea = void; + __import_receive(this.__handle, maxResults, _retArea.ptr); + Result!(WitList!(IncomingDatagram), ErrorCode) _result15 = void; + bool _isErr15 = (cast(uint)(*(cast(ubyte*)(_retArea.ptr + 0)))) != 0; + if (_isErr15) { + + _result15 = Result!(WitList!(IncomingDatagram), ErrorCode).err(cast(core.sys.wasi.p2.sockets.network.imports.ErrorCode)(cast(uint)(*(cast(ubyte*)(_retArea.ptr + size_t.sizeof))))); + } else { + auto _listSrcPtr13 = *(cast(void**)(_retArea.ptr + size_t.sizeof)); + auto _listLen13 = *(cast(size_t*)(_retArea.ptr + (2*size_t.sizeof))); + auto _list13 = core.sys.wasi.wit_common.mallocSlice!(IncomingDatagram)(_listLen13); + foreach (_elem1_idx, ref _elem1; _list13) { + const auto _base1 = _listSrcPtr13 + _elem1_idx * (32+2*size_t.sizeof); + auto _ptr2 = cast(ubyte*)(*(cast(void**)(_base1 + 0))); + auto _len2 = *(cast(size_t*)(_base1 + size_t.sizeof)); + core.sys.wasi.p2.sockets.network.imports.IpSocketAddress _variant9 = void; + auto _tag9 = cast(uint)(*(cast(ubyte*)(_base1 + (2*size_t.sizeof)))); + alias _Tag9 = core.sys.wasi.p2.sockets.network.imports.IpSocketAddress.Tag; + final switch (cast(core.sys.wasi.p2.sockets.network.imports.IpSocketAddress.Tag)_tag9) { + case _Tag9.ipv4: { + auto _tuple4 = core.sys.wasi.p2.sockets.network.imports.Ipv4Address( + cast(ubyte)(cast(uint)(*(cast(ubyte*)(_base1 + (6+2*size_t.sizeof))))), + cast(ubyte)(cast(uint)(*(cast(ubyte*)(_base1 + (7+2*size_t.sizeof))))), + cast(ubyte)(cast(uint)(*(cast(ubyte*)(_base1 + (8+2*size_t.sizeof))))), + cast(ubyte)(cast(uint)(*(cast(ubyte*)(_base1 + (9+2*size_t.sizeof))))), + ); + core.sys.wasi.p2.sockets.network.imports.Ipv4SocketAddress _record5 = { + port: cast(ushort)(cast(uint)(*(cast(ushort*)(_base1 + (4+2*size_t.sizeof))))), + address: _tuple4, + }; + auto _payload10 = _record5; + _variant9 = core.sys.wasi.p2.sockets.network.imports.IpSocketAddress.ipv4(_payload10); + break; + } + case _Tag9.ipv6: { + auto _tuple7 = core.sys.wasi.p2.sockets.network.imports.Ipv6Address( + cast(ushort)(cast(uint)(*(cast(ushort*)(_base1 + (12+2*size_t.sizeof))))), + cast(ushort)(cast(uint)(*(cast(ushort*)(_base1 + (14+2*size_t.sizeof))))), + cast(ushort)(cast(uint)(*(cast(ushort*)(_base1 + (16+2*size_t.sizeof))))), + cast(ushort)(cast(uint)(*(cast(ushort*)(_base1 + (18+2*size_t.sizeof))))), + cast(ushort)(cast(uint)(*(cast(ushort*)(_base1 + (20+2*size_t.sizeof))))), + cast(ushort)(cast(uint)(*(cast(ushort*)(_base1 + (22+2*size_t.sizeof))))), + cast(ushort)(cast(uint)(*(cast(ushort*)(_base1 + (24+2*size_t.sizeof))))), + cast(ushort)(cast(uint)(*(cast(ushort*)(_base1 + (26+2*size_t.sizeof))))), + ); + core.sys.wasi.p2.sockets.network.imports.Ipv6SocketAddress _record8 = { + port: cast(ushort)(cast(uint)(*(cast(ushort*)(_base1 + (4+2*size_t.sizeof))))), + flowInfo: *(cast(uint*)(_base1 + (8+2*size_t.sizeof))), + address: _tuple7, + scopeId: *(cast(uint*)(_base1 + (28+2*size_t.sizeof))), + }; + auto _payload11 = _record8; + _variant9 = core.sys.wasi.p2.sockets.network.imports.IpSocketAddress.ipv6(_payload11); + break; + } + } + IncomingDatagram _record12 = { + data: WitList!(ubyte)(_ptr2[0.._len2]), + remoteAddress: _variant9, + }; + _elem1 = _record12; + } + + _result15 = Result!(WitList!(IncomingDatagram), ErrorCode).ok(WitList!(IncomingDatagram)(_list13)); + } + auto _flush16 = _result15; + return _flush16; + } + /// ditto + @wasmImport!("wasi:sockets/udp@0.2.12", "[method]incoming-datagram-stream.receive") + pragma(mangle, "__wit_import_wasi:sockets__udp@0.2.12__:method:incoming_datagram_stream.receive") + static private extern(C) void __import_receive(uint, ulong, void*) @nogc nothrow; + + /++ + + +/ + Pollable subscribe() @nogc nothrow { + auto _ret = __import_subscribe(this.__handle); + return Pollable(_ret); + } + /// ditto + @wasmImport!("wasi:sockets/udp@0.2.12", "[method]incoming-datagram-stream.subscribe") + pragma(mangle, "__wit_import_wasi:sockets__udp@0.2.12__:method:incoming_datagram_stream.subscribe") + static private extern(C) uint __import_subscribe(uint) @nogc nothrow; + } +} + +/++ + ++/ +struct OutgoingDatagramStream { + @nogc nothrow: + + package(core.sys.wasi.p2) uint __handle = 0; + + package(core.sys.wasi.p2) this(uint handle) { + __handle = handle; + } + + @disable this(); + + + void drop() { + __import_drop(__handle); + } + @wasmImport!("wasi:sockets/udp@0.2.12", "[resource-drop]outgoing-datagram-stream") + pragma(mangle, "__wit_import_wasi:sockets__udp@0.2.12__:resource_drop:outgoing_datagram_stream") + static private extern(C) void __import_drop(uint); + + alias witFree = drop; + // TODO: make RAII? disable copy for the own + + Borrow borrow() => Borrow(__handle); + alias borrow this; + + struct Borrow { + @nogc nothrow: + + package(core.sys.wasi.p2) uint __handle = 0; + + package(core.sys.wasi.p2) this(uint handle) { + __handle = handle; + } + + @disable this(); + + void witFree() {} + Borrow witClone() const { return Borrow(__handle); } + + /++ + + +/ + Result!(ulong, ErrorCode) checkSend() @nogc nothrow { + align(8) void[16] _retArea = void; + __import_checkSend(this.__handle, _retArea.ptr); + Result!(ulong, ErrorCode) _result2 = void; + bool _isErr2 = (cast(uint)(*(cast(ubyte*)(_retArea.ptr + 0)))) != 0; + if (_isErr2) { + + _result2 = Result!(ulong, ErrorCode).err(cast(core.sys.wasi.p2.sockets.network.imports.ErrorCode)(cast(uint)(*(cast(ubyte*)(_retArea.ptr + 8))))); + } else { + + _result2 = Result!(ulong, ErrorCode).ok(*(cast(ulong*)(_retArea.ptr + 8))); + } + auto _flush3 = _result2; + return _flush3; + } + /// ditto + @wasmImport!("wasi:sockets/udp@0.2.12", "[method]outgoing-datagram-stream.check-send") + pragma(mangle, "__wit_import_wasi:sockets__udp@0.2.12__:method:outgoing_datagram_stream.check_send") + static private extern(C) void __import_checkSend(uint, void*) @nogc nothrow; + + /++ + + +/ + Result!(ulong, ErrorCode) send(in WitList!(OutgoingDatagram) datagrams) @nogc nothrow { + align(8) void[16] _retArea = void; + auto _listSrc10 = datagrams; + auto _list10 = core.sys.wasi.wit_common.malloc(_listSrc10.length * ((32+3*size_t.sizeof))); + scope(exit) { core.sys.wasi.wit_common.free(_list10); } + foreach (_elem0_idx, const ref _elem0; _listSrc10) { + auto _base0 = _list10 + _elem0_idx * ((32+3*size_t.sizeof)); + *cast(size_t*)(_base0 + size_t.sizeof) = cast(size_t)(_elem0.data.length); + *cast(void**)(_base0 + 0) = cast(void*)(cast(void*)(_elem0.data.ptr)); + if (_elem0.remoteAddress.isSome) { + ref _payload4 = _elem0.remoteAddress.unwrap(); + *cast(ubyte*)(_base0 + (2*size_t.sizeof)) = cast(ubyte)(1); + alias _Tag9 = core.sys.wasi.p2.sockets.network.imports.IpSocketAddress.Tag; + final switch (_payload4.tag) { + case _Tag9.ipv4: { + const ref core.sys.wasi.p2.sockets.network.imports.Ipv4SocketAddress _payload6 = _payload4.getIpv4(); + *cast(ubyte*)(_base0 + (4+2*size_t.sizeof)) = cast(ubyte)(0); + *cast(ushort*)(_base0 + (8+2*size_t.sizeof)) = cast(ushort)(cast(uint)(_payload6.port)); + *cast(ubyte*)(_base0 + (10+2*size_t.sizeof)) = cast(ubyte)(cast(uint)(_payload6.address[0])); + *cast(ubyte*)(_base0 + (11+2*size_t.sizeof)) = cast(ubyte)(cast(uint)(_payload6.address[1])); + *cast(ubyte*)(_base0 + (12+2*size_t.sizeof)) = cast(ubyte)(cast(uint)(_payload6.address[2])); + *cast(ubyte*)(_base0 + (13+2*size_t.sizeof)) = cast(ubyte)(cast(uint)(_payload6.address[3])); + break; + } + case _Tag9.ipv6: { + const ref core.sys.wasi.p2.sockets.network.imports.Ipv6SocketAddress _payload8 = _payload4.getIpv6(); + *cast(ubyte*)(_base0 + (4+2*size_t.sizeof)) = cast(ubyte)(1); + *cast(ushort*)(_base0 + (8+2*size_t.sizeof)) = cast(ushort)(cast(uint)(_payload8.port)); + *cast(uint*)(_base0 + (12+2*size_t.sizeof)) = cast(uint)(_payload8.flowInfo); + *cast(ushort*)(_base0 + (16+2*size_t.sizeof)) = cast(ushort)(cast(uint)(_payload8.address[0])); + *cast(ushort*)(_base0 + (18+2*size_t.sizeof)) = cast(ushort)(cast(uint)(_payload8.address[1])); + *cast(ushort*)(_base0 + (20+2*size_t.sizeof)) = cast(ushort)(cast(uint)(_payload8.address[2])); + *cast(ushort*)(_base0 + (22+2*size_t.sizeof)) = cast(ushort)(cast(uint)(_payload8.address[3])); + *cast(ushort*)(_base0 + (24+2*size_t.sizeof)) = cast(ushort)(cast(uint)(_payload8.address[4])); + *cast(ushort*)(_base0 + (26+2*size_t.sizeof)) = cast(ushort)(cast(uint)(_payload8.address[5])); + *cast(ushort*)(_base0 + (28+2*size_t.sizeof)) = cast(ushort)(cast(uint)(_payload8.address[6])); + *cast(ushort*)(_base0 + (30+2*size_t.sizeof)) = cast(ushort)(cast(uint)(_payload8.address[7])); + *cast(uint*)(_base0 + (32+2*size_t.sizeof)) = cast(uint)(_payload8.scopeId); + break; + } + } + } else { + *cast(ubyte*)(_base0 + (2*size_t.sizeof)) = cast(ubyte)(0); + } + + } + __import_send(this.__handle, _list10, datagrams.length, _retArea.ptr); + Result!(ulong, ErrorCode) _result13 = void; + bool _isErr13 = (cast(uint)(*(cast(ubyte*)(_retArea.ptr + 0)))) != 0; + if (_isErr13) { + + _result13 = Result!(ulong, ErrorCode).err(cast(core.sys.wasi.p2.sockets.network.imports.ErrorCode)(cast(uint)(*(cast(ubyte*)(_retArea.ptr + 8))))); + } else { + + _result13 = Result!(ulong, ErrorCode).ok(*(cast(ulong*)(_retArea.ptr + 8))); + } + auto _flush14 = _result13; + return _flush14; + } + /// ditto + @wasmImport!("wasi:sockets/udp@0.2.12", "[method]outgoing-datagram-stream.send") + pragma(mangle, "__wit_import_wasi:sockets__udp@0.2.12__:method:outgoing_datagram_stream.send") + static private extern(C) void __import_send(uint, void*, size_t, void*) @nogc nothrow; + + /++ + + +/ + Pollable subscribe() @nogc nothrow { + auto _ret = __import_subscribe(this.__handle); + return Pollable(_ret); + } + /// ditto + @wasmImport!("wasi:sockets/udp@0.2.12", "[method]outgoing-datagram-stream.subscribe") + pragma(mangle, "__wit_import_wasi:sockets__udp@0.2.12__:method:outgoing_datagram_stream.subscribe") + static private extern(C) uint __import_subscribe(uint) @nogc nothrow; + } +} diff --git a/druntime/src/core/sys/wasi/p2/sockets/udp_create_socket/common.d b/druntime/src/core/sys/wasi/p2/sockets/udp_create_socket/common.d new file mode 100644 index 000000000000..72043164747a --- /dev/null +++ b/druntime/src/core/sys/wasi/p2/sockets/udp_create_socket/common.d @@ -0,0 +1,21 @@ +/++ + ++/ +module core.sys.wasi.p2.sockets.udp_create_socket.common; + +import core.sys.wasi.wit_common; + +static import core.sys.wasi.p2.sockets.network.common; +static import core.sys.wasi.p2.sockets.udp.common; + +package (core.sys.wasi.p2) void __wit_bindgen_component_type_force_link() pure @nogc nothrow => imported!"core.sys.wasi.p2.cli.imports".__wit_bindgen_component_type_force_link(); + +/++ + ++/ +alias ErrorCode = core.sys.wasi.p2.sockets.network.common.ErrorCode; + +/++ + ++/ +alias IpAddressFamily = core.sys.wasi.p2.sockets.network.common.IpAddressFamily; diff --git a/druntime/src/core/sys/wasi/p2/sockets/udp_create_socket/imports.d b/druntime/src/core/sys/wasi/p2/sockets/udp_create_socket/imports.d new file mode 100644 index 000000000000..2d0b79f70b61 --- /dev/null +++ b/druntime/src/core/sys/wasi/p2/sockets/udp_create_socket/imports.d @@ -0,0 +1,46 @@ +/++ + ++/ +module core.sys.wasi.p2.sockets.udp_create_socket.imports; + +import core.sys.wasi.wit_common; + +public import core.sys.wasi.p2.sockets.udp_create_socket.common; + +static import core.sys.wasi.p2.sockets.network.imports; +static import core.sys.wasi.p2.sockets.udp.imports; + +package (core.sys.wasi.p2) void __wit_bindgen_component_type_force_link() pure @nogc nothrow => imported!"core.sys.wasi.p2.cli.imports".__wit_bindgen_component_type_force_link(); + +/++ + ++/ +alias Network = core.sys.wasi.p2.sockets.network.imports.Network; + +/++ + ++/ +alias UdpSocket = core.sys.wasi.p2.sockets.udp.imports.UdpSocket; + +/++ + ++/ +Result!(UdpSocket, ErrorCode) createUdpSocket(in IpAddressFamily addressFamily) @nogc nothrow { + align(4) void[8] _retArea = void; + __import_createUdpSocket(cast(uint)(addressFamily), _retArea.ptr); + Result!(UdpSocket, ErrorCode) _result2 = void; + bool _isErr2 = (cast(uint)(*(cast(ubyte*)(_retArea.ptr + 0)))) != 0; + if (_isErr2) { + + _result2 = Result!(UdpSocket, ErrorCode).err(cast(core.sys.wasi.p2.sockets.network.imports.ErrorCode)(cast(uint)(*(cast(ubyte*)(_retArea.ptr + 4))))); + } else { + + _result2 = Result!(UdpSocket, ErrorCode).ok(UdpSocket(*(cast(uint*)(_retArea.ptr + 4)))); + } + auto _flush3 = _result2; + return _flush3; +} +/// ditto +@wasmImport!("wasi:sockets/udp-create-socket@0.2.12", "create-udp-socket") +pragma(mangle, "__wit_import_wasi:sockets__udp_create_socket@0.2.12__create_udp_socket") +private extern(C) void __import_createUdpSocket(uint, void*) @nogc nothrow; diff --git a/druntime/src/core/sys/wasi/wit_common.d b/druntime/src/core/sys/wasi/wit_common.d new file mode 100644 index 000000000000..21d29b96268e --- /dev/null +++ b/druntime/src/core/sys/wasi/wit_common.d @@ -0,0 +1,453 @@ +module core.sys.wasi.wit_common; + +import core.attribute : mustuse; +import ldc.attributes : llvmAttr; + +alias wasmImport(string mod, string name) = AliasSeq!( + llvmAttr("wasm-import-module", mod), + llvmAttr("wasm-import-name", name) +); + +enum wasmExport(string name) = llvmAttr("wasm-export-name", name); + +struct witExport { string mod; string name; } + +/// Thin CABI compliant wrapper over `T[]` +struct WitList(T) { +@safe @nogc pure nothrow: + T* ptr; + size_t length; + + this(inout T[] slice) inout @trusted { + ptr = slice.ptr; + length = slice.length; + } + + void opAssign(T[] slice) @trusted { + ptr = slice.ptr; + length = slice.length; + } + + alias asSlice this; + inout(T)[] asSlice() @trusted inout { + return (ptr && length) ? ptr[0..length] : null; + } + + bool opEquals(in T[] other) const => this[] == other; + size_t toHash() const => this[].hashOf; +} +auto witList(T : U[], U)(inout T slice) => inout WitList!U(slice); + +// WIT ABI for string matches List, +// except list in WIT is actually List!(dchar) +// +// We assume UTF-8 data (as D native strings are UTF-8) +alias WitString = WitList!(char); + +// TODO: split this file up and give Tuple a full port of the Phobos version? +/// adapted from Phobos std.typecons.Tuple +/// No support for naming members. +struct Tuple(Types...) if (is(Types)) { + Types expand; + alias expand this; +} + +mixin template WitFlags(T) if (__traits(isUnsigned, T)) { + private alias F = typeof(this); + + T bits; + + @safe nothrow @nogc pure: + + static typeof(this) opIndex(size_t i) + in(i < T.sizeof*8) => F(cast(T)(1 << i)); + + auto opUnary(string op : "~")() const => F(~bits); + + auto ref opOpAssign(string op)(F rhs) + if (op == "|" || op == "&" || op == "^") + { + mixin("bits "~op~"= rhs.bits;"); + return this; + } + + auto opBinary(string op)(F flags) const + if (op == "|" || op == "&" || op == "^") + { + F result = this; + result.opOpAssign!op(flags); + return result; + } + + typeof(this) witClone() const { return this; } +} + + +mixin template WitVariant(Types...) { +private: + static assert(is(typeof(this).Tag)); + static assert(is(Tag U == enum) && __traits(isIntegral, U)); + + static assert(__traits(allMembers, Tag).length == Types.length); + static foreach (i, M; __traits(allMembers, Tag)) { + static assert(i == __traits(getMember, Tag, M)); + } + + union Storage { + template ReplacedTypes() { + alias ReplacedTypes = AliasSeq!(); + + static foreach (T; Types) { + static if (is(T == void)) + ReplacedTypes = AliasSeq!(ReplacedTypes, void[0]); + else + ReplacedTypes = AliasSeq!(ReplacedTypes, T); + } + } + + ubyte __zeroinit = 0; + ReplacedTypes!() members; + } + + Tag _tag; + Storage _storage; + + + @disable this(); + + this(Tag tag, inout Storage storage = Storage.init) inout @nogc nothrow @trusted { + _tag = tag; + _storage = storage; + } + + + static auto _create(Tag tag)() if (is(Types[tag] == void)) { + return typeof(this)(tag); + } + static auto _create(Tag tag)(inout Types[tag] val) if (!is(Types[tag] == void)) { + Storage storage = Storage.init; + storage.tupleof[tag+1] = cast(Types[tag])val; + return inout typeof(this)(tag, cast(inout(Storage))storage); + } + + ref auto _get(Tag tag)() inout return if (!is(Types[tag] == void)) + in (_tag == tag) do { return cast(inout)_storage.tupleof[tag+1]; } +} + +/// Based on Rust's Option +struct Option(T) { +private: + bool _present = false; + T _value; + + this(bool present, inout T value) inout @safe @nogc nothrow { + _present = present; + _value = value; + } +public: + static inout(Option) some(inout T value) @safe @nogc nothrow { + return inout Option(true, value); + } + + static Option none() @safe @nogc nothrow { + return Option(false, T.init); + } + + bool isSome() const @safe @nogc nothrow => _present; + alias isSome this; // implicit conversion to bool + + bool isNone() const @safe @nogc nothrow => !_present; + + ref inout(T) unwrap() inout @trusted @nogc nothrow return + in (_present) do { return _value; } + + T unwrapOr(T fallback) @trusted @nogc nothrow => _present ? _value : fallback; + + T unwrapOrElse(D)(scope D fallback) + if (is(D R == return) && is(R : T) && is(D == __parameters)) + { return _present ? _value : fallback(); } +} + +auto some(T)(inout T value) @safe @nogc nothrow { + return Option!T.some(value); +} + +auto none(T)() @safe @nogc nothrow { + return Option!T.none; +} + +/// Based on Rust's Result +@mustuse +struct Result(T = void, E = void) { +private: + bool _hasError; + union Storage { + ubyte __zeroinit = 0; + static if (!is(T == void)) { + T value; + } + static if (!is(E == void)) { + E error; + } + } + Storage _storage; + + this(bool hasError, inout(Storage) storage) inout @safe @nogc nothrow { + _hasError = hasError; + _storage = storage; + } + +public: + static if (is(T == void)) { + static Result ok() @safe @nogc nothrow => Result(false, Storage.init); + } else { + static Result ok(inout(T) value) @trusted @nogc nothrow { + Storage newStorage = Storage.init; + newStorage.value = cast(T)value; + + return Result(false, cast(inout Storage)newStorage); + } + } + + static if (is(E == void)) { + static Result err() @safe @nogc nothrow => Result(true, Storage.init); + } else { + static inout(Result) err(inout(E) error) @trusted @nogc nothrow { + Storage newStorage = Storage.init; + newStorage.error = cast(E)error; + + return inout Result(true, cast(inout Storage)newStorage); + } + } + + bool isOk() const @safe @nogc nothrow => !_hasError; + + bool isErr() const @safe @nogc nothrow => _hasError; + alias isErr this; // implicit conversion to bool + + static if (!is(T == void)) { + ref inout(T) unwrap() inout @trusted @nogc nothrow return + in (isOk) do { return _storage.value; } + + T unwrapOr(T fallback) @trusted @nogc nothrow => isOk ? _storage.value : fallback; + + T unwrapOrElse(D)(scope D fallback) + if (is(D R == return) && is(R : T) && is(D == __parameters)) + { return isOk ? _storage.value : fallback(); } + } + + static if (!is(E == void)) { + ref inout(E) unwrapErr() inout @trusted @nogc nothrow return + in (isErr) do { return _storage.error; } + } +} + + +void witFree(T)(scope ref T val) @nogc nothrow if (__traits(isArithmetic, T)) { + // no-op +} +T witClone(T)(in T val) @nogc nothrow if (__traits(isArithmetic, T)) { + return val; +} + +void witFree(T : Option!U, U)(scope ref T val) @nogc nothrow { + static if (!is(U == void)) if (val.isSome) val.unwrap.witFree; +} +T witClone(T : Option!U, U)(in T val) { + if (val.isSome) { + static if (!is(U == void)) { + return T.some(val.unwrap.witClone); + } else { + return T.some; + } + } else { + return T.none; + } +} + +void witFree(T : Result!(U, V), U, V)(scope ref T val) @nogc nothrow { + if (val.isErr) { + static if (!is(V == void)) val.unwrapErr.witFree; + } else { + static if (!is(U == void)) val.unwrap.witFree; + } +} +T witClone(T : Result!(U, V), U, V)(in T val) @nogc nothrow { + if (val.isErr) { + static if (!is(V == void)) { + return T.err(val.unwrapErr.witClone); + } else { + return T.err; + } + } else { + static if (!is(U == void)) { + return T.ok(val.unwrap.witClone); + } else { + return T.ok; + } + } +} + +void witFree(T : WitList!U, U)(scope ref T val) @nogc nothrow { + foreach (ref e; val) { + e.witFree; + } + if (val.ptr && val.length) free(val.ptr); + val = null; +} +T witClone(T : WitList!U, U)(in T val) @nogc nothrow { + if (val.ptr == null || val.length == 0) return T(null); + + auto clone = mallocSlice!U(val.length); + + foreach (i, ref e; clone) { + e = val[i].witClone; + } + + return clone.witList; +} + +void witFree(T : Tuple!U, U...)(scope ref T val) @nogc nothrow { + static foreach (F; T.tupleof) { + __traits(child, val, F).witFree; + } +} +T witClone(T : Tuple!U, U...)(in T val) @nogc nothrow { + T clone; + static foreach (F; T.tupleof) { + __traits(child, clone, F) = __traits(child, val, F).witClone; + } + return clone; +} + + +void witFree(T : U[L], U, size_t L)(scope ref T val) @nogc nothrow { + foreach (ref e; val) { + e.witFree; + } +} +T witClone(T : U[L], U, size_t L)(in T val) @nogc nothrow { + T clone; + foreach (i, ref e; clone) { + e = val[i].witClone; + } + return clone; +} + +package: + +package import core.stdc.stdlib : malloc, free; + +// from https://github.com/Inochi2D/numem/blob/main/source/numem/casting.d +// Copyright © 2023-2025, Kitsunebi Games +// Copyright © 2023-2025, Inochi2D Project +// License: $(LINK2 http://www.boost.org/LICENSE_1_0.txt, Boost License 1.0) +// Authors: Luna Nielsen +pragma(inline, true) +auto ref T reinterpretCast(T, U)(auto ref U from) @trusted if (T.sizeof == U.sizeof) { + union tmp { U from; T to; } + return tmp(from).to; +} + +auto mallocSlice(T)(size_t count) @nogc nothrow { + auto ptr = malloc(count*T.sizeof); + if (ptr is null) return null; + + return (cast(T*)ptr)[0..count]; +} + +// from std.meta +alias AliasSeq(T...) = T; + + +template findWitExportFunc(string mod, string name, Sig, bool implicitSelf, Impl...) { + static foreach(Func; Impl) { + static foreach(uda; __traits(getAttributes, Func)) { + static if (!is(uda) && is(typeof(uda) == witExport) && uda == witExport(mod, name)) { + static assert( + !is(Func) && + (is(typeof(Func) == function)), + "The implementation of '", mod, "#", name, "' ", + "`", __traits(fullyQualifiedName, findWitExportFunc), "` ", + "must be a function or method." + ); + + static assert( + !is(typeof(findWitExportFunc) == void) || __traits(isSame, findWitExportFunc, Func), + "There must be only one implementation of '", mod, "#", name, "'. ", + "Found at least `", __traits(fullyQualifiedName, findWitExportFunc), + "` and `", __traits(fullyQualifiedName, Func), "`." + ); + alias findWitExportFunc = Func; + } + } + } + + static assert( + !is(typeof(findWitExportFunc) == void), + "Could not find implementation for '", mod, "#", name, "'" + ); + + static assert( + is(typeof(&findWitExportFunc) : Sig) && __traits(isStaticFunction, findWitExportFunc) != implicitSelf, + "The implementation of '", mod, "#", name, "' ", + "`", __traits(fullyQualifiedName, findWitExportFunc), "` ", + "must conform to the necessary signature. ", + "Found `", typeof(&findWitExportFunc), "`", + ", but expected `", Sig, "`" + ); +} + +template findWitExportResource(string mod, string name, Impl...) { + static foreach(Resource; Impl) { + static foreach(uda; __traits(getAttributes, Resource)) { + static if (!is(uda) && is(typeof(uda) == witExport) && uda == witExport(mod, name)) { + static assert( + is(Resource == struct), + "The implementation of '", mod, "#", name, "' ", + "`", __traits(fullyQualifiedName, findWitExportResource), "` ", + "must be a struct." + ); + + static assert( + !is(typeof(findWitExportResource) == void) || __traits(isSame, findWitExportResource, Resource), + "There must be only one implementation of '", mod, "#", name, "'. ", + "Found at least `", __traits(fullyQualifiedName, findWitExportResource), + "` and `", __traits(fullyQualifiedName, Resource), "`." + ); + alias findWitExportResource = Resource; + } + } + } + + static assert( + !is(typeof(findWitExportResource) == void), + "Could not find implementation for '", mod, "#", name, "'" + ); +} + + +template witExportsIn(T) { + alias witExportsIn = AliasSeq!(); + + static foreach(M; __traits(allMembers, T)) { + static foreach(Export; __traits(getOverloads, T, M)) { + static foreach(uda; __traits(getAttributes, Export)) { + static if (!is(uda) && is(typeof(uda) == witExport)) { + witExportsIn = AliasSeq!(witExportsIn, Export); + } + } + } + } +} + +// Defined by `wasi_libc` +/* +@wasmExport!("cabi_realloc") +void* cabi_realloc(void *ptr, size_t oldSize, size_t alignment, size_t newSize) { + if (newSize == 0) return cast(void*)alignment; + void *ret = realloc(ptr, newSize); + if (!ret) abort(); + return ret; +} +*/ diff --git a/druntime/src/core/thread/wasi_impl.d b/druntime/src/core/thread/wasi_impl.d index c72d5f6f79ec..f5d3f2e9d256 100644 --- a/druntime/src/core/thread/wasi_impl.d +++ b/druntime/src/core/thread/wasi_impl.d @@ -24,11 +24,13 @@ version (WASI): // No real threading support // Just manipulations of the main "thread" -version (WASIp1) { +version (WASIp1) +{ import core.sys.wasi.p1 : ClockID, schedYield, Subscription, SubscriptionClock, pollOneOff, Event; -} else { - import core.stdc.errno : EINTR, errno; - import core.sys.wasi.posix.time : nanosleep, timespec; +} +else version (WASIp2) +{ + import core.sys.wasi.p2.clocks.monotonic_clock.imports : subscribeDuration; } version (CoreDdoc) {} else @@ -151,22 +153,13 @@ class Thread : ThreadBase if (err || event.error) assert(0, "Unable to sleep for the specified duration"); return; - } else { - // fall back to emulated POSIX - timespec tin = void; - timespec tout = void; - - val.split!("seconds", "nsecs")(tin.tv_sec, tin.tv_nsec); - if ( val.total!"seconds" > tin.tv_sec.max ) - tin.tv_sec = tin.tv_sec.max; - while ( true ) - { - if ( !nanosleep( &tin, &tout ) ) - return; - if ( errno != EINTR ) - assert(0, "Unable to sleep for the specified duration"); - tin = tout; - } + } + else version (WASIp2) + { + auto pollable = subscribeDuration(val.total!"nsecs"); + scope(exit) pollable.drop(); + + pollable.block(); } } diff --git a/druntime/src/core/time.d b/druntime/src/core/time.d index 4bf19c5b73f0..53f849f5d3e8 100644 --- a/druntime/src/core/time.d +++ b/druntime/src/core/time.d @@ -98,7 +98,7 @@ else version (WASIp1) } else version (WASIp2) { - import core.sys.wasi.posix.time : clock_getres, clock_gettime, CLOCK_MONOTONIC, timespec; + import monotonic_clock = core.sys.wasi.p2.clocks.monotonic_clock.imports; } version (unittest) import core.stdc.stdio : printf; @@ -494,21 +494,6 @@ version (Posix) assert(0, "What are the monotonic clock types supported by this system?"); } } -else -version (WASIp2) -{ - private auto _posixClock(ClockType clockType) - { - import core.sys.wasi.posix.time; - with(ClockType) final switch (clockType) - { - case coarse: return CLOCK_MONOTONIC; - case normal: return CLOCK_MONOTONIC; - case precise: return CLOCK_MONOTONIC; - case second: assert(0); - } - } -} version (WASIp1) { @@ -2218,7 +2203,13 @@ struct MonoTimeImpl(ClockType clockType) } else version (WASIp2) { - enum clockArg = _posixClock(clockType); + static if (clockType != ClockType.coarse && + clockType != ClockType.normal && + clockType != ClockType.precise) + { + static assert(0, "ClockType." ~ _clockName ~ + " is not supported by MonoTimeImpl on this system."); + } } else static assert(0, "Unsupported platform"); @@ -2298,19 +2289,7 @@ struct MonoTimeImpl(ClockType clockType) } else version (WASIp2) { - timespec ts = void; - immutable error = clock_gettime(clockArg, &ts); - // clockArg is supported and if tv_sec is long or larger - // overflow won't happen before 292 billion years A.D. - static if (ts.tv_sec.max < long.max) - { - if (error) - { - import core.internal.abort : abort; - abort("Call to clock_gettime failed."); - } - } - return MonoTimeImpl(convClockFreq(ts.tv_sec * 1_000_000_000L + ts.tv_nsec, + return MonoTimeImpl(convClockFreq(monotonic_clock.now, 1_000_000_000L, ticksPerSecond)); } @@ -2731,30 +2710,14 @@ extern(C) void _d_initMonoTime() @nogc nothrow } else version (WASIp2) { - timespec ts; + immutable long ticksPerSecond = 1_000_000_000 / monotonic_clock.resolution; foreach (i, typeStr; __traits(allMembers, ClockType)) { - static if (typeStr != "second") - { - enum clockArg = _posixClock(__traits(getMember, ClockType, typeStr)); - if (clock_getres(clockArg, &ts) == 0) - { - // ensure we are only writing immutable data once - if (tps[i] != 0) - // should only be called once - assert(0); - - // For some reason, on some systems, clock_getres returns - // a resolution which is clearly wrong: - // - it's a millisecond or worse, but the time is updated - // much more frequently than that. - // - it's negative - // - it's zero - // In such cases, we'll just use nanosecond resolution. - tps[i] = ts.tv_sec != 0 || ts.tv_nsec <= 0 || ts.tv_nsec >= 1000 - ? 1_000_000_000L : 1_000_000_000L / ts.tv_nsec; - } - } + // ensure we are only writing immutable data once + if (tps[i] != 0) + // should only be called once + assert(0); + tps[i] = ticksPerSecond; } } else @@ -3071,20 +3034,7 @@ deprecated: } else version (WASIp2) { - timespec ts; - - if (clock_getres(CLOCK_MONOTONIC, &ts) != 0) - ticksPerSec = 0; - else - { - //For some reason, on some systems, clock_getres returns - //a resolution which is clearly wrong (it's a millisecond - //or worse, but the time is updated much more frequently - //than that). In such cases, we'll just use nanosecond - //resolution. - ticksPerSec = ts.tv_nsec >= 1000 ? 1_000_000_000 - : 1_000_000_000 / ts.tv_nsec; - } + ticksPerSec = 1_000_000_000 / monotonic_clock.resolution; } else static assert(0, "Unsupported platform"); @@ -3669,20 +3619,7 @@ deprecated: } else version (WASIp2) { - timespec ts = void; - immutable error = clock_gettime(CLOCK_MONOTONIC, &ts); - // CLOCK_MONOTONIC is supported and if tv_sec is long or larger - // overflow won't happen before 292 billion years A.D. - static if (ts.tv_sec.max < long.max) - { - if (error) - { - import core.internal.abort : abort; - abort("Call to clock_gettime failed."); - } - } - return TickDuration(ts.tv_sec * TickDuration.ticksPerSec + - ts.tv_nsec * TickDuration.ticksPerSec / 1000 / 1000 / 1000); + return TickDuration(monotonic_clock.now / 1_000_000_000); } } From 2f4f058d16228372e26c31511e6ee7c05be69b39 Mon Sep 17 00:00:00 2001 From: Demetrius Kanios Date: Sat, 25 Jul 2026 13:36:51 -0700 Subject: [PATCH 2/2] Regen with bytecodealliance/wit-bindgen@fdda82b --- .../core/sys/wasi/p2/cli/environment/common.d | 2 + .../sys/wasi/p2/cli/environment/imports.d | 4 + .../src/core/sys/wasi/p2/cli/exit/common.d | 2 + .../src/core/sys/wasi/p2/cli/exit/imports.d | 2 + .../src/core/sys/wasi/p2/cli/stderr/common.d | 2 + .../src/core/sys/wasi/p2/cli/stderr/imports.d | 2 + .../src/core/sys/wasi/p2/cli/stdin/common.d | 2 + .../src/core/sys/wasi/p2/cli/stdin/imports.d | 2 + .../src/core/sys/wasi/p2/cli/stdout/common.d | 2 + .../src/core/sys/wasi/p2/cli/stdout/imports.d | 2 + .../sys/wasi/p2/cli/terminal_input/common.d | 2 + .../sys/wasi/p2/cli/terminal_input/imports.d | 2 + .../sys/wasi/p2/cli/terminal_output/common.d | 2 + .../sys/wasi/p2/cli/terminal_output/imports.d | 2 + .../sys/wasi/p2/cli/terminal_stderr/common.d | 2 + .../sys/wasi/p2/cli/terminal_stderr/imports.d | 2 + .../sys/wasi/p2/cli/terminal_stdin/common.d | 2 + .../sys/wasi/p2/cli/terminal_stdin/imports.d | 2 + .../sys/wasi/p2/cli/terminal_stdout/common.d | 2 + .../sys/wasi/p2/cli/terminal_stdout/imports.d | 2 + .../wasi/p2/clocks/monotonic_clock/common.d | 2 + .../wasi/p2/clocks/monotonic_clock/imports.d | 2 + .../sys/wasi/p2/clocks/wall_clock/common.d | 2 + .../sys/wasi/p2/clocks/wall_clock/imports.d | 2 + .../sys/wasi/p2/filesystem/preopens/common.d | 2 + .../sys/wasi/p2/filesystem/preopens/imports.d | 3 + .../sys/wasi/p2/filesystem/types/common.d | 2 + .../sys/wasi/p2/filesystem/types/imports.d | 2 + .../src/core/sys/wasi/p2/io/error/common.d | 2 + .../src/core/sys/wasi/p2/io/error/imports.d | 2 + .../src/core/sys/wasi/p2/io/poll/common.d | 2 + .../src/core/sys/wasi/p2/io/poll/imports.d | 2 + .../src/core/sys/wasi/p2/io/streams/common.d | 2 + .../src/core/sys/wasi/p2/io/streams/imports.d | 2 + druntime/src/core/sys/wasi/p2/package.d | 15 ++++ .../core/sys/wasi/p2/random/insecure/common.d | 2 + .../sys/wasi/p2/random/insecure/imports.d | 2 + .../sys/wasi/p2/random/insecure_seed/common.d | 2 + .../wasi/p2/random/insecure_seed/imports.d | 2 + .../core/sys/wasi/p2/random/random/common.d | 2 + .../core/sys/wasi/p2/random/random/imports.d | 2 + .../wasi/p2/sockets/instance_network/common.d | 2 + .../p2/sockets/instance_network/imports.d | 2 + .../wasi/p2/sockets/ip_name_lookup/common.d | 2 + .../wasi/p2/sockets/ip_name_lookup/imports.d | 2 + .../core/sys/wasi/p2/sockets/network/common.d | 2 + .../sys/wasi/p2/sockets/network/imports.d | 2 + .../src/core/sys/wasi/p2/sockets/tcp/common.d | 2 + .../core/sys/wasi/p2/sockets/tcp/imports.d | 2 + .../p2/sockets/tcp_create_socket/common.d | 2 + .../p2/sockets/tcp_create_socket/imports.d | 2 + .../src/core/sys/wasi/p2/sockets/udp/common.d | 2 + .../core/sys/wasi/p2/sockets/udp/imports.d | 7 +- .../p2/sockets/udp_create_socket/common.d | 2 + .../p2/sockets/udp_create_socket/imports.d | 2 + druntime/src/core/sys/wasi/wit_common.d | 85 +++++++++++++++++-- 56 files changed, 206 insertions(+), 10 deletions(-) create mode 100644 druntime/src/core/sys/wasi/p2/package.d diff --git a/druntime/src/core/sys/wasi/p2/cli/environment/common.d b/druntime/src/core/sys/wasi/p2/cli/environment/common.d index 8220d1339e81..37cad4665e37 100644 --- a/druntime/src/core/sys/wasi/p2/cli/environment/common.d +++ b/druntime/src/core/sys/wasi/p2/cli/environment/common.d @@ -3,6 +3,8 @@ +/ module core.sys.wasi.p2.cli.environment.common; +version(WASIp2): + import core.sys.wasi.wit_common; diff --git a/druntime/src/core/sys/wasi/p2/cli/environment/imports.d b/druntime/src/core/sys/wasi/p2/cli/environment/imports.d index 80ac08388c7d..caa7ed9c0742 100644 --- a/druntime/src/core/sys/wasi/p2/cli/environment/imports.d +++ b/druntime/src/core/sys/wasi/p2/cli/environment/imports.d @@ -3,6 +3,8 @@ +/ module core.sys.wasi.p2.cli.environment.imports; +version(WASIp2): + import core.sys.wasi.wit_common; public import core.sys.wasi.p2.cli.environment.common; @@ -38,6 +40,7 @@ WitList!(Tuple!(WitString, WitString)) getEnvironment() @nogc nothrow { ); _elem0 = _tuple3; } + core.sys.wasi.wit_common.free(_listSrcPtr4); auto _flush5 = WitList!(Tuple!(WitString, WitString))(_list4); return _flush5; } @@ -61,6 +64,7 @@ WitList!(WitString) getArguments() @nogc nothrow { auto _len1 = *(cast(size_t*)(_base0 + size_t.sizeof)); _elem0 = WitString(_ptr1[0.._len1]); } + core.sys.wasi.wit_common.free(_listSrcPtr2); auto _flush3 = WitList!(WitString)(_list2); return _flush3; } diff --git a/druntime/src/core/sys/wasi/p2/cli/exit/common.d b/druntime/src/core/sys/wasi/p2/cli/exit/common.d index 3ad74c95aa64..08cea269ff3f 100644 --- a/druntime/src/core/sys/wasi/p2/cli/exit/common.d +++ b/druntime/src/core/sys/wasi/p2/cli/exit/common.d @@ -3,6 +3,8 @@ +/ module core.sys.wasi.p2.cli.exit.common; +version(WASIp2): + import core.sys.wasi.wit_common; diff --git a/druntime/src/core/sys/wasi/p2/cli/exit/imports.d b/druntime/src/core/sys/wasi/p2/cli/exit/imports.d index e772785fbfe9..f0f130c829da 100644 --- a/druntime/src/core/sys/wasi/p2/cli/exit/imports.d +++ b/druntime/src/core/sys/wasi/p2/cli/exit/imports.d @@ -3,6 +3,8 @@ +/ module core.sys.wasi.p2.cli.exit.imports; +version(WASIp2): + import core.sys.wasi.wit_common; public import core.sys.wasi.p2.cli.exit.common; diff --git a/druntime/src/core/sys/wasi/p2/cli/stderr/common.d b/druntime/src/core/sys/wasi/p2/cli/stderr/common.d index 16487628d9ed..7ea7d4981b57 100644 --- a/druntime/src/core/sys/wasi/p2/cli/stderr/common.d +++ b/druntime/src/core/sys/wasi/p2/cli/stderr/common.d @@ -3,6 +3,8 @@ +/ module core.sys.wasi.p2.cli.stderr.common; +version(WASIp2): + import core.sys.wasi.wit_common; static import core.sys.wasi.p2.io.streams.common; diff --git a/druntime/src/core/sys/wasi/p2/cli/stderr/imports.d b/druntime/src/core/sys/wasi/p2/cli/stderr/imports.d index 8d91407b6806..ed65499b18d8 100644 --- a/druntime/src/core/sys/wasi/p2/cli/stderr/imports.d +++ b/druntime/src/core/sys/wasi/p2/cli/stderr/imports.d @@ -3,6 +3,8 @@ +/ module core.sys.wasi.p2.cli.stderr.imports; +version(WASIp2): + import core.sys.wasi.wit_common; public import core.sys.wasi.p2.cli.stderr.common; diff --git a/druntime/src/core/sys/wasi/p2/cli/stdin/common.d b/druntime/src/core/sys/wasi/p2/cli/stdin/common.d index 7a5a2e52d6a7..51c7d3fed463 100644 --- a/druntime/src/core/sys/wasi/p2/cli/stdin/common.d +++ b/druntime/src/core/sys/wasi/p2/cli/stdin/common.d @@ -3,6 +3,8 @@ +/ module core.sys.wasi.p2.cli.stdin.common; +version(WASIp2): + import core.sys.wasi.wit_common; static import core.sys.wasi.p2.io.streams.common; diff --git a/druntime/src/core/sys/wasi/p2/cli/stdin/imports.d b/druntime/src/core/sys/wasi/p2/cli/stdin/imports.d index 915034185a4e..850d33900520 100644 --- a/druntime/src/core/sys/wasi/p2/cli/stdin/imports.d +++ b/druntime/src/core/sys/wasi/p2/cli/stdin/imports.d @@ -3,6 +3,8 @@ +/ module core.sys.wasi.p2.cli.stdin.imports; +version(WASIp2): + import core.sys.wasi.wit_common; public import core.sys.wasi.p2.cli.stdin.common; diff --git a/druntime/src/core/sys/wasi/p2/cli/stdout/common.d b/druntime/src/core/sys/wasi/p2/cli/stdout/common.d index 1a7057a3e38e..771a34dfb5ef 100644 --- a/druntime/src/core/sys/wasi/p2/cli/stdout/common.d +++ b/druntime/src/core/sys/wasi/p2/cli/stdout/common.d @@ -3,6 +3,8 @@ +/ module core.sys.wasi.p2.cli.stdout.common; +version(WASIp2): + import core.sys.wasi.wit_common; static import core.sys.wasi.p2.io.streams.common; diff --git a/druntime/src/core/sys/wasi/p2/cli/stdout/imports.d b/druntime/src/core/sys/wasi/p2/cli/stdout/imports.d index a5a3215db47d..3f3ad213d051 100644 --- a/druntime/src/core/sys/wasi/p2/cli/stdout/imports.d +++ b/druntime/src/core/sys/wasi/p2/cli/stdout/imports.d @@ -3,6 +3,8 @@ +/ module core.sys.wasi.p2.cli.stdout.imports; +version(WASIp2): + import core.sys.wasi.wit_common; public import core.sys.wasi.p2.cli.stdout.common; diff --git a/druntime/src/core/sys/wasi/p2/cli/terminal_input/common.d b/druntime/src/core/sys/wasi/p2/cli/terminal_input/common.d index a66671ee2fcb..347001a620e8 100644 --- a/druntime/src/core/sys/wasi/p2/cli/terminal_input/common.d +++ b/druntime/src/core/sys/wasi/p2/cli/terminal_input/common.d @@ -7,6 +7,8 @@ immediately, querying supported features, and so on. +/ module core.sys.wasi.p2.cli.terminal_input.common; +version(WASIp2): + import core.sys.wasi.wit_common; diff --git a/druntime/src/core/sys/wasi/p2/cli/terminal_input/imports.d b/druntime/src/core/sys/wasi/p2/cli/terminal_input/imports.d index 9b6076fc1a50..1b779a5c591d 100644 --- a/druntime/src/core/sys/wasi/p2/cli/terminal_input/imports.d +++ b/druntime/src/core/sys/wasi/p2/cli/terminal_input/imports.d @@ -7,6 +7,8 @@ immediately, querying supported features, and so on. +/ module core.sys.wasi.p2.cli.terminal_input.imports; +version(WASIp2): + import core.sys.wasi.wit_common; public import core.sys.wasi.p2.cli.terminal_input.common; diff --git a/druntime/src/core/sys/wasi/p2/cli/terminal_output/common.d b/druntime/src/core/sys/wasi/p2/cli/terminal_output/common.d index 9967840a22d6..7ca870f4d1e3 100644 --- a/druntime/src/core/sys/wasi/p2/cli/terminal_output/common.d +++ b/druntime/src/core/sys/wasi/p2/cli/terminal_output/common.d @@ -7,6 +7,8 @@ features, and so on. +/ module core.sys.wasi.p2.cli.terminal_output.common; +version(WASIp2): + import core.sys.wasi.wit_common; diff --git a/druntime/src/core/sys/wasi/p2/cli/terminal_output/imports.d b/druntime/src/core/sys/wasi/p2/cli/terminal_output/imports.d index 1e08bac0b91b..84757bb3380b 100644 --- a/druntime/src/core/sys/wasi/p2/cli/terminal_output/imports.d +++ b/druntime/src/core/sys/wasi/p2/cli/terminal_output/imports.d @@ -7,6 +7,8 @@ features, and so on. +/ module core.sys.wasi.p2.cli.terminal_output.imports; +version(WASIp2): + import core.sys.wasi.wit_common; public import core.sys.wasi.p2.cli.terminal_output.common; diff --git a/druntime/src/core/sys/wasi/p2/cli/terminal_stderr/common.d b/druntime/src/core/sys/wasi/p2/cli/terminal_stderr/common.d index 130f2b495ad0..515a2d457775 100644 --- a/druntime/src/core/sys/wasi/p2/cli/terminal_stderr/common.d +++ b/druntime/src/core/sys/wasi/p2/cli/terminal_stderr/common.d @@ -4,6 +4,8 @@ link-time authority. +/ module core.sys.wasi.p2.cli.terminal_stderr.common; +version(WASIp2): + import core.sys.wasi.wit_common; static import core.sys.wasi.p2.cli.terminal_output.common; diff --git a/druntime/src/core/sys/wasi/p2/cli/terminal_stderr/imports.d b/druntime/src/core/sys/wasi/p2/cli/terminal_stderr/imports.d index 9c79c433c39f..7249be015055 100644 --- a/druntime/src/core/sys/wasi/p2/cli/terminal_stderr/imports.d +++ b/druntime/src/core/sys/wasi/p2/cli/terminal_stderr/imports.d @@ -4,6 +4,8 @@ link-time authority. +/ module core.sys.wasi.p2.cli.terminal_stderr.imports; +version(WASIp2): + import core.sys.wasi.wit_common; public import core.sys.wasi.p2.cli.terminal_stderr.common; diff --git a/druntime/src/core/sys/wasi/p2/cli/terminal_stdin/common.d b/druntime/src/core/sys/wasi/p2/cli/terminal_stdin/common.d index 00dff88581d1..8ea6c5dc1c98 100644 --- a/druntime/src/core/sys/wasi/p2/cli/terminal_stdin/common.d +++ b/druntime/src/core/sys/wasi/p2/cli/terminal_stdin/common.d @@ -4,6 +4,8 @@ link-time authority. +/ module core.sys.wasi.p2.cli.terminal_stdin.common; +version(WASIp2): + import core.sys.wasi.wit_common; static import core.sys.wasi.p2.cli.terminal_input.common; diff --git a/druntime/src/core/sys/wasi/p2/cli/terminal_stdin/imports.d b/druntime/src/core/sys/wasi/p2/cli/terminal_stdin/imports.d index 2f1a4bdeae45..dc5b57f731d4 100644 --- a/druntime/src/core/sys/wasi/p2/cli/terminal_stdin/imports.d +++ b/druntime/src/core/sys/wasi/p2/cli/terminal_stdin/imports.d @@ -4,6 +4,8 @@ link-time authority. +/ module core.sys.wasi.p2.cli.terminal_stdin.imports; +version(WASIp2): + import core.sys.wasi.wit_common; public import core.sys.wasi.p2.cli.terminal_stdin.common; diff --git a/druntime/src/core/sys/wasi/p2/cli/terminal_stdout/common.d b/druntime/src/core/sys/wasi/p2/cli/terminal_stdout/common.d index 6f286327791f..e96e5fe29fc2 100644 --- a/druntime/src/core/sys/wasi/p2/cli/terminal_stdout/common.d +++ b/druntime/src/core/sys/wasi/p2/cli/terminal_stdout/common.d @@ -4,6 +4,8 @@ link-time authority. +/ module core.sys.wasi.p2.cli.terminal_stdout.common; +version(WASIp2): + import core.sys.wasi.wit_common; static import core.sys.wasi.p2.cli.terminal_output.common; diff --git a/druntime/src/core/sys/wasi/p2/cli/terminal_stdout/imports.d b/druntime/src/core/sys/wasi/p2/cli/terminal_stdout/imports.d index 21f7122af14e..4b9e4c9e1c6d 100644 --- a/druntime/src/core/sys/wasi/p2/cli/terminal_stdout/imports.d +++ b/druntime/src/core/sys/wasi/p2/cli/terminal_stdout/imports.d @@ -4,6 +4,8 @@ link-time authority. +/ module core.sys.wasi.p2.cli.terminal_stdout.imports; +version(WASIp2): + import core.sys.wasi.wit_common; public import core.sys.wasi.p2.cli.terminal_stdout.common; diff --git a/druntime/src/core/sys/wasi/p2/clocks/monotonic_clock/common.d b/druntime/src/core/sys/wasi/p2/clocks/monotonic_clock/common.d index d3bdc7c296b7..0086dd1b6906 100644 --- a/druntime/src/core/sys/wasi/p2/clocks/monotonic_clock/common.d +++ b/druntime/src/core/sys/wasi/p2/clocks/monotonic_clock/common.d @@ -3,6 +3,8 @@ +/ module core.sys.wasi.p2.clocks.monotonic_clock.common; +version(WASIp2): + import core.sys.wasi.wit_common; static import core.sys.wasi.p2.io.poll.common; diff --git a/druntime/src/core/sys/wasi/p2/clocks/monotonic_clock/imports.d b/druntime/src/core/sys/wasi/p2/clocks/monotonic_clock/imports.d index 6296f3e9fba5..e7f3835ce2d8 100644 --- a/druntime/src/core/sys/wasi/p2/clocks/monotonic_clock/imports.d +++ b/druntime/src/core/sys/wasi/p2/clocks/monotonic_clock/imports.d @@ -3,6 +3,8 @@ +/ module core.sys.wasi.p2.clocks.monotonic_clock.imports; +version(WASIp2): + import core.sys.wasi.wit_common; public import core.sys.wasi.p2.clocks.monotonic_clock.common; diff --git a/druntime/src/core/sys/wasi/p2/clocks/wall_clock/common.d b/druntime/src/core/sys/wasi/p2/clocks/wall_clock/common.d index e0116a83ce8b..17f88c119031 100644 --- a/druntime/src/core/sys/wasi/p2/clocks/wall_clock/common.d +++ b/druntime/src/core/sys/wasi/p2/clocks/wall_clock/common.d @@ -3,6 +3,8 @@ +/ module core.sys.wasi.p2.clocks.wall_clock.common; +version(WASIp2): + import core.sys.wasi.wit_common; diff --git a/druntime/src/core/sys/wasi/p2/clocks/wall_clock/imports.d b/druntime/src/core/sys/wasi/p2/clocks/wall_clock/imports.d index e98f67a13b87..8cc0763f2633 100644 --- a/druntime/src/core/sys/wasi/p2/clocks/wall_clock/imports.d +++ b/druntime/src/core/sys/wasi/p2/clocks/wall_clock/imports.d @@ -3,6 +3,8 @@ +/ module core.sys.wasi.p2.clocks.wall_clock.imports; +version(WASIp2): + import core.sys.wasi.wit_common; public import core.sys.wasi.p2.clocks.wall_clock.common; diff --git a/druntime/src/core/sys/wasi/p2/filesystem/preopens/common.d b/druntime/src/core/sys/wasi/p2/filesystem/preopens/common.d index 9e9b979cc389..abc21c97f40c 100644 --- a/druntime/src/core/sys/wasi/p2/filesystem/preopens/common.d +++ b/druntime/src/core/sys/wasi/p2/filesystem/preopens/common.d @@ -3,6 +3,8 @@ +/ module core.sys.wasi.p2.filesystem.preopens.common; +version(WASIp2): + import core.sys.wasi.wit_common; static import core.sys.wasi.p2.filesystem.types.common; diff --git a/druntime/src/core/sys/wasi/p2/filesystem/preopens/imports.d b/druntime/src/core/sys/wasi/p2/filesystem/preopens/imports.d index c9edfb1e699d..ffb35c51df77 100644 --- a/druntime/src/core/sys/wasi/p2/filesystem/preopens/imports.d +++ b/druntime/src/core/sys/wasi/p2/filesystem/preopens/imports.d @@ -3,6 +3,8 @@ +/ module core.sys.wasi.p2.filesystem.preopens.imports; +version(WASIp2): + import core.sys.wasi.wit_common; public import core.sys.wasi.p2.filesystem.preopens.common; @@ -35,6 +37,7 @@ WitList!(Tuple!(Descriptor, WitString)) getDirectories() @nogc nothrow { ); _elem0 = _tuple2; } + core.sys.wasi.wit_common.free(_listSrcPtr3); auto _flush4 = WitList!(Tuple!(Descriptor, WitString))(_list3); return _flush4; } diff --git a/druntime/src/core/sys/wasi/p2/filesystem/types/common.d b/druntime/src/core/sys/wasi/p2/filesystem/types/common.d index e039a68d756c..803b53db6e9c 100644 --- a/druntime/src/core/sys/wasi/p2/filesystem/types/common.d +++ b/druntime/src/core/sys/wasi/p2/filesystem/types/common.d @@ -3,6 +3,8 @@ +/ module core.sys.wasi.p2.filesystem.types.common; +version(WASIp2): + import core.sys.wasi.wit_common; static import core.sys.wasi.p2.io.streams.common; diff --git a/druntime/src/core/sys/wasi/p2/filesystem/types/imports.d b/druntime/src/core/sys/wasi/p2/filesystem/types/imports.d index c9e693c40ee5..bfe80d8f0acd 100644 --- a/druntime/src/core/sys/wasi/p2/filesystem/types/imports.d +++ b/druntime/src/core/sys/wasi/p2/filesystem/types/imports.d @@ -3,6 +3,8 @@ +/ module core.sys.wasi.p2.filesystem.types.imports; +version(WASIp2): + import core.sys.wasi.wit_common; public import core.sys.wasi.p2.filesystem.types.common; diff --git a/druntime/src/core/sys/wasi/p2/io/error/common.d b/druntime/src/core/sys/wasi/p2/io/error/common.d index 45df87e2931b..92c89a008132 100644 --- a/druntime/src/core/sys/wasi/p2/io/error/common.d +++ b/druntime/src/core/sys/wasi/p2/io/error/common.d @@ -3,6 +3,8 @@ +/ module core.sys.wasi.p2.io.error.common; +version(WASIp2): + import core.sys.wasi.wit_common; diff --git a/druntime/src/core/sys/wasi/p2/io/error/imports.d b/druntime/src/core/sys/wasi/p2/io/error/imports.d index 0749dbb89617..a589f062fd9a 100644 --- a/druntime/src/core/sys/wasi/p2/io/error/imports.d +++ b/druntime/src/core/sys/wasi/p2/io/error/imports.d @@ -3,6 +3,8 @@ +/ module core.sys.wasi.p2.io.error.imports; +version(WASIp2): + import core.sys.wasi.wit_common; public import core.sys.wasi.p2.io.error.common; diff --git a/druntime/src/core/sys/wasi/p2/io/poll/common.d b/druntime/src/core/sys/wasi/p2/io/poll/common.d index 6a680156b2c9..ba4b31057abb 100644 --- a/druntime/src/core/sys/wasi/p2/io/poll/common.d +++ b/druntime/src/core/sys/wasi/p2/io/poll/common.d @@ -3,6 +3,8 @@ +/ module core.sys.wasi.p2.io.poll.common; +version(WASIp2): + import core.sys.wasi.wit_common; diff --git a/druntime/src/core/sys/wasi/p2/io/poll/imports.d b/druntime/src/core/sys/wasi/p2/io/poll/imports.d index c1f33942f764..ccfabc306842 100644 --- a/druntime/src/core/sys/wasi/p2/io/poll/imports.d +++ b/druntime/src/core/sys/wasi/p2/io/poll/imports.d @@ -3,6 +3,8 @@ +/ module core.sys.wasi.p2.io.poll.imports; +version(WASIp2): + import core.sys.wasi.wit_common; public import core.sys.wasi.p2.io.poll.common; diff --git a/druntime/src/core/sys/wasi/p2/io/streams/common.d b/druntime/src/core/sys/wasi/p2/io/streams/common.d index 8aea295b02d7..17f5efe5bb75 100644 --- a/druntime/src/core/sys/wasi/p2/io/streams/common.d +++ b/druntime/src/core/sys/wasi/p2/io/streams/common.d @@ -3,6 +3,8 @@ +/ module core.sys.wasi.p2.io.streams.common; +version(WASIp2): + import core.sys.wasi.wit_common; static import core.sys.wasi.p2.io.error.common; diff --git a/druntime/src/core/sys/wasi/p2/io/streams/imports.d b/druntime/src/core/sys/wasi/p2/io/streams/imports.d index a2a1a14cc463..ad140d8fa9cd 100644 --- a/druntime/src/core/sys/wasi/p2/io/streams/imports.d +++ b/druntime/src/core/sys/wasi/p2/io/streams/imports.d @@ -3,6 +3,8 @@ +/ module core.sys.wasi.p2.io.streams.imports; +version(WASIp2): + import core.sys.wasi.wit_common; public import core.sys.wasi.p2.io.streams.common; diff --git a/druntime/src/core/sys/wasi/p2/package.d b/druntime/src/core/sys/wasi/p2/package.d new file mode 100644 index 000000000000..eacdb9b31a3e --- /dev/null +++ b/druntime/src/core/sys/wasi/p2/package.d @@ -0,0 +1,15 @@ +/** + * D bindings for WASI preview2. + * + * These bindings are generated by running + * $(LINK2 https://github.com/bytecodealliance/wit-bindgen/pull/1561, a fork of `wit-bindgen`) + * against the WASIp2 WIT definitions (see standards link). + * + * Standards: $(LINK2 https://github.com/WebAssembly/WASI/tree/wasi-0.2/, WebAssembly System Interface (WASI) 0.2) + */ +module core.sys.wasi.p2; + +version (WASIp2): + +// All of it +public import core.sys.wasi.p2.cli.imports; diff --git a/druntime/src/core/sys/wasi/p2/random/insecure/common.d b/druntime/src/core/sys/wasi/p2/random/insecure/common.d index 14017453c348..ff886a6c070d 100644 --- a/druntime/src/core/sys/wasi/p2/random/insecure/common.d +++ b/druntime/src/core/sys/wasi/p2/random/insecure/common.d @@ -3,6 +3,8 @@ +/ module core.sys.wasi.p2.random.insecure.common; +version(WASIp2): + import core.sys.wasi.wit_common; diff --git a/druntime/src/core/sys/wasi/p2/random/insecure/imports.d b/druntime/src/core/sys/wasi/p2/random/insecure/imports.d index 7320372a633a..501d3d67ed33 100644 --- a/druntime/src/core/sys/wasi/p2/random/insecure/imports.d +++ b/druntime/src/core/sys/wasi/p2/random/insecure/imports.d @@ -3,6 +3,8 @@ +/ module core.sys.wasi.p2.random.insecure.imports; +version(WASIp2): + import core.sys.wasi.wit_common; public import core.sys.wasi.p2.random.insecure.common; diff --git a/druntime/src/core/sys/wasi/p2/random/insecure_seed/common.d b/druntime/src/core/sys/wasi/p2/random/insecure_seed/common.d index 4af6d6c834c2..25ec099f30ee 100644 --- a/druntime/src/core/sys/wasi/p2/random/insecure_seed/common.d +++ b/druntime/src/core/sys/wasi/p2/random/insecure_seed/common.d @@ -3,6 +3,8 @@ +/ module core.sys.wasi.p2.random.insecure_seed.common; +version(WASIp2): + import core.sys.wasi.wit_common; diff --git a/druntime/src/core/sys/wasi/p2/random/insecure_seed/imports.d b/druntime/src/core/sys/wasi/p2/random/insecure_seed/imports.d index 0ec6d81f6247..38f7dd0527ac 100644 --- a/druntime/src/core/sys/wasi/p2/random/insecure_seed/imports.d +++ b/druntime/src/core/sys/wasi/p2/random/insecure_seed/imports.d @@ -3,6 +3,8 @@ +/ module core.sys.wasi.p2.random.insecure_seed.imports; +version(WASIp2): + import core.sys.wasi.wit_common; public import core.sys.wasi.p2.random.insecure_seed.common; diff --git a/druntime/src/core/sys/wasi/p2/random/random/common.d b/druntime/src/core/sys/wasi/p2/random/random/common.d index a333d0ae362d..c35046cf14bc 100644 --- a/druntime/src/core/sys/wasi/p2/random/random/common.d +++ b/druntime/src/core/sys/wasi/p2/random/random/common.d @@ -3,6 +3,8 @@ +/ module core.sys.wasi.p2.random.random.common; +version(WASIp2): + import core.sys.wasi.wit_common; diff --git a/druntime/src/core/sys/wasi/p2/random/random/imports.d b/druntime/src/core/sys/wasi/p2/random/random/imports.d index 0a11cb22ee86..a271cd4c982b 100644 --- a/druntime/src/core/sys/wasi/p2/random/random/imports.d +++ b/druntime/src/core/sys/wasi/p2/random/random/imports.d @@ -3,6 +3,8 @@ +/ module core.sys.wasi.p2.random.random.imports; +version(WASIp2): + import core.sys.wasi.wit_common; public import core.sys.wasi.p2.random.random.common; diff --git a/druntime/src/core/sys/wasi/p2/sockets/instance_network/common.d b/druntime/src/core/sys/wasi/p2/sockets/instance_network/common.d index f2c2a89f3220..cee53b0e5571 100644 --- a/druntime/src/core/sys/wasi/p2/sockets/instance_network/common.d +++ b/druntime/src/core/sys/wasi/p2/sockets/instance_network/common.d @@ -3,6 +3,8 @@ +/ module core.sys.wasi.p2.sockets.instance_network.common; +version(WASIp2): + import core.sys.wasi.wit_common; static import core.sys.wasi.p2.sockets.network.common; diff --git a/druntime/src/core/sys/wasi/p2/sockets/instance_network/imports.d b/druntime/src/core/sys/wasi/p2/sockets/instance_network/imports.d index c243f47ccf89..3cfb73ae5481 100644 --- a/druntime/src/core/sys/wasi/p2/sockets/instance_network/imports.d +++ b/druntime/src/core/sys/wasi/p2/sockets/instance_network/imports.d @@ -3,6 +3,8 @@ +/ module core.sys.wasi.p2.sockets.instance_network.imports; +version(WASIp2): + import core.sys.wasi.wit_common; public import core.sys.wasi.p2.sockets.instance_network.common; diff --git a/druntime/src/core/sys/wasi/p2/sockets/ip_name_lookup/common.d b/druntime/src/core/sys/wasi/p2/sockets/ip_name_lookup/common.d index 01ca4ecb6e06..9a933b720848 100644 --- a/druntime/src/core/sys/wasi/p2/sockets/ip_name_lookup/common.d +++ b/druntime/src/core/sys/wasi/p2/sockets/ip_name_lookup/common.d @@ -3,6 +3,8 @@ +/ module core.sys.wasi.p2.sockets.ip_name_lookup.common; +version(WASIp2): + import core.sys.wasi.wit_common; static import core.sys.wasi.p2.io.poll.common; diff --git a/druntime/src/core/sys/wasi/p2/sockets/ip_name_lookup/imports.d b/druntime/src/core/sys/wasi/p2/sockets/ip_name_lookup/imports.d index 12593eae19e4..be7d4e9a5e62 100644 --- a/druntime/src/core/sys/wasi/p2/sockets/ip_name_lookup/imports.d +++ b/druntime/src/core/sys/wasi/p2/sockets/ip_name_lookup/imports.d @@ -3,6 +3,8 @@ +/ module core.sys.wasi.p2.sockets.ip_name_lookup.imports; +version(WASIp2): + import core.sys.wasi.wit_common; public import core.sys.wasi.p2.sockets.ip_name_lookup.common; diff --git a/druntime/src/core/sys/wasi/p2/sockets/network/common.d b/druntime/src/core/sys/wasi/p2/sockets/network/common.d index ecc97289d3bb..f6d923eeb6f7 100644 --- a/druntime/src/core/sys/wasi/p2/sockets/network/common.d +++ b/druntime/src/core/sys/wasi/p2/sockets/network/common.d @@ -3,6 +3,8 @@ +/ module core.sys.wasi.p2.sockets.network.common; +version(WASIp2): + import core.sys.wasi.wit_common; static import core.sys.wasi.p2.io.error.common; diff --git a/druntime/src/core/sys/wasi/p2/sockets/network/imports.d b/druntime/src/core/sys/wasi/p2/sockets/network/imports.d index 08535327bde0..617ec017bc36 100644 --- a/druntime/src/core/sys/wasi/p2/sockets/network/imports.d +++ b/druntime/src/core/sys/wasi/p2/sockets/network/imports.d @@ -3,6 +3,8 @@ +/ module core.sys.wasi.p2.sockets.network.imports; +version(WASIp2): + import core.sys.wasi.wit_common; public import core.sys.wasi.p2.sockets.network.common; diff --git a/druntime/src/core/sys/wasi/p2/sockets/tcp/common.d b/druntime/src/core/sys/wasi/p2/sockets/tcp/common.d index 244dad406594..b14861ea2901 100644 --- a/druntime/src/core/sys/wasi/p2/sockets/tcp/common.d +++ b/druntime/src/core/sys/wasi/p2/sockets/tcp/common.d @@ -3,6 +3,8 @@ +/ module core.sys.wasi.p2.sockets.tcp.common; +version(WASIp2): + import core.sys.wasi.wit_common; static import core.sys.wasi.p2.io.poll.common; diff --git a/druntime/src/core/sys/wasi/p2/sockets/tcp/imports.d b/druntime/src/core/sys/wasi/p2/sockets/tcp/imports.d index 50528ef734a8..45f0aa65a89f 100644 --- a/druntime/src/core/sys/wasi/p2/sockets/tcp/imports.d +++ b/druntime/src/core/sys/wasi/p2/sockets/tcp/imports.d @@ -3,6 +3,8 @@ +/ module core.sys.wasi.p2.sockets.tcp.imports; +version(WASIp2): + import core.sys.wasi.wit_common; public import core.sys.wasi.p2.sockets.tcp.common; diff --git a/druntime/src/core/sys/wasi/p2/sockets/tcp_create_socket/common.d b/druntime/src/core/sys/wasi/p2/sockets/tcp_create_socket/common.d index 007e56ccd5c2..7aae1db317b2 100644 --- a/druntime/src/core/sys/wasi/p2/sockets/tcp_create_socket/common.d +++ b/druntime/src/core/sys/wasi/p2/sockets/tcp_create_socket/common.d @@ -3,6 +3,8 @@ +/ module core.sys.wasi.p2.sockets.tcp_create_socket.common; +version(WASIp2): + import core.sys.wasi.wit_common; static import core.sys.wasi.p2.sockets.network.common; diff --git a/druntime/src/core/sys/wasi/p2/sockets/tcp_create_socket/imports.d b/druntime/src/core/sys/wasi/p2/sockets/tcp_create_socket/imports.d index 008e767af8e1..2a19b35185ff 100644 --- a/druntime/src/core/sys/wasi/p2/sockets/tcp_create_socket/imports.d +++ b/druntime/src/core/sys/wasi/p2/sockets/tcp_create_socket/imports.d @@ -3,6 +3,8 @@ +/ module core.sys.wasi.p2.sockets.tcp_create_socket.imports; +version(WASIp2): + import core.sys.wasi.wit_common; public import core.sys.wasi.p2.sockets.tcp_create_socket.common; diff --git a/druntime/src/core/sys/wasi/p2/sockets/udp/common.d b/druntime/src/core/sys/wasi/p2/sockets/udp/common.d index 67c84802d472..f7f242d46cd9 100644 --- a/druntime/src/core/sys/wasi/p2/sockets/udp/common.d +++ b/druntime/src/core/sys/wasi/p2/sockets/udp/common.d @@ -3,6 +3,8 @@ +/ module core.sys.wasi.p2.sockets.udp.common; +version(WASIp2): + import core.sys.wasi.wit_common; static import core.sys.wasi.p2.io.poll.common; diff --git a/druntime/src/core/sys/wasi/p2/sockets/udp/imports.d b/druntime/src/core/sys/wasi/p2/sockets/udp/imports.d index 981ed0e0d607..96032ff87c3b 100644 --- a/druntime/src/core/sys/wasi/p2/sockets/udp/imports.d +++ b/druntime/src/core/sys/wasi/p2/sockets/udp/imports.d @@ -3,6 +3,8 @@ +/ module core.sys.wasi.p2.sockets.udp.imports; +version(WASIp2): + import core.sys.wasi.wit_common; public import core.sys.wasi.p2.sockets.udp.common; @@ -674,6 +676,7 @@ struct IncomingDatagramStream { }; _elem1 = _record12; } + core.sys.wasi.wit_common.free(_listSrcPtr13); _result15 = Result!(WitList!(IncomingDatagram), ErrorCode).ok(WitList!(IncomingDatagram)(_list13)); } @@ -769,9 +772,10 @@ struct OutgoingDatagramStream { +/ Result!(ulong, ErrorCode) send(in WitList!(OutgoingDatagram) datagrams) @nogc nothrow { align(8) void[16] _retArea = void; + core.sys.wasi.wit_common.DeallocateBuffer deallocate; auto _listSrc10 = datagrams; auto _list10 = core.sys.wasi.wit_common.malloc(_listSrc10.length * ((32+3*size_t.sizeof))); - scope(exit) { core.sys.wasi.wit_common.free(_list10); } + deallocate ~= _list10; foreach (_elem0_idx, const ref _elem0; _listSrc10) { auto _base0 = _list10 + _elem0_idx * ((32+3*size_t.sizeof)); *cast(size_t*)(_base0 + size_t.sizeof) = cast(size_t)(_elem0.data.length); @@ -814,6 +818,7 @@ struct OutgoingDatagramStream { } __import_send(this.__handle, _list10, datagrams.length, _retArea.ptr); + deallocate.purge(); Result!(ulong, ErrorCode) _result13 = void; bool _isErr13 = (cast(uint)(*(cast(ubyte*)(_retArea.ptr + 0)))) != 0; if (_isErr13) { diff --git a/druntime/src/core/sys/wasi/p2/sockets/udp_create_socket/common.d b/druntime/src/core/sys/wasi/p2/sockets/udp_create_socket/common.d index 72043164747a..37a286ba6644 100644 --- a/druntime/src/core/sys/wasi/p2/sockets/udp_create_socket/common.d +++ b/druntime/src/core/sys/wasi/p2/sockets/udp_create_socket/common.d @@ -3,6 +3,8 @@ +/ module core.sys.wasi.p2.sockets.udp_create_socket.common; +version(WASIp2): + import core.sys.wasi.wit_common; static import core.sys.wasi.p2.sockets.network.common; diff --git a/druntime/src/core/sys/wasi/p2/sockets/udp_create_socket/imports.d b/druntime/src/core/sys/wasi/p2/sockets/udp_create_socket/imports.d index 2d0b79f70b61..8403d6d6f5b0 100644 --- a/druntime/src/core/sys/wasi/p2/sockets/udp_create_socket/imports.d +++ b/druntime/src/core/sys/wasi/p2/sockets/udp_create_socket/imports.d @@ -3,6 +3,8 @@ +/ module core.sys.wasi.p2.sockets.udp_create_socket.imports; +version(WASIp2): + import core.sys.wasi.wit_common; public import core.sys.wasi.p2.sockets.udp_create_socket.common; diff --git a/druntime/src/core/sys/wasi/wit_common.d b/druntime/src/core/sys/wasi/wit_common.d index 21d29b96268e..b52824b0d96f 100644 --- a/druntime/src/core/sys/wasi/wit_common.d +++ b/druntime/src/core/sys/wasi/wit_common.d @@ -1,14 +1,23 @@ module core.sys.wasi.wit_common; +version (WASI) {} +else: + +// WASIp1 does not use the component model, but WASIp2 onward does +version (WASIp1) {} +else: + import core.attribute : mustuse; import ldc.attributes : llvmAttr; -alias wasmImport(string mod, string name) = AliasSeq!( - llvmAttr("wasm-import-module", mod), - llvmAttr("wasm-import-name", name) -); +version (LDC) { + alias wasmImport(string mod, string name) = AliasSeq!( + llvmAttr("wasm-import-module", mod), + llvmAttr("wasm-import-name", name) + ); -enum wasmExport(string name) = llvmAttr("wasm-export-name", name); + enum wasmExport(string name) = llvmAttr("wasm-export-name", name); +} else static assert (0, "Unknown compiler for WASI."); struct witExport { string mod; string name; } @@ -334,9 +343,12 @@ T witClone(T : U[L], U, size_t L)(in T val) @nogc nothrow { return clone; } -package: +// can't be `package` as other packages/modules produced by `wit_bindgen` +// make use of this + +//package: -package import core.stdc.stdlib : malloc, free; +public import core.stdc.stdlib : malloc, free; // from https://github.com/Inochi2D/numem/blob/main/source/numem/casting.d // Copyright © 2023-2025, Kitsunebi Games @@ -349,9 +361,10 @@ auto ref T reinterpretCast(T, U)(auto ref U from) @trusted if (T.sizeof == U.siz return tmp(from).to; } -auto mallocSlice(T)(size_t count) @nogc nothrow { +T[] mallocSlice(T)(size_t count) @nogc nothrow { + if (count == 0) return []; auto ptr = malloc(count*T.sizeof); - if (ptr is null) return null; + if (ptr is null) return []; return (cast(T*)ptr)[0..count]; } @@ -441,6 +454,60 @@ template witExportsIn(T) { } } +struct DeallocateBuffer { + @nogc nothrow: + struct Page { + void*[32] slots; + static assert(slots.length < 256); + + ubyte cursor; + Page* next; + } + + Page first; + Page* head; + + @disable this(this); + + private void allocNewPage() { + Page* page = cast(Page*)malloc(Page.sizeof); + if (page is null) abort(); + + *page = Page.init; + page.next = head; + head = page; + } + + void opOpAssign(string op: "~")(void* ptr) { + import core.builtins : unlikely; + + if (unlikely(ptr is null)) return; + if (/*unlikely?*/(head is null)) head = &first; + + if (head.cursor >= head.slots.length) allocNewPage(); + + head.slots[head.cursor++] = ptr; + } + + void purge() { + auto page = head; + while (page) { + foreach (ptr; page.slots[0..page.cursor]) free(ptr); + + auto next = page.next; + if (page != &first) free(page); + page = next; + } + + first = Page.init; + head = null; + } + + ~this() { + purge(); + } +} + // Defined by `wasi_libc` /* @wasmExport!("cabi_realloc")