Open-source multiplayer game server compatible with the RuneScape client
https://www.openrs2.org/
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
77 lines
2.4 KiB
77 lines
2.4 KiB
package org.openrs2.deob.bytecode.analysis
|
|
|
|
import org.objectweb.asm.Opcodes.IFEQ
|
|
import org.objectweb.asm.Opcodes.IFGE
|
|
import org.objectweb.asm.Opcodes.IFGT
|
|
import org.objectweb.asm.Opcodes.IFLE
|
|
import org.objectweb.asm.Opcodes.IFLT
|
|
import org.objectweb.asm.Opcodes.IFNE
|
|
import org.objectweb.asm.Opcodes.IF_ICMPEQ
|
|
import org.objectweb.asm.Opcodes.IF_ICMPGE
|
|
import org.objectweb.asm.Opcodes.IF_ICMPGT
|
|
import org.objectweb.asm.Opcodes.IF_ICMPLE
|
|
import org.objectweb.asm.Opcodes.IF_ICMPLT
|
|
import org.objectweb.asm.Opcodes.IF_ICMPNE
|
|
|
|
public object IntBranch {
|
|
public fun evaluateUnary(opcode: Int, values: Set<Int>): IntBranchResult {
|
|
require(values.isNotEmpty())
|
|
|
|
var taken = 0
|
|
var notTaken = 0
|
|
|
|
for (v in values) {
|
|
if (evaluateUnary(opcode, v)) {
|
|
taken++
|
|
} else {
|
|
notTaken++
|
|
}
|
|
}
|
|
|
|
return IntBranchResult.fromTakenNotTaken(taken, notTaken)
|
|
}
|
|
|
|
private fun evaluateUnary(opcode: Int, value: Int): Boolean {
|
|
return when (opcode) {
|
|
IFEQ -> value == 0
|
|
IFNE -> value != 0
|
|
IFLT -> value < 0
|
|
IFGE -> value >= 0
|
|
IFGT -> value > 0
|
|
IFLE -> value <= 0
|
|
else -> throw IllegalArgumentException("Opcode $opcode is not a unary conditional branch instruction")
|
|
}
|
|
}
|
|
|
|
public fun evaluateBinary(opcode: Int, values1: Set<Int>, values2: Set<Int>): IntBranchResult {
|
|
require(values1.isNotEmpty())
|
|
require(values2.isNotEmpty())
|
|
|
|
var taken = 0
|
|
var notTaken = 0
|
|
|
|
for (v1 in values1) {
|
|
for (v2 in values2) {
|
|
if (evaluateBinary(opcode, v1, v2)) {
|
|
taken++
|
|
} else {
|
|
notTaken++
|
|
}
|
|
}
|
|
}
|
|
|
|
return IntBranchResult.fromTakenNotTaken(taken, notTaken)
|
|
}
|
|
|
|
private fun evaluateBinary(opcode: Int, value1: Int, value2: Int): Boolean {
|
|
return when (opcode) {
|
|
IF_ICMPEQ -> value1 == value2
|
|
IF_ICMPNE -> value1 != value2
|
|
IF_ICMPLT -> value1 < value2
|
|
IF_ICMPGE -> value1 >= value2
|
|
IF_ICMPGT -> value1 > value2
|
|
IF_ICMPLE -> value1 <= value2
|
|
else -> throw IllegalArgumentException("Opcode $opcode is not a binary conditional branch instruction")
|
|
}
|
|
}
|
|
}
|
|
|