Ejemplo n.º 1
0
  /**
   * * Constructor setting the parameters of the method
   *
   * @param arg0 the method visitor object to write the new code
   * @param _methodId the unique JINE id of the method
   * @param isProfiled should we add instrumentation code to profile the method
   * @param access access rules of the method
   * @param cName class name
   * @param mName method name
   * @param desc arguments description
   * @param signature signature
   * @param exceptions array of strings with the possibly thrown exception classes
   * @param _iparams instrumentation parameters as selected by the user options
   */
  public BasicBlockMethodAdapter(
      MethodVisitor arg0,
      int _methodId,
      boolean isProfiled,
      int access,
      String cName,
      String mName,
      String desc,
      String signature,
      String[] exceptions,
      InstrumentationParameters _iparams,
      MethodAdaptationInfo _methodAdaptationInfo) {

    super(arg0);

    instrumentationStatsRecord = InstrumentationRecordFactory.getRecord();

    allStartingTryCatchingBlockLabels = null;
    allEndingTryCatchingBlockLabels = null;
    tryCatchDepth = 0;

    iparams = _iparams;
    methodAdaptationInfo = _methodAdaptationInfo;

    methodId = _methodId;

    className = cName;
    methodName = mName;
    methodDesc = desc;

    isSynchronised = (access & ACC_SYNCHRONIZED) != 0;
    isStatic = (access & ACC_STATIC) != 0;

    profile =
        isProfiled
            && !(isSynchronised
                && (iparams.trappingInteractionPoints()
                    || (iparams
                        .usingExternalInstrumentation()))); // sync methods are profiled externally
                                                            // when IPs are trapped

    // Some methods
    if (iparams.exceptionHandlingEverywhere()) {
      instrumentExceptionHandlingCode = true;
    } else {
      instrumentExceptionHandlingCode = false;
    }

    // Register the methodId to the VTF
    if (profile) {
      instrumentationStatsRecord.setProfiled();

      if (!iparams.isRetransformingInstrumentation()) {
        EventNotifier.registerMethod(
            cName + " " + mName + " " + desc, methodId, _iparams.getMethod0());
      } else {
        instrumentationStatsRecord.setRetransformed();
      }

      shouldBeWrappedWithVexOptimizerLoop =
          iparams.shouldBeWrappedWithVexOptimizerLoop(mName); // wrap the first appearance of main
      if (shouldBeWrappedWithVexOptimizerLoop) {
        System.out.println("will wrap vex optimizer " + cName + " " + mName + " " + desc);
      }

      if (iparams.methodShouldBeAdapted(methodId)) {
        if (exceptions != null && exceptions.length > 0) {
          instrumentExceptionHandlingCode = true;
        }
      }
    }

    if (DEBUG) {
      System.out.println("Instrumenting  " + cName + " -> " + mName + "(" + methodId + ")" + desc);
    }

    performanceModelParameters = null;
  }