Package org.aspectj.apache.bcel.generic

Examples of org.aspectj.apache.bcel.generic.InstructionList


      prevMethod = nextMethod;
    }
  }

  private InstructionList initInstructionList() {
    InstructionList list = new InstructionList();
    InstructionFactory fact = getFactory();

    // make a new factory
    list.append(fact.createNew(factoryType));
    list.append(InstructionFactory.createDup(1));

    list.append(InstructionFactory.PUSH(getConstantPool(), getFileName()));

    // load the current Class object
    // XXX check that this works correctly for inners/anonymous
    list.append(fact.PUSHCLASS(cp, myGen.getClassName()));
    // XXX do we need to worry about the fact the theorectically this could
    // throw
    // a ClassNotFoundException

    list.append(fact.createInvoke(factoryType.getClassName(), "<init>", Type.VOID, new Type[] { Type.STRING, classType },
        Constants.INVOKESPECIAL));

    list.append(InstructionFactory.createStore(factoryType, 0));
    return list;
  }
View Full Code Here


  }

  private InstructionList[] initializeAllTjps() {
    Vector<InstructionList> lists = new Vector<InstructionList>();

    InstructionList list = initInstructionList();
    lists.add(list);

    List<Map.Entry<BcelShadow, Field>> entries = new ArrayList<Map.Entry<BcelShadow, Field>>(tjpFields.entrySet());
    Collections.sort(entries, new Comparator<Map.Entry<BcelShadow, Field>>() {
      public int compare(Map.Entry<BcelShadow, Field> a, Map.Entry<BcelShadow, Field> b) {
        return (a.getValue()).getName().compareTo((b.getValue()).getName());
      }
    });

    long estimatedSize = 0;
    for (Iterator<Map.Entry<BcelShadow, Field>> i = entries.iterator(); i.hasNext();) {
      Map.Entry<BcelShadow, Field> entry = i.next();
      if (estimatedSize > Constants.MAX_CODE_SIZE) {
        estimatedSize = 0;
        list = initInstructionList();
        lists.add(list);
      }
      estimatedSize += entry.getValue().getSignature().getBytes().length;
      initializeTjp(fact, list, entry.getValue(), entry.getKey());
    }
    InstructionList listArrayModel[] = new InstructionList[1];
    return lists.toArray(listArrayModel);
  }
View Full Code Here

  /**
   * Create a single bridge method called 'theBridgeMethod' that bridges to 'whatToBridgeTo'
   */
  private static void createBridgeMethod(BcelWorld world, LazyMethodGen whatToBridgeToMethodGen, LazyClassGen clazz,
      ResolvedMember theBridgeMethod) {
    InstructionList body;
    InstructionFactory fact;
    int pos = 0;

    ResolvedMember whatToBridgeTo = whatToBridgeToMethodGen.getMemberView();

    if (whatToBridgeTo == null) {
      whatToBridgeTo = new ResolvedMemberImpl(Member.METHOD, whatToBridgeToMethodGen.getEnclosingClass().getType(),
          whatToBridgeToMethodGen.getAccessFlags(), whatToBridgeToMethodGen.getName(),
          whatToBridgeToMethodGen.getSignature());
    }
    // The bridge method in this type will have the same signature as the one in the supertype
    LazyMethodGen bridgeMethod = makeBridgeMethod(clazz, theBridgeMethod);
    int newflags = bridgeMethod.getAccessFlags() | 0x00000040;// BRIDGE = 0x00000040

    if ((newflags & 0x00000100) != 0) {
      newflags = newflags - 0x100;// NATIVE = 0x00000100 - need to clear it
    }

    bridgeMethod.setAccessFlags(newflags);
    Type returnType = BcelWorld.makeBcelType(theBridgeMethod.getReturnType());
    Type[] paramTypes = BcelWorld.makeBcelTypes(theBridgeMethod.getParameterTypes());
    Type[] newParamTypes = whatToBridgeToMethodGen.getArgumentTypes();
    body = bridgeMethod.getBody();
    fact = clazz.getFactory();

    if (!whatToBridgeToMethodGen.isStatic()) {
      body.append(InstructionFactory.createThis());
      pos++;
    }
    for (int i = 0, len = paramTypes.length; i < len; i++) {
      Type paramType = paramTypes[i];
      body.append(InstructionFactory.createLoad(paramType, pos));
      if (!newParamTypes[i].equals(paramTypes[i])) {
        if (world.forDEBUG_bridgingCode) {
          System.err.println("Bridging: Cast " + newParamTypes[i] + " from " + paramTypes[i]);
        }
        body.append(fact.createCast(paramTypes[i], newParamTypes[i]));
      }
      pos += paramType.getSize();
    }

    body.append(Utility.createInvoke(fact, world, whatToBridgeTo));
    body.append(InstructionFactory.createReturn(returnType));
    clazz.addMethodGen(bridgeMethod);
  }
