Changeset 225861 in webkit for trunk/Source/JavaScriptCore/yarr/YarrInterpreter.cpp
- Timestamp:
- Dec 13, 2017, 11:38:51 AM (7 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/JavaScriptCore/yarr/YarrInterpreter.cpp
r225771 r225861 28 28 #include "YarrInterpreter.h" 29 29 30 #include "Options.h"31 30 #include "SuperSampler.h" 32 31 #include "Yarr.h" … … 1671 1670 regexEnd(); 1672 1671 1673 #ifndef NDEBUG1674 if (Options::dumpCompiledRegExpPatterns())1675 dumpDisjunction(m_bodyDisjunction.get());1676 #endif1677 1678 1672 return std::make_unique<BytecodePattern>(WTFMove(m_bodyDisjunction), m_allParenthesesInfo, m_pattern, allocator, lock); 1679 1673 } … … 1835 1829 return beginTerm; 1836 1830 } 1831 1832 #ifndef NDEBUG 1833 void dumpDisjunction(ByteDisjunction* disjunction) 1834 { 1835 dataLogF("ByteDisjunction(%p):\n\t", disjunction); 1836 for (unsigned i = 0; i < disjunction->terms.size(); ++i) 1837 dataLogF("{ %d } ", disjunction->terms[i].type); 1838 dataLogF("\n"); 1839 } 1840 #endif 1837 1841 1838 1842 void closeAlternative(int beginTerm) … … 2108 2112 } 2109 2113 } 2110 #ifndef NDEBUG2111 void dumpDisjunction(ByteDisjunction* disjunction, unsigned nesting = 0)2112 {2113 PrintStream& out = WTF::dataFile();2114 2115 unsigned termIndexNest = 0;2116 2117 if (!nesting) {2118 out.printf("ByteDisjunction(%p):\n", disjunction);2119 nesting = 1;2120 } else {2121 termIndexNest = nesting - 1;2122 nesting = 2;2123 }2124 2125 auto outputTermIndexAndNest = [&](size_t index, unsigned termNesting) {2126 for (unsigned nestingDepth = 0; nestingDepth < termIndexNest; nestingDepth++)2127 out.print(" ");2128 out.printf("%4lu", index);2129 for (unsigned nestingDepth = 0; nestingDepth < termNesting; nestingDepth++)2130 out.print(" ");2131 };2132 2133 auto dumpQuantity = [&](ByteTerm& term) {2134 if (term.atom.quantityType == QuantifierFixedCount && term.atom.quantityMinCount == 1 && term.atom.quantityMaxCount == 1)2135 return;2136 2137 out.print(" {", term.atom.quantityMinCount);2138 if (term.atom.quantityMinCount != term.atom.quantityMaxCount) {2139 if (term.atom.quantityMaxCount == UINT_MAX)2140 out.print(",inf");2141 else2142 out.print(",", term.atom.quantityMaxCount);2143 }2144 out.print("}");2145 if (term.atom.quantityType == QuantifierGreedy)2146 out.print(" greedy");2147 else if (term.atom.quantityType == QuantifierNonGreedy)2148 out.print(" non-greedy");2149 };2150 2151 auto dumpCaptured = [&](ByteTerm& term) {2152 if (term.capture())2153 out.print(" captured (#", term.atom.subpatternId, ")");2154 };2155 2156 auto dumpInverted = [&](ByteTerm& term) {2157 if (term.invert())2158 out.print(" inverted");2159 };2160 2161 auto dumpInputPosition = [&](ByteTerm& term) {2162 out.printf(" inputPosition %u", term.inputPosition);2163 };2164 2165 auto dumpCharacter = [&](ByteTerm& term) {2166 out.print(" ");2167 dumpUChar32(out, term.atom.patternCharacter);2168 };2169 2170 auto dumpCharClass = [&](ByteTerm& term) {2171 out.print(" ");2172 dumpCharacterClass(out, &m_pattern, term.atom.characterClass);2173 };2174 2175 for (size_t idx = 0; idx < disjunction->terms.size(); ++idx) {2176 ByteTerm term = disjunction->terms[idx];2177 2178 bool outputNewline = true;2179 2180 switch (term.type) {2181 case ByteTerm::TypeBodyAlternativeBegin:2182 outputTermIndexAndNest(idx, nesting++);2183 out.print("BodyAlternativeBegin");2184 if (term.alternative.onceThrough)2185 out.print(" onceThrough");2186 break;2187 case ByteTerm::TypeBodyAlternativeDisjunction:2188 outputTermIndexAndNest(idx, nesting - 1);2189 out.print("BodyAlternativeDisjunction");2190 break;2191 case ByteTerm::TypeBodyAlternativeEnd:2192 outputTermIndexAndNest(idx, --nesting);2193 out.print("BodyAlternativeEnd");2194 break;2195 case ByteTerm::TypeAlternativeBegin:2196 outputTermIndexAndNest(idx, nesting++);2197 out.print("AlternativeBegin");2198 break;2199 case ByteTerm::TypeAlternativeDisjunction:2200 outputTermIndexAndNest(idx, nesting - 1);2201 out.print("AlternativeDisjunction");2202 break;2203 case ByteTerm::TypeAlternativeEnd:2204 outputTermIndexAndNest(idx, --nesting);2205 out.print("AlternativeEnd");2206 break;2207 case ByteTerm::TypeSubpatternBegin:2208 outputTermIndexAndNest(idx, nesting++);2209 out.print("SubpatternBegin");2210 break;2211 case ByteTerm::TypeSubpatternEnd:2212 outputTermIndexAndNest(idx, --nesting);2213 out.print("SubpatternEnd");2214 break;2215 case ByteTerm::TypeAssertionBOL:2216 outputTermIndexAndNest(idx, nesting);2217 out.print("AssertionBOL");2218 break;2219 case ByteTerm::TypeAssertionEOL:2220 outputTermIndexAndNest(idx, nesting);2221 out.print("AssertionEOL");2222 break;2223 case ByteTerm::TypeAssertionWordBoundary:2224 outputTermIndexAndNest(idx, nesting);2225 out.print("AssertionWordBoundary");2226 break;2227 case ByteTerm::TypePatternCharacterOnce:2228 outputTermIndexAndNest(idx, nesting);2229 out.print("PatternCharacterOnce");2230 dumpInverted(term);2231 dumpInputPosition(term);2232 dumpCharacter(term);2233 dumpQuantity(term);2234 break;2235 case ByteTerm::TypePatternCharacterFixed:2236 outputTermIndexAndNest(idx, nesting);2237 out.print("PatternCharacterFixed");2238 dumpInverted(term);2239 dumpInputPosition(term);2240 dumpCharacter(term);2241 out.print(" {", term.atom.quantityMinCount, "}");2242 break;2243 case ByteTerm::TypePatternCharacterGreedy:2244 outputTermIndexAndNest(idx, nesting);2245 out.print("PatternCharacterGreedy");2246 dumpInverted(term);2247 dumpInputPosition(term);2248 dumpCharacter(term);2249 dumpQuantity(term);2250 break;2251 case ByteTerm::TypePatternCharacterNonGreedy:2252 outputTermIndexAndNest(idx, nesting);2253 out.print("PatternCharacterNonGreedy");2254 dumpInverted(term);2255 dumpInputPosition(term);2256 dumpCharacter(term);2257 dumpQuantity(term);2258 break;2259 case ByteTerm::TypePatternCasedCharacterOnce:2260 outputTermIndexAndNest(idx, nesting);2261 out.print("PatternCasedCharacterOnce");2262 break;2263 case ByteTerm::TypePatternCasedCharacterFixed:2264 outputTermIndexAndNest(idx, nesting);2265 out.print("PatternCasedCharacterFixed");2266 break;2267 case ByteTerm::TypePatternCasedCharacterGreedy:2268 outputTermIndexAndNest(idx, nesting);2269 out.print("PatternCasedCharacterGreedy");2270 break;2271 case ByteTerm::TypePatternCasedCharacterNonGreedy:2272 outputTermIndexAndNest(idx, nesting);2273 out.print("PatternCasedCharacterNonGreedy");2274 break;2275 case ByteTerm::TypeCharacterClass:2276 outputTermIndexAndNest(idx, nesting);2277 out.print("CharacterClass");2278 dumpInverted(term);2279 dumpInputPosition(term);2280 dumpCharClass(term);2281 dumpQuantity(term);2282 break;2283 case ByteTerm::TypeBackReference:2284 outputTermIndexAndNest(idx, nesting);2285 out.print("BackReference #", term.atom.subpatternId);2286 dumpQuantity(term);2287 break;2288 case ByteTerm::TypeParenthesesSubpattern:2289 outputTermIndexAndNest(idx, nesting);2290 out.print("ParenthesesSubpattern");2291 dumpCaptured(term);2292 dumpInverted(term);2293 dumpInputPosition(term);2294 dumpQuantity(term);2295 out.print("\n");2296 outputNewline = false;2297 dumpDisjunction(term.atom.parenthesesDisjunction, nesting);2298 break;2299 case ByteTerm::TypeParenthesesSubpatternOnceBegin:2300 outputTermIndexAndNest(idx, nesting++);2301 out.print("ParenthesesSubpatternOnceBegin");2302 dumpCaptured(term);2303 dumpInverted(term);2304 dumpInputPosition(term);2305 break;2306 case ByteTerm::TypeParenthesesSubpatternOnceEnd:2307 outputTermIndexAndNest(idx, --nesting);2308 out.print("ParenthesesSubpatternOnceEnd");2309 break;2310 case ByteTerm::TypeParenthesesSubpatternTerminalBegin:2311 outputTermIndexAndNest(idx, nesting++);2312 out.print("ParenthesesSubpatternTerminalBegin");2313 dumpInverted(term);2314 dumpInputPosition(term);2315 break;2316 case ByteTerm::TypeParenthesesSubpatternTerminalEnd:2317 outputTermIndexAndNest(idx, --nesting);2318 out.print("ParenthesesSubpatternTerminalEnd");2319 break;2320 case ByteTerm::TypeParentheticalAssertionBegin:2321 outputTermIndexAndNest(idx, nesting++);2322 out.print("ParentheticalAssertionBegin");2323 dumpInverted(term);2324 dumpInputPosition(term);2325 break;2326 case ByteTerm::TypeParentheticalAssertionEnd:2327 outputTermIndexAndNest(idx, --nesting);2328 out.print("ParentheticalAssertionEnd");2329 break;2330 case ByteTerm::TypeCheckInput:2331 outputTermIndexAndNest(idx, nesting);2332 out.print("CheckInput ", term.checkInputCount);2333 break;2334 case ByteTerm::TypeUncheckInput:2335 outputTermIndexAndNest(idx, nesting);2336 out.print("UncheckInput ", term.checkInputCount);2337 break;2338 case ByteTerm::TypeDotStarEnclosure:2339 outputTermIndexAndNest(idx, nesting);2340 out.print("DotStarEnclosure");2341 break;2342 }2343 if (outputNewline)2344 out.print("\n");2345 }2346 }2347 #endif2348 2114 2349 2115 private: … … 2387 2153 COMPILE_ASSERT(sizeof(BackTrackInfoParentheticalAssertion) == (YarrStackSpaceForBackTrackInfoParentheticalAssertion * sizeof(uintptr_t)), CheckYarrStackSpaceForBackTrackInfoParentheticalAssertion); 2388 2154 COMPILE_ASSERT(sizeof(BackTrackInfoParenthesesOnce) == (YarrStackSpaceForBackTrackInfoParenthesesOnce * sizeof(uintptr_t)), CheckYarrStackSpaceForBackTrackInfoParenthesesOnce); 2389 COMPILE_ASSERT(sizeof(Interpreter<UChar>::BackTrackInfoParentheses) <= (YarrStackSpaceForBackTrackInfoParentheses * sizeof(uintptr_t)), CheckYarrStackSpaceForBackTrackInfoParentheses);2155 COMPILE_ASSERT(sizeof(Interpreter<UChar>::BackTrackInfoParentheses) == (YarrStackSpaceForBackTrackInfoParentheses * sizeof(uintptr_t)), CheckYarrStackSpaceForBackTrackInfoParentheses); 2390 2156 2391 2157
Note:
See TracChangeset
for help on using the changeset viewer.