aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/bundler.zig7
-rw-r--r--src/cli/bun_command.zig1
-rw-r--r--src/cli/create_command.zig2
-rw-r--r--src/cli/dev_command.zig4
-rw-r--r--src/cli/run_command.zig4
-rw-r--r--src/global.zig22
-rw-r--r--src/import_record.zig2
-rw-r--r--src/js_parser/js_parser.zig10
-rw-r--r--src/logger.zig24
9 files changed, 57 insertions, 19 deletions
diff --git a/src/bundler.zig b/src/bundler.zig
index 97f975fe9..15d190b0c 100644
--- a/src/bundler.zig
+++ b/src/bundler.zig
@@ -1254,10 +1254,13 @@ pub const Bundler = struct {
var package_path = path.text;
var file_path = path.text;
- if (resolve_result.package_json) |pkg| {
- if (std.mem.indexOfScalar(u32, this.always_bundled_package_hashes, pkg.hash) != null) {
+ if (resolve_result.package_json) |pkg_| {
+ var pkg: *const PackageJSON = pkg_;
+ if (std.mem.indexOfScalar(u32, this.always_bundled_package_hashes, pkg.hash)) |pkg_i| {
+ pkg = this.always_bundled_package_jsons[pkg_i];
const key_path_source_dir = pkg.source.key_path.sourceDir();
const default_source_dir = pkg.source.path.sourceDir();
+
if (strings.startsWith(path.text, key_path_source_dir)) {
import_path = path.text[key_path_source_dir.len..];
} else if (strings.startsWith(path.text, default_source_dir)) {
diff --git a/src/cli/bun_command.zig b/src/cli/bun_command.zig
index 51c913d5d..a25b33c88 100644
--- a/src/cli/bun_command.zig
+++ b/src/cli/bun_command.zig
@@ -84,6 +84,7 @@ pub const BunCommand = struct {
pub fn exec(
ctx: Command.Context,
) !void {
+ Global.configureAllocator(.{ .long_running = true });
var allocator = ctx.allocator;
var log = ctx.log;
estimated_input_lines_of_code_ = 0;
diff --git a/src/cli/create_command.zig b/src/cli/create_command.zig
index fcdc92a66..c559c97f2 100644
--- a/src/cli/create_command.zig
+++ b/src/cli/create_command.zig
@@ -261,6 +261,8 @@ pub const CreateCommand = struct {
var client: HTTPClient = undefined;
pub fn exec(ctx: Command.Context, positionals_: []const []const u8) !void {
+ Global.configureAllocator(.{ .long_running = false });
+
var create_options = try CreateOptions.parse(ctx, false);
const positionals = create_options.positionals;
diff --git a/src/cli/dev_command.zig b/src/cli/dev_command.zig
index 91dee1bbc..46c4a0e3c 100644
--- a/src/cli/dev_command.zig
+++ b/src/cli/dev_command.zig
@@ -1,9 +1,9 @@
const Server = @import("../http.zig").Server;
const Command = @import("../cli.zig").Command;
-
+const Global = @import("../global.zig").Global;
pub const DevCommand = struct {
pub fn exec(ctx: Command.Context) !void {
+ Global.configureAllocator(.{ .long_running = true });
try Server.start(ctx.allocator, ctx.args, @TypeOf(ctx.debug), ctx.debug);
-
}
};
diff --git a/src/cli/run_command.zig b/src/cli/run_command.zig
index 4593f5f6a..c4c9e5f10 100644
--- a/src/cli/run_command.zig
+++ b/src/cli/run_command.zig
@@ -487,6 +487,7 @@ pub const RunCommand = struct {
if (shebang.len > 2 and strings.eqlComptimeIgnoreLen(shebang[0..2], "#!")) {
break :possibly_open_with_bun_js;
}
+ Global.configureAllocator(.{ .long_running = true });
Run.boot(ctx, file, ctx.allocator.dupe(u8, file_path) catch unreachable) catch |err| {
if (Output.enable_ansi_colors) {
@@ -512,6 +513,9 @@ pub const RunCommand = struct {
}
}
}
+
+ Global.configureAllocator(.{ .long_running = false });
+
var args = ctx.args;
args.node_modules_bundle_path = null;
args.node_modules_bundle_path_server = null;
diff --git a/src/global.zig b/src/global.zig
index 90a5ca7b5..5d2370b53 100644
--- a/src/global.zig
+++ b/src/global.zig
@@ -1,7 +1,9 @@
const std = @import("std");
pub const Environment = @import("env.zig");
-pub const default_allocator: *std.mem.Allocator = if (isTest)
+const use_mimalloc = !Environment.isTest and Environment.isNative;
+
+pub const default_allocator: *std.mem.Allocator = if (!use_mimalloc)
std.heap.c_allocator
else
@import("./memory_allocator.zig").c_allocator;
@@ -77,6 +79,7 @@ pub const Output = struct {
}
}
};
+
pub var enable_ansi_colors = isNative;
pub var enable_buffering = true;
pub var is_stdout_piped = false;
@@ -406,6 +409,23 @@ pub const Global = struct {
else
std.fmt.comptimePrint("0.0.{d}", .{build_id});
+ pub const AllocatorConfiguration = struct {
+ verbose: bool = false,
+ long_running: bool = false,
+ };
+
+ // Enabling huge pages slows down Bun by 8x or so
+ // Keeping this code for:
+ // 1. documentation that an attempt was made
+ // 2. if I want to configure allocator later
+ pub inline fn configureAllocator(config: AllocatorConfiguration) void {
+ // if (comptime !use_mimalloc) return;
+ // const Mimalloc = @import("./allocators/mimalloc.zig");
+ // Mimalloc.mi_option_set_enabled(Mimalloc.mi_option_verbose, config.verbose);
+ // Mimalloc.mi_option_set_enabled(Mimalloc.mi_option_large_os_pages, config.long_running);
+ // if (!config.long_running) Mimalloc.mi_option_set(Mimalloc.mi_option_reset_delay, 0);
+ }
+
pub fn panic(comptime fmt: string, args: anytype) noreturn {
@setCold(true);
if (comptime isWasm) {
diff --git a/src/import_record.zig b/src/import_record.zig
index adb6ea625..aa82e4731 100644
--- a/src/import_record.zig
+++ b/src/import_record.zig
@@ -97,6 +97,8 @@ pub const ImportRecord = struct {
// If true, this was originally written as a bare "import 'file'" statement
was_originally_bare_import: bool = false,
+ was_originally_require: bool = false,
+
kind: ImportKind,
pub const PrintMode = enum {
diff --git a/src/js_parser/js_parser.zig b/src/js_parser/js_parser.zig
index 84e6b0b13..11836bd6e 100644
--- a/src/js_parser/js_parser.zig
+++ b/src/js_parser/js_parser.zig
@@ -428,9 +428,9 @@ pub const ImportScanner = struct {
// This is a breaking change though. We can make it an option with some guardrail
// so maybe if it errors, it shows a suggestion "retry without trimming unused imports"
if (p.options.ts and found_imports and is_unused_in_typescript and !p.options.preserve_unused_imports_ts) {
- // Ignore import records with a pre-filled source index. These are
- // for injected files and we definitely do not want to trim these.
- if (!record.is_internal) {
+ // internal imports are presumed to be always used
+ // require statements cannot be stripped
+ if (!record.is_internal and !record.was_originally_require) {
record.is_unused = true;
continue;
}
@@ -3211,6 +3211,10 @@ pub fn NewParser(
if (!p.options.transform_require_to_import) {
return p.e(E.Require{ .import_record_index = import_record_index }, arg.loc);
}
+
+ p.import_records.items[import_record_index].was_originally_require = true;
+ p.import_records.items[import_record_index].contains_import_star = true;
+
const symbol_name = p.import_records.items[import_record_index].path.name.nonUniqueNameString(p.allocator);
const cjs_import_name = std.fmt.allocPrint(
p.allocator,
diff --git a/src/logger.zig b/src/logger.zig
index 931889aab..b9d2b62ec 100644
--- a/src/logger.zig
+++ b/src/logger.zig
@@ -990,25 +990,26 @@ pub const Source = struct {
}
pub fn initErrorPosition(self: *const Source, _offset: Loc) ErrorPosition {
- var prev_code_point: u21 = 0;
+ var prev_code_point: i32 = 0;
var offset: usize = std.math.min(if (_offset.start < 0) 0 else @intCast(usize, _offset.start), @maximum(self.contents.len, 1) - 1);
const contents = self.contents;
- var iter = unicode.Utf8Iterator{
+ var iter_ = strings.CodepointIterator{
.bytes = self.contents[0..offset],
.i = 0,
};
+ var iter = strings.CodepointIterator.Cursor{};
var line_start: usize = 0;
var line_count: usize = 1;
var column_number: usize = 1;
- while (iter.nextCodepoint()) |code_point| {
- switch (code_point) {
+ while (iter_.next(&iter)) {
+ switch (iter.c) {
'\n' => {
column_number = 1;
- line_start = iter.i + 1;
+ line_start = iter.width + iter.i;
if (prev_code_point != '\r') {
line_count += 1;
}
@@ -1016,12 +1017,12 @@ pub const Source = struct {
'\r' => {
column_number = 0;
- line_start = iter.i + 1;
+ line_start = iter.width + iter.i;
line_count += 1;
},
0x2028, 0x2029 => {
- line_start = iter.i + 3; // These take three bytes to encode in UTF-8
+ line_start = iter.width + iter.i; // These take three bytes to encode in UTF-8
line_count += 1;
column_number = 1;
},
@@ -1030,19 +1031,20 @@ pub const Source = struct {
},
}
- prev_code_point = code_point;
+ prev_code_point = iter.c;
}
- iter = unicode.Utf8Iterator{
+ iter_ = strings.CodepointIterator{
.bytes = self.contents[offset..],
.i = 0,
};
+ iter = strings.CodepointIterator.Cursor{};
// Scan to the end of the line (or end of file if this is the last line)
var line_end: usize = contents.len;
- loop: while (iter.nextCodepoint()) |code_point| {
- switch (code_point) {
+ loop: while (iter_.next(&iter)) {
+ switch (iter.c) {
'\r', '\n', 0x2028, 0x2029 => {
line_end = offset + iter.i;
break :loop;