Reviewed by Geoff.
authorthatcher <thatcher@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 31 Aug 2006 21:28:29 +0000 (21:28 +0000)
committerthatcher <thatcher@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 31 Aug 2006 21:28:29 +0000 (21:28 +0000)
        Band-aid fix for PCRE to compile for ppc64 and x86_64 now that
        we use -Wshorten-64-to-32. Adds an INT_CAST macro that ASSERTs
        the value <= INT_MAX.

        I filed <rdar://problem/4712064> to track the need to verify
        PCRE's 64-bit compliance.

        * pcre/pcre_compile.c:
        (complete_callout):
        (compile_branch):
        (compile_regex):
        (pcre_compile2):
        * pcre/pcre_exec.c:
        (match):
        (pcre_exec):
        * pcre/pcre_get.c:
        (pcre_get_substring_list):
        * pcre/pcre_internal.h:
        * pcre/pcre_tables.c:
        * pcre/pcre_try_flipped.c:
        (_pcre_try_flipped):

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@16155 268f45cc-cd09-0410-ab3c-d52691b4dbfc

JavaScriptCore/ChangeLog
JavaScriptCore/pcre/pcre_compile.c
JavaScriptCore/pcre/pcre_exec.c
JavaScriptCore/pcre/pcre_get.c
JavaScriptCore/pcre/pcre_internal.h
JavaScriptCore/pcre/pcre_tables.c
JavaScriptCore/pcre/pcre_try_flipped.c

index 0b5151f7cdc3c4f8e93cde72ea0c467083632c65..07d6dfab812c53e303ab21a5da2f8dfe8bd6de3f 100644 (file)
@@ -1,3 +1,29 @@
+2006-08-31  Timothy Hatcher  <timothy@apple.com>
+
+        Reviewed by Geoff.
+
+        Band-aid fix for PCRE to compile for ppc64 and x86_64 now that
+        we use -Wshorten-64-to-32. Adds an INT_CAST macro that ASSERTs
+        the value <= INT_MAX.
+
+        I filed <rdar://problem/4712064> to track the need to verify
+        PCRE's 64-bit compliance.
+
+        * pcre/pcre_compile.c:
+        (complete_callout):
+        (compile_branch):
+        (compile_regex):
+        (pcre_compile2):
+        * pcre/pcre_exec.c:
+        (match):
+        (pcre_exec):
+        * pcre/pcre_get.c:
+        (pcre_get_substring_list):
+        * pcre/pcre_internal.h:
+        * pcre/pcre_tables.c:
+        * pcre/pcre_try_flipped.c:
+        (_pcre_try_flipped):
+
 2006-08-30  Darin Adler  <darin@apple.com>
 
         Reviewed by Tim Hatcher.
index 11d7aeb9b5364ec24bedbd0b02e8d485ce4fe9d7..79781f78d95005baaaf6557f608868cad9155c3f 100644 (file)
@@ -1488,7 +1488,7 @@ Returns:             nothing
 static void
 complete_callout(uschar *previous_callout, const pcre_uchar *ptr, compile_data *cd)
 {
-int length = ptr - cd->start_pattern - GET(previous_callout, 2);
+int length = INT_CAST(ptr - cd->start_pattern - GET(previous_callout, 2));
 PUT(previous_callout, 2 + LINK_SIZE, length);
 }
 
@@ -1845,7 +1845,7 @@ for (;; ptr++)
           check_posix_syntax(ptr, &tempptr, cd))
         {
         BOOL local_negate = FALSE;
-        int posix_class, i;
+        int posix_class, i, namelen;
         register const uschar *cbits = cd->cbits;
 
         if (ptr[1] != ':')
@@ -1861,7 +1861,8 @@ for (;; ptr++)
           ptr++;
           }
 
