static Interface* loadInterfaces(Env* env, Class* clazz) { ClassInfoHeader* header = lookupClassInfo(env, clazz->name, !clazz->classLoader || !clazz->classLoader->parent ? _bcBootClassesHash : _bcClassesHash); if (!header) return NULL; ClassInfo ci; jint i; void* p = header; readClassInfo(&p, &ci); Interface* first = NULL; for (i = 0; i < ci.interfaceCount; i++) { const char* interfaceName = readInterfaceName(&p); Class* interfaceClass = rvmFindClassUsingLoader(env, interfaceName, clazz->classLoader); if (!interfaceClass) goto error; Interface* interf = rvmAllocateInterface(env, interfaceClass); if (!interf) goto error; LL_APPEND(first, interf); // Interfaces has to be in the correct order so we need to use the slower LL_APPEND } return first; error: while (first) { Interface* next = first->next; rvmFreeMemoryUncollectable(env, first); first = next; } return NULL; }
static void loadInterfaces(Env* env, Class* clazz) { ClassInfoHeader* header = lookupClassInfo(env, clazz->name, !clazz->classLoader || !clazz->classLoader->parent ? _bcBootClassesHash : _bcClassesHash); if (!header) return; ClassInfo ci; jint i; void* p = header; readClassInfo(&p, &ci); for (i = 0; i < ci.interfaceCount; i++) { const char* interfaceName = readInterfaceName(&p); Class* interface = rvmFindClassUsingLoader(env, interfaceName, clazz->classLoader); if (!interface) return; rvmAddInterface(env, clazz, interface); if (rvmExceptionCheck(env)) return; } }