Optimize Clone for BoundKind and VM GetField
This commit reduces unnecessary cloning for fields like `addr`, `kind`, and `field` within `BoundKind` and `VM::GetField`. This improves performance by avoiding redundant memory allocations.
This commit is contained in:
@@ -239,11 +239,11 @@ impl<P: CompilerPhase> Clone for BoundKind<P> {
|
||||
match self {
|
||||
BoundKind::Nop => BoundKind::Nop,
|
||||
BoundKind::Constant(v) => BoundKind::Constant(v.clone()),
|
||||
BoundKind::Get { addr, name } => BoundKind::Get { addr: addr.clone(), name: name.clone() },
|
||||
BoundKind::Set { addr, value } => BoundKind::Set { addr: addr.clone(), value: value.clone() },
|
||||
BoundKind::Define { name, addr, kind, value, captured_by } => BoundKind::Define { name: name.clone(), addr: addr.clone(), kind: *kind, value: value.clone(), captured_by: captured_by.clone() },
|
||||
BoundKind::FieldAccessor(k) => BoundKind::FieldAccessor(k.clone()),
|
||||
BoundKind::GetField { rec, field } => BoundKind::GetField { rec: rec.clone(), field: field.clone() },
|
||||
BoundKind::Get { addr, name } => BoundKind::Get { addr: *addr, name: name.clone() },
|
||||
BoundKind::Set { addr, value } => BoundKind::Set { addr: *addr, value: value.clone() },
|
||||
BoundKind::Define { name, addr, kind, value, captured_by } => BoundKind::Define { name: name.clone(), addr: *addr, kind: *kind, value: value.clone(), captured_by: captured_by.clone() },
|
||||
BoundKind::FieldAccessor(k) => BoundKind::FieldAccessor(*k),
|
||||
BoundKind::GetField { rec, field } => BoundKind::GetField { rec: rec.clone(), field: *field },
|
||||
BoundKind::If { cond, then_br, else_br } => BoundKind::If { cond: cond.clone(), then_br: then_br.clone(), else_br: else_br.clone() },
|
||||
BoundKind::Destructure { pattern, value } => BoundKind::Destructure { pattern: pattern.clone(), value: value.clone() },
|
||||
BoundKind::Lambda { params, upvalues, body, positional_count } => BoundKind::Lambda { params: params.clone(), upvalues: upvalues.clone(), body: body.clone(), positional_count: *positional_count },
|
||||
|
||||
+4
-5
@@ -352,7 +352,7 @@ impl VM {
|
||||
}
|
||||
BoundKind::Get { addr, .. } => self.get_value(*addr),
|
||||
|
||||
BoundKind::FieldAccessor(k) => Ok(Value::FieldAccessor(k.clone())),
|
||||
BoundKind::FieldAccessor(k) => Ok(Value::FieldAccessor(*k)),
|
||||
|
||||
BoundKind::GetField { rec, field } => {
|
||||
let rec_val = self.eval_internal(obs, rec)?;
|
||||
@@ -372,16 +372,15 @@ impl VM {
|
||||
{
|
||||
if let Some(field_series) = record_series.field(*field) {
|
||||
let view =
|
||||
crate::ast::rtl::series::SeriesView::new(field_series, field.clone());
|
||||
return Ok(Value::Object(std::rc::Rc::new(view)));
|
||||
} else {
|
||||
crate::ast::rtl::series::SeriesView::new(field_series, *field);
|
||||
return Ok(Value::Object(std::rc::Rc::new(view))); } else {
|
||||
return Err(format!(
|
||||
"RecordSeries does not have field :{}",
|
||||
field.name()
|
||||
));
|
||||
}
|
||||
} else if let Some(sn) = obj.as_any().downcast_ref::<crate::ast::rtl::streams::StreamNode>() {
|
||||
let mapped = crate::ast::rtl::streams::build_map_stream(sn.inner.clone(), field.clone());
|
||||
let mapped = crate::ast::rtl::streams::build_map_stream(sn.inner.clone(), *field);
|
||||
return Ok(Value::Object(Rc::new(mapped)));
|
||||
}
|
||||
Err(format!(
|
||||
|
||||
Reference in New Issue
Block a user