Java Code Examples for org.objectweb.asm.Opcodes#NEW

The following examples show how to use org.objectweb.asm.Opcodes#NEW . You can vote up the ones you like or vote down the ones you don't like, and go to the original project or source file by following the links above each example. You may check out the related API usage on the sidebar.
Example 1
Source File: LambdaClassFixer.java    From bazel with Apache License 2.0 6 votes vote down vote up
private void removeLastAllocation() {
  AbstractInsnNode insn = instructions.getLast();
  while (insn != null && insn.getPrevious() != null) {
    AbstractInsnNode prev = insn.getPrevious();
    if (prev.getOpcode() == Opcodes.NEW
        && insn.getOpcode() == Opcodes.DUP
        && ((TypeInsnNode) prev).desc.equals(lambdaInfo.methodReference().getOwner())) {
      instructions.remove(prev);
      instructions.remove(insn);
      return;
    }
    insn = prev;
  }
  throw new IllegalStateException(
      "Couldn't find allocation to rewrite ::new reference " + lambdaInfo.methodReference());
}
 
Example 2
Source File: InstructionAdapter.java    From Concurnas with MIT License 6 votes vote down vote up
@Override
public void visitTypeInsn(final int opcode, final String type) {
  Type objectType = Type.getObjectType(type);
  switch (opcode) {
    case Opcodes.NEW:
      anew(objectType);
      break;
    case Opcodes.ANEWARRAY:
      newarray(objectType);
      break;
    case Opcodes.CHECKCAST:
      checkcast(objectType);
      break;
    case Opcodes.INSTANCEOF:
      instanceOf(objectType);
      break;
    default:
      throw new IllegalArgumentException();
  }
}
 
Example 3
Source File: SerianalyzerMethodVisitor.java    From serianalyzer with GNU General Public License v3.0 6 votes vote down vote up
/**
 * {@inheritDoc}
 *
 * @see org.objectweb.asm.MethodVisitor#visitTypeInsn(int, java.lang.String)
 */
@Override
public void visitTypeInsn ( int opcode, String type ) {
    JVMImpl.handleJVMTypeInsn(opcode, type, this.stack);

    if ( opcode == Opcodes.NEW ) {
        String className = type.replace('/', '.');
        if ( this.log.isDebugEnabled() ) {
            this.log.debug("Found instantiation " + className); //$NON-NLS-1$
        }
        // if ( this.ref.isCalleeTainted() ) {
        this.parent.getAnalyzer().getState().trackInstantiable(className, this.ref, this.parent.getAnalyzer().getConfig(), false);
        // }
    }
    super.visitTypeInsn(opcode, type);
}
 
Example 4
Source File: IncrementalChangeVisitor.java    From AnoleFix with MIT License 6 votes vote down vote up
@Override
public void visitTypeInsn(int opcode, String s) {
    if (opcode == Opcodes.NEW) {
        // state can only normal or dup_after new
        if (state == MachineState.AFTER_NEW) {
            throw new RuntimeException("Panic, two NEW opcode without a DUP");
        }

        if (isInSamePackage(s)) {
            // this is a new allocation in the same package, this could be protected or
            // package private class, we must go through reflection, otherwise not.
            // set our state so we swallow the next DUP we encounter.
            state = MachineState.AFTER_NEW;

            // swallow the NEW, we will also swallow the DUP associated with the new
            return;
        }
    }
    super.visitTypeInsn(opcode, s);
}
 
Example 5
Source File: InstructionAdapter.java    From JByteMod-Beta with GNU General Public License v2.0 6 votes vote down vote up
@Override
public void visitTypeInsn(final int opcode, final String type) {
  Type objectType = Type.getObjectType(type);
  switch (opcode) {
    case Opcodes.NEW:
      anew(objectType);
      break;
    case Opcodes.ANEWARRAY:
      newarray(objectType);
      break;
    case Opcodes.CHECKCAST:
      checkcast(objectType);
      break;
    case Opcodes.INSTANCEOF:
      instanceOf(objectType);
      break;
    default:
      throw new IllegalArgumentException();
  }
}
 
