1 /*
2 * Copyright (c) 2015, 2018, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation. Oracle designates this
8 * particular file as subject to the "Classpath" exception as provided
9 * by Oracle in the LICENSE file that accompanied this code.
10 *
11 * This code is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 * version 2 for more details (a copy is included in the LICENSE file that
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.access.JavaLangInvokeAccess;
28 import jdk.internal.access.SharedSecrets;
29
30 import java.lang.StackWalker.StackFrame;
31 import java.lang.invoke.MethodType;
32
33 class StackFrameInfo implements StackFrame {
34 private final byte RETAIN_CLASS_REF = 0x01;
35
36 private final static JavaLangInvokeAccess JLIA =
37 SharedSecrets.getJavaLangInvokeAccess();
38
39 private final byte flags;
40 private final Object memberName;
41 private final short bci;
42 private volatile StackTraceElement ste;
43
44 /*
45 * Create StackFrameInfo for StackFrameTraverser and LiveStackFrameTraverser
46 * to use
47 */
48 StackFrameInfo(StackWalker walker) {
49 this.flags = walker.retainClassRef ? RETAIN_CLASS_REF : 0;
50 this.bci = -1;
51 this.memberName = JLIA.newMemberName();
52 }
53
54 // package-private called by StackStreamFactory to skip
55 // the capability check
56 Class<?> declaringClass() {
57 return JLIA.getDeclaringClass(memberName);
58 }
59
60 // ----- implementation of StackFrame methods
61
62 @Override
63 public String getClassName() {
64 return declaringClass().getName();
65 }
66
67 @Override
68 public Class<?> getDeclaringClass() {
69 ensureRetainClassRefEnabled();
70 return declaringClass();
75 return JLIA.getName(memberName);
76 }
77
78 @Override
79 public MethodType getMethodType() {
80 ensureRetainClassRefEnabled();
81 return JLIA.getMethodType(memberName);
82 }
83
84 @Override
85 public String getDescriptor() {
86 return JLIA.getMethodDescriptor(memberName);
87 }
88
89 @Override
90 public int getByteCodeIndex() {
91 // bci not available for native methods
92 if (isNativeMethod())
93 return -1;
94
95 return bci;
96 }
97
98 @Override
99 public String getFileName() {
100 return toStackTraceElement().getFileName();
101 }
102
103 @Override
104 public int getLineNumber() {
105 // line number not available for native methods
106 if (isNativeMethod())
107 return -2;
108
109 return toStackTraceElement().getLineNumber();
110 }
111
112
113 @Override
114 public boolean isNativeMethod() {
115 return JLIA.isNative(memberName);
|
1 /*
2 * Copyright (c) 2015, 2019, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation. Oracle designates this
8 * particular file as subject to the "Classpath" exception as provided
9 * by Oracle in the LICENSE file that accompanied this code.
10 *
11 * This code is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 * version 2 for more details (a copy is included in the LICENSE file that
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.access.JavaLangInvokeAccess;
28 import jdk.internal.access.SharedSecrets;
29 import jdk.internal.vm.annotation.Stable;
30
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 and bci initialized by VM
42 private @Stable int bci; // zero represents invalid BCI
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-1;
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);
|