1/* 2 * Copyright 2003 The Apache Software Foundation 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16package org.mockito.cglib.transform; 17 18import org.mockito.asm.*; 19 20public class MethodVisitorTee implements MethodVisitor { 21 private final MethodVisitor mv1; 22 private final MethodVisitor mv2; 23 24 public MethodVisitorTee(MethodVisitor mv1, MethodVisitor mv2) { 25 this.mv1 = mv1; 26 this.mv2 = mv2; 27 } 28 29 public void visitFrame(int type, int nLocal, Object[] local, int nStack, Object[] stack) { 30 mv1.visitFrame(type, nLocal, local, nStack, stack); 31 mv2.visitFrame(type, nLocal, local, nStack, stack); 32 } 33 34 public AnnotationVisitor visitAnnotationDefault() { 35 return AnnotationVisitorTee.getInstance(mv1.visitAnnotationDefault(), 36 mv2.visitAnnotationDefault()); 37 } 38 39 public AnnotationVisitor visitAnnotation(String desc, boolean visible) { 40 return AnnotationVisitorTee.getInstance(mv1.visitAnnotation(desc, visible), 41 mv2.visitAnnotation(desc, visible)); 42 } 43 44 public AnnotationVisitor visitParameterAnnotation(int parameter, 45 String desc, 46 boolean visible) { 47 return AnnotationVisitorTee.getInstance(mv1.visitParameterAnnotation(parameter, desc, visible), 48 mv2.visitParameterAnnotation(parameter, desc, visible)); 49 } 50 51 public void visitAttribute(Attribute attr) { 52 mv1.visitAttribute(attr); 53 mv2.visitAttribute(attr); 54 } 55 56 public void visitCode() { 57 mv1.visitCode(); 58 mv2.visitCode(); 59 } 60 61 public void visitInsn(int opcode) { 62 mv1.visitInsn(opcode); 63 mv2.visitInsn(opcode); 64 } 65 66 public void visitIntInsn(int opcode, int operand) { 67 mv1.visitIntInsn(opcode, operand); 68 mv2.visitIntInsn(opcode, operand); 69 } 70 71 public void visitVarInsn(int opcode, int var) { 72 mv1.visitVarInsn(opcode, var); 73 mv2.visitVarInsn(opcode, var); 74 } 75 76 public void visitTypeInsn(int opcode, String desc) { 77 mv1.visitTypeInsn(opcode, desc); 78 mv2.visitTypeInsn(opcode, desc); 79 } 80 81 public void visitFieldInsn(int opcode, String owner, String name, String desc) { 82 mv1.visitFieldInsn(opcode, owner, name, desc); 83 mv2.visitFieldInsn(opcode, owner, name, desc); 84 } 85 86 public void visitMethodInsn(int opcode, String owner, String name, String desc) { 87 mv1.visitMethodInsn(opcode, owner, name, desc); 88 mv2.visitMethodInsn(opcode, owner, name, desc); 89 } 90 91 public void visitJumpInsn(int opcode, Label label) { 92 mv1.visitJumpInsn(opcode, label); 93 mv2.visitJumpInsn(opcode, label); 94 } 95 96 public void visitLabel(Label label) { 97 mv1.visitLabel(label); 98 mv2.visitLabel(label); 99 } 100 101 public void visitLdcInsn(Object cst) { 102 mv1.visitLdcInsn(cst); 103 mv2.visitLdcInsn(cst); 104 } 105 106 public void visitIincInsn(int var, int increment) { 107 mv1.visitIincInsn(var, increment); 108 mv2.visitIincInsn(var, increment); 109 } 110 111 public void visitTableSwitchInsn(int min, int max, Label dflt, Label labels[]) { 112 mv1.visitTableSwitchInsn(min, max, dflt, labels); 113 mv2.visitTableSwitchInsn(min, max, dflt, labels); 114 } 115 116 public void visitLookupSwitchInsn(Label dflt, int keys[], Label labels[]) { 117 mv1.visitLookupSwitchInsn(dflt, keys, labels); 118 mv2.visitLookupSwitchInsn(dflt, keys, labels); 119 } 120 121 public void visitMultiANewArrayInsn(String desc, int dims) { 122 mv1.visitMultiANewArrayInsn(desc, dims); 123 mv2.visitMultiANewArrayInsn(desc, dims); 124 } 125 126 public void visitTryCatchBlock(Label start, Label end, Label handler, String type) { 127 mv1.visitTryCatchBlock(start, end, handler, type); 128 mv2.visitTryCatchBlock(start, end, handler, type); 129 } 130 131 public void visitLocalVariable(String name, String desc, String signature, Label start, Label end, int index) { 132 mv1.visitLocalVariable(name, desc, signature, start, end, index); 133 mv2.visitLocalVariable(name, desc, signature, start, end, index); 134 } 135 136 public void visitLineNumber(int line, Label start) { 137 mv1.visitLineNumber(line, start); 138 mv2.visitLineNumber(line, start); 139 } 140 141 public void visitMaxs(int maxStack, int maxLocals) { 142 mv1.visitMaxs(maxStack, maxLocals); 143 mv2.visitMaxs(maxStack, maxLocals); 144 } 145 146 public void visitEnd() { 147 mv1.visitEnd(); 148 mv2.visitEnd(); 149 } 150} 151 152