diff options
4 files changed, 88 insertions, 28 deletions
diff --git a/jack-tests/tests/com/android/jack/cast/implicit006/jack/Implicit006.java b/jack-tests/tests/com/android/jack/cast/implicit006/jack/Implicit006.java new file mode 100644 index 0000000..7a2d59c --- /dev/null +++ b/jack-tests/tests/com/android/jack/cast/implicit006/jack/Implicit006.java @@ -0,0 +1,58 @@ +/* + * Copyright (C) 2014 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.jack.cast.implicit006.jack; + +public class Implicit006 { + + private static final byte byteValue = 127; + + private static final short shortValue = 315; + + private static final char charValue = 't'; + + private static final int intValue = 1650000; + + private static final long longValue = 0x123456789L; + + private static final float floatValue = 31.55F; + + private static final double doubleValue = 31.55D; + + public byte[] getByteArray() { + return new byte[]{byteValue}; + } + public char[] getCharArray() { + return new char[]{byteValue, shortValue, charValue}; + } + public short[] getShortArray() { + return new short[]{byteValue, shortValue, charValue}; + } + public int[] getIntArray() { + return new int[]{byteValue, shortValue, charValue, intValue}; + } + public long[] getLongArray() { + return new long[]{byteValue, shortValue, charValue, intValue, longValue}; + } + public float[] getFloatArray() { + return new float[]{byteValue, shortValue, charValue, intValue, longValue, floatValue}; + } + public double[] getDoubleArray() { + return new double[]{byteValue, shortValue, charValue, intValue, longValue, floatValue, + doubleValue}; + } + +} diff --git a/jack/src/com/android/jack/ir/ast/JNumberLiteral.java b/jack/src/com/android/jack/ir/ast/JNumberLiteral.java index 34d9acf..8374d09 100644 --- a/jack/src/com/android/jack/ir/ast/JNumberLiteral.java +++ b/jack/src/com/android/jack/ir/ast/JNumberLiteral.java @@ -16,14 +16,17 @@ package com.android.jack.ir.ast; +import com.android.jack.ir.HasSourceInfo; + import javax.annotation.Nonnull; /** * Interface implemented by any Java literal expression that could return Object representing * numeric or floating point value. */ -public interface JNumberLiteral { +public interface JNumberLiteral extends HasSourceInfo { @Nonnull public Number getNumber(); + } diff --git a/jack/src/com/android/jack/ir/impl/JackIrBuilder.java b/jack/src/com/android/jack/ir/impl/JackIrBuilder.java index 1dae0d2..f2d893d 100644 --- a/jack/src/com/android/jack/ir/impl/JackIrBuilder.java +++ b/jack/src/com/android/jack/ir/impl/JackIrBuilder.java @@ -66,7 +66,6 @@ import com.android.jack.ir.ast.JForStatement; import com.android.jack.ir.ast.JIfStatement; import com.android.jack.ir.ast.JInstanceOf; import com.android.jack.ir.ast.JIntLiteral; -import com.android.jack.ir.ast.JIntegralConstant32; import com.android.jack.ir.ast.JInterface; import com.android.jack.ir.ast.JLabel; import com.android.jack.ir.ast.JLabeledStatement; @@ -88,6 +87,7 @@ import com.android.jack.ir.ast.JNewInstance; import com.android.jack.ir.ast.JNode; import com.android.jack.ir.ast.JNullLiteral; import com.android.jack.ir.ast.JNullType; +import com.android.jack.ir.ast.JNumberLiteral; import com.android.jack.ir.ast.JParameter; import com.android.jack.ir.ast.JParameterRef; import com.android.jack.ir.ast.JPostfixOperation; @@ -114,6 +114,7 @@ import com.android.jack.ir.ast.JValueLiteral; import com.android.jack.ir.ast.JVariable; import com.android.jack.ir.ast.JWhileStatement; import com.android.jack.ir.ast.MethodKind; +import com.android.jack.ir.ast.Number; import com.android.jack.ir.ast.marker.GenericSignature; import com.android.jack.ir.ast.marker.ThisRefTypeInfo; import com.android.jack.ir.sourceinfo.SourceInfo; @@ -345,13 +346,13 @@ public class JackIrBuilder { JExpression expr = (JExpression) result.get(i); expr = simplify(expr, expressions[i]); - if (type.getElementType() instanceof JPrimitiveType && expr instanceof JValueLiteral + if (type.getElementType() instanceof JPrimitiveType && expr instanceof JNumberLiteral && !expr.getType().isSameType(type.getElementType())) { // We have a constant with a different type than array type, change it to the right // type values.add(changeTypeOfLiteralValue( ((JPrimitiveType) type.getElementType()).getPrimitiveTypeEnum(), - (JValueLiteral) expr)); + (JNumberLiteral) expr)); } else { values.add(expr); } @@ -366,47 +367,37 @@ public class JackIrBuilder { } } - @SuppressWarnings("incomplete-switch") @Nonnull private JValueLiteral changeTypeOfLiteralValue(@Nonnull JPrimitiveTypeEnum expectedType, - @Nonnull JValueLiteral expr) throws AssertionError { + @Nonnull JNumberLiteral expr) throws AssertionError { SourceInfo sourceInfo = expr.getSourceInfo(); + Number number = expr.getNumber(); switch (expectedType) { case BYTE: { - return (new JByteLiteral(sourceInfo, (byte) ((JIntegralConstant32) expr).getIntValue())); + return (new JByteLiteral(sourceInfo, number.byteValue())); } case CHAR: { - return (new JCharLiteral(sourceInfo, (char) ((JIntegralConstant32) expr).getIntValue())); + return (new JCharLiteral(sourceInfo, number.charValue())); } case SHORT: { - return (new JShortLiteral(sourceInfo, - (short) ((JIntegralConstant32) expr).getIntValue())); + return (new JShortLiteral(sourceInfo, number.shortValue())); } case LONG: { - return (new JLongLiteral(sourceInfo, ((JIntegralConstant32) expr).getIntValue())); + return (new JLongLiteral(sourceInfo, number.longValue())); } case FLOAT: { - if (expr instanceof JIntLiteral) { - return (new JFloatLiteral(sourceInfo, ((JIntLiteral) expr).getValue())); - } else if (expr instanceof JLongLiteral) { - return (new JFloatLiteral(sourceInfo, ((JLongLiteral) expr).getValue())); - } - break; + return (new JFloatLiteral(sourceInfo, number.floatValue())); } case DOUBLE: { - if (expr instanceof JIntLiteral) { - return (new JDoubleLiteral(sourceInfo, ((JIntLiteral) expr).getValue())); - } else if (expr instanceof JFloatLiteral) { - return (new JDoubleLiteral(sourceInfo, ((JFloatLiteral) expr).getValue())); - } else if (expr instanceof JLongLiteral) { - return (new JDoubleLiteral(sourceInfo, ((JLongLiteral) expr).getValue())); - } - break; + return (new JDoubleLiteral(sourceInfo, number.doubleValue())); + } + case INT: { + return (new JIntLiteral(sourceInfo, number.intValue())); } - case INT: - case BOOLEAN: { - return (expr); + case BOOLEAN: + case VOID: { + throw new AssertionError(); } } diff --git a/jack/tests/com/android/jack/ImplicitCastTest.java b/jack/tests/com/android/jack/ImplicitCastTest.java index c631267..a9d34d0 100644 --- a/jack/tests/com/android/jack/ImplicitCastTest.java +++ b/jack/tests/com/android/jack/ImplicitCastTest.java @@ -61,4 +61,12 @@ public class ImplicitCastTest { TestTools.runCompilation(TestTools.buildCommandLineArgs( TestTools.getJackTestsWithJackFolder("cast/implicit004"))); } + /** + * Verifies that the test source can compile from source to dex file. + */ + @Test + public void testCompile006() throws Exception { + TestTools.runCompilation(TestTools.buildCommandLineArgs( + TestTools.getJackTestsWithJackFolder("cast/implicit006"))); + } } |