[vmkit-commits] [vmkit] r55587 - in /vmkit/branches/isolate/lib/JnJVM/Isolate: IsolateCommonClass.cpp IsolateCommonClass.h
Nicolas Geoffray
nicolas.geoffray at lip6.fr
Sun Aug 31 02:53:46 PDT 2008
Author: geoffray
Date: Sun Aug 31 04:53:46 2008
New Revision: 55587
URL: http://llvm.org/viewvc/llvm-project?rev=55587&view=rev
Log:
Implement UserConstantPool::loadClass ::resolveMethod and ::resolveField.
Modified:
vmkit/branches/isolate/lib/JnJVM/Isolate/IsolateCommonClass.cpp
vmkit/branches/isolate/lib/JnJVM/Isolate/IsolateCommonClass.h
Modified: vmkit/branches/isolate/lib/JnJVM/Isolate/IsolateCommonClass.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/Isolate/IsolateCommonClass.cpp?rev=55587&r1=55586&r2=55587&view=diff
==============================================================================
--- vmkit/branches/isolate/lib/JnJVM/Isolate/IsolateCommonClass.cpp (original)
+++ vmkit/branches/isolate/lib/JnJVM/Isolate/IsolateCommonClass.cpp Sun Aug 31 04:53:46 2008
@@ -35,7 +35,7 @@
classLoader = JCL;
delegatee = 0;
staticInstance = 0;
- ctpInfo = new(JCL->allocator, cl->ctpInfo->ctpSize) UserConstantPool(this);
+ ctpInfo = 0;
}
UserClassArray::UserClassArray(JnjvmClassLoader* JCL, const UTF8* name) {
@@ -82,11 +82,15 @@
def->readClass();
def->status = classRead;
status = classRead;
- def->release();
- release();
+ cl->ctpInfo =
+ new(classLoader->allocator, def->ctpInfo->ctpSize) UserConstantPool(cl);
cl->loadParents();
- acquire();
- def->acquire();
+ if (cl->super)
+ def->super = cl->super->classDef;
+ for (std::vector<UserClass*>::iterator i = interfaces.begin(),
+ e = interfaces.end(); i != e; ++i) {
+ def->interfaces.push_back((Class*)((*i)->classDef));
+ }
def->status = prepared;
status = prepared;
def->classLoader->TheModule->resolveVirtualClass(def);
@@ -100,6 +104,8 @@
classDef->release();
}
} else {
+ cl->ctpInfo =
+ new(classLoader->allocator, def->ctpInfo->ctpSize) UserConstantPool(cl);
release();
status = classRead,
cl->loadParents();
@@ -128,27 +134,58 @@
return 0;
}
+
+UserCommonClass* UserConstantPool::isClassLoaded(uint32 entry) {
+ JavaConstantPool* ctpInfo = getSharedPool();
+ if (! ((entry > 0) && (entry < ctpInfo->ctpSize) &&
+ ctpInfo->typeAt(entry) == JavaConstantPool::ConstantClass)) {
+ JavaThread::get()->isolate->classFormatError(
+ "bad constant pool number for class at entry %d", entry);
+ }
+ return (UserCommonClass*)ctpRes[entry];
+}
+
UserCommonClass* UserConstantPool::loadClass(uint32 index) {
- fprintf(stderr, "implement me");
- abort();
- return 0;
+ UserCommonClass* temp = isClassLoaded(index);
+ if (!temp) {
+ JavaConstantPool* ctpInfo = getSharedPool();
+ JnjvmClassLoader* loader = getClass()->classLoader;
+ const UTF8* name = ctpInfo->UTF8At(ctpInfo->ctpDef[index]);
+ if (name->elements[0] == AssessorDesc::I_TAB) {
+ temp = loader->constructArray(name);
+ temp->resolveClass();
+ } else {
+ // Put into ctpRes because there is only one representation of the class
+ temp = loader->loadName(name, true, false);
+ }
+ ctpRes[index] = temp;
+ ctpInfo->ctpRes[index] = getClass()->classDef;
+ }
+ return temp;
}
void UserConstantPool::resolveMethod(uint32 index, UserCommonClass*& cl,
const UTF8*& utf8, Signdef*& sign) {
- fprintf(stderr, "implement me");
- abort();
+ JavaConstantPool* ctpInfo = getSharedPool();
+ sint32 entry = ctpInfo->ctpDef[index];
+ sint32 ntIndex = entry & 0xFFFF;
+ sign = (Signdef*)ctpInfo->ctpRes[ntIndex];
+ assert(sign && "No cached signature after JITting");
+ utf8 = ctpInfo->UTF8At(ctpInfo->ctpDef[ntIndex] >> 16);
+ cl = loadClass(entry >> 16);
+ assert(cl && cl->isResolved() && "No resolved class when resolving method");
}
void UserConstantPool::resolveField(uint32 index, UserCommonClass*& cl,
const UTF8*& utf8, Typedef*& sign) {
- fprintf(stderr, "implement me");
- abort();
-}
-
-const UTF8* UserConstantPool::UTF8AtForString(uint32 entry) {
- fprintf(stderr, "implement me");
- abort();
+ JavaConstantPool* ctpInfo = getSharedPool();
+ sint32 entry = ctpInfo->ctpDef[index];
+ sint32 ntIndex = entry & 0xFFFF;
+ sign = (Typedef*)ctpInfo->ctpRes[ntIndex];
+ assert(sign && "No cached Typedef after JITting");
+ utf8 = ctpInfo->UTF8At(ctpInfo->ctpDef[ntIndex] >> 16);
+ cl = loadClass(entry >> 16);
+ assert(cl && cl->isResolved() && "No resolved class when resolving field");
}
void* UserConstantPool::operator new(size_t sz, JavaAllocator* alloc,
Modified: vmkit/branches/isolate/lib/JnJVM/Isolate/IsolateCommonClass.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/Isolate/IsolateCommonClass.h?rev=55587&r1=55586&r2=55587&view=diff
==============================================================================
--- vmkit/branches/isolate/lib/JnJVM/Isolate/IsolateCommonClass.h (original)
+++ vmkit/branches/isolate/lib/JnJVM/Isolate/IsolateCommonClass.h Sun Aug 31 04:53:46 2008
@@ -16,6 +16,8 @@
#include "mvm/Object.h"
+#include "JavaConstantPool.h"
+
namespace jnjvm {
class ArrayUInt8;
@@ -112,6 +114,10 @@
bool isReady() {
return status >= inClinit;
}
+
+ bool isResolved() {
+ return status >= resolved;
+ }
uint8 getAccess() {
return classDef->access;
@@ -386,10 +392,20 @@
///
void resolveField(uint32 index, UserCommonClass*& cl, const UTF8*& utf8,
Typedef*& sign);
+
+ UserClass* getClass() {
+ return (UserClass*)ctpRes[0];
+ }
+
+ JavaConstantPool* getSharedPool() {
+ return ((Class*)(getClass()->classDef))->ctpInfo;
+ }
/// UTF8At - Get the UTF8 referenced from this string entry.
///
- const UTF8* UTF8AtForString(uint32 entry);
+ const UTF8* UTF8AtForString(uint32 entry) {
+ return getSharedPool()->UTF8AtForString(entry);
+ }
/// loadClass - Loads the class and returns it. This is called just in time,
/// ie when the class will be used and not yet resolved.
@@ -403,6 +419,9 @@
UserConstantPool(UserClass* cl) {
ctpRes[0] = cl;
}
+
+ UserCommonClass* isClassLoaded(uint32 entry);
+
};
} // end namespace jnjvm
More information about the vmkit-commits
mailing list