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