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 #include "precompiled.hpp"
26 #include "classfile/dictionary.hpp"
27 #include "classfile/javaClasses.hpp"
28 #include "classfile/systemDictionary.hpp"
29 #include "classfile/vmSymbols.hpp"
30 #include "gc/shared/collectedHeap.inline.hpp"
31 #include "logging/log.hpp"
32 #include "memory/heapInspection.hpp"
33 #include "memory/metadataFactory.hpp"
34 #include "memory/metaspaceClosure.hpp"
35 #include "memory/metaspaceShared.hpp"
36 #include "memory/oopFactory.hpp"
37 #include "memory/resourceArea.hpp"
38 #include "oops/instanceKlass.hpp"
39 #include "oops/klass.inline.hpp"
40 #include "oops/oop.inline.hpp"
41 #include "runtime/atomic.hpp"
42 #include "runtime/handles.inline.hpp"
43 #include "runtime/orderAccess.inline.hpp"
44 #include "trace/traceMacros.hpp"
45 #include "utilities/macros.hpp"
46 #include "utilities/stack.inline.hpp"
47
48 void Klass::set_java_mirror(Handle m) {
49 assert(!m.is_null(), "New mirror should never be null.");
50 assert(_java_mirror.resolve() == NULL, "should only be used to initialize mirror");
51 _java_mirror = class_loader_data()->add_handle(m);
52 }
53
54 oop Klass::java_mirror() const {
55 return _java_mirror.resolve();
56 }
57
552 }
553
554 // No archived mirror data
555 _java_mirror = NULL;
556 this->clear_has_raw_archived_mirror();
557 }
558
559 // Only recreate it if not present. A previous attempt to restore may have
560 // gotten an OOM later but keep the mirror if it was created.
561 if (java_mirror() == NULL) {
562 log_trace(cds, mirror)("Recreate mirror for %s", external_name());
563 java_lang_Class::create_mirror(this, loader, module_handle, protection_domain, CHECK);
564 }
565 }
566
567 #if INCLUDE_CDS_JAVA_HEAP
568 // Used at CDS dump time to access the archived mirror. No GC barrier.
569 oop Klass::archived_java_mirror_raw() {
570 assert(DumpSharedSpaces, "called only during runtime");
571 assert(has_raw_archived_mirror(), "must have raw archived mirror");
572 return oopDesc::decode_heap_oop(_archived_mirror);
573 }
574
575 // Used at CDS runtime to get the archived mirror from shared class. Uses GC barrier.
576 oop Klass::archived_java_mirror() {
577 assert(UseSharedSpaces, "UseSharedSpaces expected.");
578 assert(has_raw_archived_mirror(), "must have raw archived mirror");
579 return RootAccess<IN_ARCHIVE_ROOT>::oop_load(&_archived_mirror);
580 }
581
582 // No GC barrier
583 void Klass::set_archived_java_mirror_raw(oop m) {
584 assert(DumpSharedSpaces, "called only during runtime");
585 _archived_mirror = oopDesc::encode_heap_oop(m);
586 }
587 #endif // INCLUDE_CDS_JAVA_HEAP
588
589 Klass* Klass::array_klass_or_null(int rank) {
590 EXCEPTION_MARK;
591 // No exception can be thrown by array_klass_impl when called with or_null == true.
592 // (In anycase, the execption mark will fail if it do so)
593 return array_klass_impl(true, rank, THREAD);
594 }
595
596
597 Klass* Klass::array_klass_or_null() {
598 EXCEPTION_MARK;
599 // No exception can be thrown by array_klass_impl when called with or_null == true.
600 // (In anycase, the execption mark will fail if it do so)
601 return array_klass_impl(true, THREAD);
602 }
603
604
605 Klass* Klass::array_klass_impl(bool or_null, int rank, TRAPS) {
|
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 #include "precompiled.hpp"
26 #include "classfile/dictionary.hpp"
27 #include "classfile/javaClasses.hpp"
28 #include "classfile/systemDictionary.hpp"
29 #include "classfile/vmSymbols.hpp"
30 #include "gc/shared/collectedHeap.inline.hpp"
31 #include "logging/log.hpp"
32 #include "memory/heapInspection.hpp"
33 #include "memory/metadataFactory.hpp"
34 #include "memory/metaspaceClosure.hpp"
35 #include "memory/metaspaceShared.hpp"
36 #include "memory/oopFactory.hpp"
37 #include "memory/resourceArea.hpp"
38 #include "oops/compressedOops.inline.hpp"
39 #include "oops/instanceKlass.hpp"
40 #include "oops/klass.inline.hpp"
41 #include "oops/oop.inline.hpp"
42 #include "runtime/atomic.hpp"
43 #include "runtime/handles.inline.hpp"
44 #include "runtime/orderAccess.inline.hpp"
45 #include "trace/traceMacros.hpp"
46 #include "utilities/macros.hpp"
47 #include "utilities/stack.inline.hpp"
48
49 void Klass::set_java_mirror(Handle m) {
50 assert(!m.is_null(), "New mirror should never be null.");
51 assert(_java_mirror.resolve() == NULL, "should only be used to initialize mirror");
52 _java_mirror = class_loader_data()->add_handle(m);
53 }
54
55 oop Klass::java_mirror() const {
56 return _java_mirror.resolve();
57 }
58
553 }
554
555 // No archived mirror data
556 _java_mirror = NULL;
557 this->clear_has_raw_archived_mirror();
558 }
559
560 // Only recreate it if not present. A previous attempt to restore may have
561 // gotten an OOM later but keep the mirror if it was created.
562 if (java_mirror() == NULL) {
563 log_trace(cds, mirror)("Recreate mirror for %s", external_name());
564 java_lang_Class::create_mirror(this, loader, module_handle, protection_domain, CHECK);
565 }
566 }
567
568 #if INCLUDE_CDS_JAVA_HEAP
569 // Used at CDS dump time to access the archived mirror. No GC barrier.
570 oop Klass::archived_java_mirror_raw() {
571 assert(DumpSharedSpaces, "called only during runtime");
572 assert(has_raw_archived_mirror(), "must have raw archived mirror");
573 return CompressedOops::decode(_archived_mirror);
574 }
575
576 // Used at CDS runtime to get the archived mirror from shared class. Uses GC barrier.
577 oop Klass::archived_java_mirror() {
578 assert(UseSharedSpaces, "UseSharedSpaces expected.");
579 assert(has_raw_archived_mirror(), "must have raw archived mirror");
580 return RootAccess<IN_ARCHIVE_ROOT>::oop_load(&_archived_mirror);
581 }
582
583 // No GC barrier
584 void Klass::set_archived_java_mirror_raw(oop m) {
585 assert(DumpSharedSpaces, "called only during runtime");
586 _archived_mirror = CompressedOops::encode(m);
587 }
588 #endif // INCLUDE_CDS_JAVA_HEAP
589
590 Klass* Klass::array_klass_or_null(int rank) {
591 EXCEPTION_MARK;
592 // No exception can be thrown by array_klass_impl when called with or_null == true.
593 // (In anycase, the execption mark will fail if it do so)
594 return array_klass_impl(true, rank, THREAD);
595 }
596
597
598 Klass* Klass::array_klass_or_null() {
599 EXCEPTION_MARK;
600 // No exception can be thrown by array_klass_impl when called with or_null == true.
601 // (In anycase, the execption mark will fail if it do so)
602 return array_klass_impl(true, THREAD);
603 }
604
605
606 Klass* Klass::array_klass_impl(bool or_null, int rank, TRAPS) {
|