Skip to content

Commit

Permalink
Apply assignment to regular built-in
Browse files Browse the repository at this point in the history
  • Loading branch information
magicant committed Oct 17, 2021
1 parent e127ccf commit 3bc72b5
Show file tree
Hide file tree
Showing 2 changed files with 50 additions and 8 deletions.
46 changes: 39 additions & 7 deletions yash-semantics/src/command_impl/simple_command.rs
Original file line number Diff line number Diff line change
Expand Up @@ -255,14 +255,31 @@ async fn execute_builtin(
let mut env = RedirEnv::new(env);
perform_redirs(&mut env, redirs).await?;

match perform_assignments(env.deref_mut(), assigns, Scope::Global, false).await {
Ok(()) => (),
Err(error) => return error.handle(&mut env).await,
}
use yash_env::builtin::Type::*;
match builtin.r#type {
Special => {
match perform_assignments(env.deref_mut(), assigns, Scope::Global, false).await {
Ok(()) => (),
Err(error) => return error.handle(&mut env).await,
}

let (exit_status, abort) = (builtin.execute)(&mut env, fields).await;
env.exit_status = exit_status;
abort
let (exit_status, abort) = (builtin.execute)(&mut env, fields).await;
env.exit_status = exit_status;
abort
}

Intrinsic | NonIntrinsic => {
let mut env = env.push_variable_context(ContextType::Volatile);
match perform_assignments(env.deref_mut(), assigns, Scope::Volatile, true).await {
Ok(()) => (),
Err(error) => return error.handle(&mut env).await,
}

let (exit_status, abort) = (builtin.execute)(&mut env, fields).await;
env.exit_status = exit_status;
abort
}
}
}

async fn execute_function(
Expand Down Expand Up @@ -491,6 +508,21 @@ mod tests {
assert!(!v.is_exported);
}

#[test]
fn simple_command_assigns_temporarily_for_regular_builtin() {
let system = VirtualSystem::new();
let state = Rc::clone(&system.state);
let mut env = Env::with_system(Box::new(system));
env.builtins.insert("local", local_builtin());
let command: syntax::SimpleCommand = "v=42 local v".parse().unwrap();
block_on(command.execute(&mut env));
assert_eq!(env.variables.get("v"), None);

let state = state.borrow();
let file = state.file_system.get("/dev/stdout").unwrap().borrow();
assert_eq!(file.content, "v=42\n".as_bytes());
}

#[test]
fn simple_command_returns_exit_status_from_function() {
use yash_env::function::HashEntry;
Expand Down
12 changes: 11 additions & 1 deletion yash-semantics/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -198,7 +198,17 @@ pub(crate) mod tests {
unimplemented!("assignment error: {:?}", error);
}
} else {
// TODO print variable definition
let name = value;
if let Some(var) = env.variables.get(&name) {
if let Scalar(value) = &var.value {
let line = format!("{}={}\n", name, value);
if let Err(errno) =
env.system.write_all(Fd::STDOUT, line.as_bytes()).await
{
unimplemented!("write error: {:?}", errno);
}
}
}
}
}
(ExitStatus::SUCCESS, Continue(()))
Expand Down

0 comments on commit 3bc72b5

Please sign in to comment.