Mercurial > hg > graal-compiler
annotate src/share/vm/classfile/classFileParser.hpp @ 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 | 9befe2fce567 |
children | cc70cbbd422e |
rev | line source |
---|---|
0 | 1 /* |
8031 | 2 * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. |
0 | 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
4 * | |
5 * This code is free software; you can redistribute it and/or modify it | |
6 * under the terms of the GNU General Public License version 2 only, as | |
7 * published by the Free Software Foundation. | |
8 * | |
9 * This code is distributed in the hope that it will be useful, but WITHOUT | |
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
12 * version 2 for more details (a copy is included in the LICENSE file that | |
13 * accompanied this code). | |
14 * | |
15 * You should have received a copy of the GNU General Public License version | |
16 * 2 along with this work; if not, write to the Free Software Foundation, | |
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. | |
18 * | |
1552
c18cbe5936b8
6941466: Oracle rebranding changes for Hotspot repositories
trims
parents:
974
diff
changeset
|
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
c18cbe5936b8
6941466: Oracle rebranding changes for Hotspot repositories
trims
parents:
974
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:
974
diff
changeset
|
21 * questions. |
0 | 22 * |
23 */ | |
24 | |
1972 | 25 #ifndef SHARE_VM_CLASSFILE_CLASSFILEPARSER_HPP |
26 #define SHARE_VM_CLASSFILE_CLASSFILEPARSER_HPP | |
27 | |
28 #include "classfile/classFileStream.hpp" | |
29 #include "memory/resourceArea.hpp" | |
30 #include "oops/oop.inline.hpp" | |
31 #include "oops/typeArrayOop.hpp" | |
32 #include "runtime/handles.inline.hpp" | |
33 #include "utilities/accessFlags.hpp" | |
6222
6d8f36bcef55
6711908: JVM needs direct access to some annotations
jrose
parents:
5983
diff
changeset
|
34 #include "classfile/symbolTable.hpp" |
1972 | 35 |
3938 | 36 class FieldAllocationCount; |
8719
c8b31b461e1a
8003419: NPG: Clean up metadata created during class loading if failure
coleenp
parents:
8031
diff
changeset
|
37 class FieldLayoutInfo; |
3938 | 38 |
39 | |
0 | 40 // Parser for for .class files |
41 // | |
42 // The bytes describing the class file structure is read from a Stream object | |
43 | |
44 class ClassFileParser VALUE_OBJ_CLASS_SPEC { | |
45 private: | |
46 bool _need_verify; | |
47 bool _relax_verify; | |
48 u2 _major_version; | |
49 u2 _minor_version; | |
2177
3582bf76420e
6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents:
2011
diff
changeset
|
50 Symbol* _class_name; |
8719
c8b31b461e1a
8003419: NPG: Clean up metadata created during class loading if failure
coleenp
parents:
8031
diff
changeset
|
51 ClassLoaderData* _loader_data; |
710 | 52 KlassHandle _host_klass; |
431
a45484ea312d
6653858: dynamic languages need to be able to load anonymous classes
jrose
parents:
0
diff
changeset
|
53 GrowableArray<Handle>* _cp_patches; // overrides for CP entries |
0 | 54 |
6222
6d8f36bcef55
6711908: JVM needs direct access to some annotations
jrose
parents:
5983
diff
changeset
|
55 // precomputed flags |
0 | 56 bool _has_finalizer; |
57 bool _has_empty_finalizer; | |
58 bool _has_vanilla_constructor; | |
6222
6d8f36bcef55
6711908: JVM needs direct access to some annotations
jrose
parents:
5983
diff
changeset
|
59 int _max_bootstrap_specifier_index; // detects BSS values |
0 | 60 |
6222
6d8f36bcef55
6711908: JVM needs direct access to some annotations
jrose
parents:
5983
diff
changeset
|
61 // class attributes parsed before the instance klass is created: |
6d8f36bcef55
6711908: JVM needs direct access to some annotations
jrose
parents:
5983
diff
changeset
|
62 bool _synthetic_flag; |
8719
c8b31b461e1a
8003419: NPG: Clean up metadata created during class loading if failure
coleenp
parents:
8031
diff
changeset
|
63 int _sde_length; |
c8b31b461e1a
8003419: NPG: Clean up metadata created during class loading if failure
coleenp
parents:
8031
diff
changeset
|
64 char* _sde_buffer; |
6222
6d8f36bcef55
6711908: JVM needs direct access to some annotations
jrose
parents:
5983
diff
changeset
|
65 Symbol* _sourcefile; |
6d8f36bcef55
6711908: JVM needs direct access to some annotations
jrose
parents:
5983
diff
changeset
|
66 Symbol* _generic_signature; |
8719
c8b31b461e1a
8003419: NPG: Clean up metadata created during class loading if failure
coleenp
parents:
8031
diff
changeset
|
67 |
c8b31b461e1a
8003419: NPG: Clean up metadata created during class loading if failure
coleenp
parents:
8031
diff
changeset
|
68 // Metadata created before the instance klass is created. Must be deallocated |
c8b31b461e1a
8003419: NPG: Clean up metadata created during class loading if failure
coleenp
parents:
8031
diff
changeset
|
69 // if not transferred to the InstanceKlass upon successful class loading |
c8b31b461e1a
8003419: NPG: Clean up metadata created during class loading if failure
coleenp
parents:
8031
diff
changeset
|
70 // in which case these pointers have been set to NULL. |
c8b31b461e1a
8003419: NPG: Clean up metadata created during class loading if failure
coleenp
parents:
8031
diff
changeset
|
71 instanceKlassHandle _super_klass; |
c8b31b461e1a
8003419: NPG: Clean up metadata created during class loading if failure
coleenp
parents:
8031
diff
changeset
|
72 ConstantPool* _cp; |
c8b31b461e1a
8003419: NPG: Clean up metadata created during class loading if failure
coleenp
parents:
8031
diff
changeset
|
73 Array<u2>* _fields; |
c8b31b461e1a
8003419: NPG: Clean up metadata created during class loading if failure
coleenp
parents:
8031
diff
changeset
|
74 Array<Method*>* _methods; |
c8b31b461e1a
8003419: NPG: Clean up metadata created during class loading if failure
coleenp
parents:
8031
diff
changeset
|
75 Array<u2>* _inner_classes; |
c8b31b461e1a
8003419: NPG: Clean up metadata created during class loading if failure
coleenp
parents:
8031
diff
changeset
|
76 Array<Klass*>* _local_interfaces; |
c8b31b461e1a
8003419: NPG: Clean up metadata created during class loading if failure
coleenp
parents:
8031
diff
changeset
|
77 Array<Klass*>* _transitive_interfaces; |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6266
diff
changeset
|
78 AnnotationArray* _annotations; |
7457
35431a769282
8004823: Add VM support for type annotation reflection
stefank
parents:
7185
diff
changeset
|
79 AnnotationArray* _type_annotations; |
8719
c8b31b461e1a
8003419: NPG: Clean up metadata created during class loading if failure
coleenp
parents:
8031
diff
changeset
|
80 Array<AnnotationArray*>* _fields_annotations; |
c8b31b461e1a
8003419: NPG: Clean up metadata created during class loading if failure
coleenp
parents:
8031
diff
changeset
|
81 Array<AnnotationArray*>* _fields_type_annotations; |
c8b31b461e1a
8003419: NPG: Clean up metadata created during class loading if failure
coleenp
parents:
8031
diff
changeset
|
82 InstanceKlass* _klass; // InstanceKlass once created. |
6222
6d8f36bcef55
6711908: JVM needs direct access to some annotations
jrose
parents:
5983
diff
changeset
|
83 |
6d8f36bcef55
6711908: JVM needs direct access to some annotations
jrose
parents:
5983
diff
changeset
|
84 void set_class_synthetic_flag(bool x) { _synthetic_flag = x; } |
6d8f36bcef55
6711908: JVM needs direct access to some annotations
jrose
parents:
5983
diff
changeset
|
85 void set_class_sourcefile(Symbol* x) { _sourcefile = x; } |
6d8f36bcef55
6711908: JVM needs direct access to some annotations
jrose
parents:
5983
diff
changeset
|
86 void set_class_generic_signature(Symbol* x) { _generic_signature = x; } |
6226 | 87 void set_class_sde_buffer(char* x, int len) { _sde_buffer = x; _sde_length = len; } |
8719
c8b31b461e1a
8003419: NPG: Clean up metadata created during class loading if failure
coleenp
parents:
8031
diff
changeset
|
88 |
c8b31b461e1a
8003419: NPG: Clean up metadata created during class loading if failure
coleenp
parents:
8031
diff
changeset
|
89 void init_parsed_class_attributes(ClassLoaderData* loader_data) { |
c8b31b461e1a
8003419: NPG: Clean up metadata created during class loading if failure
coleenp
parents:
8031
diff
changeset
|
90 _loader_data = loader_data; |
6222
6d8f36bcef55
6711908: JVM needs direct access to some annotations
jrose
parents:
5983
diff
changeset
|
91 _synthetic_flag = false; |
6d8f36bcef55
6711908: JVM needs direct access to some annotations
jrose
parents:
5983
diff
changeset
|
92 _sourcefile = NULL; |
6d8f36bcef55
6711908: JVM needs direct access to some annotations
jrose
parents:
5983
diff
changeset
|
93 _generic_signature = NULL; |
6226 | 94 _sde_buffer = NULL; |
95 _sde_length = 0; | |
6222
6d8f36bcef55
6711908: JVM needs direct access to some annotations
jrose
parents:
5983
diff
changeset
|
96 // initialize the other flags too: |
6d8f36bcef55
6711908: JVM needs direct access to some annotations
jrose
parents:
5983
diff
changeset
|
97 _has_finalizer = _has_empty_finalizer = _has_vanilla_constructor = false; |
6d8f36bcef55
6711908: JVM needs direct access to some annotations
jrose
parents:
5983
diff
changeset
|
98 _max_bootstrap_specifier_index = -1; |
8719
c8b31b461e1a
8003419: NPG: Clean up metadata created during class loading if failure
coleenp
parents:
8031
diff
changeset
|
99 clear_class_metadata(); |
c8b31b461e1a
8003419: NPG: Clean up metadata created during class loading if failure
coleenp
parents:
8031
diff
changeset
|
100 _klass = NULL; |
6222
6d8f36bcef55
6711908: JVM needs direct access to some annotations
jrose
parents:
5983
diff
changeset
|
101 } |
6d8f36bcef55
6711908: JVM needs direct access to some annotations
jrose
parents:
5983
diff
changeset
|
102 void apply_parsed_class_attributes(instanceKlassHandle k); // update k |
8719
c8b31b461e1a
8003419: NPG: Clean up metadata created during class loading if failure
coleenp
parents:
8031
diff
changeset
|
103 void apply_parsed_class_metadata(instanceKlassHandle k, int fields_count, TRAPS); |
c8b31b461e1a
8003419: NPG: Clean up metadata created during class loading if failure
coleenp
parents:
8031
diff
changeset
|
104 void clear_class_metadata() { |
c8b31b461e1a
8003419: NPG: Clean up metadata created during class loading if failure
coleenp
parents:
8031
diff
changeset
|
105 // metadata created before the instance klass is created. Must be |
c8b31b461e1a
8003419: NPG: Clean up metadata created during class loading if failure
coleenp
parents:
8031
diff
changeset
|
106 // deallocated if classfile parsing returns an error. |
c8b31b461e1a
8003419: NPG: Clean up metadata created during class loading if failure
coleenp
parents:
8031
diff
changeset
|
107 _cp = NULL; |
c8b31b461e1a
8003419: NPG: Clean up metadata created during class loading if failure
coleenp
parents:
8031
diff
changeset
|
108 _fields = NULL; |
c8b31b461e1a
8003419: NPG: Clean up metadata created during class loading if failure
coleenp
parents:
8031
diff
changeset
|
109 _methods = NULL; |
c8b31b461e1a
8003419: NPG: Clean up metadata created during class loading if failure
coleenp
parents:
8031
diff
changeset
|
110 _inner_classes = NULL; |
c8b31b461e1a
8003419: NPG: Clean up metadata created during class loading if failure
coleenp
parents:
8031
diff
changeset
|
111 _local_interfaces = NULL; |
c8b31b461e1a
8003419: NPG: Clean up metadata created during class loading if failure
coleenp
parents:
8031
diff
changeset
|
112 _transitive_interfaces = NULL; |
c8b31b461e1a
8003419: NPG: Clean up metadata created during class loading if failure
coleenp
parents:
8031
diff
changeset
|
113 _annotations = _type_annotations = NULL; |
c8b31b461e1a
8003419: NPG: Clean up metadata created during class loading if failure
coleenp
parents:
8031
diff
changeset
|
114 _fields_annotations = _fields_type_annotations = NULL; |
c8b31b461e1a
8003419: NPG: Clean up metadata created during class loading if failure
coleenp
parents:
8031
diff
changeset
|
115 } |
6222
6d8f36bcef55
6711908: JVM needs direct access to some annotations
jrose
parents:
5983
diff
changeset
|
116 |
6d8f36bcef55
6711908: JVM needs direct access to some annotations
jrose
parents:
5983
diff
changeset
|
117 class AnnotationCollector { |
6d8f36bcef55
6711908: JVM needs direct access to some annotations
jrose
parents:
5983
diff
changeset
|
118 public: |
6d8f36bcef55
6711908: JVM needs direct access to some annotations
jrose
parents:
5983
diff
changeset
|
119 enum Location { _in_field, _in_method, _in_class }; |
6d8f36bcef55
6711908: JVM needs direct access to some annotations
jrose
parents:
5983
diff
changeset
|
120 enum ID { |
6d8f36bcef55
6711908: JVM needs direct access to some annotations
jrose
parents:
5983
diff
changeset
|
121 _unknown = 0, |
8866
16885e702c88
7198429: need checked categorization of caller-sensitive methods in the JDK
twisti
parents:
8719
diff
changeset
|
122 _method_CallerSensitive, |
6222
6d8f36bcef55
6711908: JVM needs direct access to some annotations
jrose
parents:
5983
diff
changeset
|
123 _method_ForceInline, |
6266
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6227
diff
changeset
|
124 _method_DontInline, |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6227
diff
changeset
|
125 _method_LambdaForm_Compiled, |
1d7922586cf6
7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents:
6227
diff
changeset
|
126 _method_LambdaForm_Hidden, |
7587 | 127 _sun_misc_Contended, |
6222
6d8f36bcef55
6711908: JVM needs direct access to some annotations
jrose
parents:
5983
diff
changeset
|
128 _annotation_LIMIT |
6d8f36bcef55
6711908: JVM needs direct access to some annotations
jrose
parents:
5983
diff
changeset
|
129 }; |
6d8f36bcef55
6711908: JVM needs direct access to some annotations
jrose
parents:
5983
diff
changeset
|
130 const Location _location; |
6d8f36bcef55
6711908: JVM needs direct access to some annotations
jrose
parents:
5983
diff
changeset
|
131 int _annotations_present; |
7587 | 132 u2 _contended_group; |
133 | |
6222
6d8f36bcef55
6711908: JVM needs direct access to some annotations
jrose
parents:
5983
diff
changeset
|
134 AnnotationCollector(Location location) |
6d8f36bcef55
6711908: JVM needs direct access to some annotations
jrose
parents:
5983
diff
changeset
|
135 : _location(location), _annotations_present(0) |
6d8f36bcef55
6711908: JVM needs direct access to some annotations
jrose
parents:
5983
diff
changeset
|
136 { |
6d8f36bcef55
6711908: JVM needs direct access to some annotations
jrose
parents:
5983
diff
changeset
|
137 assert((int)_annotation_LIMIT <= (int)sizeof(_annotations_present) * BitsPerByte, ""); |
6d8f36bcef55
6711908: JVM needs direct access to some annotations
jrose
parents:
5983
diff
changeset
|
138 } |
6d8f36bcef55
6711908: JVM needs direct access to some annotations
jrose
parents:
5983
diff
changeset
|
139 // If this annotation name has an ID, report it (or _none). |
7587 | 140 ID annotation_index(ClassLoaderData* loader_data, Symbol* name); |
6222
6d8f36bcef55
6711908: JVM needs direct access to some annotations
jrose
parents:
5983
diff
changeset
|
141 // Set the annotation name: |
6d8f36bcef55
6711908: JVM needs direct access to some annotations
jrose
parents:
5983
diff
changeset
|
142 void set_annotation(ID id) { |
6d8f36bcef55
6711908: JVM needs direct access to some annotations
jrose
parents:
5983
diff
changeset
|
143 assert((int)id >= 0 && (int)id < (int)_annotation_LIMIT, "oob"); |
6d8f36bcef55
6711908: JVM needs direct access to some annotations
jrose
parents:
5983
diff
changeset
|
144 _annotations_present |= nth_bit((int)id); |
6d8f36bcef55
6711908: JVM needs direct access to some annotations
jrose
parents:
5983
diff
changeset
|
145 } |
6d8f36bcef55
6711908: JVM needs direct access to some annotations
jrose
parents:
5983
diff
changeset
|
146 // Report if the annotation is present. |
6d8f36bcef55
6711908: JVM needs direct access to some annotations
jrose
parents:
5983
diff
changeset
|
147 bool has_any_annotations() { return _annotations_present != 0; } |
6d8f36bcef55
6711908: JVM needs direct access to some annotations
jrose
parents:
5983
diff
changeset
|
148 bool has_annotation(ID id) { return (nth_bit((int)id) & _annotations_present) != 0; } |
7587 | 149 |
150 void set_contended_group(u2 group) { _contended_group = group; } | |
151 u2 contended_group() { return _contended_group; } | |
152 | |
153 bool is_contended() { return has_annotation(_sun_misc_Contended); } | |
6222
6d8f36bcef55
6711908: JVM needs direct access to some annotations
jrose
parents:
5983
diff
changeset
|
154 }; |
8719
c8b31b461e1a
8003419: NPG: Clean up metadata created during class loading if failure
coleenp
parents:
8031
diff
changeset
|
155 |
c8b31b461e1a
8003419: NPG: Clean up metadata created during class loading if failure
coleenp
parents:
8031
diff
changeset
|
156 // This class also doubles as a holder for metadata cleanup. |
6222
6d8f36bcef55
6711908: JVM needs direct access to some annotations
jrose
parents:
5983
diff
changeset
|
157 class FieldAnnotationCollector: public AnnotationCollector { |
8719
c8b31b461e1a
8003419: NPG: Clean up metadata created during class loading if failure
coleenp
parents:
8031
diff
changeset
|
158 ClassLoaderData* _loader_data; |
c8b31b461e1a
8003419: NPG: Clean up metadata created during class loading if failure
coleenp
parents:
8031
diff
changeset
|
159 AnnotationArray* _field_annotations; |
c8b31b461e1a
8003419: NPG: Clean up metadata created during class loading if failure
coleenp
parents:
8031
diff
changeset
|
160 AnnotationArray* _field_type_annotations; |
6222
6d8f36bcef55
6711908: JVM needs direct access to some annotations
jrose
parents:
5983
diff
changeset
|
161 public: |
8719
c8b31b461e1a
8003419: NPG: Clean up metadata created during class loading if failure
coleenp
parents:
8031
diff
changeset
|
162 FieldAnnotationCollector(ClassLoaderData* loader_data) : |
c8b31b461e1a
8003419: NPG: Clean up metadata created during class loading if failure
coleenp
parents:
8031
diff
changeset
|
163 AnnotationCollector(_in_field), |
c8b31b461e1a
8003419: NPG: Clean up metadata created during class loading if failure
coleenp
parents:
8031
diff
changeset
|
164 _loader_data(loader_data), |
c8b31b461e1a
8003419: NPG: Clean up metadata created during class loading if failure
coleenp
parents:
8031
diff
changeset
|
165 _field_annotations(NULL), |
c8b31b461e1a
8003419: NPG: Clean up metadata created during class loading if failure
coleenp
parents:
8031
diff
changeset
|
166 _field_type_annotations(NULL) {} |
6222
6d8f36bcef55
6711908: JVM needs direct access to some annotations
jrose
parents:
5983
diff
changeset
|
167 void apply_to(FieldInfo* f); |
8719
c8b31b461e1a
8003419: NPG: Clean up metadata created during class loading if failure
coleenp
parents:
8031
diff
changeset
|
168 ~FieldAnnotationCollector(); |
c8b31b461e1a
8003419: NPG: Clean up metadata created during class loading if failure
coleenp
parents:
8031
diff
changeset
|
169 AnnotationArray* field_annotations() { return _field_annotations; } |
c8b31b461e1a
8003419: NPG: Clean up metadata created during class loading if failure
coleenp
parents:
8031
diff
changeset
|
170 AnnotationArray* field_type_annotations() { return _field_type_annotations; } |
c8b31b461e1a
8003419: NPG: Clean up metadata created during class loading if failure
coleenp
parents:
8031
diff
changeset
|
171 |
c8b31b461e1a
8003419: NPG: Clean up metadata created during class loading if failure
coleenp
parents:
8031
diff
changeset
|
172 void set_field_annotations(AnnotationArray* a) { _field_annotations = a; } |
c8b31b461e1a
8003419: NPG: Clean up metadata created during class loading if failure
coleenp
parents:
8031
diff
changeset
|
173 void set_field_type_annotations(AnnotationArray* a) { _field_type_annotations = a; } |
6222
6d8f36bcef55
6711908: JVM needs direct access to some annotations
jrose
parents:
5983
diff
changeset
|
174 }; |
8719
c8b31b461e1a
8003419: NPG: Clean up metadata created during class loading if failure
coleenp
parents:
8031
diff
changeset
|
175 |
6222
6d8f36bcef55
6711908: JVM needs direct access to some annotations
jrose
parents:
5983
diff
changeset
|
176 class MethodAnnotationCollector: public AnnotationCollector { |
6d8f36bcef55
6711908: JVM needs direct access to some annotations
jrose
parents:
5983
diff
changeset
|
177 public: |
6d8f36bcef55
6711908: JVM needs direct access to some annotations
jrose
parents:
5983
diff
changeset
|
178 MethodAnnotationCollector() : AnnotationCollector(_in_method) { } |
6d8f36bcef55
6711908: JVM needs direct access to some annotations
jrose
parents:
5983
diff
changeset
|
179 void apply_to(methodHandle m); |
6d8f36bcef55
6711908: JVM needs direct access to some annotations
jrose
parents:
5983
diff
changeset
|
180 }; |
6d8f36bcef55
6711908: JVM needs direct access to some annotations
jrose
parents:
5983
diff
changeset
|
181 class ClassAnnotationCollector: public AnnotationCollector { |
6d8f36bcef55
6711908: JVM needs direct access to some annotations
jrose
parents:
5983
diff
changeset
|
182 public: |
6d8f36bcef55
6711908: JVM needs direct access to some annotations
jrose
parents:
5983
diff
changeset
|
183 ClassAnnotationCollector() : AnnotationCollector(_in_class) { } |
6d8f36bcef55
6711908: JVM needs direct access to some annotations
jrose
parents:
5983
diff
changeset
|
184 void apply_to(instanceKlassHandle k); |
6d8f36bcef55
6711908: JVM needs direct access to some annotations
jrose
parents:
5983
diff
changeset
|
185 }; |
2011
dad31fc330cd
7001379: bootstrap method data needs to be moved from constant pool to a classfile attribute
jrose
parents:
1972
diff
changeset
|
186 |
0 | 187 enum { fixed_buffer_size = 128 }; |
188 u_char linenumbertable_buffer[fixed_buffer_size]; | |
189 | |
190 ClassFileStream* _stream; // Actual input stream | |
191 | |
192 enum { LegalClass, LegalField, LegalMethod }; // used to verify unqualified names | |
193 | |
194 // Accessors | |
195 ClassFileStream* stream() { return _stream; } | |
196 void set_stream(ClassFileStream* st) { _stream = st; } | |
197 | |
198 // Constant pool parsing | |
8719
c8b31b461e1a
8003419: NPG: Clean up metadata created during class loading if failure
coleenp
parents:
8031
diff
changeset
|
199 void parse_constant_pool_entries(int length, TRAPS); |
0 | 200 |
8719
c8b31b461e1a
8003419: NPG: Clean up metadata created during class loading if failure
coleenp
parents:
8031
diff
changeset
|
201 constantPoolHandle parse_constant_pool(TRAPS); |
0 | 202 |
203 // Interface parsing | |
8719
c8b31b461e1a
8003419: NPG: Clean up metadata created during class loading if failure
coleenp
parents:
8031
diff
changeset
|
204 Array<Klass*>* parse_interfaces(int length, |
0 | 205 Handle protection_domain, |
2177
3582bf76420e
6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents:
2011
diff
changeset
|
206 Symbol* class_name, |
6934 | 207 bool* has_default_methods, |
0 | 208 TRAPS); |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6266
diff
changeset
|
209 void record_defined_class_dependencies(instanceKlassHandle defined_klass, TRAPS); |
0 | 210 |
8719
c8b31b461e1a
8003419: NPG: Clean up metadata created during class loading if failure
coleenp
parents:
8031
diff
changeset
|
211 instanceKlassHandle parse_super_class(int super_class_index, TRAPS); |
0 | 212 // Field parsing |
8719
c8b31b461e1a
8003419: NPG: Clean up metadata created during class loading if failure
coleenp
parents:
8031
diff
changeset
|
213 void parse_field_attributes(u2 attributes_count, |
0 | 214 bool is_static, u2 signature_index, |
215 u2* constantvalue_index_addr, | |
216 bool* is_synthetic_addr, | |
217 u2* generic_signature_index_addr, | |
6222
6d8f36bcef55
6711908: JVM needs direct access to some annotations
jrose
parents:
5983
diff
changeset
|
218 FieldAnnotationCollector* parsed_annotations, |
6d8f36bcef55
6711908: JVM needs direct access to some annotations
jrose
parents:
5983
diff
changeset
|
219 TRAPS); |
8719
c8b31b461e1a
8003419: NPG: Clean up metadata created during class loading if failure
coleenp
parents:
8031
diff
changeset
|
220 Array<u2>* parse_fields(Symbol* class_name, |
c8b31b461e1a
8003419: NPG: Clean up metadata created during class loading if failure
coleenp
parents:
8031
diff
changeset
|
221 bool is_interface, |
6831
d8ce2825b193
8000213: NPG: Should have renamed arrayKlass and typeArrayKlass
coleenp
parents:
6725
diff
changeset
|
222 FieldAllocationCount *fac, |
d8ce2825b193
8000213: NPG: Should have renamed arrayKlass and typeArrayKlass
coleenp
parents:
6725
diff
changeset
|
223 u2* java_fields_count_ptr, TRAPS); |
0 | 224 |
7587 | 225 void print_field_layout(Symbol* name, |
226 Array<u2>* fields, | |
227 constantPoolHandle cp, | |
228 int instance_size, | |
229 int instance_fields_start, | |
230 int instance_fields_end, | |
231 int static_fields_end); | |
232 | |
0 | 233 // Method parsing |
8719
c8b31b461e1a
8003419: NPG: Clean up metadata created during class loading if failure
coleenp
parents:
8031
diff
changeset
|
234 methodHandle parse_method(bool is_interface, |
0 | 235 AccessFlags* promoted_flags, |
236 TRAPS); | |
8719
c8b31b461e1a
8003419: NPG: Clean up metadata created during class loading if failure
coleenp
parents:
8031
diff
changeset
|
237 Array<Method*>* parse_methods(bool is_interface, |
0 | 238 AccessFlags* promoted_flags, |
239 bool* has_final_method, | |
6934 | 240 bool* has_default_method, |
0 | 241 TRAPS); |
8719
c8b31b461e1a
8003419: NPG: Clean up metadata created during class loading if failure
coleenp
parents:
8031
diff
changeset
|
242 intArray* sort_methods(Array<Method*>* methods); |
c8b31b461e1a
8003419: NPG: Clean up metadata created during class loading if failure
coleenp
parents:
8031
diff
changeset
|
243 |
c8b31b461e1a
8003419: NPG: Clean up metadata created during class loading if failure
coleenp
parents:
8031
diff
changeset
|
244 u2* parse_exception_table(u4 code_length, u4 exception_table_length, |
c8b31b461e1a
8003419: NPG: Clean up metadata created during class loading if failure
coleenp
parents:
8031
diff
changeset
|
245 TRAPS); |
0 | 246 void parse_linenumber_table( |
247 u4 code_attribute_length, u4 code_length, | |
248 CompressedLineNumberWriteStream** write_stream, TRAPS); | |
249 u2* parse_localvariable_table(u4 code_length, u2 max_locals, u4 code_attribute_length, | |
8719
c8b31b461e1a
8003419: NPG: Clean up metadata created during class loading if failure
coleenp
parents:
8031
diff
changeset
|
250 u2* localvariable_table_length, |
0 | 251 bool isLVTT, TRAPS); |
252 u2* parse_checked_exceptions(u2* checked_exceptions_length, u4 method_attribute_length, | |
8719
c8b31b461e1a
8003419: NPG: Clean up metadata created during class loading if failure
coleenp
parents:
8031
diff
changeset
|
253 TRAPS); |
0 | 254 void parse_type_array(u2 array_length, u4 code_length, u4* u1_index, u4* u2_index, |
8719
c8b31b461e1a
8003419: NPG: Clean up metadata created during class loading if failure
coleenp
parents:
8031
diff
changeset
|
255 u1* u1_array, u2* u2_array, TRAPS); |
c8b31b461e1a
8003419: NPG: Clean up metadata created during class loading if failure
coleenp
parents:
8031
diff
changeset
|
256 u1* parse_stackmap_table(u4 code_attribute_length, TRAPS); |
0 | 257 |
258 // Classfile attribute parsing | |
8719
c8b31b461e1a
8003419: NPG: Clean up metadata created during class loading if failure
coleenp
parents:
8031
diff
changeset
|
259 void parse_classfile_sourcefile_attribute(TRAPS); |
c8b31b461e1a
8003419: NPG: Clean up metadata created during class loading if failure
coleenp
parents:
8031
diff
changeset
|
260 void parse_classfile_source_debug_extension_attribute(int length, TRAPS); |
c8b31b461e1a
8003419: NPG: Clean up metadata created during class loading if failure
coleenp
parents:
8031
diff
changeset
|
261 u2 parse_classfile_inner_classes_attribute(u1* inner_classes_attribute_start, |
5967
f7c4174b33ba
7109878: The instanceKlass EnclosingMethhod attribute fields can be folded into the _inner_class field.
jiangli
parents:
4744
diff
changeset
|
262 bool parsed_enclosingmethod_attribute, |
f7c4174b33ba
7109878: The instanceKlass EnclosingMethhod attribute fields can be folded into the _inner_class field.
jiangli
parents:
4744
diff
changeset
|
263 u2 enclosing_method_class_index, |
f7c4174b33ba
7109878: The instanceKlass EnclosingMethhod attribute fields can be folded into the _inner_class field.
jiangli
parents:
4744
diff
changeset
|
264 u2 enclosing_method_method_index, |
6222
6d8f36bcef55
6711908: JVM needs direct access to some annotations
jrose
parents:
5983
diff
changeset
|
265 TRAPS); |
8719
c8b31b461e1a
8003419: NPG: Clean up metadata created during class loading if failure
coleenp
parents:
8031
diff
changeset
|
266 void parse_classfile_attributes(ClassAnnotationCollector* parsed_annotations, |
6222
6d8f36bcef55
6711908: JVM needs direct access to some annotations
jrose
parents:
5983
diff
changeset
|
267 TRAPS); |
8719
c8b31b461e1a
8003419: NPG: Clean up metadata created during class loading if failure
coleenp
parents:
8031
diff
changeset
|
268 void parse_classfile_synthetic_attribute(TRAPS); |
c8b31b461e1a
8003419: NPG: Clean up metadata created during class loading if failure
coleenp
parents:
8031
diff
changeset
|
269 void parse_classfile_signature_attribute(TRAPS); |
c8b31b461e1a
8003419: NPG: Clean up metadata created during class loading if failure
coleenp
parents:
8031
diff
changeset
|
270 void parse_classfile_bootstrap_methods_attribute(u4 attribute_length, TRAPS); |
0 | 271 |
272 // Annotations handling | |
8719
c8b31b461e1a
8003419: NPG: Clean up metadata created during class loading if failure
coleenp
parents:
8031
diff
changeset
|
273 AnnotationArray* assemble_annotations(u1* runtime_visible_annotations, |
6831
d8ce2825b193
8000213: NPG: Should have renamed arrayKlass and typeArrayKlass
coleenp
parents:
6725
diff
changeset
|
274 int runtime_visible_annotations_length, |
d8ce2825b193
8000213: NPG: Should have renamed arrayKlass and typeArrayKlass
coleenp
parents:
6725
diff
changeset
|
275 u1* runtime_invisible_annotations, |
d8ce2825b193
8000213: NPG: Should have renamed arrayKlass and typeArrayKlass
coleenp
parents:
6725
diff
changeset
|
276 int runtime_invisible_annotations_length, TRAPS); |
6222
6d8f36bcef55
6711908: JVM needs direct access to some annotations
jrose
parents:
5983
diff
changeset
|
277 int skip_annotation(u1* buffer, int limit, int index); |
6d8f36bcef55
6711908: JVM needs direct access to some annotations
jrose
parents:
5983
diff
changeset
|
278 int skip_annotation_value(u1* buffer, int limit, int index); |
8719
c8b31b461e1a
8003419: NPG: Clean up metadata created during class loading if failure
coleenp
parents:
8031
diff
changeset
|
279 void parse_annotations(u1* buffer, int limit, |
6222
6d8f36bcef55
6711908: JVM needs direct access to some annotations
jrose
parents:
5983
diff
changeset
|
280 /* Results (currently, only one result is supported): */ |
6d8f36bcef55
6711908: JVM needs direct access to some annotations
jrose
parents:
5983
diff
changeset
|
281 AnnotationCollector* result, |
6d8f36bcef55
6711908: JVM needs direct access to some annotations
jrose
parents:
5983
diff
changeset
|
282 TRAPS); |
0 | 283 |
284 // Final setup | |
939
9eebd3ac74cf
6845368: large objects cause a crash or unexpected exception
jcoomes
parents:
938
diff
changeset
|
285 unsigned int compute_oop_map_count(instanceKlassHandle super, |
9eebd3ac74cf
6845368: large objects cause a crash or unexpected exception
jcoomes
parents:
938
diff
changeset
|
286 unsigned int nonstatic_oop_count, |
9eebd3ac74cf
6845368: large objects cause a crash or unexpected exception
jcoomes
parents:
938
diff
changeset
|
287 int first_nonstatic_oop_offset); |
9eebd3ac74cf
6845368: large objects cause a crash or unexpected exception
jcoomes
parents:
938
diff
changeset
|
288 void fill_oop_maps(instanceKlassHandle k, |
9eebd3ac74cf
6845368: large objects cause a crash or unexpected exception
jcoomes
parents:
938
diff
changeset
|
289 unsigned int nonstatic_oop_map_count, |
9eebd3ac74cf
6845368: large objects cause a crash or unexpected exception
jcoomes
parents:
938
diff
changeset
|
290 int* nonstatic_oop_offsets, |
9eebd3ac74cf
6845368: large objects cause a crash or unexpected exception
jcoomes
parents:
938
diff
changeset
|
291 unsigned int* nonstatic_oop_counts); |
0 | 292 void set_precomputed_flags(instanceKlassHandle k); |
8719
c8b31b461e1a
8003419: NPG: Clean up metadata created during class loading if failure
coleenp
parents:
8031
diff
changeset
|
293 Array<Klass*>* compute_transitive_interfaces(instanceKlassHandle super, |
6831
d8ce2825b193
8000213: NPG: Should have renamed arrayKlass and typeArrayKlass
coleenp
parents:
6725
diff
changeset
|
294 Array<Klass*>* local_ifs, TRAPS); |
0 | 295 |
296 // Format checker methods | |
297 void classfile_parse_error(const char* msg, TRAPS); | |
298 void classfile_parse_error(const char* msg, int index, TRAPS); | |
299 void classfile_parse_error(const char* msg, const char *name, TRAPS); | |
300 void classfile_parse_error(const char* msg, int index, const char *name, TRAPS); | |
301 inline void guarantee_property(bool b, const char* msg, TRAPS) { | |
302 if (!b) { classfile_parse_error(msg, CHECK); } | |
303 } | |
304 | |
305 inline void assert_property(bool b, const char* msg, TRAPS) { | |
306 #ifdef ASSERT | |
307 if (!b) { fatal(msg); } | |
308 #endif | |
309 } | |
310 | |
311 inline void check_property(bool property, const char* msg, int index, TRAPS) { | |
312 if (_need_verify) { | |
313 guarantee_property(property, msg, index, CHECK); | |
314 } else { | |
315 assert_property(property, msg, CHECK); | |
316 } | |
317 } | |
318 | |
319 inline void check_property(bool property, const char* msg, TRAPS) { | |
320 if (_need_verify) { | |
321 guarantee_property(property, msg, CHECK); | |
322 } else { | |
323 assert_property(property, msg, CHECK); | |
324 } | |
325 } | |
326 | |
327 inline void guarantee_property(bool b, const char* msg, int index, TRAPS) { | |
328 if (!b) { classfile_parse_error(msg, index, CHECK); } | |
329 } | |
330 inline void guarantee_property(bool b, const char* msg, const char *name, TRAPS) { | |
331 if (!b) { classfile_parse_error(msg, name, CHECK); } | |
332 } | |
333 inline void guarantee_property(bool b, const char* msg, int index, const char *name, TRAPS) { | |
334 if (!b) { classfile_parse_error(msg, index, name, CHECK); } | |
335 } | |
336 | |
1586
086d73ccd6c0
6930553: classfile format checker allows invalid method descriptor in CONSTANT_NameAndType_info in some cases
kamg
parents:
974
diff
changeset
|
337 void throwIllegalSignature( |
2177
3582bf76420e
6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents:
2011
diff
changeset
|
338 const char* type, Symbol* name, Symbol* sig, TRAPS); |
1586
086d73ccd6c0
6930553: classfile format checker allows invalid method descriptor in CONSTANT_NameAndType_info in some cases
kamg
parents:
974
diff
changeset
|
339 |
0 | 340 bool is_supported_version(u2 major, u2 minor); |
341 bool has_illegal_visibility(jint flags); | |
342 | |
8719
c8b31b461e1a
8003419: NPG: Clean up metadata created during class loading if failure
coleenp
parents:
8031
diff
changeset
|
343 void verify_constantvalue(int constantvalue_index, int signature_index, TRAPS); |
0 | 344 void verify_legal_utf8(const unsigned char* buffer, int length, TRAPS); |
2177
3582bf76420e
6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents:
2011
diff
changeset
|
345 void verify_legal_class_name(Symbol* name, TRAPS); |
3582bf76420e
6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents:
2011
diff
changeset
|
346 void verify_legal_field_name(Symbol* name, TRAPS); |
3582bf76420e
6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents:
2011
diff
changeset
|
347 void verify_legal_method_name(Symbol* name, TRAPS); |
3582bf76420e
6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents:
2011
diff
changeset
|
348 void verify_legal_field_signature(Symbol* fieldname, Symbol* signature, TRAPS); |
3582bf76420e
6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents:
2011
diff
changeset
|
349 int verify_legal_method_signature(Symbol* methodname, Symbol* signature, TRAPS); |
0 | 350 void verify_legal_class_modifiers(jint flags, TRAPS); |
351 void verify_legal_field_modifiers(jint flags, bool is_interface, TRAPS); | |
2177
3582bf76420e
6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents:
2011
diff
changeset
|
352 void verify_legal_method_modifiers(jint flags, bool is_interface, Symbol* name, TRAPS); |
0 | 353 bool verify_unqualified_name(char* name, unsigned int length, int type); |
354 char* skip_over_field_name(char* name, bool slash_ok, unsigned int length); | |
355 char* skip_over_field_signature(char* signature, bool void_ok, unsigned int length, TRAPS); | |
356 | |
710 | 357 bool is_anonymous() { |
2416
38fea01eb669
6817525: turn on method handle functionality by default for JSR 292
twisti
parents:
2376
diff
changeset
|
358 assert(EnableInvokeDynamic || _host_klass.is_null(), ""); |
710 | 359 return _host_klass.not_null(); |
360 } | |
431
a45484ea312d
6653858: dynamic languages need to be able to load anonymous classes
jrose
parents:
0
diff
changeset
|
361 bool has_cp_patch_at(int index) { |
2416
38fea01eb669
6817525: turn on method handle functionality by default for JSR 292
twisti
parents:
2376
diff
changeset
|
362 assert(EnableInvokeDynamic, ""); |
431
a45484ea312d
6653858: dynamic languages need to be able to load anonymous classes
jrose
parents:
0
diff
changeset
|
363 assert(index >= 0, "oob"); |
a45484ea312d
6653858: dynamic languages need to be able to load anonymous classes
jrose
parents:
0
diff
changeset
|
364 return (_cp_patches != NULL |
a45484ea312d
6653858: dynamic languages need to be able to load anonymous classes
jrose
parents:
0
diff
changeset
|
365 && index < _cp_patches->length() |
a45484ea312d
6653858: dynamic languages need to be able to load anonymous classes
jrose
parents:
0
diff
changeset
|
366 && _cp_patches->adr_at(index)->not_null()); |
a45484ea312d
6653858: dynamic languages need to be able to load anonymous classes
jrose
parents:
0
diff
changeset
|
367 } |
a45484ea312d
6653858: dynamic languages need to be able to load anonymous classes
jrose
parents:
0
diff
changeset
|
368 Handle cp_patch_at(int index) { |
a45484ea312d
6653858: dynamic languages need to be able to load anonymous classes
jrose
parents:
0
diff
changeset
|
369 assert(has_cp_patch_at(index), "oob"); |
a45484ea312d
6653858: dynamic languages need to be able to load anonymous classes
jrose
parents:
0
diff
changeset
|
370 return _cp_patches->at(index); |
a45484ea312d
6653858: dynamic languages need to be able to load anonymous classes
jrose
parents:
0
diff
changeset
|
371 } |
a45484ea312d
6653858: dynamic languages need to be able to load anonymous classes
jrose
parents:
0
diff
changeset
|
372 Handle clear_cp_patch_at(int index) { |
a45484ea312d
6653858: dynamic languages need to be able to load anonymous classes
jrose
parents:
0
diff
changeset
|
373 Handle patch = cp_patch_at(index); |
a45484ea312d
6653858: dynamic languages need to be able to load anonymous classes
jrose
parents:
0
diff
changeset
|
374 _cp_patches->at_put(index, Handle()); |
a45484ea312d
6653858: dynamic languages need to be able to load anonymous classes
jrose
parents:
0
diff
changeset
|
375 assert(!has_cp_patch_at(index), ""); |
a45484ea312d
6653858: dynamic languages need to be able to load anonymous classes
jrose
parents:
0
diff
changeset
|
376 return patch; |
a45484ea312d
6653858: dynamic languages need to be able to load anonymous classes
jrose
parents:
0
diff
changeset
|
377 } |
a45484ea312d
6653858: dynamic languages need to be able to load anonymous classes
jrose
parents:
0
diff
changeset
|
378 void patch_constant_pool(constantPoolHandle cp, int index, Handle patch, TRAPS); |
a45484ea312d
6653858: dynamic languages need to be able to load anonymous classes
jrose
parents:
0
diff
changeset
|
379 |
a45484ea312d
6653858: dynamic languages need to be able to load anonymous classes
jrose
parents:
0
diff
changeset
|
380 // Wrapper for constantTag.is_klass_[or_]reference. |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6266
diff
changeset
|
381 // In older versions of the VM, Klass*s cannot sneak into early phases of |
431
a45484ea312d
6653858: dynamic languages need to be able to load anonymous classes
jrose
parents:
0
diff
changeset
|
382 // constant pool construction, but in later versions they can. |
a45484ea312d
6653858: dynamic languages need to be able to load anonymous classes
jrose
parents:
0
diff
changeset
|
383 // %%% Let's phase out the old is_klass_reference. |
8719
c8b31b461e1a
8003419: NPG: Clean up metadata created during class loading if failure
coleenp
parents:
8031
diff
changeset
|
384 bool valid_klass_reference_at(int index) { |
c8b31b461e1a
8003419: NPG: Clean up metadata created during class loading if failure
coleenp
parents:
8031
diff
changeset
|
385 return _cp->is_within_bounds(index) && |
c8b31b461e1a
8003419: NPG: Clean up metadata created during class loading if failure
coleenp
parents:
8031
diff
changeset
|
386 (EnableInvokeDynamic |
c8b31b461e1a
8003419: NPG: Clean up metadata created during class loading if failure
coleenp
parents:
8031
diff
changeset
|
387 ? _cp->tag_at(index).is_klass_or_reference() |
c8b31b461e1a
8003419: NPG: Clean up metadata created during class loading if failure
coleenp
parents:
8031
diff
changeset
|
388 : _cp->tag_at(index).is_klass_reference()); |
c8b31b461e1a
8003419: NPG: Clean up metadata created during class loading if failure
coleenp
parents:
8031
diff
changeset
|
389 } |
c8b31b461e1a
8003419: NPG: Clean up metadata created during class loading if failure
coleenp
parents:
8031
diff
changeset
|
390 |
c8b31b461e1a
8003419: NPG: Clean up metadata created during class loading if failure
coleenp
parents:
8031
diff
changeset
|
391 // Checks that the cpool index is in range and is a utf8 |
c8b31b461e1a
8003419: NPG: Clean up metadata created during class loading if failure
coleenp
parents:
8031
diff
changeset
|
392 bool valid_symbol_at(int cpool_index) { |
c8b31b461e1a
8003419: NPG: Clean up metadata created during class loading if failure
coleenp
parents:
8031
diff
changeset
|
393 return (_cp->is_within_bounds(cpool_index) && |
c8b31b461e1a
8003419: NPG: Clean up metadata created during class loading if failure
coleenp
parents:
8031
diff
changeset
|
394 _cp->tag_at(cpool_index).is_utf8()); |
431
a45484ea312d
6653858: dynamic languages need to be able to load anonymous classes
jrose
parents:
0
diff
changeset
|
395 } |
a45484ea312d
6653858: dynamic languages need to be able to load anonymous classes
jrose
parents:
0
diff
changeset
|
396 |
8031 | 397 void copy_localvariable_table(ConstMethod* cm, int lvt_cnt, |
398 u2* localvariable_table_length, | |
399 u2** localvariable_table_start, | |
400 int lvtt_cnt, | |
401 u2* localvariable_type_table_length, | |
402 u2** localvariable_type_table_start, | |
403 TRAPS); | |
404 | |
8719
c8b31b461e1a
8003419: NPG: Clean up metadata created during class loading if failure
coleenp
parents:
8031
diff
changeset
|
405 void copy_method_annotations(ConstMethod* cm, |
8031 | 406 u1* runtime_visible_annotations, |
407 int runtime_visible_annotations_length, | |
408 u1* runtime_invisible_annotations, | |
409 int runtime_invisible_annotations_length, | |
410 u1* runtime_visible_parameter_annotations, | |
411 int runtime_visible_parameter_annotations_length, | |
412 u1* runtime_invisible_parameter_annotations, | |
413 int runtime_invisible_parameter_annotations_length, | |
414 u1* runtime_visible_type_annotations, | |
415 int runtime_visible_type_annotations_length, | |
416 u1* runtime_invisible_type_annotations, | |
417 int runtime_invisible_type_annotations_length, | |
418 u1* annotation_default, | |
419 int annotation_default_length, | |
420 TRAPS); | |
421 | |
8719
c8b31b461e1a
8003419: NPG: Clean up metadata created during class loading if failure
coleenp
parents:
8031
diff
changeset
|
422 // lays out fields in class and returns the total oopmap count |
c8b31b461e1a
8003419: NPG: Clean up metadata created during class loading if failure
coleenp
parents:
8031
diff
changeset
|
423 void layout_fields(Handle class_loader, FieldAllocationCount* fac, |
c8b31b461e1a
8003419: NPG: Clean up metadata created during class loading if failure
coleenp
parents:
8031
diff
changeset
|
424 ClassAnnotationCollector* parsed_annotations, |
c8b31b461e1a
8003419: NPG: Clean up metadata created during class loading if failure
coleenp
parents:
8031
diff
changeset
|
425 FieldLayoutInfo* info, TRAPS); |
c8b31b461e1a
8003419: NPG: Clean up metadata created during class loading if failure
coleenp
parents:
8031
diff
changeset
|
426 |
0 | 427 public: |
428 // Constructor | |
429 ClassFileParser(ClassFileStream* st) { set_stream(st); } | |
8719
c8b31b461e1a
8003419: NPG: Clean up metadata created during class loading if failure
coleenp
parents:
8031
diff
changeset
|
430 ~ClassFileParser(); |
0 | 431 |
6725
da91efe96a93
6964458: Reimplement class meta-data storage to use native memory
coleenp
parents:
6266
diff
changeset
|
432 // Parse .class file and return new Klass*. The Klass* is not hooked up |
0 | 433 // to the system dictionary or any other structures, so a .class file can |
434 // be loaded several times if desired. | |
435 // The system dictionary hookup is done by the caller. | |
436 // | |
437 // "parsed_name" is updated by this method, and is the name found | |
438 // while parsing the stream. | |
2177
3582bf76420e
6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents:
2011
diff
changeset
|
439 instanceKlassHandle parseClassFile(Symbol* name, |
7185
90273fc0a981
8000662: NPG: nashorn ant clean test262 out-of-memory with Java heap
coleenp
parents:
6934
diff
changeset
|
440 ClassLoaderData* loader_data, |
0 | 441 Handle protection_domain, |
2177
3582bf76420e
6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents:
2011
diff
changeset
|
442 TempNewSymbol& parsed_name, |
973
ad6585fd4087
6830542: Performance: JVM_DefineClass already verified.
acorn
parents:
875
diff
changeset
|
443 bool verify, |
431
a45484ea312d
6653858: dynamic languages need to be able to load anonymous classes
jrose
parents:
0
diff
changeset
|
444 TRAPS) { |
710 | 445 KlassHandle no_host_klass; |
7185
90273fc0a981
8000662: NPG: nashorn ant clean test262 out-of-memory with Java heap
coleenp
parents:
6934
diff
changeset
|
446 return parseClassFile(name, loader_data, protection_domain, no_host_klass, NULL, parsed_name, verify, THREAD); |
431
a45484ea312d
6653858: dynamic languages need to be able to load anonymous classes
jrose
parents:
0
diff
changeset
|
447 } |
2177
3582bf76420e
6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents:
2011
diff
changeset
|
448 instanceKlassHandle parseClassFile(Symbol* name, |
7185
90273fc0a981
8000662: NPG: nashorn ant clean test262 out-of-memory with Java heap
coleenp
parents:
6934
diff
changeset
|
449 ClassLoaderData* loader_data, |
431
a45484ea312d
6653858: dynamic languages need to be able to load anonymous classes
jrose
parents:
0
diff
changeset
|
450 Handle protection_domain, |
710 | 451 KlassHandle host_klass, |
431
a45484ea312d
6653858: dynamic languages need to be able to load anonymous classes
jrose
parents:
0
diff
changeset
|
452 GrowableArray<Handle>* cp_patches, |
2177
3582bf76420e
6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents:
2011
diff
changeset
|
453 TempNewSymbol& parsed_name, |
973
ad6585fd4087
6830542: Performance: JVM_DefineClass already verified.
acorn
parents:
875
diff
changeset
|
454 bool verify, |
0 | 455 TRAPS); |
456 | |
457 // Verifier checks | |
458 static void check_super_class_access(instanceKlassHandle this_klass, TRAPS); | |
459 static void check_super_interface_access(instanceKlassHandle this_klass, TRAPS); | |
460 static void check_final_method_override(instanceKlassHandle this_klass, TRAPS); | |
461 static void check_illegal_static_method(instanceKlassHandle this_klass, TRAPS); | |
462 }; | |
1972 | 463 |
464 #endif // SHARE_VM_CLASSFILE_CLASSFILEPARSER_HPP |