Mercurial > hg > openjdk > jdk9 > nashorn
changeset 1732:a32d419d73fe jdk-9+125
8073653: Secondary heredoc eating wrong lines.
Reviewed-by: mhaupt, jlaskey
author | hannesw |
---|---|
date | Fri, 24 Jun 2016 14:46:45 +0200 |
parents | 53537d04b6f4 |
children | 3a330bb9c9b6 bf76248bbe51 |
files | src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/parser/Lexer.java test/script/basic/JDK-8073653.js test/script/basic/JDK-8073653.js.EXPECTED |
diffstat | 3 files changed, 81 insertions(+), 2 deletions(-) [+] |
line wrap: on
line diff
--- a/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/parser/Lexer.java Fri Jun 24 12:39:42 2016 +0200 +++ b/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;
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/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(<<EOD1); print(<<EOD2.toUpperCase()); var a = <<EOD3, b = <<EOD4.toLowerCase(), c = [<<EOD5, <<EOD6]; +This is line 1. +This is line 2. +EOD1 +This is line 3. +This is line 4. +EOD2 +This is line 5. +This is line 6. +EOD3 +This is line 7. +This is line 8. +EOD4 +This is line 9. +This is line 10. +EOD5 +This is line 11. +This is line 12. +EOD6 + +print(a); +print(b); +for (var i in c) { + print(c[i]); +} + +
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/script/basic/JDK-8073653.js.EXPECTED Fri Jun 24 14:46:45 2016 +0200 @@ -0,0 +1,12 @@ +This is line 1. +This is line 2. +THIS IS LINE 3. +THIS IS LINE 4. +This is line 5. +This is line 6. +this is line 7. +this is line 8. +This is line 9. +This is line 10. +This is line 11. +This is line 12.