Java 类org.objectweb.asm.tree.TypeInsnNode 实例源码
项目:GraphiteMappings
文件:WorldMappings.java
@Override
protected void remap() {
findNode(getObfType().getJvmStandard()).ifPresent((classNode -> classNode.methods.forEach((methodNode -> {
if (methodNode.name.equals("<init>")) {
methodNode.instructions.iterator().forEachRemaining((insnNode) -> {
if (insnNode.getOpcode() == Opcodes.ANEWARRAY) {
if (insnNode instanceof TypeInsnNode) {
TypeInsnNode typeInsnNode = (TypeInsnNode) insnNode;
Type type = Type.getType(typeInsnNode.desc);
getMappings().putClass(type.getInternalName(), "net.minecraft.world" +
".IWorldEventListener");
}
}
});
}
}))));
}
项目:luna
文件:BytecodeEmitVisitor.java
@Override
public void visit(Branch.Condition.NumLoopEnd cond) {
assert (destLabel != null);
il.add(new VarInsnNode(ALOAD, slot(cond.var())));
il.add(new TypeInsnNode(CHECKCAST, Type.getInternalName(Number.class)));
il.add(new VarInsnNode(ALOAD, slot(cond.limit())));
il.add(new TypeInsnNode(CHECKCAST, Type.getInternalName(Number.class)));
il.add(new VarInsnNode(ALOAD, slot(cond.step())));
il.add(new TypeInsnNode(CHECKCAST, Type.getInternalName(Number.class)));
il.add(DispatchMethods.continueLoop());
if (!isSub() || resolver.isLocalLabel(destLabel)) {
// local jump
il.add(new JumpInsnNode(IFEQ, l(destLabel)));
} else {
// non-local jump
LabelNode l_nojump = new LabelNode();
il.add(new JumpInsnNode(IFNE, l_nojump));
il.add(_nonLocalGoto(destLabel));
il.add(l_nojump);
il.add(new FrameNode(F_SAME, 0, null, 0, null));
}
}
项目:RorysMod
文件:InstructionComparator.java
public static boolean insnEqual(AbstractInsnNode node1, AbstractInsnNode node2) {
if (node1.getType() != node2.getType()) {
return false;
} else if (node1.getOpcode() != node2.getOpcode()) {
return false;
}
switch (node2.getType()) {
case VAR_INSN:
return varInsnEqual((VarInsnNode) node1, (VarInsnNode) node2);
case TYPE_INSN:
return typeInsnEqual((TypeInsnNode) node1, (TypeInsnNode) node2);
case FIELD_INSN:
return fieldInsnEqual((FieldInsnNode) node1, (FieldInsnNode) node2);
case METHOD_INSN:
return methodInsnEqual((MethodInsnNode) node1, (MethodInsnNode) node2);
case LDC_INSN:
return ldcInsnEqual((LdcInsnNode) node1, (LdcInsnNode) node2);
case IINC_INSN:
return iincInsnEqual((IincInsnNode) node1, (IincInsnNode) node2);
case INT_INSN:
return intInsnEqual((IntInsnNode) node1, (IntInsnNode) node2);
default:
return true;
}
}
项目:thesis-disassembler
文件:TypeInsnNodeHandler.java
@Override
public void handle(AbstractInsnNode node) throws IncorrectNodeException {
super.handle(node);
LOG.debug(logNode(node));
checkType(node, TypeInsnNode.class);
ExpressionStack stack = mState.getActiveStack();
int opCode = node.getOpcode();
String desc = ((TypeInsnNode) node).desc;
if (opCode == Opcodes.NEW) {
stack.push(new NewExpression(opCode, desc));
}
if (opCode == Opcodes.INSTANCEOF) {
stack.push(new InstanceOfExpression(opCode, desc));
}
if (opCode == Opcodes.ANEWARRAY) {
stack.push(new ArrayCreationExpression(opCode, desc));
}
}
项目:testrecorder
文件:ReturnFakeOrProceed.java
@Override
public InsnList build(MethodContext context) {
Type returnType = context.getResultType();
InsnList insnList = new InsnList();
LabelNode continueLabel = new LabelNode();
insnList.add(new InsnNode(DUP));
insnList.add(new FieldInsnNode(GETSTATIC, Type.getInternalName(clazz), field, Type.getDescriptor(Object.class)));
insnList.add(new JumpInsnNode(IF_ACMPEQ, continueLabel));
if (returnType.getSize() == 0) {
insnList.add(new InsnNode(POP));
insnList.add(new InsnNode(RETURN));
} else if (isPrimitive(returnType)) {
insnList.add(new UnboxPrimitives(returnType).build(context));
insnList.add(new InsnNode(returnType.getOpcode(IRETURN)));
} else {
insnList.add(new TypeInsnNode(CHECKCAST, returnType.getInternalName()));
insnList.add(new InsnNode(ARETURN));
}
insnList.add(continueLabel);
insnList.add(new InsnNode(POP));
return insnList;
}
项目:testrecorder
文件:WrapArgumentTypes.java
@Override
public InsnList build(MethodContext context) {
Type[] argumentTypes = context.getArgumentTypes();
InsnList insnList = new InsnList();
insnList.add(new LdcInsnNode(argumentTypes.length));
insnList.add(new TypeInsnNode(Opcodes.ANEWARRAY, Type.getInternalName(java.lang.reflect.Type.class)));
for (int i = 0; i < argumentTypes.length; i++) {
insnList.add(new InsnNode(DUP));
insnList.add(new LdcInsnNode(i));
insnList.add(new PushBoxedType(argumentTypes[i]).build(context));
insnList.add(new InsnNode(AASTORE));
}
return insnList;
}
项目:testrecorder
文件:WrapArguments.java
@Override
public InsnList build(MethodContext context) {
Type[] argumentTypes = context.getArgumentTypes();
int[] arguments = context.getArguments();
InsnList insnList = new InsnList();
insnList.add(new LdcInsnNode(arguments.length));
insnList.add(new TypeInsnNode(Opcodes.ANEWARRAY, Type.getInternalName(Object.class)));
for (int i = 0; i < arguments.length; i++) {
insnList.add(new InsnNode(DUP));
insnList.add(new LdcInsnNode(i));
int index = arguments[i];
Type type = argumentTypes[i];
insnList.add(new VarInsnNode(type.getOpcode(ILOAD), index));
insnList.add(new BoxPrimitives(type).build(context));
insnList.add(new InsnNode(AASTORE));
}
return insnList;
}
项目:testrecorder
文件:GetInvokedMethodArgumentTypes.java
@Override
public InsnList build(MethodContext context) {
Type[] argumentTypes = Type.getArgumentTypes(call.desc);
InsnList insnList = new InsnList();
insnList.add(new LdcInsnNode(argumentTypes.length));
insnList.add(new TypeInsnNode(Opcodes.ANEWARRAY, Type.getInternalName(java.lang.reflect.Type.class)));
for (int i = 0; i < argumentTypes.length; i++) {
insnList.add(new InsnNode(DUP));
insnList.add(new LdcInsnNode(i));
insnList.add(new PushBoxedType(argumentTypes[i]).build(context));
insnList.add(new InsnNode(AASTORE));
}
return insnList;
}
项目:Diorite
文件:TransformerInjectTracker.java
private AbstractInsnNode skipCheckCastBackwards(AbstractInsnNode node)
{
// skip possible (?) ALOAD 0 if not static
if (! this.isStatic && (node instanceof VarInsnNode) && (node.getOpcode() == ALOAD) && (((VarInsnNode) node).var == 0))
{
node = node.getPrevious();
}
// skip possible check cast
if ((node instanceof TypeInsnNode) && (node.getOpcode() == CHECKCAST))
{
node = node.getPrevious();
}
// skip possible (?) ALOAD 0 if not static
if (! this.isStatic && (node instanceof VarInsnNode) && (node.getOpcode() == ALOAD) && (((VarInsnNode) node).var == 0))
{
node = node.getPrevious();
}
return node;
}
项目:BetterLoadingScreen_1.7
文件:BetterLoadingScreenTransformer.java
private byte[] transformObjectFactoryClient(byte[] before) {
ClassNode classNode = new ClassNode();
ClassReader reader = new ClassReader(before);
reader.accept(classNode, 0);
for (MethodNode m : classNode.methods) {
if (m.name.equals("preBeginGame")) {
m.instructions.clear();
m.instructions.add(new TypeInsnNode(NEW, "alexiil/mods/load/LiteLoaderProgress"));
m.instructions.add(new MethodInsnNode(INVOKESPECIAL, "alexiil/mods/load/LiteLoaderProgress", "<init>", "()V", false));
m.instructions.add(new InsnNode(RETURN));
}
}
ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_FRAMES | ClassWriter.COMPUTE_MAXS);
classNode.accept(cw);
return cw.toByteArray();
}
项目:morecommands
文件:TransformItemStack.java
private void transformDamageItem(MethodNode method) {
InsnList postEvent = new InsnList();
LabelNode label = new LabelNode(new Label());
postEvent.add(new TypeInsnNode(Opcodes.NEW, DAMAGE_ITEM_EVENT.getInternalName()));
postEvent.add(new InsnNode(Opcodes.DUP));
postEvent.add(new VarInsnNode(Opcodes.ALOAD, 2));
postEvent.add(new VarInsnNode(Opcodes.ILOAD, 1));
postEvent.add(new VarInsnNode(Opcodes.ALOAD, 0));
postEvent.add(new MethodInsnNode(Opcodes.INVOKESPECIAL, DAMAGE_ITEM_EVENT_INIT.getOwnerInternalName(), DAMAGE_ITEM_EVENT_INIT.getEnvName(), DAMAGE_ITEM_EVENT_INIT.getDesc(), false));
postEvent.add(new VarInsnNode(Opcodes.ASTORE, 3));
postEvent.add(new FieldInsnNode(Opcodes.GETSTATIC, EVENTHANDLER_DAMAGE_ITEM.getOwnerInternalName(), EVENTHANDLER_DAMAGE_ITEM.getEnvName(), EVENTHANDLER_DAMAGE_ITEM.getDesc()));
postEvent.add(new VarInsnNode(Opcodes.ALOAD, 3));
postEvent.add(new MethodInsnNode(Opcodes.INVOKEVIRTUAL, POST.getOwnerInternalName(), POST.getEnvName(), POST.getDesc(), false));
postEvent.add(new JumpInsnNode(Opcodes.IFEQ, label));
postEvent.add(new InsnNode(Opcodes.RETURN));
postEvent.add(label);
postEvent.add(new FrameNode(Opcodes.F_APPEND, 1, new Object[] {DAMAGE_ITEM_EVENT.getInternalName()}, 0, null));
postEvent.add(new VarInsnNode(Opcodes.ALOAD, 3));
postEvent.add(new FieldInsnNode(Opcodes.GETFIELD, DAMAGE.getOwnerInternalName(), DAMAGE.getEnvName(), DAMAGE.getDesc()));
postEvent.add(new VarInsnNode(Opcodes.ISTORE, 1));
method.instructions.insert(postEvent);
}
项目:NOVA-Core
文件:InstructionComparator.java
public static boolean insnEqual(AbstractInsnNode node1, AbstractInsnNode node2) {
if (node1.getOpcode() != node2.getOpcode()) {
return false;
}
switch (node2.getType()) {
case VAR_INSN:
return varInsnEqual((VarInsnNode) node1, (VarInsnNode) node2);
case TYPE_INSN:
return typeInsnEqual((TypeInsnNode) node1, (TypeInsnNode) node2);
case FIELD_INSN:
return fieldInsnEqual((FieldInsnNode) node1, (FieldInsnNode) node2);
case METHOD_INSN:
return methodInsnEqual((MethodInsnNode) node1, (MethodInsnNode) node2);
case LDC_INSN:
return ldcInsnEqual((LdcInsnNode) node1, (LdcInsnNode) node2);
case IINC_INSN:
return iincInsnEqual((IincInsnNode) node1, (IincInsnNode) node2);
case INT_INSN:
return intInsnEqual((IntInsnNode) node1, (IntInsnNode) node2);
default:
return true;
}
}
项目:NOVA-Core
文件:InstructionComparator.java
public static boolean insnEqual(AbstractInsnNode node1, AbstractInsnNode node2) {
if (node1.getOpcode() != node2.getOpcode()) {
return false;
}
switch (node2.getType()) {
case VAR_INSN:
return varInsnEqual((VarInsnNode) node1, (VarInsnNode) node2);
case TYPE_INSN:
return typeInsnEqual((TypeInsnNode) node1, (TypeInsnNode) node2);
case FIELD_INSN:
return fieldInsnEqual((FieldInsnNode) node1, (FieldInsnNode) node2);
case METHOD_INSN:
return methodInsnEqual((MethodInsnNode) node1, (MethodInsnNode) node2);
case LDC_INSN:
return ldcInsnEqual((LdcInsnNode) node1, (LdcInsnNode) node2);
case IINC_INSN:
return iincInsnEqual((IincInsnNode) node1, (IincInsnNode) node2);
case INT_INSN:
return intInsnEqual((IntInsnNode) node1, (IntInsnNode) node2);
default:
return true;
}
}
项目:GemFireLite
文件:MapperToolProcessor.java
private void addMapperValueMethod(ClassNode domain, ClassNode mapper)
{
if (DomainMojoHelper.log().isDebugEnabled())
DomainMojoHelper.log().debug("Add mapperValue(IDataSource)V method...");
MethodNode mn = new MethodNode(ACC_PUBLIC, "mapperValue", "(Lgemlite/core/internal/domain/IDataSource;)L"
+ domain.name + ";", null, null);
InsnList insn = mn.instructions;
insn.add(new TypeInsnNode(NEW, domain.name));
insn.add(new InsnNode(DUP));
insn.add(AsmHelper.newMethodInsnNode(INVOKESPECIAL, domain.name, "<init>", "()V", false));
insn.add(new VarInsnNode(ASTORE, 2));
insn.add(new VarInsnNode(ALOAD, 0));
insn.add(new VarInsnNode(ALOAD, 1));
insn.add(new VarInsnNode(ALOAD, 2));
insn.add(AsmHelper.newMethodInsnNode(INVOKEVIRTUAL, mapper.name, "mapperValue",
"(Lgemlite/core/internal/domain/IDataSource;L" + domain.name + ";)L" + domain.name + ";", false));
insn.add(new InsnNode(POP));
insn.add(new VarInsnNode(ALOAD, 2));
insn.add(new InsnNode(ARETURN));
mapper.methods.add(mn);
if (DomainMojoHelper.log().isDebugEnabled())
DomainMojoHelper.log().debug("Add mapperValue(IDataSource)V method done.");
}
项目:SpaceCore
文件:PacketInterceptTransformer.java
private void injectProcessInterceptor( MethodNode method, String parent, String realName, String methodParam )
{
SpaceCoreLog.fine( "Injecting at beginning of method...." );
String realParent = ObfuscationUtils.asmify( parent );
String realClass = ObfuscationUtils.asmify( realName );
InsnList instructions = new InsnList();
instructions.add( new VarInsnNode( ALOAD, 1 ) );
instructions.add( new VarInsnNode( ALOAD, 0 ) );
instructions.add( new TypeInsnNode( CHECKCAST, realParent ) );
instructions.add( new MethodInsnNode( INVOKESTATIC, "com/spacechase0/minecraft/spacecore/network/PacketInterceptor", "intercept", "(L" + methodParam + ";L" + realParent + ";)V" ) );
//System.out.println( methodParam+" "+realClass );
method.instructions.insertBefore( method.instructions.get( 0 ), instructions );
}
项目:SpaceCore
文件:PacketInterceptTransformer.java
private void injectSendInterceptor( MethodNode method, String parent, String methodParam )
{
SpaceCoreLog.fine( "Injecting at beginning of method...." );
String realParent = ObfuscationUtils.asmify( parent );
//String realClass = ObfuscationUtils.asmify( realName );
InsnList instructions = new InsnList();
instructions.add( new VarInsnNode( ALOAD, 0 ) );
instructions.add( new VarInsnNode( ALOAD, 1 ) );
instructions.add( new TypeInsnNode( CHECKCAST, realParent ) );
instructions.add( new MethodInsnNode( INVOKESTATIC, "com/spacechase0/minecraft/spacecore/network/PacketInterceptor", "intercept", "(L" + realParent + ";L" + methodParam + ";)V" ) );
//System.out.println( methodParam+" "+realClass );
method.instructions.insertBefore( method.instructions.get( 0 ), instructions );
}
项目:instrumentation
文件:Instrumentator.java
private int addMethodParametersVariable(InsnList il) {
il.add(TreeInstructions.getPushInstruction(this.methodArguments.length));
il.add(new TypeInsnNode(Opcodes.ANEWARRAY, "java/lang/Object"));
int methodParametersIndex = getFistAvailablePosition();
il.add(new VarInsnNode(Opcodes.ASTORE, methodParametersIndex));
this.mn.maxLocals++;
for (int i = 0; i < this.methodArguments.length; i++) {
il.add(new VarInsnNode(Opcodes.ALOAD, methodParametersIndex));
il.add(TreeInstructions.getPushInstruction(i));
il.add(TreeInstructions.getLoadInst(methodArguments[i],
getArgumentPosition(i)));
MethodInsnNode mNode = TreeInstructions
.getWrapperContructionInst(methodArguments[i]);
if (mNode != null) {
il.add(mNode);
}
il.add(new InsnNode(Opcodes.AASTORE));
}
return methodParametersIndex;
}
项目:instrumentation
文件:Instrumentator.java
private void addGetMethodInvocation(InsnList il) {
il.add(TreeInstructions.getPushInstruction(this.methodArguments.length));
il.add(new TypeInsnNode(Opcodes.ANEWARRAY, "java/lang/Class"));
int parameterClassesIndex = getFistAvailablePosition();
il.add(new VarInsnNode(Opcodes.ASTORE, parameterClassesIndex));
this.mn.maxLocals++;
for (int i = 0; i < this.methodArguments.length; i++) {
il.add(new VarInsnNode(Opcodes.ALOAD, parameterClassesIndex));
il.add(TreeInstructions.getPushInstruction(i));
il.add(TreeInstructions.getClassReferenceInstruction(methodArguments[i], cn.version & 0xFFFF));
il.add(new InsnNode(Opcodes.AASTORE));
}
il.add(TreeInstructions.getClassConstantReference(this.classType, cn.version & 0xFFFF));
il.add(new LdcInsnNode(this.mn.name));
il.add(new VarInsnNode(Opcodes.ALOAD, parameterClassesIndex));
il.add(new MethodInsnNode(Opcodes.INVOKESTATIC,
"org/brutusin/instrumentation/utils/Helper", "getSource",
"(Ljava/lang/Class;Ljava/lang/String;[Ljava/lang/Class;)Ljava/lang/Object;", false));
}
项目:evosuite
文件:BooleanArrayTransformer.java
@Override
protected AbstractInsnNode transformTypeInsnNode(MethodNode mn,
TypeInsnNode typeNode) {
String new_desc = "";
int pos = 0;
while (pos < typeNode.desc.length() && typeNode.desc.charAt(pos) == '[') {
new_desc += "[";
pos++;
}
String d = typeNode.desc.substring(pos);
BooleanTestabilityTransformation.logger.info("Unfolded arrays to: " + d);
if (d.equals("Z"))
//if (t.equals(Type.BOOLEAN_TYPE))
new_desc += "I";
else
new_desc += d; //t.getInternalName();
typeNode.desc = new_desc;
return typeNode;
}
项目:evosuite
文件:BooleanArrayIndexTransformer.java
@Override
protected AbstractInsnNode transformTypeInsnNode(MethodNode mn,
TypeInsnNode typeNode) {
if (frames == null)
return typeNode;
if (typeNode.getOpcode() == Opcodes.CHECKCAST) {
Frame current = frames[mn.instructions.indexOf(typeNode)];
int size = current.getStackSize();
if (current.getStack(size - 1) == BooleanArrayInterpreter.INT_ARRAY) {
BooleanTestabilityTransformation.logger.info("Array is of boolean type, changing CHECKCAST to [I");
TypeInsnNode replacement = new TypeInsnNode(Opcodes.CHECKCAST, "[I");
mn.instructions.insertBefore(typeNode, replacement);
mn.instructions.remove(typeNode);
return replacement;
}
}
return typeNode;
}
项目:DynamicMappings
文件:SharedMappings.java
@Mapping(provides="net/minecraft/util/ChatComponentText", depends="net/minecraft/server/MinecraftServer")
public boolean getChatComponentTextClass()
{
ClassNode server = getClassNode("net/minecraft/server/MinecraftServer");
if (server == null) return false;
List<MethodNode> methods = getMatchingMethods(server, "run", "()V");
if (methods.size() != 1) return false;
for (AbstractInsnNode insn = methods.get(0).instructions.getFirst(); insn != null; insn = insn.getNext()) {
if (insn.getOpcode() != Opcodes.NEW) continue;
TypeInsnNode tn = (TypeInsnNode)insn;
if (searchConstantPoolForStrings(tn.desc, "TextComponent{text=\'")) {
addClassMapping("net/minecraft/util/ChatComponentText", tn.desc);
return true;
}
}
return false;
}
项目:DynamicMappings
文件:SharedMappings.java
@Mapping(provides="net/minecraft/entity/player/EntityPlayerMP", depends="net/minecraft/server/MinecraftServer")
public boolean getEntityPlayerMPClass()
{
ClassNode server = getClassNodeFromMapping("net/minecraft/server/MinecraftServer");
if (server == null) return false;
List<MethodNode> methods = getMatchingMethods(server, null, "()V");
for (MethodNode method : methods) {
for (AbstractInsnNode insn = method.instructions.getFirst(); insn != null; insn = insn.getNext()) {
if (insn.getOpcode() != Opcodes.CHECKCAST) continue;
TypeInsnNode tn = (TypeInsnNode)insn;
if (searchConstantPoolForStrings(tn.desc, "en_US", "playerGameType", "Player being ticked")) {
addClassMapping("net/minecraft/entity/player/EntityPlayerMP", tn.desc);
return true;
}
}
}
return false;
}
项目:coroutines
文件:GenericGenerators.java
/**
* Calls a constructor with a set of arguments. After execution the stack should have an extra item pushed on it: the object that was
* created by this constructor.
* @param constructor constructor to call
* @param args constructor argument instruction lists -- each instruction list must leave one item on the stack of the type expected
* by the constructor
* @return instructions to invoke a constructor
* @throws NullPointerException if any argument is {@code null} or array contains {@code null}
* @throws IllegalArgumentException if the length of {@code args} doesn't match the number of parameters in {@code constructor}
*/
public static InsnList construct(Constructor<?> constructor, InsnList ... args) {
Validate.notNull(constructor);
Validate.notNull(args);
Validate.noNullElements(args);
Validate.isTrue(constructor.getParameterCount() == args.length);
InsnList ret = new InsnList();
Type clsType = Type.getType(constructor.getDeclaringClass());
Type methodType = Type.getType(constructor);
ret.add(new TypeInsnNode(Opcodes.NEW, clsType.getInternalName()));
ret.add(new InsnNode(Opcodes.DUP));
for (InsnList arg : args) {
ret.add(arg);
}
ret.add(new MethodInsnNode(Opcodes.INVOKESPECIAL, clsType.getInternalName(), "<init>", methodType.getDescriptor(), false));
return ret;
}
项目:TextFormatting
文件:AllowedCharactersTransformer.java
private void injectFormatSymbol( MethodNode method, int index )
{
TextFormattingLog.info( "Injecting at index " + index );
InsnList list = new InsnList();
list.add( new TypeInsnNode( NEW, "java/lang/StringBuilder" ) );
list.add( new InsnNode( DUP ) );
list.add( new LdcInsnNode( "Adding format symbol to allowed characters list..." ) );
list.add( new MethodInsnNode( INVOKESTATIC, "com/spacechase0/minecraft/textformatting/TextFormattingLog", "info", "(Ljava/lang/String;)V" ) );
list.add( new VarInsnNode( ALOAD, 0 ) );
list.add( new MethodInsnNode( INVOKESPECIAL, "java/lang/StringBuilder", "<init>", "(Ljava/lang/String;)V" ) );
list.add( new FieldInsnNode( GETSTATIC, "com/spacechase0/minecraft/textformatting/ColorData", "formatSymbol", "Ljava/lang/String;" ) );
list.add( new MethodInsnNode( INVOKEVIRTUAL, "java/lang/StringBuilder", "append", "(Ljava/lang/String;)Ljava/lang/StringBuilder;" ) );
list.add( new MethodInsnNode( INVOKEVIRTUAL, "java/lang/StringBuilder", "toString", "()Ljava/lang/String;" ) );
list.add( new VarInsnNode( ASTORE, 0 ) );
method.instructions.insertBefore( method.instructions.get( index ), list );
}
项目:BitPlus
文件:SimplePlugin.java
private void createInstances(ClassNode cn) {
for (MethodNode mn : cn.methods) {
if (!new PatternBuilder().add(new LdcElement(new LdcInsnNode("PulpCore-Destroyer"))).build()
.contains(mn.instructions))
continue;
for (String clazz : instancesCreate) {
InsnList inject = new InsnList();
inject.add(new TypeInsnNode(Opcodes.NEW, clazz));
inject.add(new MethodInsnNode(Opcodes.INVOKESPECIAL, clazz, "<init>", "()V", false));
mn.instructions.insertBefore(mn.instructions.get(0), inject);
}
}
}
项目:FullRobolectricTestSample
文件:AsmInstrumentingClassLoader.java
public static void box(final Type type, ListIterator<AbstractInsnNode> instructions) {
if (type.getSort() == Type.OBJECT || type.getSort() == Type.ARRAY) {
return;
}
if (type == Type.VOID_TYPE) {
instructions.add(new InsnNode(ACONST_NULL));
} else {
Type boxed = getBoxedType(type);
instructions.add(new TypeInsnNode(NEW, boxed.getInternalName()));
if (type.getSize() == 2) {
// Pp -> Ppo -> oPpo -> ooPpo -> ooPp -> o
instructions.add(new InsnNode(DUP_X2));
instructions.add(new InsnNode(DUP_X2));
instructions.add(new InsnNode(POP));
} else {
// p -> po -> opo -> oop -> o
instructions.add(new InsnNode(DUP_X1));
instructions.add(new InsnNode(SWAP));
}
instructions.add(new MethodInsnNode(INVOKESPECIAL, boxed.getInternalName(), "<init>", "(" + type.getDescriptor() + ")V"));
}
}
项目:lambdamatic-project
文件:LambdaExpressionReader.java
/**
* Checks if an operation of type OpsCode.CHECKCAST is following this operation, in which case it
* provides valuable info about the actual returned type of the method
*
* @param insnCursor the {@link InsnCursor}
* @param javaMethod the current Java {@link Method}
* @return the return type of the given method.
*/
private static Class<?> findReturnType(final InsnCursor insnCursor, final Method javaMethod) {
if (insnCursor.hasNext()) {
final AbstractInsnNode nextOp = insnCursor.getNext();
if (nextOp.getOpcode() == Opcodes.CHECKCAST) {
final TypeInsnNode checkCastInsnNode = (TypeInsnNode) nextOp;
try {
return Class.forName(Type.getObjectType(checkCastInsnNode.desc).getClassName());
} catch (ClassNotFoundException e) {
throw new AnalyzeException("Failed to retrieve class for " + checkCastInsnNode.desc, e);
}
} else {
// move cursor position backwards
insnCursor.getPrevious();
}
}
return javaMethod.getReturnType();
}
项目:lambdamatic-project
文件:LambdaExpressionReader.java
/**
* Reads the given {@link TypeInsnNode} instruction.
*
* @param typeInsnNode the instruction to read
* @param expressionStack the expression stack to put on or pop from.
* @param localVariables the local variables
*/
private static void readTypeInstruction(final TypeInsnNode typeInsnNode,
final Stack<Expression> expressionStack, final LocalVariables localVariables) {
switch (typeInsnNode.getOpcode()) {
case Opcodes.NEW:
final Type instanceType = Type.getObjectType(typeInsnNode.desc);
final ObjectInstanciation objectVariable = new ObjectInstanciation(getType(instanceType));
expressionStack.push(objectVariable);
break;
case Opcodes.ANEWARRAY:
final Type parameterType = Type.getObjectType(typeInsnNode.desc);
final NumberLiteral arrayLength = (NumberLiteral) expressionStack.pop();
final ArrayVariable arrayVariable =
new ArrayVariable(getArrayType(parameterType), arrayLength.getValue().intValue());
expressionStack.push(arrayVariable);
break;
default:
LOGGER.warn("TypeInsnNode with OpCode {} was ignored.", typeInsnNode.getOpcode());
}
}
项目:autumn
文件:Utils.java
/**
* This method generates bytecode to retrieve a value from an ArgumentStack.
*
* <p>
* If the value is a reference type, then it will be downcast.
* </p>
*
* @param program is the program being compiled.
* @param code is the list of generated bytecode to add instructions to.
* @param type is the type of the value that will be retrieved.
*/
public static void peekArgument(final ProgramCompiler program,
final InsnList code,
final IExpressionType type)
{
// Assume: The ArgumentStack is already on the operand-stack.
final String OBJECT = "Ljava/lang/Object;";
// Invoke the peek method in order to retrive the value.
final String owner = Utils.internalName(program.typesystem.utils.ARGUMENT_STACK);
final String name = "peek" + (type.isPrimitiveType() ? type.getDescriptor() : "O");
final String desc = "()" + (type.isPrimitiveType() ? type.getDescriptor() : OBJECT);
code.add(new MethodInsnNode(Opcodes.INVOKEVIRTUAL, owner, name, desc));
// If the type is a reference-type, then downcast the value.
if (type.isReferenceType())
{
final String cast = Utils.internalName((IReferenceType) type);
code.add(new TypeInsnNode(Opcodes.CHECKCAST, cast));
}
}
项目:autumn
文件:Utils.java
/**
* This method generates bytecode to retrieve a value from an ArgumentStack at a given index.
*
* <p>
* The index is numbered from the base of the stack.
* So, index zero is the bottommost element.
* </p>
*
* <p>
* If the value is a reference type, then it will be downcast.
* </p>
*
* @param program is the program being compiled.
* @param code is the list of generated bytecode to add instructions to.
* @param type is the type of the value that will be retrieved.
* @param index is the index of the argument to retrieve.
*/
public static void getArgument(final ProgramCompiler program,
final InsnList code,
final IExpressionType type,
final int index)
{
// Assume: The ArgumentStack is already on the operand-stack.
final String OBJECT = "Ljava/lang/Object;";
// Load the index onto the operand-stack.
code.add(new LdcInsnNode(index));
// Invoke the get method in order to retrive the value.
final String owner = Utils.internalName(program.typesystem.utils.ARGUMENT_STACK);
final String name = "get" + (type.isPrimitiveType() ? type.getDescriptor() : "O");
final String desc = "(I)" + (type.isPrimitiveType() ? type.getDescriptor() : OBJECT);
code.add(new MethodInsnNode(Opcodes.INVOKEVIRTUAL, owner, name, desc));
// If the type is a reference-type, then downcast the value.
if (type.isReferenceType())
{
final String cast = Utils.internalName((IReferenceType) type);
code.add(new TypeInsnNode(Opcodes.CHECKCAST, cast));
}
}
项目:autumn
文件:Utils.java
/**
* This method conditionally generates a checked-cast instruction.
*
* <p>
* In other words, this method will not generate a clearly unnecessary or impossible cast.
* </p>
*
* @param value is the type of the value being cast.
* @param type is the type to cast the value to.
* @return the generated instruction.
*/
public static AbstractInsnNode conditionalCast(final IExpressionType value,
final IExpressionType type)
{
if (value.isReferenceType() == false || type.isReferenceType() == false)
{
return new InsnNode(Opcodes.NOP);
}
else if (value.isSubtypeOf(type))
{
return new InsnNode(Opcodes.NOP);
}
else
{
return new TypeInsnNode(Opcodes.CHECKCAST, Utils.internalName((IReferenceType) type));
}
}
项目:autumn
文件:FunctionCompiler.java
/**
* This method generates the default method termination bytecode.
*
* <p>
* If a function does not contain a return statement, then execution may reach the end
* of the function during an invocation. The JVM requires that this special case be handled.
* Thus, it is necessary to generate bytecode to handle this special situation.
* </p>
*
* <p>
* Per the specification, a function will simply return, if the return-type is void.
* On the other hand, the function will raise an exception, if the return-type is non-void.
* </p>
*
* @param is the bytecode representation of the function.
*/
private void addDefaultMethodTermination(final MethodNode method)
{
if (isReturnTypeVoid())
{
method.instructions.add(new InsnNode(Opcodes.RETURN));
}
else
{
method.instructions.add(new TypeInsnNode(Opcodes.NEW, "autumn/lang/exceptions/UnexpectedTerminationException"));
method.instructions.add(new InsnNode(Opcodes.DUP));
method.instructions.add(new MethodInsnNode(Opcodes.INVOKESPECIAL,
"autumn/lang/exceptions/UnexpectedTerminationException",
"<init>",
"()V"));
method.instructions.add(new InsnNode(Opcodes.ATHROW));
}
}
项目:autumn
文件:ExpressionCodeGenerator.java
@Override
public void visit(final InstanceOfExpression object)
{
// Generated Bytecode:
//
// <value> - Evaluate the value expression.
// INSTANCEOF value : type - Perform the instance-of operation.
//
////////////////////////////////////////////////////////////////////
final IType type = module.imports.resolveDeclaredType(object.getType());
// Evaluate the expression.
object.getValue().accept(this);
// Perform the instance-of check.
code.add(new TypeInsnNode(Opcodes.INSTANCEOF, Utils.internalName((IDeclaredType) type)));
}
项目:autumn
文件:ExpressionCodeGenerator.java
@Override
public void visit(final IsOperation object)
{
// The type-checker created an object that describes the conversion to perform.
final Conversion conversion = program.symbols.conversions.get(object);
if (conversion.cast)
{
// Evaluate the expression that produces the value to convert.
object.getValue().accept(this);
// Perform the checked cast.
code.add(new TypeInsnNode(Opcodes.CHECKCAST, Utils.internalName((IReferenceType) conversion.type)));
}
else
{
// Evaluate the expression that produces the value to convert.
object.getValue().accept(this);
// Invoke the conversion method.
final String owner = Utils.internalName(program.typesystem.utils.CONVERSIONS);
final String name = conversion.name;
final String desc = "(" + conversion.value.getDescriptor() + ")" + conversion.type.getDescriptor();
code.add(new MethodInsnNode(Opcodes.INVOKESTATIC, owner, name, desc));
}
}
项目:TurtleFix
文件:ComparisionUtil.java
public static boolean isEquals(AbstractInsnNode source, AbstractInsnNode node) {
if (source instanceof MethodInsnNode) {
return isEqualsMethodInsn((MethodInsnNode) source, node);
}
if (source instanceof FieldInsnNode) {
return isEqualsFieldInsn((FieldInsnNode) source, node);
}
if (source instanceof VarInsnNode) {
return isEqualsVarInsn((VarInsnNode) source, node);
}
if (source instanceof LdcInsnNode) {
return isEqualsLdcInsn((LdcInsnNode) source, node);
}
if (source instanceof TypeInsnNode) {
return isEqualsTypeInsn((TypeInsnNode) source, node);
}
return source.getType() == node.getType() && source.getOpcode() == node.getOpcode();
}
项目:grappa
文件:ImplicitActionsConverter.java
private boolean isStoredIntoObjectArray(final InstructionGraphNode node)
{
// is the single dependent an AASTORE instruction ?
final AbstractInsnNode insn = node.getInstruction();
if (insn.getOpcode() != AASTORE)
return false;
// Does this instruction store into an array of Object ?
final List<InstructionGraphNode> dependents = getDependents(node);
// an AASTORE instruction should have exactly one dependent
Preconditions.checkState(dependents.size() == 1);
final AbstractInsnNode newArrayInsn
= dependents.get(0).getInstruction();
// which should be a n ANEWARRAY instruction
Preconditions.checkState(newArrayInsn.getOpcode() == ANEWARRAY);
final String desc = ((TypeInsnNode) newArrayInsn).desc;
return CodegenUtils.p(Object.class).equals(desc);
}
项目:grappa
文件:ConstructorGenerator.java
private static void createNewInstanceMethod(final ParserClassNode classNode)
{
// TODO: replace with Code{Block,GenUtils}
final String desc = "()L" + Type.getType(BaseParser.class)
.getInternalName() + ';';
final MethodNode method = new MethodNode(ACC_PUBLIC, "newInstance",
desc, null, null);
final InsnList instructions = method.instructions;
instructions.add(new TypeInsnNode(NEW, classNode.name));
instructions.add(new InsnNode(DUP));
instructions.add(new MethodInsnNode(INVOKESPECIAL, classNode.name,
"<init>", "()V", false));
instructions.add(new InsnNode(ARETURN));
classNode.methods.add(method);
}
项目:pinpoint
文件:ASMMethodVariables.java
AbstractInsnNode findInitConstructorInstruction() {
int nested = 0;
for (AbstractInsnNode insnNode = this.methodNode.instructions.getFirst(); insnNode != null; insnNode = insnNode.getNext()) {
if (insnNode instanceof TypeInsnNode) {
if (insnNode.getOpcode() == Opcodes.NEW) {
// new object().
nested++;
}
} else if (insnNode instanceof MethodInsnNode) {
final MethodInsnNode methodInsnNode = (MethodInsnNode) insnNode;
if (methodInsnNode.getOpcode() == Opcodes.INVOKESPECIAL && methodInsnNode.name.equals("<init>")) {
if (--nested < 0) {
// find this() or super().
return insnNode.getNext();
}
}
}
}
return null;
}
项目:bazel
文件:LambdaClassFixer.java
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());
}
项目:spassMeter
文件:StatementModifier.java
/**
* Replace the created type in a new array or new object expression.
*
* @param newType the type to be created
* @param accountMemory should the allocated memory be accounted
* @throws InstrumenterException in case of errors in the byte code
*
* @since 1.00
*/
@Override
public void replaceCreatedType(String newType, boolean accountMemory)
throws InstrumenterException {
newType = Factory.toInternalName(newType);
if (!lastNew.isEmpty()) {
int lastIndex = lastNew.size() - 1;
TypeInsnNode nn = lastNew.get(lastIndex);
nn.desc = newType;
MethodInsnNode mNode = (MethodInsnNode) instruction;
mNode.owner = newType;
// does not change maxStack or maxLocals
}
if (accountMemory) {
appendMemoryAllocated(null);
}
}