public String toString(Member m) { final StringBuilder sb = new StringBuilder(); if (m != null) sb.append(asString(m)); else sb.append(getClassName()).append('.').append(methodName); sb.append(' '); if (isNativeMethod()) sb.append("(Native Method)"); else { sb.append('('); if (fileName != null) { sb.append(fileName); if (lineNumber >= 0) sb.append(':').append(lineNumber); } else sb.append("Unknown Source"); if (bci >= 0) sb.append(" bci: ").append(bci); sb.append(')'); } return sb.toString(); }
public static /*Executable*/ Member lookupMethod(ExtendedStackTraceElement ste) { if (ste.getDeclaringClass() == null) return null; if (ste.getMethod() != null) return ste.getMethod(); for (final Method m : ste.getDeclaringClass().getDeclaredMethods()) { if (m.getName().equals(ste.getMethodName())) { final Instrumented i = getAnnotation(m, Instrumented.class); if (m.isSynthetic() || isWaiver(m.getDeclaringClass().getName(), m.getName()) || i != null && ste.getLineNumber() >= i.methodStart() && ste.getLineNumber() <= i.methodEnd()) return m; } } return null; }
private static String asString(Member method) { final StringBuilder sb = new StringBuilder(); sb.append(getTypeName(method.getDeclaringClass())) // .getTypeName() .append('.') .append(method.getName()); sb.append('('); final Class<?>[] paramTypes = getParameterTypes(method); for (Class<?> type : paramTypes) sb.append(getTypeName(type)).append(','); //.getTypeName() if (paramTypes.length > 0) sb.delete(sb.length() - 1, sb.length()); // Remove last ',' sb.append(')'); // sb.append("): "); // sb.append(getTypeName(getReturnType(method))); return sb.toString(); }
private static StringBuilder initTrace(int i, ExtendedStackTraceElement[] stes) { final StringBuilder stackTrace = new StringBuilder(); for (int j = 0; j <= i; j++) { final ExtendedStackTraceElement ste2 = stes[j]; if (ste2.getClassName().equals(Thread.class.getName()) && ste2.getMethodName().equals("getStackTrace")) continue; printTraceLine(stackTrace, ste2); } return stackTrace; }
private static void printTraceLine(StringBuilder stackTrace, ExtendedStackTraceElement ste) { final Member m = SuspendableHelper.lookupMethod(ste); stackTrace.append("\n\tat ").append(ste.getMethod() == null ? ste.toString(m) : ste.toString()); if (SuspendableHelper.isOptimized(m)) stackTrace.append(" (optimized)"); }
if (fromUncaughtExc && st.get().length > 0 && st.get()[0] != null) { final ExtendedStackTraceElement first = st.get()[0]; if (!first.getDeclaringClass().equals(ClassCastException.class) && !(first.getDeclaringClass().equals(NullPointerException.class) && first.getDeclaringClass().getName().startsWith("co.paralleluniverse.fibers"))) return true; for (int i = 0; i < stes.length; i++) { final ExtendedStackTraceElement ste = stes[i]; if (ste.getClassName().equals(Thread.class.getName()) && ste.getMethodName().equals("getStackTrace")) continue; if (ste.getClassName().equals(ExtendedStackTrace.class.getName())) continue; if (!ok) printTraceLine(stackTrace, ste); if (ste.getClassName().contains("$$Lambda$")) continue; if (!ste.getClassName().equals(Fiber.class.getName()) && !ste.getClassName().startsWith(Fiber.class.getName() + '$') && !ste.getClassName().equals(Stack.class.getName()) && !SuspendableHelper.isWaiver(ste.getClassName(), ste.getMethodName())) { final Class<?> clazz = ste.getDeclaringClass(); final boolean classInstrumented = SuspendableHelper.isInstrumented(clazz); final /*Executable*/ Member m = SuspendableHelper.lookupMethod(ste); if (m != null) { final boolean methodInstrumented = SuspendableHelper.isInstrumented(m); final Pair<Boolean, Instrumented> callSiteInstrumented = SuspendableHelper.isCallSiteInstrumented(m, ste.getLineNumber(), ste.getBytecodeIndex(), stes, i); if (!classInstrumented || !methodInstrumented || !callSiteInstrumented.getFirst()) { if (ok)
protected /*Executable*/ Member getMethod(final ExtendedStackTraceElement este) { if (este.getDeclaringClass() == null) return null; Member[] ms = getMethods(este.getDeclaringClass()); Member method = null; if (este.getMethodName().equals(m.getName())) { if (method == null) method = m; if (method == null && este.getLineNumber() >= 0) { try { final AtomicReference<String> descriptor = new AtomicReference<>(); ASMUtil.accept(este.getDeclaringClass(), ClassReader.SKIP_FRAMES, new ClassVisitor(Opcodes.ASM5) { @Override public MethodVisitor visitMethod(int access, String name, final String desc, String signature, String[] exceptions) { final String desc = descriptor.get(); for (Member m : ms) { if (este.getMethodName().equals(getName(m)) && desc.equals(getDescriptor(m))) { method = m; break;
&& ((calleeSte.getClassName().equals(Fiber.class.getName()) && calleeSte.getMethodName().equals("verifySuspend")) || (calleeSte.getClassName().equals(Stack.class.getName()) && calleeSte.getMethodName().equals("popMethod")))) { return new Pair<>(true, null); } else { final Member callee = calleeSte.getMethod(); if (callee == null) { final String methodName = "." + calleeSte.getMethodName() + "("; for (String callsite : i.suspendableCallSiteNames()) { if (callsite.contains(methodName)) {
@Override public MethodVisitor visitMethod(int access, String name, final String desc, String signature, String[] exceptions) { MethodVisitor mv = super.visitMethod(access, name, desc, signature, exceptions); if (descriptor.get() == null && este.getMethodName().equals(name)) { mv = new MethodVisitor(api, mv) { int minLine = Integer.MAX_VALUE, maxLine = Integer.MIN_VALUE; @Override public void visitLineNumber(int line, Label start) { if (line < minLine) minLine = line; if (line > maxLine) maxLine = line; } @Override public void visitEnd() { if (minLine <= este.getLineNumber() && maxLine >= este.getLineNumber()) descriptor.set(desc); super.visitEnd(); } }; } return mv; } });