Example 6
Source File: AllocateInstrument.java    From dacapobench with Apache License 2.0 6 votes vote down vote up
private void addWhereAmI() {
	// 0: new #2; //class java/lang/Exception
	// 3: dup
	// 4: invokespecial #3; //Method java/lang/Exception."<init>":()V
	// 7: invokevirtual #4; //Method
	// java/lang/Exception.printStackTrace:()V
	// 10: return
	// super.visitTypeInsn(Opcodes.NEW, type);
	String exClass = Type.getInternalName(Exception.class);
	super.visitTypeInsn(Opcodes.NEW, exClass);
	super.visitInsn(Opcodes.DUP);
	super.visitMethodInsn(Opcodes.INVOKESPECIAL, exClass, "<init>",
			"()V");
	super.visitMethodInsn(Opcodes.INVOKEVIRTUAL, exClass,
			"printStackTrace", "()V");
}
 
Example 7
Source File: InstructionAdapter.java    From JReFrameworker with MIT License 6 votes vote down vote up
@Override
public void visitTypeInsn(final int opcode, final String type) {
  Type objectType = Type.getObjectType(type);
  switch (opcode) {
    case Opcodes.NEW:
      anew(objectType);
      break;
    case Opcodes.ANEWARRAY:
      newarray(objectType);
      break;
    case Opcodes.CHECKCAST:
      checkcast(objectType);
      break;
    case Opcodes.INSTANCEOF:
      instanceOf(objectType);
      break;
    default:
      throw new IllegalArgumentException();
  }
}
 
Example 8
Source File: CheckMethodAdapter.java    From JReFrameworker with MIT License 5 votes vote down vote up
@Override
public void visitTypeInsn(final int opcode, final String type) {
  checkVisitCodeCalled();
  checkVisitMaxsNotCalled();
  checkOpcodeMethod(opcode, Method.VISIT_TYPE_INSN);
  checkInternalName(version, type, "type");
  if (opcode == Opcodes.NEW && type.charAt(0) == '[') {
    throw new IllegalArgumentException("NEW cannot be used to create arrays: " + type);
  }
  super.visitTypeInsn(opcode, type);
  ++insnCount;
}
 
Example 9
Source File: StringEncryptionTransformer.java    From deobfuscator with Apache License 2.0 5 votes vote down vote up
private void patchMethod(Map<String, AtomicInteger> invokeCount, MethodNode method) {
    if (invokeCount.containsKey("getStackTrace") && invokeCount.containsKey("getClassName")) {
        for (AbstractInsnNode insn = method.instructions.getFirst(); insn != null; insn = insn.getNext()) {
            if (insn.getOpcode() == Opcodes.NEW && (((TypeInsnNode) insn).desc.endsWith("Exception") || ((TypeInsnNode) insn).desc.endsWith("Error"))) {
                ((TypeInsnNode) insn).desc = "java/lang/RuntimeException";
            } else if (insn instanceof MethodInsnNode && (((MethodInsnNode) insn).owner.endsWith("Exception") || ((MethodInsnNode) insn).owner.endsWith("Error"))) {
                ((MethodInsnNode) insn).owner = "java/lang/RuntimeException";
            }
        }
    }
}
 
Example 10
Source File: HeaderClassLoader.java    From bazel with Apache License 2.0 5 votes vote down vote up
@Override
public void visitEnd() {
  if (!hasCode) {
    super.visitTypeInsn(Opcodes.NEW, EXCEPTION_INTERNAL_NAME);
    super.visitInsn(Opcodes.DUP);
    super.visitMethodInsn(
        Opcodes.INVOKESPECIAL, EXCEPTION_INTERNAL_NAME, "<init>", "()V", /*itf*/ false);
    super.visitInsn(Opcodes.ATHROW);
    super.visitMaxs(0, 0); // triggers computation of the actual max's
  }
  super.visitEnd();
}
 
Example 11
Source File: CheckMethodAdapter.java    From JByteMod-Beta with GNU General Public License v2.0 5 votes vote down vote up
@Override
public void visitTypeInsn(final int opcode, final String type) {
  checkStartCode();
  checkEndCode();
  checkOpcode(opcode, 3);
  checkInternalName(type, "type");
  if (opcode == Opcodes.NEW && type.charAt(0) == '[') {
    throw new IllegalArgumentException("NEW cannot be used to create arrays: " + type);
  }
  super.visitTypeInsn(opcode, type);
  ++insnCount;
}
 
Example 12
Source File: BlockBuildingMethodVisitorTest.java    From AVM with MIT License 5 votes vote down vote up
@Test
public void test_throwException() throws Exception {
    List<BasicBlock> initBlocks = METHOD_BLOCKS.get("throwException()I");
    int[][] expectedInitBlocks = new int[][]{
            {Opcodes.NEW, Opcodes.DUP, Opcodes.INVOKESPECIAL, Opcodes.ATHROW},
    };
    boolean didMatch = compareBlocks(expectedInitBlocks, initBlocks);
    Assert.assertTrue(didMatch);
    BytecodeFeeScheduler s = new BytecodeFeeScheduler();
    s.initialize();
}
 
