From 15b4c4f31850da7927b7cbc8a5dcd5a551c7eac1 Mon Sep 17 00:00:00 2001 From: Daniel Falbel Date: Fri, 15 Nov 2024 12:38:18 -0300 Subject: [PATCH] Avoid computing the size of child objects when inspecting variables --- crates/ark/src/variables/variable.rs | 30 +++++++++++++++------------- 1 file changed, 16 insertions(+), 14 deletions(-) diff --git a/crates/ark/src/variables/variable.rs b/crates/ark/src/variables/variable.rs index f7a078b3d..14c13dabb 100644 --- a/crates/ark/src/variables/variable.rs +++ b/crates/ark/src/variables/variable.rs @@ -541,7 +541,7 @@ impl PositronVariable { BindingValue::Active { .. } => Self::from_active_binding(display_name), BindingValue::Promise { promise } => Self::from_promise(display_name, promise.sexp), BindingValue::Altrep { object, .. } | BindingValue::Standard { object, .. } => { - Self::from(display_name.clone(), display_name, object.sexp) + Self::from(display_name.clone(), display_name, object.sexp, true) }, } } @@ -549,7 +549,7 @@ impl PositronVariable { /** * Create a new Variable from an R object */ - fn from(access_key: String, display_name: String, x: SEXP) -> Self { + fn from(access_key: String, display_name: String, x: SEXP, compute_size: bool) -> Self { let WorkspaceVariableDisplayValue { display_value, is_truncated, @@ -560,14 +560,16 @@ impl PositronVariable { } = WorkspaceVariableDisplayType::from(x, true); let kind = Self::variable_kind(x); - - let size = match RObject::view(x).size() { - Ok(size) => size as i64, - Err(err) => { - log::warn!("Can't compute size of object: {err}"); - 0 - }, - }; + let mut size = 0; + if compute_size { + size = match RObject::view(x).size() { + Ok(size) => size as i64, + Err(err) => { + log::warn!("Can't compute size of object: {err}"); + 0 + }, + }; + } Self { var: Variable { @@ -1126,7 +1128,7 @@ impl PositronVariable { .map(|(i, value)| { let (_, display_name) = truncate_chars(names.get_unchecked(i as isize), MAX_DISPLAY_VALUE_LENGTH); - Self::from(i.to_string(), display_name, value).var() + Self::from(i.to_string(), display_name, value, false).var() }) .collect(); @@ -1298,7 +1300,7 @@ impl PositronVariable { String::from(RSymbol::new_unchecked(tag)) }; - out.push(Self::from(i.to_string(), display_name, CAR(pairlist)).var()); + out.push(Self::from(i.to_string(), display_name, CAR(pairlist), false).var()); pairlist = CDR(pairlist); i = i + 1; @@ -1412,7 +1414,7 @@ impl PositronVariable { let slot_symbol = r_symbol!(display_name); let slot: RObject = harp::try_catch(|| R_do_slot(value, slot_symbol).into())?; let access_key = display_name.clone(); - out.push(PositronVariable::from(access_key, display_name, slot.sexp).var()); + out.push(PositronVariable::from(access_key, display_name, slot.sexp, false).var()); } } @@ -1487,7 +1489,7 @@ impl PositronVariable { let access_key = format!("custom-{i}-{name_len}-{access_name}"); let display_name = name.clone().unwrap_or(format!("[[{}]]", i + 1)); - Self::from(access_key, display_name, x).var() + Self::from(access_key, display_name, x, false).var() }) .collect();