Tratamento de exceções através de manipulação de bytecode com ASM

Olá Pessoal,

Já postei essa mensagem no forum do ASM mas não obtive resposta (aparentemente o problema não é tão trivial).

Basicamente preciso injentar (via manipulação de bytecode) uma chamada a um tratador de exceção específico em cada catch de cada método da minha classe. O tratador de exceções possui a assinatura descrita abaixo, sendo que a quantidade de parâmetros varia de acordo com o método tratado:

Throwable  org.codecompany.jeha.core.handle(Throwable throwable, Object... methodParams)

Após manipulação do bytecode, o método deveria ter a estrutura exibida abaixo. Perceba que os parâmetros do método são passados ao tratador através de vargs.

[code]public void test(int x, Object y) {
try {
int y = 10 / 0;
}
catch (ArithmeticException e) {
// essa chamada deve ser inserida na primeira linha de cada catch:
// org.codecompany.jeha.core.HandlerUtil.handle(e, x, y);

  // algum tratamento existente

}
catch (Exception e) {
// essa chamada deve ser inserida na primeira linha de cada catch:
// org.codecompany.jeha.core.HandlerUtil.handle(e, x, y);

 // algum tratamento existente

}
}[/code]

O rascunho da classe que implementa a manipulação é exibida abaixo. Estou empacado.

package org.codecompany.jeha.asm;

import java.util.Iterator;

import org.objectweb.asm.ClassAdapter;
import org.objectweb.asm.ClassVisitor;
import org.objectweb.asm.Opcodes;
import org.objectweb.asm.tree.AbstractInsnNode;
import org.objectweb.asm.tree.ClassNode;
import org.objectweb.asm.tree.InsnList;
import org.objectweb.asm.tree.InsnNode;
import org.objectweb.asm.tree.LabelNode;
import org.objectweb.asm.tree.MethodInsnNode;
import org.objectweb.asm.tree.MethodNode;
import org.objectweb.asm.tree.TryCatchBlockNode;
import org.objectweb.asm.tree.TypeInsnNode;
import org.objectweb.asm.tree.VarInsnNode;

public class Tree extends ClassAdapter implements Opcodes {
	
	private ClassVisitor next;

	public Tree(ClassVisitor cv) {
		super(new ClassNode());
		next = cv;
	}

	@Override
	public void visitEnd() {
		ClassNode cn = (ClassNode) cv;
		transform(cn);
		cn.accept(next);
	}

	@SuppressWarnings("unchecked")
	public void transform(ClassNode cn) {
		Iterator methods = cn.methods.iterator();
		while (methods.hasNext()) {
			MethodNode mn = (MethodNode) methods.next();
			Iterator blocks = mn.tryCatchBlocks.iterator();

			// 1. identifica os parametros do metodo (methodParam1, methodParam2, etc.)

			// para cada bloco catch...
			while (blocks.hasNext()) {
				TryCatchBlockNode block = (TryCatchBlockNode) blocks.next();
				LabelNode handler = block.handler;
				InsnList il = mn.instructions;
				// 2. identifica o parametro da excecao
				// 3. chama org.codecompany.jeha.core.handle(exceptionParam, methodParam1, methodParam2, etc.)
			}
		}
	}
}

Alguém se habilita?

Obrigado,