Example 13
Source File: BlockBuildingMethodVisitor.java    From AVM with MIT License 5 votes vote down vote up
@Override
public void visitTypeInsn(int opcode, String type) {
    this.currentBuildingBlock.add(opcode);
    // If this is a new, att the type to the allocation list for the block.
    if (Opcodes.NEW == opcode) {
        this.currentAllocationList.add(type);
    }
}
 
Example 14
Source File: BeforeNew.java    From Mixin with MIT License 5 votes vote down vote up
@SuppressWarnings("unchecked")
@Override
public boolean find(String desc, InsnList insns, Collection<AbstractInsnNode> nodes) {
    boolean found = false;
    int ordinal = 0;

    Collection<TypeInsnNode> newNodes = new ArrayList<TypeInsnNode>();
    Collection<AbstractInsnNode> candidates = (Collection<AbstractInsnNode>) (this.desc != null ? newNodes : nodes);
    ListIterator<AbstractInsnNode> iter = insns.iterator();
    while (iter.hasNext()) {
        AbstractInsnNode insn = iter.next();

        if (insn instanceof TypeInsnNode && insn.getOpcode() == Opcodes.NEW && this.matchesOwner((TypeInsnNode) insn)) {
            if (this.ordinal == -1 || this.ordinal == ordinal) {
                candidates.add(insn);
                found = this.desc == null;
            }

            ordinal++;
        }
    }
    
    if (this.desc != null) {
        for (TypeInsnNode newNode : newNodes) {
            if (this.findCtor(insns, newNode)) {
                nodes.add(newNode);
                found = true;
            }
        }
    }

    return found;
}
 
Example 15
Source File: Bytecode.java    From Mixin with MIT License 5 votes vote down vote up
/**
 * Find the call to <tt>super()</tt> or <tt>this()</tt> in a constructor.
 * This attempts to locate the first call to <tt>&lt;init&gt;</tt> which
 * isn't an inline call to another object ctor being passed into the super
 * invocation.
 * 
 * @param ctor ctor to scan
 * @param superName name of superclass
 * @param ownerName name of owning class
 * @return Call to <tt>super()</tt>, <tt>this()</tt> or
 *      <tt>DelegateInitialiser.NONE</tt> if not found
 */
public static DelegateInitialiser findDelegateInit(MethodNode ctor, String superName, String ownerName) {
    if (!Constants.CTOR.equals(ctor.name)) {
        return DelegateInitialiser.NONE;
    }
    
    int news = 0;
    for (Iterator<AbstractInsnNode> iter = ctor.instructions.iterator(); iter.hasNext();) {
        AbstractInsnNode insn = iter.next();
        if (insn instanceof TypeInsnNode && insn.getOpcode() == Opcodes.NEW) {
            news++;
        } else if (insn instanceof MethodInsnNode && insn.getOpcode() == Opcodes.INVOKESPECIAL) {
            MethodInsnNode methodNode = (MethodInsnNode)insn;
            if (Constants.CTOR.equals(methodNode.name)) {
                if (news > 0) {
                    news--;
                } else {
                    boolean isSuper = methodNode.owner.equals(superName);
                    if (isSuper || methodNode.owner.equals(ownerName)) {
                        return new DelegateInitialiser(methodNode, isSuper);
                    }
                }
            }
        }
    }
    return DelegateInitialiser.NONE;
}
 
Example 16
Source File: FlowObfuscationTransformer.java    From deobfuscator with Apache License 2.0 5 votes vote down vote up
private boolean willPush(AbstractInsnNode ain)
{
	if(ain.getOpcode() == Opcodes.LDC && (((LdcInsnNode)ain).cst instanceof Long || ((LdcInsnNode)ain).cst instanceof Double))
		return false;
	return (Utils.willPushToStack(ain.getOpcode()) || ain.getOpcode() == Opcodes.NEW) && ain.getOpcode() != Opcodes.GETSTATIC
		&& ain.getOpcode() != Opcodes.LLOAD && ain.getOpcode() != Opcodes.DLOAD;
}
 
Example 17
Source File: LevelGeneratorTypeTransformer.java    From patchwork-patcher with GNU Lesser General Public License v3.0 5 votes vote down vote up
@Override
public void visitTypeInsn(int opcode, String type) {
	if (opcode == Opcodes.NEW && LEVEL_GENERATOR_TYPE_NAME.equals(type)) {
		type = PATCHWORK_LEVEL_GENERATOR_TYPE_NAME;
	}

	super.visitTypeInsn(opcode, type);
}
 
