Voglio scrivere un MethodVisitor che trasforma le istruzioni LDC che sono per la moltiplicazione.ASM: Stateful Transformation
Esempio bytecode:
ldC#26
imul
Questo spinge sostanzialmente costante e quindi moltiplica.
Deve essere una trasformazione stateful perché prima devo verificare che sia per moltiplicare e, se lo è, ho bisogno di tornare all'istruzione ldc e modificare la costante. Non sono del tutto sicuro di come andrei su questo, e non so come modificare la costante (quando ho provato a passare un valore diverso, il vecchio valore rimaneva ancora nel pool costante).
Edit:
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);
}
}
}
Questo è quello che ho, ma non rimuovere il vecchio valore nel pool di costante, e può avere bug.
Ero appassionato di cercare una soluzione utilizzando l'API del visitatore, poiché ASM ha reso abbastanza chiaro che è raccomandato. Tuttavia, se l'API tree è la scelta migliore in questo caso, cercherò di esaminarla. Grazie. – someguy
Utilizzando l'API visitatore come sei, non puoi semplicemente sostituire la costante sul posto; dovresti aggiungere altro codice al flusso per inserire il vecchio valore e spingerne uno nuovo. Forse dovresti, comunque, guardare in ClassWriter per sottoclassi; ci sono alcuni metodi virtuali che puoi sovrascrivere che riguardano le costanti di scrittura, anche se potrebbe essere un po 'complesso verificare che stai modificando solo la costante che intendi. – oldrinb