Refine search
private MethodNode generateStaticInitializerNotifierMethod(MutableClass mutableClass) { MethodNode methodNode = new MethodNode(Opcodes.ACC_STATIC, "<clinit>", "()V", "()V", null); RobolectricGeneratorAdapter generator = new RobolectricGeneratorAdapter(methodNode); generator.push(mutableClass.classType); generator.invokeStatic(Type.getType(RobolectricInternals.class), new Method("classInitializing", "(Ljava/lang/Class;)V")); generator.returnValue(); generator.endMethod(); return methodNode; }
@Override public void accept(ClassVisitor cv) { super.accept(cv); } }
@Override public void visitMethodInsn(int opcode, String owner, String name, String desc,boolean itf) { super.visitMethodInsn(opcode, owner, name, desc, itf); // The only reason for adding to pausableMethods is to create a BB for pausable // method call sites. If the class is already woven, we don't need this // functionality. if (!classFlow.isWoven) { int methodStatus = detector.getPausableStatus(owner, name, desc); if (methodStatus == Detector.PAUSABLE_METHOD_FOUND) { MethodInsnNode min = (MethodInsnNode)instructions.get(instructions.size()-1); pausableMethods.add(min); } } }
private void visitOP0(int op){ if(op>=26&&op<=45){ // xload_y int x=op-26; mn.visitVarInsn(ILOAD+x/4,x%4); }else if(op>=59&&op<=78){ // xstore_y int x=op-26; mn.visitVarInsn(ISTORE+x/4,x%4); }else{ mn.visitInsn(op); } } private void visitIOP(int op, int a){
private void line(int ln){ if(rebuildLine) { Label label=new Label(); mn.visitLabel(label); mn.visitLineNumber(ln, label); } } private static String unEscapeString(String str) {
private InsnList extractCallToSuperConstructor(MutableClass mutableClass, MethodNode ctor) { InsnList removedInstructions = new InsnList(); int startIndex = 0; AbstractInsnNode[] insns = ctor.instructions.toArray(); for (int i = 0; i < insns.length; i++) { AbstractInsnNode node = insns[i]; ctor.instructions.remove(insns[startIndex]); removedInstructions.add(insns[startIndex]); startIndex++; ctor.visitCode(); ctor.visitInsn(Opcodes.RETURN); ctor.visitEnd(); return removedInstructions;
private static MethodNode generateGetterConstructor() { MethodNode cn = new MethodNode(); cn.name = "<init>"; cn.desc = "()V"; cn.access = ACC_PUBLIC; cn.exceptions = Collections.emptyList(); cn.maxStack = 1; cn.maxLocals = 1; // load the instance cn.visitVarInsn(ALOAD, 0); // call superclass constructor cn.visitMethodInsn(INVOKESPECIAL, Type.getInternalName(BeanAttributeGetter.class), "<init>", "()V", false); cn.visitInsn(RETURN); return cn; }
} else if (mn.name.equals(getItemStackMethodName) && mn.desc.equals(getItemStackMethodDesc)) { sendPatchLog("getItemStackFromSlot"); MethodNode mv = new MethodNode(ACC_PUBLIC, getItemStackMethodName, getItemStackMethodDesc, null, null); mv.visitCode(); Label l0 = new Label(); mv.visitLabel(l0); mv.visitVarInsn(ALOAD, 0); mv.visitVarInsn(ALOAD, 1); mv.visitMethodInsn(INVOKESTATIC, UTILITY_CLASS, "getItemStackFromSlot", "(L" + entityPlayerClassName + ";L" + equipmentSlotClassName + ";)L" + itemStackClassName + ";"); mv.visitInsn(ARETURN); Label l1 = new Label(); mv.visitLabel(l1); mv.visitLocalVariable("this", "L" + entityPlayerClassName + ";", null, l0, l1, 0); mv.visitLocalVariable("slotIn", "L" + equipmentSlotClassName + ";", null, l0, l1, 1); mv.visitMaxs(2, 2); mv.visitEnd(); mn.instructions = mv.instructions; found++; MethodNode mv = new MethodNode(ACC_PUBLIC, setCurrentItemArmourMethodName, setCurrentItemArmourMethodDesc, null, null); mv.visitCode(); Label l0 = new Label(); mv.visitLabel(l0); mv.visitVarInsn(ALOAD, 0); mv.visitVarInsn(ALOAD, 1); mv.visitVarInsn(ALOAD, 2); mv.visitMethodInsn(INVOKESTATIC, UTILITY_CLASS, "setItemStackToSlot", "(L" + entityPlayerClassName + ";L" + equipmentSlotClassName + ";L" + itemStackClassName + ";)Z"); mv.visitJumpInsn(IFEQ, l1);
public MethodNode createGetTranlocalMethod() { MethodNode m = new MethodNode( ACC_PUBLIC + ACC_SYNTHETIC, "getTranlocal", format("()%s", getDescriptor(AlphaTranlocal.class)), null, new String[]{}); m.visitVarInsn(ALOAD, 0); m.visitFieldInsn(GETFIELD, tranlocalSnapshotName, "___tranlocal", internalToDesc(tranlocalName)); m.visitInsn(ARETURN); m.visitMaxs(0, 0); m.visitEnd(); return m; }
private static MethodNode createBootstrap(String bsmName, String className) { MethodNode mv = new MethodNode(ACC_PUBLIC + ACC_STATIC + ACC_SYNTHETIC + ACC_BRIDGE, bsmName, "(Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;" + "Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object;", null, null); mv.visitCode(); Label l0 = new Label(); Label l1 = new Label(); Label l2 = new Label(); mv.visitTryCatchBlock(l0, l1, l2, "java/lang/Exception"); mv.visitLabel(l0); mv.visitVarInsn(ALOAD, 4); mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/Object", "toString", "()Ljava/lang/String;", false); mv.visitMethodInsn(INVOKEVIRTUAL, "java/lang/String", "toCharArray", "()[C", false); mv.visitVarInsn(ASTORE, 7); Label l3 = new Label(); mv.visitLabel(l3); mv.visitVarInsn(ALOAD, 7); mv.visitInsn(ARRAYLENGTH); mv.visitIntInsn(NEWARRAY, T_CHAR); mv.visitVarInsn(ASTORE, 8); Label l4 = new Label(); mv.visitLabel(l4); mv.visitInsn(ICONST_0); mv.visitVarInsn(ISTORE, 9); Label l5 = new Label(); mv.visitLabel(l5); Label l6 = new Label(); mv.visitJumpInsn(GOTO, l6); Label l7 = new Label(); mv.visitLabel(l7);
public void visitMethodInsn(int opcode, String owner, String name, String desc, boolean intf) { MethodInsnNode mnode = new MethodInsnNode(opcode, owner, name, desc, intf); if (opcode == INVOKESPECIAL || "<init>".equals(name)) { methods.add(mnode); } if (needsFrameGuard(opcode, owner, name, desc)) { Label label = new Label(); super.visitLabel(label); labels.add(label); nodes.add(mnode); } instructions.add(mnode); }
private MethodNode generateIsBlockingWithShield() { MethodNode mv = new MethodNode(ACC_PUBLIC, "isBlockingWithShield", "()Z", null, null); mv.visitCode(); Label l0 = new Label(); mv.visitLabel(l0); mv.visitVarInsn(ALOAD, 0); mv.visitMethodInsn(INVOKESTATIC, UTILITY_CLASS, "canBlockWithShield", "(L" + entityPlayerClassName + ";)Z"); Label l1 = new Label(); mv.visitJumpInsn(IFEQ, l1); mv.visitVarInsn(ALOAD, 0); mv.visitFieldInsn(GETFIELD, entityPlayerClassName, "isShielding", "Z"); mv.visitJumpInsn(IFEQ, l1); mv.visitInsn(ICONST_1); Label l2 = new Label(); mv.visitJumpInsn(GOTO, l2); mv.visitLabel(l1); mv.visitFrame(F_SAME, 0, null, 0, null); mv.visitInsn(ICONST_0); mv.visitLabel(l2); mv.visitFrame(F_SAME1, 0, null, 1, new Object[]{INTEGER}); mv.visitInsn(IRETURN); Label l3 = new Label(); mv.visitLabel(l3); mv.visitLocalVariable("this", "L" + entityPlayerClassName + ";", null, l0, l3, 0); mv.visitMaxs(1, 1); mv.visitEnd(); return mv; }
private MethodNode generateIsBattleMode() { MethodNode mv = new MethodNode(ACC_PUBLIC, "isBattlemode", "()Z", null, null); mv.visitCode(); Label l0 = new Label(); mv.visitLabel(l0); mv.visitVarInsn(ALOAD, 0); mv.visitMethodInsn(INVOKESTATIC, UTILITY_CLASS, "isPlayerInBattlemode", "(L" + entityPlayerClassName + ";)Z"); mv.visitInsn(IRETURN); Label l1 = new Label(); mv.visitLabel(l1); mv.visitLocalVariable("this", "L" + entityPlayerClassName + ";", null, l0, l1, 0); mv.visitMaxs(1, 1); mv.visitEnd(); return mv; }
@SuppressWarnings({"unchecked"}) private void createNewInstanceMethod(ParserClassNode classNode) { MethodNode method = new MethodNode(ACC_PUBLIC, "newInstance", "()L" + Types.BASE_PARSER.getInternalName() + ';', null, null); 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", classNode.isInterface())); instructions.add(new InsnNode(ARETURN)); classNode.methods.add(method); }
MethodNode m = new MethodNode( ACC_PUBLIC + ACC_SYNTHETIC, "isDirty", m.visitVarInsn(ALOAD, 0); m.visitFieldInsn(GETFIELD, tranlocalName, "___writeVersion", "J"); m.visitLdcInsn(new Long(0)); m.visitInsn(LCMP); m.visitJumpInsn(IFEQ, next); m.visitInsn(ICONST_0); m.visitInsn(IRETURN); m.visitLabel(next); m.visitVarInsn(ALOAD, 0); m.visitFieldInsn(GETFIELD, tranlocalName, "___origin", originDesc); next = new Label(); m.visitJumpInsn(IFNONNULL, next); m.visitInsn(ICONST_1); m.visitInsn(IRETURN); m.visitLabel(next); m.visitVarInsn(ALOAD, 0); m.visitFieldInsn(GETFIELD, tranlocalName, "___origin", originDesc); m.visitTypeInsn(CHECKCAST, tranlocalName); m.visitInsn(DUP);
for (AbstractInsnNode p = m.instructions.getFirst(); p != null; p = p.getNext()) { if (p.getOpcode() == Opcodes.INVOKESTATIC) { MethodInsnNode mn = (MethodInsnNode) p; try { MethodNode m2 = new MethodNode(); m2.tryCatchBlocks = new ArrayList<>(); m2.name = m.name; m2.access = m.access; m2.desc = m.desc; m.accept(m2); cleanDebug(m2); MethodNode m3 = new MethodNode(); m3.tryCatchBlocks = new ArrayList<>(); new IR2JConverter(true).convert(irMethod, m3);
/** * Just override the original super.createTakeSnapshotMethod if one exists. */ private MethodNode createTakeSnapshotMethod() { MethodNode m = new MethodNode( ACC_PUBLIC + ACC_SYNTHETIC, "takeSnapshot", format("()%s", getDescriptor(AlphaTranlocalSnapshot.class)), null, new String[]{}); m.visitTypeInsn(NEW, tranlocalSnapshotName); m.visitInsn(DUP); m.visitVarInsn(ALOAD, 0); String constructorDesc = format("(%s)V", internalToDesc(tranlocalName)); m.visitMethodInsn(INVOKESPECIAL, tranlocalSnapshotName, "<init>", constructorDesc); m.visitInsn(ARETURN); m.visitMaxs(0, 0);//value's don't matter, will be reculculated, but call is needed m.visitEnd(); return m; } }
private MethodNode stringPool(String className, String methodName, String fieldName, ArrayList<String> strings) { MethodNode method = new MethodNode(ACC_PRIVATE + ACC_STATIC + ACC_SYNTHETIC + ACC_BRIDGE, methodName, "()V", null, null); method.visitCode(); int numberOfStrings = strings.size(); if (numberOfStrings <= 5) { method.visitInsn(numberOfStrings + 3); } else if (numberOfStrings <= 127) { method.visitIntInsn(BIPUSH, strings.size()); } else if (numberOfStrings <= 32767) { method.visitIntInsn(SIPUSH, strings.size()); } else { method.visitLdcInsn(strings.size()); method.visitTypeInsn(ANEWARRAY, "java/lang/String"); method.visitInsn(DUP); method.visitInsn(i + 3); } else if (i <= 127) { method.visitIntInsn(BIPUSH, i); } else if (i <= 32767) { method.visitIntInsn(SIPUSH, i); } else { method.visitLdcInsn(i); method.visitLdcInsn(strings.get(i)); method.visitInsn(AASTORE);
@Override public void convertCode(DexMethodNode methodNode, MethodVisitor mv) { MethodVisitor mw = AsmBridge.searchMethodWriter(mv); MethodNode mn = new MethodNode(Opcodes.ASM5, methodNode.access, methodNode.method.getName(), methodNode.method.getDesc(), null, null); try { super.convertCode(methodNode, mn); } catch (Exception ex) { if (exceptionHandler == null) { throw new DexException(ex, "fail convert code for %s", methodNode.method); } else { mn.instructions.clear(); mn.tryCatchBlocks.clear(); exceptionHandler.handleMethodTranslateException(methodNode.method, methodNode, mn, ex); } } // code convert ok, copy to MethodWriter and check for Size mn.accept(mv); if (mw != null) { try { AsmBridge.sizeOfMethodWriter(mw); } catch (Exception ex) { mn.instructions.clear(); mn.tryCatchBlocks.clear(); exceptionHandler.handleMethodTranslateException(methodNode.method, methodNode, mn, ex); AsmBridge.replaceMethodWriter(mw, mn); } } } }