You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
gentoo-overlay/app-shells/bash/files/bash-5.0-assignment-precedi...

84 lines
2.7 KiB

*** ../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;