annotate src/share/vm/oops/methodOop.hpp @ 3011:f00918f35c7f

inlining and runtime interface related changes: added codeSize() and compilerStorage() to RiMethod HotSpotMethodResolved uses reflective methods instead of vmIds and survives compilations HotSpotResolvedType.isInitialized not represented as field (can change) inlining stores graphs into method objects and reuses them
author Lukas Stadler <lukas.stadler@jku.at>
date Thu, 16 Jun 2011 20:36:17 +0200
parents 38fea01eb669
children be4ca325525a
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1 /*
2142
8012aa3ccede 4926272: methodOopDesc::method_from_bcp is unsafe
never
parents: 1972
diff changeset
2 * Copyright (c) 1997, 2011, 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"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1877
diff changeset
32 #include "oops/constMethodOop.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1877
diff changeset
33 #include "oops/constantPoolOop.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1877
diff changeset
34 #include "oops/instanceKlass.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1877
diff changeset
35 #include "oops/oop.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1877
diff changeset
36 #include "oops/typeArrayOop.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1877
diff changeset
37 #include "utilities/accessFlags.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1877
diff changeset
38 #include "utilities/growableArray.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1877
diff changeset
39
0
a61af66fc99e Initial load
duke
parents:
diff changeset
40 // A methodOop represents a Java method.
a61af66fc99e Initial load
duke
parents:
diff changeset
41 //
a61af66fc99e Initial load
duke
parents:
diff changeset
42 // Memory layout (each line represents a word). Note that most applications load thousands of methods,
a61af66fc99e Initial load
duke
parents:
diff changeset
43 // so keeping the size of this structure small has a big impact on footprint.
a61af66fc99e Initial load
duke
parents:
diff changeset
44 //
a61af66fc99e Initial load
duke
parents:
diff changeset
45 // We put all oops and method_size first for better gc cache locality.
a61af66fc99e Initial load
duke
parents:
diff changeset
46 //
a61af66fc99e Initial load
duke
parents:
diff changeset
47 // The actual bytecodes are inlined after the end of the methodOopDesc struct.
a61af66fc99e Initial load
duke
parents:
diff changeset
48 //
a61af66fc99e Initial load
duke
parents:
diff changeset
49 // There are bits in the access_flags telling whether inlined tables are present.
a61af66fc99e Initial load
duke
parents:
diff changeset
50 // Note that accessing the line number and local variable tables is not performance critical at all.
a61af66fc99e Initial load
duke
parents:
diff changeset
51 // Accessing the checked exceptions table is used by reflection, so we put that last to make access
a61af66fc99e Initial load
duke
parents:
diff changeset
52 // to it fast.
a61af66fc99e Initial load
duke
parents:
diff changeset
53 //
a61af66fc99e Initial load
duke
parents:
diff changeset
54 // 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
55 // byte following the byte codes. The checked exceptions table and the local variable table are inlined
a61af66fc99e Initial load
duke
parents:
diff changeset
56 // 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
57 // 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
58 // variable table either since it is mostly absent.
a61af66fc99e Initial load
duke
parents:
diff changeset
59 //
a61af66fc99e Initial load
duke
parents:
diff changeset
60 // Note that native_function and signature_handler has to be at fixed offsets (required by the interpreter)
a61af66fc99e Initial load
duke
parents:
diff changeset
61 //
a61af66fc99e Initial load
duke
parents:
diff changeset
62 // |------------------------------------------------------|
a61af66fc99e Initial load
duke
parents:
diff changeset
63 // | header |
a61af66fc99e Initial load
duke
parents:
diff changeset
64 // | klass |
a61af66fc99e Initial load
duke
parents:
diff changeset
65 // |------------------------------------------------------|
a61af66fc99e Initial load
duke
parents:
diff changeset
66 // | constMethodOop (oop) |
a61af66fc99e Initial load
duke
parents:
diff changeset
67 // | constants (oop) |
a61af66fc99e Initial load
duke
parents:
diff changeset
68 // |------------------------------------------------------|
a61af66fc99e Initial load
duke
parents:
diff changeset
69 // | methodData (oop) |
a61af66fc99e Initial load
duke
parents:
diff changeset
70 // | interp_invocation_count |
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 // |------------------------------------------------------|
a61af66fc99e Initial load
duke
parents:
diff changeset
77 // | method_size | max_stack |
a61af66fc99e Initial load
duke
parents:
diff changeset
78 // | max_locals | size_of_parameters |
a61af66fc99e Initial load
duke
parents:
diff changeset
79 // |------------------------------------------------------|
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1552
diff changeset
80 // | intrinsic_id, (unused) | throwout_count |
0
a61af66fc99e Initial load
duke
parents:
diff changeset
81 // |------------------------------------------------------|
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1552
diff changeset
82 // | num_breakpoints | (unused) |
0
a61af66fc99e Initial load
duke
parents:
diff changeset
83 // |------------------------------------------------------|
a61af66fc99e Initial load
duke
parents:
diff changeset
84 // | invocation_counter |
a61af66fc99e Initial load
duke
parents:
diff changeset
85 // | backedge_counter |
a61af66fc99e Initial load
duke
parents:
diff changeset
86 // |------------------------------------------------------|
2348
5d8f5a6dced7 7020403: Add AdvancedCompilationPolicy for tiered
iveresov
parents: 2243
diff changeset
87 // | prev_time (tiered only, 64 bit wide) |
5d8f5a6dced7 7020403: Add AdvancedCompilationPolicy for tiered
iveresov
parents: 2243
diff changeset
88 // | |
5d8f5a6dced7 7020403: Add AdvancedCompilationPolicy for tiered
iveresov
parents: 2243
diff changeset
89 // |------------------------------------------------------|
5d8f5a6dced7 7020403: Add AdvancedCompilationPolicy for tiered
iveresov
parents: 2243
diff changeset
90 // | rate (tiered) |
5d8f5a6dced7 7020403: Add AdvancedCompilationPolicy for tiered
iveresov
parents: 2243
diff changeset
91 // |------------------------------------------------------|
0
a61af66fc99e Initial load
duke
parents:
diff changeset
92 // | code (pointer) |
a61af66fc99e Initial load
duke
parents:
diff changeset
93 // | i2i (pointer) |
a61af66fc99e Initial load
duke
parents:
diff changeset
94 // | adapter (pointer) |
a61af66fc99e Initial load
duke
parents:
diff changeset
95 // | from_compiled_entry (pointer) |
a61af66fc99e Initial load
duke
parents:
diff changeset
96 // | from_interpreted_entry (pointer) |
a61af66fc99e Initial load
duke
parents:
diff changeset
97 // |------------------------------------------------------|
a61af66fc99e Initial load
duke
parents:
diff changeset
98 // | native_function (present only if native) |
a61af66fc99e Initial load
duke
parents:
diff changeset
99 // | signature_handler (present only if native) |
a61af66fc99e Initial load
duke
parents:
diff changeset
100 // |------------------------------------------------------|
a61af66fc99e Initial load
duke
parents:
diff changeset
101
a61af66fc99e Initial load
duke
parents:
diff changeset
102
a61af66fc99e Initial load
duke
parents:
diff changeset
103 class CheckedExceptionElement;
a61af66fc99e Initial load
duke
parents:
diff changeset
104 class LocalVariableTableElement;
a61af66fc99e Initial load
duke
parents:
diff changeset
105 class AdapterHandlerEntry;
a61af66fc99e Initial load
duke
parents:
diff changeset
106 class methodDataOopDesc;
a61af66fc99e Initial load
duke
parents:
diff changeset
107
a61af66fc99e Initial load
duke
parents:
diff changeset
108 class methodOopDesc : public oopDesc {
a61af66fc99e Initial load
duke
parents:
diff changeset
109 friend class methodKlass;
a61af66fc99e Initial load
duke
parents:
diff changeset
110 friend class VMStructs;
a61af66fc99e Initial load
duke
parents:
diff changeset
111 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
112 constMethodOop _constMethod; // Method read-only data.
a61af66fc99e Initial load
duke
parents:
diff changeset
113 constantPoolOop _constants; // Constant pool
a61af66fc99e Initial load
duke
parents:
diff changeset
114 methodDataOop _method_data;
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1552
diff changeset
115 int _interpreter_invocation_count; // Count of times invoked (reused as prev_event_count in tiered)
0
a61af66fc99e Initial load
duke
parents:
diff changeset
116 AccessFlags _access_flags; // Access flags
a61af66fc99e Initial load
duke
parents:
diff changeset
117 int _vtable_index; // vtable index of this method (see VtableIndexFlag)
a61af66fc99e Initial load
duke
parents:
diff changeset
118 // note: can have vtables with >2**16 elements (because of inheritance)
a61af66fc99e Initial load
duke
parents:
diff changeset
119 #ifdef CC_INTERP
a61af66fc99e Initial load
duke
parents:
diff changeset
120 int _result_index; // C++ interpreter needs for converting results to/from stack
a61af66fc99e Initial load
duke
parents:
diff changeset
121 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
122 u2 _method_size; // size of this object
a61af66fc99e Initial load
duke
parents:
diff changeset
123 u2 _max_stack; // Maximum number of entries on the expression stack
a61af66fc99e Initial load
duke
parents:
diff changeset
124 u2 _max_locals; // Number of local variables used by this method
a61af66fc99e Initial load
duke
parents:
diff changeset
125 u2 _size_of_parameters; // size of the parameter block (receiver + arguments) in words
856
75596850f863 6862576: vmIntrinsics needs cleanup in order to support JSR 292 intrinsics
jrose
parents: 726
diff changeset
126 u1 _intrinsic_id; // vmSymbols::intrinsic_id (0 == _none)
0
a61af66fc99e Initial load
duke
parents:
diff changeset
127 u2 _interpreter_throwout_count; // Count of times method was exited via exception while interpreting
a61af66fc99e Initial load
duke
parents:
diff changeset
128 u2 _number_of_breakpoints; // fullspeed debugging support
a61af66fc99e Initial load
duke
parents:
diff changeset
129 InvocationCounter _invocation_counter; // Incremented before each activation of the method - used to trigger frequency-based optimizations
a61af66fc99e Initial load
duke
parents:
diff changeset
130 InvocationCounter _backedge_counter; // Incremented before each backedge taken - used to trigger frequencey-based optimizations
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1552
diff changeset
131
3011
f00918f35c7f inlining and runtime interface related changes:
Lukas Stadler <lukas.stadler@jku.at>
parents: 2416
diff changeset
132 // com/oracle/max/graal/runtime/HotSpotMethodResolved mirroring this method
f00918f35c7f inlining and runtime interface related changes:
Lukas Stadler <lukas.stadler@jku.at>
parents: 2416
diff changeset
133 oop _graal_mirror;
2348
5d8f5a6dced7 7020403: Add AdvancedCompilationPolicy for tiered
iveresov
parents: 2243
diff changeset
134 #ifdef TIERED
5d8f5a6dced7 7020403: Add AdvancedCompilationPolicy for tiered
iveresov
parents: 2243
diff changeset
135 jlong _prev_time; // Previous time the rate was acquired
5d8f5a6dced7 7020403: Add AdvancedCompilationPolicy for tiered
iveresov
parents: 2243
diff changeset
136 float _rate; // Events (invocation and backedge counter increments) per millisecond
5d8f5a6dced7 7020403: Add AdvancedCompilationPolicy for tiered
iveresov
parents: 2243
diff changeset
137 #endif
5d8f5a6dced7 7020403: Add AdvancedCompilationPolicy for tiered
iveresov
parents: 2243
diff changeset
138
0
a61af66fc99e Initial load
duke
parents:
diff changeset
139 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
140 int _compiled_invocation_count; // Number of nmethod invocations so far (for perf. debugging)
a61af66fc99e Initial load
duke
parents:
diff changeset
141 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
142 // Entry point for calling both from and to the interpreter.
a61af66fc99e Initial load
duke
parents:
diff changeset
143 address _i2i_entry; // All-args-on-stack calling convention
a61af66fc99e Initial load
duke
parents:
diff changeset
144 // Adapter blob (i2c/c2i) for this methodOop. Set once when method is linked.
a61af66fc99e Initial load
duke
parents:
diff changeset
145 AdapterHandlerEntry* _adapter;
a61af66fc99e Initial load
duke
parents:
diff changeset
146 // Entry point for calling from compiled code, to compiled code if it exists
a61af66fc99e Initial load
duke
parents:
diff changeset
147 // or else the interpreter.
a61af66fc99e Initial load
duke
parents:
diff changeset
148 volatile address _from_compiled_entry; // Cache of: _code ? _code->entry_point() : _adapter->c2i_entry()
a61af66fc99e Initial load
duke
parents:
diff changeset
149 // The entry point for calling both from and to compiled code is
a61af66fc99e Initial load
duke
parents:
diff changeset
150 // "_code->entry_point()". Because of tiered compilation and de-opt, this
a61af66fc99e Initial load
duke
parents:
diff changeset
151 // field can come and go. It can transition from NULL to not-null at any
a61af66fc99e Initial load
duke
parents:
diff changeset
152 // time (whenever a compile completes). It can transition from not-null to
a61af66fc99e Initial load
duke
parents:
diff changeset
153 // NULL only at safepoints (because of a de-opt).
a61af66fc99e Initial load
duke
parents:
diff changeset
154 nmethod* volatile _code; // Points to the corresponding piece of native code
a61af66fc99e Initial load
duke
parents:
diff changeset
155 volatile address _from_interpreted_entry; // Cache of _code ? _adapter->i2c_entry() : _i2i_entry
a61af66fc99e Initial load
duke
parents:
diff changeset
156
a61af66fc99e Initial load
duke
parents:
diff changeset
157 public:
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
a61af66fc99e Initial load
duke
parents:
diff changeset
160 constMethodOop constMethod() const { return _constMethod; }
a61af66fc99e Initial load
duke
parents:
diff changeset
161 void set_constMethod(constMethodOop xconst) { oop_store_without_check((oop*)&_constMethod, (oop)xconst); }
a61af66fc99e Initial load
duke
parents:
diff changeset
162
a61af66fc99e Initial load
duke
parents:
diff changeset
163
a61af66fc99e Initial load
duke
parents:
diff changeset
164 static address make_adapters(methodHandle mh, TRAPS);
a61af66fc99e Initial load
duke
parents:
diff changeset
165 volatile address from_compiled_entry() const { return (address)OrderAccess::load_ptr_acquire(&_from_compiled_entry); }
a61af66fc99e Initial load
duke
parents:
diff changeset
166 volatile address from_interpreted_entry() const{ return (address)OrderAccess::load_ptr_acquire(&_from_interpreted_entry); }
a61af66fc99e Initial load
duke
parents:
diff changeset
167
a61af66fc99e Initial load
duke
parents:
diff changeset
168 // access flag
a61af66fc99e Initial load
duke
parents:
diff changeset
169 AccessFlags access_flags() const { return _access_flags; }
a61af66fc99e Initial load
duke
parents:
diff changeset
170 void set_access_flags(AccessFlags flags) { _access_flags = flags; }
a61af66fc99e Initial load
duke
parents:
diff changeset
171
a61af66fc99e Initial load
duke
parents:
diff changeset
172 // name
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2142
diff changeset
173 Symbol* name() const { return _constants->symbol_at(name_index()); }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
174 int name_index() const { return constMethod()->name_index(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
175 void set_name_index(int index) { constMethod()->set_name_index(index); }
a61af66fc99e Initial load
duke
parents:
diff changeset
176
a61af66fc99e Initial load
duke
parents:
diff changeset
177 // signature
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2142
diff changeset
178 Symbol* signature() const { return _constants->symbol_at(signature_index()); }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
179 int signature_index() const { return constMethod()->signature_index(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
180 void set_signature_index(int index) { constMethod()->set_signature_index(index); }
a61af66fc99e Initial load
duke
parents:
diff changeset
181
a61af66fc99e Initial load
duke
parents:
diff changeset
182 // generics support
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2142
diff changeset
183 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
184 int generic_signature_index() const { return constMethod()->generic_signature_index(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
185 void set_generic_signature_index(int index) { constMethod()->set_generic_signature_index(index); }
a61af66fc99e Initial load
duke
parents:
diff changeset
186
a61af66fc99e Initial load
duke
parents:
diff changeset
187 // annotations support
a61af66fc99e Initial load
duke
parents:
diff changeset
188 typeArrayOop annotations() const { return instanceKlass::cast(method_holder())->get_method_annotations_of(method_idnum()); }
a61af66fc99e Initial load
duke
parents:
diff changeset
189 typeArrayOop parameter_annotations() const { return instanceKlass::cast(method_holder())->get_method_parameter_annotations_of(method_idnum()); }
a61af66fc99e Initial load
duke
parents:
diff changeset
190 typeArrayOop annotation_default() const { return instanceKlass::cast(method_holder())->get_method_default_annotations_of(method_idnum()); }
a61af66fc99e Initial load
duke
parents:
diff changeset
191
a61af66fc99e Initial load
duke
parents:
diff changeset
192 #ifdef CC_INTERP
a61af66fc99e Initial load
duke
parents:
diff changeset
193 void set_result_index(BasicType type);
a61af66fc99e Initial load
duke
parents:
diff changeset
194 int result_index() { return _result_index; }
a61af66fc99e Initial load
duke
parents:
diff changeset
195 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
196
a61af66fc99e Initial load
duke
parents:
diff changeset
197 // Helper routine: get klass name + "." + method name + signature as
a61af66fc99e Initial load
duke
parents:
diff changeset
198 // C string, for the purpose of providing more useful NoSuchMethodErrors
a61af66fc99e Initial load
duke
parents:
diff changeset
199 // and fatal error handling. The string is allocated in resource
a61af66fc99e Initial load
duke
parents:
diff changeset
200 // area if a buffer is not provided by the caller.
a61af66fc99e Initial load
duke
parents:
diff changeset
201 char* name_and_sig_as_C_string();
a61af66fc99e Initial load
duke
parents:
diff changeset
202 char* name_and_sig_as_C_string(char* buf, int size);
a61af66fc99e Initial load
duke
parents:
diff changeset
203
a61af66fc99e Initial load
duke
parents:
diff changeset
204 // Static routine in the situations we don't have a methodOop
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2142
diff changeset
205 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
206 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
207
2142
8012aa3ccede 4926272: methodOopDesc::method_from_bcp is unsafe
never
parents: 1972
diff changeset
208 Bytecodes::Code java_code_at(int bci) const {
8012aa3ccede 4926272: methodOopDesc::method_from_bcp is unsafe
never
parents: 1972
diff changeset
209 return Bytecodes::java_code_at(this, bcp_from(bci));
8012aa3ccede 4926272: methodOopDesc::method_from_bcp is unsafe
never
parents: 1972
diff changeset
210 }
8012aa3ccede 4926272: methodOopDesc::method_from_bcp is unsafe
never
parents: 1972
diff changeset
211 Bytecodes::Code code_at(int bci) const {
8012aa3ccede 4926272: methodOopDesc::method_from_bcp is unsafe
never
parents: 1972
diff changeset
212 return Bytecodes::code_at(this, bcp_from(bci));
8012aa3ccede 4926272: methodOopDesc::method_from_bcp is unsafe
never
parents: 1972
diff changeset
213 }
8012aa3ccede 4926272: methodOopDesc::method_from_bcp is unsafe
never
parents: 1972
diff changeset
214
0
a61af66fc99e Initial load
duke
parents:
diff changeset
215 // JVMTI breakpoints
2142
8012aa3ccede 4926272: methodOopDesc::method_from_bcp is unsafe
never
parents: 1972
diff changeset
216 Bytecodes::Code orig_bytecode_at(int bci) const;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
217 void set_orig_bytecode_at(int bci, Bytecodes::Code code);
a61af66fc99e Initial load
duke
parents:
diff changeset
218 void set_breakpoint(int bci);
a61af66fc99e Initial load
duke
parents:
diff changeset
219 void clear_breakpoint(int bci);
a61af66fc99e Initial load
duke
parents:
diff changeset
220 void clear_all_breakpoints();
a61af66fc99e Initial load
duke
parents:
diff changeset
221 // Tracking number of breakpoints, for fullspeed debugging.
a61af66fc99e Initial load
duke
parents:
diff changeset
222 // Only mutated by VM thread.
a61af66fc99e Initial load
duke
parents:
diff changeset
223 u2 number_of_breakpoints() const { return _number_of_breakpoints; }
a61af66fc99e Initial load
duke
parents:
diff changeset
224 void incr_number_of_breakpoints() { ++_number_of_breakpoints; }
a61af66fc99e Initial load
duke
parents:
diff changeset
225 void decr_number_of_breakpoints() { --_number_of_breakpoints; }
a61af66fc99e Initial load
duke
parents:
diff changeset
226 // Initialization only
a61af66fc99e Initial load
duke
parents:
diff changeset
227 void clear_number_of_breakpoints() { _number_of_breakpoints = 0; }
a61af66fc99e Initial load
duke
parents:
diff changeset
228
a61af66fc99e Initial load
duke
parents:
diff changeset
229 // index into instanceKlass methods() array
a61af66fc99e Initial load
duke
parents:
diff changeset
230 u2 method_idnum() const { return constMethod()->method_idnum(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
231 void set_method_idnum(u2 idnum) { constMethod()->set_method_idnum(idnum); }
a61af66fc99e Initial load
duke
parents:
diff changeset
232
a61af66fc99e Initial load
duke
parents:
diff changeset
233 // code size
a61af66fc99e Initial load
duke
parents:
diff changeset
234 int code_size() const { return constMethod()->code_size(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
235
a61af66fc99e Initial load
duke
parents:
diff changeset
236 // method size
a61af66fc99e Initial load
duke
parents:
diff changeset
237 int method_size() const { return _method_size; }
a61af66fc99e Initial load
duke
parents:
diff changeset
238 void set_method_size(int size) {
a61af66fc99e Initial load
duke
parents:
diff changeset
239 assert(0 <= size && size < (1 << 16), "invalid method size");
a61af66fc99e Initial load
duke
parents:
diff changeset
240 _method_size = size;
a61af66fc99e Initial load
duke
parents:
diff changeset
241 }
a61af66fc99e Initial load
duke
parents:
diff changeset
242
a61af66fc99e Initial load
duke
parents:
diff changeset
243 // constant pool for klassOop holding this method
a61af66fc99e Initial load
duke
parents:
diff changeset
244 constantPoolOop constants() const { return _constants; }
a61af66fc99e Initial load
duke
parents:
diff changeset
245 void set_constants(constantPoolOop c) { oop_store_without_check((oop*)&_constants, c); }
a61af66fc99e Initial load
duke
parents:
diff changeset
246
a61af66fc99e Initial load
duke
parents:
diff changeset
247 // max stack
a61af66fc99e Initial load
duke
parents:
diff changeset
248 int max_stack() const { return _max_stack; }
a61af66fc99e Initial load
duke
parents:
diff changeset
249 void set_max_stack(int size) { _max_stack = size; }
a61af66fc99e Initial load
duke
parents:
diff changeset
250
a61af66fc99e Initial load
duke
parents:
diff changeset
251 // max locals
a61af66fc99e Initial load
duke
parents:
diff changeset
252 int max_locals() const { return _max_locals; }
a61af66fc99e Initial load
duke
parents:
diff changeset
253 void set_max_locals(int size) { _max_locals = size; }
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1552
diff changeset
254
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1552
diff changeset
255 int highest_comp_level() const;
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1552
diff changeset
256 void set_highest_comp_level(int level);
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1552
diff changeset
257 int highest_osr_comp_level() const;
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1552
diff changeset
258 void set_highest_osr_comp_level(int level);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
259
a61af66fc99e Initial load
duke
parents:
diff changeset
260 // Count of times method was exited via exception while interpreting
a61af66fc99e Initial load
duke
parents:
diff changeset
261 void interpreter_throwout_increment() {
a61af66fc99e Initial load
duke
parents:
diff changeset
262 if (_interpreter_throwout_count < 65534) {
a61af66fc99e Initial load
duke
parents:
diff changeset
263 _interpreter_throwout_count++;
a61af66fc99e Initial load
duke
parents:
diff changeset
264 }
a61af66fc99e Initial load
duke
parents:
diff changeset
265 }
a61af66fc99e Initial load
duke
parents:
diff changeset
266
a61af66fc99e Initial load
duke
parents:
diff changeset
267 int interpreter_throwout_count() const { return _interpreter_throwout_count; }
a61af66fc99e Initial load
duke
parents:
diff changeset
268 void set_interpreter_throwout_count(int count) { _interpreter_throwout_count = count; }
a61af66fc99e Initial load
duke
parents:
diff changeset
269
a61af66fc99e Initial load
duke
parents:
diff changeset
270 // size of parameters
a61af66fc99e Initial load
duke
parents:
diff changeset
271 int size_of_parameters() const { return _size_of_parameters; }
a61af66fc99e Initial load
duke
parents:
diff changeset
272
a61af66fc99e Initial load
duke
parents:
diff changeset
273 bool has_stackmap_table() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
274 return constMethod()->has_stackmap_table();
a61af66fc99e Initial load
duke
parents:
diff changeset
275 }
a61af66fc99e Initial load
duke
parents:
diff changeset
276
a61af66fc99e Initial load
duke
parents:
diff changeset
277 typeArrayOop stackmap_data() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
278 return constMethod()->stackmap_data();
a61af66fc99e Initial load
duke
parents:
diff changeset
279 }
a61af66fc99e Initial load
duke
parents:
diff changeset
280
1877
a4c7fe54bf3f 6991315: RedefineClasses fails with java.lang.VerifyError
kamg
parents: 1793
diff changeset
281 void set_stackmap_data(typeArrayOop sd) {
a4c7fe54bf3f 6991315: RedefineClasses fails with java.lang.VerifyError
kamg
parents: 1793
diff changeset
282 constMethod()->set_stackmap_data(sd);
a4c7fe54bf3f 6991315: RedefineClasses fails with java.lang.VerifyError
kamg
parents: 1793
diff changeset
283 }
a4c7fe54bf3f 6991315: RedefineClasses fails with java.lang.VerifyError
kamg
parents: 1793
diff changeset
284
0
a61af66fc99e Initial load
duke
parents:
diff changeset
285 // exception handler table
a61af66fc99e Initial load
duke
parents:
diff changeset
286 typeArrayOop exception_table() const
a61af66fc99e Initial load
duke
parents:
diff changeset
287 { return constMethod()->exception_table(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
288 void set_exception_table(typeArrayOop e)
a61af66fc99e Initial load
duke
parents:
diff changeset
289 { constMethod()->set_exception_table(e); }
a61af66fc99e Initial load
duke
parents:
diff changeset
290 bool has_exception_handler() const
a61af66fc99e Initial load
duke
parents:
diff changeset
291 { return constMethod()->has_exception_handler(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
292
a61af66fc99e Initial load
duke
parents:
diff changeset
293 // Finds the first entry point bci of an exception handler for an
a61af66fc99e Initial load
duke
parents:
diff changeset
294 // exception of klass ex_klass thrown at throw_bci. A value of NULL
a61af66fc99e Initial load
duke
parents:
diff changeset
295 // for ex_klass indicates that the exception klass is not known; in
a61af66fc99e Initial load
duke
parents:
diff changeset
296 // this case it matches any constraint class. Returns -1 if the
a61af66fc99e Initial load
duke
parents:
diff changeset
297 // exception cannot be handled in this method. The handler
a61af66fc99e Initial load
duke
parents:
diff changeset
298 // constraint classes are loaded if necessary. Note that this may
a61af66fc99e Initial load
duke
parents:
diff changeset
299 // throw an exception if loading of the constraint classes causes
a61af66fc99e Initial load
duke
parents:
diff changeset
300 // an IllegalAccessError (bugid 4307310) or an OutOfMemoryError.
a61af66fc99e Initial load
duke
parents:
diff changeset
301 // If an exception is thrown, returns the bci of the
a61af66fc99e Initial load
duke
parents:
diff changeset
302 // exception handler which caused the exception to be thrown, which
a61af66fc99e Initial load
duke
parents:
diff changeset
303 // is needed for proper retries. See, for example,
a61af66fc99e Initial load
duke
parents:
diff changeset
304 // InterpreterRuntime::exception_handler_for_exception.
a61af66fc99e Initial load
duke
parents:
diff changeset
305 int fast_exception_handler_bci_for(KlassHandle ex_klass, int throw_bci, TRAPS);
a61af66fc99e Initial load
duke
parents:
diff changeset
306
a61af66fc99e Initial load
duke
parents:
diff changeset
307 // method data access
a61af66fc99e Initial load
duke
parents:
diff changeset
308 methodDataOop method_data() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
309 return _method_data;
a61af66fc99e Initial load
duke
parents:
diff changeset
310 }
a61af66fc99e Initial load
duke
parents:
diff changeset
311 void set_method_data(methodDataOop data) {
a61af66fc99e Initial load
duke
parents:
diff changeset
312 oop_store_without_check((oop*)&_method_data, (oop)data);
a61af66fc99e Initial load
duke
parents:
diff changeset
313 }
a61af66fc99e Initial load
duke
parents:
diff changeset
314
a61af66fc99e Initial load
duke
parents:
diff changeset
315 // invocation counter
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1552
diff changeset
316 InvocationCounter* invocation_counter() { return &_invocation_counter; }
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1552
diff changeset
317 InvocationCounter* backedge_counter() { return &_backedge_counter; }
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1552
diff changeset
318
2348
5d8f5a6dced7 7020403: Add AdvancedCompilationPolicy for tiered
iveresov
parents: 2243
diff changeset
319 #ifdef TIERED
5d8f5a6dced7 7020403: Add AdvancedCompilationPolicy for tiered
iveresov
parents: 2243
diff changeset
320 // 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
321 // We can do that since interpreter_invocation_count is not used in tiered.
5d8f5a6dced7 7020403: Add AdvancedCompilationPolicy for tiered
iveresov
parents: 2243
diff changeset
322 int prev_event_count() const { return _interpreter_invocation_count; }
5d8f5a6dced7 7020403: Add AdvancedCompilationPolicy for tiered
iveresov
parents: 2243
diff changeset
323 void set_prev_event_count(int count) { _interpreter_invocation_count = count; }
5d8f5a6dced7 7020403: Add AdvancedCompilationPolicy for tiered
iveresov
parents: 2243
diff changeset
324 jlong prev_time() const { return _prev_time; }
5d8f5a6dced7 7020403: Add AdvancedCompilationPolicy for tiered
iveresov
parents: 2243
diff changeset
325 void set_prev_time(jlong time) { _prev_time = time; }
5d8f5a6dced7 7020403: Add AdvancedCompilationPolicy for tiered
iveresov
parents: 2243
diff changeset
326 float rate() const { return _rate; }
5d8f5a6dced7 7020403: Add AdvancedCompilationPolicy for tiered
iveresov
parents: 2243
diff changeset
327 void set_rate(float rate) { _rate = rate; }
5d8f5a6dced7 7020403: Add AdvancedCompilationPolicy for tiered
iveresov
parents: 2243
diff changeset
328 #endif
5d8f5a6dced7 7020403: Add AdvancedCompilationPolicy for tiered
iveresov
parents: 2243
diff changeset
329
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1552
diff changeset
330 int invocation_count();
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1552
diff changeset
331 int backedge_count();
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1552
diff changeset
332
3011
f00918f35c7f inlining and runtime interface related changes:
Lukas Stadler <lukas.stadler@jku.at>
parents: 2416
diff changeset
333 // graal mirror
f00918f35c7f inlining and runtime interface related changes:
Lukas Stadler <lukas.stadler@jku.at>
parents: 2416
diff changeset
334 oop graal_mirror() const { return _graal_mirror; }
f00918f35c7f inlining and runtime interface related changes:
Lukas Stadler <lukas.stadler@jku.at>
parents: 2416
diff changeset
335 void set_graal_mirror(oop m) { oop_store((oop*) &_graal_mirror, m); }
f00918f35c7f inlining and runtime interface related changes:
Lukas Stadler <lukas.stadler@jku.at>
parents: 2416
diff changeset
336
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1552
diff changeset
337 bool was_executed_more_than(int n);
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1552
diff changeset
338 bool was_never_executed() { return !was_executed_more_than(0); }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
339
a61af66fc99e Initial load
duke
parents:
diff changeset
340 static void build_interpreter_method_data(methodHandle method, TRAPS);
a61af66fc99e Initial load
duke
parents:
diff changeset
341
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1552
diff changeset
342 int interpreter_invocation_count() {
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1552
diff changeset
343 if (TieredCompilation) return invocation_count();
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1552
diff changeset
344 else return _interpreter_invocation_count;
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1552
diff changeset
345 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
346 void set_interpreter_invocation_count(int count) { _interpreter_invocation_count = count; }
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1552
diff changeset
347 int increment_interpreter_invocation_count() {
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1552
diff changeset
348 if (TieredCompilation) ShouldNotReachHere();
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1552
diff changeset
349 return ++_interpreter_invocation_count;
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1552
diff changeset
350 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
351
a61af66fc99e Initial load
duke
parents:
diff changeset
352 #ifndef PRODUCT
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1552
diff changeset
353 int compiled_invocation_count() const { return _compiled_invocation_count; }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
354 void set_compiled_invocation_count(int count) { _compiled_invocation_count = count; }
a61af66fc99e Initial load
duke
parents:
diff changeset
355 #endif // not PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
356
605
98cb887364d3 6810672: Comment typos
twisti
parents: 518
diff changeset
357 // Clear (non-shared space) pointers which could not be relevant
0
a61af66fc99e Initial load
duke
parents:
diff changeset
358 // if this (shared) method were mapped into another JVM.
a61af66fc99e Initial load
duke
parents:
diff changeset
359 void remove_unshareable_info();
a61af66fc99e Initial load
duke
parents:
diff changeset
360
a61af66fc99e Initial load
duke
parents:
diff changeset
361 // nmethod/verified compiler entry
a61af66fc99e Initial load
duke
parents:
diff changeset
362 address verified_code_entry();
a61af66fc99e Initial load
duke
parents:
diff changeset
363 bool check_code() const; // Not inline to avoid circular ref
a61af66fc99e Initial load
duke
parents:
diff changeset
364 nmethod* volatile code() const { assert( check_code(), "" ); return (nmethod *)OrderAccess::load_ptr_acquire(&_code); }
a61af66fc99e Initial load
duke
parents:
diff changeset
365 void clear_code(); // Clear out any compiled code
1202
5f24d0319e54 4360113: Evict nmethods when code cache gets full
kvn
parents: 1152
diff changeset
366 static void set_code(methodHandle mh, nmethod* code);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
367 void set_adapter_entry(AdapterHandlerEntry* adapter) { _adapter = adapter; }
a61af66fc99e Initial load
duke
parents:
diff changeset
368 address get_i2c_entry();
a61af66fc99e Initial load
duke
parents:
diff changeset
369 address get_c2i_entry();
a61af66fc99e Initial load
duke
parents:
diff changeset
370 address get_c2i_unverified_entry();
a61af66fc99e Initial load
duke
parents:
diff changeset
371 AdapterHandlerEntry* adapter() { return _adapter; }
a61af66fc99e Initial load
duke
parents:
diff changeset
372 // setup entry points
a61af66fc99e Initial load
duke
parents:
diff changeset
373 void link_method(methodHandle method, TRAPS);
a61af66fc99e Initial load
duke
parents:
diff changeset
374 // clear entry points. Used by sharing code
a61af66fc99e Initial load
duke
parents:
diff changeset
375 void unlink_method();
a61af66fc99e Initial load
duke
parents:
diff changeset
376
a61af66fc99e Initial load
duke
parents:
diff changeset
377 // vtable index
a61af66fc99e Initial load
duke
parents:
diff changeset
378 enum VtableIndexFlag {
a61af66fc99e Initial load
duke
parents:
diff changeset
379 // Valid vtable indexes are non-negative (>= 0).
a61af66fc99e Initial load
duke
parents:
diff changeset
380 // These few negative values are used as sentinels.
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 628
diff changeset
381 highest_unused_vtable_index_value = -5,
0
a61af66fc99e Initial load
duke
parents:
diff changeset
382 invalid_vtable_index = -4, // distinct from any valid vtable index
a61af66fc99e Initial load
duke
parents:
diff changeset
383 garbage_vtable_index = -3, // not yet linked; no vtable layout yet
a61af66fc99e Initial load
duke
parents:
diff changeset
384 nonvirtual_vtable_index = -2 // there is no need for vtable dispatch
a61af66fc99e Initial load
duke
parents:
diff changeset
385 // 6330203 Note: Do not use -1, which was overloaded with many meanings.
a61af66fc99e Initial load
duke
parents:
diff changeset
386 };
a61af66fc99e Initial load
duke
parents:
diff changeset
387 DEBUG_ONLY(bool valid_vtable_index() const { return _vtable_index >= nonvirtual_vtable_index; })
a61af66fc99e Initial load
duke
parents:
diff changeset
388 int vtable_index() const { assert(valid_vtable_index(), "");
a61af66fc99e Initial load
duke
parents:
diff changeset
389 return _vtable_index; }
a61af66fc99e Initial load
duke
parents:
diff changeset
390 void set_vtable_index(int index) { _vtable_index = index; }
a61af66fc99e Initial load
duke
parents:
diff changeset
391
a61af66fc99e Initial load
duke
parents:
diff changeset
392 // interpreter entry
a61af66fc99e Initial load
duke
parents:
diff changeset
393 address interpreter_entry() const { return _i2i_entry; }
a61af66fc99e Initial load
duke
parents:
diff changeset
394 // Only used when first initialize so we can set _i2i_entry and _from_interpreted_entry
a61af66fc99e Initial load
duke
parents:
diff changeset
395 void set_interpreter_entry(address entry) { _i2i_entry = entry; _from_interpreted_entry = entry; }
a61af66fc99e Initial load
duke
parents:
diff changeset
396 int interpreter_kind(void) {
a61af66fc99e Initial load
duke
parents:
diff changeset
397 return constMethod()->interpreter_kind();
a61af66fc99e Initial load
duke
parents:
diff changeset
398 }
a61af66fc99e Initial load
duke
parents:
diff changeset
399 void set_interpreter_kind();
a61af66fc99e Initial load
duke
parents:
diff changeset
400 void set_interpreter_kind(int kind) {
a61af66fc99e Initial load
duke
parents:
diff changeset
401 constMethod()->set_interpreter_kind(kind);
a61af66fc99e Initial load
duke
parents:
diff changeset
402 }
a61af66fc99e Initial load
duke
parents:
diff changeset
403
a61af66fc99e Initial load
duke
parents:
diff changeset
404 // native function (used for native methods only)
a61af66fc99e Initial load
duke
parents:
diff changeset
405 enum {
a61af66fc99e Initial load
duke
parents:
diff changeset
406 native_bind_event_is_interesting = true
a61af66fc99e Initial load
duke
parents:
diff changeset
407 };
a61af66fc99e Initial load
duke
parents:
diff changeset
408 address native_function() const { return *(native_function_addr()); }
a61af66fc99e Initial load
duke
parents:
diff changeset
409 // Must specify a real function (not NULL).
a61af66fc99e Initial load
duke
parents:
diff changeset
410 // Use clear_native_function() to unregister.
a61af66fc99e Initial load
duke
parents:
diff changeset
411 void set_native_function(address function, bool post_event_flag);
a61af66fc99e Initial load
duke
parents:
diff changeset
412 bool has_native_function() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
413 void clear_native_function();
a61af66fc99e Initial load
duke
parents:
diff changeset
414
a61af66fc99e Initial load
duke
parents:
diff changeset
415 // signature handler (used for native methods only)
a61af66fc99e Initial load
duke
parents:
diff changeset
416 address signature_handler() const { return *(signature_handler_addr()); }
a61af66fc99e Initial load
duke
parents:
diff changeset
417 void set_signature_handler(address handler);
a61af66fc99e Initial load
duke
parents:
diff changeset
418
a61af66fc99e Initial load
duke
parents:
diff changeset
419 // Interpreter oopmap support
a61af66fc99e Initial load
duke
parents:
diff changeset
420 void mask_for(int bci, InterpreterOopMap* mask);
a61af66fc99e Initial load
duke
parents:
diff changeset
421
a61af66fc99e Initial load
duke
parents:
diff changeset
422 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
423 // operations on invocation counter
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1552
diff changeset
424 void print_invocation_count();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
425 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
426
a61af66fc99e Initial load
duke
parents:
diff changeset
427 // byte codes
1138
dd57230ba8fe 6893268: additional dynamic language related optimizations in C2
twisti
parents: 977
diff changeset
428 void set_code(address code) { return constMethod()->set_code(code); }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
429 address code_base() const { return constMethod()->code_base(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
430 bool contains(address bcp) const { return constMethod()->contains(bcp); }
a61af66fc99e Initial load
duke
parents:
diff changeset
431
a61af66fc99e Initial load
duke
parents:
diff changeset
432 // prints byte codes
a61af66fc99e Initial load
duke
parents:
diff changeset
433 void print_codes() const { print_codes_on(tty); }
a61af66fc99e Initial load
duke
parents:
diff changeset
434 void print_codes_on(outputStream* st) const PRODUCT_RETURN;
a61af66fc99e Initial load
duke
parents:
diff changeset
435 void print_codes_on(int from, int to, outputStream* st) const PRODUCT_RETURN;
a61af66fc99e Initial load
duke
parents:
diff changeset
436
a61af66fc99e Initial load
duke
parents:
diff changeset
437 // checked exceptions
a61af66fc99e Initial load
duke
parents:
diff changeset
438 int checked_exceptions_length() const
a61af66fc99e Initial load
duke
parents:
diff changeset
439 { return constMethod()->checked_exceptions_length(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
440 CheckedExceptionElement* checked_exceptions_start() const
a61af66fc99e Initial load
duke
parents:
diff changeset
441 { return constMethod()->checked_exceptions_start(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
442
a61af66fc99e Initial load
duke
parents:
diff changeset
443 // localvariable table
a61af66fc99e Initial load
duke
parents:
diff changeset
444 bool has_localvariable_table() const
a61af66fc99e Initial load
duke
parents:
diff changeset
445 { return constMethod()->has_localvariable_table(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
446 int localvariable_table_length() const
a61af66fc99e Initial load
duke
parents:
diff changeset
447 { return constMethod()->localvariable_table_length(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
448 LocalVariableTableElement* localvariable_table_start() const
a61af66fc99e Initial load
duke
parents:
diff changeset
449 { return constMethod()->localvariable_table_start(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
450
a61af66fc99e Initial load
duke
parents:
diff changeset
451 bool has_linenumber_table() const
a61af66fc99e Initial load
duke
parents:
diff changeset
452 { return constMethod()->has_linenumber_table(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
453 u_char* compressed_linenumber_table() const
a61af66fc99e Initial load
duke
parents:
diff changeset
454 { return constMethod()->compressed_linenumber_table(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
455
a61af66fc99e Initial load
duke
parents:
diff changeset
456 // method holder (the klassOop holding this method)
a61af66fc99e Initial load
duke
parents:
diff changeset
457 klassOop method_holder() const { return _constants->pool_holder(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
458
a61af66fc99e Initial load
duke
parents:
diff changeset
459 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
460 Symbol* klass_name() const; // returns the name of the method holder
0
a61af66fc99e Initial load
duke
parents:
diff changeset
461 BasicType result_type() const; // type of the method result
a61af66fc99e Initial load
duke
parents:
diff changeset
462 int result_type_index() const; // type index of the method result
a61af66fc99e Initial load
duke
parents:
diff changeset
463 bool is_returning_oop() const { BasicType r = result_type(); return (r == T_OBJECT || r == T_ARRAY); }
a61af66fc99e Initial load
duke
parents:
diff changeset
464 bool is_returning_fp() const { BasicType r = result_type(); return (r == T_FLOAT || r == T_DOUBLE); }
a61af66fc99e Initial load
duke
parents:
diff changeset
465
a61af66fc99e Initial load
duke
parents:
diff changeset
466 // Checked exceptions thrown by this method (resolved to mirrors)
a61af66fc99e Initial load
duke
parents:
diff changeset
467 objArrayHandle resolved_checked_exceptions(TRAPS) { return resolved_checked_exceptions_impl(this, THREAD); }
a61af66fc99e Initial load
duke
parents:
diff changeset
468
a61af66fc99e Initial load
duke
parents:
diff changeset
469 // Access flags
a61af66fc99e Initial load
duke
parents:
diff changeset
470 bool is_public() const { return access_flags().is_public(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
471 bool is_private() const { return access_flags().is_private(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
472 bool is_protected() const { return access_flags().is_protected(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
473 bool is_package_private() const { return !is_public() && !is_private() && !is_protected(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
474 bool is_static() const { return access_flags().is_static(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
475 bool is_final() const { return access_flags().is_final(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
476 bool is_synchronized() const { return access_flags().is_synchronized();}
a61af66fc99e Initial load
duke
parents:
diff changeset
477 bool is_native() const { return access_flags().is_native(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
478 bool is_abstract() const { return access_flags().is_abstract(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
479 bool is_strict() const { return access_flags().is_strict(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
480 bool is_synthetic() const { return access_flags().is_synthetic(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
481
a61af66fc99e Initial load
duke
parents:
diff changeset
482 // returns true if contains only return operation
a61af66fc99e Initial load
duke
parents:
diff changeset
483 bool is_empty_method() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
484
a61af66fc99e Initial load
duke
parents:
diff changeset
485 // returns true if this is a vanilla constructor
a61af66fc99e Initial load
duke
parents:
diff changeset
486 bool is_vanilla_constructor() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
487
a61af66fc99e Initial load
duke
parents:
diff changeset
488 // checks method and its method holder
a61af66fc99e Initial load
duke
parents:
diff changeset
489 bool is_final_method() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
490 bool is_strict_method() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
491
a61af66fc99e Initial load
duke
parents:
diff changeset
492 // true if method needs no dynamic dispatch (final and/or no vtable entry)
a61af66fc99e Initial load
duke
parents:
diff changeset
493 bool can_be_statically_bound() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
494
a61af66fc99e Initial load
duke
parents:
diff changeset
495 // returns true if the method has any backward branches.
a61af66fc99e Initial load
duke
parents:
diff changeset
496 bool has_loops() {
a61af66fc99e Initial load
duke
parents:
diff changeset
497 return access_flags().loops_flag_init() ? access_flags().has_loops() : compute_has_loops_flag();
a61af66fc99e Initial load
duke
parents:
diff changeset
498 };
a61af66fc99e Initial load
duke
parents:
diff changeset
499
a61af66fc99e Initial load
duke
parents:
diff changeset
500 bool compute_has_loops_flag();
a61af66fc99e Initial load
duke
parents:
diff changeset
501
a61af66fc99e Initial load
duke
parents:
diff changeset
502 bool has_jsrs() {
a61af66fc99e Initial load
duke
parents:
diff changeset
503 return access_flags().has_jsrs();
a61af66fc99e Initial load
duke
parents:
diff changeset
504 };
a61af66fc99e Initial load
duke
parents:
diff changeset
505 void set_has_jsrs() {
a61af66fc99e Initial load
duke
parents:
diff changeset
506 _access_flags.set_has_jsrs();
a61af66fc99e Initial load
duke
parents:
diff changeset
507 }
a61af66fc99e Initial load
duke
parents:
diff changeset
508
a61af66fc99e Initial load
duke
parents:
diff changeset
509 // returns true if the method has any monitors.
a61af66fc99e Initial load
duke
parents:
diff changeset
510 bool has_monitors() const { return is_synchronized() || access_flags().has_monitor_bytecodes(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
511 bool has_monitor_bytecodes() const { return access_flags().has_monitor_bytecodes(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
512
a61af66fc99e Initial load
duke
parents:
diff changeset
513 void set_has_monitor_bytecodes() { _access_flags.set_has_monitor_bytecodes(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
514
a61af66fc99e Initial load
duke
parents:
diff changeset
515 // monitor matching. This returns a conservative estimate of whether the monitorenter/monitorexit bytecodes
a61af66fc99e Initial load
duke
parents:
diff changeset
516 // 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
517 // has not been computed yet.
a61af66fc99e Initial load
duke
parents:
diff changeset
518 bool guaranteed_monitor_matching() const { return access_flags().is_monitor_matching(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
519 void set_guaranteed_monitor_matching() { _access_flags.set_monitor_matching(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
520
a61af66fc99e Initial load
duke
parents:
diff changeset
521 // returns true if the method is an accessor function (setter/getter).
a61af66fc99e Initial load
duke
parents:
diff changeset
522 bool is_accessor() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
523
a61af66fc99e Initial load
duke
parents:
diff changeset
524 // returns true if the method is an initializer (<init> or <clinit>).
a61af66fc99e Initial load
duke
parents:
diff changeset
525 bool is_initializer() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
526
2334
dbad0519a1c4 6845426: non-static <clinit> method with no args is called during the class initialization process
kamg
parents: 2243
diff changeset
527 // 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
528 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
529
dbad0519a1c4 6845426: non-static <clinit> method with no args is called during the class initialization process
kamg
parents: 2243
diff changeset
530 // 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
531 // 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
532 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
533
0
a61af66fc99e Initial load
duke
parents:
diff changeset
534 // compiled code support
a61af66fc99e Initial load
duke
parents:
diff changeset
535 // NOTE: code() is inherently racy as deopt can be clearing code
a61af66fc99e Initial load
duke
parents:
diff changeset
536 // simultaneously. Use with caution.
a61af66fc99e Initial load
duke
parents:
diff changeset
537 bool has_compiled_code() const { return code() != NULL; }
a61af66fc99e Initial load
duke
parents:
diff changeset
538
a61af66fc99e Initial load
duke
parents:
diff changeset
539 // sizing
a61af66fc99e Initial load
duke
parents:
diff changeset
540 static int object_size(bool is_native);
a61af66fc99e Initial load
duke
parents:
diff changeset
541 static int header_size() { return sizeof(methodOopDesc)/HeapWordSize; }
a61af66fc99e Initial load
duke
parents:
diff changeset
542 int object_size() const { return method_size(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
543
a61af66fc99e Initial load
duke
parents:
diff changeset
544 bool object_is_parsable() const { return method_size() > 0; }
a61af66fc99e Initial load
duke
parents:
diff changeset
545
a61af66fc99e Initial load
duke
parents:
diff changeset
546 // interpreter support
a61af66fc99e Initial load
duke
parents:
diff changeset
547 static ByteSize const_offset() { return byte_offset_of(methodOopDesc, _constMethod ); }
a61af66fc99e Initial load
duke
parents:
diff changeset
548 static ByteSize constants_offset() { return byte_offset_of(methodOopDesc, _constants ); }
a61af66fc99e Initial load
duke
parents:
diff changeset
549 static ByteSize access_flags_offset() { return byte_offset_of(methodOopDesc, _access_flags ); }
a61af66fc99e Initial load
duke
parents:
diff changeset
550 #ifdef CC_INTERP
a61af66fc99e Initial load
duke
parents:
diff changeset
551 static ByteSize result_index_offset() { return byte_offset_of(methodOopDesc, _result_index ); }
a61af66fc99e Initial load
duke
parents:
diff changeset
552 #endif /* CC_INTERP */
a61af66fc99e Initial load
duke
parents:
diff changeset
553 static ByteSize size_of_locals_offset() { return byte_offset_of(methodOopDesc, _max_locals ); }
a61af66fc99e Initial load
duke
parents:
diff changeset
554 static ByteSize size_of_parameters_offset() { return byte_offset_of(methodOopDesc, _size_of_parameters); }
a61af66fc99e Initial load
duke
parents:
diff changeset
555 static ByteSize from_compiled_offset() { return byte_offset_of(methodOopDesc, _from_compiled_entry); }
a61af66fc99e Initial load
duke
parents:
diff changeset
556 static ByteSize code_offset() { return byte_offset_of(methodOopDesc, _code); }
a61af66fc99e Initial load
duke
parents:
diff changeset
557 static ByteSize invocation_counter_offset() { return byte_offset_of(methodOopDesc, _invocation_counter); }
a61af66fc99e Initial load
duke
parents:
diff changeset
558 static ByteSize backedge_counter_offset() { return byte_offset_of(methodOopDesc, _backedge_counter); }
a61af66fc99e Initial load
duke
parents:
diff changeset
559 static ByteSize method_data_offset() {
a61af66fc99e Initial load
duke
parents:
diff changeset
560 return byte_offset_of(methodOopDesc, _method_data);
a61af66fc99e Initial load
duke
parents:
diff changeset
561 }
a61af66fc99e Initial load
duke
parents:
diff changeset
562 static ByteSize interpreter_invocation_counter_offset() { return byte_offset_of(methodOopDesc, _interpreter_invocation_count); }
a61af66fc99e Initial load
duke
parents:
diff changeset
563 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
564 static ByteSize compiled_invocation_counter_offset() { return byte_offset_of(methodOopDesc, _compiled_invocation_count); }
a61af66fc99e Initial load
duke
parents:
diff changeset
565 #endif // not PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
566 static ByteSize native_function_offset() { return in_ByteSize(sizeof(methodOopDesc)); }
a61af66fc99e Initial load
duke
parents:
diff changeset
567 static ByteSize from_interpreted_offset() { return byte_offset_of(methodOopDesc, _from_interpreted_entry ); }
a61af66fc99e Initial load
duke
parents:
diff changeset
568 static ByteSize interpreter_entry_offset() { return byte_offset_of(methodOopDesc, _i2i_entry ); }
a61af66fc99e Initial load
duke
parents:
diff changeset
569 static ByteSize signature_handler_offset() { return in_ByteSize(sizeof(methodOopDesc) + wordSize); }
a61af66fc99e Initial load
duke
parents:
diff changeset
570 static ByteSize max_stack_offset() { return byte_offset_of(methodOopDesc, _max_stack ); }
a61af66fc99e Initial load
duke
parents:
diff changeset
571
a61af66fc99e Initial load
duke
parents:
diff changeset
572 // for code generation
a61af66fc99e Initial load
duke
parents:
diff changeset
573 static int method_data_offset_in_bytes() { return offset_of(methodOopDesc, _method_data); }
a61af66fc99e Initial load
duke
parents:
diff changeset
574 static int interpreter_invocation_counter_offset_in_bytes()
a61af66fc99e Initial load
duke
parents:
diff changeset
575 { return offset_of(methodOopDesc, _interpreter_invocation_count); }
1793
d257356e35f0 6939224: MethodHandle.invokeGeneric needs to perform the correct set of conversions
jrose
parents: 1783
diff changeset
576 static int intrinsic_id_offset_in_bytes() { return offset_of(methodOopDesc, _intrinsic_id); }
d257356e35f0 6939224: MethodHandle.invokeGeneric needs to perform the correct set of conversions
jrose
parents: 1783
diff changeset
577 static int intrinsic_id_size_in_bytes() { return sizeof(u1); }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
578
a61af66fc99e Initial load
duke
parents:
diff changeset
579 // Static methods that are used to implement member methods where an exposed this pointer
a61af66fc99e Initial load
duke
parents:
diff changeset
580 // is needed due to possible GCs
a61af66fc99e Initial load
duke
parents:
diff changeset
581 static objArrayHandle resolved_checked_exceptions_impl(methodOop this_oop, TRAPS);
a61af66fc99e Initial load
duke
parents:
diff changeset
582
a61af66fc99e Initial load
duke
parents:
diff changeset
583 // Returns the byte code index from the byte code pointer
a61af66fc99e Initial load
duke
parents:
diff changeset
584 int bci_from(address bcp) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
585 address bcp_from(int bci) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
586 int validate_bci_from_bcx(intptr_t bcx) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
587
a61af66fc99e Initial load
duke
parents:
diff changeset
588 // Returns the line number for a bci if debugging information for the method is prowided,
a61af66fc99e Initial load
duke
parents:
diff changeset
589 // -1 is returned otherwise.
a61af66fc99e Initial load
duke
parents:
diff changeset
590 int line_number_from_bci(int bci) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
591
a61af66fc99e Initial load
duke
parents:
diff changeset
592 // Reflection support
a61af66fc99e Initial load
duke
parents:
diff changeset
593 bool is_overridden_in(klassOop k) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
594
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 628
diff changeset
595 // JSR 292 support
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 628
diff changeset
596 bool is_method_handle_invoke() const { return access_flags().is_method_handle_invoke(); }
1507
cd5dbf694d45 6939134: JSR 292 adjustments to method handle invocation
jrose
parents: 1208
diff changeset
597 static bool is_method_handle_invoke_name(vmSymbols::SID name_sid);
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2142
diff changeset
598 static bool is_method_handle_invoke_name(Symbol* name) {
1507
cd5dbf694d45 6939134: JSR 292 adjustments to method handle invocation
jrose
parents: 1208
diff changeset
599 return is_method_handle_invoke_name(vmSymbols::find_sid(name));
cd5dbf694d45 6939134: JSR 292 adjustments to method handle invocation
jrose
parents: 1208
diff changeset
600 }
1152
cd37471eaecc 6914206: change way of permission checking for generated MethodHandle adapters
twisti
parents: 1138
diff changeset
601 // Tests if this method is an internal adapter frame from the
cd37471eaecc 6914206: change way of permission checking for generated MethodHandle adapters
twisti
parents: 1138
diff changeset
602 // MethodHandleCompiler.
cd37471eaecc 6914206: change way of permission checking for generated MethodHandle adapters
twisti
parents: 1138
diff changeset
603 bool is_method_handle_adapter() const;
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 628
diff changeset
604 static methodHandle make_invoke_method(KlassHandle holder,
2177
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2142
diff changeset
605 Symbol* name, //invokeExact or invokeGeneric
3582bf76420e 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 2142
diff changeset
606 Symbol* signature, //anything at all
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 628
diff changeset
607 Handle method_type,
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 628
diff changeset
608 TRAPS);
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 628
diff changeset
609 // these operate only on invoke methods:
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 628
diff changeset
610 oop method_handle_type() const;
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 628
diff changeset
611 static jint* method_type_offsets_chain(); // series of pointer-offsets, terminated by -1
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 628
diff changeset
612 // presize interpreter frames for extra interpreter stack entries, if needed
726
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 710
diff changeset
613 // method handles want to be able to push a few extra values (e.g., a bound receiver), and
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 710
diff changeset
614 // invokedynamic sometimes needs to push a bootstrap method, call site, and arglist,
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 710
diff changeset
615 // all without checking for a stack overflow
2416
38fea01eb669 6817525: turn on method handle functionality by default for JSR 292
twisti
parents: 2355
diff changeset
616 static int extra_stack_entries() { return EnableInvokeDynamic ? (int) MethodHandlePushLimit + 3 : 0; }
710
e5b0439ef4ae 6655638: dynamic languages need method handles
jrose
parents: 628
diff changeset
617 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
618
0
a61af66fc99e Initial load
duke
parents:
diff changeset
619 // RedefineClasses() support:
a61af66fc99e Initial load
duke
parents:
diff changeset
620 bool is_old() const { return access_flags().is_old(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
621 void set_is_old() { _access_flags.set_is_old(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
622 bool is_obsolete() const { return access_flags().is_obsolete(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
623 void set_is_obsolete() { _access_flags.set_is_obsolete(); }
48
d8b3ef7ee3e5 6599425: 4/3 OopMapCache::lookup() can cause later crash or assert() failure
dcubed
parents: 0
diff changeset
624 // see the definition in methodOop.cpp for the gory details
d8b3ef7ee3e5 6599425: 4/3 OopMapCache::lookup() can cause later crash or assert() failure
dcubed
parents: 0
diff changeset
625 bool should_not_be_cached() const;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
626
a61af66fc99e Initial load
duke
parents:
diff changeset
627 // JVMTI Native method prefixing support:
a61af66fc99e Initial load
duke
parents:
diff changeset
628 bool is_prefixed_native() const { return access_flags().is_prefixed_native(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
629 void set_is_prefixed_native() { _access_flags.set_is_prefixed_native(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
630
a61af66fc99e Initial load
duke
parents:
diff changeset
631 // Rewriting support
a61af66fc99e Initial load
duke
parents:
diff changeset
632 static methodHandle clone_with_new_data(methodHandle m, u_char* new_code, int new_code_length,
a61af66fc99e Initial load
duke
parents:
diff changeset
633 u_char* new_compressed_linenumber_table, int new_compressed_linenumber_size, TRAPS);
a61af66fc99e Initial load
duke
parents:
diff changeset
634
a61af66fc99e Initial load
duke
parents:
diff changeset
635 // Get this method's jmethodID -- allocate if it doesn't exist
a61af66fc99e Initial load
duke
parents:
diff changeset
636 jmethodID jmethod_id() { methodHandle this_h(this);
977
74a5db69c1fe 6419370: 4/4 new jmethodID code has tiny holes in synchronization
dcubed
parents: 856
diff changeset
637 return instanceKlass::get_jmethod_id(method_holder(), this_h); }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
638
a61af66fc99e Initial load
duke
parents:
diff changeset
639 // Lookup the jmethodID for this method. Return NULL if not found.
a61af66fc99e Initial load
duke
parents:
diff changeset
640 // NOTE that this function can be called from a signal handler
a61af66fc99e Initial load
duke
parents:
diff changeset
641 // (see AsyncGetCallTrace support for Forte Analyzer) and this
a61af66fc99e Initial load
duke
parents:
diff changeset
642 // needs to be async-safe. No allocation should be done and
a61af66fc99e Initial load
duke
parents:
diff changeset
643 // so handles are not used to avoid deadlock.
a61af66fc99e Initial load
duke
parents:
diff changeset
644 jmethodID find_jmethod_id_or_null() { return instanceKlass::cast(method_holder())->jmethod_id_or_null(this); }
a61af66fc99e Initial load
duke
parents:
diff changeset
645
a61af66fc99e Initial load
duke
parents:
diff changeset
646 // JNI static invoke cached itable index accessors
a61af66fc99e Initial load
duke
parents:
diff changeset
647 int cached_itable_index() { return instanceKlass::cast(method_holder())->cached_itable_index(method_idnum()); }
a61af66fc99e Initial load
duke
parents:
diff changeset
648 void set_cached_itable_index(int index) { instanceKlass::cast(method_holder())->set_cached_itable_index(method_idnum(), index); }
a61af66fc99e Initial load
duke
parents:
diff changeset
649
a61af66fc99e Initial load
duke
parents:
diff changeset
650 // Support for inlining of intrinsic methods
856
75596850f863 6862576: vmIntrinsics needs cleanup in order to support JSR 292 intrinsics
jrose
parents: 726
diff changeset
651 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
652 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
653
75596850f863 6862576: vmIntrinsics needs cleanup in order to support JSR 292 intrinsics
jrose
parents: 726
diff changeset
654 // 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
655 void init_intrinsic_id(); // updates from _none if a match
75596850f863 6862576: vmIntrinsics needs cleanup in order to support JSR 292 intrinsics
jrose
parents: 726
diff changeset
656 static vmSymbols::SID klass_id_for_intrinsics(klassOop holder);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
657
a61af66fc99e Initial load
duke
parents:
diff changeset
658 // On-stack replacement support
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1552
diff changeset
659 bool has_osr_nmethod(int level, bool match_level) {
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1552
diff changeset
660 return instanceKlass::cast(method_holder())->lookup_osr_nmethod(this, InvocationEntryBci, level, match_level) != NULL;
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1552
diff changeset
661 }
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1552
diff changeset
662
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1552
diff changeset
663 nmethod* lookup_osr_nmethod_for(int bci, int level, bool match_level) {
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1552
diff changeset
664 return instanceKlass::cast(method_holder())->lookup_osr_nmethod(this, bci, level, match_level);
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1552
diff changeset
665 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
666
a61af66fc99e Initial load
duke
parents:
diff changeset
667 // Inline cache support
a61af66fc99e Initial load
duke
parents:
diff changeset
668 void cleanup_inline_caches();
a61af66fc99e Initial load
duke
parents:
diff changeset
669
a61af66fc99e Initial load
duke
parents:
diff changeset
670 // Find if klass for method is loaded
a61af66fc99e Initial load
duke
parents:
diff changeset
671 bool is_klass_loaded_by_klass_index(int klass_index) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
672 bool is_klass_loaded(int refinfo_index, bool must_be_resolved = false) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
673
a61af66fc99e Initial load
duke
parents:
diff changeset
674 // Indicates whether compilation failed earlier for this method, or
a61af66fc99e Initial load
duke
parents:
diff changeset
675 // whether it is not compilable for another reason like having a
a61af66fc99e Initial load
duke
parents:
diff changeset
676 // breakpoint set in it.
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1552
diff changeset
677 bool is_not_compilable(int comp_level = CompLevel_any) const;
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1552
diff changeset
678 void set_not_compilable(int comp_level = CompLevel_all, bool report = true);
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1552
diff changeset
679 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
680 set_not_compilable(comp_level, false);
cef333a48af6 6923043: failed nightly tests which use -XX:+PrintCompilation -Xcomp -XX:CompileOnly
kvn
parents: 1202
diff changeset
681 }
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1552
diff changeset
682 bool is_not_osr_compilable(int comp_level = CompLevel_any) const {
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1552
diff changeset
683 return is_not_compilable(comp_level) || access_flags().is_not_osr_compilable();
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1552
diff changeset
684 }
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1552
diff changeset
685 void set_not_osr_compilable() { _access_flags.set_not_osr_compilable(); }
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1552
diff changeset
686 bool is_not_c1_compilable() const { return access_flags().is_not_c1_compilable(); }
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1552
diff changeset
687 void set_not_c1_compilable() { _access_flags.set_not_c1_compilable(); }
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1552
diff changeset
688 bool is_not_c2_compilable() const { return access_flags().is_not_c2_compilable(); }
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1552
diff changeset
689 void set_not_c2_compilable() { _access_flags.set_not_c2_compilable(); }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
690
a61af66fc99e Initial load
duke
parents:
diff changeset
691 // Background compilation support
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1552
diff changeset
692 bool queued_for_compilation() const { return access_flags().queued_for_compilation(); }
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1552
diff changeset
693 void set_queued_for_compilation() { _access_flags.set_queued_for_compilation(); }
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1552
diff changeset
694 void clear_queued_for_compilation() { _access_flags.clear_queued_for_compilation(); }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
695
a61af66fc99e Initial load
duke
parents:
diff changeset
696 // Resolve all classes in signature, return 'true' if successful
a61af66fc99e Initial load
duke
parents:
diff changeset
697 static bool load_signature_classes(methodHandle m, TRAPS);
a61af66fc99e Initial load
duke
parents:
diff changeset
698
a61af66fc99e Initial load
duke
parents:
diff changeset
699 // Return if true if not all classes references in signature, including return type, has been loaded
a61af66fc99e Initial load
duke
parents:
diff changeset
700 static bool has_unloaded_classes_in_signature(methodHandle m, TRAPS);
a61af66fc99e Initial load
duke
parents:
diff changeset
701
a61af66fc99e Initial load
duke
parents:
diff changeset
702 // Printing
a61af66fc99e Initial load
duke
parents:
diff changeset
703 void print_short_name(outputStream* st) /*PRODUCT_RETURN*/; // prints as klassname::methodname; Exposed so field engineers can debug VM
a61af66fc99e Initial load
duke
parents:
diff changeset
704 void print_name(outputStream* st) PRODUCT_RETURN; // prints as "virtual void foo(int)"
a61af66fc99e Initial load
duke
parents:
diff changeset
705
a61af66fc99e Initial load
duke
parents:
diff changeset
706 // Helper routine used for method sorting
a61af66fc99e Initial load
duke
parents:
diff changeset
707 static void sort_methods(objArrayOop methods,
a61af66fc99e Initial load
duke
parents:
diff changeset
708 objArrayOop methods_annotations,
a61af66fc99e Initial load
duke
parents:
diff changeset
709 objArrayOop methods_parameter_annotations,
a61af66fc99e Initial load
duke
parents:
diff changeset
710 objArrayOop methods_default_annotations,
a61af66fc99e Initial load
duke
parents:
diff changeset
711 bool idempotent = false);
a61af66fc99e Initial load
duke
parents:
diff changeset
712
a61af66fc99e Initial load
duke
parents:
diff changeset
713 // size of parameters
a61af66fc99e Initial load
duke
parents:
diff changeset
714 void set_size_of_parameters(int size) { _size_of_parameters = size; }
a61af66fc99e Initial load
duke
parents:
diff changeset
715 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
716
a61af66fc99e Initial load
duke
parents:
diff changeset
717 // Inlined elements
a61af66fc99e Initial load
duke
parents:
diff changeset
718 address* native_function_addr() const { assert(is_native(), "must be native"); return (address*) (this+1); }
a61af66fc99e Initial load
duke
parents:
diff changeset
719 address* signature_handler_addr() const { return native_function_addr() + 1; }
a61af66fc99e Initial load
duke
parents:
diff changeset
720
a61af66fc99e Initial load
duke
parents:
diff changeset
721 // Garbage collection support
a61af66fc99e Initial load
duke
parents:
diff changeset
722 oop* adr_constMethod() const { return (oop*)&_constMethod; }
a61af66fc99e Initial load
duke
parents:
diff changeset
723 oop* adr_constants() const { return (oop*)&_constants; }
3011
f00918f35c7f inlining and runtime interface related changes:
Lukas Stadler <lukas.stadler@jku.at>
parents: 2416
diff changeset
724 oop* adr_graal_mirror() const { return (oop*)&_graal_mirror; }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
725 oop* adr_method_data() const { return (oop*)&_method_data; }
a61af66fc99e Initial load
duke
parents:
diff changeset
726 };
a61af66fc99e Initial load
duke
parents:
diff changeset
727
a61af66fc99e Initial load
duke
parents:
diff changeset
728
a61af66fc99e Initial load
duke
parents:
diff changeset
729 // Utility class for compressing line number tables
a61af66fc99e Initial load
duke
parents:
diff changeset
730
a61af66fc99e Initial load
duke
parents:
diff changeset
731 class CompressedLineNumberWriteStream: public CompressedWriteStream {
a61af66fc99e Initial load
duke
parents:
diff changeset
732 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
733 int _bci;
a61af66fc99e Initial load
duke
parents:
diff changeset
734 int _line;
a61af66fc99e Initial load
duke
parents:
diff changeset
735 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
736 // Constructor
a61af66fc99e Initial load
duke
parents:
diff changeset
737 CompressedLineNumberWriteStream(int initial_size) : CompressedWriteStream(initial_size), _bci(0), _line(0) {}
a61af66fc99e Initial load
duke
parents:
diff changeset
738 CompressedLineNumberWriteStream(u_char* buffer, int initial_size) : CompressedWriteStream(buffer, initial_size), _bci(0), _line(0) {}
a61af66fc99e Initial load
duke
parents:
diff changeset
739
a61af66fc99e Initial load
duke
parents:
diff changeset
740 // Write (bci, line number) pair to stream
a61af66fc99e Initial load
duke
parents:
diff changeset
741 void write_pair_regular(int bci_delta, int line_delta);
a61af66fc99e Initial load
duke
parents:
diff changeset
742
a61af66fc99e Initial load
duke
parents:
diff changeset
743 inline void write_pair_inline(int bci, int line) {
a61af66fc99e Initial load
duke
parents:
diff changeset
744 int bci_delta = bci - _bci;
a61af66fc99e Initial load
duke
parents:
diff changeset
745 int line_delta = line - _line;
a61af66fc99e Initial load
duke
parents:
diff changeset
746 _bci = bci;
a61af66fc99e Initial load
duke
parents:
diff changeset
747 _line = line;
a61af66fc99e Initial load
duke
parents:
diff changeset
748 // Skip (0,0) deltas - they do not add information and conflict with terminator.
a61af66fc99e Initial load
duke
parents:
diff changeset
749 if (bci_delta == 0 && line_delta == 0) return;
a61af66fc99e Initial load
duke
parents:
diff changeset
750 // Check if bci is 5-bit and line number 3-bit unsigned.
a61af66fc99e Initial load
duke
parents:
diff changeset
751 if (((bci_delta & ~0x1F) == 0) && ((line_delta & ~0x7) == 0)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
752 // Compress into single byte.
a61af66fc99e Initial load
duke
parents:
diff changeset
753 jubyte value = ((jubyte) bci_delta << 3) | (jubyte) line_delta;
a61af66fc99e Initial load
duke
parents:
diff changeset
754 // Check that value doesn't match escape character.
a61af66fc99e Initial load
duke
parents:
diff changeset
755 if (value != 0xFF) {
a61af66fc99e Initial load
duke
parents:
diff changeset
756 write_byte(value);
a61af66fc99e Initial load
duke
parents:
diff changeset
757 return;
a61af66fc99e Initial load
duke
parents:
diff changeset
758 }
a61af66fc99e Initial load
duke
parents:
diff changeset
759 }
a61af66fc99e Initial load
duke
parents:
diff changeset
760 write_pair_regular(bci_delta, line_delta);
a61af66fc99e Initial load
duke
parents:
diff changeset
761 }
a61af66fc99e Initial load
duke
parents:
diff changeset
762
a61af66fc99e Initial load
duke
parents:
diff changeset
763 // Windows AMD64 + Apr 2005 PSDK with /O2 generates bad code for write_pair.
a61af66fc99e Initial load
duke
parents:
diff changeset
764 // Disabling optimization doesn't work for methods in header files
a61af66fc99e Initial load
duke
parents:
diff changeset
765 // so we force it to call through the non-optimized version in the .cpp.
a61af66fc99e Initial load
duke
parents:
diff changeset
766 // 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
767 // 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
768 #if defined(_M_AMD64) && _MSC_VER >= 1400
0
a61af66fc99e Initial load
duke
parents:
diff changeset
769 void write_pair(int bci, int line);
a61af66fc99e Initial load
duke
parents:
diff changeset
770 #else
a61af66fc99e Initial load
duke
parents:
diff changeset
771 void write_pair(int bci, int line) { write_pair_inline(bci, line); }
a61af66fc99e Initial load
duke
parents:
diff changeset
772 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
773
a61af66fc99e Initial load
duke
parents:
diff changeset
774 // Write end-of-stream marker
a61af66fc99e Initial load
duke
parents:
diff changeset
775 void write_terminator() { write_byte(0); }
a61af66fc99e Initial load
duke
parents:
diff changeset
776 };
a61af66fc99e Initial load
duke
parents:
diff changeset
777
a61af66fc99e Initial load
duke
parents:
diff changeset
778
a61af66fc99e Initial load
duke
parents:
diff changeset
779 // Utility class for decompressing line number tables
a61af66fc99e Initial load
duke
parents:
diff changeset
780
a61af66fc99e Initial load
duke
parents:
diff changeset
781 class CompressedLineNumberReadStream: public CompressedReadStream {
a61af66fc99e Initial load
duke
parents:
diff changeset
782 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
783 int _bci;
a61af66fc99e Initial load
duke
parents:
diff changeset
784 int _line;
a61af66fc99e Initial load
duke
parents:
diff changeset
785 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
786 // Constructor
a61af66fc99e Initial load
duke
parents:
diff changeset
787 CompressedLineNumberReadStream(u_char* buffer);
a61af66fc99e Initial load
duke
parents:
diff changeset
788 // Read (bci, line number) pair from stream. Returns false at end-of-stream.
a61af66fc99e Initial load
duke
parents:
diff changeset
789 bool read_pair();
a61af66fc99e Initial load
duke
parents:
diff changeset
790 // Accessing bci and line number (after calling read_pair)
a61af66fc99e Initial load
duke
parents:
diff changeset
791 int bci() const { return _bci; }
a61af66fc99e Initial load
duke
parents:
diff changeset
792 int line() const { return _line; }
a61af66fc99e Initial load
duke
parents:
diff changeset
793 };
a61af66fc99e Initial load
duke
parents:
diff changeset
794
a61af66fc99e Initial load
duke
parents:
diff changeset
795
a61af66fc99e Initial load
duke
parents:
diff changeset
796 /// Fast Breakpoints.
a61af66fc99e Initial load
duke
parents:
diff changeset
797
a61af66fc99e Initial load
duke
parents:
diff changeset
798 // If this structure gets more complicated (because bpts get numerous),
a61af66fc99e Initial load
duke
parents:
diff changeset
799 // move it into its own header.
a61af66fc99e Initial load
duke
parents:
diff changeset
800
a61af66fc99e Initial load
duke
parents:
diff changeset
801 // There is presently no provision for concurrent access
a61af66fc99e Initial load
duke
parents:
diff changeset
802 // to breakpoint lists, which is only OK for JVMTI because
a61af66fc99e Initial load
duke
parents:
diff changeset
803 // breakpoints are written only at safepoints, and are read
a61af66fc99e Initial load
duke
parents:
diff changeset
804 // concurrently only outside of safepoints.
a61af66fc99e Initial load
duke
parents:
diff changeset
805
a61af66fc99e Initial load
duke
parents:
diff changeset
806 class BreakpointInfo : public CHeapObj {
a61af66fc99e Initial load
duke
parents:
diff changeset
807 friend class VMStructs;
a61af66fc99e Initial load
duke
parents:
diff changeset
808 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
809 Bytecodes::Code _orig_bytecode;
a61af66fc99e Initial load
duke
parents:
diff changeset
810 int _bci;
a61af66fc99e Initial load
duke
parents:
diff changeset
811 u2 _name_index; // of method
a61af66fc99e Initial load
duke
parents:
diff changeset
812 u2 _signature_index; // of method
a61af66fc99e Initial load
duke
parents:
diff changeset
813 BreakpointInfo* _next; // simple storage allocation
a61af66fc99e Initial load
duke
parents:
diff changeset
814
a61af66fc99e Initial load
duke
parents:
diff changeset
815 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
816 BreakpointInfo(methodOop m, int bci);
a61af66fc99e Initial load
duke
parents:
diff changeset
817
a61af66fc99e Initial load
duke
parents:
diff changeset
818 // accessors
a61af66fc99e Initial load
duke
parents:
diff changeset
819 Bytecodes::Code orig_bytecode() { return _orig_bytecode; }
a61af66fc99e Initial load
duke
parents:
diff changeset
820 void set_orig_bytecode(Bytecodes::Code code) { _orig_bytecode = code; }
a61af66fc99e Initial load
duke
parents:
diff changeset
821 int bci() { return _bci; }
a61af66fc99e Initial load
duke
parents:
diff changeset
822
a61af66fc99e Initial load
duke
parents:
diff changeset
823 BreakpointInfo* next() const { return _next; }
a61af66fc99e Initial load
duke
parents:
diff changeset
824 void set_next(BreakpointInfo* n) { _next = n; }
a61af66fc99e Initial load
duke
parents:
diff changeset
825
a61af66fc99e Initial load
duke
parents:
diff changeset
826 // helps for searchers
2142
8012aa3ccede 4926272: methodOopDesc::method_from_bcp is unsafe
never
parents: 1972
diff changeset
827 bool match(const methodOopDesc* m, int bci) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
828 return bci == _bci && match(m);
a61af66fc99e Initial load
duke
parents:
diff changeset
829 }
a61af66fc99e Initial load
duke
parents:
diff changeset
830
2142
8012aa3ccede 4926272: methodOopDesc::method_from_bcp is unsafe
never
parents: 1972
diff changeset
831 bool match(const methodOopDesc* m) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
832 return _name_index == m->name_index() &&
a61af66fc99e Initial load
duke
parents:
diff changeset
833 _signature_index == m->signature_index();
a61af66fc99e Initial load
duke
parents:
diff changeset
834 }
a61af66fc99e Initial load
duke
parents:
diff changeset
835
a61af66fc99e Initial load
duke
parents:
diff changeset
836 void set(methodOop method);
a61af66fc99e Initial load
duke
parents:
diff changeset
837 void clear(methodOop method);
a61af66fc99e Initial load
duke
parents:
diff changeset
838 };
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1877
diff changeset
839
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1877
diff changeset
840 #endif // SHARE_VM_OOPS_METHODOOP_HPP