mirror of
https://github.com/nushell/nushell.git
synced 2025-08-09 06:05:27 +02:00
Avoid panic when pipe a variable to a custom command which have recursive call (#12491)
# Description Fixes: #11351 And comment here is also fixed: https://github.com/nushell/nushell/issues/11351#issuecomment-1996191537 The panic can happened if we pipe a variable to a custom command which recursively called itself inside another block. TBH, I think I figure out how it works to panic, but I'm not sure if there is a potention issue if nushell don't mutate a block in such case. # User-Facing Changes Nan # Tests + Formatting Done # After Submitting Done --------- Co-authored-by: Stefan Holderbach <sholderbach@users.noreply.github.com>
This commit is contained in:
@ -1,4 +1,5 @@
|
||||
use crate::tests::{fail_test, run_test, run_test_with_env, TestResult};
|
||||
use nu_test_support::{nu, nu_repl_code};
|
||||
use std::collections::HashMap;
|
||||
|
||||
use super::run_test_contains;
|
||||
@ -818,3 +819,41 @@ fn record_missing_value() -> TestResult {
|
||||
fn def_requires_body_closure() -> TestResult {
|
||||
fail_test("def a [] (echo 4)", "expected definition body closure")
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn not_panic_with_recursive_call() {
|
||||
let result = nu!(nu_repl_code(&[
|
||||
"def px [] { if true { 3 } else { px } }",
|
||||
"let x = 1",
|
||||
"$x | px",
|
||||
]));
|
||||
assert_eq!(result.out, "3");
|
||||
|
||||
let result = nu!(nu_repl_code(&[
|
||||
"def px [n=0] { let l = $in; if $n == 0 { return false } else { $l | px ($n - 1) } }",
|
||||
"let x = 1",
|
||||
"$x | px"
|
||||
]));
|
||||
assert_eq!(result.out, "false");
|
||||
|
||||
let result = nu!(nu_repl_code(&[
|
||||
"def px [n=0] { let l = $in; if $n == 0 { return false } else { $l | px ($n - 1) } }",
|
||||
"let x = 1",
|
||||
"def foo [] { $x }",
|
||||
"foo | px"
|
||||
]));
|
||||
assert_eq!(result.out, "false");
|
||||
|
||||
let result = nu!(nu_repl_code(&[
|
||||
"def px [n=0] { let l = $in; if $n == 0 { return false } else { $l | px ($n - 1) } }",
|
||||
"let x = 1",
|
||||
"do {|| $x } | px"
|
||||
]));
|
||||
assert_eq!(result.out, "false");
|
||||
|
||||
let result = nu!(
|
||||
cwd: "tests/parsing/samples",
|
||||
"nu recursive_func_with_alias.nu"
|
||||
);
|
||||
assert!(result.status.success());
|
||||
}
|
||||
|
Reference in New Issue
Block a user