# HG changeset patch # User hannesw # Date 1466772405 -7200 # Node ID e02c166da4dd0e86ec3d1a1f6b0d0a9e867c0543 # Parent c543a06f002f52528cb4e7c26a6ea226b5e8af3f 8073653: Secondary heredoc eating wrong lines. Reviewed-by: mhaupt, jlaskey diff -r c543a06f002f -r e02c166da4dd nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/parser/Lexer.java --- a/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/parser/Lexer.java Fri Jun 24 12:39:42 2016 +0200 +++ b/nashorn/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/parser/Lexer.java Fri Jun 24 14:46:45 2016 +0200 @@ -609,6 +609,9 @@ if (stream.get(stream.last()) != token) { return false; } + + // Record current position in case multiple heredocs start on this line - see JDK-8073653 + final State state = saveState(); // Rewind to token start position reset(Token.descPosition(token)); @@ -616,7 +619,7 @@ return scanRegEx(); } else if (ch0 == '<') { if (ch1 == '<') { - return scanHereString(lir); + return scanHereString(lir, state); } else if (Character.isJavaIdentifierStart(ch1)) { return scanXMLLiteral(); } @@ -1539,7 +1542,7 @@ * * @return TRUE if is a here string. */ - private boolean scanHereString(final LineInfoReceiver lir) { + private boolean scanHereString(final LineInfoReceiver lir, final State oldState) { assert ch0 == '<' && ch1 == '<'; if (scripting) { // Record beginning of here string. @@ -1589,6 +1592,11 @@ int lastLinePosition = position; restState.setLimit(position); + if (oldState.position > position) { + restoreState(oldState); + skipLine(false); + } + // Record beginning of string. final State stringState = saveState(); int stringEnd = position; diff -r c543a06f002f -r e02c166da4dd nashorn/test/script/basic/JDK-8073653.js --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/nashorn/test/script/basic/JDK-8073653.js Fri Jun 24 14:46:45 2016 +0200 @@ -0,0 +1,59 @@ +/* + * Copyright (c) 2016, 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/** + * JDK-8073653: Secondary heredoc eating wrong lines. + * + * @test + * @run + * @option -scripting + */ + + +print(<