[vmkit-commits] [vmkit] r55185 - in /vmkit/trunk/lib/JnJVM: Classpath/ClasspathConstructor.cpp.inc Classpath/ClasspathMethod.cpp.inc Classpath/ClasspathVMClass.cpp.inc VMCore/JavaClass.cpp VMCore/JavaClass.h VMCore/JavaRuntimeJIT.cpp VMCore/Jnjvm.cpp VMCore/JnjvmClassLoader.cpp VMCore/JnjvmClassLoader.h
Nicolas Geoffray
nicolas.geoffray at lip6.fr
Fri Aug 22 10:19:54 PDT 2008
Author: geoffray
Date: Fri Aug 22 12:19:53 2008
New Revision: 55185
URL: http://llvm.org/viewvc/llvm-project?rev=55185&view=rev
Log:
A class knows how to read itself.
Modified:
vmkit/trunk/lib/JnJVM/Classpath/ClasspathConstructor.cpp.inc
vmkit/trunk/lib/JnJVM/Classpath/ClasspathMethod.cpp.inc
vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMClass.cpp.inc
vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp
vmkit/trunk/lib/JnJVM/VMCore/JavaClass.h
vmkit/trunk/lib/JnJVM/VMCore/JavaRuntimeJIT.cpp
vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp
vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp
vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.h
Modified: vmkit/trunk/lib/JnJVM/Classpath/ClasspathConstructor.cpp.inc
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/Classpath/ClasspathConstructor.cpp.inc?rev=55185&r1=55184&r2=55185&view=diff
==============================================================================
--- vmkit/trunk/lib/JnJVM/Classpath/ClasspathConstructor.cpp.inc (original)
+++ vmkit/trunk/lib/JnJVM/Classpath/ClasspathConstructor.cpp.inc Fri Aug 22 12:19:53 2008
@@ -67,7 +67,7 @@
CommonClass* _cl = NativeUtil::resolvedImplClass(Clazz, false);
if (!_cl->isArray) {
Class* cl = (Class*)_cl;
- cl->initialiseClass();
+ vm->initialiseClass(cl);
JavaObject* res = cl->doNew(vm);
JavaObject** ptr = (JavaObject**)(void*)(args->elements);
Modified: vmkit/trunk/lib/JnJVM/Classpath/ClasspathMethod.cpp.inc
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/Classpath/ClasspathMethod.cpp.inc?rev=55185&r1=55184&r2=55185&view=diff
==============================================================================
--- vmkit/trunk/lib/JnJVM/Classpath/ClasspathMethod.cpp.inc (original)
+++ vmkit/trunk/lib/JnJVM/Classpath/ClasspathMethod.cpp.inc Fri Aug 22 12:19:53 2008
@@ -84,7 +84,7 @@
}
} else {
- cl->initialiseClass();
+ vm->initialiseClass(cl);
}
JavaObject** ptr = (JavaObject**)(void*)(args->elements);
Modified: vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMClass.cpp.inc
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMClass.cpp.inc?rev=55185&r1=55184&r2=55185&view=diff
==============================================================================
--- vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMClass.cpp.inc (original)
+++ vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMClass.cpp.inc Fri Aug 22 12:19:53 2008
@@ -58,7 +58,7 @@
true, false);
if (cl != 0) {
if (clinit) {
- cl->initialiseClass();
+ JavaThread::get()->isolate->initialiseClass(cl);
}
return (jclass)(cl->getClassDelegatee());
} else {
Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp?rev=55185&r1=55184&r2=55185&view=diff
==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp Fri Aug 22 12:19:53 2008
@@ -7,11 +7,14 @@
//
//===----------------------------------------------------------------------===//
+#define JNJVM_LOAD 0
+
#include <vector>
#include <string.h>
#include "mvm/JIT.h"
+#include "debug.h"
#include "types.h"
#include "JavaArray.h"
@@ -532,10 +535,6 @@
classLoader->resolveClass(this);
}
-void CommonClass::initialiseClass() {
- return JavaThread::get()->isolate->initialiseClass(this);
-}
-
#ifdef MULTIPLE_VM
JavaObject* Class::staticInstance() {
std::pair<JavaState, JavaObject*>* val =
@@ -629,3 +628,104 @@
}
}
+void Class::readParents(Reader& reader) {
+ unsigned short int superEntry = reader.readU2();
+ const UTF8* super = superEntry ?
+ ctpInfo->resolveClassName(superEntry) : 0;
+
+ unsigned short int nbI = reader.readU2();
+ superUTF8 = super;
+ for (int i = 0; i < nbI; i++)
+ interfacesUTF8.push_back(ctpInfo->resolveClassName(reader.readU2()));
+
+}
+
+void Class::loadParents() {
+ int nbI = interfacesUTF8.size();
+ if (superUTF8 == 0) {
+ depth = 0;
+ display = (CommonClass**)malloc(sizeof(CommonClass*));
+ display[0] = this;
+ virtualTableSize = VT_SIZE / sizeof(void*);
+ } else {
+ super = classLoader->loadName(superUTF8, true, true);
+ depth = super->depth + 1;
+ virtualTableSize = super->virtualTableSize;
+ display = (CommonClass**)malloc((depth + 1) * sizeof(CommonClass*));
+ memcpy(display, super->display, depth * sizeof(CommonClass*));
+ display[depth] = this;
+ }
+
+ for (int i = 0; i < nbI; i++)
+ interfaces.push_back((Class*)classLoader->loadName(interfacesUTF8[i],
+ true, true));
+}
+
+void Class::readAttributs(Reader& reader, std::vector<Attribut*>& attr) {
+ unsigned short int nba = reader.readU2();
+
+ for (int i = 0; i < nba; i++) {
+ const UTF8* attName = ctpInfo->UTF8At(reader.readU2());
+ uint32 attLen = reader.readU4();
+ Attribut* att = new Attribut(attName, attLen, reader.cursor);
+ attr.push_back(att);
+ reader.seek(attLen, Reader::SeekCur);
+ }
+}
+
+void Class::readFields(Reader& reader) {
+ uint16 nbFields = reader.readU2();
+ uint32 sindex = 0;
+ uint32 vindex = 0;
+ for (int i = 0; i < nbFields; i++) {
+ uint16 access = reader.readU2();
+ const UTF8* name = ctpInfo->UTF8At(reader.readU2());
+ const UTF8* type = ctpInfo->UTF8At(reader.readU2());
+ JavaField* field = constructField(name, type, access);
+ isStatic(access) ?
+ field->num = sindex++ :
+ field->num = vindex++;
+ readAttributs(reader, field->attributs);
+ }
+}
+
+void Class::readMethods(Reader& reader) {
+ uint16 nbMethods = reader.readU2();
+ for (int i = 0; i < nbMethods; i++) {
+ uint16 access = reader.readU2();
+ const UTF8* name = ctpInfo->UTF8At(reader.readU2());
+ const UTF8* type = ctpInfo->UTF8At(reader.readU2());
+ JavaMethod* meth = constructMethod(name, type, access);
+ readAttributs(reader, meth->attributs);
+ }
+}
+
+void Class::readClass() {
+
+ PRINT_DEBUG(JNJVM_LOAD, 0, COLOR_NORMAL, "; ", 0);
+ PRINT_DEBUG(JNJVM_LOAD, 0, LIGHT_GREEN, "reading ", 0);
+ PRINT_DEBUG(JNJVM_LOAD, 0, COLOR_NORMAL, "%s\n", printString());
+
+ Reader reader(bytes);
+ uint32 magic = reader.readU4();
+ if (magic != Jnjvm::Magic) {
+ JavaThread::get()->isolate->classFormatError("bad magic number %p", magic);
+ }
+ minor = reader.readU2();
+ major = reader.readU2();
+ ctpInfo = new JavaConstantPool(this, reader);
+ access = reader.readU2();
+
+ const UTF8* thisClassName =
+ ctpInfo->resolveClassName(reader.readU2());
+
+ if (!(thisClassName->equals(name))) {
+ JavaThread::get()->isolate->classFormatError("try to load %s and found class named %s",
+ printString(), thisClassName->printString());
+ }
+
+ readParents(reader);
+ readFields(reader);
+ readMethods(reader);
+ readAttributs(reader, attributs);
+}
Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaClass.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaClass.h?rev=55185&r1=55184&r2=55185&view=diff
==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JavaClass.h (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JavaClass.h Fri Aug 22 12:19:53 2008
@@ -380,10 +380,6 @@
///
JavaObject* getClassDelegatee(JavaObject* pd = 0);
- /// initialiseClass - If the class has a static initializer and has not been
- /// initialized yet, call it.
- void initialiseClass();
-
/// resolveClass - If the class has not been resolved yet, resolve it.
///
void resolveClass();
@@ -552,6 +548,30 @@
/// name.
Class(JnjvmClassLoader* loader, const UTF8* name);
+ /// readParents - Reads the parents, i.e. super and interfaces, of the class.
+ ///
+ void readParents(Reader& reader);
+
+ /// loadParents - Loads and resolves the parents, i.e. super and interfarces,
+ /// of the class.
+ ///
+ void loadParents();
+
+ /// readAttributs - Reads the attributs of the class.
+ ///
+ void readAttributs(Reader& reader, std::vector<Attribut*> & attr);
+
+ /// readFields - Reads the fields of the class.
+ ///
+ void readFields(Reader& reader);
+
+ /// readMethods - Reads the methods of the class.
+ ///
+ void readMethods(Reader& reader);
+
+ /// readClass - Reads the class.
+ ///
+ void readClass();
};
/// ClassArray - This class represents Java array classes.
Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaRuntimeJIT.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaRuntimeJIT.cpp?rev=55185&r1=55184&r2=55185&view=diff
==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JavaRuntimeJIT.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JavaRuntimeJIT.cpp Fri Aug 22 12:19:53 2008
@@ -180,7 +180,7 @@
extern "C" JavaObject* getStaticInstance(Class* cl, Jnjvm* vm) {
std::pair<JavaState, JavaObject*>* val = vm->statics->lookup(cl);
if (!val || !(val->second)) {
- cl->initialiseClass();
+ vm->initialiseClass(cl);
val = vm->statics->lookup(cl);
}
return val->second;
Modified: vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp?rev=55185&r1=55184&r2=55185&view=diff
==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp Fri Aug 22 12:19:53 2008
@@ -101,7 +101,7 @@
*status = clinitParent;
cl->release();
if (cl->super) {
- cl->super->initialiseClass();
+ initialiseClass(cl->super);
}
cl->classLoader->TheModule->resolveStaticClass((Class*)cl);
Modified: vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp?rev=55185&r1=55184&r2=55185&view=diff
==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp Fri Aug 22 12:19:53 2008
@@ -99,116 +99,6 @@
}
-void JnjvmClassLoader::readParents(Class* cl, Reader& reader) {
- JavaConstantPool* ctpInfo = cl->ctpInfo;
- unsigned short int superEntry = reader.readU2();
- const UTF8* super = superEntry ?
- ctpInfo->resolveClassName(superEntry) : 0;
-
- unsigned short int nbI = reader.readU2();
- cl->superUTF8 = super;
- for (int i = 0; i < nbI; i++)
- cl->interfacesUTF8.push_back(ctpInfo->resolveClassName(reader.readU2()));
-
-}
-
-void JnjvmClassLoader::loadParents(Class* cl) {
- const UTF8* super = cl->superUTF8;
- int nbI = cl->interfacesUTF8.size();
- if (super == 0) {
- cl->depth = 0;
- cl->display = (CommonClass**)malloc(sizeof(CommonClass*));
- cl->display[0] = cl;
- cl->virtualTableSize = VT_SIZE / sizeof(void*);
- } else {
- cl->super = loadName(super, true, true);
- int depth = cl->super->depth + 1;
- cl->depth = depth;
- cl->virtualTableSize = cl->super->virtualTableSize;
- cl->display = (CommonClass**)malloc((depth + 1) * sizeof(CommonClass*));
- memcpy(cl->display, cl->super->display, depth * sizeof(CommonClass*));
- cl->display[cl->depth] = cl;
- }
-
- for (int i = 0; i < nbI; i++)
- cl->interfaces.push_back((Class*)loadName(cl->interfacesUTF8[i],
- true, true));
-}
-
-void JnjvmClassLoader::readAttributs(Class* cl, Reader& reader,
- std::vector<Attribut*>& attr) {
- JavaConstantPool* ctpInfo = cl->ctpInfo;
- unsigned short int nba = reader.readU2();
-
- for (int i = 0; i < nba; i++) {
- const UTF8* attName = ctpInfo->UTF8At(reader.readU2());
- uint32 attLen = reader.readU4();
- Attribut* att = new Attribut(attName, attLen, reader.cursor);
- attr.push_back(att);
- reader.seek(attLen, Reader::SeekCur);
- }
-}
-
-void JnjvmClassLoader::readFields(Class* cl, Reader& reader) {
- uint16 nbFields = reader.readU2();
- JavaConstantPool* ctpInfo = cl->ctpInfo;
- uint32 sindex = 0;
- uint32 vindex = 0;
- for (int i = 0; i < nbFields; i++) {
- uint16 access = reader.readU2();
- const UTF8* name = ctpInfo->UTF8At(reader.readU2());
- const UTF8* type = ctpInfo->UTF8At(reader.readU2());
- JavaField* field = cl->constructField(name, type, access);
- isStatic(access) ?
- field->num = sindex++ :
- field->num = vindex++;
- readAttributs(cl, reader, field->attributs);
- }
-}
-
-void JnjvmClassLoader::readMethods(Class* cl, Reader& reader) {
- uint16 nbMethods = reader.readU2();
- JavaConstantPool* ctpInfo = cl->ctpInfo;
- for (int i = 0; i < nbMethods; i++) {
- uint16 access = reader.readU2();
- const UTF8* name = ctpInfo->UTF8At(reader.readU2());
- const UTF8* type = ctpInfo->UTF8At(reader.readU2());
- JavaMethod* meth = cl->constructMethod(name, type, access);
- readAttributs(cl, reader, meth->attributs);
- }
-}
-
-void JnjvmClassLoader::readClass(Class* cl) {
-
- PRINT_DEBUG(JNJVM_LOAD, 0, COLOR_NORMAL, "; ", 0);
- PRINT_DEBUG(JNJVM_LOAD, 0, LIGHT_GREEN, "reading ", 0);
- PRINT_DEBUG(JNJVM_LOAD, 0, COLOR_NORMAL, "%s::%s\n", printString(),
- cl->printString());
-
- Reader reader(cl->bytes);
- uint32 magic = reader.readU4();
- if (magic != Jnjvm::Magic) {
- JavaThread::get()->isolate->classFormatError("bad magic number %p", magic);
- }
- cl->minor = reader.readU2();
- cl->major = reader.readU2();
- cl->ctpInfo = new JavaConstantPool(cl, reader);
- cl->access = reader.readU2();
-
- const UTF8* thisClassName =
- cl->ctpInfo->resolveClassName(reader.readU2());
-
- if (!(thisClassName->equals(cl->name))) {
- JavaThread::get()->isolate->classFormatError("try to load %s and found class named %s",
- cl->printString(), thisClassName->printString());
- }
-
- readParents(cl, reader);
- readFields(cl, reader);
- readMethods(cl, reader);
- readAttributs(cl, reader, cl->attributs);
-}
-
ArrayUInt8* JnjvmBootstrapLoader::openName(const UTF8* utf8) {
char* asciiz = utf8->UTF8ToAsciiz();
uint32 alen = strlen(asciiz);
@@ -255,14 +145,15 @@
baseClass->resolveClass();
cl->status = resolved;
} else {
- readClass((Class*)cl);
- cl->status = classRead;
- cl->release();
- loadParents((Class*)cl);
- cl->acquire();
- cl->status = prepared;
- TheModule->resolveVirtualClass((Class*)cl);
- cl->status = resolved;
+ Class* regCl = (Class*)cl;
+ regCl->readClass();
+ regCl->status = classRead;
+ regCl->release();
+ regCl->loadParents();
+ regCl->acquire();
+ regCl->status = prepared;
+ TheModule->resolveVirtualClass(regCl);
+ regCl->status = resolved;
}
cl->release();
cl->broadcastClass();
Modified: vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.h?rev=55185&r1=55184&r2=55185&view=diff
==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.h (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.h Fri Aug 22 12:19:53 2008
@@ -66,31 +66,6 @@
///
virtual CommonClass* internalLoad(const UTF8* utf8);
- /// readParents - Reads the parents, i.e. super and interfaces, of the class.
- ///
- void readParents(Class* cl, Reader& reader);
-
- /// loadParents - Loads and resolves the parents, i.e. super and interfarces,
- /// of the class.
- ///
- void loadParents(Class* cl);
-
- /// readAttributs - Reads the attributs of the class.
- ///
- void readAttributs(Class* cl, Reader& reader, std::vector<Attribut*> & attr);
-
- /// readFields - Reads the fields of the class.
- ///
- void readFields(Class* cl, Reader& reader);
-
- /// readMethods - Reads the methods of the class.
- ///
- void readMethods(Class* cl, Reader& reader);
-
- /// readClass - Reads the class.
- ///
- void readClass(Class* cl);
-
/// JnjvmClassLoader - Allocate a user-defined class loader. Called on
/// first use of a Java class loader.
///
More information about the vmkit-commits
mailing list