30
31 // An InstanceClassLoaderKlass is a specialization of the InstanceKlass. It does
32 // not add any field. It is added to walk the dependencies for the class loader
33 // key that this class loader points to. This is how the loader_data graph is
34 // walked and dependant class loaders are kept alive. I thought we walked
35 // the list later?
36
37 class InstanceClassLoaderKlass: public InstanceKlass {
38 friend class VMStructs;
39 friend class InstanceKlass;
40
41 // Constructor
42 InstanceClassLoaderKlass(int vtable_len, int itable_len, int static_field_size, int nonstatic_oop_map_size, ReferenceType rt, AccessFlags access_flags, bool is_anonymous)
43 : InstanceKlass(vtable_len, itable_len, static_field_size, nonstatic_oop_map_size, rt, access_flags, is_anonymous) {}
44
45 public:
46 virtual bool oop_is_instanceClassLoader() const { return true; }
47
48 InstanceClassLoaderKlass() { assert(DumpSharedSpaces || UseSharedSpaces, "only for CDS"); }
49
50 // Iterators
51 int oop_oop_iterate(oop obj, ExtendedOopClosure* blk) {
52 return oop_oop_iterate_v(obj, blk);
53 }
54 int oop_oop_iterate_m(oop obj, ExtendedOopClosure* blk, MemRegion mr) {
55 return oop_oop_iterate_v_m(obj, blk, mr);
56 }
57
58 #define InstanceClassLoaderKlass_OOP_OOP_ITERATE_DECL(OopClosureType, nv_suffix) \
59 int oop_oop_iterate##nv_suffix(oop obj, OopClosureType* blk); \
60 int oop_oop_iterate##nv_suffix##_m(oop obj, OopClosureType* blk, MemRegion mr);
61
62 ALL_OOP_OOP_ITERATE_CLOSURES_1(InstanceClassLoaderKlass_OOP_OOP_ITERATE_DECL)
63 ALL_OOP_OOP_ITERATE_CLOSURES_2(InstanceClassLoaderKlass_OOP_OOP_ITERATE_DECL)
64
65 #if INCLUDE_ALL_GCS
66 #define InstanceClassLoaderKlass_OOP_OOP_ITERATE_BACKWARDS_DECL(OopClosureType, nv_suffix) \
67 int oop_oop_iterate_backwards##nv_suffix(oop obj, OopClosureType* blk);
68
69 ALL_OOP_OOP_ITERATE_CLOSURES_1(InstanceClassLoaderKlass_OOP_OOP_ITERATE_BACKWARDS_DECL)
|
30
31 // An InstanceClassLoaderKlass is a specialization of the InstanceKlass. It does
32 // not add any field. It is added to walk the dependencies for the class loader
33 // key that this class loader points to. This is how the loader_data graph is
34 // walked and dependant class loaders are kept alive. I thought we walked
35 // the list later?
36
37 class InstanceClassLoaderKlass: public InstanceKlass {
38 friend class VMStructs;
39 friend class InstanceKlass;
40
41 // Constructor
42 InstanceClassLoaderKlass(int vtable_len, int itable_len, int static_field_size, int nonstatic_oop_map_size, ReferenceType rt, AccessFlags access_flags, bool is_anonymous)
43 : InstanceKlass(vtable_len, itable_len, static_field_size, nonstatic_oop_map_size, rt, access_flags, is_anonymous) {}
44
45 public:
46 virtual bool oop_is_instanceClassLoader() const { return true; }
47
48 InstanceClassLoaderKlass() { assert(DumpSharedSpaces || UseSharedSpaces, "only for CDS"); }
49
50
51 private:
52 template<class OopClosureType>
53 typename enable_if<!is_kind_of<ExtendedOopClosure, OopClosureType>::value, void>::type
54 do_metadata_if_applicable(oop obj, OopClosureType *cl);
55
56 template<class OopClosureType>
57 typename enable_if<is_kind_of<ExtendedOopClosure, OopClosureType>::value, void>::type
58 do_metadata_if_applicable(oop obj, OopClosureType *cl);
59
60 public:
61 template<class OopClosureType>
62 int oop_iterate_and_dispatch(oop obj, OopClosureType *cl);
63
64 int get_linear_oop_intervals(oop obj, OopInterval* &start, int &size) { return -_instance_class_loader_klass; }
65
66 // Iterators
67 int oop_oop_iterate(oop obj, ExtendedOopClosure* blk) {
68 return oop_oop_iterate_v(obj, blk);
69 }
70 int oop_oop_iterate_m(oop obj, ExtendedOopClosure* blk, MemRegion mr) {
71 return oop_oop_iterate_v_m(obj, blk, mr);
72 }
73
74 #define InstanceClassLoaderKlass_OOP_OOP_ITERATE_DECL(OopClosureType, nv_suffix) \
75 int oop_oop_iterate##nv_suffix(oop obj, OopClosureType* blk); \
76 int oop_oop_iterate##nv_suffix##_m(oop obj, OopClosureType* blk, MemRegion mr);
77
78 ALL_OOP_OOP_ITERATE_CLOSURES_1(InstanceClassLoaderKlass_OOP_OOP_ITERATE_DECL)
79 ALL_OOP_OOP_ITERATE_CLOSURES_2(InstanceClassLoaderKlass_OOP_OOP_ITERATE_DECL)
80
81 #if INCLUDE_ALL_GCS
82 #define InstanceClassLoaderKlass_OOP_OOP_ITERATE_BACKWARDS_DECL(OopClosureType, nv_suffix) \
83 int oop_oop_iterate_backwards##nv_suffix(oop obj, OopClosureType* blk);
84
85 ALL_OOP_OOP_ITERATE_CLOSURES_1(InstanceClassLoaderKlass_OOP_OOP_ITERATE_BACKWARDS_DECL)
|