Changeset 225695 in webkit for trunk/Source/JavaScriptCore/yarr/YarrInterpreter.cpp
- Timestamp:
- Dec 8, 2017, 12:32:42 PM (7 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/JavaScriptCore/yarr/YarrInterpreter.cpp
r225683 r225695 28 28 #include "YarrInterpreter.h" 29 29 30 #include "Options.h" 30 31 #include "SuperSampler.h" 31 32 #include "Yarr.h" … … 1670 1671 regexEnd(); 1671 1672 1673 #ifndef NDEBUG 1674 if (Options::dumpCompiledRegExpPatterns()) 1675 dumpDisjunction(m_bodyDisjunction.get()); 1676 #endif 1677 1672 1678 return std::make_unique<BytecodePattern>(WTFMove(m_bodyDisjunction), m_allParenthesesInfo, m_pattern, allocator, lock); 1673 1679 } … … 1829 1835 return beginTerm; 1830 1836 } 1831 1832 #ifndef NDEBUG1833 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 #endif1841 1837 1842 1838 void closeAlternative(int beginTerm) … … 2112 2108 } 2113 2109 } 2110 #ifndef NDEBUG 2111 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 else 2142 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 #endif 2114 2348 2115 2349 private: … … 2153 2387 COMPILE_ASSERT(sizeof(BackTrackInfoParentheticalAssertion) == (YarrStackSpaceForBackTrackInfoParentheticalAssertion * sizeof(uintptr_t)), CheckYarrStackSpaceForBackTrackInfoParentheticalAssertion); 2154 2388 COMPILE_ASSERT(sizeof(BackTrackInfoParenthesesOnce) == (YarrStackSpaceForBackTrackInfoParenthesesOnce * sizeof(uintptr_t)), CheckYarrStackSpaceForBackTrackInfoParenthesesOnce); 2155 COMPILE_ASSERT(sizeof(Interpreter<UChar>::BackTrackInfoParentheses) == (YarrStackSpaceForBackTrackInfoParentheses * sizeof(uintptr_t)), CheckYarrStackSpaceForBackTrackInfoParentheses);2389 COMPILE_ASSERT(sizeof(Interpreter<UChar>::BackTrackInfoParentheses) <= (YarrStackSpaceForBackTrackInfoParentheses * sizeof(uintptr_t)), CheckYarrStackSpaceForBackTrackInfoParentheses); 2156 2390 2157 2391
Note:
See TracChangeset
for help on using the changeset viewer.