15 * accompanied this code).
16 *
17 * You should have received a copy of the GNU General Public License version
18 * 2 along with this work; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20 *
21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22 * or visit www.oracle.com if you need additional information or have any
23 * questions.
24 */
25 package java.lang;
26
27 import jdk.internal.misc.JavaLangInvokeAccess;
28 import jdk.internal.misc.SharedSecrets;
29
30 import static java.lang.StackWalker.Option.*;
31 import java.lang.StackWalker.StackFrame;
32 import java.lang.invoke.MethodType;
33
34 class StackFrameInfo implements StackFrame {
35 private final byte RETAIN_CLASS_REF = 0x01;
36
37 private final static JavaLangInvokeAccess JLIA =
38 SharedSecrets.getJavaLangInvokeAccess();
39
40 private final byte flags;
41 private final Object memberName;
42 private final short bci;
43 private volatile StackTraceElement ste;
44
45 /*
46 * Create StackFrameInfo for StackFrameTraverser and LiveStackFrameTraverser
47 * to use
48 */
49 StackFrameInfo(StackWalker walker) {
50 this.flags = walker.retainClassRef ? RETAIN_CLASS_REF : 0;
51 this.bci = -1;
52 this.memberName = JLIA.newMemberName();
53 }
54
55 // package-private called by StackStreamFactory to skip
56 // the capability check
57 Class<?> declaringClass() {
58 return JLIA.getDeclaringClass(memberName);
59 }
60
61 // ----- implementation of StackFrame methods
62
63 @Override
64 public String getClassName() {
65 return declaringClass().getName();
66 }
67
68 @Override
69 public Class<?> getDeclaringClass() {
70 ensureRetainClassRefEnabled();
71 return declaringClass();
76 return JLIA.getName(memberName);
77 }
78
79 @Override
80 public MethodType getMethodType() {
81 ensureRetainClassRefEnabled();
82 return JLIA.getMethodType(memberName);
83 }
84
85 @Override
86 public String getDescriptor() {
87 return JLIA.getMethodDescriptor(memberName);
88 }
89
90 @Override
91 public int getByteCodeIndex() {
92 // bci not available for native methods
93 if (isNativeMethod())
94 return -1;
95
96 return bci;
97 }
98
99 @Override
100 public String getFileName() {
101 return toStackTraceElement().getFileName();
102 }
103
104 @Override
105 public int getLineNumber() {
106 // line number not available for native methods
107 if (isNativeMethod())
108 return -2;
109
110 return toStackTraceElement().getLineNumber();
111 }
112
113
114 @Override
115 public boolean isNativeMethod() {
116 return JLIA.isNative(memberName);
|
15 * accompanied this code).
16 *
17 * You should have received a copy of the GNU General Public License version
18 * 2 along with this work; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20 *
21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22 * or visit www.oracle.com if you need additional information or have any
23 * questions.
24 */
25 package java.lang;
26
27 import jdk.internal.misc.JavaLangInvokeAccess;
28 import jdk.internal.misc.SharedSecrets;
29
30 import static java.lang.StackWalker.Option.*;
31 import java.lang.StackWalker.StackFrame;
32 import java.lang.invoke.MethodType;
33
34 class StackFrameInfo implements StackFrame {
35 private final static byte RETAIN_CLASS_REF = 0x01;
36
37 private final static JavaLangInvokeAccess JLIA =
38 SharedSecrets.getJavaLangInvokeAccess();
39
40 private final byte flags;
41 private final Object memberName; // MemberName initialized by VM
42 private short bci; // unsigned 16-bit value set by VM
43 private volatile StackTraceElement ste;
44
45 /*
46 * Construct an empty StackFrameInfo object that will be filled by the VM
47 * during stack walking.
48 *
49 * @see StackStreamFactory.AbstractStackWalker#callStackWalk
50 * @see StackStreamFactory.AbstractStackWalker#fetchStackFrames
51 */
52 StackFrameInfo(StackWalker walker) {
53 this.flags = walker.retainClassRef ? RETAIN_CLASS_REF : 0;
54 this.memberName = JLIA.newMemberName();
55 }
56
57 // package-private called by StackStreamFactory to skip
58 // the capability check
59 Class<?> declaringClass() {
60 return JLIA.getDeclaringClass(memberName);
61 }
62
63 // ----- implementation of StackFrame methods
64
65 @Override
66 public String getClassName() {
67 return declaringClass().getName();
68 }
69
70 @Override
71 public Class<?> getDeclaringClass() {
72 ensureRetainClassRefEnabled();
73 return declaringClass();
78 return JLIA.getName(memberName);
79 }
80
81 @Override
82 public MethodType getMethodType() {
83 ensureRetainClassRefEnabled();
84 return JLIA.getMethodType(memberName);
85 }
86
87 @Override
88 public String getDescriptor() {
89 return JLIA.getMethodDescriptor(memberName);
90 }
91
92 @Override
93 public int getByteCodeIndex() {
94 // bci not available for native methods
95 if (isNativeMethod())
96 return -1;
97
98 return bci & 0xffff;
99 }
100
101 @Override
102 public String getFileName() {
103 return toStackTraceElement().getFileName();
104 }
105
106 @Override
107 public int getLineNumber() {
108 // line number not available for native methods
109 if (isNativeMethod())
110 return -2;
111
112 return toStackTraceElement().getLineNumber();
113 }
114
115
116 @Override
117 public boolean isNativeMethod() {
118 return JLIA.isNative(memberName);
|