Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
PojavLauncherTeam
GitHub Repository: PojavLauncherTeam/mobile
Path: blob/master/src/jdk.hotspot.agent/share/classes/sun/jvm/hotspot/classfile/ClassLoaderData.java
41161 views
1
/*
2
* Copyright (c) 2012, 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
*
23
*/
24
25
package sun.jvm.hotspot.classfile;
26
27
import sun.jvm.hotspot.debugger.*;
28
import sun.jvm.hotspot.memory.*;
29
import sun.jvm.hotspot.runtime.*;
30
import sun.jvm.hotspot.oops.*;
31
import sun.jvm.hotspot.types.*;
32
import sun.jvm.hotspot.utilities.Observable;
33
import sun.jvm.hotspot.utilities.Observer;
34
35
public class ClassLoaderData extends VMObject {
36
static {
37
VM.registerVMInitializedObserver(new Observer() {
38
public void update(Observable o, Object data) {
39
initialize(VM.getVM().getTypeDataBase());
40
}
41
});
42
}
43
44
private static synchronized void initialize(TypeDataBase db) throws WrongTypeException {
45
Type type = db.lookupType("ClassLoaderData");
46
classLoaderFieldOffset = type.getAddressField("_class_loader").getOffset();
47
nextField = type.getAddressField("_next");
48
klassesField = new MetadataField(type.getAddressField("_klasses"), 0);
49
hasClassMirrorHolderField = new CIntField(type.getCIntegerField("_has_class_mirror_holder"), 0);
50
dictionaryField = type.getAddressField("_dictionary");
51
}
52
53
private static long classLoaderFieldOffset;
54
private static AddressField nextField;
55
private static MetadataField klassesField;
56
private static CIntField hasClassMirrorHolderField;
57
private static AddressField dictionaryField;
58
59
public ClassLoaderData(Address addr) {
60
super(addr);
61
}
62
63
public Dictionary dictionary() {
64
Address tmp = dictionaryField.getValue();
65
return (Dictionary) VMObjectFactory.newObject(Dictionary.class, tmp);
66
}
67
68
public static ClassLoaderData instantiateWrapperFor(Address addr) {
69
if (addr == null) {
70
return null;
71
}
72
return new ClassLoaderData(addr);
73
}
74
75
public Oop getClassLoader() {
76
Address addr = getAddress().addOffsetTo(classLoaderFieldOffset);
77
VMOopHandle vmOopHandle = VMObjectFactory.newObject(VMOopHandle.class, addr);
78
return vmOopHandle.resolve();
79
}
80
81
public boolean gethasClassMirrorHolder() {
82
return hasClassMirrorHolderField.getValue(this) != 0;
83
}
84
85
public ClassLoaderData next() {
86
return instantiateWrapperFor(nextField.getValue(getAddress()));
87
}
88
89
public Klass getKlasses() { return (Klass)klassesField.getValue(this); }
90
91
/** Lookup an already loaded class. If not found null is returned. */
92
public Klass find(String className) {
93
for (Klass l = getKlasses(); l != null; l = l.getNextLinkKlass()) {
94
if (l.getName().equals(className)) {
95
if (l instanceof InstanceKlass && !((InstanceKlass)l).isLoaded()) {
96
return null; // don't return partially loaded classes
97
} else {
98
return l;
99
}
100
}
101
}
102
return null;
103
}
104
105
/** Iterate over all klasses - including object, primitive
106
array klasses */
107
public void classesDo(ClassLoaderDataGraph.ClassVisitor v) {
108
for (Klass l = getKlasses(); l != null; l = l.getNextLinkKlass()) {
109
// Only visit InstanceKlasses that are at least in the "loaded" init_state. Otherwise
110
// the InstanceKlass won't have some required fields initialized, which can cause problems.
111
if (l instanceof InstanceKlass && !((InstanceKlass)l).isLoaded()) {
112
continue;
113
}
114
v.visit(l);
115
}
116
}
117
118
/** Iterate over all klasses in the dictionary, including initiating loader. */
119
public void allEntriesDo(ClassLoaderDataGraph.ClassAndLoaderVisitor v) {
120
dictionary().allEntriesDo(v, getClassLoader());
121
}
122
}
123
124