30 #include "oops/oop.inline.hpp" |
30 #include "oops/oop.inline.hpp" |
31 #include "oops/typeArrayOop.hpp" |
31 #include "oops/typeArrayOop.hpp" |
32 #include "runtime/handles.inline.hpp" |
32 #include "runtime/handles.inline.hpp" |
33 #include "utilities/accessFlags.hpp" |
33 #include "utilities/accessFlags.hpp" |
34 |
34 |
|
35 class TempNewSymbol; |
35 // Parser for for .class files |
36 // Parser for for .class files |
36 // |
37 // |
37 // The bytes describing the class file structure is read from a Stream object |
38 // The bytes describing the class file structure is read from a Stream object |
38 |
39 |
39 class ClassFileParser VALUE_OBJ_CLASS_SPEC { |
40 class ClassFileParser VALUE_OBJ_CLASS_SPEC { |
40 private: |
41 private: |
41 bool _need_verify; |
42 bool _need_verify; |
42 bool _relax_verify; |
43 bool _relax_verify; |
43 u2 _major_version; |
44 u2 _major_version; |
44 u2 _minor_version; |
45 u2 _minor_version; |
45 symbolHandle _class_name; |
46 Symbol* _class_name; |
46 KlassHandle _host_klass; |
47 KlassHandle _host_klass; |
47 GrowableArray<Handle>* _cp_patches; // overrides for CP entries |
48 GrowableArray<Handle>* _cp_patches; // overrides for CP entries |
48 |
49 |
49 bool _has_finalizer; |
50 bool _has_finalizer; |
50 bool _has_empty_finalizer; |
51 bool _has_empty_finalizer; |
207 inline void guarantee_property(bool b, const char* msg, int index, const char *name, TRAPS) { |
208 inline void guarantee_property(bool b, const char* msg, int index, const char *name, TRAPS) { |
208 if (!b) { classfile_parse_error(msg, index, name, CHECK); } |
209 if (!b) { classfile_parse_error(msg, index, name, CHECK); } |
209 } |
210 } |
210 |
211 |
211 void throwIllegalSignature( |
212 void throwIllegalSignature( |
212 const char* type, symbolHandle name, symbolHandle sig, TRAPS); |
213 const char* type, Symbol* name, Symbol* sig, TRAPS); |
213 |
214 |
214 bool is_supported_version(u2 major, u2 minor); |
215 bool is_supported_version(u2 major, u2 minor); |
215 bool has_illegal_visibility(jint flags); |
216 bool has_illegal_visibility(jint flags); |
216 |
217 |
217 void verify_constantvalue(int constantvalue_index, int signature_index, constantPoolHandle cp, TRAPS); |
218 void verify_constantvalue(int constantvalue_index, int signature_index, constantPoolHandle cp, TRAPS); |
218 void verify_legal_utf8(const unsigned char* buffer, int length, TRAPS); |
219 void verify_legal_utf8(const unsigned char* buffer, int length, TRAPS); |
219 void verify_legal_class_name(symbolHandle name, TRAPS); |
220 void verify_legal_class_name(Symbol* name, TRAPS); |
220 void verify_legal_field_name(symbolHandle name, TRAPS); |
221 void verify_legal_field_name(Symbol* name, TRAPS); |
221 void verify_legal_method_name(symbolHandle name, TRAPS); |
222 void verify_legal_method_name(Symbol* name, TRAPS); |
222 void verify_legal_field_signature(symbolHandle fieldname, symbolHandle signature, TRAPS); |
223 void verify_legal_field_signature(Symbol* fieldname, Symbol* signature, TRAPS); |
223 int verify_legal_method_signature(symbolHandle methodname, symbolHandle signature, TRAPS); |
224 int verify_legal_method_signature(Symbol* methodname, Symbol* signature, TRAPS); |
224 void verify_legal_class_modifiers(jint flags, TRAPS); |
225 void verify_legal_class_modifiers(jint flags, TRAPS); |
225 void verify_legal_field_modifiers(jint flags, bool is_interface, TRAPS); |
226 void verify_legal_field_modifiers(jint flags, bool is_interface, TRAPS); |
226 void verify_legal_method_modifiers(jint flags, bool is_interface, symbolHandle name, TRAPS); |
227 void verify_legal_method_modifiers(jint flags, bool is_interface, Symbol* name, TRAPS); |
227 bool verify_unqualified_name(char* name, unsigned int length, int type); |
228 bool verify_unqualified_name(char* name, unsigned int length, int type); |
228 char* skip_over_field_name(char* name, bool slash_ok, unsigned int length); |
229 char* skip_over_field_name(char* name, bool slash_ok, unsigned int length); |
229 char* skip_over_field_signature(char* signature, bool void_ok, unsigned int length, TRAPS); |
230 char* skip_over_field_signature(char* signature, bool void_ok, unsigned int length, TRAPS); |
230 |
231 |
231 bool is_anonymous() { |
232 bool is_anonymous() { |
270 // be loaded several times if desired. |
271 // be loaded several times if desired. |
271 // The system dictionary hookup is done by the caller. |
272 // The system dictionary hookup is done by the caller. |
272 // |
273 // |
273 // "parsed_name" is updated by this method, and is the name found |
274 // "parsed_name" is updated by this method, and is the name found |
274 // while parsing the stream. |
275 // while parsing the stream. |
275 instanceKlassHandle parseClassFile(symbolHandle name, |
276 instanceKlassHandle parseClassFile(Symbol* name, |
276 Handle class_loader, |
277 Handle class_loader, |
277 Handle protection_domain, |
278 Handle protection_domain, |
278 symbolHandle& parsed_name, |
279 TempNewSymbol& parsed_name, |
279 bool verify, |
280 bool verify, |
280 TRAPS) { |
281 TRAPS) { |
281 KlassHandle no_host_klass; |
282 KlassHandle no_host_klass; |
282 return parseClassFile(name, class_loader, protection_domain, no_host_klass, NULL, parsed_name, verify, THREAD); |
283 return parseClassFile(name, class_loader, protection_domain, no_host_klass, NULL, parsed_name, verify, THREAD); |
283 } |
284 } |
284 instanceKlassHandle parseClassFile(symbolHandle name, |
285 instanceKlassHandle parseClassFile(Symbol* name, |
285 Handle class_loader, |
286 Handle class_loader, |
286 Handle protection_domain, |
287 Handle protection_domain, |
287 KlassHandle host_klass, |
288 KlassHandle host_klass, |
288 GrowableArray<Handle>* cp_patches, |
289 GrowableArray<Handle>* cp_patches, |
289 symbolHandle& parsed_name, |
290 TempNewSymbol& parsed_name, |
290 bool verify, |
291 bool verify, |
291 TRAPS); |
292 TRAPS); |
292 |
293 |
293 // Verifier checks |
294 // Verifier checks |
294 static void check_super_class_access(instanceKlassHandle this_klass, TRAPS); |
295 static void check_super_class_access(instanceKlassHandle this_klass, TRAPS); |