Changeset 112454 in webkit for trunk/Source/JavaScriptCore/runtime
- Timestamp:
- Mar 28, 2012, 3:18:20 PM (13 years ago)
- Location:
- trunk/Source/JavaScriptCore/runtime
- Files:
-
- 1 added
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/JavaScriptCore/runtime/RegExp.cpp
r111889 r112454 219 219 220 220 struct RegExpRepresentation { 221 #if ENABLE(YARR_JIT)222 Yarr::YarrCodeBlock m_regExpJITCode;223 #endif224 OwnPtr<Yarr::BytecodePattern> m_regExpBytecode;225 221 }; 226 222 … … 280 276 ASSERT(m_numSubpatterns == pattern.m_numSubpatterns); 281 277 282 if (! m_representation) {278 if (!hasCode()) { 283 279 ASSERT(m_state == NotCompiled); 284 m_representation = adoptPtr(new RegExpRepresentation);285 280 globalData->regExpCache()->addToStrongCache(this); 286 281 m_state = ByteCode; … … 289 284 #if ENABLE(YARR_JIT) 290 285 if (!pattern.m_containsBackreferences && globalData->canUseJIT()) { 291 Yarr::jitCompile(pattern, charSize, globalData, m_re presentation->m_regExpJITCode);286 Yarr::jitCompile(pattern, charSize, globalData, m_regExpJITCode); 292 287 #if ENABLE(YARR_JIT_DEBUG) 293 if (!m_re presentation->m_regExpJITCode.isFallBack())288 if (!m_regExpJITCode.isFallBack()) 294 289 m_state = JITCode; 295 290 else 296 291 m_state = ByteCode; 297 292 #else 298 if (!m_re presentation->m_regExpJITCode.isFallBack()) {293 if (!m_regExpJITCode.isFallBack()) { 299 294 m_state = JITCode; 300 295 return; … … 306 301 #endif 307 302 308 m_re presentation->m_regExpBytecode = Yarr::byteCompile(pattern, &globalData->m_regExpAllocator);303 m_regExpBytecode = Yarr::byteCompile(pattern, &globalData->m_regExpAllocator); 309 304 } 310 305 311 306 void RegExp::compileIfNecessary(JSGlobalData& globalData, Yarr::YarrCharSize charSize) 312 307 { 313 // If the state is NotCompiled or ParseError, then there is no representation. 314 // If there is a representation, and the state must be either JITCode or ByteCode. 315 ASSERT(!!m_representation == (m_state == JITCode || m_state == ByteCode)); 316 317 if (m_representation) { 308 if (hasCode()) { 318 309 #if ENABLE(YARR_JIT) 319 310 if (m_state != JITCode) 320 311 return; 321 if ((charSize == Yarr::Char8) && (m_re presentation->m_regExpJITCode.has8BitCode()))322 return; 323 if ((charSize == Yarr::Char16) && (m_re presentation->m_regExpJITCode.has16BitCode()))312 if ((charSize == Yarr::Char8) && (m_regExpJITCode.has8BitCode())) 313 return; 314 if ((charSize == Yarr::Char16) && (m_regExpJITCode.has16BitCode())) 324 315 return; 325 316 #else … … 331 322 } 332 323 333 int RegExp::match(JSGlobalData& globalData, const UString& s, unsigned startOffset, Vector<int, 32> *ovector)324 int RegExp::match(JSGlobalData& globalData, const UString& s, unsigned startOffset, Vector<int, 32>& ovector) 334 325 { 335 326 #if ENABLE(REGEXP_TRACING) … … 341 332 342 333 int offsetVectorSize = (m_numSubpatterns + 1) * 2; 343 int* offsetVector; 344 Vector<int, 32> nonReturnedOvector; 345 if (ovector) { 346 ovector->resize(offsetVectorSize); 347 offsetVector = ovector->data(); 348 } else { 349 nonReturnedOvector.resize(offsetVectorSize); 350 offsetVector = nonReturnedOvector.data(); 351 } 352 ASSERT(offsetVector); 334 ovector.resize(offsetVectorSize); 335 int* offsetVector = ovector.data(); 353 336 354 337 int result; … … 356 339 if (m_state == JITCode) { 357 340 if (s.is8Bit()) 358 result = Yarr::execute(m_representation->m_regExpJITCode, s.characters8(), startOffset, s.length(), offsetVector);341 result = m_regExpJITCode.execute(s.characters8(), startOffset, s.length(), offsetVector).start; 359 342 else 360 result = Yarr::execute(m_representation->m_regExpJITCode, s.characters16(), startOffset, s.length(), offsetVector);343 result = m_regExpJITCode.execute(s.characters16(), startOffset, s.length(), offsetVector).start; 361 344 #if ENABLE(YARR_JIT_DEBUG) 362 345 matchCompareWithInterpreter(s, startOffset, offsetVector, result); … … 364 347 } else 365 348 #endif 366 result = Yarr::interpret(m_re presentation->m_regExpBytecode.get(), s, startOffset, s.length(), reinterpret_cast<unsigned*>(offsetVector));349 result = Yarr::interpret(m_regExpBytecode.get(), s, startOffset, s.length(), reinterpret_cast<unsigned*>(offsetVector)); 367 350 368 351 // FIXME: The YARR engine should handle unsigned or size_t length matches. … … 405 388 } 406 389 390 void RegExp::compileMatchOnly(JSGlobalData* globalData, Yarr::YarrCharSize charSize) 391 { 392 Yarr::YarrPattern pattern(m_patternString, ignoreCase(), multiline(), &m_constructionError); 393 if (m_constructionError) { 394 ASSERT_NOT_REACHED(); 395 m_state = ParseError; 396 return; 397 } 398 ASSERT(m_numSubpatterns == pattern.m_numSubpatterns); 399 400 if (!hasCode()) { 401 ASSERT(m_state == NotCompiled); 402 globalData->regExpCache()->addToStrongCache(this); 403 m_state = ByteCode; 404 } 405 406 #if ENABLE(YARR_JIT) 407 if (!pattern.m_containsBackreferences && globalData->canUseJIT()) { 408 Yarr::jitCompile(pattern, charSize, globalData, m_regExpJITCode, Yarr::MatchOnly); 409 #if ENABLE(YARR_JIT_DEBUG) 410 if (!m_regExpJITCode.isFallBack()) 411 m_state = JITCode; 412 else 413 m_state = ByteCode; 414 #else 415 if (!m_regExpJITCode.isFallBack()) { 416 m_state = JITCode; 417 return; 418 } 419 #endif 420 } 421 #else 422 UNUSED_PARAM(charSize); 423 #endif 424 425 m_regExpBytecode = Yarr::byteCompile(pattern, &globalData->m_regExpAllocator); 426 } 427 428 void RegExp::compileIfNecessaryMatchOnly(JSGlobalData& globalData, Yarr::YarrCharSize charSize) 429 { 430 if (hasCode()) { 431 #if ENABLE(YARR_JIT) 432 if (m_state != JITCode) 433 return; 434 if ((charSize == Yarr::Char8) && (m_regExpJITCode.has8BitCodeMatchOnly())) 435 return; 436 if ((charSize == Yarr::Char16) && (m_regExpJITCode.has16BitCodeMatchOnly())) 437 return; 438 #else 439 return; 440 #endif 441 } 442 443 compileMatchOnly(&globalData, charSize); 444 } 445 446 MatchResult RegExp::match(JSGlobalData& globalData, const UString& s, unsigned startOffset) 447 { 448 #if ENABLE(REGEXP_TRACING) 449 m_rtMatchCallCount++; 450 #endif 451 452 ASSERT(m_state != ParseError); 453 compileIfNecessaryMatchOnly(globalData, s.is8Bit() ? Yarr::Char8 : Yarr::Char16); 454 455 #if ENABLE(YARR_JIT) 456 if (m_state == JITCode) { 457 MatchResult result = s.is8Bit() ? 458 m_regExpJITCode.execute(s.characters8(), startOffset, s.length()) : 459 m_regExpJITCode.execute(s.characters16(), startOffset, s.length()); 460 #if ENABLE(REGEXP_TRACING) 461 if (!result) 462 m_rtMatchFoundCount++; 463 #endif 464 return result; 465 } 466 #endif 467 468 int offsetVectorSize = (m_numSubpatterns + 1) * 2; 469 int* offsetVector; 470 Vector<int, 32> nonReturnedOvector; 471 nonReturnedOvector.resize(offsetVectorSize); 472 offsetVector = nonReturnedOvector.data(); 473 int r = Yarr::interpret(m_regExpBytecode.get(), s, startOffset, s.length(), reinterpret_cast<unsigned*>(offsetVector)); 474 #if REGEXP_FUNC_TEST_DATA_GEN 475 RegExpFunctionalTestCollector::get()->outputOneTest(this, s, startOffset, offsetVector, result); 476 #endif 477 478 if (r >= 0) { 479 #if ENABLE(REGEXP_TRACING) 480 m_rtMatchFoundCount++; 481 #endif 482 return MatchResult(r, reinterpret_cast<unsigned*>(offsetVector)[1]); 483 } 484 485 return MatchResult::failed(); 486 } 487 407 488 void RegExp::invalidateCode() 408 489 { 409 if (! m_representation)490 if (!hasCode()) 410 491 return; 411 492 m_state = NotCompiled; 412 m_representation.clear(); 493 m_regExpJITCode.clear(); 494 m_regExpBytecode.clear(); 413 495 } 414 496 … … 429 511 interpreterOffsetVector[j] = -1; 430 512 431 interpreterResult = Yarr::interpret(m_re presentation->m_regExpBytecode.get(), s, startOffset, s.length(), interpreterOffsetVector);513 interpreterResult = Yarr::interpret(m_regExpBytecode.get(), s, startOffset, s.length(), interpreterOffsetVector); 432 514 433 515 if (jitResult != interpreterResult) … … 478 560 479 561 #if ENABLE(YARR_JIT) 480 Yarr::YarrCodeBlock& codeBlock = m_re presentation->m_regExpJITCode;562 Yarr::YarrCodeBlock& codeBlock = m_regExpJITCode; 481 563 482 564 const size_t jitAddrSize = 20; -
trunk/Source/JavaScriptCore/runtime/RegExp.h
r106189 r112454 23 23 #define RegExp_h 24 24 25 #include "ExecutableAllocator.h" 26 #include "MatchResult.h" 27 #include "RegExpKey.h" 28 #include "Structure.h" 25 29 #include "UString.h" 26 #include "ExecutableAllocator.h"27 #include "Structure.h"28 #include "RegExpKey.h"29 30 #include "yarr/Yarr.h" 30 31 #include <wtf/Forward.h> 31 32 #include <wtf/RefCounted.h> 33 34 #if ENABLE(YARR_JIT) 35 #include "yarr/YarrJIT.h" 36 #endif 32 37 33 38 namespace JSC { … … 54 59 const char* errorMessage() const { return m_constructionError; } 55 60 56 JS_EXPORT_PRIVATE int match(JSGlobalData&, const UString&, unsigned startOffset, Vector<int, 32>* ovector = 0); 61 JS_EXPORT_PRIVATE int match(JSGlobalData&, const UString&, unsigned startOffset, Vector<int, 32>& ovector); 62 MatchResult match(JSGlobalData&, const UString&, unsigned startOffset); 57 63 unsigned numSubpatterns() const { return m_numSubpatterns; } 58 64 59 65 bool hasCode() 60 66 { 61 return m_ representation;67 return m_state != NotCompiled; 62 68 } 63 69 … … 96 102 void compileIfNecessary(JSGlobalData&, Yarr::YarrCharSize); 97 103 104 void compileMatchOnly(JSGlobalData*, Yarr::YarrCharSize); 105 void compileIfNecessaryMatchOnly(JSGlobalData&, Yarr::YarrCharSize); 106 98 107 #if ENABLE(YARR_JIT_DEBUG) 99 108 void matchCompareWithInterpreter(const UString&, int startOffset, int* offsetVector, int jitResult); … … 109 118 #endif 110 119 111 OwnPtr<RegExpRepresentation> m_representation; 120 #if ENABLE(YARR_JIT) 121 Yarr::YarrCodeBlock m_regExpJITCode; 122 #endif 123 OwnPtr<Yarr::BytecodePattern> m_regExpBytecode; 112 124 }; 113 125 -
trunk/Source/JavaScriptCore/runtime/RegExpConstructor.h
r111889 r112454 56 56 static const ClassInfo s_info; 57 57 58 MatchResult performMatch(JSGlobalData&, RegExp*, JSString*, const UString&, int startOffset, int** ovector = 0); 58 MatchResult performMatch(JSGlobalData&, RegExp*, JSString*, const UString&, int startOffset, int** ovector); 59 MatchResult performMatch(JSGlobalData&, RegExp*, JSString*, const UString&, int startOffset); 59 60 60 61 void setMultiline(bool multiline) { m_multiline = multiline; } … … 103 104 ALWAYS_INLINE MatchResult RegExpConstructor::performMatch(JSGlobalData& globalData, RegExp* regExp, JSString* string, const UString& input, int startOffset, int** ovector) 104 105 { 105 int position = regExp->match(globalData, input, startOffset, &m_ovector);106 int position = regExp->match(globalData, input, startOffset, m_ovector); 106 107 107 108 if (ovector) … … 120 121 return MatchResult(position, end); 121 122 } 123 ALWAYS_INLINE MatchResult RegExpConstructor::performMatch(JSGlobalData& globalData, RegExp* regExp, JSString* string, const UString& input, int startOffset) 124 { 125 MatchResult result = regExp->match(globalData, input, startOffset); 126 if (result) 127 m_cachedResult.record(globalData, this, regExp, string, result); 128 return result; 129 } 122 130 123 131 } // namespace JSC -
trunk/Source/JavaScriptCore/runtime/RegExpMatchesArray.cpp
r111889 r112454 59 59 if (unsigned numSubpatterns = m_regExp->numSubpatterns()) { 60 60 Vector<int, 32> subpatternResults; 61 int position = m_regExp->match(exec->globalData(), m_input->value(exec), m_result.start, &subpatternResults);61 int position = m_regExp->match(exec->globalData(), m_input->value(exec), m_result.start, subpatternResults); 62 62 ASSERT_UNUSED(position, position >= 0 && static_cast<size_t>(position) == m_result.start); 63 63 ASSERT(m_result.start == static_cast<size_t>(subpatternResults[0])); -
trunk/Source/JavaScriptCore/runtime/RegExpObject.h
r111603 r112454 26 26 27 27 namespace JSC { 28 29 struct MatchResult {30 ALWAYS_INLINE MatchResult(size_t start, size_t end)31 : start(start)32 , end(end)33 {34 }35 ALWAYS_INLINE static MatchResult failed()36 {37 return MatchResult(WTF::notFound, 0);38 }39 ALWAYS_INLINE operator bool()40 {41 return start != WTF::notFound;42 }43 ALWAYS_INLINE bool empty()44 {45 return start == end;46 }47 size_t start;48 size_t end;49 };50 28 51 29 class RegExpObject : public JSNonFinalObject { -
trunk/Source/JavaScriptCore/runtime/StringPrototype.cpp
r111889 r112454 964 964 // Property Descriptor {[[Value]]: S, [[Writable]]: true, [[Enumerable]]: true, [[Configurable]]: true}, and false. 965 965 // d. Return A. 966 if ( reg->match(*globalData, input, 0) < 0)966 if (!reg->match(*globalData, input, 0)) 967 967 result->putDirectIndex(exec, 0, jsStringWithReuse(exec, thisValue, input), false); 968 968 return JSValue::encode(result); … … 975 975 // a. Call SplitMatch(S, q, R) and let z be its MatchResult result. 976 976 Vector<int, 32> ovector; 977 int mpos = reg->match(*globalData, input, matchPosition, &ovector);977 int mpos = reg->match(*globalData, input, matchPosition, ovector); 978 978 // b. If z is failure, then let q = q + 1. 979 979 if (mpos < 0)
Note:
See TracChangeset
for help on using the changeset viewer.