1
0
Fork 0
mirror of https://github.com/denoland/deno.git synced 2024-12-18 13:22:55 -05:00

chore: reduce allocations in a few places (#27288)

Probably doesn't have much impact. I didn't measure any of these, but
reducing allocations should always be good.
This commit is contained in:
David Sherret 2024-12-09 19:28:53 -05:00 committed by GitHub
parent 1c0f236923
commit d99b2d6f7d
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
7 changed files with 54 additions and 26 deletions

14
Cargo.lock generated
View file

@ -668,6 +668,15 @@ version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1bf2a5fb3207c12b5d208ebc145f967fea5cac41a021c37417ccc31ba40f39ee" checksum = "1bf2a5fb3207c12b5d208ebc145f967fea5cac41a021c37417ccc31ba40f39ee"
[[package]]
name = "capacity_builder"
version = "0.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a2c0f637033edd76ceb881faaee372868a383f0ed7a4a59e8fdf90db2502f3d3"
dependencies = [
"itoa",
]
[[package]] [[package]]
name = "caseless" name = "caseless"
version = "0.2.1" version = "0.2.1"
@ -2088,6 +2097,7 @@ dependencies = [
name = "deno_permissions" name = "deno_permissions"
version = "0.41.0" version = "0.41.0"
dependencies = [ dependencies = [
"capacity_builder",
"deno_core", "deno_core",
"deno_path_util", "deno_path_util",
"deno_terminal 0.2.0", "deno_terminal 0.2.0",
@ -4375,9 +4385,9 @@ dependencies = [
[[package]] [[package]]
name = "itoa" name = "itoa"
version = "1.0.11" version = "1.0.14"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" checksum = "d75a2a4b1b190afb6f5425f10f6a8f959d2ea0b9c2b1d79553551850539e4674"
[[package]] [[package]]
name = "jni-sys" name = "jni-sys"

View file

@ -108,6 +108,7 @@ boxed_error = "0.2.2"
brotli = "6.0.0" brotli = "6.0.0"
bytes = "1.4.0" bytes = "1.4.0"
cache_control = "=0.2.0" cache_control = "=0.2.0"
capacity_builder = "0.1.0"
cbc = { version = "=0.1.2", features = ["alloc"] } cbc = { version = "=0.1.2", features = ["alloc"] }
# Note: Do not use the "clock" feature of chrono, as it links us to CoreFoundation on macOS. # Note: Do not use the "clock" feature of chrono, as it links us to CoreFoundation on macOS.
# Instead use util::time::utc_now() # Instead use util::time::utc_now()

View file

@ -1,6 +1,7 @@
// Copyright 2018-2024 the Deno authors. All rights reserved. MIT license. // Copyright 2018-2024 the Deno authors. All rights reserved. MIT license.
use std::borrow::Cow; use std::borrow::Cow;
use std::fmt::Write;
use std::path::Path; use std::path::Path;
use std::path::PathBuf; use std::path::PathBuf;
@ -58,8 +59,8 @@ pub fn get_atomic_file_path(file_path: &Path) -> PathBuf {
} }
fn gen_rand_path_component() -> String { fn gen_rand_path_component() -> String {
(0..4).fold(String::new(), |mut output, _| { (0..4).fold(String::with_capacity(8), |mut output, _| {
output.push_str(&format!("{:02x}", rand::random::<u8>())); write!(&mut output, "{:02x}", rand::random::<u8>()).unwrap();
output output
}) })
} }

View file

@ -1,5 +1,6 @@
// Copyright 2018-2024 the Deno authors. All rights reserved. MIT license. // Copyright 2018-2024 the Deno authors. All rights reserved. MIT license.
use std::fmt::Write;
use std::sync::atomic::AtomicUsize; use std::sync::atomic::AtomicUsize;
use std::sync::atomic::Ordering; use std::sync::atomic::Ordering;
use std::time::Duration; use std::time::Duration;
@ -81,12 +82,14 @@ impl ProgressBarRenderer for BarProgressBarRenderer {
let elapsed_text = get_elapsed_text(data.duration); let elapsed_text = get_elapsed_text(data.duration);
let mut text = String::new(); let mut text = String::new();
if !display_entry.message.is_empty() { if !display_entry.message.is_empty() {
text.push_str(&format!( writeln!(
"{} {}{}\n", &mut text,
"{} {}{}",
colors::green("Download"), colors::green("Download"),
display_entry.message, display_entry.message,
bytes_text, bytes_text,
)); )
.unwrap();
} }
text.push_str(&elapsed_text); text.push_str(&elapsed_text);
let max_width = (data.terminal_width as i32 - 5).clamp(10, 75) as usize; let max_width = (data.terminal_width as i32 - 5).clamp(10, 75) as usize;

View file

@ -219,8 +219,9 @@ fn get_atomic_dir_path(file_path: &Path) -> PathBuf {
} }
fn gen_rand_path_component() -> String { fn gen_rand_path_component() -> String {
(0..4).fold(String::new(), |mut output, _| { use std::fmt::Write;
output.push_str(&format!("{:02x}", rand::random::<u8>())); (0..4).fold(String::with_capacity(8), |mut output, _| {
write!(&mut output, "{:02x}", rand::random::<u8>()).unwrap();
output output
}) })
} }

View file

@ -14,6 +14,7 @@ name = "deno_permissions"
path = "lib.rs" path = "lib.rs"
[dependencies] [dependencies]
capacity_builder.workspace = true
deno_core.workspace = true deno_core.workspace = true
deno_path_util.workspace = true deno_path_util.workspace = true
deno_terminal.workspace = true deno_terminal.workspace = true

View file

@ -1,5 +1,6 @@
// Copyright 2018-2024 the Deno authors. All rights reserved. MIT license. // Copyright 2018-2024 the Deno authors. All rights reserved. MIT license.
use capacity_builder::StringBuilder;
use deno_core::parking_lot::Mutex; use deno_core::parking_lot::Mutex;
use deno_core::serde::de; use deno_core::serde::de;
use deno_core::serde::Deserialize; use deno_core::serde::Deserialize;
@ -179,13 +180,18 @@ impl PermissionState {
(Ok(()), false, false) (Ok(()), false, false)
} }
PermissionState::Prompt if prompt => { PermissionState::Prompt if prompt => {
let msg = format!( let msg = {
"{} access{}", let info = info();
name, StringBuilder::build(|builder| {
info() builder.append(name);
.map(|info| { format!(" to {info}") }) builder.append(" access");
.unwrap_or_default(), if let Some(info) = &info {
); builder.append(" to ");
builder.append(info);
}
})
.unwrap()
};
match permission_prompt(&msg, name, api_name, true) { match permission_prompt(&msg, name, api_name, true) {
PromptResponse::Allow => { PromptResponse::Allow => {
Self::log_perm_access(name, info); Self::log_perm_access(name, info);
@ -344,11 +350,11 @@ pub trait QueryDescriptor: Debug {
fn overlaps_deny(&self, other: &Self::DenyDesc) -> bool; fn overlaps_deny(&self, other: &Self::DenyDesc) -> bool;
} }
fn format_display_name(display_name: Cow<str>) -> String { fn format_display_name(display_name: Cow<str>) -> Cow<str> {
if display_name.starts_with('<') && display_name.ends_with('>') { if display_name.starts_with('<') && display_name.ends_with('>') {
display_name.into_owned() display_name
} else { } else {
format!("\"{}\"", display_name) Cow::Owned(format!("\"{}\"", display_name))
} }
} }
@ -424,7 +430,7 @@ impl<TQuery: QueryDescriptor> UnaryPermission<TQuery> {
.check2( .check2(
TQuery::flag_name(), TQuery::flag_name(),
api_name, api_name,
|| desc.map(|d| format_display_name(d.display_name())), || desc.map(|d| format_display_name(d.display_name()).into_owned()),
self.prompt, self.prompt,
); );
if prompted { if prompted {
@ -487,12 +493,17 @@ impl<TQuery: QueryDescriptor> UnaryPermission<TQuery> {
if !self.prompt { if !self.prompt {
return PermissionState::Denied; return PermissionState::Denied;
} }
let mut message = String::with_capacity(40); let maybe_formatted_display_name =
message.push_str(&format!("{} access", TQuery::flag_name())); desc.map(|d| format_display_name(d.display_name()));
if let Some(desc) = desc { let message = StringBuilder::build(|builder| {
message builder.append(TQuery::flag_name());
.push_str(&format!(" to {}", format_display_name(desc.display_name()))); builder.append(" access");
} if let Some(display_name) = &maybe_formatted_display_name {
builder.append(" to ");
builder.append(display_name)
}
})
.unwrap();
match permission_prompt( match permission_prompt(
&message, &message,
TQuery::flag_name(), TQuery::flag_name(),