summaryrefslogtreecommitdiff
path: root/app-shells/bash/files/bash-5.0-assignment-preceding-builtin.patch
blob: 84b7fbc8b2a729a42c541ef09dbbf843ffee8a59 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
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;