diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/bundler.zig | 7 | ||||
-rw-r--r-- | src/cli/bun_command.zig | 1 | ||||
-rw-r--r-- | src/cli/create_command.zig | 2 | ||||
-rw-r--r-- | src/cli/dev_command.zig | 4 | ||||
-rw-r--r-- | src/cli/run_command.zig | 4 | ||||
-rw-r--r-- | src/global.zig | 22 | ||||
-rw-r--r-- | src/import_record.zig | 2 | ||||
-rw-r--r-- | src/js_parser/js_parser.zig | 10 | ||||
-rw-r--r-- | src/logger.zig | 24 |
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; |