Skip to content

Commit 8191b3b

Browse files
authored
fix(interpreter): resolve nameref for ${!ref[@]} key enumeration (#855)
The ArrayIndices handler in expand_word_to_string was not resolving namerefs before looking up keys, causing ${!ref[@]} to return empty when ref is a nameref to an associative array. Closes #846
1 parent b64e9fd commit 8191b3b

File tree

2 files changed

+19
-2
lines changed

2 files changed

+19
-2
lines changed

crates/bashkit/src/interpreter/mod.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5897,11 +5897,12 @@ impl Interpreter {
58975897
result.push_str(&self.expand_array_access_part(name, index));
58985898
}
58995899
WordPart::ArrayIndices(name) => {
5900-
if let Some(arr) = self.assoc_arrays.get(name) {
5900+
let resolved = self.resolve_nameref(name);
5901+
if let Some(arr) = self.assoc_arrays.get(resolved) {
59015902
let mut keys: Vec<_> = arr.keys().cloned().collect();
59025903
keys.sort();
59035904
result.push_str(&keys.join(" "));
5904-
} else if let Some(arr) = self.arrays.get(name) {
5905+
} else if let Some(arr) = self.arrays.get(resolved) {
59055906
let mut indices: Vec<_> = arr.keys().collect();
59065907
indices.sort();
59075908
let index_strs: Vec<String> =

crates/bashkit/tests/spec_cases/bash/nameref-assoc.test.sh

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,22 @@ count_entries data
8282
3
8383
### end
8484

85+
### nameref_assoc_key_enumeration_string
86+
# Nameref key enumeration via ${!ref[@]} in string context
87+
show() {
88+
local -n ref="$1"
89+
for k in "${!ref[@]}"; do
90+
echo "${k}=${ref[$k]}"
91+
done | sort
92+
}
93+
declare -A m=([a]=1 [b]=2 [c]=3)
94+
show m
95+
### expect
96+
a=1
97+
b=2
98+
c=3
99+
### end
100+
85101
### nameref_overwrite_assoc_key
86102
# Nameref overwrite existing key in associative array
87103
update() {

0 commit comments

Comments
 (0)