diff --git a/annotations/org.ow2.asm_asm-debug-all_4.1/org/objectweb/asm/annotations.xml b/annotations/org.ow2.asm_asm-debug-all_4.1/org/objectweb/asm/annotations.xml index cba4afb9059..c608a4842d3 100644 --- a/annotations/org.ow2.asm_asm-debug-all_4.1/org/objectweb/asm/annotations.xml +++ b/annotations/org.ow2.asm_asm-debug-all_4.1/org/objectweb/asm/annotations.xml @@ -1,272 +1,74 @@ - - - - + - + - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - + - + - - - - + + + + + + + + + + + + + + + + + + + + + + - - - - - - - + - + - - - - - - - - - - - - - - - - - - - - - - - - - + @@ -278,172 +80,25 @@ - + - + - - - - - - - - - - - - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + @@ -455,68 +110,215 @@ - + - - - - - - - + - + - + - + - + - + - + - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + + + - + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -524,8 +326,11 @@ - + + + + @@ -533,19 +338,217 @@ - - - - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/test/org/jetbrains/eval4j/test/ArrayHelper.java b/test/org/jetbrains/eval4j/test/ArrayHelper.java new file mode 100644 index 00000000000..cf816d4ebf4 --- /dev/null +++ b/test/org/jetbrains/eval4j/test/ArrayHelper.java @@ -0,0 +1,16 @@ +package org.jetbrains.eval4j.test; + +import java.lang.reflect.Array; + +public class ArrayHelper { + public static Object newMultiArray(Class elementType, Integer... dimensions) { + int[] dims = new int[dimensions.length]; + int i = 0; + for (Integer dimension : dimensions) { + dims[i] = dimension; + i++; + } + + return Array.newInstance(elementType, dims); + } +} diff --git a/test/org/jetbrains/eval4j/test/TestData.java b/test/org/jetbrains/eval4j/test/TestData.java index 239df0dc5e4..95878595309 100644 --- a/test/org/jetbrains/eval4j/test/TestData.java +++ b/test/org/jetbrains/eval4j/test/TestData.java @@ -277,4 +277,184 @@ class TestData { } return 0; } + + static Class arrayClass() { + return int[].class; + } + + static int arrayOfByte() { + byte[] a = new byte[] {1, 2, 3}; + int sum = 0; + for (int i : a) { + sum += i; + } + return sum; + } + + static int arrayOfShort() { + short[] a = new short[] {1, 2, 3}; + int sum = 0; + for (int i : a) { + sum += i; + } + return sum; + } + + static int arrayOfChar() { + char[] a = new char[] {1, 2, 3}; + int sum = 0; + for (int i : a) { + sum += i; + } + return sum; + } + + static int arrayOfInt() { + int[] a = new int[] {1, 2, 3}; + int sum = 0; + for (int i : a) { + sum += i; + } + return sum; + } + + static int arrayOfLong() { + long[] a = new long[] {1, 2, 3}; + int sum = 0; + for (long i : a) { + sum += i; + } + return sum; + } + + static float arrayOfFloat() { + float[] a = new float[] {1, 2, 3}; + float sum = 0; + for (float i : a) { + sum += i; + } + return sum; + } + + static double arrayOfDouble() { + double[] a = new double[] {1, 2, 3}; + double sum = 0; + for (double i : a) { + sum += i; + } + return sum; + } + + static String arrayOfString() { + String[] a = new String[] {"1", "2", "3"}; + String sum = ""; + for (String i : a) { + sum += i; + } + return sum; + } + + static int arrayOfByte2() { + byte[][] a = new byte[][] {{1}, {2}, {3}}; + int sum = 0; + for (byte[] aa: a) + for (int i : aa) { + sum += i; + } + return sum; + } + + static int arrayOfShort2() { + short[][] a = new short[][] {{1}, {2}, {3}}; + int sum = 0; + for (short[] aa: a) + for (int i : aa) { + sum += i; + } + return sum; + } + + static int arrayOfChar2() { + char[][] a = new char[][] {{1}, {2}, {3}}; + int sum = 0; + for (char[] aa: a) + for (int i : aa) { + sum += i; + } + return sum; + } + + static int arrayOfInt2() { + int[][] a = new int[][] {{1}, {2}, {3}}; + int sum = 0; + for (int[] aa: a) + for (int i : aa) { + sum += i; + } + return sum; + } + + static int arrayOfLong2() { + long[][] a = new long[][] {{1}, {2}, {3}}; + int sum = 0; + for (long[] aa: a) + for (long i : aa) { + sum += i; + } + return sum; + } + + static float arrayOfFloat2() { + float[][] a = new float[][] {{1}, {2}, {3}}; + float sum = 0; + for (float[] aa: a) + for (float i : aa) { + sum += i; + } + return sum; + } + + static double arrayOfDouble2() { + double[][] a = new double[][] {{1}, {2}, {3}}; + double sum = 0; + for (double[] aa: a) + for (double i : aa) { + sum += i; + } + return sum; + } + + static String arrayOfString2() { + String[][] a = new String[][] {{"1"}, {"2"}, {"3"}}; + String sum = ""; + for (String[] aa: a) + for (String i : aa) { + sum += i; + } + return sum; + } + + static String multiArrayOfInt() { + int[][] a = new int[2][2]; + String s = ""; + for (int[] x : a) + for (int y : x) { + s += y; + } + return s; + } + + static String multiArrayOfString() { + String[][] a = new String[2][2]; + for (String[] x : a) + for (int i = 0; i < x.length; i++) { + x[i] = i + ""; + } + String s = ""; + for (String[] x : a) + for (String y : x) { + s += y; + } + return s; + } } diff --git a/test/org/jetbrains/eval4j/test/main.kt b/test/org/jetbrains/eval4j/test/main.kt index 9485f0bd30a..89f54af4626 100644 --- a/test/org/jetbrains/eval4j/test/main.kt +++ b/test/org/jetbrains/eval4j/test/main.kt @@ -12,6 +12,7 @@ import java.lang.reflect.Method import java.lang.reflect.Field import java.lang.reflect.Constructor import java.lang.reflect.InvocationTargetException +import java.lang.reflect.Array as JArray fun suite(): TestSuite { val suite = TestSuite() @@ -102,35 +103,80 @@ object REFLECTION_EVAL : Eval { val lookup = ReflectionLookup(javaClass().getClassLoader()!!) override fun loadClass(classType: Type): Value { - return ObjectValue(findClass(classType.getInternalName()), Type.getType(javaClass>())) + return ObjectValue(findClass(classType), Type.getType(javaClass>())) } override fun loadString(str: String): Value = ObjectValue(str, Type.getType(javaClass())) override fun newInstance(classType: Type): Value { - val _class = findClass(classType.getInternalName()) + val _class = findClass(classType) return NewObjectValue(_class, classType) } override fun isInstanceOf(value: Value, targetType: Type): Boolean { - val _class = findClass(targetType.getInternalName()) + val _class = findClass(targetType) return _class.isInstance(value.obj) } + [suppress("UNCHECKED_CAST")] override fun newArray(arrayType: Type, size: Int): Value { - throw UnsupportedOperationException() + return ObjectValue(JArray.newInstance(findClass(arrayType).getComponentType() as Class, size), arrayType) } + override fun newMultiDimensionalArray(arrayType: Type, dimensionSizes: List): Value { - throw UnsupportedOperationException() + return ObjectValue(ArrayHelper.newMultiArray(findClass(arrayType.getElementType()), *dimensionSizes.copyToArray()), arrayType) } + override fun getArrayLength(array: Value): Value { - throw UnsupportedOperationException() + return int(JArray.getLength(array.obj.checkNull())) } + override fun getArrayElement(array: Value, index: Value): Value { - throw UnsupportedOperationException() + val asmType = array.asmType + val elementType = if (asmType.getDimensions() == 1) asmType.getElementType() else Type.getType(asmType.getDescriptor().substring(1)) + val arr = array.obj.checkNull() + val ind = index.int + return when (elementType.getSort()) { + Type.BOOLEAN -> boolean(JArray.getBoolean(arr, ind)) + Type.BYTE -> byte(JArray.getByte(arr, ind)) + Type.SHORT -> short(JArray.getShort(arr, ind)) + Type.CHAR -> char(JArray.getChar(arr, ind)) + Type.INT -> int(JArray.getInt(arr, ind)) + Type.LONG -> long(JArray.getLong(arr, ind)) + Type.FLOAT -> float(JArray.getFloat(arr, ind)) + Type.DOUBLE -> double(JArray.getDouble(arr, ind)) + Type.OBJECT, + Type.ARRAY -> { + val value = JArray.get(arr, ind) + if (value == null) NULL_VALUE else ObjectValue(value, Type.getType(value.javaClass)) + } + else -> throw UnsupportedOperationException("Unsupported array element type: $elementType") + } } + override fun setArrayElement(array: Value, index: Value, newValue: Value) { - throw UnsupportedOperationException() + val arr = array.obj.checkNull() + val ind = index.int + if (array.asmType.getDimensions() > 1) { + JArray.set(arr, ind, newValue.obj) + return + } + val elementType = array.asmType.getElementType() + when (elementType.getSort()) { + Type.BOOLEAN -> JArray.setBoolean(arr, ind, newValue.boolean) + Type.BYTE -> JArray.setByte(arr, ind, newValue.int.toByte()) + Type.SHORT -> JArray.setShort(arr, ind, newValue.int.toShort()) + Type.CHAR -> JArray.setChar(arr, ind, newValue.int.toChar()) + Type.INT -> JArray.setInt(arr, ind, newValue.int) + Type.LONG -> JArray.setLong(arr, ind, newValue.long) + Type.FLOAT -> JArray.setFloat(arr, ind, newValue.float) + Type.DOUBLE -> JArray.setDouble(arr, ind, newValue.double) + Type.OBJECT, + Type.ARRAY -> { + JArray.set(arr, ind, newValue.obj) + } + else -> throw UnsupportedOperationException("Unsupported array element type: $elementType") + } } fun mayThrow(f: () -> T): T { @@ -184,12 +230,12 @@ object REFLECTION_EVAL : Eval { return objectToValue(result, methodDesc.returnType) } - fun findClass(memberDesc: MemberDescription): Class = findClass(memberDesc.ownerInternalName) + fun findClass(memberDesc: MemberDescription): Class = findClass(Type.getObjectType(memberDesc.ownerInternalName)) - fun findClass(internalName: String): Class { - val owner = lookup.findClass(internalName) - assertNotNull("Class not found: ${internalName}", owner) - return owner!! + fun findClass(asmType: Type): Class { + val owner = lookup.findClass(asmType) + assertNotNull("Class not found: ${asmType}", owner) + return owner as Class } override fun getField(instance: Value, fieldDesc: FieldDescription): Value { @@ -243,7 +289,21 @@ object REFLECTION_EVAL : Eval { class ReflectionLookup(val classLoader: ClassLoader) { [suppress("UNCHECKED_CAST")] - fun findClass(internalName: String): Class? = classLoader.loadClass(internalName.replace('/', '.')) as Class + fun findClass(asmType: Type): Class<*>? { + return when (asmType.getSort()) { + Type.BOOLEAN -> java.lang.Boolean.TYPE + Type.BYTE -> java.lang.Byte.TYPE + Type.SHORT -> java.lang.Short.TYPE + Type.CHAR -> java.lang.Character.TYPE + Type.INT -> java.lang.Integer.TYPE + Type.LONG -> java.lang.Long.TYPE + Type.FLOAT -> java.lang.Float.TYPE + Type.DOUBLE -> java.lang.Double.TYPE + Type.OBJECT -> classLoader.loadClass(asmType.getInternalName().replace('/', '.')) + Type.ARRAY -> Class.forName(asmType.getDescriptor().replace('/', '.')) + else -> throw UnsupportedOperationException("Unsupported type: $asmType") + } + } } [suppress("UNCHECKED_CAST")]