| ... | @@ -623,7 +623,7 @@ inline fn callMainWithArgs(argc: usize, argv: [*][*:0]u8, envp: [:null]?[*:0]u8) | ... | @@ -623,7 +623,7 @@ inline fn callMainWithArgs(argc: usize, argv: [*][*:0]u8, envp: [:null]?[*:0]u8) |
| 623 | return callMain(argv[0..argc], envp); | 623 | return callMain(argv[0..argc], envp); |
| 624 | } | 624 | } |
| 625 | | 625 | |
| 626 | fn main(c_argc: c_int, c_argv: [*][*:0]c_char, c_envp: [*:null]?[*:0]c_char) callconv(.c) c_int { | 626 | fn main(c_argc: c_int, c_argv: [*][*:0]u8, c_envp: [*:null]?[*:0]u8) callconv(.c) c_int { |
| 627 | var env_count: usize = 0; | 627 | var env_count: usize = 0; |
| 628 | while (c_envp[env_count] != null) : (env_count += 1) {} | 628 | while (c_envp[env_count] != null) : (env_count += 1) {} |
| 629 | const envp = c_envp[0..env_count :null]; | 629 | const envp = c_envp[0..env_count :null]; |
| ... | @@ -638,7 +638,7 @@ fn main(c_argc: c_int, c_argv: [*][*:0]c_char, c_envp: [*:null]?[*:0]c_char) cal | ... | @@ -638,7 +638,7 @@ fn main(c_argc: c_int, c_argv: [*][*:0]c_char, c_envp: [*:null]?[*:0]c_char) cal |
| 638 | return callMainWithArgs(@as(usize, @intCast(c_argc)), @as([*][*:0]u8, @ptrCast(c_argv)), envp); | 638 | return callMainWithArgs(@as(usize, @intCast(c_argc)), @as([*][*:0]u8, @ptrCast(c_argv)), envp); |
| 639 | } | 639 | } |
| 640 | | 640 | |
| 641 | fn mainWithoutEnv(c_argc: c_int, c_argv: [*][*:0]c_char) callconv(.c) c_int { | 641 | fn mainWithoutEnv(c_argc: c_int, c_argv: [*][*:0]u8) callconv(.c) c_int { |
| 642 | const argv = @as([*][*:0]u8, @ptrCast(c_argv))[0..@intCast(c_argc)]; | 642 | const argv = @as([*][*:0]u8, @ptrCast(c_argv))[0..@intCast(c_argc)]; |
| 643 | if (@sizeOf(std.Io.Threaded.Argv0) != 0) { | 643 | if (@sizeOf(std.Io.Threaded.Argv0) != 0) { |
| 644 | if (std.Options.debug_threaded_io) |t| t.argv0.value = argv[0]; | 644 | if (std.Options.debug_threaded_io) |t| t.argv0.value = argv[0]; |
| ... | @@ -649,7 +649,11 @@ fn mainWithoutEnv(c_argc: c_int, c_argv: [*][*:0]c_char) callconv(.c) c_int { | ... | @@ -649,7 +649,11 @@ fn mainWithoutEnv(c_argc: c_int, c_argv: [*][*:0]c_char) callconv(.c) c_int { |
| 649 | /// General error message for a malformed return type | 649 | /// General error message for a malformed return type |
| 650 | const bad_main_ret = "expected return type of main to be 'void', '!void', 'noreturn', 'u8', or '!u8'"; | 650 | const bad_main_ret = "expected return type of main to be 'void', '!void', 'noreturn', 'u8', or '!u8'"; |
| 651 | | 651 | |
| 652 | const use_debug_allocator = !builtin.link_libc and !native_arch.isWasm() and builtin.mode == .Debug; | 652 | const use_debug_allocator = !native_arch.isWasm() and switch (builtin.mode) { |
| | 653 | .Debug => true, |
| | 654 | .ReleaseSafe => !builtin.link_libc, // Not ideal, but the best we have for now. |
| | 655 | .ReleaseFast, .ReleaseSmall => !builtin.link_libc and builtin.single_threaded, // Also not ideal. |
| | 656 | }; |
| 653 | var debug_allocator: std.heap.DebugAllocator(.{}) = .init; | 657 | var debug_allocator: std.heap.DebugAllocator(.{}) = .init; |
| 654 | | 658 | |
| 655 | inline fn callMain(args: std.process.Args.Vector, environ: std.process.Environ.Block) u8 { | 659 | inline fn callMain(args: std.process.Args.Vector, environ: std.process.Environ.Block) u8 { |
| ... | @@ -660,14 +664,16 @@ inline fn callMain(args: std.process.Args.Vector, environ: std.process.Environ.B | ... | @@ -660,14 +664,16 @@ inline fn callMain(args: std.process.Args.Vector, environ: std.process.Environ.B |
| 660 | .environ = .{ .block = environ }, | 664 | .environ = .{ .block = environ }, |
| 661 | })); | 665 | })); |
| 662 | | 666 | |
| 663 | const gpa = if (builtin.link_libc) | 667 | const gpa = if (native_arch.isWasm()) |
| 664 | std.heap.c_allocator | | |
| 665 | else if (native_arch.isWasm()) | | |
| 666 | std.heap.wasm_allocator | 668 | std.heap.wasm_allocator |
| 667 | else if (use_debug_allocator) | 669 | else if (use_debug_allocator) |
| 668 | debug_allocator.allocator() | 670 | debug_allocator.allocator() |
| | 671 | else if (builtin.link_libc) |
| | 672 | std.heap.c_allocator |
| | 673 | else if (!builtin.single_threaded) |
| | 674 | std.heap.smp_allocator |
| 669 | else | 675 | else |
| 670 | std.heap.smp_allocator; | 676 | comptime unreachable; |
| 671 | | 677 | |
| 672 | defer if (use_debug_allocator) { | 678 | defer if (use_debug_allocator) { |
| 673 | _ = debug_allocator.deinit(); // Leaks do not affect return code. | 679 | _ = debug_allocator.deinit(); // Leaks do not affect return code. |