This commit is contained in:
JT
2021-10-26 09:04:23 +13:00
parent f84582ca2b
commit d29208dd9e
14 changed files with 265 additions and 81 deletions

View File

@ -40,7 +40,7 @@ impl Command for Do {
let block = engine_state.get_block(block_id);
let mut stack = stack.enter_scope();
let mut stack = stack.collect_captures(&block.captures);
let params: Vec<_> = block
.signature

View File

@ -51,22 +51,22 @@ impl Command for For {
.expect("internal error: missing keyword");
let values = eval_expression(engine_state, stack, keyword_expr)?;
let block = call.positional[2]
let block_id = call.positional[2]
.as_block()
.expect("internal error: expected block");
let engine_state = engine_state.clone();
let stack = stack.enter_scope();
let block = engine_state.get_block(block_id);
let mut stack = stack.collect_captures(&block.captures);
match values {
Value::List { vals, span } => Ok(vals
.into_iter()
.map(move |x| {
let block = engine_state.get_block(block);
let mut stack = stack.clone();
stack.add_var(var_id, x);
let block = engine_state.get_block(block_id);
match eval_block(&engine_state, &mut stack, block, PipelineData::new()) {
Ok(value) => Value::List {
vals: value.collect(),
@ -79,12 +79,9 @@ impl Command for For {
Value::Range { val, span } => Ok(val
.into_range_iter()?
.map(move |x| {
let block = engine_state.get_block(block);
let mut stack = stack.enter_scope();
stack.add_var(var_id, x);
let block = engine_state.get_block(block_id);
match eval_block(&engine_state, &mut stack, block, PipelineData::new()) {
Ok(value) => Value::List {
vals: value.collect(),
@ -95,10 +92,6 @@ impl Command for For {
})
.into_pipeline_data()),
x => {
let block = engine_state.get_block(block);
let mut stack = stack.enter_scope();
stack.add_var(var_id, x);
eval_block(&engine_state, &mut stack, block, PipelineData::new())

View File

@ -44,13 +44,13 @@ impl Command for If {
Value::Bool { val, .. } => {
if val {
let block = engine_state.get_block(then_block);
let mut stack = stack.enter_scope();
let mut stack = stack.collect_captures(&block.captures);
eval_block(engine_state, &mut stack, block, input)
} else if let Some(else_case) = else_case {
if let Some(else_expr) = else_case.as_keyword() {
if let Some(block_id) = else_expr.as_block() {
let block = engine_state.get_block(block_id);
let mut stack = stack.enter_scope();
let mut stack = stack.collect_captures(&block.captures);
eval_block(engine_state, &mut stack, block, input)
} else {
eval_expression(engine_state, stack, else_expr)

View File

@ -64,7 +64,8 @@ impl Command for Each {
let numbered = call.has_flag("numbered");
let engine_state = engine_state.clone();
let stack = stack.clone();
let block = engine_state.get_block(block_id);
let mut stack = stack.collect_captures(&block.captures);
let span = call.head;
match input {
@ -74,7 +75,7 @@ impl Command for Each {
.map(move |(idx, x)| {
let block = engine_state.get_block(block_id);
let mut stack = stack.enter_scope();
let mut stack = stack.clone();
if let Some(var) = block.signature.get_positional(0) {
if let Some(var_id) = &var.var_id {
@ -112,7 +113,8 @@ impl Command for Each {
.map(move |(idx, x)| {
let block = engine_state.get_block(block_id);
let mut stack = stack.enter_scope();
let mut stack = stack.clone();
if let Some(var) = block.signature.get_positional(0) {
if let Some(var_id) = &var.var_id {
if numbered {
@ -148,7 +150,8 @@ impl Command for Each {
.map(move |(idx, x)| {
let block = engine_state.get_block(block_id);
let mut stack = stack.enter_scope();
let mut stack = stack.clone();
if let Some(var) = block.signature.get_positional(0) {
if let Some(var_id) = &var.var_id {
if numbered {
@ -186,7 +189,8 @@ impl Command for Each {
for (col, val) in cols.into_iter().zip(vals.into_iter()) {
let block = engine_state.get_block(block_id);
let mut stack = stack.enter_scope();
let mut stack = stack.clone();
if let Some(var) = block.signature.get_positional(0) {
if let Some(var_id) = &var.var_id {
stack.add_var(
@ -231,7 +235,6 @@ impl Command for Each {
PipelineData::Value(x) => {
let block = engine_state.get_block(block_id);
let mut stack = stack.enter_scope();
if let Some(var) = block.signature.get_positional(0) {
if let Some(var_id) = &var.var_id {
stack.add_var(*var_id, x);

View File

@ -29,7 +29,9 @@ impl Command for Where {
let cond = call.positional[0].clone();
let engine_state = engine_state.clone();
let mut stack = stack.enter_scope();
// FIXME: very expensive
let mut stack = stack.clone();
let (var_id, cond) = match cond {
Expression {

View File

@ -37,7 +37,7 @@ impl Command for Benchmark {
.expect("internal error: expected block");
let block = engine_state.get_block(block);
let mut stack = stack.enter_scope();
let mut stack = stack.collect_captures(&block.captures);
let start_time = Instant::now();
eval_block(engine_state, &mut stack, block, PipelineData::new())?.into_value();