Ignore:
Timestamp:
Jun 11, 2018, 9:32:21 AM (7 years ago)
Author:
[email protected]
Message:

Test js/regexp-zero-length-alternatives.html fails when RegExpJIT is disabled
https://bugs.webkit.org/show_bug.cgi?id=186477

Reviewed by Filip Pizlo.

Fixed bug where we were using the wrong frame size for TypeParenthesesSubpatternTerminalBegin
YARR interpreter nodes. This caused us to overwrite other frame information.

Added frame offset debugging code to YARR interpreter.

  • yarr/YarrInterpreter.cpp:

(JSC::Yarr::ByteCompiler::emitDisjunction):
(JSC::Yarr::ByteCompiler::dumpDisjunction):

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/JavaScriptCore/yarr/YarrInterpreter.cpp

    r229125 r232718  
    20662066                        ASSERT(currentCountAlreadyChecked >= term.inputPosition);
    20672067                        unsigned delegateEndInputOffset = currentCountAlreadyChecked - term.inputPosition;
    2068                         atomParenthesesTerminalBegin(term.parentheses.subpatternId, term.capture(), disjunctionAlreadyCheckedCount + delegateEndInputOffset, term.frameLocation, term.frameLocation + YarrStackSpaceForBackTrackInfoParenthesesOnce);
     2068                        atomParenthesesTerminalBegin(term.parentheses.subpatternId, term.capture(), disjunctionAlreadyCheckedCount + delegateEndInputOffset, term.frameLocation, term.frameLocation + YarrStackSpaceForBackTrackInfoParenthesesTerminal);
    20692069                        emitDisjunction(term.parentheses.disjunction, currentCountAlreadyChecked, disjunctionAlreadyCheckedCount);
    20702070                        atomParenthesesTerminalEnd(delegateEndInputOffset, term.frameLocation, term.quantityMinCount, term.quantityMaxCount, term.quantityType);
     
    21632163        };
    21642164
     2165        auto dumpFrameLocation = [&](ByteTerm& term) {
     2166            out.printf(" frameLocation %u", term.frameLocation);
     2167        };
     2168       
    21652169        auto dumpCharacter = [&](ByteTerm& term) {
    21662170            out.print(" ");
     
    21842188                if (term.alternative.onceThrough)
    21852189                    out.print(" onceThrough");
     2190                dumpFrameLocation(term);
    21862191                break;
    21872192            case ByteTerm::TypeBodyAlternativeDisjunction:
    21882193                outputTermIndexAndNest(idx, nesting - 1);
    21892194                out.print("BodyAlternativeDisjunction");
     2195                dumpFrameLocation(term);
    21902196                break;
    21912197            case ByteTerm::TypeBodyAlternativeEnd:
    21922198                outputTermIndexAndNest(idx, --nesting);
    21932199                out.print("BodyAlternativeEnd");
     2200                dumpFrameLocation(term);
    21942201                break;
    21952202            case ByteTerm::TypeAlternativeBegin:
    21962203                outputTermIndexAndNest(idx, nesting++);
    21972204                out.print("AlternativeBegin");
     2205                dumpFrameLocation(term);
    21982206                break;
    21992207            case ByteTerm::TypeAlternativeDisjunction:
    22002208                outputTermIndexAndNest(idx, nesting - 1);
    22012209                out.print("AlternativeDisjunction");
     2210                dumpFrameLocation(term);
    22022211                break;
    22032212            case ByteTerm::TypeAlternativeEnd:
    22042213                outputTermIndexAndNest(idx, --nesting);
    22052214                out.print("AlternativeEnd");
     2215                dumpFrameLocation(term);
    22062216                break;
    22072217            case ByteTerm::TypeSubpatternBegin:
     
    22302240                dumpInverted(term);
    22312241                dumpInputPosition(term);
     2242                dumpFrameLocation(term);
    22322243                dumpCharacter(term);
    22332244                dumpQuantity(term);
     
    22382249                dumpInverted(term);
    22392250                dumpInputPosition(term);
     2251                dumpFrameLocation(term);
    22402252                dumpCharacter(term);
    22412253                out.print(" {", term.atom.quantityMinCount, "}");
     
    22462258                dumpInverted(term);
    22472259                dumpInputPosition(term);
     2260                dumpFrameLocation(term);
    22482261                dumpCharacter(term);
    22492262                dumpQuantity(term);
     
    22542267                dumpInverted(term);
    22552268                dumpInputPosition(term);
     2269                dumpFrameLocation(term);
    22562270                dumpCharacter(term);
    22572271                dumpQuantity(term);
     
    22782292                dumpInverted(term);
    22792293                dumpInputPosition(term);
     2294                dumpFrameLocation(term);
    22802295                dumpCharClass(term);
    22812296                dumpQuantity(term);
     
    22922307                dumpInverted(term);
    22932308                dumpInputPosition(term);
     2309                dumpFrameLocation(term);
    22942310                dumpQuantity(term);
    22952311                out.print("\n");
     
    23032319                dumpInverted(term);
    23042320                dumpInputPosition(term);
     2321                dumpFrameLocation(term);
    23052322                break;
    23062323            case ByteTerm::TypeParenthesesSubpatternOnceEnd:
    23072324                outputTermIndexAndNest(idx, --nesting);
    23082325                out.print("ParenthesesSubpatternOnceEnd");
     2326                dumpFrameLocation(term);
    23092327                break;
    23102328            case ByteTerm::TypeParenthesesSubpatternTerminalBegin:
     
    23132331                dumpInverted(term);
    23142332                dumpInputPosition(term);
     2333                dumpFrameLocation(term);
    23152334                break;
    23162335            case ByteTerm::TypeParenthesesSubpatternTerminalEnd:
    23172336                outputTermIndexAndNest(idx, --nesting);
    23182337                out.print("ParenthesesSubpatternTerminalEnd");
     2338                dumpFrameLocation(term);
    23192339                break;
    23202340            case ByteTerm::TypeParentheticalAssertionBegin:
     
    23232343                dumpInverted(term);
    23242344                dumpInputPosition(term);
     2345                dumpFrameLocation(term);
    23252346                break;
    23262347            case ByteTerm::TypeParentheticalAssertionEnd:
    23272348                outputTermIndexAndNest(idx, --nesting);
    23282349                out.print("ParentheticalAssertionEnd");
     2350                dumpFrameLocation(term);
    23292351                break;
    23302352            case ByteTerm::TypeCheckInput:
Note: See TracChangeset for help on using the changeset viewer.