| author | |
| committer | |
| log | 1ccc87363a6436da293dbb1bc7bc8db2aa4d7bf7 |
| tree | f6ae16ea94160a796e0a644afce1e8705bbf1cab |
| parent | 50e185b71822c180fccd07826a8dd5e3ec641cc1 |
5 files changed, 26 insertions(+), 17 deletions(-)
lib/std/Io/Threaded.zig+3-1| ... | ... | @@ -12787,7 +12787,7 @@ const processSpawn = switch (native_os) { |
| 12787 | 12787 | fn processSpawnUnsupported(userdata: ?*anyopaque, options: process.SpawnOptions) process.SpawnError!process.Child { |
| 12788 | 12788 | _ = userdata; |
| 12789 | 12789 | _ = options; |
| 12790 | return error.OperationUnsupported; | |
| 12790 | return error.Unexpected; | |
| 12791 | 12791 | } |
| 12792 | 12792 | |
| 12793 | 12793 | fn processSpawnPosix(userdata: ?*anyopaque, options: process.SpawnOptions) process.SpawnError!process.Child { |
| ... | ... | @@ -12995,6 +12995,7 @@ fn processSpawnPosix(userdata: ?*anyopaque, options: process.SpawnOptions) proce |
| 12995 | 12995 | } |
| 12996 | 12996 | |
| 12997 | 12997 | fn childWait(userdata: ?*anyopaque, child: *std.process.Child) process.Child.WaitError!process.Child.Term { |
| 12998 | if (native_os == .wasi) unreachable; | |
| 12998 | 12999 | const t: *Threaded = @ptrCast(@alignCast(userdata)); |
| 12999 | 13000 | switch (native_os) { |
| 13000 | 13001 | .windows => return childWaitWindows(t, child), |
| ... | ... | @@ -13003,6 +13004,7 @@ fn childWait(userdata: ?*anyopaque, child: *std.process.Child) process.Child.Wai |
| 13003 | 13004 | } |
| 13004 | 13005 | |
| 13005 | 13006 | fn childKill(userdata: ?*anyopaque, child: *std.process.Child) void { |
| 13007 | if (native_os == .wasi) unreachable; | |
| 13006 | 13008 | const t: *Threaded = @ptrCast(@alignCast(userdata)); |
| 13007 | 13009 | if (is_windows) { |
| 13008 | 13010 | childKillWindows(t, child, 1) catch childCleanupWindows(child); |
lib/std/posix/test.zig+2-2| ... | ... | @@ -22,10 +22,10 @@ const tmpDir = std.testing.tmpDir; |
| 22 | 22 | |
| 23 | 23 | test "check WASI CWD" { |
| 24 | 24 | if (native_os == .wasi) { |
| 25 | if (std.options.wasiCwd() != 3) { | |
| 25 | const cwd: Dir = .cwd(); | |
| 26 | if (cwd.handle != 3) { | |
| 26 | 27 | @panic("WASI code that uses cwd (like this test) needs a preopen for cwd (add '--dir=.' to wasmtime)"); |
| 27 | 28 | } |
| 28 | ||
| 29 | 29 | if (!builtin.link_libc) { |
| 30 | 30 | // WASI without-libc hardcodes fd 3 as the FDCWD token so it can be passed directly to WASI calls |
| 31 | 31 | try expectEqual(3, posix.AT.FDCWD); |
lib/std/process/Args.zig+15-7| ... | ... | @@ -10,8 +10,14 @@ const testing = std.testing; |
| 10 | 10 | |
| 11 | 11 | vector: Vector, |
| 12 | 12 | |
| 13 | /// On WASI without libc, this is `void` because the environment has to be | |
| 14 | /// queried and heap-allocated at runtime. | |
| 13 | 15 | pub const Vector = switch (native_os) { |
| 14 | 16 | .windows => []const u16, // WTF-16 encoded |
| 17 | .wasi => switch (builtin.link_libc) { | |
| 18 | false => void, | |
| 19 | true => []const [*:0]const u8, | |
| 20 | }, | |
| 15 | 21 | .freestanding, .other => void, |
| 16 | 22 | else => []const [*:0]const u8, |
| 17 | 23 | }; |
| ... | ... | @@ -457,6 +463,8 @@ pub fn iterateAllocator(a: Args, gpa: Allocator) Iterator.InitError!Iterator { |
| 457 | 463 | return .initAllocator(a, gpa); |
| 458 | 464 | } |
| 459 | 465 | |
| 466 | pub const ToSliceError = Iterator.Windows.InitError || Iterator.Wasi.InitError; | |
| 467 | ||
| 460 | 468 | /// Returned value may reference several allocations; call `freeSlice` to |
| 461 | 469 | /// release. |
| 462 | 470 | /// |
| ... | ... | @@ -464,19 +472,19 @@ pub fn iterateAllocator(a: Args, gpa: Allocator) Iterator.InitError!Iterator { |
| 464 | 472 | /// [WTF-8](https://wtf-8.codeberg.page/). |
| 465 | 473 | /// * On other platforms, the result is an opaque sequence of bytes with no |
| 466 | 474 | /// particular encoding. |
| 467 | pub fn toSlice(a: Args, gpa: Allocator) Allocator.Error![][:0]u8 { | |
| 475 | pub fn toSlice(a: Args, gpa: Allocator) ToSliceError![][:0]u8 { | |
| 468 | 476 | var it = try a.iterateAllocator(gpa); |
| 469 | 477 | defer it.deinit(); |
| 470 | 478 | |
| 471 | var contents = std.array_list.Managed(u8).init(gpa); | |
| 472 | defer contents.deinit(); | |
| 479 | var contents: std.ArrayList(u8) = .empty; | |
| 480 | defer contents.deinit(gpa); | |
| 473 | 481 | |
| 474 | var slice_list = std.array_list.Managed(usize).init(gpa); | |
| 475 | defer slice_list.deinit(); | |
| 482 | var slice_list: std.ArrayList(usize) = .empty; | |
| 483 | defer slice_list.deinit(gpa); | |
| 476 | 484 | |
| 477 | 485 | while (it.next()) |arg| { |
| 478 | try contents.appendSlice(arg[0 .. arg.len + 1]); | |
| 479 | try slice_list.append(arg.len); | |
| 486 | try contents.appendSlice(gpa, arg[0 .. arg.len + 1]); | |
| 487 | try slice_list.append(gpa, arg.len); | |
| 480 | 488 | } |
| 481 | 489 | |
| 482 | 490 | const contents_slice = contents.items; |
lib/std/process/Environ.zig+4-5| ... | ... | @@ -757,6 +757,9 @@ test Map { |
| 757 | 757 | } |
| 758 | 758 | |
| 759 | 759 | test "convert from Environ to Map and back again" { |
| 760 | if (native_os == .windows) return; | |
| 761 | if (native_os == .wasi and !builtin.link_libc) return; | |
| 762 | ||
| 760 | 763 | const gpa = testing.allocator; |
| 761 | 764 | |
| 762 | 765 | var map: Map = .init(gpa); |
| ... | ... | @@ -769,11 +772,7 @@ test "convert from Environ to Map and back again" { |
| 769 | 772 | defer arena_allocator.deinit(); |
| 770 | 773 | const arena = arena_allocator.allocator(); |
| 771 | 774 | |
| 772 | const environ: Environ = switch (native_os) { | |
| 773 | .windows => return error.SkipZigTest, | |
| 774 | .wasi => if (!builtin.libc) return error.SkipZigTest, | |
| 775 | else => .{ .block = try map.createBlockPosix(arena, .{}) }, | |
| 776 | }; | |
| 775 | const environ: Environ = .{ .block = try map.createBlockPosix(arena, .{}) }; | |
| 777 | 776 | |
| 778 | 777 | try testing.expectEqual(true, environ.contains(gpa, "FOO")); |
| 779 | 778 | try testing.expectEqual(false, environ.contains(gpa, "BAR")); |
lib/std/start.zig+2-2| ... | ... | @@ -55,7 +55,7 @@ comptime { |
| 55 | 55 | if (!@hasDecl(root, wasm_start_sym) and @hasDecl(root, "main")) { |
| 56 | 56 | // Only call main when defined. For WebAssembly it's allowed to pass `-fno-entry` in which |
| 57 | 57 | // case it's not required to provide an entrypoint such as main. |
| 58 | @export(&wasi_start, .{ .name = wasm_start_sym }); | |
| 58 | @export(&startWasi, .{ .name = wasm_start_sym }); | |
| 59 | 59 | } |
| 60 | 60 | } else if (native_arch.isWasm() and native_os == .freestanding) { |
| 61 | 61 | // Only call main when defined. For WebAssembly it's allowed to pass `-fno-entry` in which |
| ... | ... | @@ -90,7 +90,7 @@ fn wasm_freestanding_start() callconv(.c) void { |
| 90 | 90 | _ = @call(.always_inline, callMain, .{ {}, {} }); |
| 91 | 91 | } |
| 92 | 92 | |
| 93 | fn wasi_start() callconv(.c) void { | |
| 93 | fn startWasi() callconv(.c) void { | |
| 94 | 94 | // The function call is marked inline because for some reason LLVM in |
| 95 | 95 | // release mode fails to inline it, and we want fewer call frames in stack traces. |
| 96 | 96 | switch (builtin.wasi_exec_model) { |