View Javadoc

1   /***************************************************************************************
2    * Copyright (c) Jonas BonŽr, Alexandre Vasseur. All rights reserved.                 *
3    * http://aspectwerkz.codehaus.org                                                    *
4    * ---------------------------------------------------------------------------------- *
5    * The software in this package is published under the terms of the LGPL license      *
6    * a copy of which has been included with this distribution in the license.txt file.  *
7    **************************************************************************************/
8   package org.codehaus.aspectwerkz.transform.inlining.compiler;
9   
10  import org.objectweb.asm.CodeVisitor;
11  import org.objectweb.asm.Type;
12  
13  import org.codehaus.aspectwerkz.transform.inlining.AsmHelper;
14  
15  /***
16   * Redefines the existing join point class and turns it into a delegation class delegating to the newly created
17   * replacement join point class.
18   *
19   * @author <a href="mailto:jboner@codehaus.org">Jonas BonŽr </a>
20   */
21  public class MethodExecutionJoinPointRedefiner extends MethodExecutionJoinPointCompiler {
22  
23      /***
24       * The redefined model.
25       */
26      private final CompilationInfo.Model m_redefinedModel;
27  
28      /***
29       * Creates a new join point compiler instance.
30       *
31       * @param model
32       */
33      MethodExecutionJoinPointRedefiner(final CompilationInfo model) {
34          super(model.getInitialModel());
35          m_redefinedModel = model.getRedefinedModel();
36      }
37  
38      /***
39       * Creates the 'invoke' method.
40       */
41      protected void createInvokeMethod() {
42          String invokeDesc = buildInvokeMethodSignature();
43          CodeVisitor cv = m_cw.visitMethod(
44                  ACC_PUBLIC + ACC_FINAL + ACC_STATIC,
45                  INVOKE_METHOD_NAME,
46                  invokeDesc,
47                  new String[]{
48                      THROWABLE_CLASS_NAME
49                  },
50                  null
51          );
52          AsmHelper.loadArgumentTypes(cv, Type.getArgumentTypes(invokeDesc), true);
53          cv.visitMethodInsn(INVOKESTATIC, m_redefinedModel.getJoinPointClassName(), INVOKE_METHOD_NAME, invokeDesc);
54          AsmHelper.addReturnStatement(cv, Type.getReturnType(invokeDesc));
55          cv.visitMaxs(0, 0);
56      }
57  
58      /***
59       * Creates the 'invoke' method.
60       */
61      protected void createInlinedInvokeMethod() {
62          createInvokeMethod();
63      }
64  }