diff options
Diffstat (limited to 'app-shells/bash/files')
-rw-r--r-- | app-shells/bash/files/bash-5.0-assignment-preceding-builtin.patch | 83 |
1 files changed, 83 insertions, 0 deletions
diff --git a/app-shells/bash/files/bash-5.0-assignment-preceding-builtin.patch b/app-shells/bash/files/bash-5.0-assignment-preceding-builtin.patch new file mode 100644 index 000000000000..84b7fbc8b2a7 --- /dev/null +++ b/app-shells/bash/files/bash-5.0-assignment-preceding-builtin.patch @@ -0,0 +1,83 @@ +*** ../bash-5.0-patched/variables.c 2018-12-18 11:07:21.000000000 -0500 +--- variables.c 2019-03-20 10:30:56.000000000 -0400 +*************** +*** 4473,4476 **** +--- 4473,4489 ---- + var = (SHELL_VAR *)data; + ++ #if 1 /* TAG:bash-5.1 */ ++ /* Just like do_assignment_internal(). This makes assignments preceding ++ special builtins act like standalone assignment statements when in ++ posix mode, satisfying the posix requirement that this affect the ++ "current execution environment." */ ++ v = bind_variable (var->name, value_cell (var), ASS_FORCE|ASS_NOLONGJMP); ++ ++ /* If this modifies an existing local variable, v->context will be non-zero. ++ If it comes back with v->context == 0, we bound at the global context. ++ Set binding_table appropriately. It doesn't matter whether it's correct ++ if the variable is local, only that it's not global_variables->table */ ++ binding_table = v->context ? shell_variables->table : global_variables->table; ++ #else + binding_table = global_variables->table; + if (binding_table == 0) +*************** +*** 4478,4486 **** + + v = bind_variable_internal (var->name, value_cell (var), binding_table, 0, ASS_FORCE|ASS_NOLONGJMP); + + /* global variables are no longer temporary and don't need propagating. */ +! var->attributes &= ~(att_tempvar|att_propagate); + if (v) +! v->attributes |= var->attributes; + + if (find_special_var (var->name) >= 0) +--- 4491,4508 ---- + + v = bind_variable_internal (var->name, value_cell (var), binding_table, 0, ASS_FORCE|ASS_NOLONGJMP); ++ #endif + + /* global variables are no longer temporary and don't need propagating. */ +! if (binding_table == global_variables->table) +! var->attributes &= ~(att_tempvar|att_propagate); +! + if (v) +! { +! v->attributes |= var->attributes; +! v->attributes &= ~att_tempvar; /* not a temp var now */ +! #if 0 /* TAG:bash-5.1 code doesn't need this, disable for bash-5.1 */ +! v->context = (binding_table == global_variables->table) ? 0 : shell_variables->scope; +! #endif +! } + + if (find_special_var (var->name) >= 0) +*************** +*** 4576,4587 **** + { + int i; + + tempvar_list = strvec_create (HASH_ENTRIES (temporary_env) + 1); + tempvar_list[tvlist_ind = 0] = 0; +! +! hash_flush (temporary_env, pushf); +! hash_dispose (temporary_env); + temporary_env = (HASH_TABLE *)NULL; + + tempvar_list[tvlist_ind] = 0; + +--- 4598,4612 ---- + { + int i; ++ HASH_TABLE *disposer; + + tempvar_list = strvec_create (HASH_ENTRIES (temporary_env) + 1); + tempvar_list[tvlist_ind = 0] = 0; +! +! disposer = temporary_env; + temporary_env = (HASH_TABLE *)NULL; + ++ hash_flush (disposer, pushf); ++ hash_dispose (disposer); ++ + tempvar_list[tvlist_ind] = 0; + + |