6504896: TreeMaker.Literal(Object) does not support Booleans
Reviewed-by: mcimadamore
--- a/langtools/src/share/classes/com/sun/tools/javac/parser/JavacParser.java Fri Dec 10 15:24:17 2010 +0000
+++ b/langtools/src/share/classes/com/sun/tools/javac/parser/JavacParser.java Fri Dec 10 07:38:28 2010 -0800
@@ -498,7 +498,7 @@
try {
n = Float.valueOf(proper);
} catch (NumberFormatException ex) {
- // error already repoted in scanner
+ // error already reported in scanner
n = Float.NaN;
}
if (n.floatValue() == 0.0f && !isZero(proper))
--- a/langtools/src/share/classes/com/sun/tools/javac/tree/TreeMaker.java Fri Dec 10 15:24:17 2010 +0000
+++ b/langtools/src/share/classes/com/sun/tools/javac/tree/TreeMaker.java Fri Dec 10 07:38:28 2010 -0800
@@ -734,8 +734,9 @@
result = Literal(BYTE, value).
setType(syms.byteType.constType(value));
} else if (value instanceof Character) {
+ int v = (int) (((Character) value).toString().charAt(0));
result = Literal(CHAR, value).
- setType(syms.charType.constType(value));
+ setType(syms.charType.constType(v));
} else if (value instanceof Double) {
result = Literal(DOUBLE, value).
setType(syms.doubleType.constType(value));
@@ -745,6 +746,10 @@
} else if (value instanceof Short) {
result = Literal(SHORT, value).
setType(syms.shortType.constType(value));
+ } else if (value instanceof Boolean) {
+ int v = ((Boolean) value) ? 1 : 0;
+ result = Literal(BOOLEAN, v).
+ setType(syms.booleanType.constType(v));
} else {
throw new AssertionError(value);
}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/langtools/test/tools/javac/tree/MakeLiteralTest.java Fri Dec 10 07:38:28 2010 -0800
@@ -0,0 +1,90 @@
+
+
+/*
+ * Copyright (c) 2010, 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.
+ */
+
+/*
+ * @test
+ * @bug 6504896
+ * @summary TreeMaker.Literal(Object) does not support Booleans
+ */
+
+import com.sun.tools.javac.code.Type;
+import com.sun.tools.javac.code.Symtab;
+import com.sun.tools.javac.code.Types;
+import com.sun.tools.javac.file.JavacFileManager;
+import com.sun.tools.javac.tree.JCTree.JCLiteral;
+import com.sun.tools.javac.util.Context;
+import com.sun.tools.javac.tree.TreeMaker;
+import static com.sun.tools.javac.code.TypeTags.*;
+
+public class MakeLiteralTest {
+ public static void main(String... args) throws Exception {
+ new MakeLiteralTest().run();
+ }
+
+ void run() throws Exception {
+ Context context = new Context();
+ JavacFileManager.preRegister(context);
+ Symtab syms = Symtab.instance(context);
+ maker = TreeMaker.instance(context);
+ types = Types.instance(context);
+
+ test("abc", CLASS, syms.stringType, "abc");
+ test(Boolean.FALSE, BOOLEAN, syms.booleanType, Integer.valueOf(0));
+ test(Boolean.TRUE, BOOLEAN, syms.booleanType, Integer.valueOf(1));
+ test(Byte.valueOf((byte) 1), BYTE, syms.byteType, Byte.valueOf((byte) 1));
+ test(Character.valueOf('a'), CHAR, syms.charType, Integer.valueOf('a'));
+ test(Double.valueOf(1d), DOUBLE, syms.doubleType, Double.valueOf(1d));
+ test(Float.valueOf(1f), FLOAT, syms.floatType, Float.valueOf(1f));
+ test(Integer.valueOf(1), INT, syms.intType, Integer.valueOf(1));
+ test(Long.valueOf(1), LONG, syms.longType, Long.valueOf(1));
+ test(Short.valueOf((short) 1), SHORT, syms.shortType, Short.valueOf((short) 1));
+
+ if (errors > 0)
+ throw new Exception(errors + " errors found");
+ }
+
+ void test(Object value, int tag, Type type, Object constValue) {
+ JCLiteral l = maker.Literal(value);
+ if (l.type.tag != tag)
+ error("unexpected tag: " + l.getTag() + ": expected: " + tag);
+ if (!types.isSameType(l.type, type))
+ error("unexpected type: " + l.type + ": expected: " + type);
+ if (l.type.constValue().getClass() != constValue.getClass()
+ || !constValue.equals(l.type.constValue())) {
+ error("unexpected const value: "
+ + l.type.constValue().getClass() + " " + l.type.constValue()
+ + ": expected:" + constValue.getClass() + " " + constValue);
+ }
+ }
+
+ void error(String msg) {
+ System.err.println("Error: " + msg);
+ errors++;
+ }
+
+ TreeMaker maker;
+ Types types;
+ int errors;
+}