annotate src/share/vm/oops/cpCacheOop.hpp @ 4155:394404b2d9bd

Removed strict requirement for GRAAL environment variable. It only needs to be set now if the graal directory is not in the directory hierarchy of GraalVM JDK.
author Doug Simon <doug.simon@oracle.com>
date Wed, 21 Dec 2011 11:25:27 +0100
parents 81d815b05abb
children 1d7922586cf6
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1 /*
2227
e5383553fd4e 7014851: Remove unused parallel compaction code
stefank
parents: 2226
diff changeset
2 * Copyright (c) 1998, 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: 1913
diff changeset
25 #ifndef SHARE_VM_OOPS_CPCACHEOOP_HPP
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1913
diff changeset
26 #define SHARE_VM_OOPS_CPCACHEOOP_HPP
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1913
diff changeset
27
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1913
diff changeset
28 #include "interpreter/bytecodes.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1913
diff changeset
29 #include "memory/allocation.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1913
diff changeset
30 #include "oops/arrayOop.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1913
diff changeset
31 #include "utilities/array.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1913
diff changeset
32
0
a61af66fc99e Initial load
duke
parents:
diff changeset
33 // A ConstantPoolCacheEntry describes an individual entry of the constant
a61af66fc99e Initial load
duke
parents:
diff changeset
34 // pool cache. There's 2 principal kinds of entries: field entries for in-
a61af66fc99e Initial load
duke
parents:
diff changeset
35 // stance & static field access, and method entries for invokes. Some of
a61af66fc99e Initial load
duke
parents:
diff changeset
36 // the entry layout is shared and looks as follows:
a61af66fc99e Initial load
duke
parents:
diff changeset
37 //
a61af66fc99e Initial load
duke
parents:
diff changeset
38 // bit number |31 0|
a61af66fc99e Initial load
duke
parents:
diff changeset
39 // bit length |-8--|-8--|---16----|
a61af66fc99e Initial load
duke
parents:
diff changeset
40 // --------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
41 // _indices [ b2 | b1 | index ]
a61af66fc99e Initial load
duke
parents:
diff changeset
42 // _f1 [ entry specific ]
a61af66fc99e Initial load
duke
parents:
diff changeset
43 // _f2 [ entry specific ]
a61af66fc99e Initial load
duke
parents:
diff changeset
44 // _flags [t|f|vf|v|m|h|unused|field_index] (for field entries)
a61af66fc99e Initial load
duke
parents:
diff changeset
45 // bit length |4|1|1 |1|1|0|---7--|----16-----]
a61af66fc99e Initial load
duke
parents:
diff changeset
46 // _flags [t|f|vf|v|m|h|unused|eidx|psze] (for method entries)
a61af66fc99e Initial load
duke
parents:
diff changeset
47 // bit length |4|1|1 |1|1|1|---7--|-8--|-8--]
a61af66fc99e Initial load
duke
parents:
diff changeset
48
a61af66fc99e Initial load
duke
parents:
diff changeset
49 // --------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
50 //
a61af66fc99e Initial load
duke
parents:
diff changeset
51 // with:
a61af66fc99e Initial load
duke
parents:
diff changeset
52 // index = original constant pool index
a61af66fc99e Initial load
duke
parents:
diff changeset
53 // b1 = bytecode 1
a61af66fc99e Initial load
duke
parents:
diff changeset
54 // b2 = bytecode 2
a61af66fc99e Initial load
duke
parents:
diff changeset
55 // psze = parameters size (method entries only)
a61af66fc99e Initial load
duke
parents:
diff changeset
56 // eidx = interpreter entry index (method entries only)
a61af66fc99e Initial load
duke
parents:
diff changeset
57 // field_index = index into field information in holder instanceKlass
a61af66fc99e Initial load
duke
parents:
diff changeset
58 // The index max is 0xffff (max number of fields in constant pool)
a61af66fc99e Initial load
duke
parents:
diff changeset
59 // and is multiplied by (instanceKlass::next_offset) when accessing.
a61af66fc99e Initial load
duke
parents:
diff changeset
60 // t = TosState (see below)
a61af66fc99e Initial load
duke
parents:
diff changeset
61 // f = field is marked final (see below)
a61af66fc99e Initial load
duke
parents:
diff changeset
62 // vf = virtual, final (method entries only : is_vfinal())
a61af66fc99e Initial load
duke
parents:
diff changeset
63 // v = field is volatile (see below)
a61af66fc99e Initial load
duke
parents:
diff changeset
64 // m = invokeinterface used for method in class Object (see below)
a61af66fc99e Initial load
duke
parents:
diff changeset
65 // h = RedefineClasses/Hotswap bit (see below)
a61af66fc99e Initial load
duke
parents:
diff changeset
66 //
a61af66fc99e Initial load
duke
parents:
diff changeset
67 // The flags after TosState have the following interpretation:
a61af66fc99e Initial load
duke
parents:
diff changeset
68 // bit 27: f flag true if field is marked final
a61af66fc99e Initial load
duke
parents:
diff changeset
69 // bit 26: vf flag true if virtual final method
a61af66fc99e Initial load
duke
parents:
diff changeset
70 // bit 25: v flag true if field is volatile (only for fields)
a61af66fc99e Initial load
duke
parents:
diff changeset
71 // bit 24: m flag true if invokeinterface used for method in class Object
a61af66fc99e Initial load
duke
parents:
diff changeset
72 // bit 23: 0 for fields, 1 for methods
a61af66fc99e Initial load
duke
parents:
diff changeset
73 //
a61af66fc99e Initial load
duke
parents:
diff changeset
74 // The flags 31, 30, 29, 28 together build a 4 bit number 0 to 8 with the
a61af66fc99e Initial load
duke
parents:
diff changeset
75 // following mapping to the TosState states:
a61af66fc99e Initial load
duke
parents:
diff changeset
76 //
a61af66fc99e Initial load
duke
parents:
diff changeset
77 // btos: 0
a61af66fc99e Initial load
duke
parents:
diff changeset
78 // ctos: 1
a61af66fc99e Initial load
duke
parents:
diff changeset
79 // stos: 2
a61af66fc99e Initial load
duke
parents:
diff changeset
80 // itos: 3
a61af66fc99e Initial load
duke
parents:
diff changeset
81 // ltos: 4
a61af66fc99e Initial load
duke
parents:
diff changeset
82 // ftos: 5
a61af66fc99e Initial load
duke
parents:
diff changeset
83 // dtos: 6
a61af66fc99e Initial load
duke
parents:
diff changeset
84 // atos: 7
a61af66fc99e Initial load
duke
parents:
diff changeset
85 // vtos: 8
a61af66fc99e Initial load
duke
parents:
diff changeset
86 //
a61af66fc99e Initial load
duke
parents:
diff changeset
87 // Entry specific: field entries:
a61af66fc99e Initial load
duke
parents:
diff changeset
88 // _indices = get (b1 section) and put (b2 section) bytecodes, original constant pool index
a61af66fc99e Initial load
duke
parents:
diff changeset
89 // _f1 = field holder
a61af66fc99e Initial load
duke
parents:
diff changeset
90 // _f2 = field offset in words
a61af66fc99e Initial load
duke
parents:
diff changeset
91 // _flags = field type information, original field index in field holder
a61af66fc99e Initial load
duke
parents:
diff changeset
92 // (field_index section)
a61af66fc99e Initial load
duke
parents:
diff changeset
93 //
a61af66fc99e Initial load
duke
parents:
diff changeset
94 // Entry specific: method entries:
a61af66fc99e Initial load
duke
parents:
diff changeset
95 // _indices = invoke code for f1 (b1 section), invoke code for f2 (b2 section),
a61af66fc99e Initial load
duke
parents:
diff changeset
96 // original constant pool index
a61af66fc99e Initial load
duke
parents:
diff changeset
97 // _f1 = method for all but virtual calls, unused by virtual calls
a61af66fc99e Initial load
duke
parents:
diff changeset
98 // (note: for interface calls, which are essentially virtual,
a61af66fc99e Initial load
duke
parents:
diff changeset
99 // contains klassOop for the corresponding interface.
726
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 579
diff changeset
100 // for invokedynamic, f1 contains the CallSite object for the invocation
0
a61af66fc99e Initial load
duke
parents:
diff changeset
101 // _f2 = method/vtable index for virtual calls only, unused by all other
a61af66fc99e Initial load
duke
parents:
diff changeset
102 // calls. The vf flag indicates this is a method pointer not an
a61af66fc99e Initial load
duke
parents:
diff changeset
103 // index.
a61af66fc99e Initial load
duke
parents:
diff changeset
104 // _flags = field type info (f section),
a61af66fc99e Initial load
duke
parents:
diff changeset
105 // virtual final entry (vf),
a61af66fc99e Initial load
duke
parents:
diff changeset
106 // interpreter entry index (eidx section),
a61af66fc99e Initial load
duke
parents:
diff changeset
107 // parameter size (psze section)
a61af66fc99e Initial load
duke
parents:
diff changeset
108 //
a61af66fc99e Initial load
duke
parents:
diff changeset
109 // Note: invokevirtual & invokespecial bytecodes can share the same constant
a61af66fc99e Initial load
duke
parents:
diff changeset
110 // pool entry and thus the same constant pool cache entry. All invoke
a61af66fc99e Initial load
duke
parents:
diff changeset
111 // bytecodes but invokevirtual use only _f1 and the corresponding b1
a61af66fc99e Initial load
duke
parents:
diff changeset
112 // bytecode, while invokevirtual uses only _f2 and the corresponding
a61af66fc99e Initial load
duke
parents:
diff changeset
113 // b2 bytecode. The value of _flags is shared for both types of entries.
a61af66fc99e Initial load
duke
parents:
diff changeset
114 //
a61af66fc99e Initial load
duke
parents:
diff changeset
115 // The fields are volatile so that they are stored in the order written in the
a61af66fc99e Initial load
duke
parents:
diff changeset
116 // source code. The _indices field with the bytecode must be written last.
a61af66fc99e Initial load
duke
parents:
diff changeset
117
a61af66fc99e Initial load
duke
parents:
diff changeset
118 class ConstantPoolCacheEntry VALUE_OBJ_CLASS_SPEC {
a61af66fc99e Initial load
duke
parents:
diff changeset
119 friend class VMStructs;
726
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 579
diff changeset
120 friend class constantPoolCacheKlass;
1602
136b78722a08 6939203: JSR 292 needs method handle constants
jrose
parents: 1552
diff changeset
121 friend class constantPoolOopDesc; //resolve_constant_at_impl => set_f1
726
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 579
diff changeset
122
0
a61af66fc99e Initial load
duke
parents:
diff changeset
123 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
124 volatile intx _indices; // constant pool index & rewrite bytecodes
a61af66fc99e Initial load
duke
parents:
diff changeset
125 volatile oop _f1; // entry specific oop field
a61af66fc99e Initial load
duke
parents:
diff changeset
126 volatile intx _f2; // entry specific int/oop field
a61af66fc99e Initial load
duke
parents:
diff changeset
127 volatile intx _flags; // flags
a61af66fc99e Initial load
duke
parents:
diff changeset
128
a61af66fc99e Initial load
duke
parents:
diff changeset
129
a61af66fc99e Initial load
duke
parents:
diff changeset
130 #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
131 bool same_methodOop(oop cur_f1, oop f1);
a61af66fc99e Initial load
duke
parents:
diff changeset
132 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
133
a61af66fc99e Initial load
duke
parents:
diff changeset
134 void set_bytecode_1(Bytecodes::Code code);
a61af66fc99e Initial load
duke
parents:
diff changeset
135 void set_bytecode_2(Bytecodes::Code code);
a61af66fc99e Initial load
duke
parents:
diff changeset
136 void set_f1(oop f1) {
a61af66fc99e Initial load
duke
parents:
diff changeset
137 oop existing_f1 = _f1; // read once
a61af66fc99e Initial load
duke
parents:
diff changeset
138 assert(existing_f1 == NULL || existing_f1 == f1, "illegal field change");
a61af66fc99e Initial load
duke
parents:
diff changeset
139 oop_store(&_f1, f1);
a61af66fc99e Initial load
duke
parents:
diff changeset
140 }
1903
87d6a4d1ecbc 6990192: VM crashes in ciTypeFlow::get_block_for()
twisti
parents: 1662
diff changeset
141 void set_f1_if_null_atomic(oop f1);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
142 void set_f2(intx f2) { assert(_f2 == 0 || _f2 == f2, "illegal field change"); _f2 = f2; }
a61af66fc99e Initial load
duke
parents:
diff changeset
143 int as_flags(TosState state, bool is_final, bool is_vfinal, bool is_volatile,
a61af66fc99e Initial load
duke
parents:
diff changeset
144 bool is_method_interface, bool is_method);
a61af66fc99e Initial load
duke
parents:
diff changeset
145 void set_flags(intx flags) { _flags = flags; }
a61af66fc99e Initial load
duke
parents:
diff changeset
146
a61af66fc99e Initial load
duke
parents:
diff changeset
147 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
148 // specific bit values in flag field
a61af66fc99e Initial load
duke
parents:
diff changeset
149 // Note: the interpreter knows this layout!
a61af66fc99e Initial load
duke
parents:
diff changeset
150 enum FlagBitValues {
a61af66fc99e Initial load
duke
parents:
diff changeset
151 hotSwapBit = 23,
a61af66fc99e Initial load
duke
parents:
diff changeset
152 methodInterface = 24,
a61af66fc99e Initial load
duke
parents:
diff changeset
153 volatileField = 25,
a61af66fc99e Initial load
duke
parents:
diff changeset
154 vfinalMethod = 26,
a61af66fc99e Initial load
duke
parents:
diff changeset
155 finalField = 27
a61af66fc99e Initial load
duke
parents:
diff changeset
156 };
a61af66fc99e Initial load
duke
parents:
diff changeset
157
a61af66fc99e Initial load
duke
parents:
diff changeset
158 enum { field_index_mask = 0xFFFF };
a61af66fc99e Initial load
duke
parents:
diff changeset
159
a61af66fc99e Initial load
duke
parents:
diff changeset
160 // start of type bits in flags
a61af66fc99e Initial load
duke
parents:
diff changeset
161 // Note: the interpreter knows this layout!
a61af66fc99e Initial load
duke
parents:
diff changeset
162 enum FlagValues {
a61af66fc99e Initial load
duke
parents:
diff changeset
163 tosBits = 28
a61af66fc99e Initial load
duke
parents:
diff changeset
164 };
a61af66fc99e Initial load
duke
parents:
diff changeset
165
a61af66fc99e Initial load
duke
parents:
diff changeset
166 // Initialization
1059
389049f3f393 6858164: invokedynamic code needs some cleanup (post-6655638)
jrose
parents: 726
diff changeset
167 void initialize_entry(int original_index); // initialize primary entry
389049f3f393 6858164: invokedynamic code needs some cleanup (post-6655638)
jrose
parents: 726
diff changeset
168 void initialize_secondary_entry(int main_index); // initialize secondary entry
0
a61af66fc99e Initial load
duke
parents:
diff changeset
169
a61af66fc99e Initial load
duke
parents:
diff changeset
170 void set_field( // sets entry to resolved field state
a61af66fc99e Initial load
duke
parents:
diff changeset
171 Bytecodes::Code get_code, // the bytecode used for reading the field
a61af66fc99e Initial load
duke
parents:
diff changeset
172 Bytecodes::Code put_code, // the bytecode used for writing the field
a61af66fc99e Initial load
duke
parents:
diff changeset
173 KlassHandle field_holder, // the object/klass holding the field
a61af66fc99e Initial load
duke
parents:
diff changeset
174 int orig_field_index, // the original field index in the field holder
a61af66fc99e Initial load
duke
parents:
diff changeset
175 int field_offset, // the field offset in words in the field holder
a61af66fc99e Initial load
duke
parents:
diff changeset
176 TosState field_type, // the (machine) field type
a61af66fc99e Initial load
duke
parents:
diff changeset
177 bool is_final, // the field is final
a61af66fc99e Initial load
duke
parents:
diff changeset
178 bool is_volatile // the field is volatile
a61af66fc99e Initial load
duke
parents:
diff changeset
179 );
a61af66fc99e Initial load
duke
parents:
diff changeset
180
a61af66fc99e Initial load
duke
parents:
diff changeset
181 void set_method( // sets entry to resolved method entry
a61af66fc99e Initial load
duke
parents:
diff changeset
182 Bytecodes::Code invoke_code, // the bytecode used for invoking the method
a61af66fc99e Initial load
duke
parents:
diff changeset
183 methodHandle method, // the method/prototype if any (NULL, otherwise)
a61af66fc99e Initial load
duke
parents:
diff changeset
184 int vtable_index // the vtable index if any, else negative
a61af66fc99e Initial load
duke
parents:
diff changeset
185 );
a61af66fc99e Initial load
duke
parents:
diff changeset
186
a61af66fc99e Initial load
duke
parents:
diff changeset
187 void set_interface_call(
a61af66fc99e Initial load
duke
parents:
diff changeset
188 methodHandle method, // Resolved method
a61af66fc99e Initial load
duke
parents:
diff changeset
189 int index // Method index into interface
a61af66fc99e Initial load
duke
parents:
diff changeset
190 );
a61af66fc99e Initial load
duke
parents:
diff changeset
191
726
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 579
diff changeset
192 void set_dynamic_call(
2357
8033953d67ff 7012648: move JSR 292 to package java.lang.invoke and adjust names
jrose
parents: 2227
diff changeset
193 Handle call_site, // Resolved java.lang.invoke.CallSite (f1)
1507
cd5dbf694d45 6939134: JSR 292 adjustments to method handle invocation
jrose
parents: 1059
diff changeset
194 methodHandle signature_invoker // determines signature information
726
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 579
diff changeset
195 );
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 579
diff changeset
196
3461
81d815b05abb 7056328: JSR 292 invocation sometimes fails in adapters for types not on boot class path
jrose
parents: 2357
diff changeset
197 methodOop get_method_if_resolved(Bytecodes::Code invoke_code, constantPoolHandle cpool);
81d815b05abb 7056328: JSR 292 invocation sometimes fails in adapters for types not on boot class path
jrose
parents: 2357
diff changeset
198
1660
083fde3b838e 6964498: JSR 292 invokedynamic sites need local bootstrap methods
jrose
parents: 1602
diff changeset
199 // For JVM_CONSTANT_InvokeDynamic cache entries:
083fde3b838e 6964498: JSR 292 invokedynamic sites need local bootstrap methods
jrose
parents: 1602
diff changeset
200 void initialize_bootstrap_method_index_in_cache(int bsm_cache_index);
083fde3b838e 6964498: JSR 292 invokedynamic sites need local bootstrap methods
jrose
parents: 1602
diff changeset
201 int bootstrap_method_index_in_cache();
083fde3b838e 6964498: JSR 292 invokedynamic sites need local bootstrap methods
jrose
parents: 1602
diff changeset
202
0
a61af66fc99e Initial load
duke
parents:
diff changeset
203 void set_parameter_size(int value) {
a61af66fc99e Initial load
duke
parents:
diff changeset
204 assert(parameter_size() == 0 || parameter_size() == value,
a61af66fc99e Initial load
duke
parents:
diff changeset
205 "size must not change");
a61af66fc99e Initial load
duke
parents:
diff changeset
206 // Setting the parameter size by itself is only safe if the
a61af66fc99e Initial load
duke
parents:
diff changeset
207 // current value of _flags is 0, otherwise another thread may have
a61af66fc99e Initial load
duke
parents:
diff changeset
208 // updated it and we don't want to overwrite that value. Don't
a61af66fc99e Initial load
duke
parents:
diff changeset
209 // bother trying to update it once it's nonzero but always make
a61af66fc99e Initial load
duke
parents:
diff changeset
210 // sure that the final parameter size agrees with what was passed.
a61af66fc99e Initial load
duke
parents:
diff changeset
211 if (_flags == 0) {
a61af66fc99e Initial load
duke
parents:
diff changeset
212 Atomic::cmpxchg_ptr((value & 0xFF), &_flags, 0);
a61af66fc99e Initial load
duke
parents:
diff changeset
213 }
a61af66fc99e Initial load
duke
parents:
diff changeset
214 guarantee(parameter_size() == value, "size must not change");
a61af66fc99e Initial load
duke
parents:
diff changeset
215 }
a61af66fc99e Initial load
duke
parents:
diff changeset
216
a61af66fc99e Initial load
duke
parents:
diff changeset
217 // Which bytecode number (1 or 2) in the index field is valid for this bytecode?
a61af66fc99e Initial load
duke
parents:
diff changeset
218 // Returns -1 if neither is valid.
a61af66fc99e Initial load
duke
parents:
diff changeset
219 static int bytecode_number(Bytecodes::Code code) {
a61af66fc99e Initial load
duke
parents:
diff changeset
220 switch (code) {
a61af66fc99e Initial load
duke
parents:
diff changeset
221 case Bytecodes::_getstatic : // fall through
a61af66fc99e Initial load
duke
parents:
diff changeset
222 case Bytecodes::_getfield : // fall through
a61af66fc99e Initial load
duke
parents:
diff changeset
223 case Bytecodes::_invokespecial : // fall through
a61af66fc99e Initial load
duke
parents:
diff changeset
224 case Bytecodes::_invokestatic : // fall through
1662
e0ba4e04c839 6969574: invokedynamic call sites deoptimize instead of executing
jrose
parents: 1660
diff changeset
225 case Bytecodes::_invokedynamic : // fall through
0
a61af66fc99e Initial load
duke
parents:
diff changeset
226 case Bytecodes::_invokeinterface : return 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
227 case Bytecodes::_putstatic : // fall through
a61af66fc99e Initial load
duke
parents:
diff changeset
228 case Bytecodes::_putfield : // fall through
a61af66fc99e Initial load
duke
parents:
diff changeset
229 case Bytecodes::_invokevirtual : return 2;
a61af66fc99e Initial load
duke
parents:
diff changeset
230 default : break;
a61af66fc99e Initial load
duke
parents:
diff changeset
231 }
a61af66fc99e Initial load
duke
parents:
diff changeset
232 return -1;
a61af66fc99e Initial load
duke
parents:
diff changeset
233 }
a61af66fc99e Initial load
duke
parents:
diff changeset
234
a61af66fc99e Initial load
duke
parents:
diff changeset
235 // Has this bytecode been resolved? Only valid for invokes and get/put field/static.
a61af66fc99e Initial load
duke
parents:
diff changeset
236 bool is_resolved(Bytecodes::Code code) const {
a61af66fc99e Initial load
duke
parents:
diff changeset
237 switch (bytecode_number(code)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
238 case 1: return (bytecode_1() == code);
a61af66fc99e Initial load
duke
parents:
diff changeset
239 case 2: return (bytecode_2() == code);
a61af66fc99e Initial load
duke
parents:
diff changeset
240 }
a61af66fc99e Initial load
duke
parents:
diff changeset
241 return false; // default: not resolved
a61af66fc99e Initial load
duke
parents:
diff changeset
242 }
a61af66fc99e Initial load
duke
parents:
diff changeset
243
a61af66fc99e Initial load
duke
parents:
diff changeset
244 // Accessors
726
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 579
diff changeset
245 bool is_secondary_entry() const { return (_indices & 0xFFFF) == 0; }
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 579
diff changeset
246 int constant_pool_index() const { assert((_indices & 0xFFFF) != 0, "must be main entry");
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 579
diff changeset
247 return (_indices & 0xFFFF); }
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 579
diff changeset
248 int main_entry_index() const { assert((_indices & 0xFFFF) == 0, "must be secondary entry");
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 579
diff changeset
249 return ((uintx)_indices >> 16); }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
250 Bytecodes::Code bytecode_1() const { return Bytecodes::cast((_indices >> 16) & 0xFF); }
a61af66fc99e Initial load
duke
parents:
diff changeset
251 Bytecodes::Code bytecode_2() const { return Bytecodes::cast((_indices >> 24) & 0xFF); }
a61af66fc99e Initial load
duke
parents:
diff changeset
252 volatile oop f1() const { return _f1; }
1660
083fde3b838e 6964498: JSR 292 invokedynamic sites need local bootstrap methods
jrose
parents: 1602
diff changeset
253 bool is_f1_null() const { return (oop)_f1 == NULL; } // classifies a CPC entry as unbound
0
a61af66fc99e Initial load
duke
parents:
diff changeset
254 intx f2() const { return _f2; }
a61af66fc99e Initial load
duke
parents:
diff changeset
255 int field_index() const;
a61af66fc99e Initial load
duke
parents:
diff changeset
256 int parameter_size() const { return _flags & 0xFF; }
a61af66fc99e Initial load
duke
parents:
diff changeset
257 bool is_vfinal() const { return ((_flags & (1 << vfinalMethod)) == (1 << vfinalMethod)); }
a61af66fc99e Initial load
duke
parents:
diff changeset
258 bool is_volatile() const { return ((_flags & (1 << volatileField)) == (1 << volatileField)); }
a61af66fc99e Initial load
duke
parents:
diff changeset
259 bool is_methodInterface() const { return ((_flags & (1 << methodInterface)) == (1 << methodInterface)); }
a61af66fc99e Initial load
duke
parents:
diff changeset
260 bool is_byte() const { return (((uintx) _flags >> tosBits) == btos); }
a61af66fc99e Initial load
duke
parents:
diff changeset
261 bool is_char() const { return (((uintx) _flags >> tosBits) == ctos); }
a61af66fc99e Initial load
duke
parents:
diff changeset
262 bool is_short() const { return (((uintx) _flags >> tosBits) == stos); }
a61af66fc99e Initial load
duke
parents:
diff changeset
263 bool is_int() const { return (((uintx) _flags >> tosBits) == itos); }
a61af66fc99e Initial load
duke
parents:
diff changeset
264 bool is_long() const { return (((uintx) _flags >> tosBits) == ltos); }
a61af66fc99e Initial load
duke
parents:
diff changeset
265 bool is_float() const { return (((uintx) _flags >> tosBits) == ftos); }
a61af66fc99e Initial load
duke
parents:
diff changeset
266 bool is_double() const { return (((uintx) _flags >> tosBits) == dtos); }
a61af66fc99e Initial load
duke
parents:
diff changeset
267 bool is_object() const { return (((uintx) _flags >> tosBits) == atos); }
a61af66fc99e Initial load
duke
parents:
diff changeset
268 TosState flag_state() const { assert( ( (_flags >> tosBits) & 0x0F ) < number_of_states, "Invalid state in as_flags");
a61af66fc99e Initial load
duke
parents:
diff changeset
269 return (TosState)((_flags >> tosBits) & 0x0F); }
a61af66fc99e Initial load
duke
parents:
diff changeset
270
a61af66fc99e Initial load
duke
parents:
diff changeset
271 // Code generation support
a61af66fc99e Initial load
duke
parents:
diff changeset
272 static WordSize size() { return in_WordSize(sizeof(ConstantPoolCacheEntry) / HeapWordSize); }
1059
389049f3f393 6858164: invokedynamic code needs some cleanup (post-6655638)
jrose
parents: 726
diff changeset
273 static ByteSize size_in_bytes() { return in_ByteSize(sizeof(ConstantPoolCacheEntry)); }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
274 static ByteSize indices_offset() { return byte_offset_of(ConstantPoolCacheEntry, _indices); }
a61af66fc99e Initial load
duke
parents:
diff changeset
275 static ByteSize f1_offset() { return byte_offset_of(ConstantPoolCacheEntry, _f1); }
a61af66fc99e Initial load
duke
parents:
diff changeset
276 static ByteSize f2_offset() { return byte_offset_of(ConstantPoolCacheEntry, _f2); }
a61af66fc99e Initial load
duke
parents:
diff changeset
277 static ByteSize flags_offset() { return byte_offset_of(ConstantPoolCacheEntry, _flags); }
a61af66fc99e Initial load
duke
parents:
diff changeset
278
a61af66fc99e Initial load
duke
parents:
diff changeset
279 // GC Support
a61af66fc99e Initial load
duke
parents:
diff changeset
280 void oops_do(void f(oop*));
a61af66fc99e Initial load
duke
parents:
diff changeset
281 void oop_iterate(OopClosure* blk);
a61af66fc99e Initial load
duke
parents:
diff changeset
282 void oop_iterate_m(OopClosure* blk, MemRegion mr);
a61af66fc99e Initial load
duke
parents:
diff changeset
283 void follow_contents();
a61af66fc99e Initial load
duke
parents:
diff changeset
284 void adjust_pointers();
a61af66fc99e Initial load
duke
parents:
diff changeset
285
a61af66fc99e Initial load
duke
parents:
diff changeset
286 #ifndef SERIALGC
a61af66fc99e Initial load
duke
parents:
diff changeset
287 // Parallel Old
a61af66fc99e Initial load
duke
parents:
diff changeset
288 void follow_contents(ParCompactionManager* cm);
a61af66fc99e Initial load
duke
parents:
diff changeset
289 #endif // SERIALGC
a61af66fc99e Initial load
duke
parents:
diff changeset
290
a61af66fc99e Initial load
duke
parents:
diff changeset
291 void update_pointers();
a61af66fc99e Initial load
duke
parents:
diff changeset
292
a61af66fc99e Initial load
duke
parents:
diff changeset
293 // RedefineClasses() API support:
a61af66fc99e Initial load
duke
parents:
diff changeset
294 // If this constantPoolCacheEntry refers to old_method then update it
a61af66fc99e Initial load
duke
parents:
diff changeset
295 // to refer to new_method.
a61af66fc99e Initial load
duke
parents:
diff changeset
296 // trace_name_printed is set to true if the current call has
a61af66fc99e Initial load
duke
parents:
diff changeset
297 // printed the klass name so that other routines in the adjust_*
a61af66fc99e Initial load
duke
parents:
diff changeset
298 // group don't print the klass name.
a61af66fc99e Initial load
duke
parents:
diff changeset
299 bool adjust_method_entry(methodOop old_method, methodOop new_method,
a61af66fc99e Initial load
duke
parents:
diff changeset
300 bool * trace_name_printed);
a61af66fc99e Initial load
duke
parents:
diff changeset
301 bool is_interesting_method_entry(klassOop k);
a61af66fc99e Initial load
duke
parents:
diff changeset
302 bool is_field_entry() const { return (_flags & (1 << hotSwapBit)) == 0; }
a61af66fc99e Initial load
duke
parents:
diff changeset
303 bool is_method_entry() const { return (_flags & (1 << hotSwapBit)) != 0; }
a61af66fc99e Initial load
duke
parents:
diff changeset
304
a61af66fc99e Initial load
duke
parents:
diff changeset
305 // Debugging & Printing
a61af66fc99e Initial load
duke
parents:
diff changeset
306 void print (outputStream* st, int index) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
307 void verify(outputStream* st) const;
a61af66fc99e Initial load
duke
parents:
diff changeset
308
a61af66fc99e Initial load
duke
parents:
diff changeset
309 static void verify_tosBits() {
a61af66fc99e Initial load
duke
parents:
diff changeset
310 assert(tosBits == 28, "interpreter now assumes tosBits is 28");
a61af66fc99e Initial load
duke
parents:
diff changeset
311 }
a61af66fc99e Initial load
duke
parents:
diff changeset
312 };
a61af66fc99e Initial load
duke
parents:
diff changeset
313
a61af66fc99e Initial load
duke
parents:
diff changeset
314
a61af66fc99e Initial load
duke
parents:
diff changeset
315 // A constant pool cache is a runtime data structure set aside to a constant pool. The cache
a61af66fc99e Initial load
duke
parents:
diff changeset
316 // holds interpreter runtime information for all field access and invoke bytecodes. The cache
a61af66fc99e Initial load
duke
parents:
diff changeset
317 // is created and initialized before a class is actively used (i.e., initialized), the indivi-
a61af66fc99e Initial load
duke
parents:
diff changeset
318 // dual cache entries are filled at resolution (i.e., "link") time (see also: rewriter.*).
a61af66fc99e Initial load
duke
parents:
diff changeset
319
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
320 class constantPoolCacheOopDesc: public oopDesc {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
321 friend class VMStructs;
a61af66fc99e Initial load
duke
parents:
diff changeset
322 private:
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
323 int _length;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
324 constantPoolOop _constant_pool; // the corresponding constant pool
a61af66fc99e Initial load
duke
parents:
diff changeset
325
a61af66fc99e Initial load
duke
parents:
diff changeset
326 // Sizing
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
327 debug_only(friend class ClassVerifier;)
1913
3b2dea75431e 6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents: 1903
diff changeset
328 public:
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
329 int length() const { return _length; }
1913
3b2dea75431e 6984311: JSR 292 needs optional bootstrap method parameters
jrose
parents: 1903
diff changeset
330 private:
113
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
331 void set_length(int length) { _length = length; }
ba764ed4b6f2 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 0
diff changeset
332
0
a61af66fc99e Initial load
duke
parents:
diff changeset
333 static int header_size() { return sizeof(constantPoolCacheOopDesc) / HeapWordSize; }
a61af66fc99e Initial load
duke
parents:
diff changeset
334 static int object_size(int length) { return align_object_size(header_size() + length * in_words(ConstantPoolCacheEntry::size())); }
a61af66fc99e Initial load
duke
parents:
diff changeset
335 int object_size() { return object_size(length()); }
a61af66fc99e Initial load
duke
parents:
diff changeset
336
a61af66fc99e Initial load
duke
parents:
diff changeset
337 // Helpers
a61af66fc99e Initial load
duke
parents:
diff changeset
338 constantPoolOop* constant_pool_addr() { return &_constant_pool; }
a61af66fc99e Initial load
duke
parents:
diff changeset
339 ConstantPoolCacheEntry* base() const { return (ConstantPoolCacheEntry*)((address)this + in_bytes(base_offset())); }
a61af66fc99e Initial load
duke
parents:
diff changeset
340
a61af66fc99e Initial load
duke
parents:
diff changeset
341 friend class constantPoolCacheKlass;
1059
389049f3f393 6858164: invokedynamic code needs some cleanup (post-6655638)
jrose
parents: 726
diff changeset
342 friend class ConstantPoolCacheEntry;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
343
a61af66fc99e Initial load
duke
parents:
diff changeset
344 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
345 // Initialization
a61af66fc99e Initial load
duke
parents:
diff changeset
346 void initialize(intArray& inverse_index_map);
a61af66fc99e Initial load
duke
parents:
diff changeset
347
726
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 579
diff changeset
348 // Secondary indexes.
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 579
diff changeset
349 // They must look completely different from normal indexes.
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 579
diff changeset
350 // The main reason is that byte swapping is sometimes done on normal indexes.
1059
389049f3f393 6858164: invokedynamic code needs some cleanup (post-6655638)
jrose
parents: 726
diff changeset
351 // Also, some of the CP accessors do different things for secondary indexes.
389049f3f393 6858164: invokedynamic code needs some cleanup (post-6655638)
jrose
parents: 726
diff changeset
352 // Finally, it is helpful for debugging to tell the two apart.
726
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 579
diff changeset
353 static bool is_secondary_index(int i) { return (i < 0); }
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 579
diff changeset
354 static int decode_secondary_index(int i) { assert(is_secondary_index(i), ""); return ~i; }
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 579
diff changeset
355 static int encode_secondary_index(int i) { assert(!is_secondary_index(i), ""); return ~i; }
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 579
diff changeset
356
0
a61af66fc99e Initial load
duke
parents:
diff changeset
357 // Accessors
a61af66fc99e Initial load
duke
parents:
diff changeset
358 void set_constant_pool(constantPoolOop pool) { oop_store_without_check((oop*)&_constant_pool, (oop)pool); }
a61af66fc99e Initial load
duke
parents:
diff changeset
359 constantPoolOop constant_pool() const { return _constant_pool; }
1059
389049f3f393 6858164: invokedynamic code needs some cleanup (post-6655638)
jrose
parents: 726
diff changeset
360 // Fetches the entry at the given index.
389049f3f393 6858164: invokedynamic code needs some cleanup (post-6655638)
jrose
parents: 726
diff changeset
361 // The entry may be either primary or secondary.
389049f3f393 6858164: invokedynamic code needs some cleanup (post-6655638)
jrose
parents: 726
diff changeset
362 // In either case the index must not be encoded or byte-swapped in any way.
389049f3f393 6858164: invokedynamic code needs some cleanup (post-6655638)
jrose
parents: 726
diff changeset
363 ConstantPoolCacheEntry* entry_at(int i) const {
389049f3f393 6858164: invokedynamic code needs some cleanup (post-6655638)
jrose
parents: 726
diff changeset
364 assert(0 <= i && i < length(), "index out of bounds");
389049f3f393 6858164: invokedynamic code needs some cleanup (post-6655638)
jrose
parents: 726
diff changeset
365 return base() + i;
389049f3f393 6858164: invokedynamic code needs some cleanup (post-6655638)
jrose
parents: 726
diff changeset
366 }
389049f3f393 6858164: invokedynamic code needs some cleanup (post-6655638)
jrose
parents: 726
diff changeset
367 // Fetches the secondary entry referred to by index.
389049f3f393 6858164: invokedynamic code needs some cleanup (post-6655638)
jrose
parents: 726
diff changeset
368 // The index may be a secondary index, and must not be byte-swapped.
389049f3f393 6858164: invokedynamic code needs some cleanup (post-6655638)
jrose
parents: 726
diff changeset
369 ConstantPoolCacheEntry* secondary_entry_at(int i) const {
389049f3f393 6858164: invokedynamic code needs some cleanup (post-6655638)
jrose
parents: 726
diff changeset
370 int raw_index = i;
389049f3f393 6858164: invokedynamic code needs some cleanup (post-6655638)
jrose
parents: 726
diff changeset
371 if (is_secondary_index(i)) { // correct these on the fly
389049f3f393 6858164: invokedynamic code needs some cleanup (post-6655638)
jrose
parents: 726
diff changeset
372 raw_index = decode_secondary_index(i);
389049f3f393 6858164: invokedynamic code needs some cleanup (post-6655638)
jrose
parents: 726
diff changeset
373 }
389049f3f393 6858164: invokedynamic code needs some cleanup (post-6655638)
jrose
parents: 726
diff changeset
374 assert(entry_at(raw_index)->is_secondary_entry(), "not a secondary entry");
389049f3f393 6858164: invokedynamic code needs some cleanup (post-6655638)
jrose
parents: 726
diff changeset
375 return entry_at(raw_index);
389049f3f393 6858164: invokedynamic code needs some cleanup (post-6655638)
jrose
parents: 726
diff changeset
376 }
389049f3f393 6858164: invokedynamic code needs some cleanup (post-6655638)
jrose
parents: 726
diff changeset
377 // Given a primary or secondary index, fetch the corresponding primary entry.
389049f3f393 6858164: invokedynamic code needs some cleanup (post-6655638)
jrose
parents: 726
diff changeset
378 // Indirect through the secondary entry, if the index is encoded as a secondary index.
389049f3f393 6858164: invokedynamic code needs some cleanup (post-6655638)
jrose
parents: 726
diff changeset
379 // The index must not be byte-swapped.
726
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 579
diff changeset
380 ConstantPoolCacheEntry* main_entry_at(int i) const {
1059
389049f3f393 6858164: invokedynamic code needs some cleanup (post-6655638)
jrose
parents: 726
diff changeset
381 int primary_index = i;
726
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 579
diff changeset
382 if (is_secondary_index(i)) {
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 579
diff changeset
383 // run through an extra level of indirection:
1059
389049f3f393 6858164: invokedynamic code needs some cleanup (post-6655638)
jrose
parents: 726
diff changeset
384 int raw_index = decode_secondary_index(i);
389049f3f393 6858164: invokedynamic code needs some cleanup (post-6655638)
jrose
parents: 726
diff changeset
385 primary_index = entry_at(raw_index)->main_entry_index();
726
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 579
diff changeset
386 }
1059
389049f3f393 6858164: invokedynamic code needs some cleanup (post-6655638)
jrose
parents: 726
diff changeset
387 assert(!entry_at(primary_index)->is_secondary_entry(), "only one level of indirection");
389049f3f393 6858164: invokedynamic code needs some cleanup (post-6655638)
jrose
parents: 726
diff changeset
388 return entry_at(primary_index);
726
be93aad57795 6655646: dynamic languages need dynamically linked call sites
jrose
parents: 579
diff changeset
389 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
390
a61af66fc99e Initial load
duke
parents:
diff changeset
391 // Code generation
a61af66fc99e Initial load
duke
parents:
diff changeset
392 static ByteSize base_offset() { return in_ByteSize(sizeof(constantPoolCacheOopDesc)); }
1059
389049f3f393 6858164: invokedynamic code needs some cleanup (post-6655638)
jrose
parents: 726
diff changeset
393 static ByteSize entry_offset(int raw_index) {
389049f3f393 6858164: invokedynamic code needs some cleanup (post-6655638)
jrose
parents: 726
diff changeset
394 int index = raw_index;
389049f3f393 6858164: invokedynamic code needs some cleanup (post-6655638)
jrose
parents: 726
diff changeset
395 if (is_secondary_index(raw_index))
389049f3f393 6858164: invokedynamic code needs some cleanup (post-6655638)
jrose
parents: 726
diff changeset
396 index = decode_secondary_index(raw_index);
389049f3f393 6858164: invokedynamic code needs some cleanup (post-6655638)
jrose
parents: 726
diff changeset
397 return (base_offset() + ConstantPoolCacheEntry::size_in_bytes() * index);
389049f3f393 6858164: invokedynamic code needs some cleanup (post-6655638)
jrose
parents: 726
diff changeset
398 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
399
a61af66fc99e Initial load
duke
parents:
diff changeset
400 // RedefineClasses() API support:
a61af66fc99e Initial load
duke
parents:
diff changeset
401 // If any entry of this constantPoolCache points to any of
a61af66fc99e Initial load
duke
parents:
diff changeset
402 // old_methods, replace it with the corresponding new_method.
a61af66fc99e Initial load
duke
parents:
diff changeset
403 // trace_name_printed is set to true if the current call has
a61af66fc99e Initial load
duke
parents:
diff changeset
404 // printed the klass name so that other routines in the adjust_*
a61af66fc99e Initial load
duke
parents:
diff changeset
405 // group don't print the klass name.
a61af66fc99e Initial load
duke
parents:
diff changeset
406 void adjust_method_entries(methodOop* old_methods, methodOop* new_methods,
a61af66fc99e Initial load
duke
parents:
diff changeset
407 int methods_length, bool * trace_name_printed);
a61af66fc99e Initial load
duke
parents:
diff changeset
408 };
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1913
diff changeset
409
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1913
diff changeset
410 #endif // SHARE_VM_OOPS_CPCACHEOOP_HPP