1 /*
2  * Copyright (C) 2016 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package dalvik.system;
18 
19 /**
20  * Holder class for extraneous Class data.
21  *
22  * This class holds data for Class objects that is either rarely useful, only necessary for
23  * debugging purposes or both. This allows us to extend the Class class without impacting memory
24  * use.
25  *
26  * @hide For internal runtime use only.
27  */
28 public final class ClassExt {
29     /**
30      * A Pointer-sized-array of instance jfieldIDs in the same order as the ifields_ array.
31      * The jfieldID is associated with the ArtField at the corresonding index in the ifields_ array.
32      */
33     private Object instanceJfieldIDs;
34 
35     /**
36      * A Pointer-sized-array of jmethodIDS in the same order as the methods_
37      * array. The jmethodID is associated with the ArtField at the corresonding
38      * index in the methods_ array.
39      */
40     private Object jmethodIDs;
41 
42     /**
43      * If the class has undergone structural redefinition, the now obsolete class object.
44      *
45      * Needed to ensure that the class isn't unloaded before its jit code is. Normally this is
46      * handled by the classloader but since the class is now obsolete it's no longer held live
47      * there and instead we must do so manually. This class should not be used for anything.
48      */
49     private Class<?> obsoleteClass;
50 
51     /**
52      * An array of all obsolete DexCache objects that are needed for obsolete methods.
53      *
54      * These entries are associated with the obsolete ArtMethod pointers at the same indexes in the
55      * obsoleteMethods array.
56      *
57      * This field has native components and is a logical part of the 'Class' type.
58      */
59     private Object[] obsoleteDexCaches;
60 
61     /**
62      * An array of all native obsolete ArtMethod pointers.
63      *
64      * These are associated with their DexCaches at the same index in the obsoleteDexCaches array.
65      *
66      * This field is actually either an int[] or a long[] depending on size of a pointer.
67      *
68      * This field contains native pointers and is a logical part of the 'Class' type.
69      */
70     private Object obsoleteMethods;
71 
72     /**
73      * If set, the bytes, native pointer (as a java.lang.Long), or DexCache of the original dex-file
74      * associated with the related class.
75      *
76      * In this instance 'original' means either (1) the dex-file loaded for this class when it was
77      * first loaded after all non-retransformation capable transformations had been performed but
78      * before any retransformation capable ones had been done or (2) the most recent dex-file bytes
79      * given for a class redefinition.
80      *
81      * Needed in order to implement retransformation of classes.
82      *
83      * This field is a logical part of the 'Class' type.
84      */
85     private Object originalDexFile;
86 
87     /**
88      * A Pointer-sized-array of static jfieldIDs in the same order as the sfields_ array.
89      * The jfieldID is associated with the ArtField at the corresonding index in the sfields_ array.
90      */
91     private Object staticJfieldIDs;
92 
93     /**
94      * If class verify fails, we must return same error on subsequent tries. We may store either
95      * the class of the error, or an actual instance of Throwable here.
96      *
97      * This field is a logical part of the 'Class' type.
98      */
99     private Object verifyError;
100 
101     /**
102      * If set, native pointer to the initial, pre-redefine, dex file associated with the related
103      * class. This is different from the {@code originalDexFile} which is the pre-retransform dex
104      * file, i.e. could contain the bytes of the dex file provided during redefine.
105      *
106      * It is enough to store the native pointer because the pre-redefine dex file is either part
107      * of boot classpath or it is being kept alive by its class loader. Class loaders always keep
108      * dex files alive even if all their classes have been redefined.
109      *
110      * Needed in order to preserve access to dex-level hiddenapi flags after JVMTI redefine.
111      *
112      * This field is a logical part of the 'Class' type.
113      */
114     private long preRedefineDexFilePtr;
115 
116     /**
117      * ClassDef index of the related class in the pre-redefine dex file. Set together with
118      * {@code preRedefineDexFilePtr}.
119      *
120      * Needed in order to preserve access to dex-level hiddenapi flags after JVMTI redefine.
121      *
122      * This field is a logical part of the 'Class' type.
123      */
124     private int preRedefineClassDefIndex;
125 
126 
127     /**
128     * Private constructor.
129     *
130     * Only created by the runtime.
131     */
ClassExt()132     private ClassExt() {}
133 }
134