곱셈을위한 LDC 명령어를 변환하는 MethodVisitor를 작성하고 싶습니다.ASM : Stateful Transformation
예 바이트 코드 :
ldC#26
imul
이것은 기본적으로 상수 푸시 후 곱한다.
우선 상태가 변환되어야합니다. 왜냐하면 먼저 곱셈을하는지 확인해야하고, 그렇다면 ldc 명령으로 돌아가서 상수를 수정해야하기 때문입니다. 나는 이것에 대해 어떻게 생각하는지 완전히 모르겠다. 그리고 상수를 수정하는 법을 모르겠다. (다른 값을 전달하려했을 때, 오래된 값은 여전히 상수 풀에 남아 있었다.)
편집 :
public class AdditionTransformer extends MethodAdapter {
boolean replace = false;
int operand = 0;
AdditionTransformer(MethodVisitor mv) {
super(mv);
}
@Override
public void visitInsn(int opcode) {
if (opcode == IMUL && replace) {
operand *= 2;
visitLdcInsn(operand);
replace = false;
}
mv.visitInsn(opcode);
}
@Override
public void visitLdcInsn(Object cst) {
if (cst instanceof Integer && !replace) {
operand = (Integer) cst;
replace = true;
} else {
mv.visitLdcInsn(cst);
}
}
}
이 내가 가지고있는,하지만 상수 풀의 이전 값을 제거하지 않습니다, 그것은 버그가있을 수 있습니다.
ASM이 권장되는 것이 확실하므로 방문자 API를 사용하여 솔루션을 찾고자했습니다. 그러나이 경우 트리 API가 더 나은 선택 인 경우 살펴 보겠습니다. 감사. – someguy
지금처럼 방문자 API를 사용하면 상수 대신 자리를 바꿀 수 없습니다. 흐름에 여분의 코드를 추가하여 이전 값을 팝하고 새 값을 푸시해야합니다. 아마 당신은 ClassWriter의 하위 클래스를 조사해야합니다. 쓰기 상수를 사용하여이 거래를 재정의 할 수있는 몇 가지 가상 메소드가 있지만 의도 한 상수 만 수정한다는 것을 검증하는 것은 다소 복잡 할 수 있습니다. – oldrinb