Home | History | Annotate | Download | only in oo

Lines Matching defs:clazz

179 static void loadMethodFromDex(ClassObject* clazz, const DexMethod* pDexMethod,\
182 static void loadSFieldFromDex(ClassObject* clazz,
184 static void loadIFieldFromDex(ClassObject* clazz,
186 static bool precacheReferenceOffsets(ClassObject* clazz);
187 static void computeRefOffsets(ClassObject* clazz);
189 static bool createVtable(ClassObject* clazz);
190 static bool createIftable(ClassObject* clazz);
191 static bool insertMethodStubs(ClassObject* clazz);
192 static bool computeFieldOffsets(ClassObject* clazz);
193 static void throwEarlierClassFailure(ClassObject* clazz);
203 static void logClassLoadWithTime(char type, ClassObject* clazz, u8 time) {
209 get_process_name(), (int) clazz->classLoader, clazz->descriptor,
216 static void logClassLoad(char type, ClassObject* clazz) {
217 logClassLoadWithTime(type, clazz, dvmGetThreadCpuTimeNsec());
298 size_t dvmClassObjectSize(const ClassObject *clazz)
300 assert(clazz != NULL);
301 return classObjectSize(clazz->sfieldCount);
834 static InitiatingLoaderList *dvmGetInitiatingLoaderList(ClassObject* clazz)
836 assert(clazz->serialNumber >= INITIAL_CLASS_SERIAL_NUMBER);
837 int classIndex = clazz->serialNumber-INITIAL_CLASS_SERIAL_NUMBER;
842 return &(clazz->initiatingLoaderList);
847 * Determine if "loader" appears in clazz' initiating loader list.
856 bool dvmLoaderInInitiatingList(const ClassObject* clazz, const Object* loader)
869 /* Cast to remove the const from clazz, but use const loaderList */
870 ClassObject* nonConstClazz = (ClassObject*) clazz;
877 // loader, clazz->descriptor);
885 * Add "loader" to clazz's initiating loader set, unless it's the defining
894 void dvmAddInitiatingLoader(ClassObject* clazz, Object* loader)
896 if (loader != clazz->classLoader) {
899 LOGVV("Adding %p to '%s' init list\n", loader, clazz->descriptor);
907 //if (dvmLoaderInInitiatingList(clazz, loader)) {
920 InitiatingLoaderList *loaderList = dvmGetInitiatingLoaderList(clazz);
936 // clazz->descriptor);
962 const ClassObject* clazz = (const ClassObject*) vclazz;
966 match = (strcmp(clazz->descriptor, pCrit->descriptor) == 0 &&
967 (clazz->classLoader == pCrit->loader ||
969 dvmLoaderInInitiatingList(clazz, pCrit->loader)) ));
973 // clazz->descriptor, clazz->classLoader);
983 const ClassObject* clazz = (const ClassObject*) vclazz;
987 match = (strcmp(clazz->descriptor, addClazz->descriptor) == 0 &&
988 (clazz->classLoader == addClazz->classLoader ||
990 dvmLoaderInInitiatingList(clazz, addClazz->classLoader)) ));
1061 bool dvmAddClassToHash(ClassObject* clazz)
1066 hash = dvmComputeUtf8Hash(clazz->descriptor);
1069 found = dvmHashTableLookup(gDvm.loadedClasses, hash, clazz,
1074 clazz->descriptor, clazz->classLoader,
1075 (found == (void*) clazz), clazz);
1080 return (found == (void*) clazz);
1107 static void removeClassFromHash(ClassObject* clazz)
1109 LOGV("+++ removeClassFromHash '%s'\n", clazz->descriptor);
1111 u4 hash = dvmComputeUtf8Hash(clazz->descriptor);
1114 if (!dvmHashTableRemove(gDvm.loadedClasses, hash, clazz))
1115 LOGW("Hash table remove failed on class '%s'\n", clazz->descriptor);
1127 * Set clazz->serialNumber to the next available value.
1132 void dvmSetClassSerialNumber(ClassObject* clazz)
1134 assert(clazz->serialNumber == 0);
1135 clazz->serialNumber = android_atomic_inc(&gDvm.classSerialNumber);
1151 ClassObject* clazz;
1153 clazz = dvmFindClassNoInit(descriptor, loader);
1154 if (clazz != NULL && clazz->status < CLASS_INITIALIZED) {
1156 if (!dvmInitClass(clazz)) {
1159 assert(clazz->status == CLASS_ERROR);
1164 return clazz;
1215 ClassObject* clazz;
1229 clazz = dvmLookupClass(descriptor, loader, false);
1230 if (clazz != NULL) {
1232 return clazz;
1255 loadClass = dvmFindVirtualMethodHierByDescriptor(loader->clazz, "loadClass",
1273 clazz = (ClassObject*) result.l;
1281 dotName, loader, excep->clazz->descriptor);
1288 clazz = NULL;
1290 } else if (clazz == NULL) {
1297 dvmAddInitiatingLoader(clazz, loader);
1299 LOGVV("--- Successfully loaded %s %p (thisldr=%p clazz=%p)\n",
1300 descriptor, clazz->classLoader, loader, clazz);
1305 return clazz;
1332 ClassObject* clazz;
1334 clazz = dvmFindSystemClassNoInit(descriptor);
1335 if (clazz != NULL && clazz->status < CLASS_INITIALIZED) {
1337 if (!dvmInitClass(clazz)) {
1340 assert(clazz->status == CLASS_ERROR);
1345 return clazz;
1377 ClassObject* clazz;
1399 descriptor, dvmGetException(self)->clazz->descriptor);
1404 clazz = dvmLookupClass(descriptor, loader, true);
1405 if (clazz == NULL) {
1435 clazz = loadClassFromDex(pDvmDex, pClassDef, loader);
1438 if (clazz != NULL) {
1439 dvmFreeClassInnards(clazz);
1440 dvmReleaseTrackedAlloc((Object*) clazz, NULL);
1450 dvmLockObject(self, (Object*) clazz);
1451 clazz->initThreadId = self->threadId;
1458 assert(clazz->classLoader == loader);
1459 if (!dvmAddClassToHash(clazz)) {
1468 clazz->initThreadId = 0;
1469 dvmUnlockObject(self, (Object*) clazz);
1473 dvmFreeClassInnards(clazz);
1474 dvmReleaseTrackedAlloc((Object*) clazz, NULL);
1478 clazz = dvmLookupClass(descriptor, loader, true);
1479 assert(clazz != NULL);
1482 dvmReleaseTrackedAlloc((Object*) clazz, NULL);
1485 logClassLoadWithTime('>', clazz, startTime);
1490 if (!dvmLinkClass(clazz)) {
1495 removeClassFromHash(clazz);
1496 clazz->status = CLASS_ERROR;
1497 dvmFreeClassInnards(clazz);
1501 clazz->initThreadId = 0;
1502 dvmObjectNotifyAll(self, (Object*) clazz);
1503 dvmUnlockObject(self, (Object*) clazz);
1507 clazz->descriptor, get_process_name());
1514 logClassLoad('<', clazz);
1516 clazz = NULL;
1525 dvmObjectNotifyAll(self, (Object*) clazz);
1526 dvmUnlockObject(self, (Object*) clazz);
1535 clazz->virtualMethodCount + clazz->directMethodCount;
1536 gDvm.numDeclaredInstFields += clazz->ifieldCount;
1537 gDvm.numDeclaredStaticFields += clazz->sfieldCount;
1552 gDvm.classJavaLangObject = clazz;
1556 logClassLoad('<', clazz);
1561 if (!dvmIsClassLinked(clazz) && clazz->status != CLASS_ERROR) {
1574 dvmLockObject(self, (Object*) clazz);
1575 if (!dvmIsClassLinked(clazz) &&
1576 clazz->initThreadId == self->threadId)
1578 LOGW("Recursive link on class %s\n", clazz->descriptor);
1579 dvmUnlockObject(self, (Object*) clazz);
1581 "Ljava/lang/ClassCircularityError;", clazz->descriptor);
1582 clazz = NULL;
1586 // clazz->descriptor, clazz->initThreadId);
1587 while (!dvmIsClassLinked(clazz) && clazz->status != CLASS_ERROR) {
1588 dvmObjectWait(self, (Object*) clazz, 0, 0, false);
1590 dvmUnlockObject(self, (Object*) clazz);
1592 if (clazz->status == CLASS_ERROR) {
1597 throwEarlierClassFailure(clazz);
1598 clazz = NULL;
1604 assert(dvmIsClassLinked(clazz));
1606 assert(clazz->obj.clazz == gDvm.classJavaLangClass);
1607 if (clazz != gDvm.classJavaLangObject) {
1608 if (clazz->super == NULL) {
1614 if (!dvmIsInterfaceClass(clazz)) {
1616 // clazz->descriptor, clazz->vtableCount,
1617 // clazz->virtualMethodCount);
1618 assert(clazz->vtableCount >= clazz->virtualMethodCount);
1629 if (clazz == gDvm.classJavaLangClass && !dvmIsClassInitialized(clazz) &&
1630 !(clazz->status == CLASS_VERIFYING))
1632 LOGV("+++ explicitly initializing %s\n", clazz->descriptor);
1633 dvmInitClass(clazz);
1639 assert(clazz != NULL || dvmCheckException(self));
1640 return clazz;
1916 void dvmFreeClassInnards(ClassObject* clazz)
1921 if (clazz == NULL)
1924 assert(clazz->obj.clazz == gDvm.classJavaLangClass);
1950 dvmLinearFree(clazz->classLoader, tp); \
1956 clazz->vtableCount = -1;
1957 if (clazz->vtable == gDvm.classJavaLangObject->vtable) {
1958 clazz->vtable = NULL;
1960 NULL_AND_LINEAR_FREE(clazz->vtable);
1963 clazz->descriptor = NULL;
1964 NULL_AND_FREE(clazz->descriptorAlloc);
1966 if (clazz->directMethods != NULL) {
1967 Method *directMethods = clazz->directMethods;
1968 int directMethodCount = clazz->directMethodCount;
1969 clazz->directMethods = NULL;
1970 clazz->directMethodCount = -1;
1971 dvmLinearReadWrite(clazz->classLoader, directMethods);
1975 dvmLinearReadOnly(clazz->classLoader, directMethods);
1976 dvmLinearFree(clazz->classLoader, directMethods);
1978 if (clazz->virtualMethods != NULL) {
1979 Method *virtualMethods = clazz->virtualMethods;
1980 int virtualMethodCount = clazz->virtualMethodCount;
1981 clazz->virtualMethodCount = -1;
1982 clazz->virtualMethods = NULL;
1983 dvmLinearReadWrite(clazz->classLoader, virtualMethods);
1987 dvmLinearReadOnly(clazz->classLoader, virtualMethods);
1988 dvmLinearFree(clazz->classLoader, virtualMethods);
1991 InitiatingLoaderList *loaderList = dvmGetInitiatingLoaderList(clazz);
1995 clazz->interfaceCount = -1;
1996 NULL_AND_LINEAR_FREE(clazz->interfaces);
1998 clazz->iftableCount = -1;
1999 NULL_AND_LINEAR_FREE(clazz->iftable);
2001 clazz->ifviPoolCount = -1;
2002 NULL_AND_LINEAR_FREE(clazz->ifviPool);
2004 clazz->sfieldCount = -1;
2008 clazz->ifieldCount = -1;
2009 NULL_AND_LINEAR_FREE(clazz->ifields);
2043 dvmLinearFree(meth->clazz->classLoader, methodDexCode);
2055 LOGE(" cloning %s.%s\n", src->clazz->descriptor, src->name);
2067 static void loadMethodFromDex(ClassObject* clazz, const DexMethod* pDexMethod,
2070 DexFile* pDexFile = clazz->pDvmDex->pDexFile;
2080 meth->clazz = clazz;
2084 SET_CLASS_FLAG(clazz, CLASS_ISFINALIZABLE);
2138 dvmLinearReadWrite(meth->clazz->classLoader, methodDexCode);
2146 meth->clazz->descriptor, meth->name, dexCodeSize);
2149 (DexCode*) dvmLinearAlloc(meth->clazz->classLoader, dexCodeSize);
2166 dvmLinearReadOnly(meth->clazz->classLoader, methodDexCode);
2241 static void loadSFieldFromDex(ClassObject* clazz,
2244 DexFile* pDexFile = clazz->pDvmDex->pDexFile;
2249 sfield->field.clazz = clazz;
2269 static void loadIFieldFromDex(ClassObject* clazz,
2272 DexFile* pDexFile = clazz->pDvmDex->pDexFile;
2277 ifield->field.clazz = clazz;
2294 static bool precacheReferenceOffsets(ClassObject* clazz)
2307 dvmLinearReadWrite(clazz->classLoader, clazz->ifields);
2308 for (i = 0; i < clazz->ifieldRefCount; i++) {
2309 InstField *pField = &clazz->ifields[i];
2315 targetIndex = clazz->ifieldRefCount - 1;
2317 InstField *swapField = &clazz->ifields[targetIndex];
2336 clazz->ifieldRefCount--;
2341 dvmLinearReadOnly(clazz->classLoader, clazz->ifields);
2342 if (i == clazz->ifieldRefCount) {
2343 LOGE("Unable to reorder 'referent' in %s\n", clazz->descriptor);
2351 gDvm.classJavaLangRefReference = clazz;
2374 meth = dvmFindDirectMethodByDescriptor(clazz, "enqueueInternal", "()Z");
2386 static void computeRefOffsets(ClassObject* clazz)
2388 if (clazz->super != NULL) {
2389 clazz->refOffsets = clazz->super->refOffsets;
2391 clazz->refOffsets = 0;
2396 if (clazz->refOffsets != CLASS_WALK_SUPER) {
2403 f = clazz->ifields;
2404 const int ifieldRefCount = clazz->ifieldRefCount;
2416 clazz->refOffsets |= newBit;
2418 clazz->refOffsets = CLASS_WALK_SUPER;
2433 * If clazz->status is CLASS_IDX, then clazz->super and interfaces[] are
2441 bool dvmLinkClass(ClassObject* clazz)
2448 assert(clazz != NULL);
2449 assert(clazz->descriptor != NULL);
2450 assert(clazz->status == CLASS_IDX || clazz->status == CLASS_LOADED);
2452 LOGV("CLASS: linking '%s'...\n", clazz->descriptor);
2455 assert(clazz->obj.clazz == gDvm.classJavaLangClass);
2456 if (clazz->classLoader == NULL &&
2457 (strcmp(clazz->descriptor, "Ljava/lang/Class;") == 0))
2472 * At this point, clazz's reference fields may contain Dex file
2478 if (clazz->status == CLASS_IDX) {
2479 if (clazz->interfaceCount > 0) {
2483 assert(sizeof(*interfaceIdxArray) == sizeof(*clazz->interfaces));
2484 size_t len = clazz->interfaceCount * sizeof(*interfaceIdxArray);
2487 LOGW("Unable to allocate memory to link %s", clazz->descriptor);
2490 memcpy(interfaceIdxArray, clazz->interfaces, len);
2492 dvmLinearReadWrite(clazz->classLoader, clazz->interfaces);
2493 memset(clazz->interfaces, 0, len);
2494 dvmLinearReadOnly(clazz->classLoader, clazz->interfaces);
2497 assert(sizeof(superclassIdx) == sizeof(clazz->super));
2498 superclassIdx = (u4) clazz->super;
2499 clazz->super = NULL;
2500 /* After this line, clazz will be fair game for the GC. The
2503 clazz->status = CLASS_LOADED;
2506 ClassObject* super = dvmResolveClass(clazz, superclassIdx, false);
2512 clazz->descriptor, superclassIdx);
2515 clazz->descriptor, superclassIdx);
2519 dvmSetFieldObject((Object *)clazz,
2524 if (clazz->interfaceCount > 0) {
2527 dvmLinearReadWrite(clazz->classLoader, clazz->interfaces);
2528 for (i = 0; i < clazz->interfaceCount; i++) {
2530 clazz->interfaces[i] =
2531 dvmResolveClass(clazz, interfaceIdxArray[i], false);
2532 if (clazz->interfaces[i] == NULL) {
2533 const DexFile* pDexFile = clazz->pDvmDex->pDexFile;
2536 dvmLinearReadOnly(clazz->classLoader, clazz->interfaces);
2544 clazz->descriptor, interfaceIdxArray[i],
2548 clazz->descriptor, interfaceIdxArray[i],
2555 if (!dvmCheckClassAccess(clazz, clazz->interfaces[i])) {
2556 dvmLinearReadOnly(clazz->classLoader, clazz->interfaces);
2558 clazz->interfaces[i]->descriptor, clazz->descriptor);
2564 clazz->interfaces[i]->descriptor);
2566 dvmLinearReadOnly(clazz->classLoader, clazz->interfaces);
2579 assert(clazz->primitiveType == PRIM_NOT);
2580 if (strcmp(clazz->descriptor, "Ljava/lang/Object;") == 0) {
2581 if (clazz->super != NULL) {
2593 CLEAR_CLASS_FLAG(clazz, CLASS_ISFINALIZABLE);
2595 if (clazz->super == NULL) {
2601 if (dvmIsFinalClass(clazz->super)) {
2603 clazz->descriptor, clazz->super->descriptor);
2607 } else if (dvmIsInterfaceClass(clazz->super)) {
2609 clazz->descriptor, clazz->super->descriptor);
2613 } else if (!dvmCheckClassAccess(clazz, clazz->super)) {
2615 clazz->descriptor, clazz->super->descriptor);
2625 if (IS_CLASS_FLAG_SET(clazz->super, CLASS_ISFINALIZABLE)) {
2626 SET_CLASS_FLAG(clazz, CLASS_ISFINALIZABLE);
2632 if (IS_CLASS_FLAG_SET(clazz->super, CLASS_ISREFERENCE)) {
2638 superRefFlags = GET_CLASS_FLAG_GROUP(clazz->super,
2642 SET_CLASS_FLAG(clazz, superRefFlags);
2643 } else if (clazz->classLoader == NULL &&
2644 clazz->super->classLoader == NULL &&
2645 strcmp(clazz->super->descriptor,
2654 if (strcmp(clazz->descriptor,
2659 } else if (strcmp(clazz->descriptor,
2663 } else if (strcmp(clazz->descriptor,
2679 assert(GET_CLASS_FLAG_GROUP(clazz,
2684 SET_CLASS_FLAG(clazz, refFlags);
2691 if (dvmIsInterfaceClass(clazz)) {
2693 int count = clazz->virtualMethodCount;
2697 clazz->descriptor);
2701 dvmLinearReadWrite(clazz->classLoader, clazz->virtualMethods);
2704 clazz->virtualMethods[i].methodIndex = (u2) i;
2706 dvmLinearReadOnly(clazz->classLoader, clazz->virtualMethods);
2708 if (!createVtable(clazz)) {
2717 if (!createIftable(clazz))
2723 if (!insertMethodStubs(clazz))
2729 if (!computeFieldOffsets(clazz))
2736 if (clazz->classLoader == NULL) {
2737 if (strcmp(clazz->descriptor, "Ljava/lang/ref/Reference;") == 0) {
2738 if (!precacheReferenceOffsets(clazz)) {
2743 } else if (clazz == gDvm.classJavaLangClass) {
2744 gDvm.offJavaLangClass_pd = dvmFindFieldOffset(clazz, "pd",
2758 computeRefOffsets(clazz);
2763 if (IS_CLASS_FLAG_SET(clazz, CLASS_ISPREVERIFIED))
2764 clazz->status = CLASS_VERIFIED;
2766 clazz->status = CLASS_RESOLVED;
2769 LOGV("CLASS: linked '%s'\n", clazz->descriptor);
2783 dvmDbgPostClassPrepare(clazz);
2788 clazz->status = CLASS_ERROR;
2806 static bool createVtable(ClassObject* clazz)
2812 if (clazz->super != NULL) {
2813 //LOGI("SUPER METHODS %d %s->%s\n", clazz->super->vtableCount,
2814 // clazz->descriptor, clazz->super->descriptor);
2818 maxCount = clazz->virtualMethodCount;
2819 if (clazz->super != NULL) {
2820 maxCount += clazz->super->vtableCount;
2825 assert(strcmp(clazz->descriptor, "Ljava/lang/Object;") == 0);
2827 //LOGD("+++ max vmethods for '%s' is %d\n", clazz->descriptor, maxCount);
2835 dvmLinearReadWrite(clazz->classLoader, clazz->virtualMethods);
2836 clazz->vtable = (Method**) dvmLinearAlloc(clazz->classLoader,
2838 if (clazz->vtable == NULL)
2841 if (clazz->super != NULL) {
2844 memcpy(clazz->vtable, clazz->super->vtable,
2845 sizeof(*(clazz->vtable)) * clazz->super->vtableCount);
2846 actualCount = clazz->super->vtableCount;
2851 for (i = 0; i < clazz->virtualMethodCount; i++) {
2852 Method* localMeth = &clazz->virtualMethods[i];
2855 for (si = 0; si < clazz->super->vtableCount; si++) {
2856 Method* superMeth = clazz->vtable[si];
2863 localMeth->clazz->descriptor, localMeth->name,
2864 superMeth->clazz->descriptor, superMeth->name);
2867 clazz
2870 // clazz->descriptor, localMeth->name, si);
2875 if (si == clazz->super->vtableCount) {
2877 clazz->vtable[actualCount] = localMeth;
2882 // clazz->descriptor, localMeth->name);
2888 clazz->descriptor);
2895 assert(clazz->vtable != NULL);
2896 dvmLinearReadOnly(clazz->classLoader, clazz->vtable);
2897 clazz->vtable = dvmLinearRealloc(clazz->classLoader, clazz->vtable,
2898 sizeof(*(clazz->vtable)) * actualCount);
2899 if (clazz->vtable == NULL) {
2908 clazz->vtableCount = actualCount;
2911 int count = clazz->virtualMethodCount;
2914 clazz->descriptor);
2919 clazz->vtable[i] = &clazz->virtualMethods[i];
2920 clazz->virtualMethods[i].methodIndex = (u2) i;
2922 clazz->vtableCount = clazz->virtualMethodCount;
2928 dvmLinearReadOnly(clazz->classLoader, clazz->vtable);
2929 dvmLinearReadOnly(clazz->classLoader, clazz->virtualMethods);
2946 * Because of "Miranda methods", this may reallocate clazz->virtualMethods.
2950 static bool createIftable(ClassObject* clazz)
2959 if (clazz->super != NULL)
2960 superIfCount = clazz->super->iftableCount;
2965 ifCount += clazz->interfaceCount;
2966 for (i = 0; i < clazz->interfaceCount; i++)
2967 ifCount += clazz->interfaces[i]->iftableCount;
2970 clazz->descriptor, ifCount - superIfCount, superIfCount, ifCount);
2973 assert(clazz->iftableCount == 0);
2974 assert(clazz->iftable == NULL);
2983 clazz->iftable = (InterfaceEntry*) dvmLinearAlloc(clazz->classLoader,
2986 memset(clazz->iftable, 0x00, sizeof(InterfaceEntry) * ifCount);
2988 memcpy(clazz->iftable, clazz->super->iftable,
2997 for (i = 0; i < clazz->interfaceCount; i++) {
3001 interf = clazz->interfaces[i];
3007 clazz->descriptor, interf->descriptor);
3010 clazz->descriptor);
3015 clazz->iftable[idx++].clazz = interf;
3019 clazz->iftable[idx++].clazz = interf->iftable[j].clazz;
3051 if (clazz->iftable[i].clazz == clazz->iftable[j].clazz) {
3053 clazz->iftable[i].clazz->descriptor,
3054 clazz->descriptor);
3057 memmove(&clazz->iftable[i], &clazz->iftable[i+1],
3065 LOGVV("INTF: class '%s' nodupes=%d\n", clazz->descriptor, ifCount);
3068 clazz->iftableCount = ifCount;
3075 if (dvmIsInterfaceClass(clazz) || superIfCount == ifCount) {
3076 //dvmDumpClass(clazz, kDumpClassFullDetail);
3105 clazz->iftable[i].clazz->virtualMethodCount,
3106 clazz->iftable[i].clazz->descriptor);
3107 poolSize += clazz->iftable[i].clazz->virtualMethodCount;
3116 clazz->ifviPoolCount = poolSize;
3117 clazz->ifviPool = (int*) dvmLinearAlloc(clazz->classLoader,
3133 clazz->iftable[i].methodIndexArray = clazz->ifviPool + poolOffset;
3134 interface = clazz->iftable[i].clazz;
3177 for (j = clazz->vtableCount-1; j >= 0; j--) {
3178 if (dvmCompareMethodNamesAndProtos(imeth, clazz->vtable[j])
3182 if (!dvmIsPublicMethod(clazz->vtable[j])) {
3184 clazz->descriptor, clazz->vtable[j]->name);
3189 clazz->iftable[i].methodIndexArray[methIdx] = j;
3198 imeth->name, desc, clazz->descriptor);
3207 mirandaList = dvmLinearAlloc(clazz->classLoader,
3210 dvmLinearReadOnly(clazz->classLoader, mirandaList);
3211 mirandaList = dvmLinearRealloc(clazz->classLoader,
3232 mirandaList[mir]->clazz->descriptor,
3233 imeth->clazz->descriptor,
3242 clazz->iftable[i].methodIndexArray[methIdx] =
3243 clazz->vtableCount + mir;
3245 imeth->name, clazz->vtableCount + mir);
3265 mirandaList[i]->clazz->descriptor, mirandaList[i]->name);
3276 clazz->descriptor, mirandaCount);
3284 if (clazz->virtualMethods == NULL) {
3285 newVirtualMethods = (Method*) dvmLinearAlloc(clazz->classLoader,
3286 sizeof(Method) * (clazz->virtualMethodCount + mirandaCount));
3288 //dvmLinearReadOnly(clazz->classLoader, clazz->virtualMethods);
3289 newVirtualMethods = (Method*) dvmLinearRealloc(clazz->classLoader,
3290 clazz->virtualMethods,
3291 sizeof(Method) * (clazz->virtualMethodCount + mirandaCount));
3293 if (newVirtualMethods != clazz->virtualMethods) {
3302 * Reminder: clazz->virtualMethods and clazz->virtualMethodCount
3311 dvmLinearReadWrite(clazz->classLoader, clazz->vtable);
3313 for (i = 0; i < clazz->virtualMethodCount; i++, meth++)
3314 clazz->vtable[meth->methodIndex] = meth;
3315 dvmLinearReadOnly(clazz->classLoader, clazz->vtable);
3318 oldMethodCount = clazz->virtualMethodCount;
3319 clazz->virtualMethods = newVirtualMethods;
3320 clazz->virtualMethodCount += mirandaCount;
3322 dvmLinearReadOnly(clazz->classLoader, clazz->virtualMethods);
3327 assert(clazz->vtable != NULL);
3328 clazz->vtable = (Method**) dvmLinearRealloc(clazz->classLoader,
3329 clazz->vtable,
3330 sizeof(Method*) * (clazz->vtableCount + mirandaCount));
3331 if (clazz->vtable == NULL) {
3337 oldVtableCount = clazz->vtableCount;
3338 clazz->vtableCount += mirandaCount;
3348 meth = clazz->virtualMethods + oldMethodCount;
3350 dvmLinearReadWrite(clazz->classLoader, clazz->virtualMethods);
3352 meth->clazz = clazz;
3355 dvmLinearReadOnly(clazz->classLoader, clazz->virtualMethods);
3358 clazz->vtable[oldVtableCount + i] = meth;
3361 dvmLinearReadOnly(clazz->classLoader, mirandaList);
3362 dvmLinearFree(clazz->classLoader, mirandaList);
3381 * current class interfaces by comparing clazz->super->iftableCount. This
3393 //dvmDumpClass(clazz);
3399 dvmLinearReadOnly(clazz->classLoader, clazz->iftable);
3401 dvmLinearReadOnly(clazz->classLoader, clazz->vtable);
3403 dvmLinearReadOnly(clazz->classLoader, clazz->ifviPool);
3424 static bool insertMethodStubs(ClassObject* clazz)
3426 dvmLinearReadWrite(clazz->classLoader, clazz->virtualMethods);
3431 meth = clazz->virtualMethods;
3432 for (i = 0; i < clazz->virtualMethodCount; i++, meth++) {
3443 dvmLinearReadOnly(clazz->classLoader, clazz->virtualMethods);
3492 static bool computeFieldOffsets(ClassObject* clazz)
3497 dvmLinearReadWrite(clazz->classLoader, clazz->ifields);
3499 if (clazz->super != NULL)
3500 fieldOffset = clazz->super->objectSize;
3504 LOGVV("--- computeFieldOffsets '%s'\n", clazz->descriptor);
3506 //LOGI("OFFSETS fieldCount=%d\n", clazz->ifieldCount);
3509 //LOGI("super=%p, fieldOffset=%d\n", clazz->super, fieldOffset);
3514 clazz->ifieldRefCount = 0;
3515 j = clazz->ifieldCount - 1;
3516 for (i = 0; i < clazz->ifieldCount; i++) {
3517 InstField* pField = &clazz->ifields[i];
3526 InstField* refField = &clazz->ifields[j--];
3541 clazz->ifieldRefCount++;
3550 clazz->ifieldRefCount++;
3569 if (i != clazz->ifieldCount && (fieldOffset & 0x04) != 0) {
3572 InstField* pField = &clazz->ifields[i];
3591 j = clazz->ifieldCount - 1;
3593 InstField* singleField = &clazz->ifields[j--];
3611 LOGV(" +++ inserting pad field in '%s'\n", clazz->descriptor);
3621 assert(i == clazz->ifieldCount || (fieldOffset & 0x04) == 0);
3622 j = clazz->ifieldCount - 1;
3623 for ( ; i < clazz->ifieldCount; i++) {
3624 InstField* pField = &clazz->ifields[i];
3633 InstField* doubleField = &clazz->ifields[j--];
3667 for (i = 0; i < clazz->ifieldCount; i++) {
3668 InstField *pField = &clazz->ifields[i];
3677 assert(i == clazz->ifieldRefCount);
3685 assert(clazz->ifieldRefCount == clazz->ifieldCount);
3693 assert(clazz != gDvm.classJavaLangClass || (size_t)fieldOffset <
3694 offsetof(ClassObject, instanceData) + sizeof(clazz->instanceData));
3696 clazz->objectSize = fieldOffset;
3698 dvmLinearReadOnly(clazz->classLoader, clazz->ifields);
3771 static void throwEarlierClassFailure(ClassObject* clazz)
3774 clazz->descriptor, clazz->verifyErrorClass);
3776 if (clazz->verifyErrorClass == NULL) {
3778 clazz->descriptor);
3780 dvmThrowExceptionByClassWithClassMessage(clazz->verifyErrorClass,
3781 clazz->descriptor);
3789 static void initSFields(ClassObject* clazz)
3798 if (clazz->sfieldCount == 0) {
3801 if (clazz->pDvmDex == NULL) {
3803 LOGV("Not initializing static fields in %s\n", clazz->descriptor);
3806 pDexFile = clazz->pDvmDex->pDexFile;
3808 pClassDef = dexFindClass(pDexFile, clazz->descriptor);
3816 dvmEncodedArrayIteratorInitialize(&iterator, pValueList, clazz);
3826 StaticField* sfield = &clazz->sfields[i];
3837 clazz->descriptor, i);
3906 value.type, descriptor, clazz->descriptor, i);
4066 static bool validateSuperDescriptors(const ClassObject* clazz)
4070 if (dvmIsInterfaceClass(clazz))
4076 if (clazz->super != NULL &&
4077 clazz->classLoader != clazz->super->classLoader)
4096 // clazz->descriptor, clazz->classLoader,
4097 // clazz->super->descriptor, clazz->super->classLoader);
4098 for (i = clazz->super->vtableCount - 1; i >= 0; i--) {
4099 meth = clazz->vtable[i];
4100 if (meth != clazz->super->vtable[i] &&
4101 !checkMethodDescriptorClasses(meth, clazz->super, clazz))
4104 meth->name, clazz->descriptor, clazz->classLoader,
4105 clazz->super->descriptor, clazz->super->classLoader);
4121 for (i = 0; i < clazz->iftableCount; i++) {
4122 const InterfaceEntry* iftable = &clazz->iftable[i];
4124 if (clazz->classLoader != iftable->clazz->classLoader) {
4125 const ClassObject* iface = iftable->clazz;
4133 meth = clazz->vtable[vtableIndex];
4135 if (!checkMethodDescriptorClasses(meth, iface, meth->clazz)) {
4138 meth->name, clazz->descriptor, clazz->classLoader,
4155 * There isn't a race here, because either clazz->initThreadId won't match
4158 bool dvmIsClassInitializing(const ClassObject* clazz)
4160 return (clazz->status == CLASS_INITIALIZING &&
4161 clazz->initThreadId == dvmThreadSelf()->threadId);
4228 bool dvmInitClass(ClassObject* clazz)
4237 dvmLockObject(self, (Object*) clazz);
4238 assert(dvmIsClassLinked(clazz) || clazz->status == CLASS_ERROR);
4243 if (clazz->status < CLASS_VERIFIED) {
4247 if (clazz->status == CLASS_ERROR) {
4248 throwEarlierClassFailure(clazz);
4252 assert(clazz->status == CLASS_RESOLVED);
4253 assert(!IS_CLASS_FLAG_SET(clazz, CLASS_ISPREVERIFIED));
4257 clazz->classLoader == NULL))
4261 clazz->descriptor, clazz->classLoader);
4262 clazz->status = CLASS_VERIFIED;
4267 LOGV("+++ late verify on %s\n", clazz->descriptor);
4274 if (IS_CLASS_FLAG_SET(clazz, CLASS_ISOPTIMIZED)) {
4277 clazz->descriptor);
4282 clazz->status = CLASS_VERIFYING;
4283 if (!dvmVerifyClass(clazz)) {
4286 clazz->descriptor);
4287 dvmSetFieldObject((Object*) clazz,
4289 (Object*) dvmGetException(self)->clazz);
4290 clazz->status = CLASS_ERROR;
4294 clazz->status = CLASS_VERIFIED;
4303 if (!IS_CLASS_FLAG_SET(clazz, CLASS_ISOPTIMIZED)) {
4305 clazz->descriptor, IS_CLASS_FLAG_SET(clazz, CLASS_ISPREVERIFIED));
4306 dvmOptimizeClass(clazz, true);
4307 SET_CLASS_FLAG(clazz, CLASS_ISOPTIMIZED);
4311 dvmFlushBreakpoints(clazz);
4313 if (clazz->status == CLASS_INITIALIZED)
4316 while (clazz->status == CLASS_INITIALIZING) {
4318 if (clazz->initThreadId == self->threadId) {
4333 dvmObjectWait(self, (Object*) clazz, 0, 0, false);
4342 clazz->descriptor);
4357 clazz->status = CLASS_ERROR;
4360 if (clazz->status == CLASS_INITIALIZING) {
4364 assert(clazz->status == CLASS_INITIALIZED ||
4365 clazz->status == CLASS_ERROR);
4366 if (clazz->status == CLASS_ERROR) {
4378 if (clazz->status == CLASS_ERROR) {
4381 dvmUnlockObject(self, (Object*) clazz);
4382 throwEarlierClassFailure(clazz);
4406 if (!validateSuperDescriptors(clazz)) {
4408 clazz->status = CLASS_ERROR;
4419 assert(clazz->status < CLASS_INITIALIZING);
4423 logClassLoad('+', clazz);
4427 clazz->status = CLASS_INITIALIZING;
4428 clazz->initThreadId = self->threadId;
4429 dvmUnlockObject(self, (Object*) clazz);
4432 if (clazz->super != NULL && clazz->super->status != CLASS_INITIALIZED) {
4433 assert(!dvmIsInterfaceClass(clazz));
4434 if (!dvmInitClass(clazz->super)) {
4436 clazz->status = CLASS_ERROR;
4438 dvmLockObject(self, (Object*) clazz);
4451 initSFields(clazz);
4455 method = dvmFindDirectMethodByDescriptor(clazz, "<clinit>", "()V");
4457 LOGVV("No <clinit> found for %s\n", clazz->descriptor);
4459 LOGVV("Invoking %s.<clinit>\n", clazz->descriptor);
4471 (dvmGetException(self)->clazz)->descriptor, clazz->descriptor);
4475 dvmLockObject(self, (Object*) clazz);
4476 clazz->status = CLASS_ERROR;
4479 dvmLockObject(self, (Object*) clazz);
4480 clazz->status = CLASS_INITIALIZED;
4481 LOGVV("Initialized class: %s\n", clazz->descriptor);
4499 dvmObjectNotifyAll(self, (Object*) clazz);
4506 logClassLoad('-', clazz);
4510 dvmUnlockObject(self, (Object*) clazz);
4512 return (clazz->status != CLASS_ERROR);
4541 ClassObject* clazz = method->clazz;
4546 dvmLinearReadWrite(clazz->classLoader, clazz->virtualMethods);
4547 dvmLinearReadWrite(clazz->classLoader, clazz->directMethods);
4559 dvmLinearReadOnly(clazz->classLoader, clazz->virtualMethods);
4560 dvmLinearReadOnly(clazz->classLoader, clazz->directMethods);
4571 ClassObject* clazz = method->clazz;
4576 method->clazz->descriptor, method->name);
4582 dvmLinearReadWrite(clazz->classLoader, clazz->virtualMethods);
4583 dvmLinearReadWrite(clazz->classLoader, clazz->directMethods);
4587 dvmLinearReadOnly(clazz->classLoader, clazz->virtualMethods);
4588 dvmLinearReadOnly(clazz->classLoader, clazz->directMethods);
4597 ClassObject* clazz = vclazz;
4600 if (strcmp(clazz->descriptor, descriptor) == 0)
4601 return (int) clazz;
4632 ClassObject* clazz;
4636 clazz = dvmFindSystemClass("Ljava/lang/ClassLoader;");
4637 if (clazz == NULL)
4640 getSysMeth = dvmFindDirectMethodByDescriptor(clazz, "getSystemClassLoader",
4657 const ClassObject* clazz = (const ClassObject*) vclazz;
4663 if (clazz == NULL) {
4673 initStr = dvmIsClassInitialized(clazz) ? "true" : "false";
4676 LOGI("%s %p %s\n", clazz->descriptor, clazz->classLoader, initStr);
4678 LOGI("%s %s\n", clazz->descriptor, initStr);
4680 LOGI("%s %p\n", clazz->descriptor, clazz->classLoader);
4682 LOGI("%s\n", clazz->descriptor);
4687 /* clazz->super briefly holds the superclass index during class prep */
4688 if ((u4)clazz->super > 0x10000 && (u4) clazz->super != (u4)-1)
4689 super = clazz->super;
4694 dvmIsInterfaceClass(clazz) ? "interface" : "class",
4695 clazz->descriptor, clazz->classLoader, clazz->serialNumber);
4696 LOGI(" objectSize=%d (%d from super)\n", (int) clazz->objectSize,
4698 LOGI(" access=0x%04x.%04x\n", clazz->accessFlags >> 16,
4699 clazz->accessFlags & JAVA_FLAGS_MASK);
4702 if (dvmIsArrayClass(clazz)) {
4704 clazz->arrayDim, clazz->elementClass->descriptor);
4706 if (clazz->iftableCount > 0) {
4707 LOGI(" interfaces (%d):\n", clazz->iftableCount);
4708 for (i = 0; i < clazz->iftableCount; i++) {
4709 InterfaceEntry* ent = &clazz->iftable[i];
4713 i, ent->clazz->descriptor, ent->clazz->classLoader);
4717 for (j = 0; j < ent->clazz->virtualMethodCount; j++)
4720 ent->clazz->virtualMethods[j].name,
4721 clazz->vtable[ent->methodIndexArray[j]]->name);
4725 if (!dvmIsInterfaceClass(clazz)) {
4726 LOGI(" vtable (%d entries, %d in super):\n", clazz->vtableCount,
4728 for (i = 0; i < clazz->vtableCount; i++) {
4729 desc = dexProtoCopyMethodDescriptor(&clazz->vtable[i]->prototype);
4731 (i != clazz->vtable[i]->methodIndex) ? "*** " : "",
4732 (u4) clazz->vtable[i]->methodIndex, clazz->vtable[i],
4733 clazz->vtable[i]->name, desc);
4736 LOGI(" direct methods (%d entries):\n", clazz->directMethodCount);
4737 for (i = 0; i < clazz->directMethodCount; i++) {
4739 &clazz->directMethods[i].prototype);
4740 LOGI(" %2d: %20s %s\n", i, clazz->directMethods[i].name,
4745 LOGI(" interface methods (%d):\n", clazz->virtualMethodCount);
4746 for (i = 0; i < clazz->virtualMethodCount; i++) {
4748 &clazz->virtualMethods[i].prototype);
4750 (u4) clazz->virtualMethods[i].methodIndex,
4751 clazz->virtualMethods[i].name,
4756 if (clazz->sfieldCount > 0) {
4757 LOGI(" static fields (%d entries):\n", clazz->sfieldCount);
4758 for (i = 0; i < clazz->sfieldCount; i++) {
4759 LOGI(" %2d: %20s %s\n", i, clazz->sfields[i].field.name,
4760 clazz->sfields[i].field.signature);
4763 if (clazz->ifieldCount > 0) {
4764 LOGI(" instance fields (%d entries):\n", clazz->ifieldCount);
4765 for (i = 0; i < clazz->ifieldCount; i++) {
4766 LOGI(" %2d: %20s %s\n", i, clazz->ifields[i].field.name,
4767 clazz->ifields[i].field.signature);
4778 void dvmDumpClass(const ClassObject* clazz, int flags)
4780 dumpClass((void*) clazz, (void*) flags);
4826 const ClassObject* clazz = (const ClassObject*) vclazz;
4829 for (i = 0; i < clazz->ifieldCount; i++) {
4830 Field* field = &clazz->ifields[i].field;
4834 field->clazz->descriptor, field->name);
4837 field->clazz->descriptor, field->name);
4839 for (i = 0; i < clazz->sfieldCount; i++) {
4840 Field* field = &clazz->sfields[i].field;
4844 field->clazz->descriptor, field->name);
4847 field->clazz->descriptor, field->name);
4868 static int markClassObject(void *clazz, void *arg)
4872 dvmMarkObjectNonNull((Object *)clazz);