--- old/src/java.base/share/classes/java/lang/StackFrameInfo.java 2017-11-04 15:52:31.152160524 -0700 +++ new/src/java.base/share/classes/java/lang/StackFrameInfo.java 2017-11-04 15:52:30.948160526 -0700 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2015, 2017, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -38,8 +38,7 @@ // Footprint improvement: MemberName::clazz can replace // StackFrameInfo::declaringClass. - private final StackWalker walker; - private final Class declaringClass; + private final boolean retainClassRef; private final Object memberName; private final short bci; private volatile StackTraceElement ste; @@ -49,8 +48,7 @@ * to use */ StackFrameInfo(StackWalker walker) { - this.walker = walker; - this.declaringClass = null; + this.retainClassRef = walker.retainClassRef; this.bci = -1; this.memberName = JLIA.newMemberName(); } @@ -58,20 +56,20 @@ // package-private called by StackStreamFactory to skip // the capability check Class declaringClass() { - return declaringClass; + return JLIA.getDeclaringClass(memberName); } // ----- implementation of StackFrame methods @Override public String getClassName() { - return declaringClass.getName(); + return declaringClass().getName(); } @Override public Class getDeclaringClass() { - walker.ensureAccessEnabled(RETAIN_CLASS_REFERENCE); - return declaringClass; + ensureRetainClassRefEnabled(); + return declaringClass(); } @Override @@ -81,7 +79,7 @@ @Override public MethodType getMethodType() { - walker.ensureAccessEnabled(RETAIN_CLASS_REFERENCE); + ensureRetainClassRefEnabled(); return JLIA.getMethodType(memberName); } @@ -137,4 +135,10 @@ } return s; } + + private void ensureRetainClassRefEnabled() { + if (!retainClassRef) { + throw new UnsupportedOperationException("No access to RETAIN_CLASS_REFERENCE"); + } + } }