OpenJDK / jdk / jdk
changeset 48336:267be02c1137
Merge
author | alanb |
---|---|
date | Thu, 14 Dec 2017 12:51:53 +0000 |
parents | f1e1a4fc1cc7 fdefa410d655 |
children | 0ee20aad71c4 |
files | |
diffstat | 4 files changed, 66 insertions(+), 10 deletions(-) [+] |
line wrap: on
line diff
--- a/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/codegen/AssignSymbols.java Thu Dec 14 12:36:37 2017 +0000 +++ b/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/codegen/AssignSymbols.java Thu Dec 14 12:51:53 2017 +0000 @@ -796,7 +796,7 @@ args.add(strictFlagNode); } else { - return LiteralNode.newInstance(unaryNode, true); + throw new AssertionError("Unexpected delete with " + rhs.getClass().getName() + " expression"); } return new RuntimeNode(unaryNode, request, args); }
--- a/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/codegen/Lower.java Thu Dec 14 12:36:37 2017 +0000 +++ b/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/codegen/Lower.java Thu Dec 14 12:51:53 2017 +0000 @@ -228,6 +228,16 @@ return super.leaveIndexNode(indexNode); } + @Override + public Node leaveDELETE(final UnaryNode delete) { + final Expression expression = delete.getExpression(); + if (expression instanceof IdentNode || expression instanceof BaseNode) { + return delete; + } + return new BinaryNode(Token.recast(delete.getToken(), TokenType.COMMARIGHT), expression, + LiteralNode.newInstance(delete.getToken(), delete.getFinish(), true)); + } + // If expression is a primitive literal that is not an array index and does return its string value. Else return null. private static String getConstantPropertyName(final Expression expression) { if (expression instanceof LiteralNode.PrimitiveLiteralNode) {
--- a/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/parser/Parser.java Thu Dec 14 12:36:37 2017 +0000 +++ b/src/jdk.scripting.nashorn/share/classes/jdk/nashorn/internal/parser/Parser.java Thu Dec 14 12:51:53 2017 +0000 @@ -4404,15 +4404,6 @@ final long unaryToken = token; switch (type) { - case DELETE: { - next(); - final Expression expr = unaryExpression(); - if (expr instanceof BaseNode || expr instanceof IdentNode) { - return new UnaryNode(unaryToken, expr); - } - appendStatement(new ExpressionStatement(unaryLine, unaryToken, finish, expr)); - return LiteralNode.newInstance(unaryToken, finish, true); - } case ADD: case SUB: { final TokenType opType = type; @@ -4420,6 +4411,7 @@ final Expression expr = unaryExpression(); return new UnaryNode(Token.recast(unaryToken, (opType == TokenType.ADD) ? TokenType.POS : TokenType.NEG), expr); } + case DELETE: case VOID: case TYPEOF: case BIT_NOT:
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/nashorn/src/jdk/nashorn/api/tree/test/JDK_8193296_Test.java Thu Dec 14 12:51:53 2017 +0000 @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2017, 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. Oracle designates this + * particular file as subject to the "Classpath" exception as provided + * by Oracle in the LICENSE file that accompanied this code. + * + * 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. + */ +package jdk.nashorn.api.tree.test; + +import jdk.nashorn.api.tree.CompilationUnitTree; +import jdk.nashorn.api.tree.ExpressionStatementTree; +import jdk.nashorn.api.tree.FunctionCallTree; +import jdk.nashorn.api.tree.Parser; +import jdk.nashorn.api.tree.Tree; +import jdk.nashorn.api.tree.UnaryTree; +import org.testng.Assert; +import org.testng.annotations.Test; + +/** + * @test + * @bug 8184723 + * @summary Parser should not eagerly transform delete expressions + * @run testng jdk.nashorn.api.tree.test.JDK_8193296_Test + */ +public class JDK_8193296_Test { + @Test + public void test() { + Parser p = Parser.create(); + CompilationUnitTree t = p.parse("test", "function x() { }; delete x();", System.out::println); + Assert.assertEquals(t.getSourceElements().size(), 2); + Tree delt = ((ExpressionStatementTree)t.getSourceElements().get(1)).getExpression(); + Assert.assertTrue(delt instanceof UnaryTree, delt.getClass().getName()); + UnaryTree del = (UnaryTree)delt; + Assert.assertEquals(del.getKind(), Tree.Kind.DELETE); + Assert.assertTrue(del.getExpression() instanceof FunctionCallTree, del.getExpression().getClass().getName()); + } +}