From 3dd1fd2964394328447e36df13eb087c545593b9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hannes=20Walln=C3=B6fer?= Date: Fri, 15 Nov 2019 19:10:43 +0100 Subject: [PATCH] 8223904: Improve Nashorn matching Reviewed-by: jlaskey, sundar, mschoene, rhalade --- .../internal/runtime/regexp/joni/Parser.java | 6 +++--- .../runtime/regexp/joni/ast/StringNode.java | 16 ++++++++++++++-- 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/regexp/joni/Parser.java b/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/regexp/joni/Parser.java index 9960899dd27..35fba71997d 100644 --- a/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/regexp/joni/Parser.java +++ b/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/regexp/joni/Parser.java @@ -452,7 +452,7 @@ class Parser extends Lexer { private Node parseExp(final TokenType term) { if (token.type == term) { - return StringNode.EMPTY; // goto end_of_token + return StringNode.createEmpty(); // goto end_of_token } Node node = null; @@ -461,7 +461,7 @@ class Parser extends Lexer { switch(token.type) { case ALT: case EOT: - return StringNode.EMPTY; // end_of_token:, node_new_empty + return StringNode.createEmpty(); // end_of_token:, node_new_empty case SUBEXP_OPEN: node = parseEnclose(TokenType.SUBEXP_CLOSE); @@ -569,7 +569,7 @@ class Parser extends Lexer { if (syntax.contextInvalidRepeatOps()) { throw new SyntaxException(ERR_TARGET_OF_REPEAT_OPERATOR_NOT_SPECIFIED); } - node = StringNode.EMPTY; // node_new_empty + node = StringNode.createEmpty(); // node_new_empty } else { return parseExpTkByte(group); // goto tk_byte } diff --git a/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/regexp/joni/ast/StringNode.java b/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/regexp/joni/ast/StringNode.java index 0d7f94a9baa..e0156f562a9 100644 --- a/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/regexp/joni/ast/StringNode.java +++ b/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/runtime/regexp/joni/ast/StringNode.java @@ -27,7 +27,6 @@ public final class StringNode extends Node implements StringType { private static final int NODE_STR_MARGIN = 16; private static final int NODE_STR_BUF_SIZE = 24; - public static final StringNode EMPTY = new StringNode(null, Integer.MAX_VALUE, Integer.MAX_VALUE); public char[] chars; public int p; @@ -36,7 +35,13 @@ public final class StringNode extends Node implements StringType { public int flag; public StringNode() { - this.chars = new char[NODE_STR_BUF_SIZE]; + this(NODE_STR_BUF_SIZE); + } + + private StringNode(int size) { + this.chars = new char[size]; + this.p = 0; + this.end = 0; } public StringNode(final char[] chars, final int p, final int end) { @@ -51,6 +56,13 @@ public final class StringNode extends Node implements StringType { chars[end++] = c; } + /** + * Create a new empty StringNode. + */ + public static StringNode createEmpty() { + return new StringNode(0); + } + /* Ensure there is ahead bytes available in node's buffer * (assumes that the node is not shared) */