6504896: TreeMaker.Literal(Object) does not support Booleans
authorjjg
Fri, 10 Dec 2010 07:38:28 -0800
changeset 7636 030f141aa32b
parent 7635 e0a3aeefe4e7
child 7637 467bc8fc514e
child 7638 d6b9ba4230f0
child 7641 8b552db25f99
6504896: TreeMaker.Literal(Object) does not support Booleans Reviewed-by: mcimadamore
langtools/src/share/classes/com/sun/tools/javac/parser/JavacParser.java
langtools/src/share/classes/com/sun/tools/javac/tree/TreeMaker.java
langtools/test/tools/javac/tree/MakeLiteralTest.java
--- 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;
+}