Setting up equals()/hashCode() for values and results
This commit is contained in:
@@ -18,7 +18,7 @@ class ExceptionThrown(val exception: Value): InterpreterResult {
|
|||||||
override fun toString(): String = "Thrown $exception"
|
override fun toString(): String = "Thrown $exception"
|
||||||
}
|
}
|
||||||
|
|
||||||
class ValueReturned(val result: Value): InterpreterResult {
|
data class ValueReturned(val result: Value): InterpreterResult {
|
||||||
override fun toString(): String = "Returned $result"
|
override fun toString(): String = "Returned $result"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -11,15 +11,6 @@ trait Value : org.objectweb.asm.tree.analysis.Value {
|
|||||||
override fun toString(): String
|
override fun toString(): String
|
||||||
}
|
}
|
||||||
|
|
||||||
abstract class AbstractValue(
|
|
||||||
override val asmType: Type,
|
|
||||||
private val asString: String
|
|
||||||
) : Value {
|
|
||||||
override val valid = true
|
|
||||||
|
|
||||||
override fun toString() = asString
|
|
||||||
}
|
|
||||||
|
|
||||||
object NOT_A_VALUE: Value {
|
object NOT_A_VALUE: Value {
|
||||||
override val asmType = Type.getType("<invalid>")
|
override val asmType = Type.getType("<invalid>")
|
||||||
override val valid = false
|
override val valid = false
|
||||||
@@ -39,13 +30,32 @@ class NotInitialized(override val asmType: Type): Value {
|
|||||||
override fun toString() = "NotInitialized: $asmType"
|
override fun toString() = "NotInitialized: $asmType"
|
||||||
}
|
}
|
||||||
|
|
||||||
class IntValue(val value: Int, asmType: Type): AbstractValue(asmType, "$value")
|
abstract class AbstractValue<V>(
|
||||||
class LongValue(val value: Long): AbstractValue(Type.LONG_TYPE, "$value")
|
public val value: V,
|
||||||
class FloatValue(val value: Float): AbstractValue(Type.FLOAT_TYPE, "$value")
|
override val asmType: Type
|
||||||
class DoubleValue(val value: Double): AbstractValue(Type.DOUBLE_TYPE, "$value")
|
) : Value {
|
||||||
class ObjectValue(val value: Any?, asmType: Type): AbstractValue(asmType, "$value")
|
override val valid = true
|
||||||
|
|
||||||
class LabelValue(val value: LabelNode): AbstractValue(Type.VOID_TYPE, "label: ${value.getLabel()}")
|
override fun toString() = "$value: $asmType"
|
||||||
|
|
||||||
|
override fun equals(other: Any?): Boolean {
|
||||||
|
if (other !is AbstractValue<*>) return false
|
||||||
|
|
||||||
|
return value == other.value && asmType == other.asmType
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun hashCode(): Int {
|
||||||
|
return value.hashCode() + 17 * asmType.hashCode()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class IntValue(value: Int, asmType: Type): AbstractValue<Int>(value, asmType)
|
||||||
|
class LongValue(value: Long): AbstractValue<Long>(value, Type.LONG_TYPE)
|
||||||
|
class FloatValue(value: Float): AbstractValue<Float>(value, Type.FLOAT_TYPE)
|
||||||
|
class DoubleValue(value: Double): AbstractValue<Double>(value, Type.DOUBLE_TYPE)
|
||||||
|
class ObjectValue(value: Any?, asmType: Type): AbstractValue<Any?>(value, asmType)
|
||||||
|
|
||||||
|
class LabelValue(value: LabelNode): AbstractValue<LabelNode>(value, 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