Changeset 94468 in webkit for trunk/Source/JavaScriptCore
- Timestamp:
- Sep 2, 2011, 5:20:43 PM (14 years ago)
- Location:
- trunk/Source/JavaScriptCore
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/JavaScriptCore/ChangeLog
r94463 r94468 1 2011-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 1 25 2011-09-02 Mark Hahnenberg <[email protected]> 2 26 -
trunk/Source/JavaScriptCore/runtime/RegExp.cpp
r94336 r94468 34 34 #include <wtf/OwnArrayPtr.h> 35 35 36 37 #define REGEXP_FUNC_TEST_DATA_GEN 0 38 36 39 namespace JSC { 37 40 … … 69 72 return flags; 70 73 } 71 74 75 #if REGEXP_FUNC_TEST_DATA_GEN 76 class RegExpFunctionalTestCollector { 77 // This class is not thread safe. 78 protected: 79 static const char* const s_fileName; 80 81 public: 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 93 private: 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 103 const char* const RegExpFunctionalTestCollector::s_fileName = "/tmp/RegExpTestsData"; 104 RegExpFunctionalTestCollector* RegExpFunctionalTestCollector::s_instance = 0; 105 106 RegExpFunctionalTestCollector* RegExpFunctionalTestCollector::get() 107 { 108 if (!s_instance) 109 s_instance = new RegExpFunctionalTestCollector(); 110 111 return s_instance; 112 } 113 114 void 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 147 RegExpFunctionalTestCollector::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 156 RegExpFunctionalTestCollector::~RegExpFunctionalTestCollector() 157 { 158 fclose(m_file); 159 s_instance = 0; 160 } 161 162 void 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 72 220 struct RegExpRepresentation { 73 221 #if ENABLE(YARR_JIT) … … 103 251 RegExp::~RegExp() 104 252 { 253 #if REGEXP_FUNC_TEST_DATA_GEN 254 RegExpFunctionalTestCollector::get()->clearRegExp(this); 255 #endif 105 256 } 106 257 … … 199 350 ASSERT(result >= -1); 200 351 352 #if REGEXP_FUNC_TEST_DATA_GEN 353 RegExpFunctionalTestCollector::get()->outputOneTest(this, s, startOffset, offsetVector, result); 354 #endif 355 201 356 #if ENABLE(REGEXP_TRACING) 202 357 if (result != -1)
Note:
See TracChangeset
for help on using the changeset viewer.