2007-11-14 Eric Seidel <eric@webkit.org>
authoreric@webkit.org <eric@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 15 Nov 2007 02:00:15 +0000 (02:00 +0000)
committereric@webkit.org <eric@webkit.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 15 Nov 2007 02:00:15 +0000 (02:00 +0000)
        Reviewed by Geoff.

        Another round of PCRE cleanups: inlines

        SunSpider claims that this, combined with my previous PCRE cleanup were a 0.7% speedup, go figure.

        * pcre/pcre_compile.cpp:
        (jsRegExpCompile):
        * pcre/pcre_exec.cpp:
        (match):
        (jsRegExpExecute):
        * pcre/pcre_internal.h:
        (PUT):
        (GET):
        (PUT2):
        (GET2):
        (isNewline):

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

JavaScriptCore/ChangeLog
JavaScriptCore/pcre/pcre_compile.cpp
JavaScriptCore/pcre/pcre_exec.cpp
JavaScriptCore/pcre/pcre_internal.h

index 996e835262a802ed3f9d80497cbf2ed41bcf8bc0..e2510e8908118a1e4248f0b30cf64a772e0a1cfa 100644 (file)
@@ -1,3 +1,23 @@
+2007-11-14  Eric Seidel  <eric@webkit.org>
+
+        Reviewed by Geoff.
+
+        Another round of PCRE cleanups: inlines
+        
+        SunSpider claims that this, combined with my previous PCRE cleanup were a 0.7% speedup, go figure.
+
+        * pcre/pcre_compile.cpp:
+        (jsRegExpCompile):
+        * pcre/pcre_exec.cpp:
+        (match):
+        (jsRegExpExecute):
+        * pcre/pcre_internal.h:
+        (PUT):
+        (GET):
+        (PUT2):
+        (GET2):
+        (isNewline):
+
 2007-11-14  Eric Seidel  <eric@webkit.org>
 
         Reviewed by Sam.
index 5bb6d1aa76a5a8ab4f81ac1310c26888171dd87f..70e3aa416e3630f49d8957293c15c16ad44deb66 100644 (file)
@@ -3005,21 +3005,16 @@ static pcre* returnError(ErrorCode errorcode, const char** errorptr)
     return 0;
 }
 