Example 18
Source File: RedirectInjector.java    From Mixin with MIT License 4 votes vote down vote up
@Override
protected void inject(Target target, InjectionNode node) {
    if (!this.preInject(node)) {
        return;
    }
        
    if (node.isReplaced()) {
        throw new UnsupportedOperationException("Redirector target failure for " + this.info);
    }
    
    if (node.getCurrentTarget() instanceof MethodInsnNode) {
        this.checkTargetForNode(target, node, RestrictTargetLevel.ALLOW_ALL);
        this.injectAtInvoke(target, node);
        return;
    }
    
    if (node.getCurrentTarget() instanceof FieldInsnNode) {
        this.checkTargetForNode(target, node, RestrictTargetLevel.ALLOW_ALL);
        this.injectAtFieldAccess(target, node);
        return;
    }
    
    if (node.getCurrentTarget() instanceof TypeInsnNode) {
        int opcode = node.getCurrentTarget().getOpcode();
        if (opcode == Opcodes.NEW) {
            if (!this.isStatic && target.isStatic) {
                throw new InvalidInjectionException(this.info, String.format(
                        "non-static callback method %s has a static target which is not supported", this));
            }
            this.injectAtConstructor(target, node);
            return;
        } else if (opcode == Opcodes.INSTANCEOF) {
            this.checkTargetModifiers(target, false);
            this.injectAtInstanceOf(target, node);
            return;
        }
    }
    
    throw new InvalidInjectionException(this.info, String.format("%s annotation on is targetting an invalid insn in %s in %s",
            this.annotationType, target, this));
}
 
Example 19
Source File: TypeInsnNode.java    From JByteMod-Beta with GNU General Public License v2.0 4 votes vote down vote up
public TypeInsnNode() {
  super(Opcodes.NEW);
  desc = "";
}
 
Example 20
Source File: RedirectInjector.java    From Mixin with MIT License 4 votes vote down vote up
@Override
protected void addTargetNode(Target target, List<InjectionNode> myNodes, AbstractInsnNode insn, Set<InjectionPoint> nominators) {
    InjectionNode node = target.getInjectionNode(insn);
    ConstructorRedirectData ctorData = null;
    int fuzz = BeforeFieldAccess.ARRAY_SEARCH_FUZZ_DEFAULT;
    int opcode = 0;
    
    if (insn instanceof MethodInsnNode && Constants.CTOR.equals(((MethodInsnNode)insn).name)) {
        throw new InvalidInjectionException(this.info, String.format("Illegal %s of constructor specified on %s",
                this.annotationType, this));
    }
    
    if (node != null ) {
        Meta other = node.getDecoration(Meta.KEY);
        
        if (other != null && other.getOwner() != this) {
            if (other.priority >= this.meta.priority) {
                Injector.logger.warn("{} conflict. Skipping {} with priority {}, already redirected by {} with priority {}",
                        this.annotationType, this.info, this.meta.priority, other.name, other.priority);
                return;
            } else if (other.isFinal) {
                throw new InvalidInjectionException(this.info, String.format("%s conflict: %s failed because target was already remapped by %s",
                        this.annotationType, this, other.name));
            }
        }
    }
    
    for (InjectionPoint ip : nominators) {
        if (ip instanceof BeforeNew) {
            ctorData = this.getCtorRedirect((BeforeNew)ip);
            ctorData.wildcard = !((BeforeNew)ip).hasDescriptor();
        } else if (ip instanceof BeforeFieldAccess) {
            BeforeFieldAccess bfa = (BeforeFieldAccess)ip;
            fuzz = bfa.getFuzzFactor();
            opcode = bfa.getArrayOpcode();
        }
    }
    
    InjectionNode targetNode = target.addInjectionNode(insn);
    targetNode.decorate(Meta.KEY, this.meta);
    targetNode.decorate(RedirectInjector.KEY_NOMINATORS, nominators);
    if (insn instanceof TypeInsnNode && insn.getOpcode() == Opcodes.NEW) {
        targetNode.decorate(ConstructorRedirectData.KEY, ctorData);
    } else {
        targetNode.decorate(RedirectInjector.KEY_FUZZ, Integer.valueOf(fuzz));
        targetNode.decorate(RedirectInjector.KEY_OPCODE, Integer.valueOf(opcode));
    }
    myNodes.add(targetNode);
}