Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
PojavLauncherTeam
GitHub Repository: PojavLauncherTeam/mobile
Path: blob/master/src/hotspot/share/classfile/classFileParser.hpp
40949 views
1
/*
2
* Copyright (c) 1997, 2021, Oracle and/or its affiliates. All rights reserved.
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
*
19
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20
* or visit www.oracle.com if you need additional information or have any
21
* questions.
22
*
23
*/
24
25
#ifndef SHARE_CLASSFILE_CLASSFILEPARSER_HPP
26
#define SHARE_CLASSFILE_CLASSFILEPARSER_HPP
27
28
#include "memory/referenceType.hpp"
29
#include "oops/annotations.hpp"
30
#include "oops/constantPool.hpp"
31
#include "oops/instanceKlass.hpp"
32
#include "oops/typeArrayOop.hpp"
33
#include "utilities/accessFlags.hpp"
34
35
class Annotations;
36
template <typename T>
37
class Array;
38
class ClassFileStream;
39
class ClassLoaderData;
40
class ClassLoadInfo;
41
class ClassInstanceInfo;
42
class CompressedLineNumberWriteStream;
43
class ConstMethod;
44
class FieldInfo;
45
template <typename T>
46
class GrowableArray;
47
class InstanceKlass;
48
class RecordComponent;
49
class Symbol;
50
class TempNewSymbol;
51
class FieldLayoutBuilder;
52
53
// Utility to collect and compact oop maps during layout
54
class OopMapBlocksBuilder : public ResourceObj {
55
public:
56
OopMapBlock* _nonstatic_oop_maps;
57
unsigned int _nonstatic_oop_map_count;
58
unsigned int _max_nonstatic_oop_maps;
59
60
OopMapBlocksBuilder(unsigned int max_blocks);
61
OopMapBlock* last_oop_map() const;
62
void initialize_inherited_blocks(OopMapBlock* blocks, unsigned int nof_blocks);
63
void add(int offset, int count);
64
void copy(OopMapBlock* dst);
65
void compact();
66
void print_on(outputStream* st) const;
67
void print_value_on(outputStream* st) const;
68
};
69
70
// Values needed for oopmap and InstanceKlass creation
71
class FieldLayoutInfo : public ResourceObj {
72
public:
73
OopMapBlocksBuilder* oop_map_blocks;
74
int _instance_size;
75
int _nonstatic_field_size;
76
int _static_field_size;
77
bool _has_nonstatic_fields;
78
};
79
80
// Parser for for .class files
81
//
82
// The bytes describing the class file structure is read from a Stream object
83
84
class ClassFileParser {
85
friend class FieldLayoutBuilder;
86
friend class FieldLayout;
87
88
class ClassAnnotationCollector;
89
class FieldAllocationCount;
90
class FieldAnnotationCollector;
91
92
public:
93
// The ClassFileParser has an associated "publicity" level
94
// It is used to control which subsystems (if any)
95
// will observe the parsing (logging, events, tracing).
96
// Default level is "BROADCAST", which is equivalent to
97
// a "public" parsing attempt.
98
//
99
// "INTERNAL" level should be entirely private to the
100
// caller - this allows for internal reuse of ClassFileParser
101
//
102
enum Publicity {
103
INTERNAL,
104
BROADCAST
105
};
106
107
enum { LegalClass, LegalField, LegalMethod }; // used to verify unqualified names
108
109
private:
110
// Potentially unaligned pointer to various 16-bit entries in the class file
111
typedef void unsafe_u2;
112
113
const ClassFileStream* _stream; // Actual input stream
114
Symbol* _class_name;
115
mutable ClassLoaderData* _loader_data;
116
const bool _is_hidden;
117
const bool _can_access_vm_annotations;
118
int _orig_cp_size;
119
120
// Metadata created before the instance klass is created. Must be deallocated
121
// if not transferred to the InstanceKlass upon successful class loading
122
// in which case these pointers have been set to NULL.
123
const InstanceKlass* _super_klass;
124
ConstantPool* _cp;
125
Array<u2>* _fields;
126
Array<Method*>* _methods;
127
Array<u2>* _inner_classes;
128
Array<u2>* _nest_members;
129
u2 _nest_host;
130
Array<u2>* _permitted_subclasses;
131
Array<RecordComponent*>* _record_components;
132
Array<InstanceKlass*>* _local_interfaces;
133
Array<InstanceKlass*>* _transitive_interfaces;
134
Annotations* _combined_annotations;
135
AnnotationArray* _class_annotations;
136
AnnotationArray* _class_type_annotations;
137
Array<AnnotationArray*>* _fields_annotations;
138
Array<AnnotationArray*>* _fields_type_annotations;
139
InstanceKlass* _klass; // InstanceKlass* once created.
140
InstanceKlass* _klass_to_deallocate; // an InstanceKlass* to be destroyed
141
142
ClassAnnotationCollector* _parsed_annotations;
143
FieldAllocationCount* _fac;
144
FieldLayoutInfo* _field_info;
145
const intArray* _method_ordering;
146
GrowableArray<Method*>* _all_mirandas;
147
148
enum { fixed_buffer_size = 128 };
149
u_char _linenumbertable_buffer[fixed_buffer_size];
150
151
// Size of Java vtable (in words)
152
int _vtable_size;
153
int _itable_size;
154
155
int _num_miranda_methods;
156
157
ReferenceType _rt;
158
Handle _protection_domain;
159
AccessFlags _access_flags;
160
161
// for tracing and notifications
162
Publicity _pub_level;
163
164
// Used to keep track of whether a constant pool item 19 or 20 is found. These
165
// correspond to CONSTANT_Module and CONSTANT_Package tags and are not allowed
166
// in regular class files. For class file version >= 53, a CFE cannot be thrown
167
// immediately when these are seen because a NCDFE must be thrown if the class's
168
// access_flags have ACC_MODULE set. But, the access_flags haven't been looked
169
// at yet. So, the bad constant pool item is cached here. A value of zero
170
// means that no constant pool item 19 or 20 was found.
171
short _bad_constant_seen;
172
173
// class attributes parsed before the instance klass is created:
174
bool _synthetic_flag;
175
int _sde_length;
176
const char* _sde_buffer;
177
u2 _sourcefile_index;
178
u2 _generic_signature_index;
179
180
u2 _major_version;
181
u2 _minor_version;
182
u2 _this_class_index;
183
u2 _super_class_index;
184
u2 _itfs_len;
185
u2 _java_fields_count;
186
187
bool _need_verify;
188
bool _relax_verify;
189
190
bool _has_nonstatic_concrete_methods;
191
bool _declares_nonstatic_concrete_methods;
192
bool _has_final_method;
193
bool _has_contended_fields;
194
195
// precomputed flags
196
bool _has_finalizer;
197
bool _has_empty_finalizer;
198
bool _has_vanilla_constructor;
199
int _max_bootstrap_specifier_index; // detects BSS values
200
201
void parse_stream(const ClassFileStream* const stream, TRAPS);
202
203
void mangle_hidden_class_name(InstanceKlass* const ik);
204
205
void post_process_parsed_stream(const ClassFileStream* const stream,
206
ConstantPool* cp,
207
TRAPS);
208
209
void fill_instance_klass(InstanceKlass* ik, bool cf_changed_in_CFLH,
210
const ClassInstanceInfo& cl_inst_info, TRAPS);
211
212
void set_klass(InstanceKlass* instance);
213
214
void set_class_bad_constant_seen(short bad_constant);
215
short class_bad_constant_seen() { return _bad_constant_seen; }
216
void set_class_synthetic_flag(bool x) { _synthetic_flag = x; }
217
void set_class_sourcefile_index(u2 x) { _sourcefile_index = x; }
218
void set_class_generic_signature_index(u2 x) { _generic_signature_index = x; }
219
void set_class_sde_buffer(const char* x, int len) { _sde_buffer = x; _sde_length = len; }
220
221
void create_combined_annotations(TRAPS);
222
void apply_parsed_class_attributes(InstanceKlass* k); // update k
223
void apply_parsed_class_metadata(InstanceKlass* k, int fields_count);
224
void clear_class_metadata();
225
226
// Constant pool parsing
227
void parse_constant_pool_entries(const ClassFileStream* const stream,
228
ConstantPool* cp,
229
const int length,
230
TRAPS);
231
232
void parse_constant_pool(const ClassFileStream* const cfs,
233
ConstantPool* const cp,
234
const int length,
235
TRAPS);
236
237
// Interface parsing
238
void parse_interfaces(const ClassFileStream* const stream,
239
const int itfs_len,
240
ConstantPool* const cp,
241
bool* has_nonstatic_concrete_methods,
242
TRAPS);
243
244
const InstanceKlass* parse_super_class(ConstantPool* const cp,
245
const int super_class_index,
246
const bool need_verify,
247
TRAPS);
248
249
// Field parsing
250
void parse_field_attributes(const ClassFileStream* const cfs,
251
u2 attributes_count,
252
bool is_static,
253
u2 signature_index,
254
u2* const constantvalue_index_addr,
255
bool* const is_synthetic_addr,
256
u2* const generic_signature_index_addr,
257
FieldAnnotationCollector* parsed_annotations,
258
TRAPS);
259
260
void parse_fields(const ClassFileStream* const cfs,
261
bool is_interface,
262
FieldAllocationCount* const fac,
263
ConstantPool* cp,
264
const int cp_size,
265
u2* const java_fields_count_ptr,
266
TRAPS);
267
268
// Method parsing
269
Method* parse_method(const ClassFileStream* const cfs,
270
bool is_interface,
271
const ConstantPool* cp,
272
AccessFlags* const promoted_flags,
273
TRAPS);
274
275
void parse_methods(const ClassFileStream* const cfs,
276
bool is_interface,
277
AccessFlags* const promoted_flags,
278
bool* const has_final_method,
279
bool* const declares_nonstatic_concrete_methods,
280
TRAPS);
281
282
const unsafe_u2* parse_exception_table(const ClassFileStream* const stream,
283
u4 code_length,
284
u4 exception_table_length,
285
TRAPS);
286
287
void parse_linenumber_table(u4 code_attribute_length,
288
u4 code_length,
289
CompressedLineNumberWriteStream**const write_stream,
290
TRAPS);
291
292
const unsafe_u2* parse_localvariable_table(const ClassFileStream* const cfs,
293
u4 code_length,
294
u2 max_locals,
295
u4 code_attribute_length,
296
u2* const localvariable_table_length,
297
bool isLVTT,
298
TRAPS);
299
300
const unsafe_u2* parse_checked_exceptions(const ClassFileStream* const cfs,
301
u2* const checked_exceptions_length,
302
u4 method_attribute_length,
303
TRAPS);
304
305
// Classfile attribute parsing
306
u2 parse_generic_signature_attribute(const ClassFileStream* const cfs, TRAPS);
307
void parse_classfile_sourcefile_attribute(const ClassFileStream* const cfs, TRAPS);
308
void parse_classfile_source_debug_extension_attribute(const ClassFileStream* const cfs,
309
int length,
310
TRAPS);
311
312
// Check for circularity in InnerClasses attribute.
313
bool check_inner_classes_circularity(const ConstantPool* cp, int length, TRAPS);
314
315
u2 parse_classfile_inner_classes_attribute(const ClassFileStream* const cfs,
316
const ConstantPool* cp,
317
const u1* const inner_classes_attribute_start,
318
bool parsed_enclosingmethod_attribute,
319
u2 enclosing_method_class_index,
320
u2 enclosing_method_method_index,
321
TRAPS);
322
323
u2 parse_classfile_nest_members_attribute(const ClassFileStream* const cfs,
324
const u1* const nest_members_attribute_start,
325
TRAPS);
326
327
u2 parse_classfile_permitted_subclasses_attribute(const ClassFileStream* const cfs,
328
const u1* const permitted_subclasses_attribute_start,
329
TRAPS);
330
331
u2 parse_classfile_record_attribute(const ClassFileStream* const cfs,
332
const ConstantPool* cp,
333
const u1* const record_attribute_start,
334
TRAPS);
335
336
void parse_classfile_attributes(const ClassFileStream* const cfs,
337
ConstantPool* cp,
338
ClassAnnotationCollector* parsed_annotations,
339
TRAPS);
340
341
void parse_classfile_synthetic_attribute();
342
void parse_classfile_signature_attribute(const ClassFileStream* const cfs, TRAPS);
343
void parse_classfile_bootstrap_methods_attribute(const ClassFileStream* const cfs,
344
ConstantPool* cp,
345
u4 attribute_length,
346
TRAPS);
347
348
// Annotations handling
349
AnnotationArray* assemble_annotations(const u1* const runtime_visible_annotations,
350
int runtime_visible_annotations_length,
351
const u1* const runtime_invisible_annotations,
352
int runtime_invisible_annotations_length,
353
TRAPS);
354
355
void set_precomputed_flags(InstanceKlass* k);
356
357
// Format checker methods
358
void classfile_parse_error(const char* msg, TRAPS) const;
359
void classfile_parse_error(const char* msg, int index, TRAPS) const;
360
void classfile_parse_error(const char* msg, const char *name, TRAPS) const;
361
void classfile_parse_error(const char* msg,
362
int index,
363
const char *name,
364
TRAPS) const;
365
void classfile_parse_error(const char* msg,
366
const char* name,
367
const char* signature,
368
TRAPS) const;
369
370
void classfile_icce_error(const char* msg,
371
const Klass* k,
372
TRAPS) const;
373
374
void classfile_ucve_error(const char* msg,
375
const Symbol* class_name,
376
u2 major,
377
u2 minor,
378
TRAPS) const;
379
380
inline void guarantee_property(bool b, const char* msg, TRAPS) const {
381
if (!b) { classfile_parse_error(msg, THREAD); return; }
382
}
383
384
void report_assert_property_failure(const char* msg, TRAPS) const PRODUCT_RETURN;
385
void report_assert_property_failure(const char* msg, int index, TRAPS) const PRODUCT_RETURN;
386
387
inline void assert_property(bool b, const char* msg, TRAPS) const {
388
#ifdef ASSERT
389
if (!b) {
390
report_assert_property_failure(msg, THREAD);
391
}
392
#endif
393
}
394
395
inline void assert_property(bool b, const char* msg, int index, TRAPS) const {
396
#ifdef ASSERT
397
if (!b) {
398
report_assert_property_failure(msg, index, THREAD);
399
}
400
#endif
401
}
402
403
inline void check_property(bool property,
404
const char* msg,
405
int index,
406
TRAPS) const {
407
if (_need_verify) {
408
guarantee_property(property, msg, index, CHECK);
409
} else {
410
assert_property(property, msg, index, CHECK);
411
}
412
}
413
414
inline void check_property(bool property, const char* msg, TRAPS) const {
415
if (_need_verify) {
416
guarantee_property(property, msg, CHECK);
417
} else {
418
assert_property(property, msg, CHECK);
419
}
420
}
421
422
inline void guarantee_property(bool b,
423
const char* msg,
424
int index,
425
TRAPS) const {
426
if (!b) { classfile_parse_error(msg, index, THREAD); return; }
427
}
428
429
inline void guarantee_property(bool b,
430
const char* msg,
431
const char *name,
432
TRAPS) const {
433
if (!b) { classfile_parse_error(msg, name, THREAD); return; }
434
}
435
436
inline void guarantee_property(bool b,
437
const char* msg,
438
int index,
439
const char *name,
440
TRAPS) const {
441
if (!b) { classfile_parse_error(msg, index, name, THREAD); return; }
442
}
443
444
void throwIllegalSignature(const char* type,
445
const Symbol* name,
446
const Symbol* sig,
447
TRAPS) const;
448
449
void verify_constantvalue(const ConstantPool* const cp,
450
int constantvalue_index,
451
int signature_index,
452
TRAPS) const;
453
454
void verify_legal_utf8(const unsigned char* buffer, int length, TRAPS) const;
455
void verify_legal_class_name(const Symbol* name, TRAPS) const;
456
void verify_legal_field_name(const Symbol* name, TRAPS) const;
457
void verify_legal_method_name(const Symbol* name, TRAPS) const;
458
459
void verify_legal_field_signature(const Symbol* fieldname,
460
const Symbol* signature,
461
TRAPS) const;
462
int verify_legal_method_signature(const Symbol* methodname,
463
const Symbol* signature,
464
TRAPS) const;
465
466
void verify_class_version(u2 major, u2 minor, Symbol* class_name, TRAPS);
467
468
void verify_legal_class_modifiers(jint flags, TRAPS) const;
469
void verify_legal_field_modifiers(jint flags, bool is_interface, TRAPS) const;
470
void verify_legal_method_modifiers(jint flags,
471
bool is_interface,
472
const Symbol* name,
473
TRAPS) const;
474
475
void check_super_class_access(const InstanceKlass* this_klass,
476
TRAPS);
477
478
void check_super_interface_access(const InstanceKlass* this_klass,
479
TRAPS);
480
481
const char* skip_over_field_signature(const char* signature,
482
bool void_ok,
483
unsigned int length,
484
TRAPS) const;
485
486
// Wrapper for constantTag.is_klass_[or_]reference.
487
// In older versions of the VM, Klass*s cannot sneak into early phases of
488
// constant pool construction, but in later versions they can.
489
// %%% Let's phase out the old is_klass_reference.
490
bool valid_klass_reference_at(int index) const {
491
return _cp->is_within_bounds(index) &&
492
_cp->tag_at(index).is_klass_or_reference();
493
}
494
495
// Checks that the cpool index is in range and is a utf8
496
bool valid_symbol_at(int cpool_index) const {
497
return _cp->is_within_bounds(cpool_index) &&
498
_cp->tag_at(cpool_index).is_utf8();
499
}
500
501
void copy_localvariable_table(const ConstMethod* cm,
502
int lvt_cnt,
503
u2* const localvariable_table_length,
504
const unsafe_u2** const localvariable_table_start,
505
int lvtt_cnt,
506
u2* const localvariable_type_table_length,
507
const unsafe_u2** const localvariable_type_table_start,
508
TRAPS);
509
510
void copy_method_annotations(ConstMethod* cm,
511
const u1* runtime_visible_annotations,
512
int runtime_visible_annotations_length,
513
const u1* runtime_invisible_annotations,
514
int runtime_invisible_annotations_length,
515
const u1* runtime_visible_parameter_annotations,
516
int runtime_visible_parameter_annotations_length,
517
const u1* runtime_invisible_parameter_annotations,
518
int runtime_invisible_parameter_annotations_length,
519
const u1* runtime_visible_type_annotations,
520
int runtime_visible_type_annotations_length,
521
const u1* runtime_invisible_type_annotations,
522
int runtime_invisible_type_annotations_length,
523
const u1* annotation_default,
524
int annotation_default_length,
525
TRAPS);
526
527
void update_class_name(Symbol* new_name);
528
529
public:
530
ClassFileParser(ClassFileStream* stream,
531
Symbol* name,
532
ClassLoaderData* loader_data,
533
const ClassLoadInfo* cl_info,
534
Publicity pub_level,
535
TRAPS);
536
537
~ClassFileParser();
538
539
InstanceKlass* create_instance_klass(bool cf_changed_in_CFLH, const ClassInstanceInfo& cl_inst_info, TRAPS);
540
541
const ClassFileStream* clone_stream() const;
542
543
void set_klass_to_deallocate(InstanceKlass* klass);
544
545
int static_field_size() const;
546
int total_oop_map_count() const;
547
jint layout_size() const;
548
549
int vtable_size() const { return _vtable_size; }
550
int itable_size() const { return _itable_size; }
551
552
u2 this_class_index() const { return _this_class_index; }
553
554
bool is_hidden() const { return _is_hidden; }
555
bool is_interface() const { return _access_flags.is_interface(); }
556
557
ClassLoaderData* loader_data() const { return _loader_data; }
558
const Symbol* class_name() const { return _class_name; }
559
const InstanceKlass* super_klass() const { return _super_klass; }
560
561
ReferenceType reference_type() const { return _rt; }
562
AccessFlags access_flags() const { return _access_flags; }
563
564
bool is_internal() const { return INTERNAL == _pub_level; }
565
566
static bool verify_unqualified_name(const char* name, unsigned int length, int type);
567
568
#ifdef ASSERT
569
static bool is_internal_format(Symbol* class_name);
570
#endif
571
572
};
573
574
#endif // SHARE_CLASSFILE_CLASSFILEPARSER_HPP
575
576