diff options
author | 2023-01-24 23:53:03 -0800 | |
---|---|---|
committer | 2023-01-24 23:53:03 -0800 | |
commit | 325ffd70e17992e9b61c41e854e9e0a810f21274 (patch) | |
tree | ee0b2c8b649cde1f6f040f9a9ba474e92ac21496 | |
parent | d4ce045f9ee98d02db9228920497b30ffc3a2af1 (diff) | |
download | bun-325ffd70e17992e9b61c41e854e9e0a810f21274.tar.gz bun-325ffd70e17992e9b61c41e854e9e0a810f21274.tar.zst bun-325ffd70e17992e9b61c41e854e9e0a810f21274.zip |
one less alloc
-rw-r--r-- | src/install/install.zig | 40 | ||||
-rw-r--r-- | src/install/lockfile.zig | 10 |
2 files changed, 37 insertions, 13 deletions
diff --git a/src/install/install.zig b/src/install/install.zig index 6d9bd5409..16943ae33 100644 --- a/src/install/install.zig +++ b/src/install/install.zig @@ -2967,6 +2967,32 @@ pub const PackageManager = struct { data.json_path, data.json_buf[0..data.json_len], ); + package.resolution.value.github.resolved = String{}; + + const GitHubResolver = struct { + data_: ExtractData, + package_name: String, + package_name_hash: u64, + + pub fn count(this: *@This(), comptime StringBuilderType: type, builder: StringBuilderType, _: JSAst.Expr) void { + builder.count(this.data_.resolved); + } + + pub fn resolveWithPackage(this: *@This(), comptime StringBuilderType: type, builder: StringBuilderType, pkg: *Package) anyerror!Resolution { + pkg.name = this.package_name; + pkg.name_hash = this.package_name_hash; + var resolution = pkg.resolution; + resolution.value.github.resolved = builder.append(String, this.data_.resolved); + + return resolution; + } + }; + + var github = GitHubResolver{ + .data_ = data, + .package_name = package_name, + .package_name_hash = package_name_hash, + }; Lockfile.Package.parse( manager.lockfile, @@ -2974,8 +3000,8 @@ pub const PackageManager = struct { manager.allocator, manager.log, package_json_source, - void, - {}, + *GitHubResolver, + &github, Features.npm, ) catch |err| { if (comptime log_level != .silent) { @@ -2987,16 +3013,6 @@ pub const PackageManager = struct { } Global.crash(); }; - // package.json might contain a different name than already appended - package.name = package_name; - package.name_hash = package_name_hash; - // stored resolved ID from committish - var builder = manager.lockfile.stringBuilder(); - builder.count(data.resolved); - builder.allocate() catch unreachable; - package.resolution.value.github.resolved = builder.append(String, data.resolved); - builder.clamp(); - manager.lockfile.packages.set(package_id, package); if (package.dependencies.len > 0) { manager.lockfile.scratch.dependency_list_queue.writeItem(package.dependencies) catch unreachable; diff --git a/src/install/lockfile.zig b/src/install/lockfile.zig index 1568ea728..6690e1d3f 100644 --- a/src/install/lockfile.zig +++ b/src/install/lockfile.zig @@ -2806,7 +2806,15 @@ pub const Package = extern struct { if (comptime !features.is_main) { if (comptime ResolverContext != void) { - package.resolution = try resolver.resolve(*Lockfile.StringBuilder, &string_builder, json); + if (comptime std.meta.trait.is(.Pointer)(ResolverContext) and @hasDecl(std.meta.Child(ResolverContext), "resolveWithPackage")) { + package.resolution = try resolver.resolveWithPackage(*Lockfile.StringBuilder, &string_builder, package); + } else { + package.resolution = try resolver.resolve( + *Lockfile.StringBuilder, + &string_builder, + json, + ); + } } } else { package.resolution = .{ |