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")]