diff --git a/src/org/jetbrains/eval4j/interpreter.kt b/src/org/jetbrains/eval4j/interpreter.kt index 6afb6f85535..e6a75c4ffb1 100644 --- a/src/org/jetbrains/eval4j/interpreter.kt +++ b/src/org/jetbrains/eval4j/interpreter.kt @@ -19,6 +19,7 @@ class UnsupportedByteCodeException(message: String) : RuntimeException(message) trait Eval { fun loadClass(classType: Type): Value + fun loadString(str: String): Value fun newInstance(classType: Type): Value fun checkCast(value: Value, targetType: Type): Value fun isInsetanceOf(value: Value, targetType: Type): Boolean @@ -83,7 +84,7 @@ class SingleInstructionInterpreter(private val eval: Eval) : Interpreter( is Float -> float(cst) is Long -> long(cst) is Double -> double(cst) - is String -> obj(cst) + is String -> eval.loadString(cst) is Type -> { val sort = (cst as Type).getSort() when (sort) { diff --git a/src/org/jetbrains/eval4j/interpreterLoop.kt b/src/org/jetbrains/eval4j/interpreterLoop.kt index b3edf0705ec..d4fd3e120a6 100644 --- a/src/org/jetbrains/eval4j/interpreterLoop.kt +++ b/src/org/jetbrains/eval4j/interpreterLoop.kt @@ -97,7 +97,7 @@ fun interpreterLoop( IRETURN, LRETURN, FRETURN, DRETURN, ARETURN -> { val value = frame.getStack(0)!! val expectedType = Type.getReturnType(m.desc) - if (value.asmType != expectedType) { + if (value != NULL_VALUE && value.asmType != expectedType) { assert(insnOpcode == IRETURN, "Only ints should be coerced") val coerced = when (expectedType.getSort()) { diff --git a/src/org/jetbrains/eval4j/values.kt b/src/org/jetbrains/eval4j/values.kt index d4235c3273c..bde6987d79c 100644 --- a/src/org/jetbrains/eval4j/values.kt +++ b/src/org/jetbrains/eval4j/values.kt @@ -65,7 +65,7 @@ fun int(v: Int) = IntValue(v, Type.INT_TYPE) fun long(v: Long) = LongValue(v) fun float(v: Float) = FloatValue(v) fun double(v: Double) = DoubleValue(v) -fun obj(v: T, t: Type = if (v != null) Type.getType(v.javaClass) else Type.getType(javaClass())) = ObjectValue(v, t) +//fun obj(v: T, t: Type = if (v != null) Type.getType(v.javaClass) else Type.getType(javaClass())) = ObjectValue(v, t) val NULL_VALUE = ObjectValue(null, Type.getObjectType("null")) diff --git a/test/org/jetbrains/eval4j/test/TestData.java b/test/org/jetbrains/eval4j/test/TestData.java index 60ffb645e71..0e4b1524926 100644 --- a/test/org/jetbrains/eval4j/test/TestData.java +++ b/test/org/jetbrains/eval4j/test/TestData.java @@ -36,6 +36,14 @@ class TestData { return 2.0d; } + static Object returnNull() { + return null; + } + + static String returnString() { + return "str"; + } + static int variable() { int i = 153; return i; @@ -131,4 +139,5 @@ class TestData { } return i; } + } diff --git a/test/org/jetbrains/eval4j/test/main.kt b/test/org/jetbrains/eval4j/test/main.kt index 7b40eeb314d..5ea8a7f1099 100644 --- a/test/org/jetbrains/eval4j/test/main.kt +++ b/test/org/jetbrains/eval4j/test/main.kt @@ -58,7 +58,7 @@ fun doTest(ownerClass: Class, methodNode: MethodNode): TestCase? { Type.LONG -> ValueReturned(long(result as Long)) Type.DOUBLE -> ValueReturned(double(result as Double)) Type.FLOAT -> ValueReturned(float(result as Float)) - Type.OBJECT -> ValueReturned(obj(result)) + Type.OBJECT -> ValueReturned(if (result == null) NULL_VALUE else ObjectValue(result, returnType)) else -> { println("Unsupported result type: $returnType") return null @@ -92,6 +92,8 @@ object REFLECTION_EVAL : Eval { override fun loadClass(classType: Type): Value { throw UnsupportedOperationException() } + override fun loadString(str: String): Value = ObjectValue(str, Type.getType(javaClass())) + override fun newInstance(classType: Type): Value { throw UnsupportedOperationException() }