Convert stackMetadata to an extension property

It feels much more like a property than a function.

Signed-off-by: Graham <gpe@openrs2.dev>
Graham 4 years ago
parent b6f7576864
commit 47d1bc0bd2
  1. 2
      asm/src/main/java/dev/openrs2/asm/InsnListUtils.kt
  2. 59
      asm/src/main/java/dev/openrs2/asm/StackMetadata.kt
  3. 2
      deob/src/main/java/dev/openrs2/deob/transform/ConstantArgTransformer.kt

@ -14,7 +14,7 @@ fun getExpression(
var height = 0 var height = 0
var insn: AbstractInsnNode? = last var insn: AbstractInsnNode? = last
do { do {
val (pops, pushes) = insn!!.stackMetadata() val (pops, pushes) = insn!!.stackMetadata
if (insn !== last) { if (insn !== last) {
expr.add(insn) expr.add(insn)
height -= pushes height -= pushes

@ -181,36 +181,37 @@ private val SIMPLE_OPCODES = mapOf(
Opcodes.IFNONNULL to POP1 Opcodes.IFNONNULL to POP1
) )
fun AbstractInsnNode.stackMetadata(): StackMetadata = when (this) { val AbstractInsnNode.stackMetadata
is LdcInsnNode -> if (cst is Double || cst is Long) { get() = when (this) {
PUSH2 is LdcInsnNode -> if (cst is Double || cst is Long) {
} else { PUSH2
PUSH1
}
is FieldInsnNode -> {
val fieldSize = Type.getType(desc).size
var pushes = 0
var pops = 0
if (opcode == Opcodes.GETFIELD || opcode == Opcodes.PUTFIELD) {
pops++
}
if (opcode == Opcodes.PUTFIELD || opcode == Opcodes.PUTSTATIC) {
pops += fieldSize
} else { } else {
pushes += fieldSize PUSH1
} }
StackMetadata(pops, pushes) is FieldInsnNode -> {
} val fieldSize = Type.getType(desc).size
is MethodInsnNode -> { var pushes = 0
val argumentsAndReturnSizes = Type.getArgumentsAndReturnSizes(desc) var pops = 0
val pushes = argumentsAndReturnSizes and 0x3 if (opcode == Opcodes.GETFIELD || opcode == Opcodes.PUTFIELD) {
var pops = argumentsAndReturnSizes shr 2 pops++
if (opcode == Opcodes.INVOKESTATIC) { }
pops-- if (opcode == Opcodes.PUTFIELD || opcode == Opcodes.PUTSTATIC) {
pops += fieldSize
} else {
pushes += fieldSize
}
StackMetadata(pops, pushes)
}
is MethodInsnNode -> {
val argumentsAndReturnSizes = Type.getArgumentsAndReturnSizes(desc)
val pushes = argumentsAndReturnSizes and 0x3
var pops = argumentsAndReturnSizes shr 2
if (opcode == Opcodes.INVOKESTATIC) {
pops--
}
StackMetadata(pops, pushes)
} }
StackMetadata(pops, pushes) is InvokeDynamicInsnNode -> throw UnsupportedOperationException()
is MultiANewArrayInsnNode -> StackMetadata(dims, 1)
else -> SIMPLE_OPCODES[opcode] ?: throw IllegalArgumentException()
} }
is InvokeDynamicInsnNode -> throw UnsupportedOperationException()
is MultiANewArrayInsnNode -> StackMetadata(dims, 1)
else -> SIMPLE_OPCODES[opcode] ?: throw IllegalArgumentException()
}

@ -262,7 +262,7 @@ class ConstantArgTransformer : Transformer() {
} else if (!insn.pure) { } else if (!insn.pure) {
// can't replace instructions with a side effect // can't replace instructions with a side effect
continue continue
} else if (insn.stackMetadata().pushes != 1) { } else if (insn.stackMetadata.pushes != 1) {
// can't replace instructions pushing more than one result // can't replace instructions pushing more than one result
continue continue
} }

Loading…
Cancel
Save