View Full Code Here

  }

  private void positionInitializationShadow(BcelShadow s) {
    LazyMethodGen mg = s.getEnclosingMethod();
    InstructionHandle call = findSuperOrThisCall(mg);
    InstructionList body = mg.getBody();
    ShadowRange r = new ShadowRange(body);
    r.associateWithShadow(s);
    if (s.getKind() == Shadow.PreInitialization) {
      // XXX assert first instruction is an ALOAD_0.
      // a pre shadow goes from AFTER the first instruction (which we
      // believe to
      // be an ALOAD_0) to just before the call to super
      r.associateWithTargets(Range.genStart(body, body.getStart().getNext()), Range.genEnd(body, call.getPrev()));
    } else {
      // assert s.getKind() == Shadow.Initialization
      r.associateWithTargets(Range.genStart(body, call.getNext()), Range.genEnd(body));
    }
  }
View Full Code Here

    final InstructionFactory fact = recipient.getEnclosingClass().getFactory();

    IntMap frameEnv = new IntMap();

    // this also sets up the initial environment
    InstructionList argumentStores = genArgumentStores(donor, recipient, frameEnv, fact);

    InstructionList inlineInstructions = genInlineInstructions(donor, recipient, frameEnv, fact, false);

    inlineInstructions.insert(argumentStores);

    recipient.getBody().append(call, inlineInstructions);
    Utility.deleteInstruction(call, recipient);
  }
