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>