--- old/src/java.base/share/classes/java/util/regex/Pattern.java 2018-01-12 12:09:16.128107944 -0800 +++ new/src/java.base/share/classes/java/util/regex/Pattern.java 2018-01-12 12:09:15.605060679 -0800 @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999, 2017, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 1999, 2018, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -954,6 +954,12 @@ private int flags; /** + * The temporary pattern flags used during compiling. The flags might be turn + * on and off by embedded flag. + */ + private transient int flags0; + + /** * Boolean indicating this Pattern is compiled; this is necessary in order * to lazily compile deserialized Patterns. */ @@ -1137,7 +1143,7 @@ * @return The match flags specified when this pattern was compiled */ public int flags() { - return flags; + return flags0; } /** @@ -1369,6 +1375,9 @@ // Read in all fields s.defaultReadObject(); + // reset the flags + flags0 = flags; + // Initialize counts capturingGroupCount = 1; localCount = 0; @@ -1400,6 +1409,9 @@ if ((flags & UNICODE_CHARACTER_CLASS) != 0) flags |= UNICODE_CASE; + // 'flags' for compiling + flags0 = flags; + // Reset group index count capturingGroupCount = 1; localCount = 0; @@ -1841,7 +1853,7 @@ * Indicates whether a particular flag is set or not. */ private boolean has(int f) { - return (flags & f) != 0; + return (flags0 & f) != 0; } /** @@ -2718,7 +2730,7 @@ ch == 0x53 || ch == 0x73 || //S and s ch == 0x4b || ch == 0x6b || //K and k ch == 0xc5 || ch == 0xe5))) { //A+ring - bits.add(ch, flags()); + bits.add(ch, flags0); return null; } return single(ch); @@ -2931,7 +2943,7 @@ boolean capturingGroup = false; Node head = null; Node tail = null; - int save = flags; + int save = flags0; int saveTCNCount = topClosureNodes.size(); root = null; int ch = next(); @@ -3032,7 +3044,7 @@ } accept(')', "Unclosed group"); - flags = save; + flags0 = save; // Check for quantifiers Node node = closure(head); @@ -3135,28 +3147,28 @@ for (;;) { switch (ch) { case 'i': - flags |= CASE_INSENSITIVE; + flags0 |= CASE_INSENSITIVE; break; case 'm': - flags |= MULTILINE; + flags0 |= MULTILINE; break; case 's': - flags |= DOTALL; + flags0 |= DOTALL; break; case 'd': - flags |= UNIX_LINES; + flags0 |= UNIX_LINES; break; case 'u': - flags |= UNICODE_CASE; + flags0 |= UNICODE_CASE; break; case 'c': - flags |= CANON_EQ; + flags0 |= CANON_EQ; break; case 'x': - flags |= COMMENTS; + flags0 |= COMMENTS; break; case 'U': - flags |= (UNICODE_CHARACTER_CLASS | UNICODE_CASE); + flags0 |= (UNICODE_CHARACTER_CLASS | UNICODE_CASE); break; case '-': // subFlag then fall through ch = next(); @@ -3178,28 +3190,28 @@ for (;;) { switch (ch) { case 'i': - flags &= ~CASE_INSENSITIVE; + flags0 &= ~CASE_INSENSITIVE; break; case 'm': - flags &= ~MULTILINE; + flags0 &= ~MULTILINE; break; case 's': - flags &= ~DOTALL; + flags0 &= ~DOTALL; break; case 'd': - flags &= ~UNIX_LINES; + flags0 &= ~UNIX_LINES; break; case 'u': - flags &= ~UNICODE_CASE; + flags0 &= ~UNICODE_CASE; break; case 'c': - flags &= ~CANON_EQ; + flags0 &= ~CANON_EQ; break; case 'x': - flags &= ~COMMENTS; + flags0 &= ~COMMENTS; break; case 'U': - flags &= ~(UNICODE_CHARACTER_CLASS | UNICODE_CASE); + flags0 &= ~(UNICODE_CHARACTER_CLASS | UNICODE_CASE); break; default: return;