Changeset 94468 in webkit for trunk/Source/JavaScriptCore


Ignore:
Timestamp:
Sep 2, 2011, 5:20:43 PM (14 years ago)
Author:
[email protected]
Message:

Add JSC:RegExp functional test data generator
https://bugs.webkit.org/show_bug.cgi?id=67519

Add a data generator for regular expressions. To enable, change the
#undef REGEXP_FUNC_TEST_DATA_GEN to #define. Then compile and use
regular expressions. The resulting data will be in /tmp/RegExpTestsData.

Reviewed by Gavin Barraclough.

  • runtime/RegExp.cpp:

(JSC::regExpFlags):
(JSC::RegExpFunctionalTestCollector::clearRegExp):
(JSC::RegExpFunctionalTestCollector::get):
(JSC::RegExpFunctionalTestCollector::outputOneTest):
(JSC::RegExpFunctionalTestCollector::RegExpFunctionalTestCollector):
(JSC::RegExpFunctionalTestCollector::~RegExpFunctionalTestCollector):
(JSC::RegExpFunctionalTestCollector::outputEscapedUString):
(JSC::RegExp::~RegExp):
(JSC::RegExp::compile):
(JSC::RegExp::match):
(JSC::RegExp::matchCompareWithInterpreter):

Location:
trunk/Source/JavaScriptCore
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/JavaScriptCore/ChangeLog

    r94463 r94468  
     12011-09-02  Michael Saboff  <[email protected]>
     2
     3        Add JSC:RegExp functional test data generator
     4        https://bugs.webkit.org/show_bug.cgi?id=67519
     5
     6        Add a data generator for regular expressions.  To enable, change the
     7        #undef REGEXP_FUNC_TEST_DATA_GEN to #define.  Then compile and use
     8        regular expressions.  The resulting data will be in /tmp/RegExpTestsData.
     9
     10        Reviewed by Gavin Barraclough.
     11
     12        * runtime/RegExp.cpp:
     13        (JSC::regExpFlags):
     14        (JSC::RegExpFunctionalTestCollector::clearRegExp):
     15        (JSC::RegExpFunctionalTestCollector::get):
     16        (JSC::RegExpFunctionalTestCollector::outputOneTest):
     17        (JSC::RegExpFunctionalTestCollector::RegExpFunctionalTestCollector):
     18        (JSC::RegExpFunctionalTestCollector::~RegExpFunctionalTestCollector):
     19        (JSC::RegExpFunctionalTestCollector::outputEscapedUString):
     20        (JSC::RegExp::~RegExp):
     21        (JSC::RegExp::compile):
     22        (JSC::RegExp::match):
     23        (JSC::RegExp::matchCompareWithInterpreter):
     24
    1252011-09-02  Mark Hahnenberg  <[email protected]>
    226
  • trunk/Source/JavaScriptCore/runtime/RegExp.cpp

    r94336 r94468  
    3434#include <wtf/OwnArrayPtr.h>
    3535
     36
     37#define REGEXP_FUNC_TEST_DATA_GEN 0
     38
    3639namespace JSC {
    3740
     
    6972    return flags;
    7073}
    71  
     74
     75#if REGEXP_FUNC_TEST_DATA_GEN
     76class RegExpFunctionalTestCollector {
     77    // This class is not thread safe.
     78protected:
     79    static const char* const s_fileName;
     80
     81public:
     82    static RegExpFunctionalTestCollector* get();
     83
     84    ~RegExpFunctionalTestCollector();
     85
     86    void outputOneTest(RegExp*, UString, int, int*, int);
     87    void clearRegExp(RegExp* regExp)
     88    {
     89        if (regExp == m_lastRegExp)
     90            m_lastRegExp = 0;
     91    }
     92
     93private:
     94    RegExpFunctionalTestCollector();
     95
     96    void outputEscapedUString(const UString&, bool escapeSlash = false);
     97
     98    static RegExpFunctionalTestCollector* s_instance;
     99    FILE* m_file;
     100    RegExp* m_lastRegExp;
     101};
     102
     103const char* const RegExpFunctionalTestCollector::s_fileName = "/tmp/RegExpTestsData";
     104RegExpFunctionalTestCollector* RegExpFunctionalTestCollector::s_instance = 0;
     105
     106RegExpFunctionalTestCollector* RegExpFunctionalTestCollector::get()
     107{
     108    if (!s_instance)
     109        s_instance = new RegExpFunctionalTestCollector();
     110
     111    return s_instance;
     112}
     113
     114void RegExpFunctionalTestCollector::outputOneTest(RegExp* regExp, UString s, int startOffset, int* ovector, int result)
     115{
     116    if ((!m_lastRegExp) || (m_lastRegExp != regExp)) {
     117        m_lastRegExp = regExp;
     118        fputc('/', m_file);
     119        outputEscapedUString(regExp->pattern(), true);
     120        fputc('/', m_file);
     121        if (regExp->global())
     122            fputc('g', m_file);
     123        if (regExp->ignoreCase())
     124            fputc('i', m_file);
     125        if (regExp->multiline())
     126            fputc('m', m_file);
     127        fprintf(m_file, "\n");
     128    }
     129
     130    fprintf(m_file, " \"");
     131    outputEscapedUString(s);
     132    fprintf(m_file, "\", %d, %d, (", startOffset, result);
     133    for (unsigned i = 0; i <= regExp->numSubpatterns(); i++) {
     134        int subPatternBegin = ovector[i * 2];
     135        int subPatternEnd = ovector[i * 2 + 1];
     136        if (subPatternBegin == -1)
     137            subPatternEnd = -1;
     138        fprintf(m_file, "%d, %d", subPatternBegin, subPatternEnd);
     139        if (i < regExp->numSubpatterns())
     140            fputs(", ", m_file);
     141    }
     142
     143    fprintf(m_file, ")\n");
     144    fflush(m_file);
     145}
     146
     147RegExpFunctionalTestCollector::RegExpFunctionalTestCollector()
     148{
     149    m_file = fopen(s_fileName, "r+");
     150    if  (!m_file)
     151        m_file = fopen(s_fileName, "w+");
     152
     153    fseek(m_file, 0L, SEEK_END);
     154}
     155
     156RegExpFunctionalTestCollector::~RegExpFunctionalTestCollector()
     157{
     158    fclose(m_file);
     159    s_instance = 0;
     160}
     161
     162void RegExpFunctionalTestCollector::outputEscapedUString(const UString& s, bool escapeSlash)
     163{
     164    int len = s.length();
     165   
     166    for (int i = 0; i < len; ++i) {
     167        UChar c = s[i];
     168
     169        switch (c) {
     170        case '\0':
     171            fputs("\\0", m_file);
     172            break;
     173        case '\a':
     174            fputs("\\a", m_file);
     175            break;
     176        case '\b':
     177            fputs("\\b", m_file);
     178            break;
     179        case '\f':
     180            fputs("\\f", m_file);
     181            break;
     182        case '\n':
     183            fputs("\\n", m_file);
     184            break;
     185        case '\r':
     186            fputs("\\r", m_file);
     187            break;
     188        case '\t':
     189            fputs("\\t", m_file);
     190            break;
     191        case '\v':
     192            fputs("\\v", m_file);
     193            break;
     194        case '/':
     195            if (escapeSlash)
     196                fputs("\\/", m_file);
     197            else
     198                fputs("/", m_file);
     199            break;
     200        case '\"':
     201            fputs("\\\"", m_file);
     202            break;
     203        case '\\':
     204            fputs("\\\\", m_file);
     205            break;
     206        case '\?':
     207            fputs("\?", m_file);
     208            break;
     209        default:
     210            if (c > 0x7f)
     211                fprintf(m_file, "\\u%04x", c);
     212            else
     213                fputc(c, m_file);
     214            break;
     215        }
     216    }
     217}
     218#endif
     219
    72220struct RegExpRepresentation {
    73221#if ENABLE(YARR_JIT)
     
    103251RegExp::~RegExp()
    104252{
     253#if REGEXP_FUNC_TEST_DATA_GEN
     254    RegExpFunctionalTestCollector::get()->clearRegExp(this);
     255#endif
    105256}
    106257
     
    199350        ASSERT(result >= -1);
    200351
     352#if REGEXP_FUNC_TEST_DATA_GEN
     353        RegExpFunctionalTestCollector::get()->outputOneTest(this, s, startOffset, offsetVector, result);
     354#endif
     355
    201356#if ENABLE(REGEXP_TRACING)
    202357        if (result != -1)
Note: See TracChangeset for help on using the changeset viewer.