LabelStmt getLabel(LabelNode labelNode) { Label label = labelNode.getLabel(); LabelStmt ls = map.get(label); if (ls == null) { ls = Stmts.nLabel(); map.put(label, ls); } return ls; }
protected void print(final LabelNode l) { print(l.getLabel()); }
void visitLineNumbers(MethodVisitor mv) { for (LineNumberNode node : lineNumberNodes.values()) { mv.visitLineNumber(node.line, node.start.getLabel()); } }
private void prepare(MethodNode method) { InsnList instructions = method.instructions; minLocal = 0; if ((method.access & Opcodes.ACC_STATIC) != 0) { minLocal = 1; } labelIndexes = new HashMap<>(); lineNumbers = new HashMap<>(); for (int i = 0; i < instructions.size(); ++i) { AbstractInsnNode node = instructions.get(i); if (node instanceof LabelNode) { labelIndexes.put(((LabelNode) node).getLabel(), i); } if (node instanceof LineNumberNode) { LineNumberNode lineNumberNode = (LineNumberNode) node; lineNumbers.put(lineNumberNode.start.getLabel(), lineNumberNode.line); } } for (LocalVariableNode localVar : method.localVariables) { int location = labelIndexes.get(localVar.start.getLabel()); localVariableMap.computeIfAbsent(location, k -> new ArrayList<>()).add(localVar); } targetInstructions = new ArrayList<>(instructions.size()); targetInstructions.addAll(Collections.nCopies(instructions.size(), null)); basicBlocks.addAll(Collections.nCopies(instructions.size(), null)); stackBefore = new StackFrame[instructions.size()]; stackAfter = new StackFrame[instructions.size()]; }
Label label = ((LabelNode) insnNode).getLabel(); Integer lineNumber = lineNumbers.get(label); if (lineNumber != null && !lineNumber.equals(lastLineNumber)) {
continue; workStack.push(new Step(-2, labelIndexes.get(tryCatchNode.handler.getLabel()))); continue; int start = labelIndexes.get(tryCatchNode.start.getLabel()); int end = labelIndexes.get(tryCatchNode.end.getLabel()); getBasicBlock(start); getBasicBlock(end); tryCatch.setExceptionType(referenceCache.getCached(tryCatchNode.type.replace('/', '.'))); tryCatch.setHandler(getBasicBlock(labelIndexes.get(tryCatchNode.handler.getLabel()))); tryCatch.getHandler().setExceptionVariable(program.variableAt(minLocal + method.maxLocals)); block.getTryCatchBlocks().add(tryCatch);
@SuppressWarnings("rawtypes") public static void verify(final ClassReader cr, PrintWriter out) throws AnalyzerException, IllegalArgumentException, IllegalAccessException { ClassNode cn = new ClassNode(); cr.accept(new CheckClassAdapter(cn, false), ClassReader.SKIP_DEBUG); List methods = cn.methods; for (int i = 0; i < methods.size(); ++i) { MethodNode method = (MethodNode) methods.get(i); List tryCatchBlocks = method.tryCatchBlocks; for (int j = 0; j < tryCatchBlocks.size(); j++) { TryCatchBlockNode tcn = (TryCatchBlockNode) tryCatchBlocks.get(j); if (tcn.start.equals(tcn.end)) { throw new DexException("try/catch block %d in %s has same start(%s) and end(%s)", j, method.name, tcn.start.getLabel(), tcn.end.getLabel()); } } BasicVerifier verifier = new BasicVerifier(); Analyzer a = new Analyzer(verifier); try { a.analyze(cn.name, method); } catch (Exception e) { out.println(cr.getClassName() + "." + method.name + method.desc); printAnalyzerResult(method, a, out); e.printStackTrace(out); out.flush(); throw new DexException("method " + method.name + " " + method.desc, e); } } }
mv.visitJumpInsn(GOTO, resumeLabel.getLabel());
mv.visitLabel(callLabel.getLabel()); loadVar(mv, TOBJECT, methodWeaver.getFiberVar()); mv.visitMethodInsn(INVOKEVIRTUAL, FIBER_CLASS, "down", "()" + D_FIBER, false);
mv.visitJumpInsn(GOTO, callLabel.getLabel());
@Override public void accept(final MethodVisitor methodVisitor) { methodVisitor.visitLabel(getLabel()); }
private static Object[] asArray(final List<Object> list) { Object[] array = new Object[list.size()]; for (int i = 0, n = array.length; i < n; ++i) { Object o = list.get(i); if (o instanceof LabelNode) { o = ((LabelNode) o).getLabel(); } array[i] = o; } return array; } }
private static Object[] asArray(final List<Object> l) { Object[] objs = new Object[l.size()]; for (int i = 0; i < objs.length; ++i) { Object o = l.get(i); if (o instanceof LabelNode) { o = ((LabelNode) o).getLabel(); } objs[i] = o; } return objs; } }
@Override public void accept(final MethodVisitor methodVisitor) { Label[] labelsArray = new Label[this.labels.size()]; for (int i = 0, n = labelsArray.length; i < n; ++i) { labelsArray[i] = this.labels.get(i).getLabel(); } methodVisitor.visitTableSwitchInsn(min, max, dflt.getLabel(), labelsArray); acceptAnnotations(methodVisitor); }
@Override public void accept(final MethodVisitor mv) { int[] keys = new int[this.keys.size()]; for (int i = 0; i < keys.length; ++i) { keys[i] = this.keys.get(i).intValue(); } Label[] labels = new Label[this.labels.size()]; for (int i = 0; i < labels.length; ++i) { labels[i] = this.labels.get(i).getLabel(); } mv.visitLookupSwitchInsn(dflt.getLabel(), keys, labels); acceptAnnotations(mv); }
@Override public void accept(final MethodVisitor mv) { mv.visitJumpInsn(opcode, label.getLabel()); acceptAnnotations(mv); }
@Override public void accept(final MethodVisitor methodVisitor) { methodVisitor.visitJumpInsn(opcode, label.getLabel()); acceptAnnotations(methodVisitor); }