/* * Copyright (c) 2007 Mockito contributors * This program is made available under the terms of the MIT License. */ package org.powermock.api.mockito.repackaged.cglib.transform.impl; import org.powermock.api.mockito.repackaged.asm.Type; import org.powermock.api.mockito.repackaged.cglib.core.Block; import org.powermock.api.mockito.repackaged.cglib.core.CodeEmitter; import org.powermock.api.mockito.repackaged.cglib.core.Constants; import org.powermock.api.mockito.repackaged.cglib.core.EmitUtils; import org.powermock.api.mockito.repackaged.cglib.core.Signature; import org.powermock.api.mockito.repackaged.cglib.core.TypeUtils; import org.powermock.api.mockito.repackaged.cglib.transform.ClassEmitterTransformer; import java.lang.reflect.Constructor; public class UndeclaredThrowableTransformer extends ClassEmitterTransformer { private Type wrapper; public UndeclaredThrowableTransformer(Class wrapper) { this.wrapper = Type.getType(wrapper); boolean found = false; Constructor[] cstructs = wrapper.getConstructors(); for (int i = 0; i < cstructs.length; i++) { Class[] types = cstructs[i].getParameterTypes(); if (types.length == 1 && types[0].equals(Throwable.class)) { found = true; break; } } if (!found) throw new IllegalArgumentException(wrapper + " does not have a single-arg constructor that takes a Throwable"); } public CodeEmitter begin_method(int access, final Signature sig, final Type[] exceptions) { CodeEmitter e = super.begin_method(access, sig, exceptions); if (TypeUtils.isAbstract(access) || sig.equals(Constants.SIG_STATIC)) { return e; } return new CodeEmitter(e) { private Block handler; /* init */ { handler = begin_block(); } public void visitMaxs(int maxStack, int maxLocals) { handler.end(); EmitUtils.wrap_undeclared_throwable(this, handler, exceptions, wrapper); super.visitMaxs(maxStack, maxLocals); } }; } }