summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--jack-tests/tests/com/android/jack/cast/implicit006/jack/Implicit006.java58
-rw-r--r--jack/src/com/android/jack/ir/ast/JNumberLiteral.java5
-rw-r--r--jack/src/com/android/jack/ir/impl/JackIrBuilder.java45
-rw-r--r--jack/tests/com/android/jack/ImplicitCastTest.java8
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")));
+ }
}