annotate src/share/vm/oops/constMethod.cpp @ 9126:bc26f978b0ce

HotSpotResolvedObjectType: implement hasFinalizeSubclass() correctly don't use the (wrong) cached value, but ask the runtime on each request. Fixes regression on xml.* benchmarks @ specjvm2008. The problem was: After the constructor of Object was deoptimized due to an assumption violation, it was recompiled again after some time. However, on recompilation, the value of hasFinalizeSubclass for the class was not updated and it was compiled again with a, now wrong, assumption, which then triggers deoptimization again. This was repeated until it hit the recompilation limit (defined by PerMethodRecompilationCutoff), and therefore only executed by the interpreter from now on, causing the performance regression.
author Bernhard Urban <bernhard.urban@jku.at>
date Mon, 15 Apr 2013 19:54:58 +0200
parents 0c3ee6f1fa23
children a1ebd310d5c1
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1 /*
7956
16fb9f942703 6479360: PrintClassHistogram improvements
acorn
parents: 7462
diff changeset
2 * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
a61af66fc99e Initial load
duke
parents:
diff changeset
4 *
a61af66fc99e Initial load
duke
parents:
diff changeset
5 * This code is free software; you can redistribute it and/or modify it
a61af66fc99e Initial load
duke
parents:
diff changeset
6 * under the terms of the GNU General Public License version 2 only, as
a61af66fc99e Initial load
duke
parents:
diff changeset
7 * published by the Free Software Foundation.
a61af66fc99e Initial load
duke
parents:
diff changeset
8 *
a61af66fc99e Initial load
duke
parents:
diff changeset
9 * This code is distributed in the hope that it will be useful, but WITHOUT
a61af66fc99e Initial load
duke
parents:
diff changeset
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
a61af66fc99e Initial load
duke
parents:
diff changeset
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
a61af66fc99e Initial load
duke
parents:
diff changeset
12 * version 2 for more details (a copy is included in the LICENSE file that
a61af66fc99e Initial load
duke
parents:
diff changeset
13 * accompanied this code).
a61af66fc99e Initial load
duke
parents:
diff changeset
14 *
a61af66fc99e Initial load
duke
parents:
diff changeset
15 * You should have received a copy of the GNU General Public License version
a61af66fc99e Initial load
duke
parents:
diff changeset
16 * 2 along with this work; if not, write to the Free Software Foundation,
a61af66fc99e Initial load
duke
parents:
diff changeset
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
a61af66fc99e Initial load
duke
parents:
diff changeset
18 *
1552
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 0
diff changeset
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 0
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: 0
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: 1552
diff changeset
25 #include "precompiled.hpp"
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6213
diff changeset
26 #include "interpreter/interpreter.hpp"
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6213
diff changeset
27 #include "memory/gcLocker.hpp"
7956
16fb9f942703 6479360: PrintClassHistogram improvements
acorn
parents: 7462
diff changeset
28 #include "memory/heapInspection.hpp"
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6213
diff changeset
29 #include "memory/metadataFactory.hpp"
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6213
diff changeset
30 #include "oops/constMethod.hpp"
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6213
diff changeset
31 #include "oops/method.hpp"
0
a61af66fc99e Initial load
duke
parents:
diff changeset
32
a61af66fc99e Initial load
duke
parents:
diff changeset
33 // Static initialization
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6213
diff changeset
34 const u2 ConstMethod::MAX_IDNUM = 0xFFFE;
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6213
diff changeset
35 const u2 ConstMethod::UNSET_IDNUM = 0xFFFF;
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6213
diff changeset
36
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6213
diff changeset
37 ConstMethod* ConstMethod::allocate(ClassLoaderData* loader_data,
6934
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents: 6725
diff changeset
38 int byte_code_size,
8031
927a311d00f9 8007320: NPG: move method annotations
coleenp
parents: 7956
diff changeset
39 InlineTableSizes* sizes,
6934
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents: 6725
diff changeset
40 MethodType method_type,
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents: 6725
diff changeset
41 TRAPS) {
8031
927a311d00f9 8007320: NPG: move method annotations
coleenp
parents: 7956
diff changeset
42 int size = ConstMethod::size(byte_code_size, sizes);
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6213
diff changeset
43 return new (loader_data, size, true, THREAD) ConstMethod(
8031
927a311d00f9 8007320: NPG: move method annotations
coleenp
parents: 7956
diff changeset
44 byte_code_size, sizes, method_type, size);
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6213
diff changeset
45 }
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6213
diff changeset
46
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6213
diff changeset
47 ConstMethod::ConstMethod(int byte_code_size,
8031
927a311d00f9 8007320: NPG: move method annotations
coleenp
parents: 7956
diff changeset
48 InlineTableSizes* sizes,
6934
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents: 6725
diff changeset
49 MethodType method_type,
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents: 6725
diff changeset
50 int size) {
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6213
diff changeset
51
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6213
diff changeset
52 No_Safepoint_Verifier no_safepoint;
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6213
diff changeset
53 init_fingerprint();
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6213
diff changeset
54 set_constants(NULL);
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6213
diff changeset
55 set_stackmap_data(NULL);
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6213
diff changeset
56 set_code_size(byte_code_size);
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6213
diff changeset
57 set_constMethod_size(size);
8715
5939f5953b45 8009836: nsk/regression/b4222717 fails with empty stack trace
coleenp
parents: 8712
diff changeset
58 set_inlined_tables_length(sizes); // sets _flags
6934
4735d2c84362 7200776: Implement default methods in interfaces
kamg
parents: 6725
diff changeset
59 set_method_type(method_type);
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6213
diff changeset
60 assert(this->size() == size, "wrong size for object");
8712
3efdfd6ddbf2 8003553: NPG: metaspace objects should be zeroed in constructors
coleenp
parents: 8031
diff changeset
61 set_name_index(0);
3efdfd6ddbf2 8003553: NPG: metaspace objects should be zeroed in constructors
coleenp
parents: 8031
diff changeset
62 set_signature_index(0);
3efdfd6ddbf2 8003553: NPG: metaspace objects should be zeroed in constructors
coleenp
parents: 8031
diff changeset
63 set_constants(NULL);
3efdfd6ddbf2 8003553: NPG: metaspace objects should be zeroed in constructors
coleenp
parents: 8031
diff changeset
64 set_max_stack(0);
3efdfd6ddbf2 8003553: NPG: metaspace objects should be zeroed in constructors
coleenp
parents: 8031
diff changeset
65 set_max_locals(0);
3efdfd6ddbf2 8003553: NPG: metaspace objects should be zeroed in constructors
coleenp
parents: 8031
diff changeset
66 set_method_idnum(0);
8715
5939f5953b45 8009836: nsk/regression/b4222717 fails with empty stack trace
coleenp
parents: 8712
diff changeset
67 set_size_of_parameters(0);
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6213
diff changeset
68 }
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6213
diff changeset
69
8719
c8b31b461e1a 8003419: NPG: Clean up metadata created during class loading if failure
coleenp
parents: 8715
diff changeset
70 // Accessor that copies to metadata.
c8b31b461e1a 8003419: NPG: Clean up metadata created during class loading if failure
coleenp
parents: 8715
diff changeset
71 void ConstMethod::copy_stackmap_data(ClassLoaderData* loader_data,
c8b31b461e1a 8003419: NPG: Clean up metadata created during class loading if failure
coleenp
parents: 8715
diff changeset
72 u1* sd, int length, TRAPS) {
c8b31b461e1a 8003419: NPG: Clean up metadata created during class loading if failure
coleenp
parents: 8715
diff changeset
73 _stackmap_data = MetadataFactory::new_array<u1>(loader_data, length, CHECK);
c8b31b461e1a 8003419: NPG: Clean up metadata created during class loading if failure
coleenp
parents: 8715
diff changeset
74 memcpy((void*)_stackmap_data->adr_at(0), (void*)sd, length);
c8b31b461e1a 8003419: NPG: Clean up metadata created during class loading if failure
coleenp
parents: 8715
diff changeset
75 }
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6213
diff changeset
76
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6213
diff changeset
77 // Deallocate metadata fields associated with ConstMethod*
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6213
diff changeset
78 void ConstMethod::deallocate_contents(ClassLoaderData* loader_data) {
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6213
diff changeset
79 if (stackmap_data() != NULL) {
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6213
diff changeset
80 MetadataFactory::free_array<u1>(loader_data, stackmap_data());
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6213
diff changeset
81 }
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6213
diff changeset
82 set_stackmap_data(NULL);
8031
927a311d00f9 8007320: NPG: move method annotations
coleenp
parents: 7956
diff changeset
83
927a311d00f9 8007320: NPG: move method annotations
coleenp
parents: 7956
diff changeset
84 // deallocate annotation arrays
927a311d00f9 8007320: NPG: move method annotations
coleenp
parents: 7956
diff changeset
85 if (has_method_annotations())
927a311d00f9 8007320: NPG: move method annotations
coleenp
parents: 7956
diff changeset
86 MetadataFactory::free_array<u1>(loader_data, method_annotations());
927a311d00f9 8007320: NPG: move method annotations
coleenp
parents: 7956
diff changeset
87 if (has_parameter_annotations())
927a311d00f9 8007320: NPG: move method annotations
coleenp
parents: 7956
diff changeset
88 MetadataFactory::free_array<u1>(loader_data, parameter_annotations());
927a311d00f9 8007320: NPG: move method annotations
coleenp
parents: 7956
diff changeset
89 if (has_type_annotations())
927a311d00f9 8007320: NPG: move method annotations
coleenp
parents: 7956
diff changeset
90 MetadataFactory::free_array<u1>(loader_data, type_annotations());
927a311d00f9 8007320: NPG: move method annotations
coleenp
parents: 7956
diff changeset
91 if (has_default_annotations())
927a311d00f9 8007320: NPG: move method annotations
coleenp
parents: 7956
diff changeset
92 MetadataFactory::free_array<u1>(loader_data, default_annotations());
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6213
diff changeset
93 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
94
a61af66fc99e Initial load
duke
parents:
diff changeset
95 // How big must this constMethodObject be?
a61af66fc99e Initial load
duke
parents:
diff changeset
96
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6213
diff changeset
97 int ConstMethod::size(int code_size,
8031
927a311d00f9 8007320: NPG: move method annotations
coleenp
parents: 7956
diff changeset
98 InlineTableSizes* sizes) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
99 int extra_bytes = code_size;
8031
927a311d00f9 8007320: NPG: move method annotations
coleenp
parents: 7956
diff changeset
100 if (sizes->compressed_linenumber_size() > 0) {
927a311d00f9 8007320: NPG: move method annotations
coleenp
parents: 7956
diff changeset
101 extra_bytes += sizes->compressed_linenumber_size();
0
a61af66fc99e Initial load
duke
parents:
diff changeset
102 }
8031
927a311d00f9 8007320: NPG: move method annotations
coleenp
parents: 7956
diff changeset
103 if (sizes->checked_exceptions_length() > 0) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
104 extra_bytes += sizeof(u2);
8031
927a311d00f9 8007320: NPG: move method annotations
coleenp
parents: 7956
diff changeset
105 extra_bytes += sizes->checked_exceptions_length() * sizeof(CheckedExceptionElement);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
106 }
8031
927a311d00f9 8007320: NPG: move method annotations
coleenp
parents: 7956
diff changeset
107 if (sizes->localvariable_table_length() > 0) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
108 extra_bytes += sizeof(u2);
a61af66fc99e Initial load
duke
parents:
diff changeset
109 extra_bytes +=
8031
927a311d00f9 8007320: NPG: move method annotations
coleenp
parents: 7956
diff changeset
110 sizes->localvariable_table_length() * sizeof(LocalVariableTableElement);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
111 }
8031
927a311d00f9 8007320: NPG: move method annotations
coleenp
parents: 7956
diff changeset
112 if (sizes->exception_table_length() > 0) {
6213
8150fa46d2ed 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 6123
diff changeset
113 extra_bytes += sizeof(u2);
8031
927a311d00f9 8007320: NPG: move method annotations
coleenp
parents: 7956
diff changeset
114 extra_bytes += sizes->exception_table_length() * sizeof(ExceptionTableElement);
6213
8150fa46d2ed 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 6123
diff changeset
115 }
8031
927a311d00f9 8007320: NPG: move method annotations
coleenp
parents: 7956
diff changeset
116 if (sizes->generic_signature_index() != 0) {
7183
b2dbd323c668 8003848: Make ConstMethod::generic_signature_index optional and move Method::_max_stack to ConstMethod.
jiangli
parents: 6940
diff changeset
117 extra_bytes += sizeof(u2);
b2dbd323c668 8003848: Make ConstMethod::generic_signature_index optional and move Method::_max_stack to ConstMethod.
jiangli
parents: 6940
diff changeset
118 }
8031
927a311d00f9 8007320: NPG: move method annotations
coleenp
parents: 7956
diff changeset
119 if (sizes->method_parameters_length() > 0) {
7462
ade95d680b42 8004728: Add hotspot support for parameter reflection
coleenp
parents: 7183
diff changeset
120 extra_bytes += sizeof(u2);
8031
927a311d00f9 8007320: NPG: move method annotations
coleenp
parents: 7956
diff changeset
121 extra_bytes += sizes->method_parameters_length() * sizeof(MethodParametersElement);
927a311d00f9 8007320: NPG: move method annotations
coleenp
parents: 7956
diff changeset
122 }
927a311d00f9 8007320: NPG: move method annotations
coleenp
parents: 7956
diff changeset
123
927a311d00f9 8007320: NPG: move method annotations
coleenp
parents: 7956
diff changeset
124 // Align sizes up to a word.
927a311d00f9 8007320: NPG: move method annotations
coleenp
parents: 7956
diff changeset
125 extra_bytes = align_size_up(extra_bytes, BytesPerWord);
927a311d00f9 8007320: NPG: move method annotations
coleenp
parents: 7956
diff changeset
126
927a311d00f9 8007320: NPG: move method annotations
coleenp
parents: 7956
diff changeset
127 // One pointer per annotation array
927a311d00f9 8007320: NPG: move method annotations
coleenp
parents: 7956
diff changeset
128 if (sizes->method_annotations_length() > 0) {
927a311d00f9 8007320: NPG: move method annotations
coleenp
parents: 7956
diff changeset
129 extra_bytes += sizeof(AnnotationArray*);
7462
ade95d680b42 8004728: Add hotspot support for parameter reflection
coleenp
parents: 7183
diff changeset
130 }
8031
927a311d00f9 8007320: NPG: move method annotations
coleenp
parents: 7956
diff changeset
131 if (sizes->parameter_annotations_length() > 0) {
927a311d00f9 8007320: NPG: move method annotations
coleenp
parents: 7956
diff changeset
132 extra_bytes += sizeof(AnnotationArray*);
927a311d00f9 8007320: NPG: move method annotations
coleenp
parents: 7956
diff changeset
133 }
927a311d00f9 8007320: NPG: move method annotations
coleenp
parents: 7956
diff changeset
134 if (sizes->type_annotations_length() > 0) {
927a311d00f9 8007320: NPG: move method annotations
coleenp
parents: 7956
diff changeset
135 extra_bytes += sizeof(AnnotationArray*);
927a311d00f9 8007320: NPG: move method annotations
coleenp
parents: 7956
diff changeset
136 }
927a311d00f9 8007320: NPG: move method annotations
coleenp
parents: 7956
diff changeset
137 if (sizes->default_annotations_length() > 0) {
927a311d00f9 8007320: NPG: move method annotations
coleenp
parents: 7956
diff changeset
138 extra_bytes += sizeof(AnnotationArray*);
927a311d00f9 8007320: NPG: move method annotations
coleenp
parents: 7956
diff changeset
139 }
927a311d00f9 8007320: NPG: move method annotations
coleenp
parents: 7956
diff changeset
140
0
a61af66fc99e Initial load
duke
parents:
diff changeset
141 int extra_words = align_size_up(extra_bytes, BytesPerWord) / BytesPerWord;
8031
927a311d00f9 8007320: NPG: move method annotations
coleenp
parents: 7956
diff changeset
142 assert(extra_words == extra_bytes/BytesPerWord, "should already be aligned");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
143 return align_object_size(header_size() + extra_words);
a61af66fc99e Initial load
duke
parents:
diff changeset
144 }
a61af66fc99e Initial load
duke
parents:
diff changeset
145
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6213
diff changeset
146 Method* ConstMethod::method() const {
6940
18fb7da42534 8000725: NPG: method_holder() and pool_holder() and pool_holder field should be InstanceKlass
coleenp
parents: 6934
diff changeset
147 return _constants->pool_holder()->method_with_idnum(_method_idnum);
6123
2fe087c3e814 7172967: Eliminate constMethod's _method backpointer to methodOop.
jiangli
parents: 1972
diff changeset
148 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
149
a61af66fc99e Initial load
duke
parents:
diff changeset
150 // linenumber table - note that length is unknown until decompression,
a61af66fc99e Initial load
duke
parents:
diff changeset
151 // see class CompressedLineNumberReadStream.
a61af66fc99e Initial load
duke
parents:
diff changeset
152
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6213
diff changeset
153 u_char* ConstMethod::compressed_linenumber_table() const {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
154 // Located immediately following the bytecodes.
a61af66fc99e Initial load
duke
parents:
diff changeset
155 assert(has_linenumber_table(), "called only if table is present");
a61af66fc99e Initial load
duke
parents:
diff changeset
156 return code_end();
a61af66fc99e Initial load
duke
parents:
diff changeset
157 }
a61af66fc99e Initial load
duke
parents:
diff changeset
158
8031
927a311d00f9 8007320: NPG: move method annotations
coleenp
parents: 7956
diff changeset
159 // Last short in ConstMethod* before annotations
927a311d00f9 8007320: NPG: move method annotations
coleenp
parents: 7956
diff changeset
160 u2* ConstMethod::last_u2_element() const {
927a311d00f9 8007320: NPG: move method annotations
coleenp
parents: 7956
diff changeset
161 int offset = 0;
927a311d00f9 8007320: NPG: move method annotations
coleenp
parents: 7956
diff changeset
162 if (has_method_annotations()) offset++;
927a311d00f9 8007320: NPG: move method annotations
coleenp
parents: 7956
diff changeset
163 if (has_parameter_annotations()) offset++;
927a311d00f9 8007320: NPG: move method annotations
coleenp
parents: 7956
diff changeset
164 if (has_type_annotations()) offset++;
927a311d00f9 8007320: NPG: move method annotations
coleenp
parents: 7956
diff changeset
165 if (has_default_annotations()) offset++;
927a311d00f9 8007320: NPG: move method annotations
coleenp
parents: 7956
diff changeset
166 return (u2*)((AnnotationArray**)constMethod_end() - offset) - 1;
927a311d00f9 8007320: NPG: move method annotations
coleenp
parents: 7956
diff changeset
167 }
927a311d00f9 8007320: NPG: move method annotations
coleenp
parents: 7956
diff changeset
168
7183
b2dbd323c668 8003848: Make ConstMethod::generic_signature_index optional and move Method::_max_stack to ConstMethod.
jiangli
parents: 6940
diff changeset
169 u2* ConstMethod::generic_signature_index_addr() const {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
170 // Located at the end of the constMethod.
7183
b2dbd323c668 8003848: Make ConstMethod::generic_signature_index optional and move Method::_max_stack to ConstMethod.
jiangli
parents: 6940
diff changeset
171 assert(has_generic_signature(), "called only if generic signature exists");
b2dbd323c668 8003848: Make ConstMethod::generic_signature_index optional and move Method::_max_stack to ConstMethod.
jiangli
parents: 6940
diff changeset
172 return last_u2_element();
b2dbd323c668 8003848: Make ConstMethod::generic_signature_index optional and move Method::_max_stack to ConstMethod.
jiangli
parents: 6940
diff changeset
173 }
b2dbd323c668 8003848: Make ConstMethod::generic_signature_index optional and move Method::_max_stack to ConstMethod.
jiangli
parents: 6940
diff changeset
174
8031
927a311d00f9 8007320: NPG: move method annotations
coleenp
parents: 7956
diff changeset
175 u2* ConstMethod::method_parameters_length_addr() const {
927a311d00f9 8007320: NPG: move method annotations
coleenp
parents: 7956
diff changeset
176 assert(has_method_parameters(), "called only if table is present");
927a311d00f9 8007320: NPG: move method annotations
coleenp
parents: 7956
diff changeset
177 return has_generic_signature() ? (last_u2_element() - 1) :
927a311d00f9 8007320: NPG: move method annotations
coleenp
parents: 7956
diff changeset
178 last_u2_element();
927a311d00f9 8007320: NPG: move method annotations
coleenp
parents: 7956
diff changeset
179 }
927a311d00f9 8007320: NPG: move method annotations
coleenp
parents: 7956
diff changeset
180
7183
b2dbd323c668 8003848: Make ConstMethod::generic_signature_index optional and move Method::_max_stack to ConstMethod.
jiangli
parents: 6940
diff changeset
181 u2* ConstMethod::checked_exceptions_length_addr() const {
b2dbd323c668 8003848: Make ConstMethod::generic_signature_index optional and move Method::_max_stack to ConstMethod.
jiangli
parents: 6940
diff changeset
182 // Located immediately before the generic signature index.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
183 assert(has_checked_exceptions(), "called only if table is present");
7462
ade95d680b42 8004728: Add hotspot support for parameter reflection
coleenp
parents: 7183
diff changeset
184 if(has_method_parameters()) {
ade95d680b42 8004728: Add hotspot support for parameter reflection
coleenp
parents: 7183
diff changeset
185 // If method parameters present, locate immediately before them.
ade95d680b42 8004728: Add hotspot support for parameter reflection
coleenp
parents: 7183
diff changeset
186 return (u2*)method_parameters_start() - 1;
ade95d680b42 8004728: Add hotspot support for parameter reflection
coleenp
parents: 7183
diff changeset
187 } else {
ade95d680b42 8004728: Add hotspot support for parameter reflection
coleenp
parents: 7183
diff changeset
188 // Else, the exception table is at the end of the constMethod.
ade95d680b42 8004728: Add hotspot support for parameter reflection
coleenp
parents: 7183
diff changeset
189 return has_generic_signature() ? (last_u2_element() - 1) :
ade95d680b42 8004728: Add hotspot support for parameter reflection
coleenp
parents: 7183
diff changeset
190 last_u2_element();
ade95d680b42 8004728: Add hotspot support for parameter reflection
coleenp
parents: 7183
diff changeset
191 }
ade95d680b42 8004728: Add hotspot support for parameter reflection
coleenp
parents: 7183
diff changeset
192 }
ade95d680b42 8004728: Add hotspot support for parameter reflection
coleenp
parents: 7183
diff changeset
193
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6213
diff changeset
194 u2* ConstMethod::exception_table_length_addr() const {
6213
8150fa46d2ed 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 6123
diff changeset
195 assert(has_exception_handler(), "called only if table is present");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
196 if (has_checked_exceptions()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
197 // If checked_exception present, locate immediately before them.
a61af66fc99e Initial load
duke
parents:
diff changeset
198 return (u2*) checked_exceptions_start() - 1;
a61af66fc99e Initial load
duke
parents:
diff changeset
199 } else {
7462
ade95d680b42 8004728: Add hotspot support for parameter reflection
coleenp
parents: 7183
diff changeset
200 if(has_method_parameters()) {
ade95d680b42 8004728: Add hotspot support for parameter reflection
coleenp
parents: 7183
diff changeset
201 // If method parameters present, locate immediately before them.
ade95d680b42 8004728: Add hotspot support for parameter reflection
coleenp
parents: 7183
diff changeset
202 return (u2*)method_parameters_start() - 1;
ade95d680b42 8004728: Add hotspot support for parameter reflection
coleenp
parents: 7183
diff changeset
203 } else {
ade95d680b42 8004728: Add hotspot support for parameter reflection
coleenp
parents: 7183
diff changeset
204 // Else, the exception table is at the end of the constMethod.
8031
927a311d00f9 8007320: NPG: move method annotations
coleenp
parents: 7956
diff changeset
205 return has_generic_signature() ? (last_u2_element() - 1) :
927a311d00f9 8007320: NPG: move method annotations
coleenp
parents: 7956
diff changeset
206 last_u2_element();
927a311d00f9 8007320: NPG: move method annotations
coleenp
parents: 7956
diff changeset
207 }
7462
ade95d680b42 8004728: Add hotspot support for parameter reflection
coleenp
parents: 7183
diff changeset
208 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
209 }
a61af66fc99e Initial load
duke
parents:
diff changeset
210
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6213
diff changeset
211 u2* ConstMethod::localvariable_table_length_addr() const {
6213
8150fa46d2ed 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 6123
diff changeset
212 assert(has_localvariable_table(), "called only if table is present");
8150fa46d2ed 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 6123
diff changeset
213 if (has_exception_handler()) {
8150fa46d2ed 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 6123
diff changeset
214 // If exception_table present, locate immediately before them.
8150fa46d2ed 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 6123
diff changeset
215 return (u2*) exception_table_start() - 1;
8150fa46d2ed 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 6123
diff changeset
216 } else {
8150fa46d2ed 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 6123
diff changeset
217 if (has_checked_exceptions()) {
8150fa46d2ed 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 6123
diff changeset
218 // If checked_exception present, locate immediately before them.
8150fa46d2ed 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 6123
diff changeset
219 return (u2*) checked_exceptions_start() - 1;
8150fa46d2ed 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 6123
diff changeset
220 } else {
7462
ade95d680b42 8004728: Add hotspot support for parameter reflection
coleenp
parents: 7183
diff changeset
221 if(has_method_parameters()) {
ade95d680b42 8004728: Add hotspot support for parameter reflection
coleenp
parents: 7183
diff changeset
222 // If method parameters present, locate immediately before them.
ade95d680b42 8004728: Add hotspot support for parameter reflection
coleenp
parents: 7183
diff changeset
223 return (u2*)method_parameters_start() - 1;
ade95d680b42 8004728: Add hotspot support for parameter reflection
coleenp
parents: 7183
diff changeset
224 } else {
ade95d680b42 8004728: Add hotspot support for parameter reflection
coleenp
parents: 7183
diff changeset
225 // Else, the exception table is at the end of the constMethod.
7183
b2dbd323c668 8003848: Make ConstMethod::generic_signature_index optional and move Method::_max_stack to ConstMethod.
jiangli
parents: 6940
diff changeset
226 return has_generic_signature() ? (last_u2_element() - 1) :
b2dbd323c668 8003848: Make ConstMethod::generic_signature_index optional and move Method::_max_stack to ConstMethod.
jiangli
parents: 6940
diff changeset
227 last_u2_element();
8031
927a311d00f9 8007320: NPG: move method annotations
coleenp
parents: 7956
diff changeset
228 }
6213
8150fa46d2ed 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 6123
diff changeset
229 }
8150fa46d2ed 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 6123
diff changeset
230 }
8150fa46d2ed 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 6123
diff changeset
231 }
8150fa46d2ed 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 6123
diff changeset
232
0
a61af66fc99e Initial load
duke
parents:
diff changeset
233 // Update the flags to indicate the presence of these optional fields.
8031
927a311d00f9 8007320: NPG: move method annotations
coleenp
parents: 7956
diff changeset
234 void ConstMethod::set_inlined_tables_length(InlineTableSizes* sizes) {
927a311d00f9 8007320: NPG: move method annotations
coleenp
parents: 7956
diff changeset
235 _flags = 0;
927a311d00f9 8007320: NPG: move method annotations
coleenp
parents: 7956
diff changeset
236 if (sizes->compressed_linenumber_size() > 0)
0
a61af66fc99e Initial load
duke
parents:
diff changeset
237 _flags |= _has_linenumber_table;
8031
927a311d00f9 8007320: NPG: move method annotations
coleenp
parents: 7956
diff changeset
238 if (sizes->generic_signature_index() != 0)
7183
b2dbd323c668 8003848: Make ConstMethod::generic_signature_index optional and move Method::_max_stack to ConstMethod.
jiangli
parents: 6940
diff changeset
239 _flags |= _has_generic_signature;
8031
927a311d00f9 8007320: NPG: move method annotations
coleenp
parents: 7956
diff changeset
240 if (sizes->method_parameters_length() > 0)
7462
ade95d680b42 8004728: Add hotspot support for parameter reflection
coleenp
parents: 7183
diff changeset
241 _flags |= _has_method_parameters;
8031
927a311d00f9 8007320: NPG: move method annotations
coleenp
parents: 7956
diff changeset
242 if (sizes->checked_exceptions_length() > 0)
7462
ade95d680b42 8004728: Add hotspot support for parameter reflection
coleenp
parents: 7183
diff changeset
243 _flags |= _has_checked_exceptions;
8031
927a311d00f9 8007320: NPG: move method annotations
coleenp
parents: 7956
diff changeset
244 if (sizes->exception_table_length() > 0)
7462
ade95d680b42 8004728: Add hotspot support for parameter reflection
coleenp
parents: 7183
diff changeset
245 _flags |= _has_exception_table;
8031
927a311d00f9 8007320: NPG: move method annotations
coleenp
parents: 7956
diff changeset
246 if (sizes->localvariable_table_length() > 0)
7462
ade95d680b42 8004728: Add hotspot support for parameter reflection
coleenp
parents: 7183
diff changeset
247 _flags |= _has_localvariable_table;
ade95d680b42 8004728: Add hotspot support for parameter reflection
coleenp
parents: 7183
diff changeset
248
8031
927a311d00f9 8007320: NPG: move method annotations
coleenp
parents: 7956
diff changeset
249 // annotations, they are all pointer sized embedded objects so don't have
927a311d00f9 8007320: NPG: move method annotations
coleenp
parents: 7956
diff changeset
250 // a length embedded also.
927a311d00f9 8007320: NPG: move method annotations
coleenp
parents: 7956
diff changeset
251 if (sizes->method_annotations_length() > 0)
927a311d00f9 8007320: NPG: move method annotations
coleenp
parents: 7956
diff changeset
252 _flags |= _has_method_annotations;
927a311d00f9 8007320: NPG: move method annotations
coleenp
parents: 7956
diff changeset
253 if (sizes->parameter_annotations_length() > 0)
927a311d00f9 8007320: NPG: move method annotations
coleenp
parents: 7956
diff changeset
254 _flags |= _has_parameter_annotations;
927a311d00f9 8007320: NPG: move method annotations
coleenp
parents: 7956
diff changeset
255 if (sizes->type_annotations_length() > 0)
927a311d00f9 8007320: NPG: move method annotations
coleenp
parents: 7956
diff changeset
256 _flags |= _has_type_annotations;
927a311d00f9 8007320: NPG: move method annotations
coleenp
parents: 7956
diff changeset
257 if (sizes->default_annotations_length() > 0)
927a311d00f9 8007320: NPG: move method annotations
coleenp
parents: 7956
diff changeset
258 _flags |= _has_default_annotations;
927a311d00f9 8007320: NPG: move method annotations
coleenp
parents: 7956
diff changeset
259
7462
ade95d680b42 8004728: Add hotspot support for parameter reflection
coleenp
parents: 7183
diff changeset
260 // This code is extremely brittle and should possibly be revised.
ade95d680b42 8004728: Add hotspot support for parameter reflection
coleenp
parents: 7183
diff changeset
261 // The *_length_addr functions walk backwards through the
ade95d680b42 8004728: Add hotspot support for parameter reflection
coleenp
parents: 7183
diff changeset
262 // constMethod data, using each of the length indexes ahead of them,
ade95d680b42 8004728: Add hotspot support for parameter reflection
coleenp
parents: 7183
diff changeset
263 // as well as the flags variable. Therefore, the indexes must be
ade95d680b42 8004728: Add hotspot support for parameter reflection
coleenp
parents: 7183
diff changeset
264 // initialized in reverse order, or else they will compute the wrong
ade95d680b42 8004728: Add hotspot support for parameter reflection
coleenp
parents: 7183
diff changeset
265 // offsets. Moving the initialization of _flags into a separate
ade95d680b42 8004728: Add hotspot support for parameter reflection
coleenp
parents: 7183
diff changeset
266 // block solves *half* of the problem, but the following part will
ade95d680b42 8004728: Add hotspot support for parameter reflection
coleenp
parents: 7183
diff changeset
267 // still break if the order is not exactly right.
ade95d680b42 8004728: Add hotspot support for parameter reflection
coleenp
parents: 7183
diff changeset
268 //
ade95d680b42 8004728: Add hotspot support for parameter reflection
coleenp
parents: 7183
diff changeset
269 // Also, the servicability agent needs to be informed anytime
ade95d680b42 8004728: Add hotspot support for parameter reflection
coleenp
parents: 7183
diff changeset
270 // anything is added here. It might be advisable to have some sort
ade95d680b42 8004728: Add hotspot support for parameter reflection
coleenp
parents: 7183
diff changeset
271 // of indication of this inline.
8031
927a311d00f9 8007320: NPG: move method annotations
coleenp
parents: 7956
diff changeset
272 if (sizes->generic_signature_index() != 0)
927a311d00f9 8007320: NPG: move method annotations
coleenp
parents: 7956
diff changeset
273 *(generic_signature_index_addr()) = sizes->generic_signature_index();
7462
ade95d680b42 8004728: Add hotspot support for parameter reflection
coleenp
parents: 7183
diff changeset
274 // New data should probably go here.
8031
927a311d00f9 8007320: NPG: move method annotations
coleenp
parents: 7956
diff changeset
275 if (sizes->method_parameters_length() > 0)
927a311d00f9 8007320: NPG: move method annotations
coleenp
parents: 7956
diff changeset
276 *(method_parameters_length_addr()) = sizes->method_parameters_length();
927a311d00f9 8007320: NPG: move method annotations
coleenp
parents: 7956
diff changeset
277 if (sizes->checked_exceptions_length() > 0)
927a311d00f9 8007320: NPG: move method annotations
coleenp
parents: 7956
diff changeset
278 *(checked_exceptions_length_addr()) = sizes->checked_exceptions_length();
927a311d00f9 8007320: NPG: move method annotations
coleenp
parents: 7956
diff changeset
279 if (sizes->exception_table_length() > 0)
927a311d00f9 8007320: NPG: move method annotations
coleenp
parents: 7956
diff changeset
280 *(exception_table_length_addr()) = sizes->exception_table_length();
927a311d00f9 8007320: NPG: move method annotations
coleenp
parents: 7956
diff changeset
281 if (sizes->localvariable_table_length() > 0)
927a311d00f9 8007320: NPG: move method annotations
coleenp
parents: 7956
diff changeset
282 *(localvariable_table_length_addr()) = sizes->localvariable_table_length();
7462
ade95d680b42 8004728: Add hotspot support for parameter reflection
coleenp
parents: 7183
diff changeset
283 }
ade95d680b42 8004728: Add hotspot support for parameter reflection
coleenp
parents: 7183
diff changeset
284
ade95d680b42 8004728: Add hotspot support for parameter reflection
coleenp
parents: 7183
diff changeset
285 int ConstMethod::method_parameters_length() const {
ade95d680b42 8004728: Add hotspot support for parameter reflection
coleenp
parents: 7183
diff changeset
286 return has_method_parameters() ? *(method_parameters_length_addr()) : 0;
ade95d680b42 8004728: Add hotspot support for parameter reflection
coleenp
parents: 7183
diff changeset
287 }
ade95d680b42 8004728: Add hotspot support for parameter reflection
coleenp
parents: 7183
diff changeset
288
ade95d680b42 8004728: Add hotspot support for parameter reflection
coleenp
parents: 7183
diff changeset
289 MethodParametersElement* ConstMethod::method_parameters_start() const {
ade95d680b42 8004728: Add hotspot support for parameter reflection
coleenp
parents: 7183
diff changeset
290 u2* addr = method_parameters_length_addr();
ade95d680b42 8004728: Add hotspot support for parameter reflection
coleenp
parents: 7183
diff changeset
291 u2 length = *addr;
ade95d680b42 8004728: Add hotspot support for parameter reflection
coleenp
parents: 7183
diff changeset
292 assert(length > 0, "should only be called if table is present");
ade95d680b42 8004728: Add hotspot support for parameter reflection
coleenp
parents: 7183
diff changeset
293 addr -= length * sizeof(MethodParametersElement) / sizeof(u2);
ade95d680b42 8004728: Add hotspot support for parameter reflection
coleenp
parents: 7183
diff changeset
294 return (MethodParametersElement*) addr;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
295 }
a61af66fc99e Initial load
duke
parents:
diff changeset
296
a61af66fc99e Initial load
duke
parents:
diff changeset
297
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6213
diff changeset
298 int ConstMethod::checked_exceptions_length() const {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
299 return has_checked_exceptions() ? *(checked_exceptions_length_addr()) : 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
300 }
a61af66fc99e Initial load
duke
parents:
diff changeset
301
a61af66fc99e Initial load
duke
parents:
diff changeset
302
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6213
diff changeset
303 CheckedExceptionElement* ConstMethod::checked_exceptions_start() const {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
304 u2* addr = checked_exceptions_length_addr();
a61af66fc99e Initial load
duke
parents:
diff changeset
305 u2 length = *addr;
a61af66fc99e Initial load
duke
parents:
diff changeset
306 assert(length > 0, "should only be called if table is present");
a61af66fc99e Initial load
duke
parents:
diff changeset
307 addr -= length * sizeof(CheckedExceptionElement) / sizeof(u2);
a61af66fc99e Initial load
duke
parents:
diff changeset
308 return (CheckedExceptionElement*) addr;
a61af66fc99e Initial load
duke
parents:
diff changeset
309 }
a61af66fc99e Initial load
duke
parents:
diff changeset
310
a61af66fc99e Initial load
duke
parents:
diff changeset
311
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6213
diff changeset
312 int ConstMethod::localvariable_table_length() const {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
313 return has_localvariable_table() ? *(localvariable_table_length_addr()) : 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
314 }
a61af66fc99e Initial load
duke
parents:
diff changeset
315
a61af66fc99e Initial load
duke
parents:
diff changeset
316
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6213
diff changeset
317 LocalVariableTableElement* ConstMethod::localvariable_table_start() const {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
318 u2* addr = localvariable_table_length_addr();
a61af66fc99e Initial load
duke
parents:
diff changeset
319 u2 length = *addr;
a61af66fc99e Initial load
duke
parents:
diff changeset
320 assert(length > 0, "should only be called if table is present");
a61af66fc99e Initial load
duke
parents:
diff changeset
321 addr -= length * sizeof(LocalVariableTableElement) / sizeof(u2);
a61af66fc99e Initial load
duke
parents:
diff changeset
322 return (LocalVariableTableElement*) addr;
a61af66fc99e Initial load
duke
parents:
diff changeset
323 }
6213
8150fa46d2ed 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 6123
diff changeset
324
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6213
diff changeset
325 int ConstMethod::exception_table_length() const {
6213
8150fa46d2ed 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 6123
diff changeset
326 return has_exception_handler() ? *(exception_table_length_addr()) : 0;
8150fa46d2ed 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 6123
diff changeset
327 }
8150fa46d2ed 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 6123
diff changeset
328
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6213
diff changeset
329 ExceptionTableElement* ConstMethod::exception_table_start() const {
6213
8150fa46d2ed 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 6123
diff changeset
330 u2* addr = exception_table_length_addr();
8150fa46d2ed 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 6123
diff changeset
331 u2 length = *addr;
8150fa46d2ed 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 6123
diff changeset
332 assert(length > 0, "should only be called if table is present");
8150fa46d2ed 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 6123
diff changeset
333 addr -= length * sizeof(ExceptionTableElement) / sizeof(u2);
8150fa46d2ed 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 6123
diff changeset
334 return (ExceptionTableElement*)addr;
8150fa46d2ed 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 6123
diff changeset
335 }
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6213
diff changeset
336
8031
927a311d00f9 8007320: NPG: move method annotations
coleenp
parents: 7956
diff changeset
337 AnnotationArray** ConstMethod::method_annotations_addr() const {
927a311d00f9 8007320: NPG: move method annotations
coleenp
parents: 7956
diff changeset
338 assert(has_method_annotations(), "should only be called if method annotations are present");
927a311d00f9 8007320: NPG: move method annotations
coleenp
parents: 7956
diff changeset
339 return (AnnotationArray**)constMethod_end() - 1;
927a311d00f9 8007320: NPG: move method annotations
coleenp
parents: 7956
diff changeset
340 }
927a311d00f9 8007320: NPG: move method annotations
coleenp
parents: 7956
diff changeset
341
927a311d00f9 8007320: NPG: move method annotations
coleenp
parents: 7956
diff changeset
342 AnnotationArray** ConstMethod::parameter_annotations_addr() const {
927a311d00f9 8007320: NPG: move method annotations
coleenp
parents: 7956
diff changeset
343 assert(has_parameter_annotations(), "should only be called if method parameter annotations are present");
927a311d00f9 8007320: NPG: move method annotations
coleenp
parents: 7956
diff changeset
344 int offset = 1;
927a311d00f9 8007320: NPG: move method annotations
coleenp
parents: 7956
diff changeset
345 if (has_method_annotations()) offset++;
927a311d00f9 8007320: NPG: move method annotations
coleenp
parents: 7956
diff changeset
346 return (AnnotationArray**)constMethod_end() - offset;
927a311d00f9 8007320: NPG: move method annotations
coleenp
parents: 7956
diff changeset
347 }
927a311d00f9 8007320: NPG: move method annotations
coleenp
parents: 7956
diff changeset
348
927a311d00f9 8007320: NPG: move method annotations
coleenp
parents: 7956
diff changeset
349 AnnotationArray** ConstMethod::type_annotations_addr() const {
927a311d00f9 8007320: NPG: move method annotations
coleenp
parents: 7956
diff changeset
350 assert(has_type_annotations(), "should only be called if method type annotations are present");
927a311d00f9 8007320: NPG: move method annotations
coleenp
parents: 7956
diff changeset
351 int offset = 1;
927a311d00f9 8007320: NPG: move method annotations
coleenp
parents: 7956
diff changeset
352 if (has_method_annotations()) offset++;
927a311d00f9 8007320: NPG: move method annotations
coleenp
parents: 7956
diff changeset
353 if (has_parameter_annotations()) offset++;
927a311d00f9 8007320: NPG: move method annotations
coleenp
parents: 7956
diff changeset
354 return (AnnotationArray**)constMethod_end() - offset;
927a311d00f9 8007320: NPG: move method annotations
coleenp
parents: 7956
diff changeset
355 }
927a311d00f9 8007320: NPG: move method annotations
coleenp
parents: 7956
diff changeset
356
927a311d00f9 8007320: NPG: move method annotations
coleenp
parents: 7956
diff changeset
357 AnnotationArray** ConstMethod::default_annotations_addr() const {
927a311d00f9 8007320: NPG: move method annotations
coleenp
parents: 7956
diff changeset
358 assert(has_default_annotations(), "should only be called if method default annotations are present");
927a311d00f9 8007320: NPG: move method annotations
coleenp
parents: 7956
diff changeset
359 int offset = 1;
927a311d00f9 8007320: NPG: move method annotations
coleenp
parents: 7956
diff changeset
360 if (has_method_annotations()) offset++;
927a311d00f9 8007320: NPG: move method annotations
coleenp
parents: 7956
diff changeset
361 if (has_parameter_annotations()) offset++;
927a311d00f9 8007320: NPG: move method annotations
coleenp
parents: 7956
diff changeset
362 if (has_type_annotations()) offset++;
927a311d00f9 8007320: NPG: move method annotations
coleenp
parents: 7956
diff changeset
363 return (AnnotationArray**)constMethod_end() - offset;
927a311d00f9 8007320: NPG: move method annotations
coleenp
parents: 7956
diff changeset
364 }
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6213
diff changeset
365
8837
0c3ee6f1fa23 8009531: Crash when redefining class with annotated method
coleenp
parents: 8719
diff changeset
366 // copy annotations from 'cm' to 'this'
0c3ee6f1fa23 8009531: Crash when redefining class with annotated method
coleenp
parents: 8719
diff changeset
367 void ConstMethod::copy_annotations_from(ConstMethod* cm) {
0c3ee6f1fa23 8009531: Crash when redefining class with annotated method
coleenp
parents: 8719
diff changeset
368 if (cm->has_method_annotations()) {
0c3ee6f1fa23 8009531: Crash when redefining class with annotated method
coleenp
parents: 8719
diff changeset
369 assert(has_method_annotations(), "should be allocated already");
0c3ee6f1fa23 8009531: Crash when redefining class with annotated method
coleenp
parents: 8719
diff changeset
370 set_method_annotations(cm->method_annotations());
0c3ee6f1fa23 8009531: Crash when redefining class with annotated method
coleenp
parents: 8719
diff changeset
371 }
0c3ee6f1fa23 8009531: Crash when redefining class with annotated method
coleenp
parents: 8719
diff changeset
372 if (cm->has_parameter_annotations()) {
0c3ee6f1fa23 8009531: Crash when redefining class with annotated method
coleenp
parents: 8719
diff changeset
373 assert(has_parameter_annotations(), "should be allocated already");
0c3ee6f1fa23 8009531: Crash when redefining class with annotated method
coleenp
parents: 8719
diff changeset
374 set_parameter_annotations(cm->parameter_annotations());
0c3ee6f1fa23 8009531: Crash when redefining class with annotated method
coleenp
parents: 8719
diff changeset
375 }
0c3ee6f1fa23 8009531: Crash when redefining class with annotated method
coleenp
parents: 8719
diff changeset
376 if (cm->has_type_annotations()) {
0c3ee6f1fa23 8009531: Crash when redefining class with annotated method
coleenp
parents: 8719
diff changeset
377 assert(has_type_annotations(), "should be allocated already");
0c3ee6f1fa23 8009531: Crash when redefining class with annotated method
coleenp
parents: 8719
diff changeset
378 set_type_annotations(cm->type_annotations());
0c3ee6f1fa23 8009531: Crash when redefining class with annotated method
coleenp
parents: 8719
diff changeset
379 }
0c3ee6f1fa23 8009531: Crash when redefining class with annotated method
coleenp
parents: 8719
diff changeset
380 if (cm->has_default_annotations()) {
0c3ee6f1fa23 8009531: Crash when redefining class with annotated method
coleenp
parents: 8719
diff changeset
381 assert(has_default_annotations(), "should be allocated already");
0c3ee6f1fa23 8009531: Crash when redefining class with annotated method
coleenp
parents: 8719
diff changeset
382 set_default_annotations(cm->default_annotations());
0c3ee6f1fa23 8009531: Crash when redefining class with annotated method
coleenp
parents: 8719
diff changeset
383 }
0c3ee6f1fa23 8009531: Crash when redefining class with annotated method
coleenp
parents: 8719
diff changeset
384 }
0c3ee6f1fa23 8009531: Crash when redefining class with annotated method
coleenp
parents: 8719
diff changeset
385
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6213
diff changeset
386 // Printing
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6213
diff changeset
387
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6213
diff changeset
388 void ConstMethod::print_on(outputStream* st) const {
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6213
diff changeset
389 ResourceMark rm;
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6213
diff changeset
390 assert(is_constMethod(), "must be constMethod");
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6213
diff changeset
391 st->print_cr(internal_name());
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6213
diff changeset
392 st->print(" - method: " INTPTR_FORMAT " ", (address)method());
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6213
diff changeset
393 method()->print_value_on(st); st->cr();
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6213
diff changeset
394 if (has_stackmap_table()) {
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6213
diff changeset
395 st->print(" - stackmap data: ");
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6213
diff changeset
396 stackmap_data()->print_value_on(st);
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6213
diff changeset
397 st->cr();
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6213
diff changeset
398 }
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6213
diff changeset
399 }
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6213
diff changeset
400
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6213
diff changeset
401 // Short version of printing ConstMethod* - just print the name of the
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6213
diff changeset
402 // method it belongs to.
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6213
diff changeset
403 void ConstMethod::print_value_on(outputStream* st) const {
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6213
diff changeset
404 assert(is_constMethod(), "must be constMethod");
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6213
diff changeset
405 st->print(" const part of method " );
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6213
diff changeset
406 method()->print_value_on(st);
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6213
diff changeset
407 }
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6213
diff changeset
408
7956
16fb9f942703 6479360: PrintClassHistogram improvements
acorn
parents: 7462
diff changeset
409 #if INCLUDE_SERVICES
16fb9f942703 6479360: PrintClassHistogram improvements
acorn
parents: 7462
diff changeset
410 // Size Statistics
16fb9f942703 6479360: PrintClassHistogram improvements
acorn
parents: 7462
diff changeset
411 void ConstMethod::collect_statistics(KlassSizeStats *sz) const {
16fb9f942703 6479360: PrintClassHistogram improvements
acorn
parents: 7462
diff changeset
412 int n1, n2, n3;
16fb9f942703 6479360: PrintClassHistogram improvements
acorn
parents: 7462
diff changeset
413 sz->_const_method_bytes += (n1 = sz->count(this));
16fb9f942703 6479360: PrintClassHistogram improvements
acorn
parents: 7462
diff changeset
414 sz->_bytecode_bytes += (n2 = code_size());
16fb9f942703 6479360: PrintClassHistogram improvements
acorn
parents: 7462
diff changeset
415 sz->_stackmap_bytes += (n3 = sz->count_array(stackmap_data()));
16fb9f942703 6479360: PrintClassHistogram improvements
acorn
parents: 7462
diff changeset
416
8031
927a311d00f9 8007320: NPG: move method annotations
coleenp
parents: 7956
diff changeset
417 // Count method annotations
927a311d00f9 8007320: NPG: move method annotations
coleenp
parents: 7956
diff changeset
418 int a1 = 0, a2 = 0, a3 = 0, a4 = 0;
927a311d00f9 8007320: NPG: move method annotations
coleenp
parents: 7956
diff changeset
419 if (has_method_annotations()) {
927a311d00f9 8007320: NPG: move method annotations
coleenp
parents: 7956
diff changeset
420 sz->_methods_annotations_bytes += (a1 = sz->count_array(method_annotations()));
927a311d00f9 8007320: NPG: move method annotations
coleenp
parents: 7956
diff changeset
421 }
927a311d00f9 8007320: NPG: move method annotations
coleenp
parents: 7956
diff changeset
422 if (has_parameter_annotations()) {
927a311d00f9 8007320: NPG: move method annotations
coleenp
parents: 7956
diff changeset
423 sz->_methods_parameter_annotations_bytes += (a2 = sz->count_array(parameter_annotations()));
927a311d00f9 8007320: NPG: move method annotations
coleenp
parents: 7956
diff changeset
424 }
927a311d00f9 8007320: NPG: move method annotations
coleenp
parents: 7956
diff changeset
425 if (has_type_annotations()) {
927a311d00f9 8007320: NPG: move method annotations
coleenp
parents: 7956
diff changeset
426 sz->_methods_type_annotations_bytes += (a3 = sz->count_array(type_annotations()));
927a311d00f9 8007320: NPG: move method annotations
coleenp
parents: 7956
diff changeset
427 }
927a311d00f9 8007320: NPG: move method annotations
coleenp
parents: 7956
diff changeset
428 if (has_default_annotations()) {
927a311d00f9 8007320: NPG: move method annotations
coleenp
parents: 7956
diff changeset
429 sz->_methods_default_annotations_bytes += (a4 = sz->count_array(default_annotations()));
927a311d00f9 8007320: NPG: move method annotations
coleenp
parents: 7956
diff changeset
430 }
927a311d00f9 8007320: NPG: move method annotations
coleenp
parents: 7956
diff changeset
431
927a311d00f9 8007320: NPG: move method annotations
coleenp
parents: 7956
diff changeset
432 int size_annotations = a1 + a2 + a3 + a4;
927a311d00f9 8007320: NPG: move method annotations
coleenp
parents: 7956
diff changeset
433
927a311d00f9 8007320: NPG: move method annotations
coleenp
parents: 7956
diff changeset
434 sz->_method_all_bytes += n1 + n3 + size_annotations; // note: n2 is part of n3
927a311d00f9 8007320: NPG: move method annotations
coleenp
parents: 7956
diff changeset
435 sz->_ro_bytes += n1 + n3 + size_annotations;
7956
16fb9f942703 6479360: PrintClassHistogram improvements
acorn
parents: 7462
diff changeset
436 }
16fb9f942703 6479360: PrintClassHistogram improvements
acorn
parents: 7462
diff changeset
437 #endif // INCLUDE_SERVICES
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6213
diff changeset
438
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6213
diff changeset
439 // Verification
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6213
diff changeset
440
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6213
diff changeset
441 void ConstMethod::verify_on(outputStream* st) {
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6213
diff changeset
442 guarantee(is_constMethod(), "object must be constMethod");
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6213
diff changeset
443 guarantee(is_metadata(), err_msg("Should be metadata " PTR_FORMAT, this));
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6213
diff changeset
444
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6213
diff changeset
445 // Verification can occur during oop construction before the method or
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6213
diff changeset
446 // other fields have been initialized.
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6213
diff changeset
447 guarantee(method()->is_method(), "should be method");
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6213
diff changeset
448
8031
927a311d00f9 8007320: NPG: move method annotations
coleenp
parents: 7956
diff changeset
449 address m_end = (address)((intptr_t) this + size());
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6213
diff changeset
450 address compressed_table_start = code_end();
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6213
diff changeset
451 guarantee(compressed_table_start <= m_end, "invalid method layout");
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6213
diff changeset
452 address compressed_table_end = compressed_table_start;
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6213
diff changeset
453 // Verify line number table
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6213
diff changeset
454 if (has_linenumber_table()) {
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6213
diff changeset
455 CompressedLineNumberReadStream stream(compressed_linenumber_table());
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6213
diff changeset
456 while (stream.read_pair()) {
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6213
diff changeset
457 guarantee(stream.bci() >= 0 && stream.bci() <= code_size(), "invalid bci in line number table");
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6213
diff changeset
458 }
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6213
diff changeset
459 compressed_table_end += stream.position();
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6213
diff changeset
460 }
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6213
diff changeset
461 guarantee(compressed_table_end <= m_end, "invalid method layout");
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6213
diff changeset
462 // Verify checked exceptions, exception table and local variable tables
7462
ade95d680b42 8004728: Add hotspot support for parameter reflection
coleenp
parents: 7183
diff changeset
463 if (has_method_parameters()) {
ade95d680b42 8004728: Add hotspot support for parameter reflection
coleenp
parents: 7183
diff changeset
464 u2* addr = method_parameters_length_addr();
ade95d680b42 8004728: Add hotspot support for parameter reflection
coleenp
parents: 7183
diff changeset
465 guarantee(*addr > 0 && (address) addr >= compressed_table_end && (address) addr < m_end, "invalid method layout");
ade95d680b42 8004728: Add hotspot support for parameter reflection
coleenp
parents: 7183
diff changeset
466 }
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6213
diff changeset
467 if (has_checked_exceptions()) {
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6213
diff changeset
468 u2* addr = checked_exceptions_length_addr();
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6213
diff changeset
469 guarantee(*addr > 0 && (address) addr >= compressed_table_end && (address) addr < m_end, "invalid method layout");
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6213
diff changeset
470 }
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6213
diff changeset
471 if (has_exception_handler()) {
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6213
diff changeset
472 u2* addr = exception_table_length_addr();
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6213
diff changeset
473 guarantee(*addr > 0 && (address) addr >= compressed_table_end && (address) addr < m_end, "invalid method layout");
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6213
diff changeset
474 }
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6213
diff changeset
475 if (has_localvariable_table()) {
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6213
diff changeset
476 u2* addr = localvariable_table_length_addr();
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6213
diff changeset
477 guarantee(*addr > 0 && (address) addr >= compressed_table_end && (address) addr < m_end, "invalid method layout");
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6213
diff changeset
478 }
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6213
diff changeset
479 // Check compressed_table_end relative to uncompressed_table_start
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6213
diff changeset
480 u2* uncompressed_table_start;
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6213
diff changeset
481 if (has_localvariable_table()) {
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6213
diff changeset
482 uncompressed_table_start = (u2*) localvariable_table_start();
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6213
diff changeset
483 } else if (has_exception_handler()) {
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6213
diff changeset
484 uncompressed_table_start = (u2*) exception_table_start();
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6213
diff changeset
485 } else if (has_checked_exceptions()) {
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6213
diff changeset
486 uncompressed_table_start = (u2*) checked_exceptions_start();
7462
ade95d680b42 8004728: Add hotspot support for parameter reflection
coleenp
parents: 7183
diff changeset
487 } else if (has_method_parameters()) {
ade95d680b42 8004728: Add hotspot support for parameter reflection
coleenp
parents: 7183
diff changeset
488 uncompressed_table_start = (u2*) method_parameters_start();
6725
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6213
diff changeset
489 } else {
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6213
diff changeset
490 uncompressed_table_start = (u2*) m_end;
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6213
diff changeset
491 }
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6213
diff changeset
492 int gap = (intptr_t) uncompressed_table_start - (intptr_t) compressed_table_end;
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6213
diff changeset
493 int max_gap = align_object_size(1)*BytesPerWord;
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6213
diff changeset
494 guarantee(gap >= 0 && gap < max_gap, "invalid method layout");
da91efe96a93 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 6213
diff changeset
495 }