src/java.base/share/classes/java/lang/StackFrameInfo.java
changeset 47818 2f6ab27efb60
parent 47294 7d67bb6b0599
child 52427 3c6aa484536c
--- 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");
+        }
+    }
 }