From 517ccf347ce0e79a4f5f557af9f7402ee6e60e05 Mon Sep 17 00:00:00 2001 From: Andrey Breslav Date: Sun, 13 Oct 2013 12:29:07 +0400 Subject: [PATCH] Support arrays --- src/org/jetbrains/eval4j/jdi/jdiEval.kt | 43 +++++++++++++++++++++---- 1 file changed, 36 insertions(+), 7 deletions(-) diff --git a/src/org/jetbrains/eval4j/jdi/jdiEval.kt b/src/org/jetbrains/eval4j/jdi/jdiEval.kt index 5743a462d0d..f9e09e380cc 100644 --- a/src/org/jetbrains/eval4j/jdi/jdiEval.kt +++ b/src/org/jetbrains/eval4j/jdi/jdiEval.kt @@ -44,24 +44,53 @@ class JDIEval( listOf(value)).boolean } + fun Type.asReferenceType(): jdi.ReferenceType = loadClass(this).jdiClass!!.reflectedType() + fun Type.asArrayType(): jdi.ArrayType = asReferenceType() as jdi.ArrayType + override fun newArray(arrayType: Type, size: Int): Value { - throw UnsupportedOperationException() + val jdiArrayType = arrayType.asArrayType() + return jdiArrayType.newInstance(size).asValue() } + + private val Type.arrayElementType: Type + get(): Type { + assert(getSort() == Type.ARRAY, "Not an array type: $this") + return Type.getType(getDescriptor().substring(1)) + } + + private fun fillArray(elementType: Type, size: Int, nestedSizes: List): Value { + val arr = newArray(Type.getType("[" + elementType.getDescriptor()), size) + if (!nestedSizes.isEmpty()) { + val nestedElementType = elementType.arrayElementType + val nestedSize = nestedSizes[0] + val tail = nestedSizes.tail + for (i in 0..size - 1) { + setArrayElement(arr, int(i), fillArray(nestedElementType, nestedSize, tail)) + } + } + return arr + } + override fun newMultiDimensionalArray(arrayType: Type, dimensionSizes: List): Value { - throw UnsupportedOperationException() + return fillArray(arrayType.arrayElementType, dimensionSizes[0], dimensionSizes.tail) } + + private fun Value.array() = jdiObj.checkNull() as jdi.ArrayReference + override fun getArrayLength(array: Value): Value { - throw UnsupportedOperationException() + return int(array.array().length()) } + override fun getArrayElement(array: Value, index: Value): Value { - throw UnsupportedOperationException() + return array.array().getValue(index.int).asValue() } + override fun setArrayElement(array: Value, index: Value, newValue: Value) { - throw UnsupportedOperationException() + array.array().setValue(index.int, newValue.asJdiValue(vm)) } private fun findField(fieldDesc: FieldDescription): jdi.Field { - val _class = loadClass(fieldDesc.ownerType).jdiClass!!.reflectedType() + val _class = fieldDesc.ownerType.asReferenceType() val field = _class.fieldByName(fieldDesc.name) if (field == null) { throwException(NoSuchFieldError("Field not found: $fieldDesc")) @@ -98,7 +127,7 @@ class JDIEval( } private fun findMethod(methodDesc: MethodDescription): jdi.Method { - val _class = loadClass(methodDesc.ownerType).jdiClass!!.reflectedType() + val _class = methodDesc.ownerType.asReferenceType() val method = when (_class) { is jdi.ClassType -> { val m = _class.concreteMethodByName(methodDesc.name, methodDesc.desc)