Document CVf_UNIQUE flag better
[p5sagit/p5-mst-13.2.git] / pp_pack.c
index 7d7bd32..834e723 100644 (file)
--- a/pp_pack.c
+++ b/pp_pack.c
@@ -513,7 +513,9 @@ Perl_unpack_str(pTHX_ char *pat, register char *patend, register char *s, char *
 /*
 =for apidoc unpackstring
 
-The engine implementing unpack() Perl function.
+The engine implementing unpack() Perl function. C<unpackstring> puts the
+extracted list items on the stack and returns the number of elements.
+Issue C<PUTBACK> before and C<SPAGAIN> after the call to this function.
 
 =cut */
 
@@ -1705,8 +1707,7 @@ S_unpack_rec(pTHX_ register tempsym_t* symptr, register char *s, char *strbeg, c
 PP(pp_unpack)
 {
     dSP;
-    SV *right = (MAXARG > 1) ? POPs : GvSV(PL_defgv);
-    SV *left = POPs;
+    dPOPPOPssrl;
     I32 gimme = GIMME_V;
     STRLEN llen;
     STRLEN rlen;
@@ -2428,11 +2429,17 @@ S_pack_rec(pTHX_ SV *cat, register tempsym_t* symptr, register SV **beglist, SV
                       given 10**(NV_MAX_10_EXP+1) == 128 ** x solve for x:
                       x = (NV_MAX_10_EXP+1) * log (10) / log (128)
                       And with that many bytes only Inf can overflow.
+                      Some C compilers are strict about integral constant
+                      expressions so we conservatively divide by a slightly
+                      smaller integer instead of multiplying by the exact
+                      floating-point value.
                    */
 #ifdef NV_MAX_10_EXP
-                   char   buf[1 + (int)((NV_MAX_10_EXP + 1) * 0.47456)];
+/*                 char   buf[1 + (int)((NV_MAX_10_EXP + 1) * 0.47456)]; -- invalid C */
+                   char   buf[1 + (int)((NV_MAX_10_EXP + 1) / 2)]; /* valid C */
 #else
-                   char   buf[1 + (int)((308 + 1) * 0.47456)];
+/*                 char   buf[1 + (int)((308 + 1) * 0.47456)]; -- invalid C */
+                   char   buf[1 + (int)((308 + 1) / 2)]; /* valid C */
 #endif
                    char  *in = buf + sizeof(buf);