From 90027ff204fcf441db6bd0076e253474631757c8 Mon Sep 17 00:00:00 2001 From: Raffaello Giulietti Date: Wed, 7 Jun 2023 21:39:53 +0000 Subject: [PATCH] 8309515: Stale cached data from Matcher.namedGroups() after Matcher.usePattern() Reviewed-by: rriggs --- .../classes/java/util/regex/Matcher.java | 1 + .../jdk/java/util/regex/NamedGroupsTests.java | 24 ++++++++++++++++++- 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/src/java.base/share/classes/java/util/regex/Matcher.java b/src/java.base/share/classes/java/util/regex/Matcher.java index 97a38a33d8c..9fd9dbdd16e 100644 --- a/src/java.base/share/classes/java/util/regex/Matcher.java +++ b/src/java.base/share/classes/java/util/regex/Matcher.java @@ -390,6 +390,7 @@ public final class Matcher implements MatchResult { if (newPattern == null) throw new IllegalArgumentException("Pattern cannot be null"); parentPattern = newPattern; + namedGroups = null; // Reallocate state storage int parentGroupCount = Math.max(newPattern.capturingGroupCount, 10); diff --git a/test/jdk/java/util/regex/NamedGroupsTests.java b/test/jdk/java/util/regex/NamedGroupsTests.java index b76d7f36963..0d639354ed6 100644 --- a/test/jdk/java/util/regex/NamedGroupsTests.java +++ b/test/jdk/java/util/regex/NamedGroupsTests.java @@ -23,7 +23,7 @@ /* * @test - * @bug 8065554 + * @bug 8065554 8309515 * @run main NamedGroupsTests */ @@ -86,6 +86,8 @@ public class NamedGroupsTests { testMatchResultStartEndGroupBeforeMatchOp(); testMatchResultStartEndGroupAfterMatchOp(); + + testMatchAfterUsePattern(); } private static void testMatchResultNoDefault() { @@ -346,4 +348,24 @@ public class NamedGroupsTests { } } + private static void testMatchAfterUsePattern() { + Pattern p1 = Pattern.compile("(?...)(?...)"); + Matcher m = p1.matcher("foobar"); + if (!m.matches()) { + throw new RuntimeException("matches() expected"); + } + if (!m.group("a").equals("foo")) { + throw new RuntimeException("\"foo\" expected for group(\"a\")"); + } + + Pattern p2 = Pattern.compile("(?...)(?...)"); + m.usePattern(p2); + if (!m.matches()) { + throw new RuntimeException("matches() expected"); + } + if (!m.group("a").equals("bar")) { + throw new RuntimeException("\"bar\" expected for group(\"a\")"); + } + } + }