--- a/src/java.base/share/classes/java/lang/StackFrameInfo.java Thu Nov 09 10:11:19 2017 +0100
+++ b/src/java.base/share/classes/java/lang/StackFrameInfo.java Thu Nov 09 11:13:50 2017 -0800
@@ -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
@@ -32,14 +32,12 @@
import java.lang.invoke.MethodType;
class StackFrameInfo implements StackFrame {
+ private final byte RETAIN_CLASS_REF = 0x01;
+
private final static JavaLangInvokeAccess JLIA =
SharedSecrets.getJavaLangInvokeAccess();
- // Footprint improvement: MemberName::clazz can replace
- // StackFrameInfo::declaringClass.
-
- private final StackWalker walker;
- private final Class<?> declaringClass;
+ private final byte flags;
private final Object memberName;
private final short bci;
private volatile StackTraceElement ste;
@@ -49,8 +47,7 @@
* to use
*/
StackFrameInfo(StackWalker walker) {
- this.walker = walker;
- this.declaringClass = null;
+ this.flags = walker.retainClassRef ? RETAIN_CLASS_REF : 0;
this.bci = -1;
this.memberName = JLIA.newMemberName();
}
@@ -58,20 +55,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 +78,7 @@
@Override
public MethodType getMethodType() {
- walker.ensureAccessEnabled(RETAIN_CLASS_REFERENCE);
+ ensureRetainClassRefEnabled();
return JLIA.getMethodType(memberName);
}
@@ -137,4 +134,10 @@
}
return s;
}
+
+ private void ensureRetainClassRefEnabled() {
+ if ((flags & RETAIN_CLASS_REF) == 0) {
+ throw new UnsupportedOperationException("No access to RETAIN_CLASS_REFERENCE");
+ }
+ }
}