void walk() {
Walker walker = new Walker();
walker.m1();
}
void verify(StackFrame frame) { if (frame.getDeclaringClass() != clazz) return;
int bci = frame.getByteCodeIndex(); int lineNumber = frame.getLineNumber();
System.out.format("%s.%s bci %d (%s:%d)%n",
frame.getClassName(), frame.getMethodName(), bci,
frame.getFileName(), lineNumber);
MethodInfo method = methods.get(frame.getMethodName());
SortedSet<Integer> values = method.findLineNumbers(bci).get(); if (!values.contains(lineNumber)) { thrownew RuntimeException("line number for bci: " + bci + " "
+ lineNumber + " not matched line number table: " + values);
}
}
/* *BCIsintheexecutionstackwhenStackWalker::forEachisinvoked *willcoverBCIrangeinthelinenumbertable.
*/ class Walker { final StackWalker walker = StackWalker.getInstance(RETAIN_CLASS_REFERENCE); void m1() { int i = (int)Math.random()+2;
m2(i*2);
}
void m2(int i) {
i++;
m3(i);
}
void m3(int i) {
i++; m4(i++);
}
int m4(int i) {
walker.forEach(TestBCI.this::verify); return i;
}
}
staticclass MethodInfo { final Method method; final String name; final String paramTypes; final String returnType; final Map<Integer, SortedSet<Integer>> bciToLineNumbers = new HashMap<>();
MethodInfo(ClassFile cf, Method m) { this.method = m;
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.