perl 3.0 patch #8 patch 7 continued
[p5sagit/p5-mst-13.2.git] / dolist.c
index 05e61a3..4823231 100644 (file)
--- a/dolist.c
+++ b/dolist.c
@@ -1,4 +1,4 @@
-/* $Header: dolist.c,v 3.0.1.2 89/11/11 04:28:17 lwall Locked $
+/* $Header: dolist.c,v 3.0.1.4 89/12/21 19:58:46 lwall Locked $
  *
  *    Copyright (c) 1989, Larry Wall
  *
@@ -6,6 +6,13 @@
  *    as specified in the README file that comes with the perl 3.0 kit.
  *
  * $Log:       dolist.c,v $
+ * Revision 3.0.1.4  89/12/21  19:58:46  lwall
+ * patch7: grep(1,@array) didn't work
+ * patch7: /$pat/; //; wrongly freed runtime pattern twice
+ * 
+ * Revision 3.0.1.3  89/11/17  15:14:45  lwall
+ * patch5: grep() occasionally loses arguments or dumps core
+ * 
  * Revision 3.0.1.2  89/11/11  04:28:17  lwall
  * patch2: non-existent slice values are now undefined rather than null
  * 
@@ -78,7 +85,8 @@ int *arglast;
        if (!*spat->spat_regexp->precomp && lastspat)
            spat = lastspat;
        if (spat->spat_flags & SPAT_KEEP) {
-           arg_free(spat->spat_runtime);       /* it won't change, so */
+           if (spat->spat_runtime)
+               arg_free(spat->spat_runtime);   /* it won't change, so */
            spat->spat_runtime = Nullarg;       /* no point compiling again */
        }
        if (!spat->spat_regexp->nparens)
@@ -719,21 +727,25 @@ int gimme;
 int *arglast;
 {
     STR **st = stack->ary_array;
-    register STR **dst = &st[arglast[1]];
-    register STR **src = dst + 1;
+    register int dst = arglast[1];
+    register int src = dst + 1;
     register int sp = arglast[2];
     register int i = sp - arglast[1];
     int oldsave = savestack->ary_fill;
 
     savesptr(&stab_val(defstab));
-    if ((arg[1].arg_type & A_MASK) != A_EXPR)
+    if ((arg[1].arg_type & A_MASK) != A_EXPR) {
+       arg[1].arg_type &= A_MASK;
        dehoist(arg,1);
+       arg[1].arg_type |= A_DONT;
+    }
     arg = arg[1].arg_ptr.arg_arg;
     while (i-- > 0) {
-       stab_val(defstab) = *src;
+       stab_val(defstab) = st[src];
        (void)eval(arg,G_SCALAR,sp);
+       st = stack->ary_array;
        if (str_true(st[sp+1]))
-           *dst++ = *src;
+           st[dst++] = st[src];
        src++;
     }
     restorelist(oldsave);
@@ -743,7 +755,7 @@ int *arglast;
        st[arglast[0]+1] = str;
        return arglast[0]+1;
     }
-    return arglast[0] + (dst - &st[arglast[1]]);
+    return arglast[0] + (dst - arglast[1]);
 }
 
 int