Mon, 07 Jan 2013 14:41:16 -0400
8005703: Offsets miscalculated for blocks
Reviewed-by: lagergren
Contributed-by: petr.hejl@oracle.com
1.1 --- a/src/jdk/nashorn/internal/ir/Block.java Mon Jan 07 19:31:36 2013 +0100 1.2 +++ b/src/jdk/nashorn/internal/ir/Block.java Mon Jan 07 14:41:16 2013 -0400 1.3 @@ -185,6 +185,9 @@ 1.4 public void addStatement(final Node statement) { 1.5 if (statement != null) { 1.6 statements.add(statement); 1.7 + if (getFinish() < statement.getFinish()) { 1.8 + setFinish(statement.getFinish()); 1.9 + } 1.10 } 1.11 } 1.12
2.1 --- a/src/jdk/nashorn/internal/parser/AbstractParser.java Mon Jan 07 19:31:36 2013 +0100 2.2 +++ b/src/jdk/nashorn/internal/parser/AbstractParser.java Mon Jan 07 14:41:16 2013 -0400 2.3 @@ -429,6 +429,8 @@ 2.4 2.5 // Create literal node. 2.6 final Object value = getValue(); 2.7 + // Advance to have a correct finish 2.8 + next(); 2.9 2.10 LiteralNode<?> node = null; 2.11 2.12 @@ -452,7 +454,6 @@ 2.13 assert false : "unknown type for LiteralNode: " + value.getClass(); 2.14 } 2.15 2.16 - next(); 2.17 return node; 2.18 } 2.19 }
3.1 --- a/src/jdk/nashorn/internal/parser/Parser.java Mon Jan 07 19:31:36 2013 +0100 3.2 +++ b/src/jdk/nashorn/internal/parser/Parser.java Mon Jan 07 14:41:16 2013 -0400 3.3 @@ -938,7 +938,11 @@ 3.4 3.5 // If is a statement then handle end of line. 3.6 if (isStatement) { 3.7 + boolean semicolon = type == SEMICOLON; 3.8 endOfLine(); 3.9 + if (semicolon) { 3.10 + block.setFinish(finish); 3.11 + } 3.12 } 3.13 3.14 return vars; 3.15 @@ -954,7 +958,8 @@ 3.16 */ 3.17 private void emptyStatement() { 3.18 if (context._empty_statements) { 3.19 - block.addStatement(new EmptyNode(source, token, Token.descPosition(token))); 3.20 + block.addStatement(new EmptyNode(source, token, 3.21 + Token.descPosition(token) + Token.descLength(token))); 3.22 } 3.23 3.24 // SEMICOLON checked in caller. 3.25 @@ -988,6 +993,7 @@ 3.26 3.27 if (executeNode != null) { 3.28 executeNode.setFinish(finish); 3.29 + block.setFinish(finish); 3.30 } 3.31 } 3.32 3.33 @@ -1571,6 +1577,7 @@ 3.34 // Get CASE body. 3.35 final Block statements = getBlock(false); 3.36 final CaseNode caseNode = new CaseNode(source, caseToken, finish, caseExpression, statements); 3.37 + statements.setFinish(finish); 3.38 3.39 if (caseExpression == null) { 3.40 defaultCase = caseNode;