-        posix_class = check_posix_name(ptr, tempptr - ptr);
+        namelen = INT_CAST(tempptr - ptr);
+        posix_class = check_posix_name(ptr, namelen);
         if (posix_class < 0)
           {
           *errorcodeptr = ERR30;
@@ -2275,7 +2276,7 @@ for (;; ptr++)
 
       else
         {
-        int len = class_utf8data - (code + 33);
+        int len = INT_CAST(class_utf8data - (code + 33));
         memmove(code + 1, code + 33, len);
         code += len + 1;
         }
@@ -2404,7 +2405,7 @@ for (;; ptr++)
         {
         uschar *lastchar = code - 1;
         while((*lastchar & 0xc0) == 0x80) lastchar--;
-        c = code - lastchar;            /* Length of UTF-8 character */
+        c = INT_CAST(code - lastchar);            /* Length of UTF-8 character */
         memcpy(utf8_char, lastchar, c); /* Save the char */
         c |= 0x80;                      /* Flag c as a length */
         }
@@ -2617,7 +2618,7 @@ for (;; ptr++)
       {
       register int i;
       int ketoffset = 0;
-      int len = code - previous;
+      int len = INT_CAST(code - previous);
       uschar *bralink = NULL;
 
       /* If the maximum repeat count is unlimited, find the end of the bracket
@@ -2630,7 +2631,7 @@ for (;; ptr++)
         {
         register uschar *ket = previous;
         do ket += GET(ket, 1); while (*ket != OP_KET);
-        ketoffset = code - ket;
+        ketoffset = INT_CAST(code - ket);
         }
 
       /* The case of a zero minimum is special because of the need to stick
@@ -2676,7 +2677,7 @@ for (;; ptr++)
 
         else
           {
-          int offset;
+          int offset, tmpoffset;
           *code = OP_END;
           adjust_recurse(previous, 2 + LINK_SIZE, utf8, cd);
           memmove(previous + 2 + LINK_SIZE, previous, len);
@@ -2687,7 +2688,8 @@ for (;; ptr++)
           /* We chain together the bracket offset fields that have to be
           filled in later when the ends of the brackets are reached. */
 
-          offset = (bralink == NULL)? 0 : previous - bralink;
+          tmpoffset = INT_CAST(previous - bralink);
+          offset = (bralink == NULL)? 0 : tmpoffset;
           bralink = previous;
           PUTINC(previous, 0, offset);
           }
@@ -2731,9 +2733,10 @@ for (;; ptr++)
 
           if (i != 0)
             {
-            int offset;
+            int offset, tmpoffset;
             *code++ = OP_BRA;
-            offset = (bralink == NULL)? 0 : code - bralink;
+            tmpoffset = INT_CAST(code - bralink);
+            offset = (bralink == NULL)? 0 : tmpoffset;
             bralink = code;
             PUTINC(code, 0, offset);
             }
@@ -2748,7 +2751,7 @@ for (;; ptr++)
         while (bralink != NULL)
           {
           int oldlinkoffset;
-          int offset = code - bralink + 1;
+          int offset = INT_CAST(code - bralink + 1);
           uschar *bra = code - offset;
           oldlinkoffset = GET(bra, 1);
           bralink = (oldlinkoffset == 0)? NULL : bralink - oldlinkoffset;
@@ -2782,7 +2785,7 @@ for (;; ptr++)
 
     if (possessive_quantifier)
       {
-      int len = code - tempcode;
+      int len = INT_CAST(code - tempcode);
       memmove(tempcode + 1+LINK_SIZE, tempcode, len);
       code += 1 + LINK_SIZE;
       len += 1 + LINK_SIZE;
@@ -2930,7 +2933,7 @@ for (;; ptr++)
           name = ++ptr;           /* grumble at autoincrement in declaration */
 
           while (*ptr++ != '>');
-          namelen = ptr - name - 1;
+          namelen = INT_CAST(ptr - name - 1);
 
           /* FIXME: This won't work for UTF-16. */
           for (i = 0; i < cd->names_found; i++)
@@ -2969,7 +2972,7 @@ for (;; ptr++)
           uschar *slot = cd->name_table;
 
           while (*ptr != ')') ptr++;
-          namelen = ptr - name;
+          namelen = INT_CAST(ptr - name);
 
           for (i = 0; i < cd->names_found; i++)
             {
@@ -3586,7 +3589,7 @@ for (;;)
 
   if (*ptr != '|')
     {
-    int length = code - last_branch;
+    int length = INT_CAST(code - last_branch);
     do
       {
       int prev_length = GET(last_branch, 1);
@@ -4579,7 +4582,7 @@ while ((c = *(++ptr)) != 0)
             goto PCRE_ERROR_RETURN;
             }
           name_count++;
-          if (ptr - p > max_name_size) max_name_size = (ptr - p);
+          if (ptr - p > max_name_size) max_name_size = INT_CAST(ptr - p);
           break;
           }
 
@@ -4954,8 +4957,8 @@ pointer. NULL is used for the default character tables. The nullpad field is at
 the end; it's there to help in the case when a regex compiled on a system with
 4-byte pointers is run on another with 8-byte pointers. */
 
-re->magic_number = MAGIC_NUMBER;
-re->size = size;
+re->magic_number = (pcre_uint32)MAGIC_NUMBER;
+re->size = (pcre_uint32)size;
 re->options = options;
 re->dummy1 = 0;
 re->name_table_offset = sizeof(real_pcre);
@@ -5016,7 +5019,7 @@ if (errorcode != 0)
   {
   (pcre_free)(re);
   PCRE_ERROR_RETURN:
-  *erroroffset = ptr - (const pcre_uchar *)pattern;
+  *erroroffset = INT_CAST(ptr - (const pcre_uchar *)pattern);
   PCRE_EARLY_ERROR_RETURN:
   *errorptr = error_texts[errorcode];
   if (errorcodeptr != NULL) *errorcodeptr = errorcode;
index 52c0373e202677344c58fb84d6d8a5f3f4125644..ae2df284a5384b1a8d55f5a6d19798c97921b822 100644 (file)
@@ -590,7 +590,7 @@ for (;;)
       save_capture_last = md->capture_last;
 
       DPRINTF(("saving %d %d %d\n", save_offset1, save_offset2, save_offset3));
-      md->offset_vector[md->offset_end - number] = eptr - md->start_subject;
+      md->offset_vector[md->offset_end - number] = INT_CAST(eptr - md->start_subject);
 
       do
         {
@@ -809,9 +809,9 @@ for (;;)
       cb.callout_number   = ecode[1];
       cb.offset_vector    = md->offset_vector;
       cb.subject          = (const pcre_char *)md->start_subject;
-      cb.subject_length   = md->end_subject - md->start_subject;
-      cb.start_match      = md->start_match - md->start_subject;
-      cb.current_position = eptr - md->start_subject;
+      cb.subject_length   = INT_CAST(md->end_subject - md->start_subject);
+      cb.start_match      = INT_CAST(md->start_match - md->start_subject);
+      cb.current_position = INT_CAST(eptr - md->start_subject);
       cb.pattern_position = GET(ecode, 2);
       cb.next_item_length = GET(ecode, 2 + LINK_SIZE);
       cb.capture_top      = offset_top/2;
@@ -1076,7 +1076,7 @@ for (;;)
             {
             md->offset_vector[offset] =
               md->offset_vector[md->offset_end - number];
-            md->offset_vector[offset+1] = eptr - md->start_subject;
+            md->offset_vector[offset+1] = INT_CAST(eptr - md->start_subject);
             if (offset_top <= offset) offset_top = offset + 2;
             }
 
@@ -1418,6 +1418,7 @@ for (;;)
 
     case OP_REF:
       {
+      int tmplen;
       offset = GET2(ecode, 1) << 1;               /* Doubled ref number */
       ecode += 3;                                 /* Advance past item */
 
@@ -1426,8 +1427,9 @@ for (;;)
       can't just fail here, because of the possibility of quantifiers with zero
       minima. */
 
+      tmplen = INT_CAST(md->end_subject - eptr + 1);
       length = (offset >= offset_top || md->offset_vector[offset] < 0)?
-        md->end_subject - eptr + 1 :
+        tmplen :
         md->offset_vector[offset+1] - md->offset_vector[offset];
 
       /* Set up for repetition, or handle the non-repeated case */
@@ -3069,7 +3071,7 @@ for (;;)
             else
               {
               c = max - min;
-              if (c > md->end_subject - eptr) c = md->end_subject - eptr;
+              if (c > md->end_subject - eptr) c = INT_CAST(md->end_subject - eptr);
               eptr += c;
               }
             }
@@ -3079,7 +3081,7 @@ for (;;)
 
           case OP_ANYBYTE:
           c = max - min;
-          if (c > md->end_subject - eptr) c = md->end_subject - eptr;
+          if (c > md->end_subject - eptr) c = INT_CAST(md->end_subject - eptr);
           eptr += c;
           break;
 
@@ -3184,7 +3186,7 @@ for (;;)
 
           case OP_ANYBYTE:
           c = max - min;
-          if (c > md->end_subject - eptr) c = md->end_subject - eptr;
+          if (c > md->end_subject - eptr) c = INT_CAST(md->end_subject - eptr);
           eptr += c;
           break;
 
@@ -3413,7 +3415,7 @@ tables = external_re->tables;
 
 if (extra_data != NULL)
   {
-  register unsigned int flags = extra_data->flags;
+  register unsigned long flags = extra_data->flags;
   if ((flags & PCRE_EXTRA_STUDY_DATA) != 0)
     study = (const pcre_study_data *)extra_data->study_data;
   if ((flags & PCRE_EXTRA_MATCH_LIMIT) != 0)
@@ -3772,8 +3774,8 @@ do
 
   if (offsetcount < 2) rc = 0; else
     {
-    offsets[0] = start_match - match_block.start_subject;
-    offsets[1] = match_block.end_match_ptr - match_block.start_subject;
+    offsets[0] = INT_CAST(start_match - match_block.start_subject);
+    offsets[1] = INT_CAST(match_block.end_match_ptr - match_block.start_subject);
     }
 
   DPRINTF((">>>> returning %d\n", rc));
index bddcdfd292815d6e38b84092b184fa7324a92808..660a7f7abc785d8a74b2b5af791629614fc8561e 100644 (file)
@@ -208,13 +208,14 @@ pcre_get_substring_list(const pcre_char *subject, int *ovector, int stringcount,
   const pcre_char ***listptr)
 {
 int i;
-int size = sizeof(char *);
+int size = (int)sizeof(char *);
 int double_count = stringcount * 2;
 pcre_char **stringlist;
 pcre_char *p;
 
-for (i = 0; i < double_count; i += 2)
-  size += sizeof(pcre_char *) + (ovector[i+1] - ovector[i] + 1) * sizeof(pcre_char);
+for (i = 0; i < double_count; i += 2) {
+  size += INT_CAST(sizeof(pcre_char *) + (ovector[i+1] - ovector[i] + 1) * sizeof(pcre_char));
+}
 
 stringlist = (pcre_char **)(pcre_malloc)(size);
 if (stringlist == NULL) return PCRE_ERROR_NOMEMORY;
index ff46a27950d68b63fe2a88481786be9bd17f32ff..c59ba6ffc357bce3ce8d90068bc0f95e135afeee 100644 (file)
@@ -39,6 +39,12 @@ POSSIBILITY OF SUCH DAMAGE.
 -----------------------------------------------------------------------------
 */
 
+#include "Assertions.h"
+
+// Added to prevent 64-to-32 shortening warnings when compiling for 64-bit
+// <rdar://problem/4712064> PCRE generates many warnings with -Wshorten-64-to-32
+#define INT_CAST(i) (int)(i); ASSERT((i) <= INT_MAX)
+
 /* This header contains definitions that are shared between the different
 modules, but which are not relevant to the exported API. This includes some
 functions whose names all begin with "_pcre_". */
index 63195102eb68de7ff00a62aec68df408a115810e..64dec56ce32ed700b7d18af0a2c1882c0a331298 100644 (file)
@@ -62,7 +62,7 @@ character. */
 const int _pcre_utf8_table1[] =
   { 0x7f, 0x7ff, 0xffff, 0x1fffff, 0x3ffffff, 0x7fffffff};
 
-const int _pcre_utf8_table1_size = sizeof(_pcre_utf8_table1)/sizeof(int);
+const int _pcre_utf8_table1_size = (int)(sizeof(_pcre_utf8_table1)/sizeof(int));
 
 /* These are the indicator bits and the mask for the data bits to set in the
 first byte of a character, indexed by the number of additional bytes. */
@@ -124,7 +124,7 @@ const ucp_type_table _pcre_utt[] = {
   { "Zs", ucp_Zs }
 };
 
-const int _pcre_utt_size = sizeof(_pcre_utt)/sizeof(ucp_type_table);
+const int _pcre_utt_size = (int)(sizeof(_pcre_utt)/sizeof(ucp_type_table));
 
 #include "chartables.c"
 
index a07bb23db0610bd46996e6b9a4a46e25da873539..d8a159fb95c45724cab8c2ad0b95b162a848d4e6 100644 (file)
@@ -98,32 +98,32 @@ EXPORT real_pcre *
 _pcre_try_flipped(const real_pcre *re, real_pcre *internal_re,
   const pcre_study_data *study, pcre_study_data *internal_study)
 {
-if (byteflip(re->magic_number, sizeof(re->magic_number)) != MAGIC_NUMBER)
+if (byteflip(re->magic_number, (int)sizeof(re->magic_number)) != MAGIC_NUMBER)
   return NULL;
 
 *internal_re = *re;           /* To copy other fields */
-internal_re->size = byteflip(re->size, sizeof(re->size));
-internal_re->options = byteflip(re->options, sizeof(re->options));
+internal_re->size = (pcre_uint32)byteflip(re->size, (int)sizeof(re->size));
+internal_re->options = (pcre_uint32)byteflip(re->options, (int)sizeof(re->options));
 internal_re->top_bracket =
-  (pcre_uint16)byteflip(re->top_bracket, sizeof(re->top_bracket));
+  (pcre_uint16)byteflip(re->top_bracket, (int)sizeof(re->top_bracket));
 internal_re->top_backref =
-  (pcre_uint16)byteflip(re->top_backref, sizeof(re->top_backref));
+  (pcre_uint16)byteflip(re->top_backref, (int)sizeof(re->top_backref));
 internal_re->first_byte =
-  (pcre_uint16)byteflip(re->first_byte, sizeof(re->first_byte));
+  (pcre_uint16)byteflip(re->first_byte, (int)sizeof(re->first_byte));
 internal_re->req_byte =
-  (pcre_uint16)byteflip(re->req_byte, sizeof(re->req_byte));
+  (pcre_uint16)byteflip(re->req_byte, (int)sizeof(re->req_byte));
 internal_re->name_table_offset =
-  (pcre_uint16)byteflip(re->name_table_offset, sizeof(re->name_table_offset));
+  (pcre_uint16)byteflip(re->name_table_offset, (int)sizeof(re->name_table_offset));
 internal_re->name_entry_size =
-  (pcre_uint16)byteflip(re->name_entry_size, sizeof(re->name_entry_size));
+  (pcre_uint16)byteflip(re->name_entry_size, (int)sizeof(re->name_entry_size));
 internal_re->name_count =
-  (pcre_uint16)byteflip(re->name_count, sizeof(re->name_count));
+  (pcre_uint16)byteflip(re->name_count, (int)sizeof(re->name_count));
 
 if (study != NULL)
   {
   *internal_study = *study;   /* To copy other fields */
-  internal_study->size = byteflip(study->size, sizeof(study->size));
-  internal_study->options = byteflip(study->options, sizeof(study->options));
+  internal_study->size = (pcre_uint32)byteflip(study->size, (int)sizeof(study->size));
+  internal_study->options = (pcre_uint32)byteflip(study->options, (int)sizeof(study->options));
   }
 
 return internal_re;