[vmkit-commits] [vmkit] r199614 - Implements the runtime multianewarray method.
Gael Thomas
gael.thomas at lip6.fr
Sun Jan 19 13:42:37 PST 2014
Author: gthomas
Date: Sun Jan 19 15:42:36 2014
New Revision: 199614
URL: http://llvm.org/viewvc/llvm-project?rev=199614&view=rev
Log:
Implements the runtime multianewarray method.
Modified:
vmkit/branches/mcjit/include/j3/j3class.h
vmkit/branches/mcjit/include/j3/j3meta.def
vmkit/branches/mcjit/include/j3/j3object.h
vmkit/branches/mcjit/lib/j3/vm/j3class.cc
vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc
vmkit/branches/mcjit/lib/j3/vm/j3object.cc
Modified: vmkit/branches/mcjit/include/j3/j3class.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3class.h?rev=199614&r1=199613&r2=199614&view=diff
==============================================================================
--- vmkit/branches/mcjit/include/j3/j3class.h (original)
+++ vmkit/branches/mcjit/include/j3/j3class.h Sun Jan 19 15:42:36 2014
@@ -293,6 +293,8 @@ namespace j3 {
uint16_t access();
uint16_t modifiers();
J3Class* super();
+
+ J3ObjectHandle* multianewArray(uint32_t dim, uint32_t* args);
};
class J3Primitive : public J3Type {
Modified: vmkit/branches/mcjit/include/j3/j3meta.def
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3meta.def?rev=199614&r1=199613&r2=199614&view=diff
==============================================================================
--- vmkit/branches/mcjit/include/j3/j3meta.def (original)
+++ vmkit/branches/mcjit/include/j3/j3meta.def Sun Jan 19 15:42:36 2014
@@ -1,31 +1,31 @@
-_x(funcJ3MethodIndex, "j3::J3Method::index()")
-_x(funcJ3TypeVT, "j3::J3Type::vt()")
-_x(funcJ3TypeVTAndResolve, "j3::J3Type::vtAndResolve()")
-_x(funcJ3TypeInitialise, "j3::J3Type::initialise()")
-_x(funcJ3LayoutStructSize, "j3::J3Layout::structSize()")
-_x(funcJ3ClassStaticInstance, "j3::J3Class::staticInstance()")
-_x(funcJ3ClassStringAt, "j3::J3Class::stringAt(unsigned short, bool)")
-_x(funcJ3TypeJavaClass, "j3::J3Type::javaClass(bool, j3::J3ObjectHandle*)")
-_x(funcJniEnv, "j3::J3::jniEnv()")
-_x(funcJ3ArrayClassMultianewArray, "j3::J3Object::multianewArray(j3::J3ArrayClass*, unsigned int, unsigned int*)")
-_x(funcJ3ObjectAllocate, "j3::J3Object::allocate(j3::J3VirtualTable*, unsigned long)")
-_x(funcJ3ObjectMonitorEnter, "j3::J3Object::monitorEnter(j3::J3Object*)")
-_x(funcJ3ObjectMonitorExit, "j3::J3Object::monitorExit(j3::J3Object*)")
-_x(funcThrowException, "vmkit::VMKit::throwException(void*)")
-_x(funcReplayException, "j3::J3Thread::replayException()")
-_x(funcClassCastException, "j3::J3::classCastException()")
-_x(funcNullPointerException, "j3::J3::nullPointerException()")
-_x(funcJ3ThreadPushHandle, "j3::J3Thread::push(j3::J3ObjectHandle*)")
-_x(funcJ3ThreadPush, "j3::J3Thread::push(j3::J3Object*)")
-_x(funcJ3ThreadTell, "j3::J3Thread::tell()")
-_x(funcJ3ThreadRestore, "j3::J3Thread::restore(j3::J3ObjectHandle*)")
-_x(funcEchoDebugEnter, "j3::J3CodeGen::echoDebugEnter(unsigned int, char const*, ...)")
-_x(funcEchoDebugExecute, "j3::J3CodeGen::echoDebugExecute(unsigned int, char const*, ...)")
-_x(funcEchoElement, "j3::J3CodeGen::echoElement(unsigned int, unsigned int, unsigned long)")
-_x(funcIsAssignableTo, "j3::J3VirtualTable::isAssignableTo(j3::J3VirtualTable*)")
+_x(funcJ3MethodIndex, "j3::J3Method::index()")
+_x(funcJ3TypeVT, "j3::J3Type::vt()")
+_x(funcJ3TypeVTAndResolve, "j3::J3Type::vtAndResolve()")
+_x(funcJ3TypeInitialise, "j3::J3Type::initialise()")
+_x(funcJ3LayoutStructSize, "j3::J3Layout::structSize()")
+_x(funcJ3ClassStaticInstance, "j3::J3Class::staticInstance()")
+_x(funcJ3ClassStringAt, "j3::J3Class::stringAt(unsigned short, bool)")
+_x(funcJ3TypeJavaClass, "j3::J3Type::javaClass(bool, j3::J3ObjectHandle*)")
+_x(funcJniEnv, "j3::J3::jniEnv()")
+_x(funcJ3ArrayObjectMultianewArray, "j3::J3ArrayObject::multianewArray(j3::J3ArrayClass*, unsigned int, unsigned int*)")
+_x(funcJ3ObjectAllocate, "j3::J3Object::allocate(j3::J3VirtualTable*, unsigned long)")
+_x(funcJ3ObjectMonitorEnter, "j3::J3Object::monitorEnter(j3::J3Object*)")
+_x(funcJ3ObjectMonitorExit, "j3::J3Object::monitorExit(j3::J3Object*)")
+_x(funcThrowException, "vmkit::VMKit::throwException(void*)")
+_x(funcReplayException, "j3::J3Thread::replayException()")
+_x(funcClassCastException, "j3::J3::classCastException()")
+_x(funcNullPointerException, "j3::J3::nullPointerException()")
+_x(funcJ3ThreadPushHandle, "j3::J3Thread::push(j3::J3ObjectHandle*)")
+_x(funcJ3ThreadPush, "j3::J3Thread::push(j3::J3Object*)")
+_x(funcJ3ThreadTell, "j3::J3Thread::tell()")
+_x(funcJ3ThreadRestore, "j3::J3Thread::restore(j3::J3ObjectHandle*)")
+_x(funcEchoDebugEnter, "j3::J3CodeGen::echoDebugEnter(unsigned int, char const*, ...)")
+_x(funcEchoDebugExecute, "j3::J3CodeGen::echoDebugExecute(unsigned int, char const*, ...)")
+_x(funcEchoElement, "j3::J3CodeGen::echoElement(unsigned int, unsigned int, unsigned long)")
+_x(funcIsAssignableTo, "j3::J3VirtualTable::isAssignableTo(j3::J3VirtualTable*)")
_x(funcFastIsAssignableToPrimaryChecker, "j3::J3VirtualTable::fastIsAssignableToPrimaryChecker(j3::J3VirtualTable*, unsigned int)")
_x(funcFastIsAssignableToNonPrimaryChecker, "j3::J3VirtualTable::fastIsAssignableToNonPrimaryChecker(j3::J3VirtualTable*)")
-_x(funcGXXPersonality, "__gxx_personality_v0")
-_x(funcCXABeginCatch, "__cxa_begin_catch")
-_x(funcCXAEndCatch, "__cxa_end_catch")
-_x(funcFake, "j3::J3::forceSymbolDefinition()")
+_x(funcGXXPersonality, "__gxx_personality_v0")
+_x(funcCXABeginCatch, "__cxa_begin_catch")
+_x(funcCXAEndCatch, "__cxa_end_catch")
+_x(funcFake, "j3::J3::forceSymbolDefinition()")
Modified: vmkit/branches/mcjit/include/j3/j3object.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3object.h?rev=199614&r1=199613&r2=199614&view=diff
==============================================================================
--- vmkit/branches/mcjit/include/j3/j3object.h (original)
+++ vmkit/branches/mcjit/include/j3/j3object.h Sun Jan 19 15:42:36 2014
@@ -116,7 +116,6 @@ namespace j3 {
static void monitorEnter(J3Object* obj);
static void monitorExit(J3Object* obj);
- static J3Object* multianewArray(J3ArrayClass* cl, uint32_t dim, uint32_t* args);
static J3Object* allocate(J3VirtualTable* vt, uintptr_t n);
static J3Object* doNewNoInit(J3Class* cl);
static J3Object* doNew(J3Class* cl);
@@ -135,6 +134,7 @@ namespace j3 {
private:
uint32_t _length;
static J3Object* doNew(J3ArrayClass* cl, uintptr_t length);
+ static J3Object* multianewArray(J3ArrayClass* cl, uint32_t dim, uint32_t* args);
public:
Modified: vmkit/branches/mcjit/lib/j3/vm/j3class.cc
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3class.cc?rev=199614&r1=199613&r2=199614&view=diff
==============================================================================
--- vmkit/branches/mcjit/lib/j3/vm/j3class.cc (original)
+++ vmkit/branches/mcjit/lib/j3/vm/j3class.cc Sun Jan 19 15:42:36 2014
@@ -1025,6 +1025,17 @@ void J3ArrayClass::doNativeName() {
_nativeName[_nativeNameLength] = 0;
}
+J3ObjectHandle* J3ArrayClass::multianewArray(uint32_t dim, uint32_t* args) {
+ fprintf(stderr, "allocating %s %d\n", name()->cStr(), args[0]);
+ J3ObjectHandle* res = J3ObjectHandle::doNewArray(this, args[0]);
+
+ if(dim > 1)
+ for(uint32_t i=0; i<args[0]; i++)
+ res->setObjectAt(i, component()->asArrayClass()->multianewArray(dim-1, args+1));
+
+ return res;
+}
+
/*
* ------------ J3Primitive ------------
*/
Modified: vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc?rev=199614&r1=199613&r2=199614&view=diff
==============================================================================
--- vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc (original)
+++ vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc Sun Jan 19 15:42:36 2014
@@ -577,7 +577,7 @@ void J3CodeGen::multianewArray() {
for(uint32_t i=0; i<dim; i++)
builder->CreateStore(stack.pop(), builder->CreateGEP(values, builder->getInt32(dim-i-1)));
- stack.push(builder->CreateCall3(funcJ3ArrayClassMultianewArray,
+ stack.push(builder->CreateCall3(funcJ3ArrayObjectMultianewArray,
typeDescriptor(base, vm->typeJ3ArrayClassPtr),
builder->getInt32(dim),
values));
Modified: vmkit/branches/mcjit/lib/j3/vm/j3object.cc
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3object.cc?rev=199614&r1=199613&r2=199614&view=diff
==============================================================================
--- vmkit/branches/mcjit/lib/j3/vm/j3object.cc (original)
+++ vmkit/branches/mcjit/lib/j3/vm/j3object.cc Sun Jan 19 15:42:36 2014
@@ -291,10 +291,6 @@ J3Object* J3Object::doNew(J3Class* cl) {
return doNewNoInit(cl);
}
-J3Object* J3Object::multianewArray(J3ArrayClass* array, uint32_t dim, uint32_t* args) {
- J3::internalError("implement me: multianewarray");
-}
-
void J3Object::monitorEnter(J3Object* obj) {
J3::internalError("implement me: monitorenter");
}
@@ -390,6 +386,13 @@ J3Object* J3ArrayObject::doNew(J3ArrayCl
return res;
}
+J3Object* J3ArrayObject::multianewArray(J3ArrayClass* cl, uint32_t dim, uint32_t* args) {
+ J3ObjectHandle* prev = J3Thread::get()->tell();
+ J3Object* res = cl->multianewArray(dim, args)->obj();
+ J3Thread::get()->restore(prev);
+ return res;
+}
+
/*
* J3ObjectHandle
*/
More information about the vmkit-commits
mailing list