diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/bun_js.zig | 8 | ||||
-rw-r--r-- | src/cli.zig | 12 | ||||
-rw-r--r-- | src/cli/bun_command.zig | 2 | ||||
-rw-r--r-- | src/cli/create_command.zig | 40 | ||||
-rw-r--r-- | src/cli/install_completions_command.zig | 18 | ||||
-rw-r--r-- | src/cli/package_manager_command.zig | 4 | ||||
-rw-r--r-- | src/cli/run_command.zig | 12 | ||||
-rw-r--r-- | src/cli/test_command.zig | 2 | ||||
-rw-r--r-- | src/cli/upgrade_command.zig | 44 | ||||
-rw-r--r-- | src/global.zig | 9 | ||||
-rw-r--r-- | src/http.zig | 6 | ||||
-rw-r--r-- | src/js_ast.zig | 70 | ||||
-rw-r--r-- | src/json_parser.zig | 9 | ||||
-rw-r--r-- | src/logger.zig | 6 | ||||
-rw-r--r-- | src/report.zig | 28 | ||||
-rw-r--r-- | src/resolver/resolver.zig | 6 |
16 files changed, 165 insertions, 111 deletions
diff --git a/src/bun_js.zig b/src/bun_js.zig index 1caa77e72..b712c8a19 100644 --- a/src/bun_js.zig +++ b/src/bun_js.zig @@ -66,7 +66,7 @@ pub const Run = struct { } Output.prettyErrorln("\n", .{}); Output.flush(); - std.os.exit(1); + Global.exit(1); }; run.vm.bundler.configureDefines() catch { if (Output.enable_ansi_colors_stderr) { @@ -76,7 +76,7 @@ pub const Run = struct { } Output.prettyErrorln("\n", .{}); Output.flush(); - std.os.exit(1); + Global.exit(1); }; var callback = OpaqueWrap(Run, Run.start); @@ -93,7 +93,7 @@ pub const Run = struct { if (promise.status(this.vm.global.vm()) == .Rejected) { this.vm.defaultErrorHandler(promise.result(this.vm.global.vm()), null); - std.os.exit(1); + Global.exit(1); } _ = promise.result(this.vm.global.vm()); @@ -109,6 +109,6 @@ pub const Run = struct { Output.flush(); - std.os.exit(0); + Global.exit(0); } }; diff --git a/src/cli.zig b/src/cli.zig index 77cca548f..38128f66e 100644 --- a/src/cli.zig +++ b/src/cli.zig @@ -76,7 +76,7 @@ pub const Cli = struct { error.MissingEntryPoint => { Output.prettyErrorln("<r><red>MissingEntryPoint<r> what do you want to bundle?\n\n<d>Example:\n\n<r> <b><cyan>bun bun --use next<r>\n\n <b><cyan>bun bun ./src/index.ts ./src/file2.ts<r>\n", .{}); Output.flush(); - std.os.exit(1); + Global.exit(1); }, else => { // Always dump the logs @@ -202,7 +202,7 @@ pub const Arguments = struct { @setCold(true); Output.writer().writeAll(Global.package_json_version ++ "\n") catch {}; Output.flush(); - std.os.exit(0); + Global.exit(0); } pub fn parse(allocator: std.mem.Allocator, ctx: *Command.Context, comptime cmd: Command.Tag) !Api.TransformOptions { @@ -274,7 +274,7 @@ pub const Arguments = struct { std.mem.span(config_path), }); Output.flush(); - std.os.exit(1); + Global.exit(1); }; var contents = config_file.readToEndAlloc(allocator, std.math.maxInt(usize)) catch |err| { if (auto_loaded) break :load_config; @@ -283,7 +283,7 @@ pub const Arguments = struct { std.mem.span(config_path), }); Output.flush(); - std.os.exit(1); + Global.exit(1); }; js_ast.Stmt.Data.Store.create(allocator); @@ -362,7 +362,7 @@ pub const Arguments = struct { Output.flush(); HelpCommand.printWithReason(.explicit); Output.flush(); - std.os.exit(0); + Global.exit(0); } ctx.debug.dump_environment_variables = args.flag("--dump-environment-variables"); @@ -1085,7 +1085,7 @@ pub const Command = struct { @errorName(err), }); Output.flush(); - std.os.exit(1); + Global.exit(1); }; } } diff --git a/src/cli/bun_command.zig b/src/cli/bun_command.zig index 5807a5858..225940d13 100644 --- a/src/cli/bun_command.zig +++ b/src/cli/bun_command.zig @@ -147,7 +147,7 @@ pub const BunCommand = struct { if (ctx.debug.dump_limits) { fs.FileSystem.printLimits(); - std.os.exit(0); + Global.exit(0); return; } diff --git a/src/cli/create_command.zig b/src/cli/create_command.zig index 7abea971b..b82370a5f 100644 --- a/src/cli/create_command.zig +++ b/src/cli/create_command.zig @@ -222,7 +222,7 @@ const CreateOptions = struct { Output.prettyln(" NPM_CLIENT<r> Absolute path to the npm client executable", .{}); Output.flush(); - std.os.exit(0); + Global.exit(0); } var opts = CreateOptions{ .positionals = args.positionals() }; @@ -416,7 +416,7 @@ pub const CreateCommand = struct { const examples = try Example.fetchAllLocalAndRemote(ctx, null, &env_loader, filesystem); Example.print(examples.items, dirname); Output.flush(); - std.os.exit(1); + Global.exit(1); }, else => { node.end(); @@ -530,7 +530,7 @@ pub const CreateCommand = struct { Output.prettyErrorln("<r>\n<d>To download {s} anyway, use --force<r>", .{template}); Output.flush(); - std.os.exit(1); + Global.exit(1); } } @@ -569,7 +569,7 @@ pub const CreateCommand = struct { Output.prettyErrorln("<r><red>{s}<r>: opening dir {s}", .{ @errorName(err), template }); Output.flush(); - std.os.exit(1); + Global.exit(1); }; std.fs.deleteTreeAbsolute(destination) catch {}; @@ -580,7 +580,7 @@ pub const CreateCommand = struct { Output.prettyErrorln("<r><red>{s}<r>: creating dir {s}", .{ @errorName(err), destination }); Output.flush(); - std.os.exit(1); + Global.exit(1); }; const Walker = @import("../walker_skippable.zig"); @@ -608,7 +608,7 @@ pub const CreateCommand = struct { Output.prettyErrorln("<r><red>{s}<r>: copying file {s}", .{ @errorName(err), entry.path }); Output.flush(); - std.os.exit(1); + Global.exit(1); }; }; defer outfile.close(); @@ -629,7 +629,7 @@ pub const CreateCommand = struct { Output.prettyErrorln("<r><red>{s}<r>: copying file {s}", .{ @errorName(err), entry.path }); Output.flush(); - std.os.exit(1); + Global.exit(1); }; }; } @@ -1938,11 +1938,11 @@ pub const Example = struct { try ctx.log.printForLogLevelWithEnableAnsiColors(Output.errorWriter(), false); } Output.flush(); - std.os.exit(1); + Global.exit(1); } else { Output.prettyErrorln("Error parsing package: <r><red>{s}<r>", .{@errorName(err)}); Output.flush(); - std.os.exit(1); + Global.exit(1); } }; @@ -1956,7 +1956,7 @@ pub const Example = struct { try ctx.log.printForLogLevelWithEnableAnsiColors(Output.errorWriter(), false); } Output.flush(); - std.os.exit(1); + Global.exit(1); } const tarball_url: string = brk: { @@ -1975,7 +1975,7 @@ pub const Example = struct { Output.prettyErrorln("package.json is missing tarball url. This is an internal error!", .{}); Output.flush(); - std.os.exit(1); + Global.exit(1); }; progress.name = "Downloading tarball"; @@ -2000,7 +2000,7 @@ pub const Example = struct { refresher.refresh(); Output.prettyErrorln("Error fetching tarball: <r><red>{d}<r>", .{response.status_code}); Output.flush(); - std.os.exit(1); + Global.exit(1); } refresher.refresh(); @@ -2027,12 +2027,12 @@ pub const Example = struct { error.WouldBlock => { Output.prettyErrorln("Request timed out while trying to fetch examples list. Please try again", .{}); Output.flush(); - std.os.exit(1); + Global.exit(1); }, else => { Output.prettyErrorln("<r><red>{s}<r> while trying to fetch examples list. Please try again", .{@errorName(err)}); Output.flush(); - std.os.exit(1); + Global.exit(1); }, } }; @@ -2040,7 +2040,7 @@ pub const Example = struct { if (response.status_code != 200) { Output.prettyErrorln("<r><red>{d}<r> fetching examples :( {s}", .{ response.status_code, mutable.list.items }); Output.flush(); - std.os.exit(1); + Global.exit(1); } initializeStore(); @@ -2052,12 +2052,12 @@ pub const Example = struct { } else { try ctx.log.printForLogLevelWithEnableAnsiColors(Output.errorWriter(), false); } - std.os.exit(1); + Global.exit(1); Output.flush(); } else { Output.prettyErrorln("Error parsing examples: <r><red>{s}<r>", .{@errorName(err)}); Output.flush(); - std.os.exit(1); + Global.exit(1); } }; @@ -2068,7 +2068,7 @@ pub const Example = struct { try ctx.log.printForLogLevelWithEnableAnsiColors(Output.errorWriter(), false); } Output.flush(); - std.os.exit(1); + Global.exit(1); } if (examples_object.asProperty("examples")) |q| { @@ -2093,7 +2093,7 @@ pub const Example = struct { Output.prettyErrorln("Corrupt examples data: expected object but received {s}", .{@tagName(examples_object.data)}); Output.flush(); - std.os.exit(1); + Global.exit(1); } }; @@ -2154,7 +2154,7 @@ const GitHandler = struct { thread = std.Thread.spawn(.{}, spawnThread, .{ destination, PATH, verbose }) catch |err| { Output.prettyErrorln("<r><red>{s}<r>", .{@errorName(err)}); Output.flush(); - std.os.exit(1); + Global.exit(1); }; } diff --git a/src/cli/install_completions_command.zig b/src/cli/install_completions_command.zig index 20b56c2b1..b64b31ebd 100644 --- a/src/cli/install_completions_command.zig +++ b/src/cli/install_completions_command.zig @@ -55,11 +55,11 @@ pub const InstallCompletionsCommand = struct { switch (shell) { .bash => { Output.prettyErrorln("<r><red>error:<r> Bash completions aren't implemented yet, just zsh & fish. A PR is welcome!", .{}); - std.os.exit(fail_exit_code); + Global.exit(fail_exit_code); }, .unknown => { Output.prettyErrorln("<r><red>error:<r> Unknown or unsupported shell. Please set $SHELL to one of zsh, fish, or bash. To manually output completions, run this:\n bun getcompletes", .{}); - std.os.exit(fail_exit_code); + Global.exit(fail_exit_code); }, else => {}, } @@ -69,7 +69,7 @@ pub const InstallCompletionsCommand = struct { if (std.os.getenvZ("IS_BUN_AUTO_UPDATE") == null) { if (!stdout.isTty()) { try stdout.writeAll(shell.completions()); - std.os.exit(0); + Global.exit(0); } } @@ -79,7 +79,7 @@ pub const InstallCompletionsCommand = struct { var cwd = std.os.getcwd(&cwd_buf) catch { Output.prettyErrorln("<r><red>error<r>: Could not get current working directory", .{}); Output.flush(); - std.os.exit(fail_exit_code); + Global.exit(fail_exit_code); }; for (std.os.argv) |arg, i| { @@ -100,7 +100,7 @@ pub const InstallCompletionsCommand = struct { if (!std.fs.path.isAbsolute(completions_dir)) { Output.prettyErrorln("<r><red>error:<r> Please pass an absolute path. {s} is invalid", .{completions_dir}); Output.flush(); - std.os.exit(fail_exit_code); + Global.exit(fail_exit_code); } break :found std.fs.openDirAbsolute(completions_dir, .{ @@ -108,7 +108,7 @@ pub const InstallCompletionsCommand = struct { }) catch |err| { Output.prettyErrorln("<r><red>error:<r> accessing {s} errored {s}", .{ completions_dir, @errorName(err) }); Output.flush(); - std.os.exit(fail_exit_code); + Global.exit(fail_exit_code); }; } @@ -248,7 +248,7 @@ pub const InstallCompletionsCommand = struct { .{}, ); Output.flush(); - std.os.exit(fail_exit_code); + Global.exit(fail_exit_code); }; const filename = switch (shell) { @@ -268,7 +268,7 @@ pub const InstallCompletionsCommand = struct { @errorName(err), }); Output.flush(); - std.os.exit(fail_exit_code); + Global.exit(fail_exit_code); }; output_file.writeAll(shell.completions()) catch |err| { @@ -277,7 +277,7 @@ pub const InstallCompletionsCommand = struct { @errorName(err), }); Output.flush(); - std.os.exit(fail_exit_code); + Global.exit(fail_exit_code); }; defer output_file.close(); diff --git a/src/cli/package_manager_command.zig b/src/cli/package_manager_command.zig index 447a21775..63fb416b5 100644 --- a/src/cli/package_manager_command.zig +++ b/src/cli/package_manager_command.zig @@ -2,7 +2,7 @@ const Command = @import("../cli.zig").Command; const PackageManager = @import("../install/install.zig").PackageManager; const std = @import("std"); const strings = @import("strings"); - +const Global = @import("../global.zig").Global; pub const PackageManagerCommand = struct { pub fn printHelp(_: std.mem.Allocator) void {} pub fn exec(ctx: Command.Context) !void { @@ -16,7 +16,7 @@ pub const PackageManagerCommand = struct { if (args.len == 0) { printHelp(ctx.allocator); - std.os.exit(0); + Global.exit(0); } first = std.mem.span(args[0]); diff --git a/src/cli/run_command.zig b/src/cli/run_command.zig index 86170965d..62f9b88e6 100644 --- a/src/cli/run_command.zig +++ b/src/cli/run_command.zig @@ -265,7 +265,7 @@ pub const RunCommand = struct { Output.prettyErrorln("<r><red>Script error<r> <b>\"{s}\"<r> exited with {d} status<r>", .{ name, result.Exited }); Output.flush(); - std.os.exit(result.Exited); + Global.exit(result.Exited); } return true; @@ -305,7 +305,7 @@ pub const RunCommand = struct { if (result.Exited > 0) { Output.prettyErrorln("<r><red>error<r> <b>\"{s}\"<r> exited with {d} status<r>", .{ std.fs.path.basename(executable), result.Exited }); Output.flush(); - std.os.exit(result.Exited); + Global.exit(result.Exited); } return true; @@ -615,7 +615,7 @@ pub const RunCommand = struct { const shebang_size = file.pread(&shebang_buf, 0) catch |err| { Output.prettyErrorln("<r><red>error<r>: Failed to read file <b>{s}<r> due to error <b>{s}<r>", .{ file_path, @errorName(err) }); Output.flush(); - std.os.exit(1); + Global.exit(1); }; var shebang: string = shebang_buf[0..shebang_size]; @@ -639,7 +639,7 @@ pub const RunCommand = struct { @errorName(err), }); Output.flush(); - std.os.exit(1); + Global.exit(1); }; return true; @@ -877,7 +877,7 @@ pub const RunCommand = struct { if (comptime log_errors) { Output.prettyError("<r>No \"scripts\" in package.json found.", .{}); Output.flush(); - std.os.exit(0); + Global.exit(0); } return false; @@ -924,7 +924,7 @@ pub const RunCommand = struct { if (comptime log_errors) { Output.prettyError("<r><red>error:<r> Missing script: <b>{s}<r>\n", .{script_name_to_search}); Output.flush(); - std.os.exit(0); + Global.exit(0); } return false; diff --git a/src/cli/test_command.zig b/src/cli/test_command.zig index 5a479189f..f7010d521 100644 --- a/src/cli/test_command.zig +++ b/src/cli/test_command.zig @@ -318,7 +318,7 @@ pub const TestCommand = struct { Output.flush(); if (reporter.summary.fail > 0) { - std.os.exit(1); + Global.exit(1); } } diff --git a/src/cli/upgrade_command.zig b/src/cli/upgrade_command.zig index 36ad03537..3febe4cee 100644 --- a/src/cli/upgrade_command.zig +++ b/src/cli/upgrade_command.zig @@ -219,11 +219,11 @@ pub const UpgradeCommand = struct { try log.printForLogLevelWithEnableAnsiColors(Output.errorWriter(), false); } Output.flush(); - std.os.exit(1); + Global.exit(1); } else { Output.prettyErrorln("Error parsing releases from GitHub: <r><red>{s}<r>", .{@errorName(err)}); Output.flush(); - std.os.exit(1); + Global.exit(1); } } @@ -241,7 +241,7 @@ pub const UpgradeCommand = struct { try log.printForLogLevelWithEnableAnsiColors(Output.errorWriter(), false); } Output.flush(); - std.os.exit(1); + Global.exit(1); } return null; @@ -257,7 +257,7 @@ pub const UpgradeCommand = struct { const json_type: js_ast.Expr.Tag = @as(js_ast.Expr.Tag, expr.data); Output.prettyErrorln("JSON error - expected an object but received {s}", .{@tagName(json_type)}); Output.flush(); - std.os.exit(1); + Global.exit(1); } return null; @@ -276,7 +276,7 @@ pub const UpgradeCommand = struct { Output.prettyErrorln("JSON Error parsing releases from GitHub: <r><red>tag_name<r> is missing?\n{s}", .{metadata_body.list.items}); Output.flush(); - std.os.exit(1); + Global.exit(1); } return null; @@ -332,7 +332,7 @@ pub const UpgradeCommand = struct { } Output.flush(); - std.os.exit(0); + Global.exit(0); } return null; @@ -343,7 +343,7 @@ pub const UpgradeCommand = struct { _exec(ctx) catch |err| { Output.prettyErrorln("<r>bun upgrade failed with error: <red><b>{s}<r>\n\n<cyan>Please upgrade manually<r>:\n <b>curl https://bun.sh/install | bash<r>\n\n", .{@errorName(err)}); Output.flush(); - std.os.exit(1); + Global.exit(1); }; } @@ -379,7 +379,7 @@ pub const UpgradeCommand = struct { }, ); Output.flush(); - std.os.exit(0); + Global.exit(0); } if (version.name() == null) { @@ -388,7 +388,7 @@ pub const UpgradeCommand = struct { .{}, ); Output.flush(); - std.os.exit(1); + Global.exit(1); } } @@ -435,7 +435,7 @@ pub const UpgradeCommand = struct { if (bytes.len == 0) { Output.prettyErrorln("<r><red>error:<r> Failed to download the latest version of bun. Received empty content", .{}); Output.flush(); - std.os.exit(1); + Global.exit(1); } const version_name = version.name().?; @@ -444,12 +444,12 @@ pub const UpgradeCommand = struct { var save_dir = save_dir_.makeOpenPath(version_name, .{ .iterate = true }) catch { Output.prettyErrorln("<r><red>error:<r> Failed to open temporary directory", .{}); Output.flush(); - std.os.exit(1); + Global.exit(1); }; var tmpdir_path = std.os.getFdPath(save_dir.fd, &tmpdir_path_buf) catch { Output.prettyErrorln("<r><red>error:<r> Failed to read temporary directory", .{}); Output.flush(); - std.os.exit(1); + Global.exit(1); }; tmpdir_path_buf[tmpdir_path.len] = 0; @@ -461,7 +461,7 @@ pub const UpgradeCommand = struct { var zip_file = save_dir.createFileZ(tmpname, .{ .truncate = true }) catch |err| { Output.prettyErrorln("<r><red>error:<r> Failed to open temp file {s}", .{@errorName(err)}); Output.flush(); - std.os.exit(1); + Global.exit(1); }; { @@ -469,7 +469,7 @@ pub const UpgradeCommand = struct { save_dir.deleteFileZ(tmpname) catch {}; Output.prettyErrorln("<r><red>error:<r> Failed to write to temp file {s}", .{@errorName(err)}); Output.flush(); - std.os.exit(1); + Global.exit(1); }; zip_file.close(); } @@ -483,7 +483,7 @@ pub const UpgradeCommand = struct { save_dir.deleteFileZ(tmpname) catch {}; Output.prettyErrorln("<r><red>error:<r> Failed to locate \"unzip\" in PATH. bun upgrade needs \"unzip\" to work.", .{}); Output.flush(); - std.os.exit(1); + Global.exit(1); }; // We could just embed libz2 @@ -508,14 +508,14 @@ pub const UpgradeCommand = struct { save_dir.deleteFileZ(tmpname) catch {}; Output.prettyErrorln("<r><red>error:<r> Failed to spawn unzip due to {s}.", .{@errorName(err)}); Output.flush(); - std.os.exit(1); + Global.exit(1); }; if (unzip_result.Exited != 0) { Output.prettyErrorln("<r><red>Unzip failed<r> (exit code: {d})", .{unzip_result.Exited}); Output.flush(); save_dir.deleteFileZ(tmpname) catch {}; - std.os.exit(1); + Global.exit(1); } } @@ -534,14 +534,14 @@ pub const UpgradeCommand = struct { save_dir_.deleteTree(version_name) catch {}; Output.prettyErrorln("<r><red>error<r> Failed to verify bun {s}<r>)", .{@errorName(err)}); Output.flush(); - std.os.exit(1); + Global.exit(1); }; if (result.term.Exited != 0) { save_dir_.deleteTree(version_name) catch {}; Output.prettyErrorln("<r><red>error<r> failed to verify bun<r> (exit code: {d})", .{result.term.Exited}); Output.flush(); - std.os.exit(1); + Global.exit(1); } if (!strings.eql(std.mem.trim(u8, result.stdout, " \n\r\t"), version_name)) { @@ -555,7 +555,7 @@ pub const UpgradeCommand = struct { }, ); Output.flush(); - std.os.exit(1); + Global.exit(1); } } @@ -572,7 +572,7 @@ pub const UpgradeCommand = struct { save_dir_.deleteTree(version_name) catch {}; Output.prettyErrorln("<r><red>error:<r> Failed to open bun's install directory {s}", .{@errorName(err)}); Output.flush(); - std.os.exit(1); + Global.exit(1); }; if (env_loader.map.get("BUN_DRY_RUN") == null) { @@ -580,7 +580,7 @@ pub const UpgradeCommand = struct { save_dir_.deleteTree(version_name) catch {}; Output.prettyErrorln("<r><red>error:<r> Failed to move new version of bun due to {s}. You could try the install script instead:\n curl -L https://bun.sh/install | bash", .{@errorName(err)}); Output.flush(); - std.os.exit(1); + Global.exit(1); }; } diff --git a/src/global.zig b/src/global.zig index fefc6b8bc..26c22caf6 100644 --- a/src/global.zig +++ b/src/global.zig @@ -559,6 +559,11 @@ pub const Global = struct { } } + pub fn exit(code: u8) noreturn { + Output.flush(); + std.os.exit(code); + } + pub const AllocatorConfiguration = struct { verbose: bool = false, long_running: bool = false, @@ -614,7 +619,7 @@ pub const Global = struct { } else { Output.prettyErrorln(fmt, args); Output.flush(); - std.os.exit(1); + Global.exit(1); } } @@ -627,7 +632,7 @@ pub const Global = struct { pub fn crash() noreturn { @setCold(true); Output.flush(); - std.os.exit(1); + Global.exit(1); } }; diff --git a/src/http.zig b/src/http.zig index e16f4c2a3..2b31807cf 100644 --- a/src/http.zig +++ b/src/http.zig @@ -3040,7 +3040,7 @@ pub const Server = struct { else => { Output.prettyErrorln("<r><red>{s} while trying to start listening on port {d}.\n\n", .{ @errorName(err), port }); Output.flush(); - std.os.exit(1); + Global.exit(1); }, } }; @@ -3060,7 +3060,7 @@ pub const Server = struct { }, ); Output.flush(); - std.os.exit(1); + Global.exit(1); } } @@ -3505,7 +3505,7 @@ pub const Server = struct { if (debug.dump_limits) { Fs.FileSystem.printLimits(); - std.os.exit(0); + Global.exit(0); return; } diff --git a/src/js_ast.zig b/src/js_ast.zig index 8e11b78e5..d3475435f 100644 --- a/src/js_ast.zig +++ b/src/js_ast.zig @@ -39,6 +39,10 @@ pub fn NewBaseStore(comptime Union: anytype, comptime count: usize) type { return struct { const Allocator = std.mem.Allocator; const Self = @This(); + pub const WithBase = struct { + head: Block = Block{}, + store: Self, + }; const Block = struct { used: SizeType = 0, @@ -52,7 +56,7 @@ pub fn NewBaseStore(comptime Union: anytype, comptime count: usize) type { if (comptime Environment.allow_assert) std.debug.assert(block.used < count); const index = block.used; block.items[index][0..value.len].* = value.*; - block.used +%= 1; + block.used +|= 1; return &block.items[index]; } }; @@ -90,11 +94,29 @@ pub fn NewBaseStore(comptime Union: anytype, comptime count: usize) type { } }; - block: Block = Block{ .used = 0 }, overflow: Overflow = Overflow{}, pub threadlocal var _self: *Self = undefined; + pub fn reclaim() []*Block { + if (_self.overflow.used == 0) return &[_]*Block{}; + + var used = _self.overflow.allocator.dupe(*Block, _self.overflow.slice()) catch unreachable; + var new_head = _self.overflow.allocator.create(Block) catch unreachable; + new_head.* = Block{}; + + var to_move = _self.overflow.ptrs[0.._self.overflow.allocated][_self.overflow.used..]; + if (to_move.len > 0) { + to_move = to_move[1..]; + } + + std.mem.copyBackwards(*Block, _self.overflow.ptrs[1..], to_move); + _self.overflow.ptrs[0] = new_head; + _self.overflow.allocated = 1 + @truncate(Overflow.UsedSize, to_move.len); + reset(); + return used; + } + pub fn reset() void { for (_self.overflow.slice()) |b| { b.used = 0; @@ -103,12 +125,10 @@ pub fn NewBaseStore(comptime Union: anytype, comptime count: usize) type { } pub fn init(allocator: std.mem.Allocator) *Self { - var instance = allocator.create(Self) catch unreachable; - instance.* = Self{ - .overflow = Overflow{ .allocator = allocator }, - .block = Block{}, - }; - instance.overflow.ptrs[0] = &instance.block; + var base = allocator.create(WithBase) catch unreachable; + base.* = WithBase{ .store = .{ .overflow = Overflow{ .allocator = allocator } } }; + var instance = &base.store; + instance.overflow.ptrs[0] = &base.head; instance.overflow.allocated = 1; _self = instance; @@ -127,9 +147,12 @@ pub fn NewBaseStore(comptime Union: anytype, comptime count: usize) type { default_allocator.free(ptrs); i += 2; } + _self.overflow.allocated = 1; + } + var base_store = @fieldParentPtr(WithBase, "store", _self); + if (_self.overflow.ptrs[0] == &base_store.head) { + default_allocator.destroy(_self); } - - default_allocator.destroy(_self); _self = undefined; } @@ -2048,6 +2071,11 @@ pub const Stmt = struct { pub fn append(comptime ValueType: type, value: anytype) *ValueType { return All.append(ValueType, value); } + + pub fn toOwnedSlice() []*Store.All.Block { + if (!has_inited or Store.All._self.overflow.used == 0 or disable_reset) return &[_]*Store.All.Block{}; + return Store.All.reclaim(); + } }; }; @@ -3272,29 +3300,30 @@ pub const Expr = struct { e_dot: *E.Dot, e_index: *E.Index, e_arrow: *E.Arrow, - e_identifier: E.Identifier, - e_import_identifier: E.ImportIdentifier, + e_private_identifier: *E.PrivateIdentifier, e_jsx_element: *E.JSXElement, - e_object: *E.Object, e_spread: *E.Spread, - e_template_part: *E.TemplatePart, e_template: *E.Template, e_reg_exp: *E.RegExp, e_await: *E.Await, e_yield: *E.Yield, e_if: *E.If, - e_require: E.Require, - e_require_or_require_resolve: E.RequireOrRequireResolve, e_import: *E.Import, + e_identifier: E.Identifier, + e_import_identifier: E.ImportIdentifier, + e_boolean: E.Boolean, e_number: E.Number, e_big_int: *E.BigInt, e_string: *E.String, + e_require: E.Require, + e_require_or_require_resolve: E.RequireOrRequireResolve, + e_missing: E.Missing, e_this: E.This, e_super: E.Super, @@ -3388,6 +3417,11 @@ pub const Expr = struct { return All.append(ValueType, value); } } + + pub fn toOwnedSlice() []*Store.All.Block { + if (!has_inited or Store.All._self.overflow.used == 0 or disable_reset) return &[_]*Store.All.Block{}; + return Store.All.reclaim(); + } }; pub inline fn isStringValue(self: Data) bool { @@ -3396,6 +3430,10 @@ pub const Expr = struct { }; }; +test "Byte size of Expr" { + try std.io.getStdErr().writeAll(comptime std.fmt.comptimePrint("\n\nByte Size {d}\n\n", .{@sizeOf(Expr.Data)})); +} + pub const EnumValue = struct { loc: logger.Loc, ref: Ref, diff --git a/src/json_parser.zig b/src/json_parser.zig index e8fbde12c..c732bfd12 100644 --- a/src/json_parser.zig +++ b/src/json_parser.zig @@ -258,10 +258,11 @@ fn JSONLikeParser(opts: js_lexer.JSONOptions) type { try p.lexer.unexpected(); if (comptime Environment.isDebug) { - std.io.getStdErr().writeAll("\nThis range: \n") catch {}; - std.io.getStdErr().writeAll( - p.lexer.source.contents[p.lexer.range().loc.toUsize()..p.lexer.range().end().toUsize()], - ) catch {}; + std.io.getStdErr().writer().print("\nThis range: {d} - {d} \n{s}", .{ + p.lexer.range().loc.start, + p.lexer.range().end(), + p.lexer.range().in(p.lexer.source.contents), + }) catch {}; @breakpoint(); } diff --git a/src/logger.zig b/src/logger.zig index 2ae8a8d8a..2607241bf 100644 --- a/src/logger.zig +++ b/src/logger.zig @@ -462,6 +462,12 @@ pub const Range = packed struct { len: i32 = 0, pub const None = Range{ .loc = Loc.Empty, .len = 0 }; + pub fn in(this: Range, buf: []const u8) []const u8 { + if (this.loc.start < 0 or this.len <= 0) return ""; + const slice = buf[@intCast(usize, this.loc.start)..]; + return slice[0..@minimum(@intCast(usize, this.len), buf.len)]; + } + pub fn isEmpty(r: *const Range) bool { return r.len == 0 and r.loc.start == Loc.Empty.start; } diff --git a/src/report.zig b/src/report.zig index ed2b697ff..c60ba9e68 100644 --- a/src/report.zig +++ b/src/report.zig @@ -270,6 +270,10 @@ pub noinline fn handleCrash(signal: i32, addr: usize) void { } crash_report_writer.file = null; + if (@errorReturnTrace()) |stack| { + std.debug.dumpStackTrace(stack.*); + } + } std.c._exit(128 + @truncate(u8, @intCast(u8, @maximum(signal, 0)))); } @@ -278,7 +282,7 @@ pub noinline fn globalError(err: anyerror) noreturn { @setCold(true); if (@atomicRmw(bool, &globalError_ranOnce, .Xchg, true, .Monotonic)) { - std.os.exit(1); + Global.exit(1); } switch (err) { @@ -288,7 +292,7 @@ pub noinline fn globalError(err: anyerror) noreturn { .{}, ); Output.flush(); - std.os.exit(1); + Global.exit(1); }, error.OutOfMemory => { Output.prettyError( @@ -297,7 +301,7 @@ pub noinline fn globalError(err: anyerror) noreturn { ); printMetadata(); Output.flush(); - std.os.exit(1); + Global.exit(1); }, error.CurrentWorkingDirectoryUnlinked => { Output.prettyError( @@ -305,7 +309,7 @@ pub noinline fn globalError(err: anyerror) noreturn { .{}, ); Output.flush(); - std.os.exit(1); + Global.exit(1); }, error.BundleFailed => { Output.prettyError( @@ -313,7 +317,7 @@ pub noinline fn globalError(err: anyerror) noreturn { .{}, ); Output.flush(); - std.os.exit(1); + Global.exit(1); }, error.SystemFdQuotaExceeded => { const limit = std.os.getrlimit(.NOFILE) catch std.mem.zeroes(std.os.rlimit); @@ -372,7 +376,7 @@ pub noinline fn globalError(err: anyerror) noreturn { } Output.flush(); - std.os.exit(1); + Global.exit(1); }, error.ProcessFdQuotaExceeded => { const limit = std.os.getrlimit(.NOFILE) catch std.mem.zeroes(std.os.rlimit); @@ -435,7 +439,7 @@ pub noinline fn globalError(err: anyerror) noreturn { } Output.flush(); - std.os.exit(1); + Global.exit(1); }, // The usage of `unreachable` in Zig's std.os may cause the file descriptor problem to show up as other errors error.NotOpenForReading, error.Unexpected => { @@ -489,7 +493,7 @@ pub noinline fn globalError(err: anyerror) noreturn { } Output.flush(); - std.os.exit(1); + Global.exit(1); } }, error.FileNotFound => { @@ -510,7 +514,7 @@ pub noinline fn globalError(err: anyerror) noreturn { std.debug.writeStackTrace(trace.*, Output.errorWriter(), default_allocator, debug_info, std.debug.detectTTYConfig()) catch break :print_stacktrace; } - std.os.exit(1); + Global.exit(1); }, error.MissingPackageJSON => { Output.prettyError( @@ -518,10 +522,10 @@ pub noinline fn globalError(err: anyerror) noreturn { .{}, ); Output.flush(); - std.os.exit(1); + Global.exit(1); }, error.MissingValue => { - std.os.exit(1); + Global.exit(1); }, else => {}, } @@ -535,5 +539,5 @@ pub noinline fn globalError(err: anyerror) noreturn { std.debug.writeStackTrace(trace.*, Output.errorWriter(), default_allocator, debug_info, std.debug.detectTTYConfig()) catch break :print_stacktrace; } - std.os.exit(1); + Global.exit(1); } diff --git a/src/resolver/resolver.zig b/src/resolver/resolver.zig index 205dab45b..c07d65133 100644 --- a/src/resolver/resolver.zig +++ b/src/resolver/resolver.zig @@ -443,7 +443,7 @@ pub const Resolver = struct { error.ModuleNotFound => { Output.prettyErrorln("<r><red>ResolveError<r> can't find framework: <b>\"{s}\"<r>.\n\nMaybe it's not installed? Try running this:\n\n <b>npm install -D {s}<r>\n <b>bun bun --use {s}<r>", .{ package, package, package }); Output.flush(); - std.os.exit(1); + Global.exit(1); }, else => { return err; @@ -463,7 +463,7 @@ pub const Resolver = struct { error.ModuleNotFound => { Output.prettyErrorln("<r><red>ResolveError<r> can't find framework: <b>\"{s}\"<r>.\n\nMaybe it's not installed? Try running this:\n\n <b>npm install -D {s}\n <b>bun bun --use {s}<r>", .{ package, prefixed_name, package }); Output.flush(); - std.os.exit(1); + Global.exit(1); }, else => { return err; @@ -484,7 +484,7 @@ pub const Resolver = struct { Output.prettyError("<r><red>ResolveError<r> can't find local framework: <b>\"{s}\"<r>.", .{package}); Output.flush(); - std.os.exit(1); + Global.exit(1); }, else => { return err; |