Skip to content

Commit eb3b334

Browse files
committed
[GR-45479] Fix IndexOutOfBoundsException when reading the result of RegExp match.
PullRequest: graal/14342
2 parents c6f6e29 + 7640a80 commit eb3b334

File tree

3 files changed

+13
-4
lines changed

3 files changed

+13
-4
lines changed

regex/src/com.oracle.truffle.regex.test/src/com/oracle/truffle/regex/tregex/test/JsTests.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -227,4 +227,12 @@ public void quantifierOverflow() {
227227
test(String.format("x{%d,}", max + 1), "", "x", 0, false);
228228
expectSyntaxError(String.format("x{%d,%d}", max + 1, max), "", JsErrorMessages.QUANTIFIER_OUT_OF_ORDER);
229229
}
230+
231+
@Test
232+
public void gr45479() {
233+
// minimized test case
234+
test("\\s*(p$)?", "", "px", 0, true, 0, 0, -1, -1);
235+
// original test case
236+
test("^(\\d{1,2})[:.,;\\-]?(\\d{1,2})?[:.,;\\-]?(\\d{1,2})?[:.,;\\-]?(\\d{1,3})?[:.,;\\-]?\\s*([ap](?=[m]|^\\w|$))?", "i", "08:00:00.000 PDT", 0, true, 0, 13, 0, 2, 3, 5, 6, 8, 9, 12, -1, -1);
237+
}
230238
}

regex/src/com.oracle.truffle.regex/src/com/oracle/truffle/regex/tregex/dfa/DFAGenerator.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -438,7 +438,7 @@ private void expandState(DFAStateNodeBuilder state) {
438438
if (isGenericCG()) {
439439
transition.getTarget().incPredecessors();
440440
}
441-
if (state.isUnAnchoredFinalState() && !successorState.isFinalState()) {
441+
if (state.isUnAnchoredFinalState() && !successorState.isUnAnchoredFinalState()) {
442442
simpleCGMustCopy = true;
443443
}
444444
}

regex/src/com.oracle.truffle.regex/src/com/oracle/truffle/regex/tregex/nodes/TRegexExecNode.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -217,12 +217,13 @@ private boolean nfaProducesSameResult(VirtualFrame frame, TruffleString input, i
217217
return true;
218218
}
219219
assert !(runnerNode instanceof NFARegexSearchNode);
220-
RegexResult btResult = regressionTestRun(frame, nfaNode, input, fromIndex);
221-
if (resultsEqual(result, btResult, getNumberOfCaptureGroups())) {
220+
RegexResult nfaResult = regressionTestRun(frame, nfaNode, input, fromIndex);
221+
if (resultsEqual(result, nfaResult, getNumberOfCaptureGroups())) {
222222
return true;
223223
}
224224
Loggers.LOG_INTERNAL_ERRORS.severe(
225-
() -> String.format("Regex: %s\nInput: %s\nfromIndex: %d\nNFA executor Result: %s\nDFA Result: %s", getSource().toStringEscaped(), input, fromIndex, btResult, result));
225+
() -> String.format("Regex: %s\nInput: %s\nfromIndex: %d\nNFA executor Result: %s\nDFA Result: %s", getSource().toStringEscaped(), input, fromIndex, nfaResult,
226+
result));
226227
return false;
227228
}
228229

0 commit comments

Comments
 (0)