diff --git a/src/org/jetbrains/eval4j/interpreter.kt b/src/org/jetbrains/eval4j/interpreter.kt index fb8a32e39e0..ffb94efa01c 100644 --- a/src/org/jetbrains/eval4j/interpreter.kt +++ b/src/org/jetbrains/eval4j/interpreter.kt @@ -43,10 +43,7 @@ class SingleInstructionInterpreter(private val eval: Eval) : Interpreter( return NOT_A_VALUE } - return when (`type`.getSort()) { - Type.VOID -> null - else -> NotInitialized(`type`) - } + return makeNotInitializedValue(`type`) } override fun newOperation(insn: AbstractInsnNode): Value? { diff --git a/src/org/jetbrains/eval4j/values.kt b/src/org/jetbrains/eval4j/values.kt index 0974356d0d3..b8b4c095349 100644 --- a/src/org/jetbrains/eval4j/values.kt +++ b/src/org/jetbrains/eval4j/values.kt @@ -25,6 +25,13 @@ object VOID_VALUE: Value { override fun toString() = "VOID_VALUE" } +fun makeNotInitializedValue(t: Type): Value? { + return when (t.getSort()) { + Type.VOID -> null + else -> NotInitialized(t) + } +} + class NotInitialized(override val asmType: Type): Value { override val valid = false override fun toString() = "NotInitialized: $asmType" diff --git a/test/org/jetbrains/eval4j/test/main.kt b/test/org/jetbrains/eval4j/test/main.kt index 0ee8ee76ccc..d8b0b0e5a04 100644 --- a/test/org/jetbrains/eval4j/test/main.kt +++ b/test/org/jetbrains/eval4j/test/main.kt @@ -77,8 +77,7 @@ fun doTest(ownerClass: Class, methodNode: MethodNode): TestCase? { methodNode, initFrame( ownerClass.getInternalName(), - methodNode, - SingleInstructionInterpreter(REFLECTION_EVAL) + methodNode ), REFLECTION_EVAL ) @@ -88,30 +87,29 @@ fun doTest(ownerClass: Class, methodNode: MethodNode): TestCase? { } } -fun initFrame( +fun initFrame( owner: String, - m: MethodNode, - interpreter: Interpreter -): Frame { - val current = Frame(m.maxLocals, m.maxStack) - current.setReturn(interpreter.newValue(Type.getReturnType(m.desc))) + m: MethodNode +): Frame { + val current = Frame(m.maxLocals, m.maxStack) + current.setReturn(makeNotInitializedValue(Type.getReturnType(m.desc))) var local = 0 if ((m.access and ACC_STATIC) == 0) { val ctype = Type.getObjectType(owner) - current.setLocal(local++, interpreter.newValue(ctype)) + current.setLocal(local++, makeNotInitializedValue(ctype)) } val args = Type.getArgumentTypes(m.desc) for (i in 0..args.size - 1) { - current.setLocal(local++, interpreter.newValue(args[i])) + current.setLocal(local++, makeNotInitializedValue(args[i])) if (args[i].getSize() == 2) { - current.setLocal(local++, interpreter.newValue(null)) + current.setLocal(local++, NOT_A_VALUE) } } while (local < m.maxLocals) { - current.setLocal(local++, interpreter.newValue(null)) + current.setLocal(local++, NOT_A_VALUE) } return current