[vmkit-commits] [vmkit] r55416 - in /vmkit/branches/isolate/lib/JnJVM: Classpath/ Isolate/ VMCore/
Nicolas Geoffray
nicolas.geoffray at lip6.fr
Wed Aug 27 08:43:13 PDT 2008
Author: geoffray
Date: Wed Aug 27 10:43:10 2008
New Revision: 55416
URL: http://llvm.org/viewvc/llvm-project?rev=55416&view=rev
Log:
Add a new parameter when making upcalls and calling Java
method. This parameter is the cache constant pool.
Modified:
vmkit/branches/isolate/lib/JnJVM/Classpath/Classpath.cpp
vmkit/branches/isolate/lib/JnJVM/Classpath/ClasspathConstructor.cpp.inc
vmkit/branches/isolate/lib/JnJVM/Classpath/ClasspathMethod.cpp.inc
vmkit/branches/isolate/lib/JnJVM/Classpath/ClasspathVMClass.cpp.inc
vmkit/branches/isolate/lib/JnJVM/Classpath/ClasspathVMSystemProperties.cpp.inc
vmkit/branches/isolate/lib/JnJVM/Classpath/ClasspathVMThread.cpp.inc
vmkit/branches/isolate/lib/JnJVM/Classpath/ClasspathVMThrowable.cpp.inc
vmkit/branches/isolate/lib/JnJVM/Isolate/IsolateCommonClass.h
vmkit/branches/isolate/lib/JnJVM/VMCore/JavaClass.h
vmkit/branches/isolate/lib/JnJVM/VMCore/JavaJIT.cpp
vmkit/branches/isolate/lib/JnJVM/VMCore/JavaJIT.h
vmkit/branches/isolate/lib/JnJVM/VMCore/JavaJITOpcodes.cpp
vmkit/branches/isolate/lib/JnJVM/VMCore/JavaMetaJIT.cpp
vmkit/branches/isolate/lib/JnJVM/VMCore/JavaUpcalls.cpp
vmkit/branches/isolate/lib/JnJVM/VMCore/JavaUpcalls.h
vmkit/branches/isolate/lib/JnJVM/VMCore/Jni.cpp
vmkit/branches/isolate/lib/JnJVM/VMCore/Jnjvm.cpp
vmkit/branches/isolate/lib/JnJVM/VMCore/Jnjvm.h
vmkit/branches/isolate/lib/JnJVM/VMCore/JnjvmClassLoader.cpp
vmkit/branches/isolate/lib/JnJVM/VMCore/JnjvmModule.cpp
Modified: vmkit/branches/isolate/lib/JnJVM/Classpath/Classpath.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/Classpath/Classpath.cpp?rev=55416&r1=55415&r2=55416&view=diff
==============================================================================
--- vmkit/branches/isolate/lib/JnJVM/Classpath/Classpath.cpp (original)
+++ vmkit/branches/isolate/lib/JnJVM/Classpath/Classpath.cpp Wed Aug 27 10:43:10 2008
@@ -160,7 +160,7 @@
UserClass* cl = (UserClass*)NativeUtil::resolvedImplClass(target, true);
JavaObject* res = cl->doNew(vm);
JavaMethod* meth = (JavaMethod*)(vm->upcalls->constructorSlot->getInt32Field((JavaObject*)cons));
- meth->invokeIntSpecial(vm, res);
+ meth->invokeIntSpecial(vm, cl, res);
return (jobject)res;
}
Modified: vmkit/branches/isolate/lib/JnJVM/Classpath/ClasspathConstructor.cpp.inc
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/Classpath/ClasspathConstructor.cpp.inc?rev=55416&r1=55415&r2=55416&view=diff
==============================================================================
--- vmkit/branches/isolate/lib/JnJVM/Classpath/ClasspathConstructor.cpp.inc (original)
+++ vmkit/branches/isolate/lib/JnJVM/Classpath/ClasspathConstructor.cpp.inc Wed Aug 27 10:43:10 2008
@@ -80,7 +80,7 @@
JavaObject* excp = 0;
try {
- meth->invokeIntSpecialBuf(vm, res, _buf);
+ meth->invokeIntSpecialBuf(vm, cl, res, _buf);
}catch(...) {
excp = JavaThread::getJavaException();
JavaThread::clearException();
Modified: vmkit/branches/isolate/lib/JnJVM/Classpath/ClasspathMethod.cpp.inc
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/Classpath/ClasspathMethod.cpp.inc?rev=55416&r1=55415&r2=55416&view=diff
==============================================================================
--- vmkit/branches/isolate/lib/JnJVM/Classpath/ClasspathMethod.cpp.inc (original)
+++ vmkit/branches/isolate/lib/JnJVM/Classpath/ClasspathMethod.cpp.inc Wed Aug 27 10:43:10 2008
@@ -116,12 +116,12 @@
try{ \
if (isVirtual(meth->access)) { \
if (isPublic(meth->access)) { \
- val = meth->invoke##TYPE##VirtualBuf(vm, obj, _buf); \
+ val = meth->invoke##TYPE##VirtualBuf(vm, cl, obj, _buf); \
} else { \
- val = meth->invoke##TYPE##SpecialBuf(vm, obj, _buf); \
+ val = meth->invoke##TYPE##SpecialBuf(vm, cl, obj, _buf); \
} \
} else { \
- val = meth->invoke##TYPE##StaticBuf(vm, _buf); \
+ val = meth->invoke##TYPE##StaticBuf(vm, cl, _buf); \
} \
}catch(...) { \
exc = JavaThread::getJavaException(); \
Modified: vmkit/branches/isolate/lib/JnJVM/Classpath/ClasspathVMClass.cpp.inc
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/Classpath/ClasspathVMClass.cpp.inc?rev=55416&r1=55415&r2=55416&view=diff
==============================================================================
--- vmkit/branches/isolate/lib/JnJVM/Classpath/ClasspathVMClass.cpp.inc (original)
+++ vmkit/branches/isolate/lib/JnJVM/Classpath/ClasspathVMClass.cpp.inc Wed Aug 27 10:43:10 2008
@@ -92,8 +92,9 @@
i != e; ++i, ++index) {
JavaMethod* meth = *i;
// TODO: check parameter types
- JavaObject* tmp = vm->upcalls->newConstructor->doNew(vm);
- vm->upcalls->initConstructor->invokeIntSpecial(vm, tmp, Cl, meth);
+ UserClass* Cons = vm->upcalls->newConstructor;
+ JavaObject* tmp = Cons->doNew(vm);
+ vm->upcalls->initConstructor->invokeIntSpecial(vm, Cons, tmp, Cl, meth);
ret->elements[index] = tmp;
}
return (jobject)ret;
@@ -124,8 +125,9 @@
i != e; ++i, ++index) {
JavaMethod* meth = *i;
// TODO: check parameter types
- JavaObject* tmp = vm->upcalls->newMethod->doNew(vm);
- vm->upcalls->initMethod->invokeIntSpecial(vm, tmp, Cl,
+ UserClass* Meth = vm->upcalls->newMethod;
+ JavaObject* tmp = Meth->doNew(vm);
+ vm->upcalls->initMethod->invokeIntSpecial(vm, Meth, tmp, Cl,
vm->UTF8ToStr(meth->name), meth);
ret->elements[index] = tmp;
}
@@ -284,8 +286,9 @@
i != e; ++i, ++index) {
JavaField* field = *i;
// TODO: check parameter types
- JavaObject* tmp = vm->upcalls->newField->doNew(vm);
- vm->upcalls->initField->invokeIntSpecial(vm, tmp, Cl,
+ UserClass* Field = vm->upcalls->newField;
+ JavaObject* tmp = Field->doNew(vm);
+ vm->upcalls->initField->invokeIntSpecial(vm, Field, tmp, Cl,
vm->UTF8ToStr(field->name), field);
ret->elements[index] = tmp;
}
Modified: vmkit/branches/isolate/lib/JnJVM/Classpath/ClasspathVMSystemProperties.cpp.inc
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/Classpath/ClasspathVMSystemProperties.cpp.inc?rev=55416&r1=55415&r2=55416&view=diff
==============================================================================
--- vmkit/branches/isolate/lib/JnJVM/Classpath/ClasspathVMSystemProperties.cpp.inc (original)
+++ vmkit/branches/isolate/lib/JnJVM/Classpath/ClasspathVMSystemProperties.cpp.inc Wed Aug 27 10:43:10 2008
@@ -28,7 +28,9 @@
static void setProperty(Jnjvm* vm, JavaObject* prop, const char* key,
const char* val) {
- vm->upcalls->setProperty->invokeIntSpecial(vm, prop, vm->asciizToStr(key),
+ vm->upcalls->setProperty->invokeIntSpecial(vm, (UserClass*)prop->classOf,
+ prop,
+ vm->asciizToStr(key),
vm->asciizToStr(val));
}
Modified: vmkit/branches/isolate/lib/JnJVM/Classpath/ClasspathVMThread.cpp.inc
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/Classpath/ClasspathVMThread.cpp.inc?rev=55416&r1=55415&r2=55416&view=diff
==============================================================================
--- vmkit/branches/isolate/lib/JnJVM/Classpath/ClasspathVMThread.cpp.inc (original)
+++ vmkit/branches/isolate/lib/JnJVM/Classpath/ClasspathVMThread.cpp.inc Wed Aug 27 10:43:10 2008
@@ -78,7 +78,7 @@
vm->lock->unlock();
#endif
JavaMethod* method = vmthClass->lookupMethod(Jnjvm::runName, Jnjvm::clinitType, ACC_VIRTUAL, true);
- method->invokeIntSpecial(isolate, vmThread);
+ method->invokeIntSpecial(isolate, (UserClass*)vmthClass, vmThread);
if (!isDaemon) {
Modified: vmkit/branches/isolate/lib/JnJVM/Classpath/ClasspathVMThrowable.cpp.inc
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/Classpath/ClasspathVMThrowable.cpp.inc?rev=55416&r1=55415&r2=55416&view=diff
==============================================================================
--- vmkit/branches/isolate/lib/JnJVM/Classpath/ClasspathVMThrowable.cpp.inc (original)
+++ vmkit/branches/isolate/lib/JnJVM/Classpath/ClasspathVMThrowable.cpp.inc Wed Aug 27 10:43:10 2008
@@ -65,10 +65,12 @@
bool native = isNative(meth->access);
- JavaObject* res = vm->upcalls->newStackTraceElement->doNew(vm);
- vm->upcalls->initStackTraceElement->invokeIntSpecial(vm, res, sourceName,
- (uint32)ip, className,
- methodName, native);
+ UserClass* newS = vm->upcalls->newStackTraceElement;
+ JavaObject* res = newS->doNew(vm);
+ vm->upcalls->initStackTraceElement->invokeIntSpecial(vm, newS, res,
+ sourceName,
+ (uint32)ip, className,
+ methodName, native);
return res;
}
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=55416&r1=55415&r2=55416&view=diff
==============================================================================
--- vmkit/branches/isolate/lib/JnJVM/Isolate/IsolateCommonClass.h (original)
+++ vmkit/branches/isolate/lib/JnJVM/Isolate/IsolateCommonClass.h Wed Aug 27 10:43:10 2008
@@ -139,6 +139,9 @@
UserClassPrimitive(JnjvmClassLoader* JCL, const UTF8* name, uint32 nb);
};
+class UserConstantPool {
+};
+
} // end namespace jnjvm
#endif // JNJVM_CLASS_ISOLATE_H
Modified: vmkit/branches/isolate/lib/JnJVM/VMCore/JavaClass.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/VMCore/JavaClass.h?rev=55416&r1=55415&r2=55416&view=diff
==============================================================================
--- vmkit/branches/isolate/lib/JnJVM/VMCore/JavaClass.h (original)
+++ vmkit/branches/isolate/lib/JnJVM/VMCore/JavaClass.h Wed Aug 27 10:43:10 2008
@@ -31,6 +31,7 @@
class AssessorDesc;
class Enveloppe;
class Class;
+class ClassArray;
class JavaConstantPool;
class JavaField;
class JavaJIT;
@@ -611,6 +612,13 @@
JavaConstantPool* getConstantPool() {
return ctpInfo;
}
+
+ /// getCtpCache - A class does not have a ctp cache, hence
+ /// this method always returns 0.
+ ///
+ JavaConstantPool* getCtpCache() {
+ return 0;
+ }
ArrayUInt8* getBytes() {
return bytes;
@@ -782,62 +790,62 @@
//===----------------------------------------------------------------------===//
/// This class of methods takes a variable argument list.
- uint32 invokeIntSpecialAP(Jnjvm* vm, JavaObject* obj, va_list ap);
- float invokeFloatSpecialAP(Jnjvm* vm, JavaObject* obj, va_list ap);
- double invokeDoubleSpecialAP(Jnjvm* vm, JavaObject* obj, va_list ap);
- sint64 invokeLongSpecialAP(Jnjvm* vm, JavaObject* obj, va_list ap);
- JavaObject* invokeJavaObjectSpecialAP(Jnjvm* vm, JavaObject* obj, va_list ap);
-
- uint32 invokeIntVirtualAP(Jnjvm* vm, JavaObject* obj, va_list ap);
- float invokeFloatVirtualAP(Jnjvm* vm, JavaObject* obj, va_list ap);
- double invokeDoubleVirtualAP(Jnjvm* vm, JavaObject* obj, va_list ap);
- sint64 invokeLongVirtualAP(Jnjvm* vm, JavaObject* obj, va_list ap);
- JavaObject* invokeJavaObjectVirtualAP(Jnjvm* vm, JavaObject* obj, va_list ap);
-
- uint32 invokeIntStaticAP(Jnjvm* vm, va_list ap);
- float invokeFloatStaticAP(Jnjvm* vm, va_list ap);
- double invokeDoubleStaticAP(Jnjvm* vm, va_list ap);
- sint64 invokeLongStaticAP(Jnjvm* vm, va_list ap);
- JavaObject* invokeJavaObjectStaticAP(Jnjvm* vm, va_list ap);
+ uint32 invokeIntSpecialAP(Jnjvm* vm, UserClass*, JavaObject* obj, va_list ap);
+ float invokeFloatSpecialAP(Jnjvm* vm, UserClass*, JavaObject* obj, va_list ap);
+ double invokeDoubleSpecialAP(Jnjvm* vm, UserClass*, JavaObject* obj, va_list ap);
+ sint64 invokeLongSpecialAP(Jnjvm* vm, UserClass*, JavaObject* obj, va_list ap);
+ JavaObject* invokeJavaObjectSpecialAP(Jnjvm* vm, UserClass*, JavaObject* obj, va_list ap);
+
+ uint32 invokeIntVirtualAP(Jnjvm* vm, UserClass*, JavaObject* obj, va_list ap);
+ float invokeFloatVirtualAP(Jnjvm* vm, UserClass*, JavaObject* obj, va_list ap);
+ double invokeDoubleVirtualAP(Jnjvm* vm, UserClass*, JavaObject* obj, va_list ap);
+ sint64 invokeLongVirtualAP(Jnjvm* vm, UserClass*, JavaObject* obj, va_list ap);
+ JavaObject* invokeJavaObjectVirtualAP(Jnjvm* vm, UserClass*, JavaObject* obj, va_list ap);
+
+ uint32 invokeIntStaticAP(Jnjvm* vm, UserClass*, va_list ap);
+ float invokeFloatStaticAP(Jnjvm* vm, UserClass*, va_list ap);
+ double invokeDoubleStaticAP(Jnjvm* vm, UserClass*, va_list ap);
+ sint64 invokeLongStaticAP(Jnjvm* vm, UserClass*, va_list ap);
+ JavaObject* invokeJavaObjectStaticAP(Jnjvm* vm, UserClass*, va_list ap);
/// This class of methods takes a buffer which contain the arguments of the
/// call.
- uint32 invokeIntSpecialBuf(Jnjvm* vm, JavaObject* obj, void* buf);
- float invokeFloatSpecialBuf(Jnjvm* vm, JavaObject* obj, void* buf);
- double invokeDoubleSpecialBuf(Jnjvm* vm, JavaObject* obj, void* buf);
- sint64 invokeLongSpecialBuf(Jnjvm* vm, JavaObject* obj, void* buf);
- JavaObject* invokeJavaObjectSpecialBuf(Jnjvm* vm, JavaObject* obj, void* buf);
-
- uint32 invokeIntVirtualBuf(Jnjvm* vm, JavaObject* obj, void* buf);
- float invokeFloatVirtualBuf(Jnjvm* vm, JavaObject* obj, void* buf);
- double invokeDoubleVirtualBuf(Jnjvm* vm, JavaObject* obj, void* buf);
- sint64 invokeLongVirtualBuf(Jnjvm* vm, JavaObject* obj, void* buf);
- JavaObject* invokeJavaObjectVirtualBuf(Jnjvm* vm, JavaObject* obj, void* buf);
-
- uint32 invokeIntStaticBuf(Jnjvm* vm, void* buf);
- float invokeFloatStaticBuf(Jnjvm* vm, void* buf);
- double invokeDoubleStaticBuf(Jnjvm* vm, void* buf);
- sint64 invokeLongStaticBuf(Jnjvm* vm, void* buf);
- JavaObject* invokeJavaObjectStaticBuf(Jnjvm* vm, void* buf);
+ uint32 invokeIntSpecialBuf(Jnjvm* vm, UserClass*, JavaObject* obj, void* buf);
+ float invokeFloatSpecialBuf(Jnjvm* vm, UserClass*, JavaObject* obj, void* buf);
+ double invokeDoubleSpecialBuf(Jnjvm* vm, UserClass*, JavaObject* obj, void* buf);
+ sint64 invokeLongSpecialBuf(Jnjvm* vm, UserClass*, JavaObject* obj, void* buf);
+ JavaObject* invokeJavaObjectSpecialBuf(Jnjvm* vm, UserClass*, JavaObject* obj, void* buf);
+
+ uint32 invokeIntVirtualBuf(Jnjvm* vm, UserClass*, JavaObject* obj, void* buf);
+ float invokeFloatVirtualBuf(Jnjvm* vm, UserClass*, JavaObject* obj, void* buf);
+ double invokeDoubleVirtualBuf(Jnjvm* vm, UserClass*, JavaObject* obj, void* buf);
+ sint64 invokeLongVirtualBuf(Jnjvm* vm, UserClass*, JavaObject* obj, void* buf);
+ JavaObject* invokeJavaObjectVirtualBuf(Jnjvm* vm, UserClass*, JavaObject* obj, void* buf);
+
+ uint32 invokeIntStaticBuf(Jnjvm* vm, UserClass*, void* buf);
+ float invokeFloatStaticBuf(Jnjvm* vm, UserClass*, void* buf);
+ double invokeDoubleStaticBuf(Jnjvm* vm, UserClass*, void* buf);
+ sint64 invokeLongStaticBuf(Jnjvm* vm, UserClass*, void* buf);
+ JavaObject* invokeJavaObjectStaticBuf(Jnjvm* vm, UserClass*, void* buf);
/// This class of methods is variadic.
- uint32 invokeIntSpecial(Jnjvm* vm, JavaObject* obj, ...);
- float invokeFloatSpecial(Jnjvm* vm, JavaObject* obj, ...);
- double invokeDoubleSpecial(Jnjvm* vm, JavaObject* obj, ...);
- sint64 invokeLongSpecial(Jnjvm* vm, JavaObject* obj, ...);
- JavaObject* invokeJavaObjectSpecial(Jnjvm* vm, JavaObject* obj, ...);
-
- uint32 invokeIntVirtual(Jnjvm* vm, JavaObject* obj, ...);
- float invokeFloatVirtual(Jnjvm* vm, JavaObject* obj, ...);
- double invokeDoubleVirtual(Jnjvm* vm, JavaObject* obj, ...);
- sint64 invokeLongVirtual(Jnjvm* vm, JavaObject* obj, ...);
- JavaObject* invokeJavaObjectVirtual(Jnjvm* vm, JavaObject* obj, ...);
-
- uint32 invokeIntStatic(Jnjvm* vm, ...);
- float invokeFloatStatic(Jnjvm* vm, ...);
- double invokeDoubleStatic(Jnjvm* vm, ...);
- sint64 invokeLongStatic(Jnjvm* vm, ...);
- JavaObject* invokeJavaObjectStatic(Jnjvm* vm, ...);
+ uint32 invokeIntSpecial(Jnjvm* vm, UserClass*, JavaObject* obj, ...);
+ float invokeFloatSpecial(Jnjvm* vm, UserClass*, JavaObject* obj, ...);
+ double invokeDoubleSpecial(Jnjvm* vm, UserClass*, JavaObject* obj, ...);
+ sint64 invokeLongSpecial(Jnjvm* vm, UserClass*, JavaObject* obj, ...);
+ JavaObject* invokeJavaObjectSpecial(Jnjvm* vm, UserClass*, JavaObject* obj, ...);
+
+ uint32 invokeIntVirtual(Jnjvm* vm, UserClass*, JavaObject* obj, ...);
+ float invokeFloatVirtual(Jnjvm* vm, UserClass*, JavaObject* obj, ...);
+ double invokeDoubleVirtual(Jnjvm* vm, UserClass*, JavaObject* obj, ...);
+ sint64 invokeLongVirtual(Jnjvm* vm, UserClass*, JavaObject* obj, ...);
+ JavaObject* invokeJavaObjectVirtual(Jnjvm* vm, UserClass*, JavaObject* obj, ...);
+
+ uint32 invokeIntStatic(Jnjvm* vm, UserClass*, ...);
+ float invokeFloatStatic(Jnjvm* vm, UserClass*, ...);
+ double invokeDoubleStatic(Jnjvm* vm, UserClass*, ...);
+ sint64 invokeLongStatic(Jnjvm* vm, UserClass*, ...);
+ JavaObject* invokeJavaObjectStatic(Jnjvm* vm, UserClass*, ...);
mvm::JITInfo* JInfo;
template<typename Ty>
@@ -965,4 +973,9 @@
} // end namespace jnjvm
+
+#ifdef MULTIPLE_VM
+#include "IsolateCommonClass.h"
+#endif
+
#endif
Modified: vmkit/branches/isolate/lib/JnJVM/VMCore/JavaJIT.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/VMCore/JavaJIT.cpp?rev=55416&r1=55415&r2=55416&view=diff
==============================================================================
--- vmkit/branches/isolate/lib/JnJVM/VMCore/JavaJIT.cpp (original)
+++ vmkit/branches/isolate/lib/JnJVM/VMCore/JavaJIT.cpp Wed Aug 27 10:43:10 2008
@@ -62,7 +62,7 @@
return invokeSpecial(index);
-#ifndef WITHOUT_VTABLE
+#if !defined(WITHOUT_VTABLE) && !defined(MULTIPLE_VM)
Constant* zero = mvm::jit::constantZero;
Signdef* signature = ctpInfo->infoOfInterfaceOrVirtualMethod(index);
std::vector<Value*> args; // size = [signature->nbIn + 3];
@@ -70,9 +70,19 @@
const llvm::FunctionType* virtualType = LSI->getVirtualType();
FunctionType::param_iterator it = virtualType->param_end();
makeArgs(it, index, args, signature->args.size() + 1);
-
+
+
JITVerifyNull(args[0]);
+#if defined(MULTIPLE_VM)
+ Value* cl = CallInst::Create(JnjvmModule::GetClassFunction, args[0], "",
+ currentBlock);
+
+ Value* newCtpCache = CallInst::Create(JnjvmModule::GetCtpCacheFunction, cl, "",
+ currentBlock);
+ args.push_back(newCtpCache);
+#endif
+
Value* VT = CallInst::Create(JnjvmModule::GetVTFunction, args[0], "",
currentBlock);
std::vector<Value*> indexes2; //[3];
@@ -159,15 +169,19 @@
BasicBlock* executeBlock = createBasicBlock("execute");
endBlock = createBasicBlock("end block");
-#if defined(MULTIPLE_VM) || defined(MULTIPLE_GC)
+#if defined(MULTIPLE_VM)
Value* lastArg = 0;
for (Function::arg_iterator i = func->arg_begin(), e = func->arg_end();
i != e; ++i) {
lastArg = i;
}
#if !defined(SERVICE_VM)
+ ctpCache = lastArg;
+ lastArg--;
isolateLocal = lastArg;
#else
+ ctpCache = lastArg;
+ lastArg--;
if (compilingClass->isolate == Jnjvm::bootstrapVM) {
isolateLocal = lastArg;
} else {
@@ -510,8 +524,8 @@
uint32 index = 0;
uint32 count = 0;
-#if defined(MULTIPLE_VM) || defined(MULTIPLE_GC)
- uint32 max = args.size() - 1;
+#if defined(MULTIPLE_VM)
+ uint32 max = args.size() - 2;
#else
uint32 max = args.size();
#endif
@@ -551,12 +565,14 @@
}
}
-#if defined(MULTIPLE_VM) || defined(MULTIPLE_GC)
+#if defined(MULTIPLE_VM)
#if !defined(SERVICE_VM)
- isolateLocal = args[args.size() - 1];
+ isolateLocal = args[args.size() - 2];
+ ctpCache = args[args.size() - 1];
#else
+ ctpCache = args[args.size() - 1];
if (compilingClass->isolate == Jnjvm::bootstrapVM) {
- isolateLocal = args[args.size() - 1];
+ isolateLocal = args[args.size() - 2];
} else {
JavaObject* loader = compilingClass->classLoader;
ServiceDomain* vm = ServiceDomain::getDomainFromLoader(loader);
@@ -569,7 +585,7 @@
BranchInst::Create(ifTrue, endBlock, cmp, currentBlock);
currentBlock = ifTrue;
std::vector<Value*> Args;
- Args.push_back(args[args.size()- 1]);
+ Args.push_back(args[args.size()- 2]);
Args.push_back(isolateLocal);
CallInst::Create(JnjvmModule::ServiceCallStartFunction, Args.begin(),
Args.end(), "", currentBlock);
@@ -674,8 +690,8 @@
uint32 index = 0;
uint32 count = 0;
-#if defined(MULTIPLE_VM) || defined(MULTIPLE_GC)
- uint32 max = func->arg_size() - 1;
+#if defined(MULTIPLE_VM)
+ uint32 max = func->arg_size() - 2;
#else
uint32 max = func->arg_size();
#endif
@@ -714,9 +730,11 @@
}
}
-#if defined(MULTIPLE_VM) || defined(MULTIPLE_GC)
+#if defined(MULTIPLE_VM)
#if !defined(SERVICE_VM)
isolateLocal = i;
+ i++;
+ ctpCache = i;
#else
if (compilingClass->isolate == Jnjvm::bootstrapVM) {
isolateLocal = i;
@@ -739,6 +757,8 @@
BranchInst::Create(endBlock, currentBlock);
currentBlock = endBlock;
}
+ i++;
+ ctpCache = i;
#endif
#endif
@@ -912,6 +932,7 @@
ex->catche = reader.readU2();
+#ifndef MULTIPLE_VM
if (ex->catche) {
JavaObject* exc = 0;
UserClass* cl = 0;
@@ -931,13 +952,9 @@
ex->catchClass = cl;
} else {
-#ifdef MULTIPLE_VM
- fprintf(stderr, "implement me");
- abort();
-#else
ex->catchClass = Classpath::newThrowable;
-#endif
}
+#endif
ex->test = createBasicBlock("testException");
@@ -1028,11 +1045,13 @@
Value* cl = 0;
currentBlock = cur->realTest;
- assert(cur->catchClass);
#ifdef MULTIPLE_VM
- fprintf(stderr, "implement me");
- abort();
+ // We're dealing with exceptions, don't catch the exception if the class can
+ // not be found.
+ if (catche) cl = getResolvedClass(cur->catche, false, false);
+ else cl = getJnjvmExceptionClass();
#else
+ assert(cur->catchClass);
LLVMClassInfo* LCI = (LLVMClassInfo*)module->getClassInfo(cur->catchClass);
cl = LCI->getVar(this);
#endif
@@ -1327,14 +1346,15 @@
void JavaJIT::makeArgs(FunctionType::param_iterator it,
uint32 index, std::vector<Value*>& Args, uint32 nb) {
-#if defined(MULTIPLE_VM) || defined(MULTIPLE_GC)
- nb++;
+#if defined(MULTIPLE_VM)
+ nb += 2;
#endif
Args.reserve(nb + 2);
Value** args = (Value**)alloca(nb*sizeof(Value*));
-#if defined(MULTIPLE_VM) || defined(MULTIPLE_GC)
- args[nb - 1] = isolateLocal;
- sint32 start = nb - 2;
+#if defined(MULTIPLE_VM)
+ args[nb - 2] = isolateLocal;
+ sint32 start = nb - 3;
+ it--;
it--;
#else
sint32 start = nb - 1;
@@ -1509,6 +1529,14 @@
if (!val) {
+#if defined(MULTIPLE_VM)
+ uint32 clIndex = ctpInfo->getClassIndexFromMethod(index);
+ Value* cl = getResolvedClass(clIndex, false);
+
+ Value* newCtpCache = CallInst::Create(JnjvmModule::GetCtpCacheFunction, cl,
+ "", currentBlock);
+ args.push_back(newCtpCache);
+#endif
Function* func =
(Function*)ctpInfo->infoOfStaticOrSpecialMethod(index, ACC_VIRTUAL,
signature, meth);
@@ -1557,22 +1585,13 @@
ctpInfo->infoOfStaticOrSpecialMethod(index, ACC_STATIC,
signature, meth);
-#ifdef MULTIPLE_VM
-
+#if defined(MULTIPLE_VM)
uint32 clIndex = ctpInfo->getClassIndexFromMethod(index);
- Class* mycl = (Class*)(ctpInfo->getMethodClassIfLoaded(clIndex));
- Value* arg = 0;
- if (mycl && mycl->isResolved()) {
- LLVMCommonClassInfo* LCI = module->getClassInfo(mycl);
- arg = LCI->getVar(this);
- arg = invoke(JnjvmModule::InitialisationCheckFunction, arg, "",
- currentBlock);
- } else {
- arg = getResolvedClass(clIndex, true);
- }
- CallInst::Create(JnjvmModule::ForceInitialisationCheckFunction, arg, "",
- currentBlock);
+ Value* cl = getResolvedClass(clIndex, true);
+ Value* newCtpCache = CallInst::Create(JnjvmModule::GetCtpCacheFunction, cl,
+ "", currentBlock);
+ args.push_back(newCtpCache);
#endif
if (meth && meth->canBeInlined && meth != compilingMethod &&
@@ -1610,7 +1629,7 @@
return arg1;
}
-Value* JavaJIT::getResolvedClass(uint16 index, bool clinit) {
+Value* JavaJIT::getResolvedClass(uint16 index, bool clinit, bool doThrow) {
Value* arg1 = getConstantPoolAt(index);
arg1 = new BitCastInst(arg1, JnjvmModule::JavaClassType, "", currentBlock);
@@ -1633,8 +1652,13 @@
Args.push_back(v);
ConstantInt* CI = ConstantInt::get(Type::Int32Ty, index);
Args.push_back(CI);
- Value* res = invoke(JnjvmModule::ClassLookupFunction, Args, "",
- currentBlock);
+ Value* res = 0;
+ if (doThrow) {
+ res = invoke(JnjvmModule::ClassLookupFunction, Args, "", currentBlock);
+ } else {
+ res = CallInst::Create(JnjvmModule::ClassLookupFunction, Args.begin(),
+ Args.end(), "", currentBlock);
+ }
node->addIncoming(res, currentBlock);
llvm::BranchInst::Create(trueCl, currentBlock);
@@ -1660,18 +1684,23 @@
VT = CallInst::Create(JnjvmModule::GetVTFromClassFunction, Cl, "",
currentBlock);
} else {
+#ifndef MULTIPLE_VM
LLVMClassInfo* LCI = (LLVMClassInfo*)module->getClassInfo(cl);
Size = LCI->getVirtualSize(this);
VT = LCI->getVirtualTable(this);
Cl = LCI->getVar(this);
-#ifndef MULTIPLE_VM
if (!cl->isReady()) {
-#endif
+ Cl = invoke(JnjvmModule::InitialisationCheckFunction, Cl, "", currentBlock);
+ CallInst::Create(JnjvmModule::ForceInitialisationCheckFunction, Cl, "",
+ currentBlock);
+ }
+#else
+ Cl = getResolvedClass(index, true);
+ Size = LCI->getVirtualSize(this);
+ VT = LCI->getVirtualTable(this);
Cl = invoke(JnjvmModule::InitialisationCheckFunction, Cl, "", currentBlock);
CallInst::Create(JnjvmModule::ForceInitialisationCheckFunction, Cl, "",
currentBlock);
-#ifndef MULTIPLE_VM
- }
#endif
}
std::vector<Value*> args;
@@ -1731,12 +1760,13 @@
#ifndef MULTIPLE_VM
if (field->classDef->isReady()) {
-#endif
object = LCI->getStaticVar(this);
type = LCI->getStaticType();
return fieldGetter(this, type, object, LFI->getOffset());
-#ifndef MULTIPLE_VM
}
+#else
+ // In a multi environment, we always need to get the ptr in the constant
+ // pool. Therefore, we do nothing here.
#endif
} else {
type = LCI->getVirtualType();
@@ -2002,6 +2032,15 @@
JITVerifyNull(args[0]);
+#if defined(MULTIPLE_VM)
+ Value* cl = CallInst::Create(JnjvmModule::GetClassFunction, args[0], "",
+ currentBlock);
+
+ Value* newCtpCache = CallInst::Create(JnjvmModule::GetCtpCacheFunction, cl, "",
+ currentBlock);
+ args.push_back(newCtpCache);
+#endif
+
std::vector<Value*> args1;
args1.push_back(zero);
args1.push_back(zero);
Modified: vmkit/branches/isolate/lib/JnJVM/VMCore/JavaJIT.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/VMCore/JavaJIT.h?rev=55416&r1=55415&r2=55416&view=diff
==============================================================================
--- vmkit/branches/isolate/lib/JnJVM/VMCore/JavaJIT.h (original)
+++ vmkit/branches/isolate/lib/JnJVM/VMCore/JavaJIT.h Wed Aug 27 10:43:10 2008
@@ -208,7 +208,7 @@
llvm::Value* ldResolved(uint16 index, bool stat, llvm::Value* object,
const llvm::Type* fieldType,
const llvm::Type* fieldTypePtr);
- llvm::Value* getResolvedClass(uint16 index, bool clinit);
+ llvm::Value* getResolvedClass(uint16 index, bool clinit, bool doThrow = true);
// methods invoke
void makeArgs(llvm::FunctionType::param_iterator it,
Modified: vmkit/branches/isolate/lib/JnJVM/VMCore/JavaJITOpcodes.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/VMCore/JavaJITOpcodes.cpp?rev=55416&r1=55415&r2=55416&view=diff
==============================================================================
--- vmkit/branches/isolate/lib/JnJVM/VMCore/JavaJITOpcodes.cpp (original)
+++ vmkit/branches/isolate/lib/JnJVM/VMCore/JavaJITOpcodes.cpp Wed Aug 27 10:43:10 2008
@@ -1823,34 +1823,41 @@
UserClassArray* dcl = 0;
ConstantInt* sizeElement = 0;
GlobalVariable* TheVT = 0;
- JnjvmClassLoader* JCL = compilingClass->classLoader;
+ Value* valCl = 0;
if (bytecodes[i] == NEWARRAY) {
uint8 id = bytecodes[++i];
AssessorDesc* ass = AssessorDesc::arrayType(id);
+#ifndef MULTIPLE_VM
dcl = ass->getArrayClass();
+#else
+ valCl = getJnjvmArrayCacheAt(ass->numId);
+#endif
+
TheVT = JnjvmModule::JavaObjectVirtualTableGV;
LLVMAssessorInfo& LAI = LLVMAssessorInfo::AssessorInfo[ass->numId];
sizeElement = LAI.sizeInBytesConstant;
} else {
uint16 index = readU2(bytecodes, i);
+#ifndef MULTIPLE_VM
const UTF8* className =
compilingClass->ctpInfo->resolveClassName(index);
+ JnjvmClassLoader* JCL = compilingClass->classLoader;
const UTF8* arrayName =
AssessorDesc::constructArrayName(JCL, 0, 1, className);
dcl = JCL->constructArray(arrayName);
+#else
+
+ valCl = getResolvedClass(index, true);
+#endif
TheVT = JnjvmModule::ArrayObjectVirtualTableGV;
sizeElement = mvm::jit::constantPtrSize;
}
-#ifdef MULTIPLE_VM
- llvm::Value* valCl = 0;
- fprintf(stderr, "implement me");
- abort();
-#else
+#ifndef MULTIPLE_VM
LLVMCommonClassInfo* LCI = module->getClassInfo(dcl);
- llvm::Value* valCl = LCI->getVar(this);
+ valCl = LCI->getVar(this);
#endif
llvm::Value* arg1 = popAsInt();
@@ -2066,22 +2073,20 @@
}
case MULTIANEWARRAY : {
- JnjvmClassLoader* JCL = compilingClass->classLoader;
uint16 index = readU2(bytecodes, i);
uint8 dim = readU1(bytecodes, i);
+
+#ifdef MULTIPLE_VM
+ Value* valCl = getResolvedClass(index, true);
+#else
+ JnjvmClassLoader* JCL = compilingClass->classLoader;
const UTF8* className =
compilingClass->ctpInfo->resolveClassName(index);
UserClassArray* dcl = JCL->constructArray(className);
compilingClass->ctpInfo->loadClass(index);
-
-#ifdef MULTIPLE_VM
- llvm::Value* valCl = 0;
- fprintf(stderr, "implement me %s", dcl->printString());
- abort();
-#else
LLVMCommonClassInfo* LCI = module->getClassInfo(dcl);
Value* valCl = LCI->getVar(this);
#endif
Modified: vmkit/branches/isolate/lib/JnJVM/VMCore/JavaMetaJIT.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/VMCore/JavaMetaJIT.cpp?rev=55416&r1=55415&r2=55416&view=diff
==============================================================================
--- vmkit/branches/isolate/lib/JnJVM/VMCore/JavaMetaJIT.cpp (original)
+++ vmkit/branches/isolate/lib/JnJVM/VMCore/JavaMetaJIT.cpp Wed Aug 27 10:43:10 2008
@@ -40,10 +40,10 @@
va_list ap;
va_start(ap, access);
if (stat) {
- method->invokeIntStaticAP(vm, ap);
+ method->invokeIntStaticAP(vm, (UserClass*)cl, ap);
} else {
JavaObject* obj = va_arg(ap, JavaObject*);
- method->invokeIntSpecialAP(vm, obj, ap);
+ method->invokeIntSpecialAP(vm, (UserClass*)cl, obj, ap);
}
va_end(ap);
}
@@ -91,10 +91,10 @@
#if 1//defined(__PPC__) && !defined(__MACH__)
#define INVOKE(TYPE, TYPE_NAME, FUNC_TYPE_VIRTUAL_AP, FUNC_TYPE_STATIC_AP, FUNC_TYPE_VIRTUAL_BUF, FUNC_TYPE_STATIC_BUF) \
\
-TYPE JavaMethod::invoke##TYPE_NAME##VirtualAP(Jnjvm* vm, JavaObject* obj, va_list ap) { \
- if (!classDef->isReady()) { \
- classDef->classLoader->loadName(classDef->name, true, true); \
- classDef->initialiseClass(vm); \
+TYPE JavaMethod::invoke##TYPE_NAME##VirtualAP(Jnjvm* vm, UserClass* cl, JavaObject* obj, va_list ap) { \
+ if (!cl->isReady()) { \
+ cl->classLoader->loadName(cl->getName(), true, true); \
+ cl->initialiseClass(vm); \
} \
verifyNull(obj); \
Signdef* sign = getSignature(); \
@@ -102,13 +102,13 @@
void* _buf = (void*)buf; \
readArgs(buf, sign, ap); \
void* func = (((void***)obj)[0])[offset];\
- return ((FUNC_TYPE_VIRTUAL_BUF)sign->getVirtualCallBuf())(vm, func, obj, _buf);\
+ return ((FUNC_TYPE_VIRTUAL_BUF)sign->getVirtualCallBuf())(vm, cl->getCtpCache(), func, obj, _buf);\
}\
\
-TYPE JavaMethod::invoke##TYPE_NAME##SpecialAP(Jnjvm* vm, JavaObject* obj, va_list ap) {\
- if (!classDef->isReady()) { \
- classDef->classLoader->loadName(classDef->name, true, true); \
- classDef->initialiseClass(vm); \
+TYPE JavaMethod::invoke##TYPE_NAME##SpecialAP(Jnjvm* vm, UserClass* cl, JavaObject* obj, va_list ap) {\
+ if (!cl->isReady()) { \
+ cl->classLoader->loadName(cl->name, true, true); \
+ cl->initialiseClass(vm); \
} \
\
verifyNull(obj);\
@@ -117,13 +117,13 @@
void* _buf = (void*)buf; \
readArgs(buf, sign, ap); \
void* func = this->compiledPtr();\
- return ((FUNC_TYPE_VIRTUAL_BUF)sign->getVirtualCallBuf())(vm, func, obj, _buf);\
+ return ((FUNC_TYPE_VIRTUAL_BUF)sign->getVirtualCallBuf())(vm, cl->getCtpCache(), func, obj, _buf);\
}\
\
-TYPE JavaMethod::invoke##TYPE_NAME##StaticAP(Jnjvm* vm, va_list ap) {\
- if (!classDef->isReady()) { \
- classDef->classLoader->loadName(classDef->name, true, true); \
- classDef->initialiseClass(vm); \
+TYPE JavaMethod::invoke##TYPE_NAME##StaticAP(Jnjvm* vm, UserClass* cl, va_list ap) {\
+ if (!cl->isReady()) { \
+ cl->classLoader->loadName(cl->getName(), true, true); \
+ cl->initialiseClass(vm); \
} \
\
Signdef* sign = getSignature(); \
@@ -131,13 +131,13 @@
void* _buf = (void*)buf; \
readArgs(buf, sign, ap); \
void* func = this->compiledPtr();\
- return ((FUNC_TYPE_STATIC_BUF)sign->getStaticCallBuf())(vm, func, _buf);\
+ return ((FUNC_TYPE_STATIC_BUF)sign->getStaticCallBuf())(vm, cl->getCtpCache(), func, _buf);\
}\
\
-TYPE JavaMethod::invoke##TYPE_NAME##VirtualBuf(Jnjvm* vm, JavaObject* obj, void* buf) {\
- if (!classDef->isReady()) { \
- classDef->classLoader->loadName(classDef->name, true, true); \
- classDef->initialiseClass(vm); \
+TYPE JavaMethod::invoke##TYPE_NAME##VirtualBuf(Jnjvm* vm, UserClass* cl, JavaObject* obj, void* buf) {\
+ if (!cl->isReady()) { \
+ cl->classLoader->loadName(cl->getName(), true, true); \
+ cl->initialiseClass(vm); \
} \
\
verifyNull(obj);\
@@ -145,52 +145,52 @@
\
Signdef* sign = getSignature(); \
void* func = meth->compiledPtr();\
- return ((FUNC_TYPE_VIRTUAL_BUF)sign->getVirtualCallBuf())(vm, func, obj, buf);\
+ return ((FUNC_TYPE_VIRTUAL_BUF)sign->getVirtualCallBuf())(vm, cl->getCtpCache(), func, obj, buf);\
}\
\
-TYPE JavaMethod::invoke##TYPE_NAME##SpecialBuf(Jnjvm* vm, JavaObject* obj, void* buf) {\
- if (!classDef->isReady()) { \
- classDef->classLoader->loadName(classDef->name, true, true); \
- classDef->initialiseClass(vm); \
+TYPE JavaMethod::invoke##TYPE_NAME##SpecialBuf(Jnjvm* vm, UserClass* cl, JavaObject* obj, void* buf) {\
+ if (!cl->isReady()) { \
+ cl->classLoader->loadName(cl->getName(), true, true); \
+ cl->initialiseClass(vm); \
} \
\
verifyNull(obj);\
void* func = this->compiledPtr();\
Signdef* sign = getSignature(); \
- return ((FUNC_TYPE_VIRTUAL_BUF)sign->getVirtualCallBuf())(vm, func, obj, buf);\
+ return ((FUNC_TYPE_VIRTUAL_BUF)sign->getVirtualCallBuf())(vm, cl->getCtpCache(), func, obj, buf);\
}\
\
-TYPE JavaMethod::invoke##TYPE_NAME##StaticBuf(Jnjvm* vm, void* buf) {\
- if (!classDef->isReady()) { \
- classDef->classLoader->loadName(classDef->name, true, true); \
- classDef->initialiseClass(vm); \
+TYPE JavaMethod::invoke##TYPE_NAME##StaticBuf(Jnjvm* vm, UserClass* cl, void* buf) {\
+ if (!cl->isReady()) { \
+ cl->classLoader->loadName(cl->getName(), true, true); \
+ cl->initialiseClass(vm); \
} \
\
void* func = this->compiledPtr();\
Signdef* sign = getSignature(); \
- return ((FUNC_TYPE_STATIC_BUF)sign->getStaticCallBuf())(vm, func, buf);\
+ return ((FUNC_TYPE_STATIC_BUF)sign->getStaticCallBuf())(vm, cl->getCtpCache(), func, buf);\
}\
\
-TYPE JavaMethod::invoke##TYPE_NAME##Virtual(Jnjvm* vm, JavaObject* obj, ...) { \
+TYPE JavaMethod::invoke##TYPE_NAME##Virtual(Jnjvm* vm, UserClass* cl, JavaObject* obj, ...) { \
va_list ap;\
va_start(ap, obj);\
- TYPE res = invoke##TYPE_NAME##VirtualAP(vm, obj, ap);\
+ TYPE res = invoke##TYPE_NAME##VirtualAP(vm, cl, obj, ap);\
va_end(ap); \
return res; \
}\
\
-TYPE JavaMethod::invoke##TYPE_NAME##Special(Jnjvm* vm, JavaObject* obj, ...) {\
+TYPE JavaMethod::invoke##TYPE_NAME##Special(Jnjvm* vm, UserClass* cl, JavaObject* obj, ...) {\
va_list ap;\
va_start(ap, obj);\
- TYPE res = invoke##TYPE_NAME##SpecialAP(vm, obj, ap);\
+ TYPE res = invoke##TYPE_NAME##SpecialAP(vm, cl, obj, ap);\
va_end(ap); \
return res; \
}\
\
-TYPE JavaMethod::invoke##TYPE_NAME##Static(Jnjvm* vm, ...) {\
+TYPE JavaMethod::invoke##TYPE_NAME##Static(Jnjvm* vm, UserClass* cl, ...) {\
va_list ap;\
- va_start(ap, vm);\
- TYPE res = invoke##TYPE_NAME##StaticAP(vm, ap);\
+ va_start(ap, cl);\
+ TYPE res = invoke##TYPE_NAME##StaticAP(vm, cl, ap);\
va_end(ap); \
return res; \
}\
@@ -199,125 +199,125 @@
#define INVOKE(TYPE, TYPE_NAME, FUNC_TYPE_VIRTUAL_AP, FUNC_TYPE_STATIC_AP, FUNC_TYPE_VIRTUAL_BUF, FUNC_TYPE_STATIC_BUF) \
\
-TYPE JavaMethod::invoke##TYPE_NAME##VirtualAP(Jnjvm* vm, JavaObject* obj, va_list ap) { \
- if (!classDef->isReady()) { \
- classDef->classLoader->loadName(classDef->name, true, true); \
- classDef->initialiseClass(vm); \
+TYPE JavaMethod::invoke##TYPE_NAME##VirtualAP(Jnjvm* vm, UserClass* cl, JavaObject* obj, va_list ap) { \
+ if (!cl->isReady()) { \
+ cl->classLoader->loadName(cl->getName(), true, true); \
+ cl->initialiseClass(vm); \
} \
\
verifyNull(obj); \
void* func = (((void***)obj)[0])[offset];\
Signdef* sign = getSignature(); \
- return ((FUNC_TYPE_VIRTUAL_AP)sign->getVirtualCallAP())(vm, func, obj, ap);\
+ return ((FUNC_TYPE_VIRTUAL_AP)sign->getVirtualCallAP())(vm, cl->getCtpCache(), func, obj, ap);\
}\
\
-TYPE JavaMethod::invoke##TYPE_NAME##SpecialAP(Jnjvm* vm, JavaObject* obj, va_list ap) {\
- if (!classDef->isReady()) { \
- classDef->classLoader->loadName(classDef->name, true, true); \
- classDef->initialiseClass(vm); \
+TYPE JavaMethod::invoke##TYPE_NAME##SpecialAP(Jnjvm* vm, UserClass* cl, JavaObject* obj, va_list ap) {\
+ if (!cl->isReady()) { \
+ cl->classLoader->loadName(cl->getName(), true, true); \
+ cl->initialiseClass(vm); \
} \
\
verifyNull(obj);\
void* func = this->compiledPtr();\
Signdef* sign = getSignature(); \
- return ((FUNC_TYPE_VIRTUAL_AP)sign->getVirtualCallAP())(vm, func, obj, ap);\
+ return ((FUNC_TYPE_VIRTUAL_AP)sign->getVirtualCallAP())(vm, cl->getCtpCache(), func, obj, ap);\
}\
\
-TYPE JavaMethod::invoke##TYPE_NAME##StaticAP(Jnjvm* vm, va_list ap) {\
- if (!classDef->isReady()) { \
- classDef->classLoader->loadName(classDef->name, true, true); \
- classDef->initialiseClass(vm); \
+TYPE JavaMethod::invoke##TYPE_NAME##StaticAP(Jnjvm* vm, UserClass* cl, va_list ap) {\
+ if (!cl->isReady()) { \
+ cl->classLoader->loadName(cl->getName(), true, true); \
+ cl->initialiseClass(vm); \
} \
\
void* func = this->compiledPtr();\
Signdef* sign = getSignature(); \
- return ((FUNC_TYPE_STATIC_AP)sign->getStaticCallAP())(vm, func, ap);\
+ return ((FUNC_TYPE_STATIC_AP)sign->getStaticCallAP())(vm, cl->getCtpCache(), func, ap);\
}\
\
-TYPE JavaMethod::invoke##TYPE_NAME##VirtualBuf(Jnjvm* vm, JavaObject* obj, void* buf) {\
- if (!classDef->isReady()) { \
- classDef->classLoader->loadName(classDef->name, true, true); \
- classDef->initialiseClass(vm); \
+TYPE JavaMethod::invoke##TYPE_NAME##VirtualBuf(Jnjvm* vm, UserClass* cl, JavaObject* obj, void* buf) {\
+ if (!cl->isReady()) { \
+ cl->classLoader->loadName(cl->getName(), true, true); \
+ cl->initialiseClass(vm); \
} \
\
verifyNull(obj);\
void* func = (((void***)obj)[0])[offset];\
Signdef* sign = getSignature(); \
- return ((FUNC_TYPE_VIRTUAL_BUF)sign->getVirtualCallBuf())(vm, func, obj, buf);\
+ return ((FUNC_TYPE_VIRTUAL_BUF)sign->getVirtualCallBuf())(vm, cl->getCtpCache(), func, obj, buf);\
}\
\
-TYPE JavaMethod::invoke##TYPE_NAME##SpecialBuf(Jnjvm* vm, JavaObject* obj, void* buf) {\
- if (!classDef->isReady()) { \
- classDef->classLoader->loadName(classDef->name, true, true); \
- classDef->initialiseClass(vm); \
+TYPE JavaMethod::invoke##TYPE_NAME##SpecialBuf(Jnjvm* vm, UserClass* cl, JavaObject* obj, void* buf) {\
+ if (!cl->isReady()) { \
+ cl->classLoader->loadName(cl->getName(), true, true); \
+ cl->initialiseClass(vm); \
} \
\
verifyNull(obj);\
void* func = this->compiledPtr();\
Signdef* sign = getSignature(); \
- return ((FUNC_TYPE_VIRTUAL_BUF)sign->getVirtualCallBuf())(vm, func, obj, buf);\
+ return ((FUNC_TYPE_VIRTUAL_BUF)sign->getVirtualCallBuf())(vm, cl->getCtpCache(), func, obj, buf);\
}\
\
-TYPE JavaMethod::invoke##TYPE_NAME##StaticBuf(Jnjvm* vm, void* buf) {\
- if (!classDef->isReady()) { \
- classDef->classLoader->loadName(classDef->name, true, true); \
- classDef->initialiseClass(vm); \
+TYPE JavaMethod::invoke##TYPE_NAME##StaticBuf(Jnjvm* vm, UserClass* cl, void* buf) {\
+ if (!cl->isReady()) { \
+ cl->classLoader->loadName(cl->getName(), true, true); \
+ cl->initialiseClass(vm); \
} \
\
void* func = this->compiledPtr();\
Signdef* sign = getSignature(); \
- return ((FUNC_TYPE_STATIC_BUF)sign->getStaticCallBuf())(vm, func, buf);\
+ return ((FUNC_TYPE_STATIC_BUF)sign->getStaticCallBuf())(vm, cl->getCtpCache(), func, buf);\
}\
\
-TYPE JavaMethod::invoke##TYPE_NAME##Virtual(Jnjvm* vm,JavaObject* obj, ...) { \
+TYPE JavaMethod::invoke##TYPE_NAME##Virtual(Jnjvm* vm, UserClass* cl, JavaObject* obj, ...) { \
va_list ap;\
va_start(ap, obj);\
- TYPE res = invoke##TYPE_NAME##VirtualAP(vm, obj, ap);\
+ TYPE res = invoke##TYPE_NAME##VirtualAP(vm, cl, obj, ap);\
va_end(ap); \
return res; \
}\
\
-TYPE JavaMethod::invoke##TYPE_NAME##Special(Jnjvm* vm, JavaObject* obj, ...) {\
+TYPE JavaMethod::invoke##TYPE_NAME##Special(Jnjvm* vm, UserClass* cl, JavaObject* obj, ...) {\
va_list ap;\
va_start(ap, obj);\
- TYPE res = invoke##TYPE_NAME##SpecialAP(vm, obj, ap);\
+ TYPE res = invoke##TYPE_NAME##SpecialAP(vm, cl, obj, ap);\
va_end(ap); \
return res; \
}\
\
-TYPE JavaMethod::invoke##TYPE_NAME##Static(Jnjvm* vm, ...) {\
+TYPE JavaMethod::invoke##TYPE_NAME##Static(Jnjvm* vm, UserClass* cl, ...) {\
va_list ap;\
- va_start(ap, this);\
- TYPE res = invoke##TYPE_NAME##StaticAP(vm, ap);\
+ va_start(ap, cl);\
+ TYPE res = invoke##TYPE_NAME##StaticAP(vm, cl, ap);\
va_end(ap); \
return res; \
}\
#endif
-typedef uint32 (*uint32_virtual_ap)(Jnjvm*, void*, JavaObject*, va_list);
-typedef sint64 (*sint64_virtual_ap)(Jnjvm*, void*, JavaObject*, va_list);
-typedef float (*float_virtual_ap)(Jnjvm*, void*, JavaObject*, va_list);
-typedef double (*double_virtual_ap)(Jnjvm*, void*, JavaObject*, va_list);
-typedef JavaObject* (*object_virtual_ap)(Jnjvm*, void*, JavaObject*, va_list);
-
-typedef uint32 (*uint32_static_ap)(Jnjvm*, void*, va_list);
-typedef sint64 (*sint64_static_ap)(Jnjvm*, void*, va_list);
-typedef float (*float_static_ap)(Jnjvm*, void*, va_list);
-typedef double (*double_static_ap)(Jnjvm*, void*, va_list);
-typedef JavaObject* (*object_static_ap)(Jnjvm*, void*, va_list);
-
-typedef uint32 (*uint32_virtual_buf)(Jnjvm*, void*, JavaObject*, void*);
-typedef sint64 (*sint64_virtual_buf)(Jnjvm*, void*, JavaObject*, void*);
-typedef float (*float_virtual_buf)(Jnjvm*, void*, JavaObject*, void*);
-typedef double (*double_virtual_buf)(Jnjvm*, void*, JavaObject*, void*);
-typedef JavaObject* (*object_virtual_buf)(Jnjvm*, void*, JavaObject*, void*);
-
-typedef uint32 (*uint32_static_buf)(Jnjvm*, void*, void*);
-typedef sint64 (*sint64_static_buf)(Jnjvm*, void*, void*);
-typedef float (*float_static_buf)(Jnjvm*, void*, void*);
-typedef double (*double_static_buf)(Jnjvm*, void*, void*);
-typedef JavaObject* (*object_static_buf)(Jnjvm*, void*, void*);
+typedef uint32 (*uint32_virtual_ap)(Jnjvm*, UserConstantPool*, void*, JavaObject*, va_list);
+typedef sint64 (*sint64_virtual_ap)(Jnjvm*, UserConstantPool*, void*, JavaObject*, va_list);
+typedef float (*float_virtual_ap)(Jnjvm*, UserConstantPool*, void*, JavaObject*, va_list);
+typedef double (*double_virtual_ap)(Jnjvm*, UserConstantPool*, void*, JavaObject*, va_list);
+typedef JavaObject* (*object_virtual_ap)(Jnjvm*, UserConstantPool*, void*, JavaObject*, va_list);
+
+typedef uint32 (*uint32_static_ap)(Jnjvm*, UserConstantPool*, void*, va_list);
+typedef sint64 (*sint64_static_ap)(Jnjvm*, UserConstantPool*, void*, va_list);
+typedef float (*float_static_ap)(Jnjvm*, UserConstantPool*, void*, va_list);
+typedef double (*double_static_ap)(Jnjvm*, UserConstantPool*, void*, va_list);
+typedef JavaObject* (*object_static_ap)(Jnjvm*, UserConstantPool*, void*, va_list);
+
+typedef uint32 (*uint32_virtual_buf)(Jnjvm*, UserConstantPool*, void*, JavaObject*, void*);
+typedef sint64 (*sint64_virtual_buf)(Jnjvm*, UserConstantPool*, void*, JavaObject*, void*);
+typedef float (*float_virtual_buf)(Jnjvm*, UserConstantPool*, void*, JavaObject*, void*);
+typedef double (*double_virtual_buf)(Jnjvm*, UserConstantPool*, void*, JavaObject*, void*);
+typedef JavaObject* (*object_virtual_buf)(Jnjvm*, UserConstantPool*, void*, JavaObject*, void*);
+
+typedef uint32 (*uint32_static_buf)(Jnjvm*, UserConstantPool*, void*, void*);
+typedef sint64 (*sint64_static_buf)(Jnjvm*, UserConstantPool*, void*, void*);
+typedef float (*float_static_buf)(Jnjvm*, UserConstantPool*, void*, void*);
+typedef double (*double_static_buf)(Jnjvm*, UserConstantPool*, void*, void*);
+typedef JavaObject* (*object_static_buf)(Jnjvm*, UserConstantPool*, void*, void*);
INVOKE(uint32, Int, uint32_virtual_ap, uint32_static_ap, uint32_virtual_buf, uint32_static_buf)
INVOKE(sint64, Long, sint64_virtual_ap, sint64_static_ap, sint64_virtual_buf, sint64_static_buf)
Modified: vmkit/branches/isolate/lib/JnJVM/VMCore/JavaUpcalls.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/VMCore/JavaUpcalls.cpp?rev=55416&r1=55415&r2=55416&view=diff
==============================================================================
--- vmkit/branches/isolate/lib/JnJVM/VMCore/JavaUpcalls.cpp (original)
+++ vmkit/branches/isolate/lib/JnJVM/VMCore/JavaUpcalls.cpp Wed Aug 27 10:43:10 2008
@@ -53,6 +53,7 @@
JavaField* Classpath::rootGroup;
JavaField* Classpath::vmThread;
JavaMethod* Classpath::uncaughtException;
+Class* Classpath::inheritableThreadLocal;
JavaMethod* Classpath::setContextClassLoader;
JavaMethod* Classpath::getSystemClassLoader;
@@ -87,6 +88,8 @@
JavaField* Classpath::bufferAddress;
JavaField* Classpath::dataPointer32;
JavaField* Classpath::vmdataClassLoader;
+Class* Classpath::newClassLoader;
+
JavaField* Classpath::boolValue;
JavaField* Classpath::byteValue;
@@ -214,7 +217,7 @@
JavaObject* Stat = threadGroup->getStaticInstance();
JavaObject* RG = rootGroup->getObjectField(Stat);
group->setObjectField(th, RG);
- groupAddThread->invokeIntSpecial(vm, RG, th);
+ groupAddThread->invokeIntSpecial(vm, threadGroup, RG, th);
}
void Classpath::mapInitialThread(Jnjvm* vm) {
@@ -227,10 +230,13 @@
myth->javaThread = th;
JavaObject* vmth = vmThread->getObjectField(th);
vmdataVMThread->setObjectField(vmth, (JavaObject*)myth);
- finaliseCreateInitialThread->invokeIntStatic(vm, th);
+ finaliseCreateInitialThread->invokeIntStatic(vm, inheritableThreadLocal, th);
}
void Classpath::initialiseClasspath(JnjvmClassLoader* loader) {
+ newClassLoader =
+ UPCALL_CLASS(loader, "java/lang/ClassLoader");
+
getSystemClassLoader =
UPCALL_METHOD(loader, "java/lang/ClassLoader", "getSystemClassLoader",
"()Ljava/lang/ClassLoader;", ACC_STATIC);
@@ -499,6 +505,9 @@
UPCALL_FIELD(loader, "java/lang/VMThread", "vmdata", "Ljava/lang/Object;",
ACC_VIRTUAL);
+ inheritableThreadLocal =
+ UPCALL_CLASS(loader, "java/lang/InheritableThreadLocal");
+
finaliseCreateInitialThread =
UPCALL_METHOD(loader, "java/lang/InheritableThreadLocal", "newChildThread",
"(Ljava/lang/Thread;)V", ACC_STATIC);
Modified: vmkit/branches/isolate/lib/JnJVM/VMCore/JavaUpcalls.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/VMCore/JavaUpcalls.h?rev=55416&r1=55415&r2=55416&view=diff
==============================================================================
--- vmkit/branches/isolate/lib/JnJVM/VMCore/JavaUpcalls.h (original)
+++ vmkit/branches/isolate/lib/JnJVM/VMCore/JavaUpcalls.h Wed Aug 27 10:43:10 2008
@@ -54,6 +54,7 @@
class Classpath {
public:
+ ISOLATE_STATIC Class* newClassLoader;
ISOLATE_STATIC JavaMethod* getSystemClassLoader;
ISOLATE_STATIC JavaMethod* setContextClassLoader;
ISOLATE_STATIC UserClass* newString;
@@ -131,7 +132,9 @@
ISOLATE_STATIC JavaField* rootGroup;
ISOLATE_STATIC JavaField* vmThread;
ISOLATE_STATIC JavaMethod* uncaughtException;
+ ISOLATE_STATIC Class* inheritableThreadLocal;
+
ISOLATE_STATIC UserClass* InvocationTargetException;
ISOLATE_STATIC UserClass* ArrayStoreException;
ISOLATE_STATIC UserClass* ClassCastException;
Modified: vmkit/branches/isolate/lib/JnJVM/VMCore/Jni.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/VMCore/Jni.cpp?rev=55416&r1=55415&r2=55416&view=diff
==============================================================================
--- vmkit/branches/isolate/lib/JnJVM/VMCore/Jni.cpp (original)
+++ vmkit/branches/isolate/lib/JnJVM/VMCore/Jni.cpp Wed Aug 27 10:43:10 2008
@@ -143,7 +143,7 @@
JavaMethod* init =
cl->lookupMethod(Jnjvm::initName,
cl->classLoader->asciizConstructUTF8("(Ljava/lang/String;)V"), 0, 1);
- init->invokeIntSpecial(vm, res, vm->asciizToStr(msg));
+ init->invokeIntSpecial(vm, (UserClass*)cl, res, vm->asciizToStr(msg));
th->pendingException = res;
th->returnFromNative();
return 1;
@@ -229,7 +229,7 @@
UserClass* cl = (UserClass*)NativeUtil::resolvedImplClass(clazz, true);
Jnjvm* vm = JavaThread::get()->isolate;
JavaObject* res = cl->doNew(vm);
- meth->invokeIntSpecialAP(vm, res, ap);
+ meth->invokeIntSpecialAP(vm, cl, res, ap);
va_end(ap);
return (jobject)res;
@@ -320,7 +320,13 @@
JavaObject* self = (JavaObject*)obj;
JavaMethod* meth = (JavaMethod*)methodID;
Jnjvm* vm = JavaThread::get()->isolate;
- JavaObject* res = meth->invokeJavaObjectVirtualAP(vm, self, ap);
+ UserClass* cl = 0;
+#ifdef MULTIPLE_VM
+ cl = self->classOf->lookupClassFromMethod(meth);
+#else
+ cl = meth->classDef;
+#endif
+ JavaObject* res = meth->invokeJavaObjectVirtualAP(vm, cl, self, ap);
va_end(ap);
return (jobject)res;
@@ -352,7 +358,13 @@
JavaObject* self = (JavaObject*)_obj;
JavaMethod* meth = (JavaMethod*)methodID;
Jnjvm* vm = JavaThread::get()->isolate;
- uint32 res = meth->invokeIntVirtualAP(vm, self, ap);
+ UserClass* cl = 0;
+#ifdef MULTIPLE_VM
+ cl = self->classOf->lookupClassFromMethod(meth);
+#else
+ cl = meth->classDef;
+#endif
+ uint32 res = meth->invokeIntVirtualAP(vm, cl, self, ap);
va_end(ap);
return res;
@@ -444,7 +456,13 @@
JavaObject* obj = (JavaObject*)_obj;
JavaMethod* meth = (JavaMethod*)methodID;
Jnjvm* vm = JavaThread::get()->isolate;
- uint32 res = meth->invokeIntVirtualAP(vm, obj, ap);
+ UserClass* cl = 0;
+#ifdef MULTIPLE_VM
+ cl = obj->classOf->lookupClassFromMethod(meth);
+#else
+ cl = meth->classDef;
+#endif
+ uint32 res = meth->invokeIntVirtualAP(vm, cl, obj, ap);
va_end(ap);
return res;
@@ -498,7 +516,13 @@
JavaObject* obj = (JavaObject*)_obj;
JavaMethod* meth = (JavaMethod*)methodID;
Jnjvm* vm = JavaThread::get()->isolate;
- jfloat res = meth->invokeFloatVirtualAP(vm, obj, ap);
+ UserClass* cl = 0;
+#ifdef MULTIPLE_VM
+ cl = obj->classOf->lookupClassFromMethod(meth);
+#else
+ cl = meth->classDef;
+#endif
+ jfloat res = meth->invokeFloatVirtualAP(vm, cl, obj, ap);
va_end(ap);
return res;
@@ -531,7 +555,13 @@
JavaObject* obj = (JavaObject*)_obj;
JavaMethod* meth = (JavaMethod*)methodID;
Jnjvm* vm = JavaThread::get()->isolate;
- jdouble res = meth->invokeDoubleVirtualAP(vm, obj, ap);
+ UserClass* cl = 0;
+#ifdef MULTIPLE_VM
+ cl = obj->classOf->lookupClassFromMethod(meth);
+#else
+ cl = meth->classDef;
+#endif
+ jdouble res = meth->invokeDoubleVirtualAP(vm, cl, obj, ap);
va_end(ap);
return res;
@@ -548,7 +578,13 @@
JavaObject* obj = (JavaObject*)_obj;
JavaMethod* meth = (JavaMethod*)methodID;
Jnjvm* vm = JavaThread::get()->isolate;
- return meth->invokeDoubleVirtualAP(vm, obj, args);
+ UserClass* cl = 0;
+#ifdef MULTIPLE_VM
+ cl = obj->classOf->lookupClassFromMethod(meth);
+#else
+ cl = meth->classDef;
+#endif
+ return meth->invokeDoubleVirtualAP(vm, cl, obj, args);
END_EXCEPTION
return 0.0;
@@ -573,7 +609,13 @@
JavaObject* obj = (JavaObject*)_obj;
JavaMethod* meth = (JavaMethod*)methodID;
Jnjvm* vm = JavaThread::get()->isolate;
- meth->invokeIntVirtualAP(vm, obj, ap);
+ UserClass* cl = 0;
+#ifdef MULTIPLE_VM
+ cl = obj->classOf->lookupClassFromMethod(meth);
+#else
+ cl = meth->classDef;
+#endif
+ meth->invokeIntVirtualAP(vm, cl, obj, ap);
va_end(ap);
END_EXCEPTION
@@ -588,7 +630,13 @@
JavaObject* obj = (JavaObject*)_obj;
JavaMethod* meth = (JavaMethod*)methodID;
Jnjvm* vm = JavaThread::get()->isolate;
- meth->invokeIntVirtualAP(vm, obj, args);
+ UserClass* cl = 0;
+#ifdef MULTIPLE_VM
+ cl = obj->classOf->lookupClassFromMethod(meth);
+#else
+ cl = meth->classDef;
+#endif
+ meth->invokeIntVirtualAP(vm, cl, obj, args);
END_EXCEPTION
}
@@ -808,7 +856,13 @@
JavaObject* obj = (JavaObject*)_obj;
JavaMethod* meth = (JavaMethod*)methodID;
Jnjvm* vm = JavaThread::get()->isolate;
- meth->invokeIntSpecialAP(vm, obj, ap);
+ UserClass* cl = 0;
+#ifdef MULTIPLE_VM
+ cl = obj->classOf->lookupClassFromMethod(meth);
+#else
+ cl = meth->classDef;
+#endif
+ meth->invokeIntSpecialAP(vm, cl, obj, ap);
va_end(ap);
END_EXCEPTION
@@ -1120,7 +1174,13 @@
va_start(ap, methodID);
JavaMethod* meth = (JavaMethod*)methodID;
Jnjvm* vm = JavaThread::get()->isolate;
- uint32 res = meth->invokeIntStaticAP(vm, ap);
+ UserClass* cl = 0;
+#ifdef MULTIPLE_VM
+ cl = NativeUtil::resolvedImplClass(clazz, true);
+#else
+ cl = meth->classDef;
+#endif
+ uint32 res = meth->invokeIntStaticAP(vm, cl, ap);
va_end(ap);
return res;
@@ -1295,7 +1355,13 @@
va_start(ap, methodID);
JavaMethod* meth = (JavaMethod*)methodID;
Jnjvm* vm = JavaThread::get()->isolate;
- meth->invokeIntStaticAP(vm, ap);
+ UserClass* cl = 0;
+#ifdef MULTIPLE_VM
+ cl = NativeUtil::resolvedImplClass(clazz, true);
+#else
+ cl = meth->classDef;
+#endif
+ meth->invokeIntStaticAP(vm, cl, ap);
va_end(ap);
END_EXCEPTION
@@ -1309,7 +1375,13 @@
JavaMethod* meth = (JavaMethod*)methodID;
Jnjvm* vm = JavaThread::get()->isolate;
- meth->invokeIntStaticAP(vm, args);
+ UserClass* cl = 0;
+#ifdef MULTIPLE_VM
+ cl = NativeUtil::resolvedImplClass(clazz, true);
+#else
+ cl = meth->classDef;
+#endif
+ meth->invokeIntStaticAP(vm, cl, args);
END_EXCEPTION
}
Modified: vmkit/branches/isolate/lib/JnJVM/VMCore/Jnjvm.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/VMCore/Jnjvm.cpp?rev=55416&r1=55415&r2=55416&view=diff
==============================================================================
--- vmkit/branches/isolate/lib/JnJVM/VMCore/Jnjvm.cpp (original)
+++ vmkit/branches/isolate/lib/JnJVM/VMCore/Jnjvm.cpp Wed Aug 27 10:43:10 2008
@@ -165,7 +165,7 @@
void Jnjvm::errorWithExcp(UserClass* cl, JavaMethod* init, const JavaObject* excp) {
JavaObject* obj = cl->doNew(this);
- init->invokeIntSpecial(this, obj, excp);
+ init->invokeIntSpecial(this, cl, obj, excp);
JavaThread::throwException(obj);
}
@@ -177,7 +177,7 @@
va_end(ap);
JavaObject* obj = cl->doNew(this);
- init->invokeIntSpecial(this, obj, asciizToStr(tmp));
+ init->invokeIntSpecial(this, cl, obj, asciizToStr(tmp));
JavaThread::throwException(obj);
}
@@ -333,13 +333,14 @@
JavaObject* CommonClass::getClassDelegatee(Jnjvm* vm, JavaObject* pd) {
acquire();
if (!(delegatee)) {
- JavaObject* delegatee = vm->upcalls->newClass->doNew(vm);
+ UserClass* cl = vm->upcalls->newClass;
+ JavaObject* delegatee = cl->doNew(vm);
if (!pd) {
- vm->upcalls->initClass->invokeIntSpecial(vm, delegatee, this);
+ vm->upcalls->initClass->invokeIntSpecial(vm, cl, delegatee, this);
} else {
- vm->upcalls->initClassWithProtectionDomain->invokeIntSpecial(vm,
- delegatee,
- this, pd);
+ vm->upcalls->initClassWithProtectionDomain->invokeIntSpecial(vm, cl,
+ delegatee,
+ this, pd);
}
this->delegatee = delegatee;
}
@@ -646,7 +647,9 @@
JnjvmClassLoader* Jnjvm::loadAppClassLoader() {
if (appClassLoader == 0) {
- JavaObject* loader = upcalls->getSystemClassLoader->invokeJavaObjectStatic(this);
+ UserClass* cl = upcalls->newClassLoader;
+ JavaObject* loader =
+ upcalls->getSystemClassLoader->invokeJavaObjectStatic(this, cl);
appClassLoader = JnjvmClassLoader::getJnjvmLoaderFromJavaObject(loader);
}
return appClassLoader;
@@ -704,8 +707,9 @@
mapInitialThread();
loadAppClassLoader();
JavaObject* obj = JavaThread::currentThread();
- upcalls->setContextClassLoader->invokeIntSpecial(this, obj,
- appClassLoader->getJavaClassLoader());
+ JavaObject* javaLoader = appClassLoader->getJavaClassLoader();
+ upcalls->setContextClassLoader->invokeIntSpecial(this, upcalls->newThread,
+ obj, javaLoader);
// load and initialise math since it is responsible for dlopen'ing
// libjavalang.so and we are optimizing some math operations
UserCommonClass* math =
@@ -727,8 +731,8 @@
JavaObject* group =
upcalls->group->getObjectField(obj);
try{
- upcalls->uncaughtException->invokeIntSpecial(this, group, obj,
- exc);
+ upcalls->uncaughtException->invokeIntSpecial(this, upcalls->threadGroup,
+ group, obj, exc);
}catch(...) {
printf("Even uncaught exception throwed an exception!\n");
assert(0);
@@ -834,5 +838,17 @@
isolate->bootstrapLoader = JnjvmClassLoader::bootstrapLoader;
isolate->upcalls = isolate->bootstrapLoader->upcalls;
+#ifdef MULTIPLE_VM
+ isolate->throwable = isolate->upcalls->newThrowable;
+ isolate->arrayClasses[1] = isolate->upcalls->ArrayOfBool;
+ isolate->arrayClasses[2] = isolate->upcalls->ArrayOfByte;
+ isolate->arrayClasses[3] = isolate->upcalls->ArrayOfChar;
+ isolate->arrayClasses[4] = isolate->upcalls->ArrayOfShort;
+ isolate->arrayClasses[5] = isolate->upcalls->ArrayOfInt;
+ isolate->arrayClasses[6] = isolate->upcalls->ArrayOfFloat;
+ isolate->arrayClasses[7] = isolate->upcalls->ArrayOfLong;
+ isolate->arrayClasses[8] = isolate->upcalls->ArrayOfDouble;
+#endif
+
return isolate;
}
Modified: vmkit/branches/isolate/lib/JnJVM/VMCore/Jnjvm.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/VMCore/Jnjvm.h?rev=55416&r1=55415&r2=55416&view=diff
==============================================================================
--- vmkit/branches/isolate/lib/JnJVM/VMCore/Jnjvm.h (original)
+++ vmkit/branches/isolate/lib/JnJVM/VMCore/Jnjvm.h Wed Aug 27 10:43:10 2008
@@ -88,6 +88,17 @@
/// Jnjvm - A JVM. Each execution of a program allocates a Jnjvm.
///
class Jnjvm : public mvm::VirtualMachine {
+public:
+#ifdef MULTIPLE_GC
+ /// GC - The garbage collector of this JVM.
+ ///
+ Collector* GC;
+#endif
+
+#ifdef MULTIPLE_VM
+ UserClass* throwable;
+ UserClassArray* arrayClasses[9];
+#endif
private:
/// bootstrapThread - The initial thread of this JVM.
@@ -200,13 +211,7 @@
static const UTF8* sinh;
static const UTF8* tanh;
static const UTF8* finalize;
-
-#ifdef MULTIPLE_GC
- /// GC - The garbage collector of this JVM.
- ///
- Collector* GC;
-#endif
-
+
/// bootstraLoader - Bootstrap loader for base classes of this virtual
/// machine.
///
Modified: vmkit/branches/isolate/lib/JnJVM/VMCore/JnjvmClassLoader.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/VMCore/JnjvmClassLoader.cpp?rev=55416&r1=55415&r2=55416&view=diff
==============================================================================
--- vmkit/branches/isolate/lib/JnJVM/VMCore/JnjvmClassLoader.cpp (original)
+++ vmkit/branches/isolate/lib/JnJVM/VMCore/JnjvmClassLoader.cpp Wed Aug 27 10:43:10 2008
@@ -134,9 +134,15 @@
const UTF8* javaName = name->internalToJava(hashUTF8, 0, name->size);
JavaString* str = isolate->UTF8ToStr(javaName);
Classpath* upcalls = bootstrapLoader->upcalls;
+ UserClass* forCtp = 0;
+#ifdef MULTIPLE_VM
+ forCtp = javaLoader->classOf->lookupClassInMethod(upcalls->loadInClassLoader);
+#else
+ forCtp = upcalls->loadInClassLoader->classDef;
+#endif
JavaObject* obj = (JavaObject*)
- upcalls->loadInClassLoader->invokeJavaObjectVirtual(isolate, javaLoader,
- str);
+ upcalls->loadInClassLoader->invokeJavaObjectVirtual(isolate, forCtp,
+ javaLoader, str);
cl = (UserCommonClass*)(upcalls->vmdataClass->getObjectField(obj));
}
Modified: vmkit/branches/isolate/lib/JnJVM/VMCore/JnjvmModule.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/isolate/lib/JnJVM/VMCore/JnjvmModule.cpp?rev=55416&r1=55415&r2=55416&view=diff
==============================================================================
--- vmkit/branches/isolate/lib/JnJVM/VMCore/JnjvmModule.cpp (original)
+++ vmkit/branches/isolate/lib/JnJVM/VMCore/JnjvmModule.cpp Wed Aug 27 10:43:10 2008
@@ -448,8 +448,8 @@
return staticType;
}
-Value* LLVMClassInfo::getStaticVar(JavaJIT* jit) {
#ifndef MULTIPLE_VM
+Value* LLVMClassInfo::getStaticVar(JavaJIT* jit) {
if (!staticVarGV) {
getStaticType();
JavaObject* obj = ((Class*)classDef)->getStaticInstance();
@@ -464,12 +464,8 @@
}
return new LoadInst(staticVarGV, "", jit->currentBlock);
-
-#else
- fprintf(stderr, "implement me\n");
- abort();
-#endif
}
+#endif
Value* LLVMClassInfo::getVirtualTable(JavaJIT* jit) {
if (!virtualTableGV) {
@@ -570,8 +566,9 @@
llvmArgs.push_back(LAI.llvmType);
}
-#if defined(MULTIPLE_VM) || defined(MULTIPLE_GC)
+#if defined(MULTIPLE_VM)
llvmArgs.push_back(mvm::jit::ptrType); // domain
+ llvmArgs.push_back(mvm::jit::ptr32Type); // cached constant pool
#endif
uint8 id = signature->ret->funcs->numId;
@@ -594,8 +591,9 @@
llvmArgs.push_back(LAI.llvmType);
}
-#if defined(MULTIPLE_VM) || defined(MULTIPLE_GC)
+#if defined(MULTIPLE_VM)
llvmArgs.push_back(mvm::jit::ptrType); // domain
+ llvmArgs.push_back(mvm::jit::ptr32Type); // cached constant pool
#endif
uint8 id = signature->ret->funcs->numId;
@@ -621,8 +619,9 @@
llvmArgs.push_back(LAI.llvmType);
}
-#if defined(MULTIPLE_VM) || defined(MULTIPLE_GC)
+#if defined(MULTIPLE_VM)
llvmArgs.push_back(mvm::jit::ptrType); // domain
+ llvmArgs.push_back(mvm::jit::ptr32Type); // cached constant pool
#endif
uint8 id = signature->ret->funcs->numId;
@@ -647,10 +646,14 @@
BasicBlock* currentBlock = BasicBlock::Create("enter", res);
Function::arg_iterator i = res->arg_begin();
Value *obj, *ptr, *func;
-#if defined(MULTIPLE_VM) || defined(MULTIPLE_GC)
+#if defined(MULTIPLE_VM)
Value* vm = i;
#endif
++i;
+#if defined(MULTIPLE_VM)
+ Value* ctp = i;
+#endif
+ ++i;
func = i;
++i;
if (virt) {
@@ -676,8 +679,9 @@
}
}
-#if defined(MULTIPLE_VM) || defined(MULTIPLE_GC)
+#if defined(MULTIPLE_VM)
Args.push_back(vm);
+ Args.push_back(ctp);
#endif
Value* val = CallInst::Create(func, Args.begin(), Args.end(), "", currentBlock);
@@ -702,10 +706,14 @@
BasicBlock* currentBlock = BasicBlock::Create("enter", res);
Function::arg_iterator i = res->arg_begin();
Value *obj, *ap, *func;
-#if defined(MULTIPLE_VM) || defined(MULTIPLE_GC)
+#if defined(MULTIPLE_VM)
Value* vm = i;
#endif
++i;
+#if defined(MULTIPLE_VM)
+ Value* ctp = i;
+#endif
+ ++i;
func = i;
++i;
if (virt) {
@@ -722,8 +730,9 @@
Args.push_back(new VAArgInst(ap, LAI.llvmType, "", currentBlock));
}
-#if defined(MULTIPLE_VM) || defined(MULTIPLE_GC)
+#if defined(MULTIPLE_VM)
Args.push_back(vm);
+ Args.push_back(ctp);
#endif
Value* val = CallInst::Create(func, Args.begin(), Args.end(), "", currentBlock);
@@ -763,6 +772,7 @@
llvm::MutexGuard locked(mvm::jit::executionEngine->lock);
std::vector<const llvm::Type*> Args2;
Args2.push_back(mvm::jit::ptrType); // vm
+ Args2.push_back(mvm::jit::ptr32Type); // ctp
Args2.push_back(getVirtualPtrType());
Args2.push_back(JnjvmModule::JavaObjectType);
Args2.push_back(PointerType::getUnqual(Type::Int32Ty));
@@ -779,6 +789,7 @@
llvm::MutexGuard locked(mvm::jit::executionEngine->lock);
std::vector<const llvm::Type*> Args;
Args.push_back(mvm::jit::ptrType); // vm
+ Args.push_back(mvm::jit::ptr32Type); // ctp
Args.push_back(getStaticPtrType());
Args.push_back(PointerType::getUnqual(Type::Int32Ty));
uint8 id = signature->ret->funcs->numId;
More information about the vmkit-commits
mailing list