aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/bun_js.zig8
-rw-r--r--src/cli.zig12
-rw-r--r--src/cli/bun_command.zig2
-rw-r--r--src/cli/create_command.zig40
-rw-r--r--src/cli/install_completions_command.zig18
-rw-r--r--src/cli/package_manager_command.zig4
-rw-r--r--src/cli/run_command.zig12
-rw-r--r--src/cli/test_command.zig2
-rw-r--r--src/cli/upgrade_command.zig44
-rw-r--r--src/global.zig9
-rw-r--r--src/http.zig6
-rw-r--r--src/js_ast.zig70
-rw-r--r--src/json_parser.zig9
-rw-r--r--src/logger.zig6
-rw-r--r--src/report.zig28
-rw-r--r--src/resolver/resolver.zig6
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;