1674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen/*
2674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * Copyright 2003,2004 The Apache Software Foundation
3674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen *
4674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen *  Licensed under the Apache License, Version 2.0 (the "License");
5674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * you may not use this file except in compliance with the License.
6674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * You may obtain a copy of the License at
7674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen *
8674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen *      http://www.apache.org/licenses/LICENSE-2.0
9674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen *
10674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen *  Unless required by applicable law or agreed to in writing, software
11674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * distributed under the License is distributed on an "AS IS" BASIS,
12674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * See the License for the specific language governing permissions and
14674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen * limitations under the License.
15674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen */
16674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogenpackage org.mockito.cglib.proxy;
17674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
18674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogenimport java.util.*;
19674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
20674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogenimport org.mockito.asm.Type;
21674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogenimport org.mockito.cglib.core.*;
22674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
23674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogenclass DispatcherGenerator implements CallbackGenerator {
24674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    public static final DispatcherGenerator INSTANCE =
25674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen      new DispatcherGenerator(false);
26674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    public static final DispatcherGenerator PROXY_REF_INSTANCE =
27674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen      new DispatcherGenerator(true);
28674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
29674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    private static final Type DISPATCHER =
30674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen      TypeUtils.parseType("org.mockito.cglib.proxy.Dispatcher");
31674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    private static final Type PROXY_REF_DISPATCHER =
32674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen      TypeUtils.parseType("org.mockito.cglib.proxy.ProxyRefDispatcher");
33674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    private static final Signature LOAD_OBJECT =
34674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen      TypeUtils.parseSignature("Object loadObject()");
35674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    private static final Signature PROXY_REF_LOAD_OBJECT =
36674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen      TypeUtils.parseSignature("Object loadObject(Object)");
37674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
38674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    private boolean proxyRef;
39674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
40674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    private DispatcherGenerator(boolean proxyRef) {
41674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        this.proxyRef = proxyRef;
42674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    }
43674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
44674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    public void generate(ClassEmitter ce, Context context, List methods) {
45674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        for (Iterator it = methods.iterator(); it.hasNext();) {
46674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            MethodInfo method = (MethodInfo)it.next();
47674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            if (!TypeUtils.isProtected(method.getModifiers())) {
48674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                CodeEmitter e = context.beginMethod(ce, method);
49674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                context.emitCallback(e, context.getIndex(method));
50674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                if (proxyRef) {
51674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                    e.load_this();
52674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                    e.invoke_interface(PROXY_REF_DISPATCHER, PROXY_REF_LOAD_OBJECT);
53674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                } else {
54674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                    e.invoke_interface(DISPATCHER, LOAD_OBJECT);
55674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                }
56674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                e.checkcast(method.getClassInfo().getType());
57674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                e.load_args();
58674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                e.invoke(method);
59674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                e.return_value();
60674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen                e.end_method();
61674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen            }
62674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen        }
63674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    }
64674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen
65674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen    public void generateStatic(CodeEmitter e, Context context, List methods) { }
66674060f01e9090cd21b3c5656cc3204912ad17a6Jon Boekenoogen}
67