Changeset 29066 in webkit for trunk/JavaScriptCore/pcre/pcre_exec.cpp
- Timestamp:
- Jan 1, 2008, 11:16:06 AM (17 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/JavaScriptCore/pcre/pcre_exec.cpp
r28841 r29066 67 67 #endif 68 68 69 /* Structure for building a chain of data for holding the values of 70 the subject pointer at the start of each bracket, used to detect when 71 an empty string has been matched by a bracket to break infinite loops. */ 72 struct BracketChainNode { 73 BracketChainNode* previousBracket; 74 const UChar* bracketStart; 75 }; 76 69 77 struct MatchFrame { 70 78 ReturnLocation returnLocation; … … 76 84 const unsigned char* instructionPtr; 77 85 int offsetTop; 78 const UChar* subpatternStart;86 BracketChainNode* bracketChain; 79 87 } args; 80 88 … … 102 110 int saveOffset3; 103 111 104 const UChar* subpatternStart;112 BracketChainNode bracketChainNode; 105 113 } locals; 106 114 }; … … 314 322 } 315 323 316 inline void pushNewFrame(const unsigned char* instructionPtr, const UChar* subpatternStart, ReturnLocation returnLocation)324 inline void pushNewFrame(const unsigned char* instructionPtr, BracketChainNode* bracketChain, ReturnLocation returnLocation) 317 325 { 318 326 MatchFrame* newframe = allocateNextFrame(); … … 322 330 newframe->args.offsetTop = currentFrame->args.offsetTop; 323 331 newframe->args.instructionPtr = instructionPtr; 324 newframe->args. subpatternStart = subpatternStart;332 newframe->args.bracketChain = bracketChain; 325 333 newframe->returnLocation = returnLocation; 326 334 size++; … … 376 384 this stack. */ 377 385 378 currentFrame->locals.subpatternStart = currentFrame->args.subpatternStart; 386 currentFrame->locals.bracketChainNode.previousBracket = currentFrame->args.bracketChain; 387 currentFrame->locals.bracketChainNode.bracketStart = currentFrame->args.subjectPtr; 388 currentFrame->args.bracketChain = ¤tFrame->locals.bracketChainNode; 379 389 } 380 390 … … 426 436 stack.currentFrame->args.instructionPtr = instructionPtr; 427 437 stack.currentFrame->args.offsetTop = offsetTop; 428 stack.currentFrame->args. subpatternStart= 0;438 stack.currentFrame->args.bracketChain = 0; 429 439 startNewGroup(stack.currentFrame); 430 440 … … 462 472 DPRINTF(("start bracket 0\n")); 463 473 do { 464 RECURSIVE_MATCH_STARTNG_NEW_GROUP(2, stack.currentFrame->args.instructionPtr + 1 + LINK_SIZE, stack.currentFrame->args. subpatternStart);474 RECURSIVE_MATCH_STARTNG_NEW_GROUP(2, stack.currentFrame->args.instructionPtr + 1 + LINK_SIZE, stack.currentFrame->args.bracketChain); 465 475 if (isMatch) 466 476 RRETURN; … … 536 546 BEGIN_OPCODE(BRAZERO): { 537 547 stack.currentFrame->locals.startOfRepeatingBracket = stack.currentFrame->args.instructionPtr + 1; 538 RECURSIVE_MATCH_STARTNG_NEW_GROUP(14, stack.currentFrame->locals.startOfRepeatingBracket, stack.currentFrame->args. subpatternStart);548 RECURSIVE_MATCH_STARTNG_NEW_GROUP(14, stack.currentFrame->locals.startOfRepeatingBracket, stack.currentFrame->args.bracketChain); 539 549 if (isMatch) 540 550 RRETURN; … … 547 557 stack.currentFrame->locals.startOfRepeatingBracket = stack.currentFrame->args.instructionPtr + 1; 548 558 advanceToEndOfBracket(stack.currentFrame->locals.startOfRepeatingBracket); 549 RECURSIVE_MATCH_STARTNG_NEW_GROUP(15, stack.currentFrame->locals.startOfRepeatingBracket + 1 + LINK_SIZE, stack.currentFrame->args. subpatternStart);559 RECURSIVE_MATCH_STARTNG_NEW_GROUP(15, stack.currentFrame->locals.startOfRepeatingBracket + 1 + LINK_SIZE, stack.currentFrame->args.bracketChain); 550 560 if (isMatch) 551 561 RRETURN; … … 563 573 BEGIN_OPCODE(KETRMAX): 564 574 stack.currentFrame->locals.instructionPtrAtStartOfOnce = stack.currentFrame->args.instructionPtr - getLinkValue(stack.currentFrame->args.instructionPtr + 1); 565 stack.currentFrame->args.subpatternStart = stack.currentFrame->locals.subpatternStart; 566 stack.currentFrame->locals.subpatternStart = stack.currentFrame->previousFrame->args.subpatternStart; 575 stack.currentFrame->locals.subjectPtrAtStartOfInstruction = stack.currentFrame->args.bracketChain->bracketStart; 576 577 /* Back up the stack of bracket start pointers. */ 578 579 stack.currentFrame->args.bracketChain = stack.currentFrame->args.bracketChain->previousBracket; 567 580 568 581 if (*stack.currentFrame->locals.instructionPtrAtStartOfOnce == OP_ASSERT || *stack.currentFrame->locals.instructionPtrAtStartOfOnce == OP_ASSERT_NOT) { … … 622 635 623 636 if (*stack.currentFrame->args.instructionPtr == OP_KETRMIN) { 624 RECURSIVE_MATCH(16, stack.currentFrame->args.instructionPtr + 1 + LINK_SIZE, stack.currentFrame->args. subpatternStart);637 RECURSIVE_MATCH(16, stack.currentFrame->args.instructionPtr + 1 + LINK_SIZE, stack.currentFrame->args.bracketChain); 625 638 if (isMatch) 626 639 RRETURN; 627 RECURSIVE_MATCH_STARTNG_NEW_GROUP(17, stack.currentFrame->locals.instructionPtrAtStartOfOnce, stack.currentFrame->args. subpatternStart);640 RECURSIVE_MATCH_STARTNG_NEW_GROUP(17, stack.currentFrame->locals.instructionPtrAtStartOfOnce, stack.currentFrame->args.bracketChain); 628 641 if (isMatch) 629 642 RRETURN; 630 643 } else { /* OP_KETRMAX */ 631 RECURSIVE_MATCH_STARTNG_NEW_GROUP(18, stack.currentFrame->locals.instructionPtrAtStartOfOnce, stack.currentFrame->args. subpatternStart);644 RECURSIVE_MATCH_STARTNG_NEW_GROUP(18, stack.currentFrame->locals.instructionPtrAtStartOfOnce, stack.currentFrame->args.bracketChain); 632 645 if (isMatch) 633 646 RRETURN; 634 RECURSIVE_MATCH(19, stack.currentFrame->args.instructionPtr + 1 + LINK_SIZE, stack.currentFrame->args. subpatternStart);647 RECURSIVE_MATCH(19, stack.currentFrame->args.instructionPtr + 1 + LINK_SIZE, stack.currentFrame->args.bracketChain); 635 648 if (isMatch) 636 649 RRETURN; … … 806 819 if (minimize) { 807 820 for (stack.currentFrame->locals.fi = min;; stack.currentFrame->locals.fi++) { 808 RECURSIVE_MATCH(20, stack.currentFrame->args.instructionPtr, stack.currentFrame->args. subpatternStart);821 RECURSIVE_MATCH(20, stack.currentFrame->args.instructionPtr, stack.currentFrame->args.bracketChain); 809 822 if (isMatch) 810 823 RRETURN; … … 826 839 } 827 840 while (stack.currentFrame->args.subjectPtr >= stack.currentFrame->locals.subjectPtrAtStartOfInstruction) { 828 RECURSIVE_MATCH(21, stack.currentFrame->args.instructionPtr, stack.currentFrame->args. subpatternStart);841 RECURSIVE_MATCH(21, stack.currentFrame->args.instructionPtr, stack.currentFrame->args.bracketChain); 829 842 if (isMatch) 830 843 RRETURN; … … 901 914 if (minimize) { 902 915 for (stack.currentFrame->locals.fi = min;; stack.currentFrame->locals.fi++) { 903 RECURSIVE_MATCH(22, stack.currentFrame->args.instructionPtr, stack.currentFrame->args. subpatternStart);916 RECURSIVE_MATCH(22, stack.currentFrame->args.instructionPtr, stack.currentFrame->args.bracketChain); 904 917 if (isMatch) 905 918 RRETURN; … … 935 948 } 936 949 for (;;) { 937 RECURSIVE_MATCH(24, stack.currentFrame->args.instructionPtr, stack.currentFrame->args. subpatternStart);950 RECURSIVE_MATCH(24, stack.currentFrame->args.instructionPtr, stack.currentFrame->args.bracketChain); 938 951 if (isMatch) 939 952 RRETURN; … … 997 1010 if (minimize) { 998 1011 for (stack.currentFrame->locals.fi = min;; stack.currentFrame->locals.fi++) { 999 RECURSIVE_MATCH(26, stack.currentFrame->args.instructionPtr, stack.currentFrame->args. subpatternStart);1012 RECURSIVE_MATCH(26, stack.currentFrame->args.instructionPtr, stack.currentFrame->args.bracketChain); 1000 1013 if (isMatch) 1001 1014 RRETURN; … … 1022 1035 } 1023 1036 for(;;) { 1024 RECURSIVE_MATCH(27, stack.currentFrame->args.instructionPtr, stack.currentFrame->args. subpatternStart);1037 RECURSIVE_MATCH(27, stack.currentFrame->args.instructionPtr, stack.currentFrame->args.bracketChain); 1025 1038 if (isMatch) 1026 1039 RRETURN; … … 1134 1147 stack.currentFrame->locals.repeatOthercase = othercase; 1135 1148 for (stack.currentFrame->locals.fi = min;; stack.currentFrame->locals.fi++) { 1136 RECURSIVE_MATCH(28, stack.currentFrame->args.instructionPtr, stack.currentFrame->args. subpatternStart);1149 RECURSIVE_MATCH(28, stack.currentFrame->args.instructionPtr, stack.currentFrame->args.bracketChain); 1137 1150 if (isMatch) 1138 1151 RRETURN; … … 1154 1167 } 1155 1168 while (stack.currentFrame->args.subjectPtr >= stack.currentFrame->locals.subjectPtrAtStartOfInstruction) { 1156 RECURSIVE_MATCH(29, stack.currentFrame->args.instructionPtr, stack.currentFrame->args. subpatternStart);1169 RECURSIVE_MATCH(29, stack.currentFrame->args.instructionPtr, stack.currentFrame->args.bracketChain); 1157 1170 if (isMatch) 1158 1171 RRETURN; … … 1176 1189 if (minimize) { 1177 1190 for (stack.currentFrame->locals.fi = min;; stack.currentFrame->locals.fi++) { 1178 RECURSIVE_MATCH(30, stack.currentFrame->args.instructionPtr, stack.currentFrame->args. subpatternStart);1191 RECURSIVE_MATCH(30, stack.currentFrame->args.instructionPtr, stack.currentFrame->args.bracketChain); 1179 1192 if (isMatch) 1180 1193 RRETURN; … … 1196 1209 } 1197 1210 while (stack.currentFrame->args.subjectPtr >= stack.currentFrame->locals.subjectPtrAtStartOfInstruction) { 1198 RECURSIVE_MATCH(31, stack.currentFrame->args.instructionPtr, stack.currentFrame->args. subpatternStart);1211 RECURSIVE_MATCH(31, stack.currentFrame->args.instructionPtr, stack.currentFrame->args.bracketChain); 1199 1212 if (isMatch) 1200 1213 RRETURN; … … 1291 1304 if (minimize) { 1292 1305 for (stack.currentFrame->locals.fi = min;; stack.currentFrame->locals.fi++) { 1293 RECURSIVE_MATCH(38, stack.currentFrame->args.instructionPtr, stack.currentFrame->args. subpatternStart);1306 RECURSIVE_MATCH(38, stack.currentFrame->args.instructionPtr, stack.currentFrame->args.bracketChain); 1294 1307 if (isMatch) 1295 1308 RRETURN; … … 1319 1332 } 1320 1333 for (;;) { 1321 RECURSIVE_MATCH(40, stack.currentFrame->args.instructionPtr, stack.currentFrame->args. subpatternStart);1334 RECURSIVE_MATCH(40, stack.currentFrame->args.instructionPtr, stack.currentFrame->args.bracketChain); 1322 1335 if (isMatch) 1323 1336 RRETURN; … … 1345 1358 if (minimize) { 1346 1359 for (stack.currentFrame->locals.fi = min;; stack.currentFrame->locals.fi++) { 1347 RECURSIVE_MATCH(42, stack.currentFrame->args.instructionPtr, stack.currentFrame->args. subpatternStart);1360 RECURSIVE_MATCH(42, stack.currentFrame->args.instructionPtr, stack.currentFrame->args.bracketChain); 1348 1361 if (isMatch) 1349 1362 RRETURN; … … 1369 1382 } 1370 1383 for (;;) { 1371 RECURSIVE_MATCH(44, stack.currentFrame->args.instructionPtr, stack.currentFrame->args. subpatternStart);1384 RECURSIVE_MATCH(44, stack.currentFrame->args.instructionPtr, stack.currentFrame->args.bracketChain); 1372 1385 if (isMatch) 1373 1386 RRETURN; … … 1495 1508 if (minimize) { 1496 1509 for (stack.currentFrame->locals.fi = min;; stack.currentFrame->locals.fi++) { 1497 RECURSIVE_MATCH(48, stack.currentFrame->args.instructionPtr, stack.currentFrame->args. subpatternStart);1510 RECURSIVE_MATCH(48, stack.currentFrame->args.instructionPtr, stack.currentFrame->args.bracketChain); 1498 1511 if (isMatch) 1499 1512 RRETURN; … … 1635 1648 1636 1649 for (;;) { 1637 RECURSIVE_MATCH(52, stack.currentFrame->args.instructionPtr, stack.currentFrame->args. subpatternStart);1650 RECURSIVE_MATCH(52, stack.currentFrame->args.instructionPtr, stack.currentFrame->args.bracketChain); 1638 1651 if (isMatch) 1639 1652 RRETURN; … … 1704 1717 1705 1718 do { 1706 RECURSIVE_MATCH_STARTNG_NEW_GROUP(1, stack.currentFrame->args.instructionPtr + 1 + LINK_SIZE, stack.currentFrame->args. subpatternStart);1719 RECURSIVE_MATCH_STARTNG_NEW_GROUP(1, stack.currentFrame->args.instructionPtr + 1 + LINK_SIZE, stack.currentFrame->args.bracketChain); 1707 1720 if (isMatch) 1708 1721 RRETURN;
Note:
See TracChangeset
for help on using the changeset viewer.