handle Value::Error early in some places

This commit is contained in:
Devyn Cairns 2024-07-09 04:17:42 -07:00
parent fc5faef126
commit 41654e7656

View File

@ -588,9 +588,11 @@ fn eval_instruction<D: DebugContext>(
let value = data.follow_cell_path(&path.members, *span, true)?; let value = data.follow_cell_path(&path.members, *span, true)?;
ctx.put_reg(*src_dst, value.into_pipeline_data()); ctx.put_reg(*src_dst, value.into_pipeline_data());
Ok(Continue) Ok(Continue)
} else if let PipelineData::Value(Value::Error { error, .. }, _) = path {
Err(*error)
} else { } else {
Err(ShellError::TypeMismatch { Err(ShellError::TypeMismatch {
err_message: "cell path".into(), err_message: "expected cell path".into(),
span: path.span().unwrap_or(*span), span: path.span().unwrap_or(*span),
}) })
} }
@ -603,9 +605,11 @@ fn eval_instruction<D: DebugContext>(
let value = value.follow_cell_path(&path.members, true)?; let value = value.follow_cell_path(&path.members, true)?;
ctx.put_reg(*dst, value.into_pipeline_data()); ctx.put_reg(*dst, value.into_pipeline_data());
Ok(Continue) Ok(Continue)
} else if let PipelineData::Value(Value::Error { error, .. }, _) = path {
Err(*error)
} else { } else {
Err(ShellError::TypeMismatch { Err(ShellError::TypeMismatch {
err_message: "cell path".into(), err_message: "expected cell path".into(),
span: path.span().unwrap_or(*span), span: path.span().unwrap_or(*span),
}) })
} }
@ -625,9 +629,11 @@ fn eval_instruction<D: DebugContext>(
value.upsert_data_at_cell_path(&path.members, new_value)?; value.upsert_data_at_cell_path(&path.members, new_value)?;
ctx.put_reg(*src_dst, value.into_pipeline_data_with_metadata(metadata)); ctx.put_reg(*src_dst, value.into_pipeline_data_with_metadata(metadata));
Ok(Continue) Ok(Continue)
} else if let PipelineData::Value(Value::Error { error, .. }, _) = path {
Err(*error)
} else { } else {
Err(ShellError::TypeMismatch { Err(ShellError::TypeMismatch {
err_message: "cell path".into(), err_message: "expected cell path".into(),
span: path.span().unwrap_or(*span), span: path.span().unwrap_or(*span),
}) })
} }
@ -636,11 +642,17 @@ fn eval_instruction<D: DebugContext>(
Instruction::BranchIf { cond, index } => { Instruction::BranchIf { cond, index } => {
let data = ctx.take_reg(*cond); let data = ctx.take_reg(*cond);
let data_span = data.span(); let data_span = data.span();
let PipelineData::Value(Value::Bool { val, .. }, _) = data else { let val = match data {
return Err(ShellError::TypeMismatch { PipelineData::Value(Value::Bool { val, .. }, _) => val,
err_message: "expected bool".into(), PipelineData::Value(Value::Error { error, .. }, _) => {
span: data_span.unwrap_or(*span), return Err(*error);
}); }
_ => {
return Err(ShellError::TypeMismatch {
err_message: "expected bool".into(),
span: data_span.unwrap_or(*span),
});
}
}; };
if val { if val {
Ok(Branch(*index)) Ok(Branch(*index))
@ -827,6 +839,14 @@ fn binary_op(
let lhs_val = ctx.collect_reg(lhs_dst, span)?; let lhs_val = ctx.collect_reg(lhs_dst, span)?;
let rhs_val = ctx.collect_reg(rhs, span)?; let rhs_val = ctx.collect_reg(rhs, span)?;
// Handle binary op errors early
if let Value::Error { error, .. } = lhs_val {
return Err(*error);
}
if let Value::Error { error, .. } = rhs_val {
return Err(*error);
}
// FIXME: there should be a span for both the operator and for the expr? // FIXME: there should be a span for both the operator and for the expr?
let op_span = span; let op_span = span;
@ -1061,6 +1081,8 @@ fn gather_arguments(
Argument::Spread { vals, .. } => { Argument::Spread { vals, .. } => {
if let Value::List { vals, .. } = vals { if let Value::List { vals, .. } = vals {
rest.extend(vals); rest.extend(vals);
} else if let Value::Error { error, .. } = vals {
return Err(*error);
} else { } else {
return Err(ShellError::CannotSpreadAsList { span: vals.span() }); return Err(ShellError::CannotSpreadAsList { span: vals.span() });
} }