From 47fd67a9b0c61d2d323a57cd21f0c37264aedba8 Mon Sep 17 00:00:00 2001 From: Andrey Breslav Date: Sun, 6 Oct 2013 22:55:49 +0400 Subject: [PATCH] Get/Put instance field supported --- test/org/jetbrains/eval4j/test/TestData.java | 21 ++++++++ test/org/jetbrains/eval4j/test/main.kt | 50 +++++++++++++------- 2 files changed, 55 insertions(+), 16 deletions(-) diff --git a/test/org/jetbrains/eval4j/test/TestData.java b/test/org/jetbrains/eval4j/test/TestData.java index 39edc598bc7..505571333f6 100644 --- a/test/org/jetbrains/eval4j/test/TestData.java +++ b/test/org/jetbrains/eval4j/test/TestData.java @@ -166,4 +166,25 @@ class TestData { return f2 + f1; } + static class C { + int y = 15; + + static C newC() { + return new C(); + } + } + + static int testGetInstanceField() { + return C.newC().y; + } + + static int testPutInstanceField() { + C c = C.newC(); + c.y = 5; + int f1 = c.y; + c.y = 6; + int f2 = c.y; + return f1 + f2; + } + } diff --git a/test/org/jetbrains/eval4j/test/main.kt b/test/org/jetbrains/eval4j/test/main.kt index db04443bdc3..19204065999 100644 --- a/test/org/jetbrains/eval4j/test/main.kt +++ b/test/org/jetbrains/eval4j/test/main.kt @@ -10,7 +10,6 @@ import junit.framework.TestSuite import junit.framework.TestCase import java.lang.reflect.Method import java.lang.reflect.Field -import kotlin.test.assertNotNull fun suite(): TestSuite { val suite = TestSuite() @@ -132,40 +131,59 @@ object REFLECTION_EVAL : Eval { } override fun getStaticField(fieldDesc: FieldDescription): Value { - assertTrue(fieldDesc.isStatic) - val owner = lookup.findClass(fieldDesc.ownerInternalName) - assertNotNull("Class not found: ${fieldDesc.ownerInternalName}", owner) - val field = owner!!.findField(fieldDesc) - assertNotNull("Field not found: $fieldDesc", field) - val result = field!!.get(null) + val result = findStaticField(fieldDesc).get(null) return objectToValue(result, fieldDesc.fieldType) } override fun setStaticField(fieldDesc: FieldDescription, newValue: Value) { + findStaticField(fieldDesc).set(null, newValue.obj) + } + + fun findStaticField(fieldDesc: FieldDescription): Field { assertTrue(fieldDesc.isStatic) - val owner = lookup.findClass(fieldDesc.ownerInternalName) - assertNotNull("Class not found: ${fieldDesc.ownerInternalName}", owner) - val field = owner!!.findField(fieldDesc) + val field = findClass(fieldDesc).findField(fieldDesc) assertNotNull("Field not found: $fieldDesc", field) - field!!.set(null, newValue.obj) + assertTrue("Field is not static: $field", (field!!.getModifiers() and Modifier.STATIC) != 0) + return field } override fun invokeStaticMethod(methodDesc: MethodDescription, arguments: List): Value { assertTrue(methodDesc.isStatic) - val owner = lookup.findClass(methodDesc.ownerInternalName) - assertNotNull("Class not found: ${methodDesc.ownerInternalName}", owner) - val method = owner!!.findMethod(methodDesc) + val method = findClass(methodDesc).findMethod(methodDesc) assertNotNull("Method not found: $methodDesc", method) val result = method!!.invoke(null, *arguments.map { v -> v.obj }.copyToArray()) return objectToValue(result, methodDesc.returnType) } + fun findClass(memberDesc: MemberDescription): Class { + val owner = lookup.findClass(memberDesc.ownerInternalName) + assertNotNull("Class not found: ${memberDesc.ownerInternalName}", owner) + return owner!! + } + override fun getField(instance: Value, fieldDesc: FieldDescription): Value { - throw UnsupportedOperationException() + val obj = instance.obj + val field = findInstanceField(obj, fieldDesc) + + return objectToValue(field.get(obj), fieldDesc.fieldType) } + override fun setField(instance: Value, fieldDesc: FieldDescription, newValue: Value) { - throw UnsupportedOperationException() + val obj = instance.obj + val field = findInstanceField(obj, fieldDesc) + + field.set(obj, newValue.obj) } + + fun findInstanceField(obj: Any?, fieldDesc: FieldDescription): Field { + if (obj == null) throw NullPointerException() + + val _class: Class = obj.javaClass + val field = _class.findField(fieldDesc) + assertNotNull("Field not found: $fieldDesc", field) + return field!! + } + override fun invokeMethod(instance: Value, methodDesc: MethodDescription, arguments: List, invokespecial: Boolean): Value { throw UnsupportedOperationException() }