Looks good! This is again very similar to what is in classpath. I know I said that you should not worry about duplicating code, but after reviewing a few of your changes, if you could somehow try to share when you can, that'd be great :)<div>
<br></div><div>But feel free to ignore for now, if that's on your way of making the progress you want.</div><div><br></div><div>Nicolas</div><div><br><div class="gmail_quote">On Thu, Nov 3, 2011 at 3:29 PM, Will Dietz <span dir="ltr"><<a href="mailto:wdietz2@illinois.edu">wdietz2@illinois.edu</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">Inlined below.<br>
<br>
~Will<br>
<br>
>From 6a870bd12c931552d7979ef216f3d0ff73bd306d Mon Sep 17 00:00:00 2001<br>
From: Will Dietz <<a href="mailto:w@wdtz.org">w@wdtz.org</a>><br>
Date: Wed, 2 Nov 2011 22:24:03 -0500<br>
Subject: [PATCH 09/17] Impl JVM_NewInstanceFromConstructor<br>
<br>
---<br>
lib/J3/ClassLib/OpenJDK/OpenJDK.inc | 72 ++++++++++++++++++++++++++++++++++-<br>
1 files changed, 71 insertions(+), 1 deletions(-)<br>
<br>
diff --git a/lib/J3/ClassLib/OpenJDK/OpenJDK.inc<br>
b/lib/J3/ClassLib/OpenJDK/OpenJDK.inc<br>
index 9c5fb93..31ea42d 100644<br>
--- a/lib/J3/ClassLib/OpenJDK/OpenJDK.inc<br>
+++ b/lib/J3/ClassLib/OpenJDK/OpenJDK.inc<br>
@@ -1566,7 +1566,77 @@ JVM_InvokeMethod(JNIEnv *env, jobject method,<br>
jobject _obj, jobjectArray args0)<br>
*/<br>
JNIEXPORT jobject JNICALL<br>
JVM_NewInstanceFromConstructor(JNIEnv *env, jobject _c, jobjectArray args0) {<br>
- NYI();<br>
+ ArrayObject * args = 0;<br>
+ JavaObjectConstructor * c = 0;<br>
+ JavaObject * res = 0;<br>
+ JavaObject* excp = 0;<br>
+ llvm_gcroot(args, 0);<br>
+ llvm_gcroot(c, 0);<br>
+ llvm_gcroot(res, 0);<br>
+ llvm_gcroot(excp, 0);<br>
+ BEGIN_JNI_EXCEPTION<br>
+<br>
+ Jnjvm* vm = JavaThread::get()->getJVM();<br>
+ c = *(JavaObjectConstructor**)_c;<br>
+ if (args0) args = *(ArrayObject**)args0;<br>
+<br>
+ UserClass* cl = JavaObjectConstructor::getClass(c);<br>
+ JavaMethod * meth = JavaObjectConstructor::getInternalMethod(c);<br>
+ assert(cl && meth);<br>
+<br>
+<br>
+ sint32 nbArgs = args ? ArrayObject::getSize(args) : 0;<br>
+ Signdef* sign = meth->getSignature();<br>
+ sint32 size = sign->nbArguments;<br>
+<br>
+ if (isAbstract(cl->access)) vm->instantiationException(cl);<br>
+<br>
+ mvm::ThreadAllocator allocator;<br>
+ // Allocate a buffer to store the arguments.<br>
+ jvalue* buf = size ?<br>
+ (jvalue*)allocator.Allocate(size * sizeof(jvalue)) : NULL;<br>
+<br>
+ if (nbArgs == size) {<br>
+ cl->initialiseClass(vm);<br>
+ res = cl->doNew(vm);<br>
+<br>
+ JavaObject** ptr = (JavaObject**)ArrayObject::getElements(args);<br>
+ Typedef* const* arguments = sign->getArgumentsType();<br>
+ // Store the arguments, unboxing primitives if necessary.<br>
+ for (sint32 i = 0; i < size; ++i) {<br>
+ JavaObject::decapsulePrimitive(ptr[i], vm, &buf[i], arguments[i]);<br>
+ if (!arguments[i]->isPrimitive()) {<br>
+ buf[i].l = reinterpret_cast<jobject>(&ptr[i]);<br>
+ }<br>
+ }<br>
+<br>
+ JavaThread* th = JavaThread::get();<br>
+ TRY {<br>
+ meth->invokeIntSpecialBuf(vm, cl, res, buf);<br>
+ } CATCH {<br>
+ excp = th->getJavaException();<br>
+ } END_CATCH;<br>
+ if (excp) {<br>
+ if (JavaObject::getClass(excp)->isAssignableFrom(vm->upcalls->newException))<br>
{<br>
+ th->clearException();<br>
+ // If it's an exception, we encapsule it in an<br>
+ // invocationTargetException<br>
+ vm->invocationTargetException(excp);<br>
+ } else {<br>
+ // If it's an error, throw it again.<br>
+ th->throwPendingException();<br>
+ }<br>
+ res = NULL;<br>
+ }<br>
+ } else {<br>
+ vm->illegalArgumentException("wrong number of arguments");<br>
+ }<br>
+<br>
+ RETURN_FROM_JNI((jobject)th->pushJNIRef(res));<br>
+<br>
+ END_JNI_EXCEPTION<br>
+<br>
+ return 0;<br>
}<br>
<br>
/*<br>
<span class="HOEnZb"><font color="#888888">--<br>
1.7.5.1<br>
_______________________________________________<br>
vmkit-commits mailing list<br>
<a href="mailto:vmkit-commits@cs.uiuc.edu">vmkit-commits@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/vmkit-commits" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/vmkit-commits</a><br>
</font></span></blockquote></div><br></div>