1 /* Copyright (c) 2015, 2019, Oracle and/or its affiliates. All rights reserved.
2 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
3 *
4 * This code is free software; you can redistribute it and/or modify it
5 * under the terms of the GNU General Public License version 2 only, as
6 * published by the Free Software Foundation.
7 *
8 * This code is distributed in the hope that it will be useful, but WITHOUT
9 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
10 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
11 * version 2 for more details (a copy is included in the LICENSE file that
12 * accompanied this code).
13 *
14 * You should have received a copy of the GNU General Public License version
15 * 2 along with this work; if not, write to the Free Software Foundation,
16 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
17 *
18 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
19 * or visit www.oracle.com if you need additional information or have any
20 * questions.
21 *
34 #include "utilities/macros.hpp"
35
36 template <typename T, class OopClosureType>
37 void InstanceMirrorKlass::oop_oop_iterate_statics(oop obj, OopClosureType* closure) {
38 T* p = (T*)start_of_static_fields(obj);
39 T* const end = p + java_lang_Class::static_oop_field_count_raw(obj);
40
41 for (; p < end; ++p) {
42 Devirtualizer::do_oop(closure, p);
43 }
44 }
45
46 template <typename T, class OopClosureType>
47 void InstanceMirrorKlass::oop_oop_iterate(oop obj, OopClosureType* closure) {
48 InstanceKlass::oop_oop_iterate<T>(obj, closure);
49
50 if (Devirtualizer::do_metadata(closure)) {
51 Klass* klass = java_lang_Class::as_Klass_raw(obj);
52 // We'll get NULL for primitive mirrors.
53 if (klass != NULL) {
54 if (klass->is_instance_klass() &&
55 InstanceKlass::cast(klass)->is_unsafe_anonymous()) {
56 // An unsafe anonymous class doesn't have its own class loader, so
57 // when handling the java mirror for the class we need to make sure its class
58 // loader data is claimed, this is done by calling do_cld explicitly.
59 // For non-anonymous classes the call to do_cld is made when the class
60 // loader itself is handled.
61 Devirtualizer::do_cld(closure, klass->class_loader_data());
62 } else {
63 Devirtualizer::do_klass(closure, klass);
64 }
65 } else {
66 // We would like to assert here (as below) that if klass has been NULL, then
67 // this has been a mirror for a primitive type that we do not need to follow
68 // as they are always strong roots.
69 // However, we might get across a klass that just changed during CMS concurrent
70 // marking if allocation occurred in the old generation.
71 // This is benign here, as we keep alive all CLDs that were loaded during the
72 // CMS concurrent phase in the class loading, i.e. they will be iterated over
73 // and kept alive during remark.
74 // assert(java_lang_Class::is_primitive(obj), "Sanity check");
75 }
76 }
77
|
1 /*
2 * Copyright (c) 2015, 2020, 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 *
35 #include "utilities/macros.hpp"
36
37 template <typename T, class OopClosureType>
38 void InstanceMirrorKlass::oop_oop_iterate_statics(oop obj, OopClosureType* closure) {
39 T* p = (T*)start_of_static_fields(obj);
40 T* const end = p + java_lang_Class::static_oop_field_count_raw(obj);
41
42 for (; p < end; ++p) {
43 Devirtualizer::do_oop(closure, p);
44 }
45 }
46
47 template <typename T, class OopClosureType>
48 void InstanceMirrorKlass::oop_oop_iterate(oop obj, OopClosureType* closure) {
49 InstanceKlass::oop_oop_iterate<T>(obj, closure);
50
51 if (Devirtualizer::do_metadata(closure)) {
52 Klass* klass = java_lang_Class::as_Klass_raw(obj);
53 // We'll get NULL for primitive mirrors.
54 if (klass != NULL) {
55 if (klass->is_instance_klass() && klass->class_loader_data()->has_class_mirror_holder()) {
56 // A weak hidden or an unsafe anonymous class doesn't have its own class loader,
57 // so when handling the java mirror for the class we need to make sure its class
58 // loader data is claimed, this is done by calling do_cld explicitly.
59 // For non-anonymous classes the call to do_cld is made when the class
60 // loader itself is handled.
61 Devirtualizer::do_cld(closure, klass->class_loader_data());
62 } else {
63 Devirtualizer::do_klass(closure, klass);
64 }
65 } else {
66 // We would like to assert here (as below) that if klass has been NULL, then
67 // this has been a mirror for a primitive type that we do not need to follow
68 // as they are always strong roots.
69 // However, we might get across a klass that just changed during CMS concurrent
70 // marking if allocation occurred in the old generation.
71 // This is benign here, as we keep alive all CLDs that were loaded during the
72 // CMS concurrent phase in the class loading, i.e. they will be iterated over
73 // and kept alive during remark.
74 // assert(java_lang_Class::is_primitive(obj), "Sanity check");
75 }
76 }
77
|