@Override public boolean visitFrame(Pointer sp, CodePointer ip, DeoptimizedFrame deoptimizedFrame) { if (deoptimizedFrame != null) { for (DeoptimizedFrame.VirtualFrame frame = deoptimizedFrame.getTopFrame(); frame != null; frame = frame.getCaller()) { if (!visitJavaFrame(frame.getFrameInfo())) { return false; } } } else { CodeInfoQueryResult codeInfo = CodeInfoTable.lookupCodeInfoQueryResult(ip); for (FrameInfoQueryResult frameInfo = codeInfo.getFrameInfo(); frameInfo != null; frameInfo = frameInfo.getCaller()) { if (!visitJavaFrame(frameInfo)) { return false; } } } return true; }
@Substitute @NeverInline("Starting a stack walk in the caller frame") public static Class<?> getCallerClass() { GetCallerClassVisitor visitor = new GetCallerClassVisitor(); JavaStackWalker.walkCurrentThread(KnownIntrinsics.readCallerStackPointer(), KnownIntrinsics.readReturnAddress(), visitor); return visitor.result; }