From cec2111c29ff6ced7c47330e2d6503ff944d6ab6 Mon Sep 17 00:00:00 2001 From: Andrey Breslav Date: Sun, 6 Oct 2013 17:44:37 +0400 Subject: [PATCH] Coerce object types on return --- src/org/jetbrains/eval4j/interpreterLoop.kt | 11 +++++++++-- test/org/jetbrains/eval4j/test/TestData.java | 4 ++++ 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/src/org/jetbrains/eval4j/interpreterLoop.kt b/src/org/jetbrains/eval4j/interpreterLoop.kt index d4fd3e120a6..6762f9c4501 100644 --- a/src/org/jetbrains/eval4j/interpreterLoop.kt +++ b/src/org/jetbrains/eval4j/interpreterLoop.kt @@ -8,6 +8,7 @@ import org.objectweb.asm.Opcodes.* import org.objectweb.asm.tree.analysis.Interpreter import org.objectweb.asm.tree.JumpInsnNode import org.objectweb.asm.tree.VarInsnNode +import org.objectweb.asm.util.Printer trait InterpreterResult { fun toString(): String @@ -97,8 +98,14 @@ fun interpreterLoop( IRETURN, LRETURN, FRETURN, DRETURN, ARETURN -> { val value = frame.getStack(0)!! val expectedType = Type.getReturnType(m.desc) - if (value != NULL_VALUE && value.asmType != expectedType) { - assert(insnOpcode == IRETURN, "Only ints should be coerced") + if (expectedType.getSort() == Type.OBJECT) { + val coerced = if (value != NULL_VALUE && value.asmType != expectedType) + ObjectValue(value.obj, expectedType) + else value + return ValueReturned(coerced) + } + if (value.asmType != expectedType) { + assert(insnOpcode == IRETURN, "Only ints should be coerced: " + Printer.OPCODES[insnOpcode]) val coerced = when (expectedType.getSort()) { Type.BOOLEAN -> boolean(value.boolean) diff --git a/test/org/jetbrains/eval4j/test/TestData.java b/test/org/jetbrains/eval4j/test/TestData.java index 0e4b1524926..71a5acbd233 100644 --- a/test/org/jetbrains/eval4j/test/TestData.java +++ b/test/org/jetbrains/eval4j/test/TestData.java @@ -44,6 +44,10 @@ class TestData { return "str"; } + static Object returnStringAsObject() { + return "str"; + } + static int variable() { int i = 153; return i;