27
28 #include "ci/ciConstantPoolCache.hpp"
29 #include "ci/ciFlags.hpp"
30 #include "ci/ciKlass.hpp"
31 #include "ci/ciSymbol.hpp"
32
33 // ciInstanceKlass
34 //
35 // This class represents a Klass* in the HotSpot virtual machine
36 // whose Klass part is an InstanceKlass. It may or may not
37 // be loaded.
38 class ciInstanceKlass : public ciKlass {
39 CI_PACKAGE_ACCESS
40 friend class ciBytecodeStream;
41 friend class ciEnv;
42 friend class ciExceptionHandler;
43 friend class ciMethod;
44 friend class ciField;
45
46 private:
47 jobject _loader;
48 jobject _protection_domain;
49
50 InstanceKlass::ClassState _init_state; // state of class
51 bool _is_shared;
52 bool _has_finalizer;
53 bool _has_subklass;
54 bool _has_nonstatic_fields;
55 bool _has_nonstatic_concrete_methods;
56 bool _is_anonymous;
57
58 ciFlags _flags;
59 jint _nonstatic_field_size;
60 jint _nonstatic_oop_map_size;
61
62 // Lazy fields get filled in only upon request.
63 ciInstanceKlass* _super;
64 ciInstance* _java_mirror;
65
66 ciConstantPoolCache* _field_cache; // cached map index->field
67 GrowableArray<ciField*>* _nonstatic_fields;
68 int _has_injected_fields; // any non static injected fields? lazily initialized.
69
70 // The possible values of the _implementor fall into following three cases:
71 // NULL: no implementor.
72 // A ciInstanceKlass that's not itself: one implementor.
73 // Itsef: more than one implementors.
74 ciInstanceKlass* _implementor;
75
76 void compute_injected_fields();
77 bool compute_injected_fields_helper();
78
79 protected:
80 ciInstanceKlass(Klass* k);
81 ciInstanceKlass(ciSymbol* name, jobject loader, jobject protection_domain);
82
83 InstanceKlass* get_instanceKlass() const {
84 return InstanceKlass::cast(get_Klass());
85 }
86
87 oop loader();
88 jobject loader_handle();
89
90 oop protection_domain();
91 jobject protection_domain_handle();
92
93 const char* type_string() { return "ciInstanceKlass"; }
94
95 bool is_in_package_impl(const char* packagename, int len);
96
97 void print_impl(outputStream* st);
98
99 ciConstantPoolCache* field_cache();
100
101 bool is_shared() { return _is_shared; }
102
103 void compute_shared_init_state();
104 bool compute_shared_has_subklass();
105 int compute_nonstatic_fields();
|
27
28 #include "ci/ciConstantPoolCache.hpp"
29 #include "ci/ciFlags.hpp"
30 #include "ci/ciKlass.hpp"
31 #include "ci/ciSymbol.hpp"
32
33 // ciInstanceKlass
34 //
35 // This class represents a Klass* in the HotSpot virtual machine
36 // whose Klass part is an InstanceKlass. It may or may not
37 // be loaded.
38 class ciInstanceKlass : public ciKlass {
39 CI_PACKAGE_ACCESS
40 friend class ciBytecodeStream;
41 friend class ciEnv;
42 friend class ciExceptionHandler;
43 friend class ciMethod;
44 friend class ciField;
45
46 private:
47 jobject _holder;
48 jobject _loader;
49 jobject _protection_domain;
50
51 InstanceKlass::ClassState _init_state; // state of class
52 bool _is_shared;
53 bool _has_finalizer;
54 bool _has_subklass;
55 bool _has_nonstatic_fields;
56 bool _has_nonstatic_concrete_methods;
57 bool _is_anonymous;
58
59 ciFlags _flags;
60 jint _nonstatic_field_size;
61 jint _nonstatic_oop_map_size;
62
63 // Lazy fields get filled in only upon request.
64 ciInstanceKlass* _super;
65 ciInstance* _java_mirror;
66
67 ciConstantPoolCache* _field_cache; // cached map index->field
68 GrowableArray<ciField*>* _nonstatic_fields;
69 int _has_injected_fields; // any non static injected fields? lazily initialized.
70
71 // The possible values of the _implementor fall into following three cases:
72 // NULL: no implementor.
73 // A ciInstanceKlass that's not itself: one implementor.
74 // Itsef: more than one implementors.
75 ciInstanceKlass* _implementor;
76
77 void compute_injected_fields();
78 bool compute_injected_fields_helper();
79
80 protected:
81 ciInstanceKlass(Klass* k);
82 ciInstanceKlass(ciSymbol* name, jobject holder, jobject loader, jobject protection_domain);
83
84 InstanceKlass* get_instanceKlass() const {
85 return InstanceKlass::cast(get_Klass());
86 }
87
88 // Hold metadata from unloading by keeping its holder alive.
89 // Though ciInstanceKlass records class loader oop, it's not enough to keep
90 // VM anonymous classes alive (loader == NULL). Klass holder should be used instead.
91 oop holder();
92 jobject holder_handle();
93
94 oop loader();
95 jobject loader_handle();
96
97 oop protection_domain();
98 jobject protection_domain_handle();
99
100 const char* type_string() { return "ciInstanceKlass"; }
101
102 bool is_in_package_impl(const char* packagename, int len);
103
104 void print_impl(outputStream* st);
105
106 ciConstantPoolCache* field_cache();
107
108 bool is_shared() { return _is_shared; }
109
110 void compute_shared_init_state();
111 bool compute_shared_has_subklass();
112 int compute_nonstatic_fields();
|