@Override public void visitLocalVariable(String name, String desc, String signature, Label start, Label end, int index) { if (offsetMarker != null && (offsetMarker.getOffset() == start.getOffset())) { // this local wil be a parameter whose start // offset was originally 0 and now has been // offset by the inejcted AT ENTRY code // passing startMarker will reset it's start to 0 start = startMarker; } super.visitLocalVariable(name, desc, signature, start, end, index); }
@Override public void visitJumpInsn(int opcode, Label label) { super.visitJumpInsn(opcode, label); if (lastAddedLabel == null) { return; } try { if (label.getOffset() < lastAddedLabel.getOffset()) { // Backward jump, i.e., loop. updateToNextLabel = true; } } catch (IllegalStateException e) { // Forward jump, the offset is not available. } } }
/** * Returns {@code true} if the specified label is resolved, that is, * is associated with an offset in the bytecode of the method. */ @Requires("label != null") protected static boolean labelIsResolved(Label label) { try { label.getOffset(); } catch (IllegalStateException e) { return false; } return true; }
private void dumpType(StringBuffer buffer, Object t) { if (t == Opcodes.TOP) { buffer.append("TOP"); } else if (t == null) { buffer.append("null"); } else if (t == Opcodes.INTEGER) { buffer.append("int"); } else if (t == Opcodes.FLOAT) { buffer.append("float"); } else if (t == Opcodes.DOUBLE) { buffer.append("double"); } else if (t == Opcodes.LONG) { buffer.append("long"); } else if (t == Opcodes.NULL) { buffer.append("null"); } else if (t == Opcodes.UNINITIALIZED_THIS) { buffer.append("uninit_this"); } else if (t instanceof String) { buffer.append((String)t); } else { buffer.append(((Label)t).getOffset()); } }
@Override public void visitLabel(Label label) { // Emits the label. mv.visitLabel(label); // Injects null-handling after the last missing-handling byte code. if (lastAddedLabel == null || lastAddedLabel.getOffset() != label.getOffset()) { return; } // Loads the callee. mv.visitVarInsn(Opcodes.ALOAD, 0); mv.visitFieldInsn(Opcodes.GETFIELD, className, TYPE_CHECKER_NAME, TYPE_CHECKER_DESC); // Loads the result IPointable. mv.visitVarInsn(Opcodes.ALOAD, 2); // Invokes the null check method. mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, TYPE_CHECKER_CLASS, IS_NULL, TYPECHECK_METHOD_DESC, false); Label notNull = new Label(); // Adds the if branch. mv.visitJumpInsn(Opcodes.IFEQ, notNull); mv.visitInsn(Opcodes.RETURN); mv.visitLabel(notNull); } }
public void printLabelOffset(StringBuffer buf, Label l, boolean appendBlockPos, Object altText) { CodeLocation loc = cfg.getLocation(l); if (loc != null) { buf.append(l.getOffset()); if (appendBlockPos) { buf.append(" BB"); buf.append(loc.getBlockIdx()); buf.append('.'); buf.append(loc.getInstructionIdx()); } } else if (altText != null) { buf.append(altText); } } /**
private void dumpFrame(int nLocal, Object[] local, int nStack, Object[] stack) { StringBuffer buffer = new StringBuffer(); String sepr; Label l = new Label(); visitLabel(l); buffer.append("Frame "); buffer.append(l.getOffset()); buffer.append("\n"); buffer.append(" locals "); buffer.append(nLocal); buffer.append("\n "); sepr = ""; for (int i = 0; i < nLocal; i++) { buffer.append(sepr); dumpType(buffer, local[i]); sepr=",\n "; } buffer.append("\n stack "); buffer.append(nStack); buffer.append("\n "); sepr = ""; for (int i = 0; i < nStack; i++) { buffer.append(sepr); dumpType(buffer, stack[i]); sepr=",\n "; } Helper.out(buffer.toString()); }
@Override public void visitLocalVariable(String name, String desc, String signature, Label start, Label end, int index) { if (context.isHideSyntheticVariables()) { boolean isMethodParameter = start.getOffset() == 0; boolean isSynthetic = name.startsWith("_"); if (isMethodParameter || !isSynthetic) super.visitLocalVariable(name, desc, signature, start, end, index); } else { super.visitLocalVariable(name, desc, signature, start, end, index); } } }
buf.append(this.getLabel().getOffset()); buf.append(": BB "); buf.append(blockIdx); containedLabel = containsIter.next(); containedPosition = cfg.getBlockInstructionIdx(containedLabel); bcpos = containedLabel.getOffset(); } else { containedLabel = null; bcpos = containedLabel.getOffset(); buf.append(bcpos); buf.append(": ");
Iterator<Label> labelIter = triggerPoints.iterator(); while (labelIter.hasNext()) { int triggerPos = labelIter.next().getOffset(); boolean found = false; Iterator<LocalVar> localVarIter = localVars.iterator(); while (localVarIter.hasNext()) { LocalVar localVar = localVarIter.next(); int start = localVar.start.getOffset(); int end = localVar.end.getOffset(); if (start <= triggerPos && triggerPos < end) {