-pcre *
-jsRegExpCompile(const pcre_char* pattern, int patternLength,
+pcre* jsRegExpCompile(const pcre_char* pattern, int patternLength,
                 JSRegExpIgnoreCaseOption ignoreCase, JSRegExpMultilineOption multiline,
                 unsigned* numSubpatterns, const char** errorptr)
 {
     /* We can't pass back an error message if errorptr is NULL; I guess the best we
-     can do is just return NULL, but we can set a code value if there is a code
-     pointer. */
+     can do is just return NULL, but we can set a code value if there is a code pointer. */
     if (!errorptr)
         return 0;
-    
     *errorptr = NULL;
     
-    /* Set up pointers to the individual character tables */
-    
     compile_data compile_block;
     
     ErrorCode errorcode = ERR0;
@@ -3030,8 +3025,6 @@ jsRegExpCompile(const pcre_char* pattern, int patternLength,
     if (length > MAX_PATTERN_SIZE)
         return returnError(ERR16, errorptr);
     
-    /* Compute the size of data block needed and get it. */
-    
     size_t size = length + sizeof(real_pcre);
     real_pcre* re = reinterpret_cast<real_pcre*>(new char[size]);
     
index 250705de0d89cd50fc4d0ef2bb4c44f6904772b0..f622abb3b09e74f3eebd00ffb6e8e5852d41d08b 100644 (file)
@@ -685,7 +685,7 @@ for (;;)
     /* Start of subject, or after internal newline if multiline. */
 
     BEGIN_OPCODE(CIRC):
-    if (frame->eptr != md->start_subject && (!md->multiline || !IS_NEWLINE(frame->eptr[-1])))
+    if (frame->eptr != md->start_subject && (!md->multiline || !isNewline(frame->eptr[-1])))
       RRETURN_NO_MATCH;
     frame->ecode++;
     NEXT_OPCODE;
@@ -693,7 +693,7 @@ for (;;)
     /* End of subject, or before internal newline if multiline. */
 
     BEGIN_OPCODE(DOLL):
-    if (frame->eptr < md->end_subject && (!md->multiline || !IS_NEWLINE(*frame->eptr)))
+    if (frame->eptr < md->end_subject && (!md->multiline || !isNewline(*frame->eptr)))
       RRETURN_NO_MATCH;
     frame->ecode++;
     NEXT_OPCODE;
@@ -729,7 +729,7 @@ for (;;)
     /* Match a single character type; inline for speed */
 
     BEGIN_OPCODE(ANY):
-    if (frame->eptr < md->end_subject && IS_NEWLINE(*frame->eptr))
+    if (frame->eptr < md->end_subject && isNewline(*frame->eptr))
       RRETURN_NO_MATCH;
     if (frame->eptr++ >= md->end_subject) RRETURN_NO_MATCH;
       while (frame->eptr < md->end_subject && ISMIDCHAR(*frame->eptr)) frame->eptr++;
@@ -1571,7 +1571,7 @@ for (;;)
         case OP_ANY:
         for (i = 1; i <= min; i++)
           {
-          if (frame->eptr >= md->end_subject || IS_NEWLINE(*frame->eptr))
+          if (frame->eptr >= md->end_subject || isNewline(*frame->eptr))
             RRETURN_NO_MATCH;
           ++frame->eptr;
           while (frame->eptr < md->end_subject && ISMIDCHAR(*frame->eptr)) frame->eptr++;
@@ -1664,7 +1664,7 @@ for (;;)
           switch(frame->ctype)
             {
             case OP_ANY:
-            if (IS_NEWLINE(c)) RRETURN;
+            if (isNewline(c)) RRETURN;
             break;
 
             case OP_NOT_DIGIT:
@@ -1726,7 +1726,7 @@ for (;;)
               {
               for (i = min; i < frame->max; i++)
                 {
-                if (frame->eptr >= md->end_subject || IS_NEWLINE(*frame->eptr)) break;
+                if (frame->eptr >= md->end_subject || isNewline(*frame->eptr)) break;
                 frame->eptr++;
                 while (frame->eptr < md->end_subject && (*frame->eptr & 0xc0) == 0x80) frame->eptr++;
                 }
@@ -1740,7 +1740,7 @@ for (;;)
               {
               for (i = min; i < frame->max; i++)
                 {
-                if (frame->eptr >= md->end_subject || IS_NEWLINE(*frame->eptr)) break;
+                if (frame->eptr >= md->end_subject || isNewline(*frame->eptr)) break;
                 frame->eptr++;
                 }
               break;
@@ -2159,7 +2159,7 @@ do
     {
     if (start_match > match_block.start_subject + start_offset)
       {
-      while (start_match < end_subject && !IS_NEWLINE(start_match[-1]))
+      while (start_match < end_subject && !isNewline(start_match[-1]))
         start_match++;
       }
     }
index 5f89361d6a49ea7baabf6c87ca1841372fc0b4b5..181d544a0ecd9aae6fb5ed80e173b7fc79f14d33 100644 (file)
@@ -173,43 +173,52 @@ is automated on Unix systems via the "configure" command. */
 
 #if LINK_SIZE == 2
 
-#define PUT(a,n,d)   \
-  (a[n] = (d) >> 8), \
-  (a[(n)+1] = (d) & 255)
+static inline void PUT(uschar* a, size_t n, unsigned short d)
+{
+    a[n] = d >> 8;
+    a[n+1] = d & 255;
+}
 
-#define GET(a,n) \
-  (((a)[n] << 8) | (a)[(n)+1])
+static inline short GET(const uschar* a, size_t n)
+{
+    return ((a[n] << 8) | a[n + 1]);
+}
 
 #define MAX_PATTERN_SIZE (1 << 16)
 
-
 #elif LINK_SIZE == 3
 
-#define PUT(a,n,d)       \
-  (a[n] = (d) >> 16),    \
-  (a[(n)+1] = (d) >> 8), \
-  (a[(n)+2] = (d) & 255)
+static inline void PUT(uschar* a, size_t n, unsigned d)
+{
+    a[n] = d >> 16;
+    a[n+1] = d >> 8;
+    a[n+2] = d & 255;
+}
 
-#define GET(a,n) \
-  (((a)[n] << 16) | ((a)[(n)+1] << 8) | (a)[(n)+2])
+static inline int GET(const uschar* a, size_t n)
+{
+    return ((a[n] << 16) | (a[n+1] << 8) | a[n+2]);
+}
 
 #define MAX_PATTERN_SIZE (1 << 24)
 
-
 #elif LINK_SIZE == 4
 
-#define PUT(a,n,d)        \
-  (a[n] = (d) >> 24),     \
-  (a[(n)+1] = (d) >> 16), \
-  (a[(n)+2] = (d) >> 8),  \
-  (a[(n)+3] = (d) & 255)
+static inline void PUT(uschar* a, size_t n, unsigned d)
+{
+    a[n] = d >> 24;
+    a[n+1] = d >> 16;
+    a[n+2] = d >> 8;
+    a[n+3] = d & 255;
+}
 
-#define GET(a,n) \
-  (((a)[n] << 24) | ((a)[(n)+1] << 16) | ((a)[(n)+2] << 8) | (a)[(n)+3])
+static inline int GET(const uschar* a, size_t n)
+{
+    return ((a[n] << 24) | (a[n+1] << 16) | (a[n+2] << 8) | a[n+3]);
+}
 
 #define MAX_PATTERN_SIZE (1 << 30)   /* Keep it positive */
 
-
 #else
 #error LINK_SIZE must be either 2, 3, or 4
 #endif
@@ -224,16 +233,21 @@ is automated on Unix systems via the "configure" command. */
 offsets changes. There are used for repeat counts and for other things such as
 capturing parenthesis numbers in back references. */
 
-#define PUT2(a,n,d)   \
-  a[n] = (d) >> 8; \
-  a[(n)+1] = (d) & 255
+static inline void PUT2(uschar* a, size_t n, unsigned short d)
+{
+    a[n] = d >> 8;
+    a[n+1] = d & 255;
+}
 
-#define GET2(a,n) \
-  (((a)[n] << 8) | (a)[(n)+1])
+static inline short GET2(const uschar* a, size_t n)
+{
+    return ((a[n] << 8) | a[n + 1]);
+}
 
+// FIXME: This can't be a static inline yet, because it's passed register values by some callers
+// you can't take the address of a register
 #define PUT2INC(a,n,d)  PUT2(a,n,d), a += 2
 
-
 /* When UTF-8 encoding is being used, a character is no longer just a single
 byte. The macros for character handling generate simple sequences when used in
 byte-mode, and more complicated ones for UTF-8 characters. */
@@ -592,7 +606,10 @@ extern int         _pcre_ord2utf8(int, uschar *);
 extern int         _pcre_ucp_othercase(const int);
 extern BOOL        _pcre_xclass(int, const uschar *);
 
-#define IS_NEWLINE(nl) ((nl) == 0xA || (nl) == 0xD || (nl) == 0x2028 || (nl) == 0x2029)
+static inline bool isNewline(pcre_uchar nl)
+{
+    return (nl == 0xA || nl == 0xD || nl == 0x2028 || nl == 0x2029);
+}
 
 #endif