]> git.ipfire.org Git - thirdparty/bash.git/commitdiff
Bash-4.2 patch 25
authorChet Ramey <chet.ramey@case.edu>
Mon, 7 May 2012 20:22:49 +0000 (16:22 -0400)
committerChet Ramey <chet.ramey@case.edu>
Mon, 7 May 2012 20:22:49 +0000 (16:22 -0400)
command.h
execute_cmd.c
patchlevel.h
subst.c

index 5d620468daf0477126d081c75c60072c75d6c768..fb712297f09430e6843f9c7e2bfc7c78f4f9f21e 100644 (file)
--- a/command.h
+++ b/command.h
@@ -97,6 +97,7 @@ enum command_type { cm_for, cm_case, cm_while, cm_if, cm_simple, cm_select,
 #define W_HASCTLESC    0x200000        /* word contains literal CTLESC characters */
 #define W_ASSIGNASSOC  0x400000        /* word looks like associative array assignment */
 #define W_ARRAYIND     0x800000        /* word is an array index being expanded */
+#define W_ASSNGLOBAL   0x1000000       /* word is a global assignment to declare (declare/typeset -g) */
 
 /* Possible values for subshell_environment */
 #define SUBSHELL_ASYNC 0x01    /* subshell caused by `command &' */
index 30b04601ef74560191699ceaa2fcbe26bb01db82..3f9c1507ba5e054a6e9f33a845d403fc1da29363 100644 (file)
@@ -3580,13 +3580,13 @@ fix_assignment_words (words)
 {
   WORD_LIST *w;
   struct builtin *b;
-  int assoc;
+  int assoc, global;
 
   if (words == 0)
     return;
 
   b = 0;
-  assoc = 0;
+  assoc = global = 0;
 
   for (w = words; w; w = w->next)
     if (w->word->flags & W_ASSIGNMENT)
@@ -3603,12 +3603,17 @@ fix_assignment_words (words)
 #if defined (ARRAY_VARS)
        if (assoc)
          w->word->flags |= W_ASSIGNASSOC;
+       if (global)
+         w->word->flags |= W_ASSNGLOBAL;
 #endif
       }
 #if defined (ARRAY_VARS)
     /* Note that we saw an associative array option to a builtin that takes
        assignment statements.  This is a bit of a kludge. */
-    else if (w->word->word[0] == '-' && strchr (w->word->word, 'A'))
+    else if (w->word->word[0] == '-' && (strchr (w->word->word+1, 'A') || strchr (w->word->word+1, 'g')))
+#else
+    else if (w->word->word[0] == '-' && strchr (w->word->word+1, 'g'))
+#endif
       {
        if (b == 0)
          {
@@ -3618,10 +3623,11 @@ fix_assignment_words (words)
            else if (b && (b->flags & ASSIGNMENT_BUILTIN))
              words->word->flags |= W_ASSNBLTIN;
          }
-       if (words->word->flags & W_ASSNBLTIN)
+       if ((words->word->flags & W_ASSNBLTIN) && strchr (w->word->word+1, 'A'))
          assoc = 1;
+       if ((words->word->flags & W_ASSNBLTIN) && strchr (w->word->word+1, 'g'))
+         global = 1;
       }
-#endif
 }
 
 /* Return 1 if the file found by searching $PATH for PATHNAME, defaulting
index 4f922469ec15d996aafd58dbab82180bb496fcc7..c8093cc177ea218b6a14ccdb708e16f004123c5c 100644 (file)
@@ -25,6 +25,6 @@
    regexp `^#define[   ]*PATCHLEVEL', since that's what support/mkversion.sh
    looks for to find the patch level (for the sccs version string). */
 
-#define PATCHLEVEL 24
+#define PATCHLEVEL 25
 
 #endif /* _PATCHLEVEL_H_ */
diff --git a/subst.c b/subst.c
index 9feaa9c2baac726a472a90410db271d4e1cf4cac..c9a06788f905c074710b7538a6c78a49abaa5360 100644 (file)
--- a/subst.c
+++ b/subst.c
@@ -366,6 +366,11 @@ dump_word_flags (flags)
       f &= ~W_ASSNBLTIN;
       fprintf (stderr, "W_ASSNBLTIN%s", f ? "|" : "");
     }
+  if (f & W_ASSNGLOBAL)
+    {
+      f &= ~W_ASSNGLOBAL;
+      fprintf (stderr, "W_ASSNGLOBAL%s", f ? "|" : "");
+    }
   if (f & W_COMPASSIGN)
     {
       f &= ~W_COMPASSIGN;
@@ -2803,7 +2808,7 @@ do_assignment_internal (word, expand)
     }
   else if (assign_list)
     {
-      if (word->flags & W_ASSIGNARG)
+      if ((word->flags & W_ASSIGNARG) && (word->flags & W_ASSNGLOBAL) == 0)
        aflags |= ASS_MKLOCAL;
       if (word->flags & W_ASSIGNASSOC)
        aflags |= ASS_MKASSOC;