summaryrefslogtreecommitdiff
path: root/asm-test/src/resources/java/jdk5/AllInstructions.java
diff options
context:
space:
mode:
Diffstat (limited to 'asm-test/src/resources/java/jdk5/AllInstructions.java')
-rwxr-xr-xasm-test/src/resources/java/jdk5/AllInstructions.java288
1 files changed, 288 insertions, 0 deletions
diff --git a/asm-test/src/resources/java/jdk5/AllInstructions.java b/asm-test/src/resources/java/jdk5/AllInstructions.java
new file mode 100755
index 00000000..3137ee16
--- /dev/null
+++ b/asm-test/src/resources/java/jdk5/AllInstructions.java
@@ -0,0 +1,288 @@
+// ASM: a very small and fast Java bytecode manipulation framework
+// Copyright (c) 2000-2011 INRIA, France Telecom
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions
+// are met:
+// 1. Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// 2. Redistributions in binary form must reproduce the above copyright
+// notice, this list of conditions and the following disclaimer in the
+// documentation and/or other materials provided with the distribution.
+// 3. Neither the name of the copyright holders nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+// THE POSSIBILITY OF SUCH DAMAGE.
+package jdk5;
+
+/**
+ * Class which, compiled with the JDK 1.5.0, produces the new JVM instructions from that version
+ * (compared to JDK 1.3.0). Also contain all the other instructions that can be used in JDK 1.5
+ * classes (which excludes jsr and ret), so that ASM classes which don't support jsr or ret (and
+ * therefore can't be tested with jdk3.AllInstructions) can still be tested on all instructions.
+ * Must be compiled with "javac -g".
+ */
+class AllInstructions {
+ private Class c;
+ private Class d;
+ private int f;
+ private long g;
+ private AllInstructions field;
+ private static AllInstructions staticField;
+
+ AllInstructions() {}
+
+ AllInstructions(int v0, float v1, long v2, double v3, Object v4) {}
+
+ // New instruction in JDK 1.5.
+ public void ldcWithClassConstant() {
+ c = AllInstructions.class;
+ d = AllInstructions[].class;
+ }
+
+ public static int intInstructions(
+ int v0, int v1, int v2, int v3, int v4, int v5, int v6, int v7, int v8) {
+ boolean b0 = v0 < -1;
+ boolean b1 = v1 > 1;
+ boolean b2 = v2 <= 2;
+ boolean b3 = v3 >= 3;
+ boolean b4 = v4 == 4;
+ boolean b5 = v5 != 5;
+ v0 = b0 ? (v6 + 5) : (v6 - 5);
+ v1 = b1 ? (v7 * 100) : (v7 / 100);
+ v2 = b2 ? (v8 % 10000) : (~v8);
+ v3 = b3 ? (v0 & 1000000) : (v0 | 1000000);
+ v4 = b4 ? (v1 ^ v2) : (v1 << v2);
+ v5 = b5 ? (v2 >> v3) : (v2 >>> v3);
+ v6 += 1;
+ v7 = v6 < 0 ? -v6 : v6;
+ v1 = v0 < 0 ? v1 : v2;
+ v2 = v1 > 0 ? v2 : v3;
+ v3 = v2 <= 0 ? v3 : v4;
+ v4 = v3 >= 0 ? v4 : v5;
+ v5 = v4 == 0 ? v5 : v6;
+ v6 = v5 != 0 ? v6 : v7;
+ return v0 + v1 + v2 + v3 + v4 + v5 + v6 + v7 + v8;
+ }
+
+ public static long longInstructions(
+ long v0, long v1, long v2, long v3, long v4, long v5, long v6, long v7, long v8) {
+ boolean b0 = v0 < -1L;
+ boolean b1 = v1 > 1L;
+ boolean b2 = v2 <= 2L;
+ boolean b3 = v3 >= 3L;
+ boolean b4 = v4 == 4L;
+ boolean b5 = v5 != 5L;
+ v0 = b0 ? (v6 + 5L) : (v6 - 5L);
+ v1 = b1 ? (v7 * 100L) : (v7 / 100L);
+ v2 = b2 ? (v8 % 10000L) : (~v8);
+ v3 = b3 ? (v0 & 1000000L) : (v0 | 1000000L);
+ v4 = b4 ? (v1 ^ v2) : (v1 << v2);
+ v5 = b5 ? (v2 >> v3) : (v2 >>> v3);
+ v6 += 1L;
+ v7 = v6 < 0L ? -v6 : v6;
+ return v0 + v1 + v2 + v3 + v4 + v5 + v6 + v7 + v8;
+ }
+
+ public static float floatInstructions(
+ float v0, float v1, float v2, float v3, float v4, float v5, float v6, float v7, float v8) {
+ boolean b0 = v0 < -1f;
+ boolean b1 = v1 > 1f;
+ boolean b2 = v2 <= 2f;
+ boolean b3 = v3 >= 3f;
+ boolean b4 = v4 == 4f;
+ boolean b5 = v5 != 5f;
+ v0 = b0 ? (v6 + 5f) : (v6 - 5f);
+ v1 = b1 ? (v7 * 100f) : (v7 / 100f);
+ v2 = b2 ? (v8 % 10000f) : v8;
+ v3 = b3 ? -v3 : v3;
+ v4 = b4 ? -v4 : v4;
+ v5 = b5 ? -v5 : v5;
+ v6 += 1f;
+ v7 = v6 < 0f ? -v6 : v6;
+ v8 = v7;
+ return v0 + v1 + v2 + v3 + v4 + v5 + v6 + v7 + v8;
+ }
+
+ public static double doubleInstructions(
+ double v0,
+ double v1,
+ double v2,
+ double v3,
+ double v4,
+ double v5,
+ double v6,
+ double v7,
+ double v8) {
+ boolean b0 = v0 < -1d;
+ boolean b1 = v1 > 1d;
+ boolean b2 = v2 <= 2d;
+ boolean b3 = v3 >= 3d;
+ boolean b4 = v4 == 4d;
+ boolean b5 = v5 != 5d;
+ v0 = b0 ? (v6 + 5d) : (v6 - 5d);
+ v1 = b1 ? (v7 * 100d) : (v7 / 100d);
+ v2 = b2 ? (v8 % 10000d) : v8;
+ v3 = b3 ? -v3 : v3;
+ v4 = b4 ? -v4 : v4;
+ v5 = b5 ? -v5 : v5;
+ v6 += 1d;
+ v7 = v6 < 0d ? -v6 : v6;
+ return v0 + v1 + v2 + v3 + v4 + v5 + v6 + v7 + v8;
+ }
+
+ public static double castInstructions(int v0, long v1, long v2) {
+ byte v3 = (byte) v0;
+ char v4 = (char) v1;
+ short v5 = (short) v2;
+ long v6 = (long) v3;
+ float v7 = (float) v4;
+ double v8 = (double) v5;
+ v1 = v6;
+ v2 = v1;
+ v6 = (long) v8;
+ return v0 + v1 + v2 + v3 + v4 + v5 + v6 + v7 + v8;
+ }
+
+ public static float castInstructions(float v0, double v1, double v2) {
+ byte v3 = (byte) v0;
+ char v4 = (char) v1;
+ short v5 = (short) v2;
+ long v6 = (long) v3;
+ float v7 = (float) v4;
+ double v8 = (double) v5;
+ v1 = v6;
+ v2 = v1;
+ v6 = (long) v7;
+ return (float) (v0 + v1 + v2 + v3 + v4 + v5 + v6 + v7 + v8);
+ }
+
+ public static Object objectInstructions(Object v0, Object v1, Object v2, Object v3, Object v4) {
+ boolean b0 = v0 == v1;
+ boolean b1 = v1 != v2;
+ boolean b2 = v2 == null;
+ boolean b3 = v3 != null;
+ boolean b4 = v4 instanceof String;
+ v0 = b0 ? null : v0;
+ v1 = b1 ? v1 : v0;
+ v2 = b2 ? v2 : v1;
+ v3 = b3 ? v3 : v2;
+ v4 = b4 ? new Integer(((String) v4).length()) : v3;
+ return v4;
+ }
+
+ public static Object[] arrayInstructions(
+ byte[] v0, char[] v1, short[] v2, int[] v3, long[] v4, float[] v5, double[] v6, Object[] v7) {
+ v0[1] = v0[0];
+ v1[1] = v1[0];
+ v2[1] = v2[0];
+ v3[1] = v3[0];
+ v4[1] = v4[0];
+ v5[1] = v5[0];
+ v6[1] = v6[0];
+ v7[1] = v7[0];
+ Object[] v8 = new Object[v7.length];
+ v8[0] = new int[4][8][16];
+ return v8;
+ }
+
+ public void fieldInstructions() {
+ AllInstructions c = field;
+ field = staticField;
+ staticField = c;
+ }
+
+ public void methodInstructions(Runnable v0) {
+ AllInstructions c = new AllInstructions();
+ c.fieldInstructions();
+ monitorInstructions(c);
+ v0.run();
+ }
+
+ public static int lookupSwitchInstruction(int v0) {
+ switch (v0) {
+ case 1000:
+ return 1;
+ case 10000:
+ return 2;
+ case 100000:
+ return 3;
+ default:
+ return -1;
+ }
+ }
+
+ public static int tableSwitchInstruction(int v0) {
+ switch (v0) {
+ case 0:
+ return 1;
+ case 1:
+ return 2;
+ case 2:
+ return 3;
+ default:
+ return -1;
+ }
+ }
+
+ public static String monitorInstructions(Object v0) {
+ synchronized (v0) {
+ return v0.toString();
+ }
+ }
+
+ public int dupX1Instruction() {
+ return f++;
+ }
+
+ public long dup2X1Instruction() {
+ return g++;
+ }
+
+ public void dupX2Instruction(int[] v0, int[] v1) {
+ v0[0] = v1[0] = 0;
+ }
+
+ public void dup2X2Instruction(long[] v0, long[] v1) {
+ v0[0] = v1[0] = 0;
+ }
+
+ public void popInstructions() {
+ dupX1Instruction();
+ dup2X1Instruction();
+ }
+
+ // With JDK1.5, this code no longer produces jsr or ret instructions.
+ public int jsrAndRetInstructions(int v0) throws Exception {
+ int u0 = v0 + 1;
+ try {
+ u0 = jsrAndRetInstructions(u0);
+ } catch (Throwable t) {
+ return -1;
+ } finally {
+ u0++;
+ }
+ return u0;
+ }
+
+ public Object readNullArray() {
+ Object[] array = null;
+ try {
+ return array[0];
+ } catch (NullPointerException e) {
+ return null;
+ }
+ }
+}