Beispiel #1
0
  /**
   * Creates the "proxy method", e.g. the method that has the same name and signature as the
   * original method but a completely other implementation.
   *
   * @param access
   * @param name
   * @param desc
   * @param signature
   * @param exceptions
   * @param methodInfo
   * @return the method visitor
   */
  private MethodVisitor createProxyMethod(
      final int access,
      final String name,
      final String desc,
      final String signature,
      final String[] exceptions,
      final MethodInfo methodInfo) {
    MethodVisitor mv = cv.visitMethod(access, name, desc, signature, exceptions);

    // load "this" ie callee if target method is not static
    if (!Modifier.isStatic(access)) {
      mv.visitVarInsn(ALOAD, 0);
    }
    // load args
    AsmHelper.loadArgumentTypes(mv, Type.getArgumentTypes(desc), Modifier.isStatic(access));
    // load "this" ie caller or null if method is static
    if (Modifier.isStatic(access)) {
      mv.visitInsn(ACONST_NULL);
    } else {
      mv.visitVarInsn(ALOAD, 0);
    }

    int joinPointHash = AsmHelper.calculateMethodHash(name, desc);
    String joinPointClassName =
        TransformationUtil.getJoinPointClassName(
            m_declaringTypeName,
            name,
            desc,
            m_declaringTypeName,
            JoinPointType.METHOD_EXECUTION_INT,
            joinPointHash);

    // TODO: should we provide some sort of option to do JITgen when weaving instead of when loading
    // ?
    // use case: offline full packaging and alike

    mv.visitMethodInsn(
        INVOKESTATIC,
        joinPointClassName,
        INVOKE_METHOD_NAME,
        TransformationUtil.getInvokeSignatureForCodeJoinPoints(
            access, desc, m_declaringTypeName, m_declaringTypeName));

    AsmHelper.addReturnStatement(mv, Type.getReturnType(desc));
    mv.visitMaxs(0, 0);

    // emit the joinpoint
    m_ctx.addEmittedJoinPoint(
        new EmittedJoinPoint(
            JoinPointType.METHOD_EXECUTION_INT,
            m_declaringTypeName,
            name,
            desc,
            access,
            m_declaringTypeName,
            name,
            desc,
            access,
            joinPointHash,
            joinPointClassName,
            EmittedJoinPoint.NO_LINE_NUMBER));

    return mv;
  }