View Full Code Here

      trace.enter("transformSynchronizedMethod", synchronizedMethod);
    }
    // System.err.println("DEBUG: Transforming synchronized method: "+
    // synchronizedMethod.getName());
    final InstructionFactory fact = synchronizedMethod.getEnclosingClass().getFactory();
    InstructionList body = synchronizedMethod.getBody();
    InstructionList prepend = new InstructionList();
    Type enclosingClassType = BcelWorld.makeBcelType(synchronizedMethod.getEnclosingClass().getType());

    // STATIC METHOD TRANSFORMATION
    if (synchronizedMethod.isStatic()) {

      // What to do here depends on the level of the class file!
      // LDC can handle class literals in Java5 and above *sigh*
      if (synchronizedMethod.getEnclosingClass().isAtLeastJava5()) {
        // MONITORENTER logic:
        // 0: ldc #2; //class C
        // 2: dup
        // 3: astore_0
        // 4: monitorenter
        int slotForLockObject = synchronizedMethod.allocateLocal(enclosingClassType);
        prepend.append(fact.createConstant(enclosingClassType));
        prepend.append(InstructionFactory.createDup(1));
        prepend.append(InstructionFactory.createStore(enclosingClassType, slotForLockObject));
        prepend.append(InstructionFactory.MONITORENTER);

        // MONITOREXIT logic:

        // We basically need to wrap the code from the method in a
        // finally block that
        // will ensure monitorexit is called. Content on the finally
        // block seems to
        // be always:
        //
        // E1: ALOAD_1
        // MONITOREXIT
        // ATHROW
        //
        // so lets build that:
        InstructionList finallyBlock = new InstructionList();
        finallyBlock.append(InstructionFactory.createLoad(Type.getType(java.lang.Class.class), slotForLockObject));
        finallyBlock.append(InstructionConstants.MONITOREXIT);
        finallyBlock.append(InstructionConstants.ATHROW);

        // finally -> E1
        // | GETSTATIC java.lang.System.out Ljava/io/PrintStream; (line
        // 21)
        // | LDC "hello"
        // | INVOKEVIRTUAL java.io.PrintStream.println
        // (Ljava/lang/String;)V
        // | ALOAD_1 (line 20)
        // | MONITOREXIT
        // finally -> E1
        // GOTO L0
        // finally -> E1
        // | E1: ALOAD_1
        // | MONITOREXIT
        // finally -> E1
        // ATHROW
        // L0: RETURN (line 23)

        // search for 'returns' and make them jump to the
        // aload_<n>,monitorexit
        InstructionHandle walker = body.getStart();
        List<InstructionHandle> rets = new ArrayList<InstructionHandle>();
        while (walker != null) {
          if (walker.getInstruction().isReturnInstruction()) {
            rets.add(walker);
          }
          walker = walker.getNext();
        }
        if (!rets.isEmpty()) {
          // need to ensure targeters for 'return' now instead target
          // the load instruction
          // (so we never jump over the monitorexit logic)

          for (Iterator<InstructionHandle> iter = rets.iterator(); iter.hasNext();) {
            InstructionHandle element = iter.next();
            InstructionList monitorExitBlock = new InstructionList();
            monitorExitBlock.append(InstructionFactory.createLoad(enclosingClassType, slotForLockObject));
            monitorExitBlock.append(InstructionConstants.MONITOREXIT);
            // monitorExitBlock.append(Utility.copyInstruction(element
            // .getInstruction()));
            // element.setInstruction(InstructionFactory.createLoad(
            // classType,slotForThis));
            InstructionHandle monitorExitBlockStart = body.insert(element, monitorExitBlock);

            // now move the targeters from the RET to the start of
            // the monitorexit block
            for (InstructionTargeter targeter : element.getTargetersCopy()) {
              // what kinds are there?
              if (targeter instanceof LocalVariableTag) {
                // ignore
              } else if (targeter instanceof LineNumberTag) {
                // ignore
                // } else if (targeter instanceof
                // InstructionBranch &&
                // ((InstructionBranch)targeter).isGoto()) {
                // // move it...
                // targeter.updateTarget(element,
                // monitorExitBlockStart);
              } else if (targeter instanceof InstructionBranch) {
                // move it
                targeter.updateTarget(element, monitorExitBlockStart);
              } else {
                throw new BCException("Unexpected targeter encountered during transform: " + targeter);
              }
            }
          }
        }

        // now the magic, putting the finally block around the code
        InstructionHandle finallyStart = finallyBlock.getStart();

        InstructionHandle tryPosition = body.getStart();
        InstructionHandle catchPosition = body.getEnd();
        body.insert(body.getStart(), prepend); // now we can put the
        // monitorenter stuff on
        synchronizedMethod.getBody().append(finallyBlock);
        synchronizedMethod.addExceptionHandler(tryPosition, catchPosition, finallyStart, null/* ==finally */, false);
        synchronizedMethod.addExceptionHandler(finallyStart, finallyStart.getNext(), finallyStart, null, false);
      } else {

        // TRANSFORMING STATIC METHOD ON PRE JAVA5

        // Hideous nightmare, class literal references prior to Java5

        // YIKES! this is just the code for MONITORENTER !
        // 0: getstatic #59; //Field class$1:Ljava/lang/Class;
        // 3: dup
        // 4: ifnonnull 32
        // 7: pop
        // try
        // 8: ldc #61; //String java.lang.String
        // 10: invokestatic #44; //Method
        // java/lang/Class.forName:(Ljava/lang/String;)Ljava/lang/Class;
        // 13: dup
        // catch
        // 14: putstatic #59; //Field class$1:Ljava/lang/Class;
        // 17: goto 32
        // 20: new #46; //class java/lang/NoClassDefFoundError
        // 23: dup_x1
        // 24: swap
        // 25: invokevirtual #52; //Method
        // java/lang/Throwable.getMessage:()Ljava/lang/String;
        // 28: invokespecial #54; //Method
        // java/lang/NoClassDefFoundError."<init>":(Ljava/lang/String;)V
        // 31: athrow
        // 32: dup <-- partTwo (branch target)
        // 33: astore_0
        // 34: monitorenter
        //
        // plus exceptiontable entry!
        // 8 13 20 Class java/lang/ClassNotFoundException
        Type classType = BcelWorld.makeBcelType(synchronizedMethod.getEnclosingClass().getType());
        Type clazzType = Type.getType(Class.class);

        InstructionList parttwo = new InstructionList();
        parttwo.append(InstructionFactory.createDup(1));
        int slotForThis = synchronizedMethod.allocateLocal(classType);
        parttwo.append(InstructionFactory.createStore(clazzType, slotForThis)); // ? should be the real type ? String or
        // something?
        parttwo.append(InstructionFactory.MONITORENTER);

        String fieldname = synchronizedMethod.getEnclosingClass().allocateField("class$");
        FieldGen f = new FieldGen(Modifier.STATIC | Modifier.PRIVATE, Type.getType(Class.class), fieldname,
            synchronizedMethod.getEnclosingClass().getConstantPool());
        synchronizedMethod.getEnclosingClass().addField(f, null);

        // 10: invokestatic #44; //Method
        // java/lang/Class.forName:(Ljava/lang/String;)Ljava/lang/Class;
        // 13: dup
        // 14: putstatic #59; //Field class$1:Ljava/lang/Class;
        // 17: goto 32
        // 20: new #46; //class java/lang/NoClassDefFoundError
        // 23: dup_x1
        // 24: swap
        // 25: invokevirtual #52; //Method
        // java/lang/Throwable.getMessage:()Ljava/lang/String;
        // 28: invokespecial #54; //Method
        // java/lang/NoClassDefFoundError."<init>":(Ljava/lang/String;)V
        // 31: athrow
        String name = synchronizedMethod.getEnclosingClass().getName();

        prepend.append(fact.createGetStatic(name, fieldname, Type.getType(Class.class)));
        prepend.append(InstructionFactory.createDup(1));
        prepend.append(InstructionFactory.createBranchInstruction(Constants.IFNONNULL, parttwo.getStart()));
        prepend.append(InstructionFactory.POP);

        prepend.append(fact.createConstant(name));
        InstructionHandle tryInstruction = prepend.getEnd();
        prepend.append(fact.createInvoke("java.lang.Class", "forName", clazzType,
            new Type[] { Type.getType(String.class) }, Constants.INVOKESTATIC));
        InstructionHandle catchInstruction = prepend.getEnd();
        prepend.append(InstructionFactory.createDup(1));

        prepend.append(fact.createPutStatic(synchronizedMethod.getEnclosingClass().getType().getName(), fieldname,
            Type.getType(Class.class)));
        prepend.append(InstructionFactory.createBranchInstruction(Constants.GOTO, parttwo.getStart()));

        // start of catch block
        InstructionList catchBlockForLiteralLoadingFail = new InstructionList();
        catchBlockForLiteralLoadingFail.append(fact.createNew((ObjectType) Type.getType(NoClassDefFoundError.class)));
        catchBlockForLiteralLoadingFail.append(InstructionFactory.createDup_1(1));
        catchBlockForLiteralLoadingFail.append(InstructionFactory.SWAP);
        catchBlockForLiteralLoadingFail.append(fact.createInvoke("java.lang.Throwable", "getMessage",
            Type.getType(String.class), new Type[] {}, Constants.INVOKEVIRTUAL));
        catchBlockForLiteralLoadingFail.append(fact.createInvoke("java.lang.NoClassDefFoundError", "<init>", Type.VOID,
            new Type[] { Type.getType(String.class) }, Constants.INVOKESPECIAL));
        catchBlockForLiteralLoadingFail.append(InstructionFactory.ATHROW);
        InstructionHandle catchBlockStart = catchBlockForLiteralLoadingFail.getStart();
        prepend.append(catchBlockForLiteralLoadingFail);
        prepend.append(parttwo);
        // MONITORENTER
        // pseudocode: load up 'this' (var0), dup it, store it in a new
        // local var (for use with monitorexit) and call
        // monitorenter:
        // ALOAD_0, DUP, ASTORE_<n>, MONITORENTER
        // prepend.append(InstructionFactory.createLoad(classType,0));
        // prepend.append(InstructionFactory.createDup(1));
        // int slotForThis =
        // synchronizedMethod.allocateLocal(classType);
        // prepend.append(InstructionFactory.createStore(classType,
        // slotForThis));
        // prepend.append(InstructionFactory.MONITORENTER);

        // MONITOREXIT
        // here be dragons

        // We basically need to wrap the code from the method in a
        // finally block that
        // will ensure monitorexit is called. Content on the finally
        // block seems to
        // be always:
        //
        // E1: ALOAD_1
        // MONITOREXIT
        // ATHROW
        //
        // so lets build that:
        InstructionList finallyBlock = new InstructionList();
        finallyBlock.append(InstructionFactory.createLoad(Type.getType(java.lang.Class.class), slotForThis));
        finallyBlock.append(InstructionConstants.MONITOREXIT);
        finallyBlock.append(InstructionConstants.ATHROW);

        // finally -> E1
        // | GETSTATIC java.lang.System.out Ljava/io/PrintStream; (line
        // 21)
        // | LDC "hello"
        // | INVOKEVIRTUAL java.io.PrintStream.println
        // (Ljava/lang/String;)V
        // | ALOAD_1 (line 20)
        // | MONITOREXIT
        // finally -> E1
        // GOTO L0
        // finally -> E1
        // | E1: ALOAD_1
        // | MONITOREXIT
        // finally -> E1
        // ATHROW
        // L0: RETURN (line 23)
        // frameEnv.put(donorFramePos, thisSlot);

        // search for 'returns' and make them to the
        // aload_<n>,monitorexit
        InstructionHandle walker = body.getStart();
        List<InstructionHandle> rets = new ArrayList<InstructionHandle>();
        while (walker != null) { // !walker.equals(body.getEnd())) {
          if (walker.getInstruction().isReturnInstruction()) {
            rets.add(walker);
          }
          walker = walker.getNext();
        }
        if (rets.size() > 0) {
          // need to ensure targeters for 'return' now instead target
          // the load instruction
          // (so we never jump over the monitorexit logic)

          for (InstructionHandle ret : rets) {
            // System.err.println("Adding monitor exit block at "+
            // element);
            InstructionList monitorExitBlock = new InstructionList();
            monitorExitBlock.append(InstructionFactory.createLoad(classType, slotForThis));
            monitorExitBlock.append(InstructionConstants.MONITOREXIT);
            // monitorExitBlock.append(Utility.copyInstruction(element
            // .getInstruction()));
            // element.setInstruction(InstructionFactory.createLoad(
            // classType,slotForThis));
            InstructionHandle monitorExitBlockStart = body.insert(ret, monitorExitBlock);

            // now move the targeters from the RET to the start of
            // the monitorexit block
            for (InstructionTargeter targeter : ret.getTargetersCopy()) {
              // what kinds are there?
              if (targeter instanceof LocalVariableTag) {
                // ignore
              } else if (targeter instanceof LineNumberTag) {
                // ignore
                // } else if (targeter instanceof GOTO ||
                // targeter instanceof GOTO_W) {
                // // move it...
                // targeter.updateTarget(element,
                // monitorExitBlockStart);
              } else if (targeter instanceof InstructionBranch) {
                // move it
                targeter.updateTarget(ret, monitorExitBlockStart);
              } else {
                throw new BCException("Unexpected targeter encountered during transform: " + targeter);
              }
            }
          }
        }
        // body =
        // rewriteWithMonitorExitCalls(body,fact,true,slotForThis,
        // classType);
        // synchronizedMethod.setBody(body);

        // now the magic, putting the finally block around the code
        InstructionHandle finallyStart = finallyBlock.getStart();

        InstructionHandle tryPosition = body.getStart();
        InstructionHandle catchPosition = body.getEnd();
        body.insert(body.getStart(), prepend); // now we can put the
        // monitorenter stuff on

        synchronizedMethod.getBody().append(finallyBlock);
        synchronizedMethod.addExceptionHandler(tryPosition, catchPosition, finallyStart, null/* ==finally */, false);
        synchronizedMethod.addExceptionHandler(tryInstruction, catchInstruction, catchBlockStart,
            (ObjectType) Type.getType(ClassNotFoundException.class), true);
        synchronizedMethod.addExceptionHandler(finallyStart, finallyStart.getNext(), finallyStart, null, false);
      }
    } else {

      // TRANSFORMING NON STATIC METHOD
      Type classType = BcelWorld.makeBcelType(synchronizedMethod.getEnclosingClass().getType());
      // MONITORENTER
      // pseudocode: load up 'this' (var0), dup it, store it in a new
      // local var (for use with monitorexit) and call
      // monitorenter:
      // ALOAD_0, DUP, ASTORE_<n>, MONITORENTER
      prepend.append(InstructionFactory.createLoad(classType, 0));
      prepend.append(InstructionFactory.createDup(1));
      int slotForThis = synchronizedMethod.allocateLocal(classType);
      prepend.append(InstructionFactory.createStore(classType, slotForThis));
      prepend.append(InstructionFactory.MONITORENTER);
      // body.insert(body.getStart(),prepend);

      // MONITOREXIT

      // We basically need to wrap the code from the method in a finally
      // block that
      // will ensure monitorexit is called. Content on the finally block
      // seems to
      // be always:
      //
      // E1: ALOAD_1
      // MONITOREXIT
      // ATHROW
      //
      // so lets build that:
      InstructionList finallyBlock = new InstructionList();
      finallyBlock.append(InstructionFactory.createLoad(classType, slotForThis));
      finallyBlock.append(InstructionConstants.MONITOREXIT);
      finallyBlock.append(InstructionConstants.ATHROW);

      // finally -> E1
      // | GETSTATIC java.lang.System.out Ljava/io/PrintStream; (line 21)
      // | LDC "hello"
      // | INVOKEVIRTUAL java.io.PrintStream.println (Ljava/lang/String;)V
      // | ALOAD_1 (line 20)
      // | MONITOREXIT
      // finally -> E1
      // GOTO L0
      // finally -> E1
      // | E1: ALOAD_1
      // | MONITOREXIT
      // finally -> E1
      // ATHROW
      // L0: RETURN (line 23)
      // frameEnv.put(donorFramePos, thisSlot);

      // search for 'returns' and make them to the aload_<n>,monitorexit
      InstructionHandle walker = body.getStart();
      List<InstructionHandle> rets = new ArrayList<InstructionHandle>();
      while (walker != null) { // !walker.equals(body.getEnd())) {
        if (walker.getInstruction().isReturnInstruction()) {
          rets.add(walker);
        }
        walker = walker.getNext();
      }
      if (!rets.isEmpty()) {
        // need to ensure targeters for 'return' now instead target the
        // load instruction
        // (so we never jump over the monitorexit logic)

        for (Iterator<InstructionHandle> iter = rets.iterator(); iter.hasNext();) {
          InstructionHandle element = iter.next();
          // System.err.println("Adding monitor exit block at "+element
          // );
          InstructionList monitorExitBlock = new InstructionList();
          monitorExitBlock.append(InstructionFactory.createLoad(classType, slotForThis));
          monitorExitBlock.append(InstructionConstants.MONITOREXIT);
          // monitorExitBlock.append(Utility.copyInstruction(element.
          // getInstruction()));
          // element.setInstruction(InstructionFactory.createLoad(
          // classType,slotForThis));
          InstructionHandle monitorExitBlockStart = body.insert(element, monitorExitBlock);
View Full Code Here

   * @param frameEnv an environment to map from donor frame to recipient frame, initially populated with argument locations.
   * @param fact an instruction factory for recipient
   */
  static InstructionList genInlineInstructions(LazyMethodGen donor, LazyMethodGen recipient, IntMap frameEnv,
      InstructionFactory fact, boolean keepReturns) {
    InstructionList footer = new InstructionList();
    InstructionHandle end = footer.append(InstructionConstants.NOP);

    InstructionList ret = new InstructionList();
    InstructionList sourceList = donor.getBody();

    Map<InstructionHandle, InstructionHandle> srcToDest = new HashMap<InstructionHandle, InstructionHandle>();
    ConstantPool donorCpg = donor.getEnclosingClass().getConstantPool();
    ConstantPool recipientCpg = recipient.getEnclosingClass().getConstantPool();

    boolean isAcrossClass = donorCpg != recipientCpg;

    // first pass: copy the instructions directly, populate the srcToDest
    // map,
    // fix frame instructions
    for (InstructionHandle src = sourceList.getStart(); src != null; src = src.getNext()) {
      Instruction fresh = Utility.copyInstruction(src.getInstruction());
      InstructionHandle dest;

      // OPTIMIZE optimize this stuff?
      if (fresh.isConstantPoolInstruction()) {
        // need to reset index to go to new constant pool. This is
        // totally
        // a computation leak... we're testing this LOTS of times. Sigh.
        if (isAcrossClass) {
          InstructionCP cpi = (InstructionCP) fresh;
          cpi.setIndex(recipientCpg.addConstant(donorCpg.getConstant(cpi.getIndex()), donorCpg));
        }
      }
      if (src.getInstruction() == Range.RANGEINSTRUCTION) {
        dest = ret.append(Range.RANGEINSTRUCTION);
      } else if (fresh.isReturnInstruction()) {
        if (keepReturns) {
          dest = ret.append(fresh);
        } else {
          dest = ret.append(InstructionFactory.createBranchInstruction(Constants.GOTO, end));
        }
      } else if (fresh instanceof InstructionBranch) {
        dest = ret.append((InstructionBranch) fresh);
      } else if (fresh.isLocalVariableInstruction() || fresh instanceof RET) {

        // IndexedInstruction indexed = (IndexedInstruction) fresh;
        int oldIndex = fresh.getIndex();
        int freshIndex;
        if (!frameEnv.hasKey(oldIndex)) {
          freshIndex = recipient.allocateLocal(2);
          frameEnv.put(oldIndex, freshIndex);
        } else {
          freshIndex = frameEnv.get(oldIndex);
        }
        if (fresh instanceof RET) {
          fresh.setIndex(freshIndex);
        } else {
          fresh = ((InstructionLV) fresh).setIndexAndCopyIfNecessary(freshIndex);
        }
        dest = ret.append(fresh);
      } else {
        dest = ret.append(fresh);
      }
      srcToDest.put(src, dest);
    }

    // second pass: retarget branch instructions, copy ranges and tags
    Map<Tag, Tag> tagMap = new HashMap<Tag, Tag>();
    Map<BcelShadow, BcelShadow> shadowMap = new HashMap<BcelShadow, BcelShadow>();
    for (InstructionHandle dest = ret.getStart(), src = sourceList.getStart(); dest != null; dest = dest.getNext(), src = src
        .getNext()) {
      Instruction inst = dest.getInstruction();

      // retarget branches
      if (inst instanceof InstructionBranch) {
View Full Code Here

   * @param frameEnv an empty environment we populate with a map from donor frame to recipient frame.
   * @param fact an instruction factory for recipient
   */
  private static InstructionList genArgumentStores(LazyMethodGen donor, LazyMethodGen recipient, IntMap frameEnv,
      InstructionFactory fact) {
    InstructionList ret = new InstructionList();

    int donorFramePos = 0;

    // writing ret back to front because we're popping.
    if (!donor.isStatic()) {
      int targetSlot = recipient.allocateLocal(Type.OBJECT);
      ret.insert(InstructionFactory.createStore(Type.OBJECT, targetSlot));
      frameEnv.put(donorFramePos, targetSlot);
      donorFramePos += 1;
    }
    Type[] argTypes = donor.getArgumentTypes();
    for (int i = 0, len = argTypes.length; i < len; i++) {
      Type argType = argTypes[i];
      int argSlot = recipient.allocateLocal(argType);
      ret.insert(InstructionFactory.createStore(argType, argSlot));
      frameEnv.put(donorFramePos, argSlot);
      donorFramePos += argType.getSize();
    }
    return ret;
  }
View Full Code Here

        Member ifaceInitSig = AjcMemberMaker.interfaceConstructor(l.onType);

        BcelShadow initShadow = BcelShadow.makeIfaceInitialization(world, mg, ifaceInitSig);

        // insert code in place
        InstructionList inits = genInitInstructions(l.list, false);
        if (match(initShadow, shadowAccumulator) || !inits.isEmpty()) {
          initShadow.initIfaceInitializer(curr);
          initShadow.getRange().insert(inits, Range.OutsideBefore);
        }
      }

      // now we add our initialization code
      InstructionList inits = genInitInstructions(addedThisInitializers, false);
      enclosingShadow.getRange().insert(inits, Range.OutsideBefore);
    }

    // actually, you only need to inline the self constructors that are
    // in a particular group (partition the constructors into groups where
View Full Code Here

    list = PartialOrder.sort(list);
    if (list == null) {
      throw new BCException("circularity in inter-types");
    }

    InstructionList ret = new InstructionList();

    for (ConcreteTypeMunger cmunger : list) {
      NewFieldTypeMunger munger = (NewFieldTypeMunger) cmunger.getMunger();
      ResolvedMember initMethod = munger.getInitMethod(cmunger.getAspectType());
      if (!isStatic) {
        ret.append(InstructionConstants.ALOAD_0);
      }
      ret.append(Utility.createInvoke(fact, world, initMethod));
    }
    return ret;
  }
View Full Code Here

TOP

Related Classes of org.aspectj.apache.bcel.generic.InstructionList

Copyright © 2018 www.massapicom. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.