[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