[vmkit-commits] [vmkit] r93122 - in /vmkit/trunk: lib/J3/Classpath/ lib/J3/Compiler/ lib/J3/VMCore/ tools/j3/
Nicolas Geoffray
nicolas.geoffray at lip6.fr
Sun Jan 10 11:52:23 PST 2010
Author: geoffray
Date: Sun Jan 10 13:52:23 2010
New Revision: 93122
URL: http://llvm.org/viewvc/llvm-project?rev=93122&view=rev
Log:
Invoke Java code from native by using the same conventions than
JNI Invoke*A functions: the arguments are in a buffer and objects
are not stored direclty but addressed.
Modified:
vmkit/trunk/lib/J3/Classpath/ClasspathConstructor.inc
vmkit/trunk/lib/J3/Classpath/ClasspathField.inc
vmkit/trunk/lib/J3/Classpath/ClasspathMethod.inc
vmkit/trunk/lib/J3/Classpath/ClasspathVMClass.inc
vmkit/trunk/lib/J3/Classpath/ClasspathVMSystemProperties.inc
vmkit/trunk/lib/J3/Classpath/ClasspathVMThrowable.inc
vmkit/trunk/lib/J3/Classpath/JavaUpcalls.cpp
vmkit/trunk/lib/J3/Compiler/JITInfo.cpp
vmkit/trunk/lib/J3/VMCore/JavaClass.h
vmkit/trunk/lib/J3/VMCore/JavaMetaJIT.cpp
vmkit/trunk/lib/J3/VMCore/JavaObject.cpp
vmkit/trunk/lib/J3/VMCore/JavaObject.h
vmkit/trunk/lib/J3/VMCore/Jni.cpp
vmkit/trunk/lib/J3/VMCore/Jnjvm.cpp
vmkit/trunk/lib/J3/VMCore/JnjvmClassLoader.cpp
vmkit/trunk/tools/j3/Makefile
Modified: vmkit/trunk/lib/J3/Classpath/ClasspathConstructor.inc
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/J3/Classpath/ClasspathConstructor.inc?rev=93122&r1=93121&r2=93122&view=diff
==============================================================================
--- vmkit/trunk/lib/J3/Classpath/ClasspathConstructor.inc (original)
+++ vmkit/trunk/lib/J3/Classpath/ClasspathConstructor.inc Sun Jan 10 13:52:23 2010
@@ -96,11 +96,7 @@
if (isAbstract(cl->access)) vm->instantiationException(cl);
// Allocate a buffer to store the arguments.
- uintptr_t buf = size ? (uintptr_t)alloca(size * sizeof(uint64)) : 0;
- // Record the beginning of the buffer.
- void* startBuf = (void*)buf;
-
- // Do it after alloca
+ jvalue* buf = size ? (jvalue*)alloca(size * sizeof(jvalue)) : 0;
if (nbArgs == size) {
UserCommonClass* _cl = UserCommonClass::resolvedImplClass(vm, Clazz, false);
@@ -113,12 +109,15 @@
Typedef* const* arguments = sign->getArgumentsType();
// Store the arguments, unboxing primitives if necessary.
for (sint32 i = 0; i < size; ++i) {
- ptr[i]->decapsulePrimitive(vm, buf, arguments[i]);
+ ptr[i]->decapsulePrimitive(vm, &buf[i], arguments[i]);
+ if (buf[i].l == reinterpret_cast<jobject>(ptr[i])) {
+ buf[i].l = reinterpret_cast<jobject>(&ptr[i]);
+ }
}
JavaThread* th = JavaThread::get();
try {
- meth->invokeIntSpecialBuf(vm, cl, res, startBuf);
+ meth->invokeIntSpecialBuf(vm, cl, res, buf);
} catch(...) {
excp = th->getJavaException();
if (excp->getClass()->isAssignableFrom(vm->upcalls->newException)) {
Modified: vmkit/trunk/lib/J3/Classpath/ClasspathField.inc
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/J3/Classpath/ClasspathField.inc?rev=93122&r1=93121&r2=93122&view=diff
==============================================================================
--- vmkit/trunk/lib/J3/Classpath/ClasspathField.inc (original)
+++ vmkit/trunk/lib/J3/Classpath/ClasspathField.inc Sun Jan 10 13:52:23 2010
@@ -534,7 +534,7 @@
Jnjvm* vm = JavaThread::get()->getJVM();
UserClass* cl = Field->getClass();
JavaField* field = Field->getInternalField();
- uint64_t buf = 0;
+ jvalue buf;
bool stat = isStatic(field->access);
void* StatPtr = 0;
@@ -546,30 +546,28 @@
verifyNull(obj);
}
- void* _buf = (void*)(&buf);
- uintptr_t __buf = (uintptr_t)&buf;
const Typedef* type = field->getSignature();
- val->decapsulePrimitive(vm, __buf, type);
+ val->decapsulePrimitive(vm, &buf, type);
if (type->isPrimitive()) {
const PrimitiveTypedef* prim = (PrimitiveTypedef*)type;
if (prim->isBool())
- field->setInt8Field(stat ? StatPtr : obj, ((uint8*)_buf)[0]);
+ field->setInt8Field(stat ? StatPtr : obj, buf.z);
else if (prim->isByte())
- field->setInt8Field(stat ? StatPtr : obj, ((sint8*)_buf)[0]);
+ field->setInt8Field(stat ? StatPtr : obj, buf.b);
else if (prim->isChar())
- field->setInt16Field(stat ? StatPtr : obj, ((uint16*)_buf)[0]);
+ field->setInt16Field(stat ? StatPtr : obj, buf.c);
else if (prim->isShort())
- field->setInt16Field(stat ? StatPtr : obj, ((sint16*)_buf)[0]);
+ field->setInt16Field(stat ? StatPtr : obj, buf.s);
else if (prim->isInt())
- field->setInt32Field(stat ? StatPtr : obj, ((sint32*)_buf)[0]);
+ field->setInt32Field(stat ? StatPtr : obj, buf.i);
else if (prim->isLong())
- field->setLongField(stat ? StatPtr : obj, ((sint64*)_buf)[0]);
+ field->setLongField(stat ? StatPtr : obj, buf.j);
else if (prim->isFloat())
- field->setFloatField(stat ? StatPtr : obj, ((float*)_buf)[0]);
+ field->setFloatField(stat ? StatPtr : obj, buf.f);
else if (prim->isDouble())
- field->setDoubleField(stat ? StatPtr : obj, ((double*)_buf)[0]);
+ field->setDoubleField(stat ? StatPtr : obj, buf.d);
} else {
field->setObjectField(stat ? StatPtr : obj, val);
}
Modified: vmkit/trunk/lib/J3/Classpath/ClasspathMethod.inc
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/J3/Classpath/ClasspathMethod.inc?rev=93122&r1=93121&r2=93122&view=diff
==============================================================================
--- vmkit/trunk/lib/J3/Classpath/ClasspathMethod.inc (original)
+++ vmkit/trunk/lib/J3/Classpath/ClasspathMethod.inc Sun Jan 10 13:52:23 2010
@@ -115,10 +115,8 @@
Signdef* sign = meth->getSignature();
sint32 size = sign->nbArguments;
- uintptr_t buf = size ? (uintptr_t)alloca(size * sizeof(uint64)) : 0;
+ jvalue* buf = size ? (jvalue*)alloca(size * sizeof(jvalue)) : 0;
-
- void* _buf = (void*)buf;
if (nbArgs == size) {
UserCommonClass* _cl = UserCommonClass::resolvedImplClass(vm, Cl, false);
UserClass* cl = (UserClass*)_cl;
@@ -144,7 +142,10 @@
JavaObject** ptr = (JavaObject**)(void*)(args->elements);
Typedef* const* arguments = sign->getArgumentsType();
for (sint32 i = 0; i < size; ++i) {
- ptr[i]->decapsulePrimitive(vm, buf, arguments[i]);
+ ptr[i]->decapsulePrimitive(vm, &buf[i], arguments[i]);
+ if (buf[i].l == reinterpret_cast<jobject>(ptr[i])) {
+ buf[i].l = reinterpret_cast<jobject>(&ptr[i]);
+ }
}
JavaThread* th = JavaThread::get();
@@ -154,12 +155,12 @@
if (isVirtual(meth->access)) { \
if (isPublic(meth->access) && !isFinal(meth->access) && \
!isFinal(meth->classDef->access)) { \
- VAR = meth->invoke##TYPE##VirtualBuf(vm, cl, obj, _buf); \
+ VAR = meth->invoke##TYPE##VirtualBuf(vm, cl, obj, buf); \
} else { \
- VAR = meth->invoke##TYPE##SpecialBuf(vm, cl, obj, _buf); \
+ VAR = meth->invoke##TYPE##SpecialBuf(vm, cl, obj, buf); \
} \
} else { \
- VAR = meth->invoke##TYPE##StaticBuf(vm, cl, _buf); \
+ VAR = meth->invoke##TYPE##StaticBuf(vm, cl, buf); \
} \
} catch(...) { \
exc = th->getJavaException(); \
Modified: vmkit/trunk/lib/J3/Classpath/ClasspathVMClass.inc
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/J3/Classpath/ClasspathVMClass.inc?rev=93122&r1=93121&r2=93122&view=diff
==============================================================================
--- vmkit/trunk/lib/J3/Classpath/ClasspathVMClass.inc (original)
+++ vmkit/trunk/lib/J3/Classpath/ClasspathVMClass.inc Sun Jan 10 13:52:23 2010
@@ -122,7 +122,7 @@
(!publicOnly || pub)) {
UserClass* Cons = vm->upcalls->newConstructor;
tmp = Cons->doNew(vm);
- vm->upcalls->initConstructor->invokeIntSpecial(vm, Cons, tmp, Cl, i);
+ vm->upcalls->initConstructor->invokeIntSpecial(vm, Cons, tmp, &Cl, i);
ret->elements[index++] = tmp;
}
}
@@ -186,7 +186,7 @@
UserClass* Meth = vm->upcalls->newMethod;
tmp = Meth->doNew(vm);
str = vm->internalUTF8ToStr(meth->name);
- upcalls->initMethod->invokeIntSpecial(vm, Meth, tmp, Cl, str, i);
+ upcalls->initMethod->invokeIntSpecial(vm, Meth, tmp, &Cl, &str, i);
ret->elements[index++] = tmp;
}
}
@@ -456,7 +456,7 @@
UserClass* Field = vm->upcalls->newField;
tmp = Field->doNew(vm);
name = vm->internalUTF8ToStr(field->name);
- vm->upcalls->initField->invokeIntSpecial(vm, Field, tmp, Cl, name, i);
+ vm->upcalls->initField->invokeIntSpecial(vm, Field, tmp, &Cl, &name, i);
ret->elements[index++] = tmp;
}
}
Modified: vmkit/trunk/lib/J3/Classpath/ClasspathVMSystemProperties.inc
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/J3/Classpath/ClasspathVMSystemProperties.inc?rev=93122&r1=93121&r2=93122&view=diff
==============================================================================
--- vmkit/trunk/lib/J3/Classpath/ClasspathVMSystemProperties.inc (original)
+++ vmkit/trunk/lib/J3/Classpath/ClasspathVMSystemProperties.inc Sun Jan 10 13:52:23 2010
@@ -26,13 +26,18 @@
static void setProperty(Jnjvm* vm, JavaObject* prop, const char* key,
const char* val) {
-
+
+ JavaString* Val = 0;
+ JavaString* Key = 0;
llvm_gcroot(prop, 0);
+ llvm_gcroot(Val, 0);
+ llvm_gcroot(Key, 0);
+
+ Val = vm->asciizToStr(val);
+ Key = vm->asciizToStr(key);
vm->upcalls->setProperty->invokeIntSpecial(vm, (UserClass*)prop->getClass(),
- prop,
- vm->asciizToStr(key),
- vm->asciizToStr(val));
+ prop, &Key, &Val);
}
static void setUnameProp(Jnjvm* vm, JavaObject* prop) {
Modified: vmkit/trunk/lib/J3/Classpath/ClasspathVMThrowable.inc
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/J3/Classpath/ClasspathVMThrowable.inc?rev=93122&r1=93121&r2=93122&view=diff
==============================================================================
--- vmkit/trunk/lib/J3/Classpath/ClasspathVMThrowable.inc (original)
+++ vmkit/trunk/lib/J3/Classpath/ClasspathVMThrowable.inc Sun Jan 10 13:52:23 2010
@@ -102,10 +102,10 @@
UserClass* newS = vm->upcalls->newStackTraceElement;
res = newS->doNew(vm);
vm->upcalls->initStackTraceElement->invokeIntSpecial(vm, newS, res,
- sourceName,
+ &sourceName,
0, // source line
- className,
- methodName, native);
+ &className,
+ &methodName, native);
return res;
}
Modified: vmkit/trunk/lib/J3/Classpath/JavaUpcalls.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/J3/Classpath/JavaUpcalls.cpp?rev=93122&r1=93121&r2=93122&view=diff
==============================================================================
--- vmkit/trunk/lib/J3/Classpath/JavaUpcalls.cpp (original)
+++ vmkit/trunk/lib/J3/Classpath/JavaUpcalls.cpp Sun Jan 10 13:52:23 2010
@@ -248,9 +248,9 @@
vmdataVMThread->setObjectField(vmth, (JavaObject*)myth);
group->setObjectField(th, Group);
- groupAddThread->invokeIntSpecial(vm, threadGroup, Group, th);
+ groupAddThread->invokeIntSpecial(vm, threadGroup, Group, &th);
- finaliseCreateInitialThread->invokeIntStatic(vm, inheritableThreadLocal, th);
+ finaliseCreateInitialThread->invokeIntStatic(vm, inheritableThreadLocal, &th);
}
void Classpath::InitializeThreading(Jnjvm* vm) {
Modified: vmkit/trunk/lib/J3/Compiler/JITInfo.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/J3/Compiler/JITInfo.cpp?rev=93122&r1=93121&r2=93122&view=diff
==============================================================================
--- vmkit/trunk/lib/J3/Compiler/JITInfo.cpp (original)
+++ vmkit/trunk/lib/J3/Compiler/JITInfo.cpp Sun Jan 10 13:52:23 2010
@@ -374,7 +374,6 @@
if (arguments[i]->isReference()) {
arg = new IntToPtrInst(arg, Intrinsics.JavaObjectType, "", currentBlock);
-#if 0
Value* cmp = new ICmpInst(*currentBlock, ICmpInst::ICMP_EQ,
Intrinsics.JavaObjectNullConstant,
arg, "");
@@ -393,7 +392,6 @@
BranchInst::Create(endBlock, currentBlock);
currentBlock = endBlock;
arg = node;
-#endif
} else if (arguments[i]->isFloat()) {
arg = new TruncInst(arg, LLVMAssessorInfo::AssessorInfo[I_INT].llvmType,
"", currentBlock);
Modified: vmkit/trunk/lib/J3/VMCore/JavaClass.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/J3/VMCore/JavaClass.h?rev=93122&r1=93121&r2=93122&view=diff
==============================================================================
--- vmkit/trunk/lib/J3/VMCore/JavaClass.h (original)
+++ vmkit/trunk/lib/J3/VMCore/JavaClass.h Sun Jan 10 13:52:23 2010
@@ -1125,37 +1125,37 @@
//===----------------------------------------------------------------------===//
/// This class of methods takes a variable argument list.
- uint32 invokeIntSpecialAP(Jnjvm* vm, UserClass*, JavaObject* obj, va_list ap, bool jni = false)
+ uint32 invokeIntSpecialAP(Jnjvm* vm, UserClass*, JavaObject* obj, va_list ap, bool jni = true)
__attribute__ ((noinline));
- float invokeFloatSpecialAP(Jnjvm* vm, UserClass*, JavaObject* obj, va_list ap, bool jni = false)
+ float invokeFloatSpecialAP(Jnjvm* vm, UserClass*, JavaObject* obj, va_list ap, bool jni = true)
__attribute__ ((noinline));
double invokeDoubleSpecialAP(Jnjvm* vm, UserClass*, JavaObject* obj,
- va_list ap, bool jni = false) __attribute__ ((noinline));
- sint64 invokeLongSpecialAP(Jnjvm* vm, UserClass*, JavaObject* obj, va_list ap, bool jni = false)
+ va_list ap, bool jni = true) __attribute__ ((noinline));
+ sint64 invokeLongSpecialAP(Jnjvm* vm, UserClass*, JavaObject* obj, va_list ap, bool jni = true)
__attribute__ ((noinline));
JavaObject* invokeJavaObjectSpecialAP(Jnjvm* vm, UserClass*, JavaObject* obj,
- va_list ap, bool jni = false) __attribute__ ((noinline));
+ va_list ap, bool jni = true) __attribute__ ((noinline));
- uint32 invokeIntVirtualAP(Jnjvm* vm, UserClass*, JavaObject* obj, va_list ap, bool jni = false)
+ uint32 invokeIntVirtualAP(Jnjvm* vm, UserClass*, JavaObject* obj, va_list ap, bool jni = true)
__attribute__ ((noinline));
- float invokeFloatVirtualAP(Jnjvm* vm, UserClass*, JavaObject* obj, va_list ap, bool jni = false)
+ float invokeFloatVirtualAP(Jnjvm* vm, UserClass*, JavaObject* obj, va_list ap, bool jni = true)
__attribute__ ((noinline));
double invokeDoubleVirtualAP(Jnjvm* vm, UserClass*, JavaObject* obj,
- va_list ap, bool jni = false) __attribute__ ((noinline));
- sint64 invokeLongVirtualAP(Jnjvm* vm, UserClass*, JavaObject* obj, va_list ap, bool jni = false)
+ va_list ap, bool jni = true) __attribute__ ((noinline));
+ sint64 invokeLongVirtualAP(Jnjvm* vm, UserClass*, JavaObject* obj, va_list ap, bool jni = true)
__attribute__ ((noinline));
JavaObject* invokeJavaObjectVirtualAP(Jnjvm* vm, UserClass*, JavaObject* obj,
- va_list ap, bool jni = false) __attribute__ ((noinline));
+ va_list ap, bool jni = true) __attribute__ ((noinline));
- uint32 invokeIntStaticAP(Jnjvm* vm, UserClass*, va_list ap, bool jni = false)
+ uint32 invokeIntStaticAP(Jnjvm* vm, UserClass*, va_list ap, bool jni = true)
__attribute__ ((noinline));
- float invokeFloatStaticAP(Jnjvm* vm, UserClass*, va_list ap, bool jni = false)
+ float invokeFloatStaticAP(Jnjvm* vm, UserClass*, va_list ap, bool jni = true)
__attribute__ ((noinline));
- double invokeDoubleStaticAP(Jnjvm* vm, UserClass*, va_list ap, bool jni = false)
+ double invokeDoubleStaticAP(Jnjvm* vm, UserClass*, va_list ap, bool jni = true)
__attribute__ ((noinline));
- sint64 invokeLongStaticAP(Jnjvm* vm, UserClass*, va_list ap, bool jni = false)
+ sint64 invokeLongStaticAP(Jnjvm* vm, UserClass*, va_list ap, bool jni = true)
__attribute__ ((noinline));
- JavaObject* invokeJavaObjectStaticAP(Jnjvm* vm, UserClass*, va_list ap, bool jni = false)
+ JavaObject* invokeJavaObjectStaticAP(Jnjvm* vm, UserClass*, va_list ap, bool jni = true)
__attribute__ ((noinline));
/// This class of methods takes a buffer which contain the arguments of the
Modified: vmkit/trunk/lib/J3/VMCore/JavaMetaJIT.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/J3/VMCore/JavaMetaJIT.cpp?rev=93122&r1=93121&r2=93122&view=diff
==============================================================================
--- vmkit/trunk/lib/J3/VMCore/JavaMetaJIT.cpp (original)
+++ vmkit/trunk/lib/J3/VMCore/JavaMetaJIT.cpp Sun Jan 10 13:52:23 2010
@@ -1,4 +1,4 @@
-//===---- JavaMetaJIT.cpp - Functions for Java internal objects -----------===//
+//===----- JavaMetaJIT.cpp - Caling Java methods from native code ---------===//
//
// The VMKit project
//
@@ -51,33 +51,15 @@
abort();\
}\
} else{\
- if (jni) { \
- JavaObject** obj = va_arg(ap, JavaObject**);\
- if (obj) {\
- buffer[i].l = reinterpret_cast<jobject>(*obj);\
- } else {\
- buffer[i].l = reinterpret_cast<jobject>(NULL);\
- }\
- } else { \
- buffer[i].l = reinterpret_cast<jobject>(va_arg(ap, JavaObject**));\
- } \
+ buffer[i].l = reinterpret_cast<jobject>(va_arg(ap, JavaObject**));\
}\
}\
}
//===----------------------------------------------------------------------===//
// We do not need to have special care on the GC-pointers in the buffer
-// manipulated in these functions. Once the Java function is called, they
-// are never used (because the buffer is alloca'd and "this" is only used when
-// calling). TODO: Note that copying collectors will require to change
-// that strategy.
-//===----------------------------------------------------------------------===//
-
-//===----------------------------------------------------------------------===//
-// Also, virtual calls must not be used with stubs, because the thread manager
-// won't understand the frame layout of a CallBuf/CallAP calling
-// LLVM code (hence native code). Therefore, lookup the real JavaMethod,
-// compile it, and give it to the CallBuf/CallAP.
+// manipulated in these functions because the objects in the buffer are
+// addressed and never stored directly.
//===----------------------------------------------------------------------===//
#if defined(DWARF_EXCEPTIONS)
Modified: vmkit/trunk/lib/J3/VMCore/JavaObject.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/J3/VMCore/JavaObject.cpp?rev=93122&r1=93121&r2=93122&view=diff
==============================================================================
--- vmkit/trunk/lib/J3/VMCore/JavaObject.cpp (original)
+++ vmkit/trunk/lib/J3/VMCore/JavaObject.cpp Sun Jan 10 13:52:23 2010
@@ -16,6 +16,8 @@
#include "JavaUpcalls.h"
#include "Jnjvm.h"
+#include <jni.h>
+
using namespace j3;
void JavaObject::waitIntern(struct timeval* info, bool timed) {
@@ -204,7 +206,7 @@
assert(owner() && "Not owner after notifyAll");
}
-void JavaObject::decapsulePrimitive(Jnjvm *vm, uintptr_t &buf,
+void JavaObject::decapsulePrimitive(Jnjvm *vm, jvalue* buf,
const Typedef* signature) {
JavaObject* obj = this;
@@ -214,8 +216,7 @@
if (obj && !(obj->getClass()->isOfTypeName(signature->getName()))) {
vm->illegalArgumentException("wrong type argument");
}
- ((JavaObject**)buf)[0] = obj;
- buf += 8;
+ (*buf).l = reinterpret_cast<jobject>(obj);
return;
} else if (obj == 0) {
vm->illegalArgumentException("");
@@ -230,118 +231,98 @@
if (prim->isShort()) {
if (value == vm->upcalls->OfShort) {
- ((uint16*)buf)[0] = vm->upcalls->shortValue->getInt16Field(obj);
- buf += 8;
+ (*buf).s = vm->upcalls->shortValue->getInt16Field(obj);
return;
} else if (value == vm->upcalls->OfByte) {
- ((sint16*)buf)[0] =
- (sint16)vm->upcalls->byteValue->getInt8Field(obj);
- buf += 8;
+ (*buf).s = (sint16)vm->upcalls->byteValue->getInt8Field(obj);
return;
} else {
vm->illegalArgumentException("");
}
} else if (prim->isByte()) {
if (value == vm->upcalls->OfByte) {
- ((uint8*)buf)[0] = vm->upcalls->byteValue->getInt8Field(obj);
- buf += 8;
+ (*buf).b = vm->upcalls->byteValue->getInt8Field(obj);
return;
} else {
vm->illegalArgumentException("");
}
} else if (prim->isBool()) {
if (value == vm->upcalls->OfBool) {
- ((uint8*)buf)[0] = vm->upcalls->boolValue->getInt8Field(obj);
- buf += 8;
+ (*buf).z = vm->upcalls->boolValue->getInt8Field(obj);
return;
} else {
vm->illegalArgumentException("");
}
} else if (prim->isInt()) {
- sint32 val = 0;
if (value == vm->upcalls->OfInt) {
- val = vm->upcalls->intValue->getInt32Field(obj);
+ (*buf).i = vm->upcalls->intValue->getInt32Field(obj);
} else if (value == vm->upcalls->OfByte) {
- val = (sint32)vm->upcalls->byteValue->getInt8Field(obj);
+ (*buf).i = (sint32)vm->upcalls->byteValue->getInt8Field(obj);
} else if (value == vm->upcalls->OfChar) {
- val = (uint32)vm->upcalls->charValue->getInt16Field(obj);
+ (*buf).i = (uint32)vm->upcalls->charValue->getInt16Field(obj);
} else if (value == vm->upcalls->OfShort) {
- val = (sint32)vm->upcalls->shortValue->getInt16Field(obj);
+ (*buf).i = (sint32)vm->upcalls->shortValue->getInt16Field(obj);
} else {
vm->illegalArgumentException("");
}
- ((sint32*)buf)[0] = val;
- buf += 8;
return;
} else if (prim->isChar()) {
- uint16 val = 0;
if (value == vm->upcalls->OfChar) {
- val = (uint16)vm->upcalls->charValue->getInt16Field(obj);
+ (*buf).c = (uint16)vm->upcalls->charValue->getInt16Field(obj);
} else {
vm->illegalArgumentException("");
}
- ((uint16*)buf)[0] = val;
- buf += 8;
return;
} else if (prim->isFloat()) {
- float val = 0;
if (value == vm->upcalls->OfFloat) {
- val = (float)vm->upcalls->floatValue->getFloatField(obj);
+ (*buf).f = (float)vm->upcalls->floatValue->getFloatField(obj);
} else if (value == vm->upcalls->OfByte) {
- val = (float)(sint32)vm->upcalls->byteValue->getInt8Field(obj);
+ (*buf).f = (float)(sint32)vm->upcalls->byteValue->getInt8Field(obj);
} else if (value == vm->upcalls->OfChar) {
- val = (float)(uint32)vm->upcalls->charValue->getInt16Field(obj);
+ (*buf).f = (float)(uint32)vm->upcalls->charValue->getInt16Field(obj);
} else if (value == vm->upcalls->OfShort) {
- val = (float)(sint32)vm->upcalls->shortValue->getInt16Field(obj);
+ (*buf).f = (float)(sint32)vm->upcalls->shortValue->getInt16Field(obj);
} else if (value == vm->upcalls->OfInt) {
- val = (float)(sint32)vm->upcalls->intValue->getInt32Field(obj);
+ (*buf).f = (float)(sint32)vm->upcalls->intValue->getInt32Field(obj);
} else if (value == vm->upcalls->OfLong) {
- val = (float)vm->upcalls->longValue->getLongField(obj);
+ (*buf).f = (float)vm->upcalls->longValue->getLongField(obj);
} else {
vm->illegalArgumentException("");
}
- ((float*)buf)[0] = val;
- buf += 8;
return;
} else if (prim->isDouble()) {
- double val = 0;
if (value == vm->upcalls->OfDouble) {
- val = (double)vm->upcalls->doubleValue->getDoubleField(obj);
+ (*buf).d = (double)vm->upcalls->doubleValue->getDoubleField(obj);
} else if (value == vm->upcalls->OfFloat) {
- val = (double)vm->upcalls->floatValue->getFloatField(obj);
+ (*buf).d = (double)vm->upcalls->floatValue->getFloatField(obj);
} else if (value == vm->upcalls->OfByte) {
- val = (double)(sint64)vm->upcalls->byteValue->getInt8Field(obj);
+ (*buf).d = (double)(sint64)vm->upcalls->byteValue->getInt8Field(obj);
} else if (value == vm->upcalls->OfChar) {
- val = (double)(uint64)vm->upcalls->charValue->getInt16Field(obj);
+ (*buf).d = (double)(uint64)vm->upcalls->charValue->getInt16Field(obj);
} else if (value == vm->upcalls->OfShort) {
- val = (double)(sint16)vm->upcalls->shortValue->getInt16Field(obj);
+ (*buf).d = (double)(sint16)vm->upcalls->shortValue->getInt16Field(obj);
} else if (value == vm->upcalls->OfInt) {
- val = (double)(sint32)vm->upcalls->intValue->getInt32Field(obj);
+ (*buf).d = (double)(sint32)vm->upcalls->intValue->getInt32Field(obj);
} else if (value == vm->upcalls->OfLong) {
- val = (double)(sint64)vm->upcalls->longValue->getLongField(obj);
+ (*buf).d = (double)(sint64)vm->upcalls->longValue->getLongField(obj);
} else {
vm->illegalArgumentException("");
}
- ((double*)buf)[0] = val;
- buf += 8;
return;
} else if (prim->isLong()) {
- sint64 val = 0;
if (value == vm->upcalls->OfByte) {
- val = (sint64)vm->upcalls->byteValue->getInt8Field(obj);
+ (*buf).j = (sint64)vm->upcalls->byteValue->getInt8Field(obj);
} else if (value == vm->upcalls->OfChar) {
- val = (sint64)(uint64)vm->upcalls->charValue->getInt16Field(obj);
+ (*buf).j = (sint64)(uint64)vm->upcalls->charValue->getInt16Field(obj);
} else if (value == vm->upcalls->OfShort) {
- val = (sint64)vm->upcalls->shortValue->getInt16Field(obj);
+ (*buf).j = (sint64)vm->upcalls->shortValue->getInt16Field(obj);
} else if (value == vm->upcalls->OfInt) {
- val = (sint64)vm->upcalls->intValue->getInt32Field(obj);
+ (*buf).j = (sint64)vm->upcalls->intValue->getInt32Field(obj);
} else if (value == vm->upcalls->OfLong) {
- val = (sint64)vm->upcalls->intValue->getLongField(obj);
+ (*buf).j = (sint64)vm->upcalls->intValue->getLongField(obj);
} else {
vm->illegalArgumentException("");
}
- ((sint64*)buf)[0] = val;
- buf += 8;
return;
}
}
Modified: vmkit/trunk/lib/J3/VMCore/JavaObject.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/J3/VMCore/JavaObject.h?rev=93122&r1=93121&r2=93122&view=diff
==============================================================================
--- vmkit/trunk/lib/J3/VMCore/JavaObject.h (original)
+++ vmkit/trunk/lib/J3/VMCore/JavaObject.h Sun Jan 10 13:52:23 2010
@@ -21,6 +21,8 @@
#include "JavaLocks.h"
#include "JnjvmConfig.h"
+union jvalue;
+
namespace j3 {
class JavaObject;
@@ -280,7 +282,7 @@
/// decapsulePrimitive - Based on the signature argument, decapsule
/// obj as a primitive and put it in the buffer.
///
- void decapsulePrimitive(Jnjvm* vm, uintptr_t &buf, const Typedef* signature);
+ void decapsulePrimitive(Jnjvm* vm, jvalue* buf, const Typedef* signature);
};
Modified: vmkit/trunk/lib/J3/VMCore/Jni.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/J3/VMCore/Jni.cpp?rev=93122&r1=93121&r2=93122&view=diff
==============================================================================
--- vmkit/trunk/lib/J3/VMCore/Jni.cpp (original)
+++ vmkit/trunk/lib/J3/VMCore/Jni.cpp Sun Jan 10 13:52:23 2010
@@ -151,8 +151,10 @@
// Local object references.
JavaObject* Cl = *(JavaObject**)_Cl;
JavaObject* res = 0;
+ JavaString* str = 0;
llvm_gcroot(Cl, 0);
llvm_gcroot(res, 0);
+ llvm_gcroot(str, 0);
Jnjvm* vm = JavaThread::get()->getJVM();
@@ -165,7 +167,8 @@
JavaMethod* init = realCl->lookupMethod(vm->bootstrapLoader->initName,
vm->bootstrapLoader->initExceptionSig,
false, true, 0);
- init->invokeIntSpecial(vm, realCl, res, vm->asciizToStr(msg));
+ str = vm->asciizToStr(msg);
+ init->invokeIntSpecial(vm, realCl, res, &str);
th->pendingException = res;
th->throwFromJNI(SP);
@@ -324,47 +327,6 @@
return 0;
}
-#define BufToBuf(_args, _buf, signature) \
- Typedef* const* arguments = signature->getArgumentsType(); \
- uintptr_t __buf = (uintptr_t)_buf; \
- uintptr_t __args = (uintptr_t)_args;\
- for (uint32 i = 0; i < signature->nbArguments; ++i) { \
- const Typedef* type = arguments[i];\
- if (type->isPrimitive()) {\
- const PrimitiveTypedef* prim = (PrimitiveTypedef*)type;\
- if (prim->isLong()) {\
- ((sint64*)__buf)[0] = ((sint64*)__args)[0];\
- } else if (prim->isInt()){ \
- ((sint32*)__buf)[0] = ((sint32*)__args)[0];\
- } else if (prim->isChar()) { \
- ((uint32*)__buf)[0] = ((uint32*)__args)[0];\
- } else if (prim->isShort()) { \
- ((uint32*)__buf)[0] = ((uint32*)__args)[0];\
- } else if (prim->isByte()) { \
- ((uint32*)__buf)[0] = ((uint32*)__args)[0];\
- } else if (prim->isBool()) { \
- ((uint32*)__buf)[0] = ((uint32*)__args)[0];\
- } else if (prim->isFloat()) {\
- ((float*)__buf)[0] = ((float*)__args)[0];\
- } else if (prim->isDouble()) {\
- ((double*)__buf)[0] = ((double*)__args)[0];\
- } else {\
- fprintf(stderr, "Can't happen");\
- abort();\
- }\
- } else{\
- JavaObject** obj = ((JavaObject***)__args)[0];\
- if (obj) {\
- ((JavaObject**)__buf)[0] = *obj;\
- } else {\
- ((JavaObject**)__buf)[0] = 0;\
- }\
- }\
- __buf += 8; \
- __args += 8; \
- }\
-
-
jobject NewObjectA(JNIEnv* env, jclass _clazz, jmethodID methodID,
const jvalue *args) {
@@ -379,17 +341,12 @@
JavaThread* th = JavaThread::get();
Jnjvm* vm = th->getJVM();
JavaMethod* meth = (JavaMethod*)methodID;
-
- Signdef* sign = meth->getSignature();
- uintptr_t buf = (uintptr_t)alloca(sign->nbArguments * sizeof(uint64));
- BufToBuf(args, buf, sign);
-
UserCommonClass* cl = UserCommonClass::resolvedImplClass(vm, clazz, true);
// Store local reference
res = cl->asClass()->doNew(vm);
- meth->invokeIntSpecialBuf(vm, cl->asClass(), res, (void*)buf);
+ meth->invokeIntSpecialBuf(vm, cl->asClass(), res, (void*)args);
jobject ret = (jobject)th->pushJNIRef(res);
RETURN_FROM_JNI(ret);
@@ -996,11 +953,7 @@
Jnjvm* vm = JavaThread::get()->getJVM();
UserClass* cl = getClassFromVirtualMethod(vm, meth, obj->getClass());
- Signdef* sign = meth->getSignature();
- uintptr_t buf = (uintptr_t)alloca(sign->nbArguments * sizeof(uint64));
- BufToBuf(args, buf, sign);
-
- meth->invokeIntVirtualBuf(vm, cl, obj, (void*)buf);
+ meth->invokeIntVirtualBuf(vm, cl, obj, (void*)args);
RETURN_VOID_FROM_JNI;
@@ -3760,7 +3713,7 @@
myvm->upcalls->dataPointer64->setLongField(p, (jlong)address);
#endif
- myvm->upcalls->InitDirectByteBuffer->invokeIntSpecial(myvm, BB, res, 0, p,
+ myvm->upcalls->InitDirectByteBuffer->invokeIntSpecial(myvm, BB, res, 0, &p,
(uint32)capacity,
(uint32)capacity, 0);
Modified: vmkit/trunk/lib/J3/VMCore/Jnjvm.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/J3/VMCore/Jnjvm.cpp?rev=93122&r1=93121&r2=93122&view=diff
==============================================================================
--- vmkit/trunk/lib/J3/VMCore/Jnjvm.cpp (original)
+++ vmkit/trunk/lib/J3/VMCore/Jnjvm.cpp Sun Jan 10 13:52:23 2010
@@ -234,7 +234,7 @@
abort();
}
JavaMethod* init = upcalls->ErrorWithExcpExceptionInInitializerError;
- init->invokeIntSpecial(vm, clExcp, obj, exc);
+ init->invokeIntSpecial(vm, clExcp, obj, &exc);
exc = obj;
}
@@ -254,15 +254,19 @@
const JavaObject* excp) {
JavaObject* obj = cl->doNew(this);
llvm_gcroot(obj, 0);
- init->invokeIntSpecial(this, cl, obj, excp);
+ init->invokeIntSpecial(this, cl, obj, &excp);
JavaThread::get()->throwException(obj);
}
JavaObject* Jnjvm::CreateError(UserClass* cl, JavaMethod* init,
- const char* str) {
+ const char* asciiz) {
JavaObject* obj = cl->doNew(this);
+ JavaString* str = 0;
llvm_gcroot(obj, 0);
- init->invokeIntSpecial(this, cl, obj, str ? asciizToStr(str) : 0);
+ llvm_gcroot(str, 0);
+ if (asciiz) str = asciizToStr(asciiz);
+
+ init->invokeIntSpecial(this, cl, obj, &str);
return obj;
}
@@ -272,7 +276,7 @@
llvm_gcroot(str, 0);
llvm_gcroot(obj, 0);
obj = cl->doNew(this);
- init->invokeIntSpecial(this, cl, obj, str);
+ init->invokeIntSpecial(this, cl, obj, &str);
return obj;
}
@@ -1134,7 +1138,7 @@
if (!IsolateID)
#endif
upcalls->setContextClassLoader->invokeIntSpecial(this, upcalls->newThread,
- obj, javaLoader);
+ obj, &javaLoader);
// load and initialise math since it is responsible for dlopen'ing
// libjavalang.so and we are optimizing some math operations
UserCommonClass* math =
@@ -1170,7 +1174,7 @@
const UTF8* funcName = appClassLoader->asciizConstructUTF8("main");
JavaMethod* method = cl->lookupMethod(funcName, funcSign, true, true, 0);
- method->invokeIntStatic(this, method->classDef, args);
+ method->invokeIntStatic(this, method->classDef, &args);
}catch(...) {
}
@@ -1182,7 +1186,7 @@
group = upcalls->group->getObjectField(obj);
try{
upcalls->uncaughtException->invokeIntSpecial(this, upcalls->threadGroup,
- group, obj, exc);
+ group, &obj, &exc);
}catch(...) {
fprintf(stderr, "Exception in thread \"main\": "
"Can not print stack trace.\n");
@@ -1203,7 +1207,7 @@
const UTF8* funcName = appClassLoader->asciizConstructUTF8("premain");
JavaMethod* method = cl->lookupMethod(funcName, funcSign, true, true, 0);
- method->invokeIntStatic(this, method->classDef, args, instrumenter);
+ method->invokeIntStatic(this, method->classDef, &args, &instrumenter);
} catch(...) {
JavaThread::get()->clearException();
}
Modified: vmkit/trunk/lib/J3/VMCore/JnjvmClassLoader.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/J3/VMCore/JnjvmClassLoader.cpp?rev=93122&r1=93121&r2=93122&view=diff
==============================================================================
--- vmkit/trunk/lib/J3/VMCore/JnjvmClassLoader.cpp (original)
+++ vmkit/trunk/lib/J3/VMCore/JnjvmClassLoader.cpp Sun Jan 10 13:52:23 2010
@@ -413,7 +413,7 @@
strName = JavaString::internalToJava(name, isolate);
}
obj = upcalls->loadInClassLoader->invokeJavaObjectVirtual(isolate, forCtp,
- javaLoader, strName, doResolve);
+ javaLoader, &strName, doResolve);
cl = (UserCommonClass*)((JavaObjectClass*)obj)->getClass();
}
Modified: vmkit/trunk/tools/j3/Makefile
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/tools/j3/Makefile?rev=93122&r1=93121&r2=93122&view=diff
==============================================================================
--- vmkit/trunk/tools/j3/Makefile (original)
+++ vmkit/trunk/tools/j3/Makefile Sun Jan 10 13:52:23 2010
@@ -36,6 +36,7 @@
endif
+CXX.Flags += $(CLASSPATH_FLAGS)
LINK_COMPONENTS = jit nativecodegen scalaropts instrumentation ipa ipo bitreader asmparser linker
More information about the vmkit-commits
mailing list