[vmkit-commits] [vmkit] r199581 - Rationalizes the ClassLoader::getType* functions (Java is irrational:))
Gael Thomas
gael.thomas at lip6.fr
Sun Jan 19 03:02:14 PST 2014
Author: gthomas
Date: Sun Jan 19 05:02:13 2014
New Revision: 199581
URL: http://llvm.org/viewvc/llvm-project?rev=199581&view=rev
Log:
Rationalizes the ClassLoader::getType* functions (Java is irrational:))
Modified:
vmkit/branches/mcjit/include/j3/j3.h
vmkit/branches/mcjit/include/j3/j3class.h
vmkit/branches/mcjit/include/j3/j3classloader.h
vmkit/branches/mcjit/lib/j3/vm/j3.cc
vmkit/branches/mcjit/lib/j3/vm/j3class.cc
vmkit/branches/mcjit/lib/j3/vm/j3classloader.cc
vmkit/branches/mcjit/lib/j3/vm/j3jni.cc
vmkit/branches/mcjit/lib/j3/vm/j3signature.cc
Modified: vmkit/branches/mcjit/include/j3/j3.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3.h?rev=199581&r1=199580&r2=199581&view=diff
==============================================================================
--- vmkit/branches/mcjit/include/j3/j3.h (original)
+++ vmkit/branches/mcjit/include/j3/j3.h Sun Jan 19 05:02:13 2014
@@ -88,6 +88,7 @@ namespace j3 {
J3Class* classLoaderClass;
J3Field* classLoaderClassVMData;
J3Method* classLoaderClassLoadClass;
+ J3Method* classLoaderClassGetSystemClassLoader;
J3Class* threadClass;
J3Field* threadClassVMData;
Modified: vmkit/branches/mcjit/include/j3/j3class.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3class.h?rev=199581&r1=199580&r2=199581&view=diff
==============================================================================
--- vmkit/branches/mcjit/include/j3/j3class.h (original)
+++ vmkit/branches/mcjit/include/j3/j3class.h Sun Jan 19 05:02:13 2014
@@ -247,6 +247,7 @@ namespace j3 {
uint8_t getCtpType(uint16_t idx);
void* getCtpResolved(uint16_t idx);
+ void utfAt(uint16_t idx, const char** buf, size_t* length);
const vmkit::Name* nameAt(uint16_t idx);
float floatAt(uint16_t idx);
double doubleAt(uint16_t idx);
Modified: vmkit/branches/mcjit/include/j3/j3classloader.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3classloader.h?rev=199581&r1=199580&r2=199581&view=diff
==============================================================================
--- vmkit/branches/mcjit/include/j3/j3classloader.h (original)
+++ vmkit/branches/mcjit/include/j3/j3classloader.h Sun Jan 19 05:02:13 2014
@@ -57,10 +57,12 @@ namespace j3 {
void addNativeLibrary(void* handle);
- J3Type* getTypeInternal(J3ObjectType* from, const vmkit::Name* type, uint32_t start, uint32_t* end, bool unify);
- J3Type* getType(J3ObjectType* from, const vmkit::Name* type); /* find a type */
+ J3Type* getTypeInternal(J3ObjectType* from, const char* type,
+ size_t start, size_t len, size_t* end, bool unify);
+ J3Type* getTypeFromDescriptor(J3ObjectType* from, const vmkit::Name* type); /* find a type */
+ J3ObjectType* getTypeFromQualified(J3ObjectType* from, const char* type, size_t length=-1); /* find a type */
J3Signature* getSignature(J3ObjectType* from, const vmkit::Name* signature); /* get a method type */
- void wrongType(J3ObjectType* from, const vmkit::Name* type);
+ void wrongType(J3ObjectType* from, const char* type, size_t length);
uint32_t interfaceIndex(J3Method* signature);
Modified: vmkit/branches/mcjit/lib/j3/vm/j3.cc
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3.cc?rev=199581&r1=199580&r2=199581&view=diff
==============================================================================
--- vmkit/branches/mcjit/lib/j3/vm/j3.cc (original)
+++ vmkit/branches/mcjit/lib/j3/vm/j3.cc Sun Jan 19 05:02:13 2014
@@ -129,6 +129,10 @@ void J3::run() {
classLoaderClassVMData = classLoaderClass->findField(0, vmData[0].name(), vmData[0].type());
classLoaderClassLoadClass = z_method(0, classLoaderClass, names()->get("loadClass"),
names()->get("(Ljava/lang/String;)Ljava/lang/Class;"));
+ classLoaderClassGetSystemClassLoader = z_method(J3Cst::ACC_STATIC,
+ classLoaderClass,
+ names()->get("getSystemClassLoader"),
+ names()->get("()Ljava/lang/ClassLoader;"));
threadClass = z_class("java/lang/Thread");
threadClassRun = z_method(0, threadClass, names()->get("run"), names()->get("()V"));
@@ -168,14 +172,6 @@ void J3::run() {
//options()->debugExecute = 0;
-#if 0
- J3Class* loaderClass = z_class("java/lang/ClassLoader");
- J3ObjectHandle* sysLoader = z_method(J3Cst::ACC_STATIC,
- loaderClass,
- names()->get("getSystemClassLoader"),
- names()->get("()Ljava/lang/ClassLoader;"))->invokeStatic().valObject;
-#else
-
J3ObjectHandle* res = z_method(J3Cst::ACC_STATIC,
z_class("sun/launcher/LauncherHelper"),
names()->get("checkAndLoadMain"),
@@ -183,7 +179,6 @@ void J3::run() {
->invokeStatic(1, 1, utfToString("HelloWorld")).valObject;
fprintf(stderr, "system class loader: sysLoader: %p - %p\n", res, res->obj());
-#endif
}
JNIEnv* J3::jniEnv() {
Modified: vmkit/branches/mcjit/lib/j3/vm/j3class.cc
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3class.cc?rev=199581&r1=199580&r2=199581&view=diff
==============================================================================
--- vmkit/branches/mcjit/lib/j3/vm/j3class.cc (original)
+++ vmkit/branches/mcjit/lib/j3/vm/j3class.cc Sun Jan 19 05:02:13 2014
@@ -598,7 +598,7 @@ void J3Class::readClassBytes(J3Field* hi
} else {
f->_access = reader.readU2();
f->_name = nameAt(reader.readU2());
- f->_type = loader()->getType(this, nameAt(reader.readU2()));
+ f->_type = loader()->getTypeFromDescriptor(this, nameAt(reader.readU2()));
f->_attributes = readAttributes(&reader);
}
@@ -814,7 +814,7 @@ J3Field* J3Class::fieldAt(uint16_t idx,
J3Type* type = (J3Type*)ctpResolved[ntIdx];
if(!type)
- ctpResolved[ntIdx] = type = loader()->getType(this, nameAt(ctpValues[ntIdx] & 0xffff));
+ ctpResolved[ntIdx] = type = loader()->getTypeFromDescriptor(this, nameAt(ctpValues[ntIdx] & 0xffff));
res = cl->findField(access, name, type);
@@ -827,18 +827,30 @@ J3ObjectType* J3Class::classAt(uint16_t
if(res)
return res;
-
- const vmkit::Name* name = nameAt(ctpValues[idx]);
- if(name->cStr()[0] == J3Cst::ID_Array)
- res = loader()->getType(this, name)->asObjectType();
- else
- res = loader()->loadClass(name);
+
+ const char* buf;
+ size_t length;
+
+ utfAt(ctpValues[idx], &buf, &length);
+
+ res = loader()->getTypeFromQualified(this, buf, length);
ctpResolved[idx] = res;
return res;
}
+void J3Class::utfAt(uint16_t idx, const char** buf, size_t* length) {
+ check(idx, J3Cst::CONSTANT_Utf8);
+
+ J3Reader reader(_bytes);
+
+ reader.seek(ctpValues[idx], reader.SeekSet);
+
+ *length = reader.readU2();
+ *buf = (const char*)reader.pointer();
+}
+
const vmkit::Name* J3Class::nameAt(uint16_t idx) {
check(idx, J3Cst::CONSTANT_Utf8);
const vmkit::Name* res = (const vmkit::Name*)ctpResolved[idx];
@@ -846,13 +858,11 @@ const vmkit::Name* J3Class::nameAt(uint
if(res)
return res;
- J3Reader reader(_bytes);
-
- reader.seek(ctpValues[idx], reader.SeekSet);
-
- uint16_t len = reader.readU2(), i=0, n=0;
+ const char* buf;
+ size_t length;
+ utfAt(idx, &buf, &length);
- res = J3Thread::get()->vm()->names()->get((const char*)reader.pointer(), 0, len);
+ res = J3Thread::get()->vm()->names()->get(buf, 0, length);//(const char*)reader.pointer(), 0, len);
ctpResolved[idx] = (void*)res;
Modified: vmkit/branches/mcjit/lib/j3/vm/j3classloader.cc
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3classloader.cc?rev=199581&r1=199580&r2=199581&view=diff
==============================================================================
--- vmkit/branches/mcjit/lib/j3/vm/j3classloader.cc (original)
+++ vmkit/branches/mcjit/lib/j3/vm/j3classloader.cc Sun Jan 19 05:02:13 2014
@@ -114,21 +114,20 @@ J3Class* J3ClassLoader::loadClass(const
return J3Class::nativeClass(vm->classLoaderClassLoadClass->invokeVirtual(_javaClassLoader, vm->nameToString(name)).valObject)->asClass();
}
-void J3ClassLoader::wrongType(J3ObjectType* from, const vmkit::Name* type) {
- J3::classFormatError(from, "wrong type: %s", type->cStr());
+void J3ClassLoader::wrongType(J3ObjectType* from, const char* type, size_t length) {
+ J3::classFormatError(from, "wrong type: %s", J3Thread::get()->vm()->names()->get(type, 0, length));
}
-J3Type* J3ClassLoader::getTypeInternal(J3ObjectType* from, const vmkit::Name* typeName, uint32_t start, uint32_t* pend, bool unify) {
+J3Type* J3ClassLoader::getTypeInternal(J3ObjectType* from, const char* type,
+ size_t start, size_t len, size_t* pend, bool unify) {
J3* vm = J3Thread::get()->vm();
J3Type* res = 0;
- const char* type = typeName->cStr();
- uint32_t len = typeName->length();
uint32_t pos = start;
uint32_t prof = 0;
while(!res) {
if(pos >= len)
- wrongType(from, typeName);
+ wrongType(from, type, len);
switch(type[pos]) {
case J3Cst::ID_Array: prof++; pos++; break;
@@ -138,16 +137,16 @@ J3Type* J3ClassLoader::getTypeInternal(J
#undef doIt
case J3Cst::ID_Classname:
if(unify) {
- uint32_t start = ++pos;
+ size_t start = ++pos;
for(; pos < len && type[pos] != J3Cst::ID_End; pos++);
if(type[pos] != J3Cst::ID_End)
- wrongType(from, typeName);
+ wrongType(from, type, len);
pos++;
res = vm->objectClass;
} else {
- uint32_t start = ++pos;
+ size_t start = ++pos;
char buf[len + 1 - start], c;
memset(buf, 0, len + 1 - pos);
@@ -156,7 +155,7 @@ J3Type* J3ClassLoader::getTypeInternal(J
buf[pos - start] = c;
if(type[pos] != J3Cst::ID_End)
- wrongType(from, typeName);
+ wrongType(from, type, len);
buf[pos++ - start] = 0;
@@ -166,7 +165,7 @@ J3Type* J3ClassLoader::getTypeInternal(J
case J3Cst::ID_Left:
case J3Cst::ID_Right:
default:
- wrongType(from, typeName);
+ wrongType(from, type, len);
}
}
@@ -176,34 +175,50 @@ J3Type* J3ClassLoader::getTypeInternal(J
if(unify)
res = vm->objectClass;
else
- res = res->getArray(prof, start ? 0 : typeName);
+ res = res->getArray(prof);
}
return res;
}
-J3Type* J3ClassLoader::getType(J3ObjectType* from, const vmkit::Name* type) {
+J3Type* J3ClassLoader::getTypeFromDescriptor(J3ObjectType* from, const vmkit::Name* typeName) {
pthread_mutex_lock(&_mutexTypes);
- J3Type* res = types[type];
+ J3Type* res = types[typeName];
pthread_mutex_unlock(&_mutexTypes);
if(!res) {
- uint32_t end;
- res = getTypeInternal(from, type, 0, &end, 0);
+ const char* type = typeName->cStr();
+ size_t length = typeName->length();
+ size_t end;
+ res = getTypeInternal(from, type, 0, length, &end, 0);
- if(end != type->length())
- wrongType(from, type);
+ if(end != length)
+ wrongType(from, type, length);
//printf("Analyse %s => %ls\n", type->cStr(), res->name()->cStr());
pthread_mutex_lock(&_mutexTypes);
- types[type] = res;
+ types[typeName] = res;
pthread_mutex_unlock(&_mutexTypes);
}
return res;
}
+J3ObjectType* J3ClassLoader::getTypeFromQualified(J3ObjectType* from, const char* type, size_t length) {
+ if(length == -1)
+ length = strlen(type);
+
+ if(type[0] == J3Cst::ID_Array)
+ return getTypeFromDescriptor(from, J3Thread::get()->vm()->names()->get(type, 0, length))->asObjectType();
+ else {
+ char buf[length+1];
+ for(size_t i=0; i<length; i++)
+ buf[i] = type[i];
+ buf[length] = 0;
+ return loadClass(J3Thread::get()->vm()->names()->get(buf));
+ }
+}
J3Signature* J3ClassLoader::getSignature(J3ObjectType* from, const vmkit::Name* signature) {
pthread_mutex_lock(&_mutexMethodTypes);
Modified: vmkit/branches/mcjit/lib/j3/vm/j3jni.cc
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3jni.cc?rev=199581&r1=199580&r2=199581&view=diff
==============================================================================
--- vmkit/branches/mcjit/lib/j3/vm/j3jni.cc (original)
+++ vmkit/branches/mcjit/lib/j3/vm/j3jni.cc Sun Jan 19 05:02:13 2014
@@ -18,14 +18,16 @@ jint JNICALL GetVersion(JNIEnv* env) {
}
jclass JNICALL DefineClass(JNIEnv* env, const char* name, jobject loader, const jbyte* buf, jsize len) { enterJVM(); leaveJVM(); NYI(); }
+
jclass JNICALL FindClass(JNIEnv* env, const char* name) {
jclass res;
enterJVM();
J3Method* m = J3Thread::get()->getJavaCaller();
J3* vm = J3Thread::get()->vm();
- J3ClassLoader* loader = m ? m->cl()->loader() : vm->initialClassLoader;
- J3Class* cl = loader->loadClass(vm->names()->get(name));
+ J3ClassLoader* loader = m ? m->cl()->loader() :
+ J3ClassLoader::nativeClassLoader(vm->classLoaderClassGetSystemClassLoader->invokeStatic().valObject);
+ J3ObjectType* cl = loader->getTypeFromQualified(m ? m->cl() : 0, name);
cl->initialise();
res = cl->javaClass();
leaveJVM();
@@ -394,7 +396,7 @@ jfieldID JNICALL GetFieldID(JNIEnv* env,
enterJVM();
J3* vm = J3Thread::get()->vm();
J3Class* cl = J3ObjectType::nativeClass(clazz)->asClass();
- res = cl->findField(0, vm->names()->get(name), cl->loader()->getType(cl, vm->names()->get(sig)), 0);
+ res = cl->findField(0, vm->names()->get(name), cl->loader()->getTypeFromDescriptor(cl, vm->names()->get(sig)), 0);
leaveJVM();
return res;
}
@@ -404,7 +406,7 @@ jfieldID JNICALL GetStaticFieldID(JNIEnv
enterJVM();
J3* vm = J3Thread::get()->vm();
J3Class* cl = J3ObjectType::nativeClass(clazz)->asClass();
- res = cl->findField(J3Cst::ACC_STATIC, vm->names()->get(name), cl->loader()->getType(cl, vm->names()->get(sig)), 0);
+ res = cl->findField(J3Cst::ACC_STATIC, vm->names()->get(name), cl->loader()->getTypeFromDescriptor(cl, vm->names()->get(sig)), 0);
leaveJVM();
return res;
}
Modified: vmkit/branches/mcjit/lib/j3/vm/j3signature.cc
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3signature.cc?rev=199581&r1=199580&r2=199581&view=diff
==============================================================================
--- vmkit/branches/mcjit/lib/j3/vm/j3signature.cc (original)
+++ vmkit/branches/mcjit/lib/j3/vm/j3signature.cc Sun Jan 19 05:02:13 2014
@@ -22,13 +22,15 @@ void J3Signature::checkInOut() {
if(!_out) {
J3Type* args[1+name()->length()];
uint32_t nbArgs = 0;
- uint32_t cur = 1;
+ size_t cur = 1;
+ const char* type = name()->cStr();
+ size_t length = name()->length();
if(name()->cStr()[0] != J3Cst::ID_Left)
- loader()->wrongType(0, name());
+ loader()->wrongType(0, type, length);
while(name()->cStr()[cur] != J3Cst::ID_Right)
- args[nbArgs++] = loader()->getTypeInternal(0, name(), cur, &cur, 0);
+ args[nbArgs++] = loader()->getTypeInternal(0, type, cur, length, &cur, 0);
if(nbArgs != nbIns())
J3::internalError("should not happen %d %d", nbArgs, nbIns());
@@ -36,9 +38,9 @@ void J3Signature::checkInOut() {
_ins = (J3Type**)loader()->allocator()->allocate(nbArgs*sizeof(J3Type*));
memcpy(_ins, args, nbArgs*sizeof(J3Type*));
- _out = loader()->getTypeInternal(0, name(), cur+1, &cur, 0); /* out has to be the last (thread safety) */
- if(cur != name()->length())
- loader()->wrongType(0, name());
+ _out = loader()->getTypeInternal(0, type, cur+1, length, &cur, 0); /* out has to be the last (thread safety) */
+ if(cur != length)
+ loader()->wrongType(0, type, length);
}
}
@@ -56,20 +58,22 @@ void J3Signature::checkFunctionType() {
if(!_virtualLLVMSignature) {
std::vector<llvm::Type*> vins;
std::vector<llvm::Type*> sins;
- uint32_t cur = 1;
+ size_t cur = 1;
+ const char* type = name()->cStr();
+ size_t length = name()->length();
vins.push_back(J3Thread::get()->vm()->objectClass->llvmType());
- if(name()->cStr()[0] != J3Cst::ID_Left)
- loader()->wrongType(0, name());
+ if(type[0] != J3Cst::ID_Left)
+ loader()->wrongType(0, type, length);
while(name()->cStr()[cur] != J3Cst::ID_Right) {
- llvm::Type* in = loader()->getTypeInternal(0, name(), cur, &cur, 1)->llvmType();
+ llvm::Type* in = loader()->getTypeInternal(0, type, cur, length, &cur, 1)->llvmType();
sins.push_back(in);
vins.push_back(in);
}
- llvm::Type* out = loader()->getTypeInternal(0, name(), cur+1, &cur, 1)->llvmType();
+ llvm::Type* out = loader()->getTypeInternal(0, type, cur+1, length, &cur, 1)->llvmType();
_staticLLVMSignature = buildLLVMSignature(llvm::FunctionType::get(out, sins, 0));
_virtualLLVMSignature = buildLLVMSignature(llvm::FunctionType::get(out, vins, 0));
More information about the vmkit-commits
mailing list