This commit is contained in:
Bahex 2025-05-08 00:04:01 +03:00 committed by GitHub
commit 90b7b89deb
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -5,8 +5,9 @@
use crate::{ use crate::{
ast::{Assignment, Block, Call, Expr, Expression, ExternalArgument}, ast::{Assignment, Block, Call, Expr, Expression, ExternalArgument},
debugger::{DebugContext, WithoutDebug}, debugger::{DebugContext, WithoutDebug},
engine::{EngineState, StateWorkingSet}, engine::{Closure, EngineState, StateWorkingSet},
eval_base::Eval, eval_base::Eval,
ir::Instruction,
record, BlockId, Config, HistoryFileFormat, PipelineData, Record, ShellError, Span, Value, record, BlockId, Config, HistoryFileFormat, PipelineData, Record, ShellError, Span, Value,
VarId, VarId,
}; };
@ -548,12 +549,41 @@ impl Eval for EvalConst {
} }
fn eval_row_condition_or_closure( fn eval_row_condition_or_closure(
_: &StateWorkingSet, state: &StateWorkingSet,
_: &mut (), _: &mut (),
_: BlockId, block_id: BlockId,
span: Span, span: Span,
) -> Result<Value, ShellError> { ) -> Result<Value, ShellError> {
Err(ShellError::NotAConstant { span }) let block = state.get_block(block_id);
let ir_block = block
.ir_block
.as_ref()
.ok_or(ShellError::NotAConstant { span })?;
let non_const_var_idx = ir_block.instructions.iter().position(|ins| {
let Instruction::LoadVariable { var_id, .. } = ins else {
return false;
};
let var = state.get_variable(*var_id);
!(var.const_val.is_some()
|| block
.span
.is_some_and(|b| b.contains_span(var.declaration_span)))
});
if let Some(idx) = non_const_var_idx {
Err(ShellError::NotAConstant {
span: ir_block.spans[idx],
})
} else {
Ok(Value::closure(
Closure {
block_id,
captures: vec![],
},
span,
))
}
} }
fn eval_overlay(_: &StateWorkingSet, span: Span) -> Result<Value, ShellError> { fn eval_overlay(_: &StateWorkingSet, span: Span) -> Result<Value, ShellError> {