annotate src/share/vm/oops/method.hpp @ 13212:eb03a7335eb0

Use fixed instead of virtual register for target in far foreign call, since the register allocator does not support virtual registers to be used at call sites.
author Christian Wimmer <christian.wimmer@oracle.com>
date Mon, 02 Dec 2013 14:20:32 -0800
parents 096c224171c4
children de839ec35cc7
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1 /*
7956
16fb9f942703 6479360: PrintClassHistogram improvements
acorn
parents: 7470
diff changeset
2 * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
a61af66fc99e Initial load
duke
parents:
diff changeset
4 *
a61af66fc99e Initial load
duke
parents:
diff changeset
5 * This code is free software; you can redistribute it and/or modify it
a61af66fc99e Initial load
duke
parents:
diff changeset
6 * under the terms of the GNU General Public License version 2 only, as
a61af66fc99e Initial load
duke
parents:
diff changeset
7 * published by the Free Software Foundation.
a61af66fc99e Initial load
duke
parents:
diff changeset
8 *
a61af66fc99e Initial load
duke
parents:
diff changeset
9 * This code is distributed in the hope that it will be useful, but WITHOUT
a61af66fc99e Initial load
duke
parents:
diff changeset
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
a61af66fc99e Initial load
duke
parents:
diff changeset
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
a61af66fc99e Initial load
duke
parents:
diff changeset
12 * version 2 for more details (a copy is included in the LICENSE file that
a61af66fc99e Initial load
duke
parents:
diff changeset
13 * accompanied this code).
a61af66fc99e Initial load
duke
parents:
diff changeset
14 *
a61af66fc99e Initial load
duke
parents:
diff changeset
15 * You should have received a copy of the GNU General Public License version
a61af66fc99e Initial load
duke
parents:
diff changeset
16 * 2 along with this work; if not, write to the Free Software Foundation,
a61af66fc99e Initial load
duke
parents:
diff changeset
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
a61af66fc99e Initial load
duke
parents:
diff changeset
18 *
1552
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1507
diff changeset
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1507
diff changeset
20 * or visit www.oracle.com if you need additional information or have any
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1507
diff changeset
21 * questions.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
22 *
a61af66fc99e Initial load
duke
parents:
diff changeset
23 */
a61af66fc99e Initial load
duke
parents:
diff changeset
24
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1877
diff changeset
25 #ifndef SHARE_VM_OOPS_METHODOOP_HPP
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1877
diff changeset
26 #define SHARE_VM_OOPS_METHODOOP_HPP
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1877
diff changeset
27
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1877
diff changeset
28 #include "classfile/vmSymbols.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1877
diff changeset
29 #include "code/compressedStream.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1877
diff changeset
30 #include "compiler/oopMap.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1877
diff changeset
31 #include "interpreter/invocationCounter.hpp"
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
32 #include "oops/annotations.hpp"
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
33 #include "oops/constantPool.hpp"
10105
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 8866
diff changeset
34 #include "oops/methodCounters.hpp"
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1877
diff changeset
35 #include "oops/instanceKlass.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1877
diff changeset
36 #include "oops/oop.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1877
diff changeset
37 #include "oops/typeArrayOop.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1877
diff changeset
38 #include "utilities/accessFlags.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1877
diff changeset
39 #include "utilities/growableArray.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1877
diff changeset
40
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
41 // A Method* represents a Java method.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
42 //
a61af66fc99e Initial load
duke
parents:
diff changeset
43 // Memory layout (each line represents a word). Note that most applications load thousands of methods,
a61af66fc99e Initial load
duke
parents:
diff changeset
44 // so keeping the size of this structure small has a big impact on footprint.
a61af66fc99e Initial load
duke
parents:
diff changeset
45 //
a61af66fc99e Initial load
duke
parents:
diff changeset
46 // We put all oops and method_size first for better gc cache locality.
a61af66fc99e Initial load
duke
parents:
diff changeset
47 //
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
48 // The actual bytecodes are inlined after the end of the Method struct.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
49 //
a61af66fc99e Initial load
duke
parents:
diff changeset
50 // There are bits in the access_flags telling whether inlined tables are present.
a61af66fc99e Initial load
duke
parents:
diff changeset
51 // Note that accessing the line number and local variable tables is not performance critical at all.
a61af66fc99e Initial load
duke
parents:
diff changeset
52 // Accessing the checked exceptions table is used by reflection, so we put that last to make access
a61af66fc99e Initial load
duke
parents:
diff changeset
53 // to it fast.
a61af66fc99e Initial load
duke
parents:
diff changeset
54 //
a61af66fc99e Initial load
duke
parents:
diff changeset
55 // The line number table is compressed and inlined following the byte codes. It is found as the first
a61af66fc99e Initial load
duke
parents:
diff changeset
56 // byte following the byte codes. The checked exceptions table and the local variable table are inlined
a61af66fc99e Initial load
duke
parents:
diff changeset
57 // after the line number table, and indexed from the end of the method. We do not compress the checked
a61af66fc99e Initial load
duke
parents:
diff changeset
58 // exceptions table since the average length is less than 2, and do not bother to compress the local
a61af66fc99e Initial load
duke
parents:
diff changeset
59 // variable table either since it is mostly absent.
a61af66fc99e Initial load
duke
parents:
diff changeset
60 //
a61af66fc99e Initial load
duke
parents:
diff changeset
61 // Note that native_function and signature_handler has to be at fixed offsets (required by the interpreter)
a61af66fc99e Initial load
duke
parents:
diff changeset
62 //
a61af66fc99e Initial load
duke
parents:
diff changeset
63 // |------------------------------------------------------|
a61af66fc99e Initial load
duke
parents:
diff changeset
64 // | header |
a61af66fc99e Initial load
duke
parents:
diff changeset
65 // | klass |
a61af66fc99e Initial load
duke
parents:
diff changeset
66 // |------------------------------------------------------|
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
67 // | ConstMethod* (oop) |
0
a61af66fc99e Initial load
duke
parents:
diff changeset
68 // |------------------------------------------------------|
a61af66fc99e Initial load
duke
parents:
diff changeset
69 // | methodData (oop) |
10233
e60b3fce2b02 8013067: Zero builds are broken after 8010862.
jiangli
parents: 10107
diff changeset
70 // | methodCounters |
0
a61af66fc99e Initial load
duke
parents:
diff changeset
71 // |------------------------------------------------------|
a61af66fc99e Initial load
duke
parents:
diff changeset
72 // | access_flags |
a61af66fc99e Initial load
duke
parents:
diff changeset
73 // | vtable_index |
a61af66fc99e Initial load
duke
parents:
diff changeset
74 // |------------------------------------------------------|
a61af66fc99e Initial load
duke
parents:
diff changeset
75 // | result_index (C++ interpreter only) |
a61af66fc99e Initial load
duke
parents:
diff changeset
76 // |------------------------------------------------------|
7402
fd74228fd5ca 8004076: Move _max_locals and _size_of_parameters to ConstMethod for better sharing.
jiangli
parents: 7184
diff changeset
77 // | method_size | intrinsic_id| flags |
0
a61af66fc99e Initial load
duke
parents:
diff changeset
78 // |------------------------------------------------------|
a61af66fc99e Initial load
duke
parents:
diff changeset
79 // | code (pointer) |
a61af66fc99e Initial load
duke
parents:
diff changeset
80 // | i2i (pointer) |
a61af66fc99e Initial load
duke
parents:
diff changeset
81 // | adapter (pointer) |
a61af66fc99e Initial load
duke
parents:
diff changeset
82 // | from_compiled_entry (pointer) |
a61af66fc99e Initial load
duke
parents:
diff changeset
83 // | from_interpreted_entry (pointer) |
a61af66fc99e Initial load
duke
parents:
diff changeset
84 // |------------------------------------------------------|
a61af66fc99e Initial load
duke
parents:
diff changeset
85 // | native_function (present only if native) |
a61af66fc99e Initial load
duke
parents:
diff changeset
86 // | signature_handler (present only if native) |
a61af66fc99e Initial load
duke
parents:
diff changeset
87 // |------------------------------------------------------|
a61af66fc99e Initial load
duke
parents:
diff changeset
88
a61af66fc99e Initial load
duke
parents:
diff changeset
89
a61af66fc99e Initial load
duke
parents:
diff changeset
90 class CheckedExceptionElement;
a61af66fc99e Initial load
duke
parents:
diff changeset
91 class LocalVariableTableElement;
a61af66fc99e Initial load
duke
parents:
diff changeset
92 class AdapterHandlerEntry;
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
93 class MethodData;
10105
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 8866
diff changeset
94 class MethodCounters;
6934
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents: 6800
diff changeset
95 class ConstMethod;
8031
927a311d00f9 8007320: NPG: move method annotations
coleenp
parents: 8025
diff changeset
96 class InlineTableSizes;
7956
16fb9f942703 6479360: PrintClassHistogram improvements
acorn
parents: 7470
diff changeset
97 class KlassSizeStats;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
98
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
99 class Method : public Metadata {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
100 friend class VMStructs;
a61af66fc99e Initial load
duke
parents:
diff changeset
101 private:
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
102 ConstMethod* _constMethod; // Method read-only data.
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
103 MethodData* _method_data;
10105
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 8866
diff changeset
104 MethodCounters* _method_counters;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
105 AccessFlags _access_flags; // Access flags
a61af66fc99e Initial load
duke
parents:
diff changeset
106 int _vtable_index; // vtable index of this method (see VtableIndexFlag)
a61af66fc99e Initial load
duke
parents:
diff changeset
107 // note: can have vtables with >2**16 elements (because of inheritance)
a61af66fc99e Initial load
duke
parents:
diff changeset
108 #ifdef CC_INTERP
a61af66fc99e Initial load
duke
parents:
diff changeset
109 int _result_index; // C++ interpreter needs for converting results to/from stack
a61af66fc99e Initial load
duke
parents:
diff changeset
110 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
111 u2 _method_size; // size of this object
856
75596850f863 6862576: vmIntrinsics needs cleanup in order to support JSR 292 intrinsics
jrose
parents: 726
diff changeset
112 u1 _intrinsic_id; // vmSymbols::intrinsic_id (0 == _none)
8866
16885e702c88 7198429: need checked categorization of caller-sensitive methods in the JDK
twisti
parents: 8068
diff changeset
113 u1 _jfr_towrite : 1, // Flags
16885e702c88 7198429: need checked categorization of caller-sensitive methods in the JDK
twisti
parents: 8068
diff changeset
114 _caller_sensitive : 1,
16885e702c88 7198429: need checked categorization of caller-sensitive methods in the JDK
twisti
parents: 8068
diff changeset
115 _force_inline : 1,
16885e702c88 7198429: need checked categorization of caller-sensitive methods in the JDK
twisti
parents: 8068
diff changeset
116 _hidden : 1,
16885e702c88 7198429: need checked categorization of caller-sensitive methods in the JDK
twisti
parents: 8068
diff changeset
117 _dont_inline : 1,
16885e702c88 7198429: need checked categorization of caller-sensitive methods in the JDK
twisti
parents: 8068
diff changeset
118 : 3;
2348
5d8f5a6dced7 7020403: Add AdvancedCompilationPolicy for tiered
iveresov
parents: 2243
diff changeset
119
0
a61af66fc99e Initial load
duke
parents:
diff changeset
120 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
121 int _compiled_invocation_count; // Number of nmethod invocations so far (for perf. debugging)
a61af66fc99e Initial load
duke
parents:
diff changeset
122 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
123 // Entry point for calling both from and to the interpreter.
a61af66fc99e Initial load
duke
parents:
diff changeset
124 address _i2i_entry; // All-args-on-stack calling convention
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
125 // Adapter blob (i2c/c2i) for this Method*. Set once when method is linked.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
126 AdapterHandlerEntry* _adapter;
a61af66fc99e Initial load
duke
parents:
diff changeset
127 // Entry point for calling from compiled code, to compiled code if it exists
a61af66fc99e Initial load
duke
parents:
diff changeset
128 // or else the interpreter.
a61af66fc99e Initial load
duke
parents:
diff changeset
129 volatile address _from_compiled_entry; // Cache of: _code ? _code->entry_point() : _adapter->c2i_entry()
a61af66fc99e Initial load
duke
parents:
diff changeset
130 // The entry point for calling both from and to compiled code is
a61af66fc99e Initial load
duke
parents:
diff changeset
131 // "_code->entry_point()". Because of tiered compilation and de-opt, this
a61af66fc99e Initial load
duke
parents:
diff changeset
132 // field can come and go. It can transition from NULL to not-null at any
a61af66fc99e Initial load
duke
parents:
diff changeset
133 // time (whenever a compile completes). It can transition from not-null to
a61af66fc99e Initial load
duke
parents:
diff changeset
134 // NULL only at safepoints (because of a de-opt).
a61af66fc99e Initial load
duke
parents:
diff changeset
135 nmethod* volatile _code; // Points to the corresponding piece of native code
a61af66fc99e Initial load
duke
parents:
diff changeset
136 volatile address _from_interpreted_entry; // Cache of _code ? _adapter->i2c_entry() : _i2i_entry
a61af66fc99e Initial load
duke
parents:
diff changeset
137
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
138 // Constructor
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
139 Method(ConstMethod* xconst, AccessFlags access_flags, int size);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
140 public:
6934
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents: 6800
diff changeset
141
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
142 static Method* allocate(ClassLoaderData* loader_data,
6934
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents: 6800
diff changeset
143 int byte_code_size,
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents: 6800
diff changeset
144 AccessFlags access_flags,
8031
927a311d00f9 8007320: NPG: move method annotations
coleenp
parents: 8025
diff changeset
145 InlineTableSizes* sizes,
6934
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents: 6800
diff changeset
146 ConstMethod::MethodType method_type,
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents: 6800
diff changeset
147 TRAPS);
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
148
7176
59c790074993 8003635: NPG: AsynchGetCallTrace broken by Method* virtual call
coleenp
parents: 6940
diff changeset
149 // CDS and vtbl checking can create an empty Method to get vtbl pointer.
59c790074993 8003635: NPG: AsynchGetCallTrace broken by Method* virtual call
coleenp
parents: 6940
diff changeset
150 Method(){}
6733
fa6e618671d7 7195867: NPG: SAJDI tests fail with sun.jvm.hotspot.types.WrongTypeException: No suitable match for type
coleenp
parents: 6725
diff changeset
151
fa6e618671d7 7195867: NPG: SAJDI tests fail with sun.jvm.hotspot.types.WrongTypeException: No suitable match for type
coleenp
parents: 6725
diff changeset
152 // The Method vtable is restored by this call when the Method is in the
fa6e618671d7 7195867: NPG: SAJDI tests fail with sun.jvm.hotspot.types.WrongTypeException: No suitable match for type
coleenp
parents: 6725
diff changeset
153 // shared archive. See patch_klass_vtables() in metaspaceShared.cpp for
fa6e618671d7 7195867: NPG: SAJDI tests fail with sun.jvm.hotspot.types.WrongTypeException: No suitable match for type
coleenp
parents: 6725
diff changeset
154 // all the gory details. SA, dtrace and pstack helpers distinguish metadata
fa6e618671d7 7195867: NPG: SAJDI tests fail with sun.jvm.hotspot.types.WrongTypeException: No suitable match for type
coleenp
parents: 6725
diff changeset
155 // by their vtable.
fa6e618671d7 7195867: NPG: SAJDI tests fail with sun.jvm.hotspot.types.WrongTypeException: No suitable match for type
coleenp
parents: 6725
diff changeset
156 void restore_vtable() { guarantee(is_method(), "vtable restored by this call"); }
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
157 bool is_method() const volatile { return true; }
518
0af8b0718fc9 6692899: CMS: many vm.parallel_class_loading tests fail with assert "missing Printezis mark"
jmasa
parents: 196
diff changeset
158
0
a61af66fc99e Initial load
duke
parents:
diff changeset
159 // accessors for instance variables
6733
fa6e618671d7 7195867: NPG: SAJDI tests fail with sun.jvm.hotspot.types.WrongTypeException: No suitable match for type
coleenp
parents: 6725
diff changeset
160
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
161 ConstMethod* constMethod() const { return _constMethod; }
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
162 void set_constMethod(ConstMethod* xconst) { _constMethod = xconst; }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
163
a61af66fc99e Initial load
duke
parents:
diff changeset
164
a61af66fc99e Initial load
duke
parents:
diff changeset
165 static address make_adapters(methodHandle mh, TRAPS);
a61af66fc99e Initial load
duke
parents:
diff changeset
166 volatile address from_compiled_entry() const { return (address)OrderAccess::load_ptr_acquire(&_from_compiled_entry); }
a61af66fc99e Initial load
duke
parents:
diff changeset
167 volatile address from_interpreted_entry() const{ return (address)OrderAccess::load_ptr_acquire(&_from_interpreted_entry); }
a61af66fc99e Initial load
duke
parents:
diff changeset
168
a61af66fc99e Initial load
duke
parents:
diff changeset
169 // access flag
a61af66fc99e Initial load
duke
parents:
diff changeset
170 AccessFlags access_flags() const { return _access_flags; }
a61af66fc99e Initial load
duke
parents:
diff changeset
171 void set_access_flags(AccessFlags flags) { _access_flags = flags; }
a61af66fc99e Initial load
duke
parents:
diff changeset
172
a61af66fc99e Initial load
duke
parents:
diff changeset
173 // name
6123
2fe087c3e814 7172967: Eliminate constMethod's _method backpointer to methodOop.
jiangli
parents: 4873
diff changeset
174 Symbol* name() const { return constants()->symbol_at(name_index()); }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
175 int name_index() const { return constMethod()->name_index(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
176 void set_name_index(int index) { constMethod()->set_name_index(index); }
a61af66fc99e Initial load
duke
parents:
diff changeset
177
a61af66fc99e Initial load
duke
parents:
diff changeset
178 // signature
6123
2fe087c3e814 7172967: Eliminate constMethod's _method backpointer to methodOop.
jiangli
parents: 4873
diff changeset
179 Symbol* signature() const { return constants()->symbol_at(signature_index()); }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
180 int signature_index() const { return constMethod()->signature_index(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
181 void set_signature_index(int index) { constMethod()->set_signature_index(index); }
a61af66fc99e Initial load
duke
parents:
diff changeset
182
a61af66fc99e Initial load
duke
parents:
diff changeset
183 // generics support
6123
2fe087c3e814 7172967: Eliminate constMethod's _method backpointer to methodOop.
jiangli
parents: 4873
diff changeset
184 Symbol* generic_signature() const { int idx = generic_signature_index(); return ((idx != 0) ? constants()->symbol_at(idx) : (Symbol*)NULL); }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
185 int generic_signature_index() const { return constMethod()->generic_signature_index(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
186 void set_generic_signature_index(int index) { constMethod()->set_generic_signature_index(index); }
a61af66fc99e Initial load
duke
parents:
diff changeset
187
a61af66fc99e Initial load
duke
parents:
diff changeset
188 // annotations support
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
189 AnnotationArray* annotations() const {
8031
927a311d00f9 8007320: NPG: move method annotations
coleenp
parents: 8025
diff changeset
190 return constMethod()->method_annotations();
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
191 }
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
192 AnnotationArray* parameter_annotations() const {
8031
927a311d00f9 8007320: NPG: move method annotations
coleenp
parents: 8025
diff changeset
193 return constMethod()->parameter_annotations();
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
194 }
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
195 AnnotationArray* annotation_default() const {
8031
927a311d00f9 8007320: NPG: move method annotations
coleenp
parents: 8025
diff changeset
196 return constMethod()->default_annotations();
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
197 }
8031
927a311d00f9 8007320: NPG: move method annotations
coleenp
parents: 8025
diff changeset
198 AnnotationArray* type_annotations() const {
927a311d00f9 8007320: NPG: move method annotations
coleenp
parents: 8025
diff changeset
199 return constMethod()->type_annotations();
927a311d00f9 8007320: NPG: move method annotations
coleenp
parents: 8025
diff changeset
200 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
201
a61af66fc99e Initial load
duke
parents:
diff changeset
202 #ifdef CC_INTERP
a61af66fc99e Initial load
duke
parents:
diff changeset
203 void set_result_index(BasicType type);
a61af66fc99e Initial load
duke
parents:
diff changeset
204 int result_index() { return _result_index; }
a61af66fc99e Initial load
duke
parents:
diff changeset
205 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
206
a61af66fc99e Initial load
duke
parents:
diff changeset
207 // Helper routine: get klass name + "." + method name + signature as
a61af66fc99e Initial load
duke
parents:
diff changeset
208 // C string, for the purpose of providing more useful NoSuchMethodErrors
a61af66fc99e Initial load
duke
parents:
diff changeset
209 // and fatal error handling. The string is allocated in resource
a61af66fc99e Initial load
duke
parents:
diff changeset
210 // area if a buffer is not provided by the caller.
6145
e2fe93124108 7174928: JSR 292: unresolved invokedynamic call sites deopt and osr infinitely
twisti
parents: 4873
diff changeset
211 char* name_and_sig_as_C_string() const;
e2fe93124108 7174928: JSR 292: unresolved invokedynamic call sites deopt and osr infinitely
twisti
parents: 4873
diff changeset
212 char* name_and_sig_as_C_string(char* buf, int size) const;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
213
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
214 // Static routine in the situations we don't have a Method*
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2142
diff changeset
215 static char* name_and_sig_as_C_string(Klass* klass, Symbol* method_name, Symbol* signature);
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2142
diff changeset
216 static char* name_and_sig_as_C_string(Klass* klass, Symbol* method_name, Symbol* signature, char* buf, int size);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
217
2142
8012aa3ccede 4926272: methodOopDesc::method_from_bcp is unsafe
never
parents: 1972
diff changeset
218 Bytecodes::Code java_code_at(int bci) const {
8012aa3ccede 4926272: methodOopDesc::method_from_bcp is unsafe
never
parents: 1972
diff changeset
219 return Bytecodes::java_code_at(this, bcp_from(bci));
8012aa3ccede 4926272: methodOopDesc::method_from_bcp is unsafe
never
parents: 1972
diff changeset
220 }
8012aa3ccede 4926272: methodOopDesc::method_from_bcp is unsafe
never
parents: 1972
diff changeset
221 Bytecodes::Code code_at(int bci) const {
8012aa3ccede 4926272: methodOopDesc::method_from_bcp is unsafe
never
parents: 1972
diff changeset
222 return Bytecodes::code_at(this, bcp_from(bci));
8012aa3ccede 4926272: methodOopDesc::method_from_bcp is unsafe
never
parents: 1972
diff changeset
223 }
8012aa3ccede 4926272: methodOopDesc::method_from_bcp is unsafe
never
parents: 1972
diff changeset
224
0
a61af66fc99e Initial load
duke
parents:
diff changeset
225 // JVMTI breakpoints
2142
8012aa3ccede 4926272: methodOopDesc::method_from_bcp is unsafe
never
parents: 1972
diff changeset
226 Bytecodes::Code orig_bytecode_at(int bci) const;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
227 void set_orig_bytecode_at(int bci, Bytecodes::Code code);
a61af66fc99e Initial load
duke
parents:
diff changeset
228 void set_breakpoint(int bci);
a61af66fc99e Initial load
duke
parents:
diff changeset
229 void clear_breakpoint(int bci);
a61af66fc99e Initial load
duke
parents:
diff changeset
230 void clear_all_breakpoints();
a61af66fc99e Initial load
duke
parents:
diff changeset
231 // Tracking number of breakpoints, for fullspeed debugging.
a61af66fc99e Initial load
duke
parents:
diff changeset
232 // Only mutated by VM thread.
10105
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 8866
diff changeset
233 u2 number_of_breakpoints() const {
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 8866
diff changeset
234 if (method_counters() == NULL) {
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 8866
diff changeset
235 return 0;
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 8866
diff changeset
236 } else {
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 8866
diff changeset
237 return method_counters()->number_of_breakpoints();
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 8866
diff changeset
238 }
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 8866
diff changeset
239 }
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 8866
diff changeset
240 void incr_number_of_breakpoints(TRAPS) {
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 8866
diff changeset
241 MethodCounters* mcs = get_method_counters(CHECK);
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 8866
diff changeset
242 if (mcs != NULL) {
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 8866
diff changeset
243 mcs->incr_number_of_breakpoints();
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 8866
diff changeset
244 }
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 8866
diff changeset
245 }
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 8866
diff changeset
246 void decr_number_of_breakpoints(TRAPS) {
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 8866
diff changeset
247 MethodCounters* mcs = get_method_counters(CHECK);
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 8866
diff changeset
248 if (mcs != NULL) {
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 8866
diff changeset
249 mcs->decr_number_of_breakpoints();
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 8866
diff changeset
250 }
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 8866
diff changeset
251 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
252 // Initialization only
10105
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 8866
diff changeset
253 void clear_number_of_breakpoints() {
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 8866
diff changeset
254 if (method_counters() != NULL) {
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 8866
diff changeset
255 method_counters()->clear_number_of_breakpoints();
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 8866
diff changeset
256 }
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 8866
diff changeset
257 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
258
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
259 // index into InstanceKlass methods() array
4800
94ec88ca68e2 7115199: Add event tracing hooks and Java Flight Recorder infrastructure
phh
parents: 3461
diff changeset
260 // note: also used by jfr
0
a61af66fc99e Initial load
duke
parents:
diff changeset
261 u2 method_idnum() const { return constMethod()->method_idnum(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
262 void set_method_idnum(u2 idnum) { constMethod()->set_method_idnum(idnum); }
a61af66fc99e Initial load
duke
parents:
diff changeset
263
a61af66fc99e Initial load
duke
parents:
diff changeset
264 // code size
a61af66fc99e Initial load
duke
parents:
diff changeset
265 int code_size() const { return constMethod()->code_size(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
266
a61af66fc99e Initial load
duke
parents:
diff changeset
267 // method size
a61af66fc99e Initial load
duke
parents:
diff changeset
268 int method_size() const { return _method_size; }
a61af66fc99e Initial load
duke
parents:
diff changeset
269 void set_method_size(int size) {
a61af66fc99e Initial load
duke
parents:
diff changeset
270 assert(0 <= size && size < (1 << 16), "invalid method size");
a61af66fc99e Initial load
duke
parents:
diff changeset
271 _method_size = size;
a61af66fc99e Initial load
duke
parents:
diff changeset
272 }
a61af66fc99e Initial load
duke
parents:
diff changeset
273
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
274 // constant pool for Klass* holding this method
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
275 ConstantPool* constants() const { return constMethod()->constants(); }
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
276 void set_constants(ConstantPool* c) { constMethod()->set_constants(c); }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
277
a61af66fc99e Initial load
duke
parents:
diff changeset
278 // max stack
6271
93c71eb28866 7188911: nightly failures after JSR 292 lazy method handle update (round 2)
twisti
parents: 6266
diff changeset
279 // return original max stack size for method verification
7183
b2dbd323c668 8003848: Make ConstMethod::generic_signature_index optional and move Method::_max_stack to ConstMethod.
jiangli
parents: 6940
diff changeset
280 int verifier_max_stack() const { return constMethod()->max_stack(); }
b2dbd323c668 8003848: Make ConstMethod::generic_signature_index optional and move Method::_max_stack to ConstMethod.
jiangli
parents: 6940
diff changeset
281 int max_stack() const { return constMethod()->max_stack() + extra_stack_entries(); }
b2dbd323c668 8003848: Make ConstMethod::generic_signature_index optional and move Method::_max_stack to ConstMethod.
jiangli
parents: 6940
diff changeset
282 void set_max_stack(int size) { constMethod()->set_max_stack(size); }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
283
a61af66fc99e Initial load
duke
parents:
diff changeset
284 // max locals
7402
fd74228fd5ca 8004076: Move _max_locals and _size_of_parameters to ConstMethod for better sharing.
jiangli
parents: 7184
diff changeset
285 int max_locals() const { return constMethod()->max_locals(); }
fd74228fd5ca 8004076: Move _max_locals and _size_of_parameters to ConstMethod for better sharing.
jiangli
parents: 7184
diff changeset
286 void set_max_locals(int size) { constMethod()->set_max_locals(size); }
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1552
diff changeset
287
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1552
diff changeset
288 int highest_comp_level() const;
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1552
diff changeset
289 void set_highest_comp_level(int level);
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1552
diff changeset
290 int highest_osr_comp_level() const;
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1552
diff changeset
291 void set_highest_osr_comp_level(int level);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
292
a61af66fc99e Initial load
duke
parents:
diff changeset
293 // Count of times method was exited via exception while interpreting
10105
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 8866
diff changeset
294 void interpreter_throwout_increment(TRAPS) {
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 8866
diff changeset
295 MethodCounters* mcs = get_method_counters(CHECK);
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 8866
diff changeset
296 if (mcs != NULL) {
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 8866
diff changeset
297 mcs->interpreter_throwout_increment();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
298 }
a61af66fc99e Initial load
duke
parents:
diff changeset
299 }
a61af66fc99e Initial load
duke
parents:
diff changeset
300
10105
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 8866
diff changeset
301 int interpreter_throwout_count() const {
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 8866
diff changeset
302 if (method_counters() == NULL) {
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 8866
diff changeset
303 return 0;
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 8866
diff changeset
304 } else {
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 8866
diff changeset
305 return method_counters()->interpreter_throwout_count();
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 8866
diff changeset
306 }
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 8866
diff changeset
307 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
308
a61af66fc99e Initial load
duke
parents:
diff changeset
309 // size of parameters
7402
fd74228fd5ca 8004076: Move _max_locals and _size_of_parameters to ConstMethod for better sharing.
jiangli
parents: 7184
diff changeset
310 int size_of_parameters() const { return constMethod()->size_of_parameters(); }
fd74228fd5ca 8004076: Move _max_locals and _size_of_parameters to ConstMethod for better sharing.
jiangli
parents: 7184
diff changeset
311 void set_size_of_parameters(int size) { constMethod()->set_size_of_parameters(size); }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
312
a61af66fc99e Initial load
duke
parents:
diff changeset
313 bool has_stackmap_table() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
314 return constMethod()->has_stackmap_table();
a61af66fc99e Initial load
duke
parents:
diff changeset
315 }
a61af66fc99e Initial load
duke
parents:
diff changeset
316
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
317 Array<u1>* stackmap_data() const {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
318 return constMethod()->stackmap_data();
a61af66fc99e Initial load
duke
parents:
diff changeset
319 }
a61af66fc99e Initial load
duke
parents:
diff changeset
320
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
321 void set_stackmap_data(Array<u1>* sd) {
1877
a4c7fe54bf3f 6991315: RedefineClasses fails with java.lang.VerifyError
kamg
parents: 1793
diff changeset
322 constMethod()->set_stackmap_data(sd);
a4c7fe54bf3f 6991315: RedefineClasses fails with java.lang.VerifyError
kamg
parents: 1793
diff changeset
323 }
a4c7fe54bf3f 6991315: RedefineClasses fails with java.lang.VerifyError
kamg
parents: 1793
diff changeset
324
0
a61af66fc99e Initial load
duke
parents:
diff changeset
325 // exception handler table
a61af66fc99e Initial load
duke
parents:
diff changeset
326 bool has_exception_handler() const
a61af66fc99e Initial load
duke
parents:
diff changeset
327 { return constMethod()->has_exception_handler(); }
6213
8150fa46d2ed 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 6146
diff changeset
328 int exception_table_length() const
8150fa46d2ed 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 6146
diff changeset
329 { return constMethod()->exception_table_length(); }
8150fa46d2ed 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 6146
diff changeset
330 ExceptionTableElement* exception_table_start() const
8150fa46d2ed 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 6146
diff changeset
331 { return constMethod()->exception_table_start(); }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
332
a61af66fc99e Initial load
duke
parents:
diff changeset
333 // Finds the first entry point bci of an exception handler for an
a61af66fc99e Initial load
duke
parents:
diff changeset
334 // exception of klass ex_klass thrown at throw_bci. A value of NULL
a61af66fc99e Initial load
duke
parents:
diff changeset
335 // for ex_klass indicates that the exception klass is not known; in
a61af66fc99e Initial load
duke
parents:
diff changeset
336 // this case it matches any constraint class. Returns -1 if the
a61af66fc99e Initial load
duke
parents:
diff changeset
337 // exception cannot be handled in this method. The handler
a61af66fc99e Initial load
duke
parents:
diff changeset
338 // constraint classes are loaded if necessary. Note that this may
a61af66fc99e Initial load
duke
parents:
diff changeset
339 // throw an exception if loading of the constraint classes causes
a61af66fc99e Initial load
duke
parents:
diff changeset
340 // an IllegalAccessError (bugid 4307310) or an OutOfMemoryError.
a61af66fc99e Initial load
duke
parents:
diff changeset
341 // If an exception is thrown, returns the bci of the
a61af66fc99e Initial load
duke
parents:
diff changeset
342 // exception handler which caused the exception to be thrown, which
a61af66fc99e Initial load
duke
parents:
diff changeset
343 // is needed for proper retries. See, for example,
a61af66fc99e Initial load
duke
parents:
diff changeset
344 // InterpreterRuntime::exception_handler_for_exception.
7469
0c8717a92b2d 8001341: SIGSEGV in methodOopDesc::fast_exception_handler_bci_for(KlassHandle,int,Thread*)+0x3e9.
jiangli
parents: 7402
diff changeset
345 static int fast_exception_handler_bci_for(methodHandle mh, KlassHandle ex_klass, int throw_bci, TRAPS);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
346
a61af66fc99e Initial load
duke
parents:
diff changeset
347 // method data access
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
348 MethodData* method_data() const {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
349 return _method_data;
a61af66fc99e Initial load
duke
parents:
diff changeset
350 }
10105
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 8866
diff changeset
351
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
352 void set_method_data(MethodData* data) {
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
353 _method_data = data;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
354 }
a61af66fc99e Initial load
duke
parents:
diff changeset
355
10105
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 8866
diff changeset
356 MethodCounters* method_counters() const {
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 8866
diff changeset
357 return _method_counters;
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 8866
diff changeset
358 }
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 8866
diff changeset
359
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 8866
diff changeset
360
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 8866
diff changeset
361 void set_method_counters(MethodCounters* counters) {
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 8866
diff changeset
362 _method_counters = counters;
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 8866
diff changeset
363 }
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1552
diff changeset
364
2348
5d8f5a6dced7 7020403: Add AdvancedCompilationPolicy for tiered
iveresov
parents: 2243
diff changeset
365 #ifdef TIERED
5d8f5a6dced7 7020403: Add AdvancedCompilationPolicy for tiered
iveresov
parents: 2243
diff changeset
366 // We are reusing interpreter_invocation_count as a holder for the previous event count!
5d8f5a6dced7 7020403: Add AdvancedCompilationPolicy for tiered
iveresov
parents: 2243
diff changeset
367 // We can do that since interpreter_invocation_count is not used in tiered.
10105
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 8866
diff changeset
368 int prev_event_count() const {
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 8866
diff changeset
369 if (method_counters() == NULL) {
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 8866
diff changeset
370 return 0;
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 8866
diff changeset
371 } else {
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 8866
diff changeset
372 return method_counters()->interpreter_invocation_count();
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 8866
diff changeset
373 }
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 8866
diff changeset
374 }
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 8866
diff changeset
375 void set_prev_event_count(int count, TRAPS) {
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 8866
diff changeset
376 MethodCounters* mcs = get_method_counters(CHECK);
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 8866
diff changeset
377 if (mcs != NULL) {
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 8866
diff changeset
378 mcs->set_interpreter_invocation_count(count);
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 8866
diff changeset
379 }
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 8866
diff changeset
380 }
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 8866
diff changeset
381 jlong prev_time() const {
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 8866
diff changeset
382 return method_counters() == NULL ? 0 : method_counters()->prev_time();
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 8866
diff changeset
383 }
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 8866
diff changeset
384 void set_prev_time(jlong time, TRAPS) {
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 8866
diff changeset
385 MethodCounters* mcs = get_method_counters(CHECK);
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 8866
diff changeset
386 if (mcs != NULL) {
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 8866
diff changeset
387 mcs->set_prev_time(time);
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 8866
diff changeset
388 }
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 8866
diff changeset
389 }
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 8866
diff changeset
390 float rate() const {
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 8866
diff changeset
391 return method_counters() == NULL ? 0 : method_counters()->rate();
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 8866
diff changeset
392 }
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 8866
diff changeset
393 void set_rate(float rate, TRAPS) {
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 8866
diff changeset
394 MethodCounters* mcs = get_method_counters(CHECK);
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 8866
diff changeset
395 if (mcs != NULL) {
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 8866
diff changeset
396 mcs->set_rate(rate);
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 8866
diff changeset
397 }
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 8866
diff changeset
398 }
2348
5d8f5a6dced7 7020403: Add AdvancedCompilationPolicy for tiered
iveresov
parents: 2243
diff changeset
399 #endif
5d8f5a6dced7 7020403: Add AdvancedCompilationPolicy for tiered
iveresov
parents: 2243
diff changeset
400
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1552
diff changeset
401 int invocation_count();
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1552
diff changeset
402 int backedge_count();
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1552
diff changeset
403
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1552
diff changeset
404 bool was_executed_more_than(int n);
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1552
diff changeset
405 bool was_never_executed() { return !was_executed_more_than(0); }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
406
a61af66fc99e Initial load
duke
parents:
diff changeset
407 static void build_interpreter_method_data(methodHandle method, TRAPS);
a61af66fc99e Initial load
duke
parents:
diff changeset
408
10105
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 8866
diff changeset
409 static MethodCounters* build_method_counters(Method* m, TRAPS);
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 8866
diff changeset
410
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1552
diff changeset
411 int interpreter_invocation_count() {
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1552
diff changeset
412 if (TieredCompilation) return invocation_count();
10105
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 8866
diff changeset
413 else return (method_counters() == NULL) ? 0 :
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 8866
diff changeset
414 method_counters()->interpreter_invocation_count();
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1552
diff changeset
415 }
10105
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 8866
diff changeset
416 int increment_interpreter_invocation_count(TRAPS) {
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1552
diff changeset
417 if (TieredCompilation) ShouldNotReachHere();
10105
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 8866
diff changeset
418 MethodCounters* mcs = get_method_counters(CHECK_0);
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 8866
diff changeset
419 return (mcs == NULL) ? 0 : mcs->increment_interpreter_invocation_count();
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1552
diff changeset
420 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
421
a61af66fc99e Initial load
duke
parents:
diff changeset
422 #ifndef PRODUCT
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1552
diff changeset
423 int compiled_invocation_count() const { return _compiled_invocation_count; }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
424 void set_compiled_invocation_count(int count) { _compiled_invocation_count = count; }
a61af66fc99e Initial load
duke
parents:
diff changeset
425 #endif // not PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
426
605
98cb887364d3 6810672: Comment typos
twisti
parents: 518
diff changeset
427 // Clear (non-shared space) pointers which could not be relevant
0
a61af66fc99e Initial load
duke
parents:
diff changeset
428 // if this (shared) method were mapped into another JVM.
a61af66fc99e Initial load
duke
parents:
diff changeset
429 void remove_unshareable_info();
a61af66fc99e Initial load
duke
parents:
diff changeset
430
a61af66fc99e Initial load
duke
parents:
diff changeset
431 // nmethod/verified compiler entry
a61af66fc99e Initial load
duke
parents:
diff changeset
432 address verified_code_entry();
a61af66fc99e Initial load
duke
parents:
diff changeset
433 bool check_code() const; // Not inline to avoid circular ref
a61af66fc99e Initial load
duke
parents:
diff changeset
434 nmethod* volatile code() const { assert( check_code(), "" ); return (nmethod *)OrderAccess::load_ptr_acquire(&_code); }
a61af66fc99e Initial load
duke
parents:
diff changeset
435 void clear_code(); // Clear out any compiled code
1202
5f24d0319e54 4360113: Evict nmethods when code cache gets full
kvn
parents: 1152
diff changeset
436 static void set_code(methodHandle mh, nmethod* code);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
437 void set_adapter_entry(AdapterHandlerEntry* adapter) { _adapter = adapter; }
a61af66fc99e Initial load
duke
parents:
diff changeset
438 address get_i2c_entry();
a61af66fc99e Initial load
duke
parents:
diff changeset
439 address get_c2i_entry();
a61af66fc99e Initial load
duke
parents:
diff changeset
440 address get_c2i_unverified_entry();
a61af66fc99e Initial load
duke
parents:
diff changeset
441 AdapterHandlerEntry* adapter() { return _adapter; }
a61af66fc99e Initial load
duke
parents:
diff changeset
442 // setup entry points
a61af66fc99e Initial load
duke
parents:
diff changeset
443 void link_method(methodHandle method, TRAPS);
a61af66fc99e Initial load
duke
parents:
diff changeset
444 // clear entry points. Used by sharing code
a61af66fc99e Initial load
duke
parents:
diff changeset
445 void unlink_method();
a61af66fc99e Initial load
duke
parents:
diff changeset
446
a61af66fc99e Initial load
duke
parents:
diff changeset
447 // vtable index
a61af66fc99e Initial load
duke
parents:
diff changeset
448 enum VtableIndexFlag {
a61af66fc99e Initial load
duke
parents:
diff changeset
449 // Valid vtable indexes are non-negative (>= 0).
a61af66fc99e Initial load
duke
parents:
diff changeset
450 // These few negative values are used as sentinels.
12264
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 12170
diff changeset
451 itable_index_max = -10, // first itable index, growing downward
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 12170
diff changeset
452 pending_itable_index = -9, // itable index will be assigned
0
a61af66fc99e Initial load
duke
parents:
diff changeset
453 invalid_vtable_index = -4, // distinct from any valid vtable index
a61af66fc99e Initial load
duke
parents:
diff changeset
454 garbage_vtable_index = -3, // not yet linked; no vtable layout yet
a61af66fc99e Initial load
duke
parents:
diff changeset
455 nonvirtual_vtable_index = -2 // there is no need for vtable dispatch
a61af66fc99e Initial load
duke
parents:
diff changeset
456 // 6330203 Note: Do not use -1, which was overloaded with many meanings.
a61af66fc99e Initial load
duke
parents:
diff changeset
457 };
a61af66fc99e Initial load
duke
parents:
diff changeset
458 DEBUG_ONLY(bool valid_vtable_index() const { return _vtable_index >= nonvirtual_vtable_index; })
12264
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 12170
diff changeset
459 bool has_vtable_index() const { return _vtable_index >= 0; }
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 12170
diff changeset
460 int vtable_index() const { return _vtable_index; }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
461 void set_vtable_index(int index) { _vtable_index = index; }
12264
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 12170
diff changeset
462 DEBUG_ONLY(bool valid_itable_index() const { return _vtable_index <= pending_itable_index; })
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 12170
diff changeset
463 bool has_itable_index() const { return _vtable_index <= itable_index_max; }
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 12170
diff changeset
464 int itable_index() const { assert(valid_itable_index(), "");
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 12170
diff changeset
465 return itable_index_max - _vtable_index; }
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 12170
diff changeset
466 void set_itable_index(int index) { _vtable_index = itable_index_max - index; assert(valid_itable_index(), ""); }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
467
a61af66fc99e Initial load
duke
parents:
diff changeset
468 // interpreter entry
a61af66fc99e Initial load
duke
parents:
diff changeset
469 address interpreter_entry() const { return _i2i_entry; }
a61af66fc99e Initial load
duke
parents:
diff changeset
470 // Only used when first initialize so we can set _i2i_entry and _from_interpreted_entry
a61af66fc99e Initial load
duke
parents:
diff changeset
471 void set_interpreter_entry(address entry) { _i2i_entry = entry; _from_interpreted_entry = entry; }
a61af66fc99e Initial load
duke
parents:
diff changeset
472
a61af66fc99e Initial load
duke
parents:
diff changeset
473 // native function (used for native methods only)
a61af66fc99e Initial load
duke
parents:
diff changeset
474 enum {
a61af66fc99e Initial load
duke
parents:
diff changeset
475 native_bind_event_is_interesting = true
a61af66fc99e Initial load
duke
parents:
diff changeset
476 };
a61af66fc99e Initial load
duke
parents:
diff changeset
477 address native_function() const { return *(native_function_addr()); }
4873
0382d2b469b2 7013347: allow crypto functions to be called inline to enhance performance
never
parents: 4800
diff changeset
478 address critical_native_function();
0382d2b469b2 7013347: allow crypto functions to be called inline to enhance performance
never
parents: 4800
diff changeset
479
0
a61af66fc99e Initial load
duke
parents:
diff changeset
480 // Must specify a real function (not NULL).
a61af66fc99e Initial load
duke
parents:
diff changeset
481 // Use clear_native_function() to unregister.
a61af66fc99e Initial load
duke
parents:
diff changeset
482 void set_native_function(address function, bool post_event_flag);
a61af66fc99e Initial load
duke
parents:
diff changeset
483 bool has_native_function() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
484 void clear_native_function();
a61af66fc99e Initial load
duke
parents:
diff changeset
485
a61af66fc99e Initial load
duke
parents:
diff changeset
486 // signature handler (used for native methods only)
a61af66fc99e Initial load
duke
parents:
diff changeset
487 address signature_handler() const { return *(signature_handler_addr()); }
a61af66fc99e Initial load
duke
parents:
diff changeset
488 void set_signature_handler(address handler);
a61af66fc99e Initial load
duke
parents:
diff changeset
489
a61af66fc99e Initial load
duke
parents:
diff changeset
490 // Interpreter oopmap support
a61af66fc99e Initial load
duke
parents:
diff changeset
491 void mask_for(int bci, InterpreterOopMap* mask);
a61af66fc99e Initial load
duke
parents:
diff changeset
492
a61af66fc99e Initial load
duke
parents:
diff changeset
493 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
494 // operations on invocation counter
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1552
diff changeset
495 void print_invocation_count();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
496 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
497
a61af66fc99e Initial load
duke
parents:
diff changeset
498 // byte codes
1138
dd57230ba8fe 6893268: additional dynamic language related optimizations in C2
twisti
parents: 977
diff changeset
499 void set_code(address code) { return constMethod()->set_code(code); }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
500 address code_base() const { return constMethod()->code_base(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
501 bool contains(address bcp) const { return constMethod()->contains(bcp); }
a61af66fc99e Initial load
duke
parents:
diff changeset
502
a61af66fc99e Initial load
duke
parents:
diff changeset
503 // prints byte codes
a61af66fc99e Initial load
duke
parents:
diff changeset
504 void print_codes() const { print_codes_on(tty); }
a61af66fc99e Initial load
duke
parents:
diff changeset
505 void print_codes_on(outputStream* st) const PRODUCT_RETURN;
a61af66fc99e Initial load
duke
parents:
diff changeset
506 void print_codes_on(int from, int to, outputStream* st) const PRODUCT_RETURN;
a61af66fc99e Initial load
duke
parents:
diff changeset
507
7462
ade95d680b42 8004728: Add hotspot support for parameter reflection
coleenp
parents: 7458
diff changeset
508 // method parameters
8068
56c364daccc3 8007153: Ensure that MethodParameters API works properly with RedefineClasses
emc
parents: 8031
diff changeset
509 bool has_method_parameters() const
56c364daccc3 8007153: Ensure that MethodParameters API works properly with RedefineClasses
emc
parents: 8031
diff changeset
510 { return constMethod()->has_method_parameters(); }
7462
ade95d680b42 8004728: Add hotspot support for parameter reflection
coleenp
parents: 7458
diff changeset
511 int method_parameters_length() const
ade95d680b42 8004728: Add hotspot support for parameter reflection
coleenp
parents: 7458
diff changeset
512 { return constMethod()->method_parameters_length(); }
ade95d680b42 8004728: Add hotspot support for parameter reflection
coleenp
parents: 7458
diff changeset
513 MethodParametersElement* method_parameters_start() const
ade95d680b42 8004728: Add hotspot support for parameter reflection
coleenp
parents: 7458
diff changeset
514 { return constMethod()->method_parameters_start(); }
ade95d680b42 8004728: Add hotspot support for parameter reflection
coleenp
parents: 7458
diff changeset
515
0
a61af66fc99e Initial load
duke
parents:
diff changeset
516 // checked exceptions
a61af66fc99e Initial load
duke
parents:
diff changeset
517 int checked_exceptions_length() const
a61af66fc99e Initial load
duke
parents:
diff changeset
518 { return constMethod()->checked_exceptions_length(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
519 CheckedExceptionElement* checked_exceptions_start() const
a61af66fc99e Initial load
duke
parents:
diff changeset
520 { return constMethod()->checked_exceptions_start(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
521
a61af66fc99e Initial load
duke
parents:
diff changeset
522 // localvariable table
a61af66fc99e Initial load
duke
parents:
diff changeset
523 bool has_localvariable_table() const
a61af66fc99e Initial load
duke
parents:
diff changeset
524 { return constMethod()->has_localvariable_table(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
525 int localvariable_table_length() const
a61af66fc99e Initial load
duke
parents:
diff changeset
526 { return constMethod()->localvariable_table_length(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
527 LocalVariableTableElement* localvariable_table_start() const
a61af66fc99e Initial load
duke
parents:
diff changeset
528 { return constMethod()->localvariable_table_start(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
529
a61af66fc99e Initial load
duke
parents:
diff changeset
530 bool has_linenumber_table() const
a61af66fc99e Initial load
duke
parents:
diff changeset
531 { return constMethod()->has_linenumber_table(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
532 u_char* compressed_linenumber_table() const
a61af66fc99e Initial load
duke
parents:
diff changeset
533 { return constMethod()->compressed_linenumber_table(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
534
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
535 // method holder (the Klass* holding this method)
6940
18fb7da42534 8000725: NPG: method_holder() and pool_holder() and pool_holder field should be InstanceKlass
coleenp
parents: 6934
diff changeset
536 InstanceKlass* method_holder() const { return constants()->pool_holder(); }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
537
a61af66fc99e Initial load
duke
parents:
diff changeset
538 void compute_size_of_parameters(Thread *thread); // word size of parameters (receiver if any + arguments)
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2142
diff changeset
539 Symbol* klass_name() const; // returns the name of the method holder
0
a61af66fc99e Initial load
duke
parents:
diff changeset
540 BasicType result_type() const; // type of the method result
a61af66fc99e Initial load
duke
parents:
diff changeset
541 int result_type_index() const; // type index of the method result
a61af66fc99e Initial load
duke
parents:
diff changeset
542 bool is_returning_oop() const { BasicType r = result_type(); return (r == T_OBJECT || r == T_ARRAY); }
a61af66fc99e Initial load
duke
parents:
diff changeset
543 bool is_returning_fp() const { BasicType r = result_type(); return (r == T_FLOAT || r == T_DOUBLE); }
a61af66fc99e Initial load
duke
parents:
diff changeset
544
a61af66fc99e Initial load
duke
parents:
diff changeset
545 // Checked exceptions thrown by this method (resolved to mirrors)
a61af66fc99e Initial load
duke
parents:
diff changeset
546 objArrayHandle resolved_checked_exceptions(TRAPS) { return resolved_checked_exceptions_impl(this, THREAD); }
a61af66fc99e Initial load
duke
parents:
diff changeset
547
a61af66fc99e Initial load
duke
parents:
diff changeset
548 // Access flags
a61af66fc99e Initial load
duke
parents:
diff changeset
549 bool is_public() const { return access_flags().is_public(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
550 bool is_private() const { return access_flags().is_private(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
551 bool is_protected() const { return access_flags().is_protected(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
552 bool is_package_private() const { return !is_public() && !is_private() && !is_protected(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
553 bool is_static() const { return access_flags().is_static(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
554 bool is_final() const { return access_flags().is_final(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
555 bool is_synchronized() const { return access_flags().is_synchronized();}
a61af66fc99e Initial load
duke
parents:
diff changeset
556 bool is_native() const { return access_flags().is_native(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
557 bool is_abstract() const { return access_flags().is_abstract(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
558 bool is_strict() const { return access_flags().is_strict(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
559 bool is_synthetic() const { return access_flags().is_synthetic(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
560
a61af66fc99e Initial load
duke
parents:
diff changeset
561 // returns true if contains only return operation
a61af66fc99e Initial load
duke
parents:
diff changeset
562 bool is_empty_method() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
563
a61af66fc99e Initial load
duke
parents:
diff changeset
564 // returns true if this is a vanilla constructor
a61af66fc99e Initial load
duke
parents:
diff changeset
565 bool is_vanilla_constructor() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
566
a61af66fc99e Initial load
duke
parents:
diff changeset
567 // checks method and its method holder
a61af66fc99e Initial load
duke
parents:
diff changeset
568 bool is_final_method() const;
12264
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 12170
diff changeset
569 bool is_final_method(AccessFlags class_access_flags) const;
12823
ac9cb1d5a202 8009130: Lambda: Fix access controls, loader constraints.
acorn
parents: 12264
diff changeset
570 bool is_default_method() const;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
571
a61af66fc99e Initial load
duke
parents:
diff changeset
572 // true if method needs no dynamic dispatch (final and/or no vtable entry)
a61af66fc99e Initial load
duke
parents:
diff changeset
573 bool can_be_statically_bound() const;
12264
b2e698d2276c 8014013: CallInfo structure no longer accurately reports the result of a LinkResolver operation
drchase
parents: 12170
diff changeset
574 bool can_be_statically_bound(AccessFlags class_access_flags) const;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
575
a61af66fc99e Initial load
duke
parents:
diff changeset
576 // returns true if the method has any backward branches.
a61af66fc99e Initial load
duke
parents:
diff changeset
577 bool has_loops() {
a61af66fc99e Initial load
duke
parents:
diff changeset
578 return access_flags().loops_flag_init() ? access_flags().has_loops() : compute_has_loops_flag();
a61af66fc99e Initial load
duke
parents:
diff changeset
579 };
a61af66fc99e Initial load
duke
parents:
diff changeset
580
a61af66fc99e Initial load
duke
parents:
diff changeset
581 bool compute_has_loops_flag();
a61af66fc99e Initial load
duke
parents:
diff changeset
582
a61af66fc99e Initial load
duke
parents:
diff changeset
583 bool has_jsrs() {
a61af66fc99e Initial load
duke
parents:
diff changeset
584 return access_flags().has_jsrs();
a61af66fc99e Initial load
duke
parents:
diff changeset
585 };
a61af66fc99e Initial load
duke
parents:
diff changeset
586 void set_has_jsrs() {
a61af66fc99e Initial load
duke
parents:
diff changeset
587 _access_flags.set_has_jsrs();
a61af66fc99e Initial load
duke
parents:
diff changeset
588 }
a61af66fc99e Initial load
duke
parents:
diff changeset
589
a61af66fc99e Initial load
duke
parents:
diff changeset
590 // returns true if the method has any monitors.
a61af66fc99e Initial load
duke
parents:
diff changeset
591 bool has_monitors() const { return is_synchronized() || access_flags().has_monitor_bytecodes(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
592 bool has_monitor_bytecodes() const { return access_flags().has_monitor_bytecodes(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
593
a61af66fc99e Initial load
duke
parents:
diff changeset
594 void set_has_monitor_bytecodes() { _access_flags.set_has_monitor_bytecodes(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
595
a61af66fc99e Initial load
duke
parents:
diff changeset
596 // monitor matching. This returns a conservative estimate of whether the monitorenter/monitorexit bytecodes
a61af66fc99e Initial load
duke
parents:
diff changeset
597 // propererly nest in the method. It might return false, even though they actually nest properly, since the info.
a61af66fc99e Initial load
duke
parents:
diff changeset
598 // has not been computed yet.
a61af66fc99e Initial load
duke
parents:
diff changeset
599 bool guaranteed_monitor_matching() const { return access_flags().is_monitor_matching(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
600 void set_guaranteed_monitor_matching() { _access_flags.set_monitor_matching(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
601
a61af66fc99e Initial load
duke
parents:
diff changeset
602 // returns true if the method is an accessor function (setter/getter).
a61af66fc99e Initial load
duke
parents:
diff changeset
603 bool is_accessor() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
604
a61af66fc99e Initial load
duke
parents:
diff changeset
605 // returns true if the method is an initializer (<init> or <clinit>).
a61af66fc99e Initial load
duke
parents:
diff changeset
606 bool is_initializer() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
607
2334
dbad0519a1c4 6845426: non-static <clinit> method with no args is called during the class initialization process
kamg
parents: 2243
diff changeset
608 // returns true if the method is static OR if the classfile version < 51
dbad0519a1c4 6845426: non-static <clinit> method with no args is called during the class initialization process
kamg
parents: 2243
diff changeset
609 bool has_valid_initializer_flags() const;
dbad0519a1c4 6845426: non-static <clinit> method with no args is called during the class initialization process
kamg
parents: 2243
diff changeset
610
dbad0519a1c4 6845426: non-static <clinit> method with no args is called during the class initialization process
kamg
parents: 2243
diff changeset
611 // returns true if the method name is <clinit> and the method has
dbad0519a1c4 6845426: non-static <clinit> method with no args is called during the class initialization process
kamg
parents: 2243
diff changeset
612 // valid static initializer flags.
dbad0519a1c4 6845426: non-static <clinit> method with no args is called during the class initialization process
kamg
parents: 2243
diff changeset
613 bool is_static_initializer() const;
dbad0519a1c4 6845426: non-static <clinit> method with no args is called during the class initialization process
kamg
parents: 2243
diff changeset
614
0
a61af66fc99e Initial load
duke
parents:
diff changeset
615 // compiled code support
a61af66fc99e Initial load
duke
parents:
diff changeset
616 // NOTE: code() is inherently racy as deopt can be clearing code
a61af66fc99e Initial load
duke
parents:
diff changeset
617 // simultaneously. Use with caution.
a61af66fc99e Initial load
duke
parents:
diff changeset
618 bool has_compiled_code() const { return code() != NULL; }
a61af66fc99e Initial load
duke
parents:
diff changeset
619
a61af66fc99e Initial load
duke
parents:
diff changeset
620 // sizing
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
621 static int header_size() { return sizeof(Method)/HeapWordSize; }
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
622 static int size(bool is_native);
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
623 int size() const { return method_size(); }
7956
16fb9f942703 6479360: PrintClassHistogram improvements
acorn
parents: 7470
diff changeset
624 #if INCLUDE_SERVICES
16fb9f942703 6479360: PrintClassHistogram improvements
acorn
parents: 7470
diff changeset
625 void collect_statistics(KlassSizeStats *sz) const;
16fb9f942703 6479360: PrintClassHistogram improvements
acorn
parents: 7470
diff changeset
626 #endif
0
a61af66fc99e Initial load
duke
parents:
diff changeset
627
a61af66fc99e Initial load
duke
parents:
diff changeset
628 // interpreter support
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
629 static ByteSize const_offset() { return byte_offset_of(Method, _constMethod ); }
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
630 static ByteSize access_flags_offset() { return byte_offset_of(Method, _access_flags ); }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
631 #ifdef CC_INTERP
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
632 static ByteSize result_index_offset() { return byte_offset_of(Method, _result_index ); }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
633 #endif /* CC_INTERP */
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
634 static ByteSize from_compiled_offset() { return byte_offset_of(Method, _from_compiled_entry); }
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
635 static ByteSize code_offset() { return byte_offset_of(Method, _code); }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
636 static ByteSize method_data_offset() {
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
637 return byte_offset_of(Method, _method_data);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
638 }
10105
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 8866
diff changeset
639 static ByteSize method_counters_offset() {
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 8866
diff changeset
640 return byte_offset_of(Method, _method_counters);
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 8866
diff changeset
641 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
642 #ifndef PRODUCT
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
643 static ByteSize compiled_invocation_counter_offset() { return byte_offset_of(Method, _compiled_invocation_count); }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
644 #endif // not PRODUCT
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
645 static ByteSize native_function_offset() { return in_ByteSize(sizeof(Method)); }
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
646 static ByteSize from_interpreted_offset() { return byte_offset_of(Method, _from_interpreted_entry ); }
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
647 static ByteSize interpreter_entry_offset() { return byte_offset_of(Method, _i2i_entry ); }
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
648 static ByteSize signature_handler_offset() { return in_ByteSize(sizeof(Method) + wordSize); }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
649
a61af66fc99e Initial load
duke
parents:
diff changeset
650 // for code generation
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
651 static int method_data_offset_in_bytes() { return offset_of(Method, _method_data); }
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
652 static int intrinsic_id_offset_in_bytes() { return offset_of(Method, _intrinsic_id); }
1793
d257356e35f0 6939224: MethodHandle.invokeGeneric needs to perform the correct set of conversions
jrose
parents: 1783
diff changeset
653 static int intrinsic_id_size_in_bytes() { return sizeof(u1); }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
654
a61af66fc99e Initial load
duke
parents:
diff changeset
655 // Static methods that are used to implement member methods where an exposed this pointer
a61af66fc99e Initial load
duke
parents:
diff changeset
656 // is needed due to possible GCs
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
657 static objArrayHandle resolved_checked_exceptions_impl(Method* this_oop, TRAPS);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
658
a61af66fc99e Initial load
duke
parents:
diff changeset
659 // Returns the byte code index from the byte code pointer
a61af66fc99e Initial load
duke
parents:
diff changeset
660 int bci_from(address bcp) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
661 address bcp_from(int bci) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
662 int validate_bci_from_bcx(intptr_t bcx) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
663
a61af66fc99e Initial load
duke
parents:
diff changeset
664 // Returns the line number for a bci if debugging information for the method is prowided,
a61af66fc99e Initial load
duke
parents:
diff changeset
665 // -1 is returned otherwise.
a61af66fc99e Initial load
duke
parents:
diff changeset
666 int line_number_from_bci(int bci) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
667
a61af66fc99e Initial load
duke
parents:
diff changeset
668 // Reflection support
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
669 bool is_overridden_in(Klass* k) const;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
670
8866
16885e702c88 7198429: need checked categorization of caller-sensitive methods in the JDK
twisti
parents: 8068
diff changeset
671 // Stack walking support
16885e702c88 7198429: need checked categorization of caller-sensitive methods in the JDK
twisti
parents: 8068
diff changeset
672 bool is_ignored_by_security_stack_walk() const;
16885e702c88 7198429: need checked categorization of caller-sensitive methods in the JDK
twisti
parents: 8068
diff changeset
673
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 628
diff changeset
674 // JSR 292 support
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6227
diff changeset
675 bool is_method_handle_intrinsic() const; // MethodHandles::is_signature_polymorphic_intrinsic(intrinsic_id)
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6227
diff changeset
676 bool is_compiled_lambda_form() const; // intrinsic_id() == vmIntrinsics::_compiledLambdaForm
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6227
diff changeset
677 bool has_member_arg() const; // intrinsic_id() == vmIntrinsics::_linkToSpecial, etc.
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6227
diff changeset
678 static methodHandle make_method_handle_intrinsic(vmIntrinsics::ID iid, // _invokeBasic, _linkToVirtual
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6227
diff changeset
679 Symbol* signature, //anything at all
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6227
diff changeset
680 TRAPS);
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
681 static Klass* check_non_bcp_klass(Klass* klass);
10393
603ca7e51354 8010460: Interpreter on some platforms loads ConstMethod::_max_stack and misses extra stack slots for JSR 292
roland
parents: 10267
diff changeset
682
603ca7e51354 8010460: Interpreter on some platforms loads ConstMethod::_max_stack and misses extra stack slots for JSR 292
roland
parents: 10267
diff changeset
683 // How many extra stack entries for invokedynamic when it's enabled
603ca7e51354 8010460: Interpreter on some platforms loads ConstMethod::_max_stack and misses extra stack slots for JSR 292
roland
parents: 10267
diff changeset
684 static const int extra_stack_entries_for_jsr292 = 1;
603ca7e51354 8010460: Interpreter on some platforms loads ConstMethod::_max_stack and misses extra stack slots for JSR 292
roland
parents: 10267
diff changeset
685
603ca7e51354 8010460: Interpreter on some platforms loads ConstMethod::_max_stack and misses extra stack slots for JSR 292
roland
parents: 10267
diff changeset
686 // this operates only on invoke methods:
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 628
diff changeset
687 // presize interpreter frames for extra interpreter stack entries, if needed
10393
603ca7e51354 8010460: Interpreter on some platforms loads ConstMethod::_max_stack and misses extra stack slots for JSR 292
roland
parents: 10267
diff changeset
688 // Account for the extra appendix argument for invokehandle/invokedynamic
603ca7e51354 8010460: Interpreter on some platforms loads ConstMethod::_max_stack and misses extra stack slots for JSR 292
roland
parents: 10267
diff changeset
689 static int extra_stack_entries() { return EnableInvokeDynamic ? extra_stack_entries_for_jsr292 : 0; }
603ca7e51354 8010460: Interpreter on some platforms loads ConstMethod::_max_stack and misses extra stack slots for JSR 292
roland
parents: 10267
diff changeset
690 static int extra_stack_words(); // = extra_stack_entries() * Interpreter::stackElementSize
1152
cd37471eaecc 6914206: change way of permission checking for generated MethodHandle adapters
twisti
parents: 1138
diff changeset
691
0
a61af66fc99e Initial load
duke
parents:
diff changeset
692 // RedefineClasses() support:
a61af66fc99e Initial load
duke
parents:
diff changeset
693 bool is_old() const { return access_flags().is_old(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
694 void set_is_old() { _access_flags.set_is_old(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
695 bool is_obsolete() const { return access_flags().is_obsolete(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
696 void set_is_obsolete() { _access_flags.set_is_obsolete(); }
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
697 bool on_stack() const { return access_flags().on_stack(); }
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
698 void set_on_stack(const bool value);
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
699
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
700 // see the definition in Method*.cpp for the gory details
48
d8b3ef7ee3e5 6599425: 4/3 OopMapCache::lookup() can cause later crash or assert() failure
dcubed
parents: 0
diff changeset
701 bool should_not_be_cached() const;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
702
a61af66fc99e Initial load
duke
parents:
diff changeset
703 // JVMTI Native method prefixing support:
a61af66fc99e Initial load
duke
parents:
diff changeset
704 bool is_prefixed_native() const { return access_flags().is_prefixed_native(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
705 void set_is_prefixed_native() { _access_flags.set_is_prefixed_native(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
706
a61af66fc99e Initial load
duke
parents:
diff changeset
707 // Rewriting support
a61af66fc99e Initial load
duke
parents:
diff changeset
708 static methodHandle clone_with_new_data(methodHandle m, u_char* new_code, int new_code_length,
a61af66fc99e Initial load
duke
parents:
diff changeset
709 u_char* new_compressed_linenumber_table, int new_compressed_linenumber_size, TRAPS);
a61af66fc99e Initial load
duke
parents:
diff changeset
710
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
711 // jmethodID handling
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
712 // Because the useful life-span of a jmethodID cannot be determined,
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
713 // once created they are never reclaimed. The methods to which they refer,
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
714 // however, can be GC'ed away if the class is unloaded or if the method is
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
715 // made obsolete or deleted -- in these cases, the jmethodID
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
716 // refers to NULL (as is the case for any weak reference).
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
717 static jmethodID make_jmethod_id(ClassLoaderData* loader_data, Method* mh);
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
718 static void destroy_jmethod_id(ClassLoaderData* loader_data, jmethodID mid);
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
719
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
720 // Use resolve_jmethod_id() in situations where the caller is expected
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
721 // to provide a valid jmethodID; the only sanity checks are in asserts;
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
722 // result guaranteed not to be NULL.
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
723 inline static Method* resolve_jmethod_id(jmethodID mid) {
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
724 assert(mid != NULL, "JNI method id should not be null");
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
725 return *((Method**)mid);
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
726 }
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
727
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
728 // Use checked_resolve_jmethod_id() in situations where the caller
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
729 // should provide a valid jmethodID, but might not. NULL is returned
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
730 // when the jmethodID does not refer to a valid method.
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
731 static Method* checked_resolve_jmethod_id(jmethodID mid);
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
732
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
733 static void change_method_associated_with_jmethod_id(jmethodID old_jmid_ptr, Method* new_method);
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
734 static bool is_method_id(jmethodID mid);
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
735
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
736 // Clear methods
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
737 static void clear_jmethod_ids(ClassLoaderData* loader_data);
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
738 static void print_jmethod_ids(ClassLoaderData* loader_data, outputStream* out) PRODUCT_RETURN;
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
739
0
a61af66fc99e Initial load
duke
parents:
diff changeset
740 // Get this method's jmethodID -- allocate if it doesn't exist
a61af66fc99e Initial load
duke
parents:
diff changeset
741 jmethodID jmethod_id() { methodHandle this_h(this);
6940
18fb7da42534 8000725: NPG: method_holder() and pool_holder() and pool_holder field should be InstanceKlass
coleenp
parents: 6934
diff changeset
742 return InstanceKlass::get_jmethod_id(method_holder(), this_h); }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
743
a61af66fc99e Initial load
duke
parents:
diff changeset
744 // Lookup the jmethodID for this method. Return NULL if not found.
a61af66fc99e Initial load
duke
parents:
diff changeset
745 // NOTE that this function can be called from a signal handler
a61af66fc99e Initial load
duke
parents:
diff changeset
746 // (see AsyncGetCallTrace support for Forte Analyzer) and this
a61af66fc99e Initial load
duke
parents:
diff changeset
747 // needs to be async-safe. No allocation should be done and
a61af66fc99e Initial load
duke
parents:
diff changeset
748 // so handles are not used to avoid deadlock.
6940
18fb7da42534 8000725: NPG: method_holder() and pool_holder() and pool_holder field should be InstanceKlass
coleenp
parents: 6934
diff changeset
749 jmethodID find_jmethod_id_or_null() { return method_holder()->jmethod_id_or_null(this); }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
750
a61af66fc99e Initial load
duke
parents:
diff changeset
751 // Support for inlining of intrinsic methods
856
75596850f863 6862576: vmIntrinsics needs cleanup in order to support JSR 292 intrinsics
jrose
parents: 726
diff changeset
752 vmIntrinsics::ID intrinsic_id() const { return (vmIntrinsics::ID) _intrinsic_id; }
75596850f863 6862576: vmIntrinsics needs cleanup in order to support JSR 292 intrinsics
jrose
parents: 726
diff changeset
753 void set_intrinsic_id(vmIntrinsics::ID id) { _intrinsic_id = (u1) id; }
75596850f863 6862576: vmIntrinsics needs cleanup in order to support JSR 292 intrinsics
jrose
parents: 726
diff changeset
754
75596850f863 6862576: vmIntrinsics needs cleanup in order to support JSR 292 intrinsics
jrose
parents: 726
diff changeset
755 // Helper routines for intrinsic_id() and vmIntrinsics::method().
75596850f863 6862576: vmIntrinsics needs cleanup in order to support JSR 292 intrinsics
jrose
parents: 726
diff changeset
756 void init_intrinsic_id(); // updates from _none if a match
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
757 static vmSymbols::SID klass_id_for_intrinsics(Klass* holder);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
758
8866
16885e702c88 7198429: need checked categorization of caller-sensitive methods in the JDK
twisti
parents: 8068
diff changeset
759 bool jfr_towrite() { return _jfr_towrite; }
16885e702c88 7198429: need checked categorization of caller-sensitive methods in the JDK
twisti
parents: 8068
diff changeset
760 void set_jfr_towrite(bool x) { _jfr_towrite = x; }
16885e702c88 7198429: need checked categorization of caller-sensitive methods in the JDK
twisti
parents: 8068
diff changeset
761 bool caller_sensitive() { return _caller_sensitive; }
16885e702c88 7198429: need checked categorization of caller-sensitive methods in the JDK
twisti
parents: 8068
diff changeset
762 void set_caller_sensitive(bool x) { _caller_sensitive = x; }
16885e702c88 7198429: need checked categorization of caller-sensitive methods in the JDK
twisti
parents: 8068
diff changeset
763 bool force_inline() { return _force_inline; }
16885e702c88 7198429: need checked categorization of caller-sensitive methods in the JDK
twisti
parents: 8068
diff changeset
764 void set_force_inline(bool x) { _force_inline = x; }
16885e702c88 7198429: need checked categorization of caller-sensitive methods in the JDK
twisti
parents: 8068
diff changeset
765 bool dont_inline() { return _dont_inline; }
16885e702c88 7198429: need checked categorization of caller-sensitive methods in the JDK
twisti
parents: 8068
diff changeset
766 void set_dont_inline(bool x) { _dont_inline = x; }
16885e702c88 7198429: need checked categorization of caller-sensitive methods in the JDK
twisti
parents: 8068
diff changeset
767 bool is_hidden() { return _hidden; }
16885e702c88 7198429: need checked categorization of caller-sensitive methods in the JDK
twisti
parents: 8068
diff changeset
768 void set_hidden(bool x) { _hidden = x; }
6934
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents: 6800
diff changeset
769 ConstMethod::MethodType method_type() const {
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents: 6800
diff changeset
770 return _constMethod->method_type();
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents: 6800
diff changeset
771 }
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents: 6800
diff changeset
772 bool is_overpass() const { return method_type() == ConstMethod::OVERPASS; }
6222
6d8f36bcef55 6711908: JVM needs direct access to some annotations
jrose
parents: 6146
diff changeset
773
0
a61af66fc99e Initial load
duke
parents:
diff changeset
774 // On-stack replacement support
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1552
diff changeset
775 bool has_osr_nmethod(int level, bool match_level) {
6940
18fb7da42534 8000725: NPG: method_holder() and pool_holder() and pool_holder field should be InstanceKlass
coleenp
parents: 6934
diff changeset
776 return method_holder()->lookup_osr_nmethod(this, InvocationEntryBci, level, match_level) != NULL;
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1552
diff changeset
777 }
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1552
diff changeset
778
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1552
diff changeset
779 nmethod* lookup_osr_nmethod_for(int bci, int level, bool match_level) {
6940
18fb7da42534 8000725: NPG: method_holder() and pool_holder() and pool_holder field should be InstanceKlass
coleenp
parents: 6934
diff changeset
780 return method_holder()->lookup_osr_nmethod(this, bci, level, match_level);
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1552
diff changeset
781 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
782
a61af66fc99e Initial load
duke
parents:
diff changeset
783 // Inline cache support
a61af66fc99e Initial load
duke
parents:
diff changeset
784 void cleanup_inline_caches();
a61af66fc99e Initial load
duke
parents:
diff changeset
785
a61af66fc99e Initial load
duke
parents:
diff changeset
786 // Find if klass for method is loaded
a61af66fc99e Initial load
duke
parents:
diff changeset
787 bool is_klass_loaded_by_klass_index(int klass_index) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
788 bool is_klass_loaded(int refinfo_index, bool must_be_resolved = false) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
789
a61af66fc99e Initial load
duke
parents:
diff changeset
790 // Indicates whether compilation failed earlier for this method, or
a61af66fc99e Initial load
duke
parents:
diff changeset
791 // whether it is not compilable for another reason like having a
a61af66fc99e Initial load
duke
parents:
diff changeset
792 // breakpoint set in it.
6800
9191895df19d 7200001: failed C1 OSR compile doesn't get recompiled with C2
twisti
parents: 6733
diff changeset
793 bool is_not_compilable(int comp_level = CompLevel_any) const;
7998
6a51fc70a15e 8006613: adding reason to made_not_compilable
vlivanov
parents: 7470
diff changeset
794 void set_not_compilable(int comp_level = CompLevel_all, bool report = true, const char* reason = NULL);
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1552
diff changeset
795 void set_not_compilable_quietly(int comp_level = CompLevel_all) {
1208
cef333a48af6 6923043: failed nightly tests which use -XX:+PrintCompilation -Xcomp -XX:CompileOnly
kvn
parents: 1202
diff changeset
796 set_not_compilable(comp_level, false);
cef333a48af6 6923043: failed nightly tests which use -XX:+PrintCompilation -Xcomp -XX:CompileOnly
kvn
parents: 1202
diff changeset
797 }
6800
9191895df19d 7200001: failed C1 OSR compile doesn't get recompiled with C2
twisti
parents: 6733
diff changeset
798 bool is_not_osr_compilable(int comp_level = CompLevel_any) const;
7998
6a51fc70a15e 8006613: adding reason to made_not_compilable
vlivanov
parents: 7470
diff changeset
799 void set_not_osr_compilable(int comp_level = CompLevel_all, bool report = true, const char* reason = NULL);
6800
9191895df19d 7200001: failed C1 OSR compile doesn't get recompiled with C2
twisti
parents: 6733
diff changeset
800 void set_not_osr_compilable_quietly(int comp_level = CompLevel_all) {
9191895df19d 7200001: failed C1 OSR compile doesn't get recompiled with C2
twisti
parents: 6733
diff changeset
801 set_not_osr_compilable(comp_level, false);
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1552
diff changeset
802 }
12170
8947af8a9cec 8023976: assert(!CompilationPolicy::can_be_compiled(this, comp_level)) failed: sanity check
vlivanov
parents: 10393
diff changeset
803 bool is_always_compilable() const;
6800
9191895df19d 7200001: failed C1 OSR compile doesn't get recompiled with C2
twisti
parents: 6733
diff changeset
804
9191895df19d 7200001: failed C1 OSR compile doesn't get recompiled with C2
twisti
parents: 6733
diff changeset
805 private:
7998
6a51fc70a15e 8006613: adding reason to made_not_compilable
vlivanov
parents: 7470
diff changeset
806 void print_made_not_compilable(int comp_level, bool is_osr, bool report, const char* reason);
6800
9191895df19d 7200001: failed C1 OSR compile doesn't get recompiled with C2
twisti
parents: 6733
diff changeset
807
12868
c775af091fe9 8025566: EXCEPTION_ACCESS_VIOLATION in compiled by C1 String.valueOf method
twisti
parents: 12264
diff changeset
808 public:
10105
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 8866
diff changeset
809 MethodCounters* get_method_counters(TRAPS) {
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 8866
diff changeset
810 if (_method_counters == NULL) {
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 8866
diff changeset
811 build_method_counters(this, CHECK_AND_CLEAR_NULL);
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 8866
diff changeset
812 }
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 8866
diff changeset
813 return _method_counters;
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 8866
diff changeset
814 }
aeaca88565e6 8010862: The Method counter fields used for profiling can be allocated lazily.
jiangli
parents: 8866
diff changeset
815
9080
b84fd7d73702 8007288: Additional WB API for compiler's testing
iignatyev
parents: 8866
diff changeset
816 bool is_not_c1_compilable() const { return access_flags().is_not_c1_compilable(); }
b84fd7d73702 8007288: Additional WB API for compiler's testing
iignatyev
parents: 8866
diff changeset
817 void set_not_c1_compilable() { _access_flags.set_not_c1_compilable(); }
b84fd7d73702 8007288: Additional WB API for compiler's testing
iignatyev
parents: 8866
diff changeset
818 void clear_not_c1_compilable() { _access_flags.clear_not_c1_compilable(); }
b84fd7d73702 8007288: Additional WB API for compiler's testing
iignatyev
parents: 8866
diff changeset
819 bool is_not_c2_compilable() const { return access_flags().is_not_c2_compilable(); }
b84fd7d73702 8007288: Additional WB API for compiler's testing
iignatyev
parents: 8866
diff changeset
820 void set_not_c2_compilable() { _access_flags.set_not_c2_compilable(); }
b84fd7d73702 8007288: Additional WB API for compiler's testing
iignatyev
parents: 8866
diff changeset
821 void clear_not_c2_compilable() { _access_flags.clear_not_c2_compilable(); }
6800
9191895df19d 7200001: failed C1 OSR compile doesn't get recompiled with C2
twisti
parents: 6733
diff changeset
822
9080
b84fd7d73702 8007288: Additional WB API for compiler's testing
iignatyev
parents: 8866
diff changeset
823 bool is_not_c1_osr_compilable() const { return is_not_c1_compilable(); } // don't waste an accessFlags bit
b84fd7d73702 8007288: Additional WB API for compiler's testing
iignatyev
parents: 8866
diff changeset
824 void set_not_c1_osr_compilable() { set_not_c1_compilable(); } // don't waste an accessFlags bit
b84fd7d73702 8007288: Additional WB API for compiler's testing
iignatyev
parents: 8866
diff changeset
825 void clear_not_c1_osr_compilable() { clear_not_c1_compilable(); } // don't waste an accessFlags bit
b84fd7d73702 8007288: Additional WB API for compiler's testing
iignatyev
parents: 8866
diff changeset
826 bool is_not_c2_osr_compilable() const { return access_flags().is_not_c2_osr_compilable(); }
b84fd7d73702 8007288: Additional WB API for compiler's testing
iignatyev
parents: 8866
diff changeset
827 void set_not_c2_osr_compilable() { _access_flags.set_not_c2_osr_compilable(); }
b84fd7d73702 8007288: Additional WB API for compiler's testing
iignatyev
parents: 8866
diff changeset
828 void clear_not_c2_osr_compilable() { _access_flags.clear_not_c2_osr_compilable(); }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
829
a61af66fc99e Initial load
duke
parents:
diff changeset
830 // Background compilation support
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1552
diff changeset
831 bool queued_for_compilation() const { return access_flags().queued_for_compilation(); }
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1552
diff changeset
832 void set_queued_for_compilation() { _access_flags.set_queued_for_compilation(); }
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1552
diff changeset
833 void clear_queued_for_compilation() { _access_flags.clear_queued_for_compilation(); }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
834
a61af66fc99e Initial load
duke
parents:
diff changeset
835 // Resolve all classes in signature, return 'true' if successful
a61af66fc99e Initial load
duke
parents:
diff changeset
836 static bool load_signature_classes(methodHandle m, TRAPS);
a61af66fc99e Initial load
duke
parents:
diff changeset
837
a61af66fc99e Initial load
duke
parents:
diff changeset
838 // Return if true if not all classes references in signature, including return type, has been loaded
a61af66fc99e Initial load
duke
parents:
diff changeset
839 static bool has_unloaded_classes_in_signature(methodHandle m, TRAPS);
a61af66fc99e Initial load
duke
parents:
diff changeset
840
a61af66fc99e Initial load
duke
parents:
diff changeset
841 // Printing
8021
8d9fc28831cc 7182152: Instrumentation hot swap test incorrect monitor count
dcubed
parents: 7969
diff changeset
842 void print_short_name(outputStream* st = tty); // prints as klassname::methodname; Exposed so field engineers can debug VM
8d9fc28831cc 7182152: Instrumentation hot swap test incorrect monitor count
dcubed
parents: 7969
diff changeset
843 #if INCLUDE_JVMTI
8d9fc28831cc 7182152: Instrumentation hot swap test incorrect monitor count
dcubed
parents: 7969
diff changeset
844 void print_name(outputStream* st = tty); // prints as "virtual void foo(int)"; exposed for TraceRedefineClasses
8d9fc28831cc 7182152: Instrumentation hot swap test incorrect monitor count
dcubed
parents: 7969
diff changeset
845 #else
6266
1d7922586cf6 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 6227
diff changeset
846 void print_name(outputStream* st = tty) PRODUCT_RETURN; // prints as "virtual void foo(int)"
8021
8d9fc28831cc 7182152: Instrumentation hot swap test incorrect monitor count
dcubed
parents: 7969
diff changeset
847 #endif
0
a61af66fc99e Initial load
duke
parents:
diff changeset
848
a61af66fc99e Initial load
duke
parents:
diff changeset
849 // Helper routine used for method sorting
12823
ac9cb1d5a202 8009130: Lambda: Fix access controls, loader constraints.
acorn
parents: 12264
diff changeset
850 static void sort_methods(Array<Method*>* methods, bool idempotent = false, bool set_idnums = true);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
851
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
852 // Deallocation function for redefine classes or if an error occurs
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
853 void deallocate_contents(ClassLoaderData* loader_data);
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
854
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
855 // Printing
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
856 #ifndef PRODUCT
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
857 void print_on(outputStream* st) const;
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
858 #endif
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
859 void print_value_on(outputStream* st) const;
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
860
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
861 const char* internal_name() const { return "{method}"; }
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
862
7176
59c790074993 8003635: NPG: AsynchGetCallTrace broken by Method* virtual call
coleenp
parents: 6940
diff changeset
863 // Check for valid method pointer
59c790074993 8003635: NPG: AsynchGetCallTrace broken by Method* virtual call
coleenp
parents: 6940
diff changeset
864 bool is_valid_method() const;
59c790074993 8003635: NPG: AsynchGetCallTrace broken by Method* virtual call
coleenp
parents: 6940
diff changeset
865
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
866 // Verify
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
867 void verify() { verify_on(tty); }
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
868 void verify_on(outputStream* st);
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
869
0
a61af66fc99e Initial load
duke
parents:
diff changeset
870 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
871
a61af66fc99e Initial load
duke
parents:
diff changeset
872 // Inlined elements
a61af66fc99e Initial load
duke
parents:
diff changeset
873 address* native_function_addr() const { assert(is_native(), "must be native"); return (address*) (this+1); }
a61af66fc99e Initial load
duke
parents:
diff changeset
874 address* signature_handler_addr() const { return native_function_addr() + 1; }
a61af66fc99e Initial load
duke
parents:
diff changeset
875 };
a61af66fc99e Initial load
duke
parents:
diff changeset
876
a61af66fc99e Initial load
duke
parents:
diff changeset
877
a61af66fc99e Initial load
duke
parents:
diff changeset
878 // Utility class for compressing line number tables
a61af66fc99e Initial load
duke
parents:
diff changeset
879
a61af66fc99e Initial load
duke
parents:
diff changeset
880 class CompressedLineNumberWriteStream: public CompressedWriteStream {
a61af66fc99e Initial load
duke
parents:
diff changeset
881 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
882 int _bci;
a61af66fc99e Initial load
duke
parents:
diff changeset
883 int _line;
a61af66fc99e Initial load
duke
parents:
diff changeset
884 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
885 // Constructor
a61af66fc99e Initial load
duke
parents:
diff changeset
886 CompressedLineNumberWriteStream(int initial_size) : CompressedWriteStream(initial_size), _bci(0), _line(0) {}
a61af66fc99e Initial load
duke
parents:
diff changeset
887 CompressedLineNumberWriteStream(u_char* buffer, int initial_size) : CompressedWriteStream(buffer, initial_size), _bci(0), _line(0) {}
a61af66fc99e Initial load
duke
parents:
diff changeset
888
a61af66fc99e Initial load
duke
parents:
diff changeset
889 // Write (bci, line number) pair to stream
a61af66fc99e Initial load
duke
parents:
diff changeset
890 void write_pair_regular(int bci_delta, int line_delta);
a61af66fc99e Initial load
duke
parents:
diff changeset
891
a61af66fc99e Initial load
duke
parents:
diff changeset
892 inline void write_pair_inline(int bci, int line) {
a61af66fc99e Initial load
duke
parents:
diff changeset
893 int bci_delta = bci - _bci;
a61af66fc99e Initial load
duke
parents:
diff changeset
894 int line_delta = line - _line;
a61af66fc99e Initial load
duke
parents:
diff changeset
895 _bci = bci;
a61af66fc99e Initial load
duke
parents:
diff changeset
896 _line = line;
a61af66fc99e Initial load
duke
parents:
diff changeset
897 // Skip (0,0) deltas - they do not add information and conflict with terminator.
a61af66fc99e Initial load
duke
parents:
diff changeset
898 if (bci_delta == 0 && line_delta == 0) return;
a61af66fc99e Initial load
duke
parents:
diff changeset
899 // Check if bci is 5-bit and line number 3-bit unsigned.
a61af66fc99e Initial load
duke
parents:
diff changeset
900 if (((bci_delta & ~0x1F) == 0) && ((line_delta & ~0x7) == 0)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
901 // Compress into single byte.
a61af66fc99e Initial load
duke
parents:
diff changeset
902 jubyte value = ((jubyte) bci_delta << 3) | (jubyte) line_delta;
a61af66fc99e Initial load
duke
parents:
diff changeset
903 // Check that value doesn't match escape character.
a61af66fc99e Initial load
duke
parents:
diff changeset
904 if (value != 0xFF) {
a61af66fc99e Initial load
duke
parents:
diff changeset
905 write_byte(value);
a61af66fc99e Initial load
duke
parents:
diff changeset
906 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
907 }
a61af66fc99e Initial load
duke
parents:
diff changeset
908 }
a61af66fc99e Initial load
duke
parents:
diff changeset
909 write_pair_regular(bci_delta, line_delta);
a61af66fc99e Initial load
duke
parents:
diff changeset
910 }
a61af66fc99e Initial load
duke
parents:
diff changeset
911
a61af66fc99e Initial load
duke
parents:
diff changeset
912 // Windows AMD64 + Apr 2005 PSDK with /O2 generates bad code for write_pair.
a61af66fc99e Initial load
duke
parents:
diff changeset
913 // Disabling optimization doesn't work for methods in header files
a61af66fc99e Initial load
duke
parents:
diff changeset
914 // so we force it to call through the non-optimized version in the .cpp.
a61af66fc99e Initial load
duke
parents:
diff changeset
915 // It's gross, but it's the only way we can ensure that all callers are
2233
15d6977f04b0 7017824: Add support for creating 64-bit Visual Studio projects
sla
parents: 2177
diff changeset
916 // fixed. _MSC_VER is defined by the windows compiler
15d6977f04b0 7017824: Add support for creating 64-bit Visual Studio projects
sla
parents: 2177
diff changeset
917 #if defined(_M_AMD64) && _MSC_VER >= 1400
0
a61af66fc99e Initial load
duke
parents:
diff changeset
918 void write_pair(int bci, int line);
a61af66fc99e Initial load
duke
parents:
diff changeset
919 #else
a61af66fc99e Initial load
duke
parents:
diff changeset
920 void write_pair(int bci, int line) { write_pair_inline(bci, line); }
a61af66fc99e Initial load
duke
parents:
diff changeset
921 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
922
a61af66fc99e Initial load
duke
parents:
diff changeset
923 // Write end-of-stream marker
a61af66fc99e Initial load
duke
parents:
diff changeset
924 void write_terminator() { write_byte(0); }
a61af66fc99e Initial load
duke
parents:
diff changeset
925 };
a61af66fc99e Initial load
duke
parents:
diff changeset
926
a61af66fc99e Initial load
duke
parents:
diff changeset
927
a61af66fc99e Initial load
duke
parents:
diff changeset
928 // Utility class for decompressing line number tables
a61af66fc99e Initial load
duke
parents:
diff changeset
929
a61af66fc99e Initial load
duke
parents:
diff changeset
930 class CompressedLineNumberReadStream: public CompressedReadStream {
a61af66fc99e Initial load
duke
parents:
diff changeset
931 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
932 int _bci;
a61af66fc99e Initial load
duke
parents:
diff changeset
933 int _line;
a61af66fc99e Initial load
duke
parents:
diff changeset
934 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
935 // Constructor
a61af66fc99e Initial load
duke
parents:
diff changeset
936 CompressedLineNumberReadStream(u_char* buffer);
a61af66fc99e Initial load
duke
parents:
diff changeset
937 // Read (bci, line number) pair from stream. Returns false at end-of-stream.
a61af66fc99e Initial load
duke
parents:
diff changeset
938 bool read_pair();
a61af66fc99e Initial load
duke
parents:
diff changeset
939 // Accessing bci and line number (after calling read_pair)
a61af66fc99e Initial load
duke
parents:
diff changeset
940 int bci() const { return _bci; }
a61af66fc99e Initial load
duke
parents:
diff changeset
941 int line() const { return _line; }
a61af66fc99e Initial load
duke
parents:
diff changeset
942 };
a61af66fc99e Initial load
duke
parents:
diff changeset
943
a61af66fc99e Initial load
duke
parents:
diff changeset
944
a61af66fc99e Initial load
duke
parents:
diff changeset
945 /// Fast Breakpoints.
a61af66fc99e Initial load
duke
parents:
diff changeset
946
a61af66fc99e Initial load
duke
parents:
diff changeset
947 // If this structure gets more complicated (because bpts get numerous),
a61af66fc99e Initial load
duke
parents:
diff changeset
948 // move it into its own header.
a61af66fc99e Initial load
duke
parents:
diff changeset
949
a61af66fc99e Initial load
duke
parents:
diff changeset
950 // There is presently no provision for concurrent access
a61af66fc99e Initial load
duke
parents:
diff changeset
951 // to breakpoint lists, which is only OK for JVMTI because
a61af66fc99e Initial load
duke
parents:
diff changeset
952 // breakpoints are written only at safepoints, and are read
a61af66fc99e Initial load
duke
parents:
diff changeset
953 // concurrently only outside of safepoints.
a61af66fc99e Initial load
duke
parents:
diff changeset
954
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 6146
diff changeset
955 class BreakpointInfo : public CHeapObj<mtClass> {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
956 friend class VMStructs;
a61af66fc99e Initial load
duke
parents:
diff changeset
957 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
958 Bytecodes::Code _orig_bytecode;
a61af66fc99e Initial load
duke
parents:
diff changeset
959 int _bci;
a61af66fc99e Initial load
duke
parents:
diff changeset
960 u2 _name_index; // of method
a61af66fc99e Initial load
duke
parents:
diff changeset
961 u2 _signature_index; // of method
a61af66fc99e Initial load
duke
parents:
diff changeset
962 BreakpointInfo* _next; // simple storage allocation
a61af66fc99e Initial load
duke
parents:
diff changeset
963
a61af66fc99e Initial load
duke
parents:
diff changeset
964 public:
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
965 BreakpointInfo(Method* m, int bci);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
966
a61af66fc99e Initial load
duke
parents:
diff changeset
967 // accessors
a61af66fc99e Initial load
duke
parents:
diff changeset
968 Bytecodes::Code orig_bytecode() { return _orig_bytecode; }
a61af66fc99e Initial load
duke
parents:
diff changeset
969 void set_orig_bytecode(Bytecodes::Code code) { _orig_bytecode = code; }
a61af66fc99e Initial load
duke
parents:
diff changeset
970 int bci() { return _bci; }
a61af66fc99e Initial load
duke
parents:
diff changeset
971
a61af66fc99e Initial load
duke
parents:
diff changeset
972 BreakpointInfo* next() const { return _next; }
a61af66fc99e Initial load
duke
parents:
diff changeset
973 void set_next(BreakpointInfo* n) { _next = n; }
a61af66fc99e Initial load
duke
parents:
diff changeset
974
a61af66fc99e Initial load
duke
parents:
diff changeset
975 // helps for searchers
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
976 bool match(const Method* m, int bci) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
977 return bci == _bci && match(m);
a61af66fc99e Initial load
duke
parents:
diff changeset
978 }
a61af66fc99e Initial load
duke
parents:
diff changeset
979
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
980 bool match(const Method* m) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
981 return _name_index == m->name_index() &&
a61af66fc99e Initial load
duke
parents:
diff changeset
982 _signature_index == m->signature_index();
a61af66fc99e Initial load
duke
parents:
diff changeset
983 }
a61af66fc99e Initial load
duke
parents:
diff changeset
984
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
985 void set(Method* method);
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6271
diff changeset
986 void clear(Method* method);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
987 };
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1877
diff changeset
988
6213
8150fa46d2ed 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 6146
diff changeset
989 // Utility class for access exception handlers
8150fa46d2ed 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 6146
diff changeset
990 class ExceptionTable : public StackObj {
8150fa46d2ed 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 6146
diff changeset
991 private:
8150fa46d2ed 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 6146
diff changeset
992 ExceptionTableElement* _table;
8150fa46d2ed 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 6146
diff changeset
993 u2 _length;
8150fa46d2ed 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 6146
diff changeset
994
8150fa46d2ed 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 6146
diff changeset
995 public:
10265
92ef81e2f571 8003557: NPG: Klass* const k should be const Klass* k.
minqi
parents: 10107
diff changeset
996 ExceptionTable(const Method* m) {
6213
8150fa46d2ed 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 6146
diff changeset
997 if (m->has_exception_handler()) {
8150fa46d2ed 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 6146
diff changeset
998 _table = m->exception_table_start();
8150fa46d2ed 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 6146
diff changeset
999 _length = m->exception_table_length();
8150fa46d2ed 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 6146
diff changeset
1000 } else {
8150fa46d2ed 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 6146
diff changeset
1001 _table = NULL;
8150fa46d2ed 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 6146
diff changeset
1002 _length = 0;
8150fa46d2ed 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 6146
diff changeset
1003 }
8150fa46d2ed 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 6146
diff changeset
1004 }
8150fa46d2ed 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 6146
diff changeset
1005
8150fa46d2ed 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 6146
diff changeset
1006 int length() const {
8150fa46d2ed 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 6146
diff changeset
1007 return _length;
8150fa46d2ed 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 6146
diff changeset
1008 }
8150fa46d2ed 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 6146
diff changeset
1009
8150fa46d2ed 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 6146
diff changeset
1010 u2 start_pc(int idx) const {
8150fa46d2ed 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 6146
diff changeset
1011 assert(idx < _length, "out of bounds");
8150fa46d2ed 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 6146
diff changeset
1012 return _table[idx].start_pc;
8150fa46d2ed 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 6146
diff changeset
1013 }
8150fa46d2ed 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 6146
diff changeset
1014
8150fa46d2ed 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 6146
diff changeset
1015 void set_start_pc(int idx, u2 value) {
8150fa46d2ed 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 6146
diff changeset
1016 assert(idx < _length, "out of bounds");
8150fa46d2ed 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 6146
diff changeset
1017 _table[idx].start_pc = value;
8150fa46d2ed 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 6146
diff changeset
1018 }
8150fa46d2ed 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 6146
diff changeset
1019
8150fa46d2ed 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 6146
diff changeset
1020 u2 end_pc(int idx) const {
8150fa46d2ed 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 6146
diff changeset
1021 assert(idx < _length, "out of bounds");
8150fa46d2ed 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 6146
diff changeset
1022 return _table[idx].end_pc;
8150fa46d2ed 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 6146
diff changeset
1023 }
8150fa46d2ed 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 6146
diff changeset
1024
8150fa46d2ed 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 6146
diff changeset
1025 void set_end_pc(int idx, u2 value) {
8150fa46d2ed 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 6146
diff changeset
1026 assert(idx < _length, "out of bounds");
8150fa46d2ed 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 6146
diff changeset
1027 _table[idx].end_pc = value;
8150fa46d2ed 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 6146
diff changeset
1028 }
8150fa46d2ed 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 6146
diff changeset
1029
8150fa46d2ed 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 6146
diff changeset
1030 u2 handler_pc(int idx) const {
8150fa46d2ed 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 6146
diff changeset
1031 assert(idx < _length, "out of bounds");
8150fa46d2ed 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 6146
diff changeset
1032 return _table[idx].handler_pc;
8150fa46d2ed 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 6146
diff changeset
1033 }
8150fa46d2ed 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 6146
diff changeset
1034
8150fa46d2ed 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 6146
diff changeset
1035 void set_handler_pc(int idx, u2 value) {
8150fa46d2ed 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 6146
diff changeset
1036 assert(idx < _length, "out of bounds");
8150fa46d2ed 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 6146
diff changeset
1037 _table[idx].handler_pc = value;
8150fa46d2ed 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 6146
diff changeset
1038 }
8150fa46d2ed 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 6146
diff changeset
1039
8150fa46d2ed 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 6146
diff changeset
1040 u2 catch_type_index(int idx) const {
8150fa46d2ed 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 6146
diff changeset
1041 assert(idx < _length, "out of bounds");
8150fa46d2ed 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 6146
diff changeset
1042 return _table[idx].catch_type_index;
8150fa46d2ed 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 6146
diff changeset
1043 }
8150fa46d2ed 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 6146
diff changeset
1044
8150fa46d2ed 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 6146
diff changeset
1045 void set_catch_type_index(int idx, u2 value) {
8150fa46d2ed 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 6146
diff changeset
1046 assert(idx < _length, "out of bounds");
8150fa46d2ed 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 6146
diff changeset
1047 _table[idx].catch_type_index = value;
8150fa46d2ed 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 6146
diff changeset
1048 }
8150fa46d2ed 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 6146
diff changeset
1049 };
8150fa46d2ed 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 6146
diff changeset
1050
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1877
diff changeset
1051 #endif // SHARE_VM_OOPS_METHODOOP_HPP