Using LabelNode instead of bare Label
This commit is contained in:
@@ -13,7 +13,7 @@ import org.objectweb.asm.tree.MultiANewArrayInsnNode
|
|||||||
import org.objectweb.asm.tree.TypeInsnNode
|
import org.objectweb.asm.tree.TypeInsnNode
|
||||||
import org.objectweb.asm.tree.JumpInsnNode
|
import org.objectweb.asm.tree.JumpInsnNode
|
||||||
import org.objectweb.asm.tree.IincInsnNode
|
import org.objectweb.asm.tree.IincInsnNode
|
||||||
import org.objectweb.asm.Label
|
import org.objectweb.asm.tree.LabelNode
|
||||||
|
|
||||||
class UnsupportedByteCodeException(message: String) : RuntimeException(message)
|
class UnsupportedByteCodeException(message: String) : RuntimeException(message)
|
||||||
|
|
||||||
@@ -39,7 +39,7 @@ trait Eval {
|
|||||||
}
|
}
|
||||||
|
|
||||||
trait Control {
|
trait Control {
|
||||||
fun jump(label: Label)
|
fun jump(label: LabelNode)
|
||||||
|
|
||||||
fun returnValue(value: Value)
|
fun returnValue(value: Value)
|
||||||
fun throwException(value: Value)
|
fun throwException(value: Value)
|
||||||
@@ -103,7 +103,7 @@ class SingleInstructionInterpreter(private val eval: Eval, private val control:
|
|||||||
else -> throw UnsupportedByteCodeException("Illegal LDC constant " + cst)
|
else -> throw UnsupportedByteCodeException("Illegal LDC constant " + cst)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
JSR -> LabelValue((insn as JumpInsnNode).label.getLabel())
|
JSR -> LabelValue((insn as JumpInsnNode).label)
|
||||||
GETSTATIC -> eval.getStaticField((insn as FieldInsnNode).desc)
|
GETSTATIC -> eval.getStaticField((insn as FieldInsnNode).desc)
|
||||||
NEW -> eval.newInstance(Type.getType((insn as TypeInsnNode).desc))
|
NEW -> eval.newInstance(Type.getType((insn as TypeInsnNode).desc))
|
||||||
else -> throw UnsupportedByteCodeException("$insn")
|
else -> throw UnsupportedByteCodeException("$insn")
|
||||||
@@ -141,7 +141,7 @@ class SingleInstructionInterpreter(private val eval: Eval, private val control:
|
|||||||
F2D -> double(value.float.toDouble())
|
F2D -> double(value.float.toDouble())
|
||||||
|
|
||||||
IFEQ, IFNE, IFLT, IFGE, IFGT, IFLE, IFNULL, IFNONNULL -> {
|
IFEQ, IFNE, IFLT, IFGE, IFGT, IFLE, IFNULL, IFNONNULL -> {
|
||||||
val label = (insn as JumpInsnNode).label.getLabel()
|
val label = (insn as JumpInsnNode).label
|
||||||
when (insn.getOpcode()) {
|
when (insn.getOpcode()) {
|
||||||
IFEQ -> if (value.int == 0) control.jump(label)
|
IFEQ -> if (value.int == 0) control.jump(label)
|
||||||
IFNE -> if (value.int != 0) control.jump(label)
|
IFNE -> if (value.int != 0) control.jump(label)
|
||||||
@@ -290,7 +290,7 @@ class SingleInstructionInterpreter(private val eval: Eval, private val control:
|
|||||||
}
|
}
|
||||||
|
|
||||||
IF_ICMPEQ, IF_ICMPNE, IF_ICMPLT, IF_ICMPGE, IF_ICMPGT, IF_ICMPLE, IF_ACMPEQ, IF_ACMPNE -> {
|
IF_ICMPEQ, IF_ICMPNE, IF_ICMPLT, IF_ICMPGE, IF_ICMPGT, IF_ICMPLE, IF_ACMPEQ, IF_ACMPNE -> {
|
||||||
val label = (insn as JumpInsnNode).label.getLabel()
|
val label = (insn as JumpInsnNode).label
|
||||||
when (insn.getOpcode()) {
|
when (insn.getOpcode()) {
|
||||||
IF_ICMPEQ -> if (value1.int == value2.int) control.jump(label)
|
IF_ICMPEQ -> if (value1.int == value2.int) control.jump(label)
|
||||||
IF_ICMPNE -> if (value1.int != value2.int) control.jump(label)
|
IF_ICMPNE -> if (value1.int != value2.int) control.jump(label)
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
package org.jetbrains.eval4j
|
package org.jetbrains.eval4j
|
||||||
|
|
||||||
import org.objectweb.asm.Type
|
import org.objectweb.asm.Type
|
||||||
import org.objectweb.asm.Label
|
import org.objectweb.asm.tree.LabelNode
|
||||||
|
|
||||||
trait Value : org.objectweb.asm.tree.analysis.Value {
|
trait Value : org.objectweb.asm.tree.analysis.Value {
|
||||||
val asmType: Type
|
val asmType: Type
|
||||||
@@ -31,7 +31,7 @@ class FloatValue(val value: Float): AbstractValue(Type.FLOAT_TYPE)
|
|||||||
class DoubleValue(val value: Double): AbstractValue(Type.DOUBLE_TYPE)
|
class DoubleValue(val value: Double): AbstractValue(Type.DOUBLE_TYPE)
|
||||||
class ObjectValue(val value: Any?, asmType: Type): AbstractValue(asmType)
|
class ObjectValue(val value: Any?, asmType: Type): AbstractValue(asmType)
|
||||||
|
|
||||||
class LabelValue(val value: Label): AbstractValue(Type.VOID_TYPE)
|
class LabelValue(val value: LabelNode): AbstractValue(Type.VOID_TYPE)
|
||||||
|
|
||||||
fun boolean(v: Boolean) = IntValue(if (v) 1 else 0, Type.BOOLEAN_TYPE)
|
fun boolean(v: Boolean) = IntValue(if (v) 1 else 0, Type.BOOLEAN_TYPE)
|
||||||
fun byte(v: Byte) = IntValue(v.toInt(), Type.BYTE_TYPE)
|
fun byte(v: Byte) = IntValue(v.toInt(), Type.BYTE_TYPE)
|
||||||
|
|||||||
Reference in New Issue
Block a user