[vmkit-commits] [PATCH] Impl JVM_NewInstanceFromConstructor
Nicolas Geoffray
nicolas.geoffray at gmail.com
Fri Nov 4 14:23:41 PDT 2011
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 :)
But feel free to ignore for now, if that's on your way of making the
progress you want.
Nicolas
On Thu, Nov 3, 2011 at 3:29 PM, Will Dietz <wdietz2 at illinois.edu> wrote:
> Inlined below.
>
> ~Will
>
> >From 6a870bd12c931552d7979ef216f3d0ff73bd306d Mon Sep 17 00:00:00 2001
> From: Will Dietz <w at wdtz.org>
> Date: Wed, 2 Nov 2011 22:24:03 -0500
> Subject: [PATCH 09/17] Impl JVM_NewInstanceFromConstructor
>
> ---
> lib/J3/ClassLib/OpenJDK/OpenJDK.inc | 72
> ++++++++++++++++++++++++++++++++++-
> 1 files changed, 71 insertions(+), 1 deletions(-)
>
> diff --git a/lib/J3/ClassLib/OpenJDK/OpenJDK.inc
> b/lib/J3/ClassLib/OpenJDK/OpenJDK.inc
> index 9c5fb93..31ea42d 100644
> --- a/lib/J3/ClassLib/OpenJDK/OpenJDK.inc
> +++ b/lib/J3/ClassLib/OpenJDK/OpenJDK.inc
> @@ -1566,7 +1566,77 @@ JVM_InvokeMethod(JNIEnv *env, jobject method,
> jobject _obj, jobjectArray args0)
> */
> JNIEXPORT jobject JNICALL
> JVM_NewInstanceFromConstructor(JNIEnv *env, jobject _c, jobjectArray
> args0) {
> - NYI();
> + ArrayObject * args = 0;
> + JavaObjectConstructor * c = 0;
> + JavaObject * res = 0;
> + JavaObject* excp = 0;
> + llvm_gcroot(args, 0);
> + llvm_gcroot(c, 0);
> + llvm_gcroot(res, 0);
> + llvm_gcroot(excp, 0);
> + BEGIN_JNI_EXCEPTION
> +
> + Jnjvm* vm = JavaThread::get()->getJVM();
> + c = *(JavaObjectConstructor**)_c;
> + if (args0) args = *(ArrayObject**)args0;
> +
> + UserClass* cl = JavaObjectConstructor::getClass(c);
> + JavaMethod * meth = JavaObjectConstructor::getInternalMethod(c);
> + assert(cl && meth);
> +
> +
> + sint32 nbArgs = args ? ArrayObject::getSize(args) : 0;
> + Signdef* sign = meth->getSignature();
> + sint32 size = sign->nbArguments;
> +
> + if (isAbstract(cl->access)) vm->instantiationException(cl);
> +
> + mvm::ThreadAllocator allocator;
> + // Allocate a buffer to store the arguments.
> + jvalue* buf = size ?
> + (jvalue*)allocator.Allocate(size * sizeof(jvalue)) : NULL;
> +
> + if (nbArgs == size) {
> + cl->initialiseClass(vm);
> + res = cl->doNew(vm);
> +
> + JavaObject** ptr = (JavaObject**)ArrayObject::getElements(args);
> + Typedef* const* arguments = sign->getArgumentsType();
> + // Store the arguments, unboxing primitives if necessary.
> + for (sint32 i = 0; i < size; ++i) {
> + JavaObject::decapsulePrimitive(ptr[i], vm, &buf[i], arguments[i]);
> + if (!arguments[i]->isPrimitive()) {
> + buf[i].l = reinterpret_cast<jobject>(&ptr[i]);
> + }
> + }
> +
> + JavaThread* th = JavaThread::get();
> + TRY {
> + meth->invokeIntSpecialBuf(vm, cl, res, buf);
> + } CATCH {
> + excp = th->getJavaException();
> + } END_CATCH;
> + if (excp) {
> + if
> (JavaObject::getClass(excp)->isAssignableFrom(vm->upcalls->newException))
> {
> + th->clearException();
> + // If it's an exception, we encapsule it in an
> + // invocationTargetException
> + vm->invocationTargetException(excp);
> + } else {
> + // If it's an error, throw it again.
> + th->throwPendingException();
> + }
> + res = NULL;
> + }
> + } else {
> + vm->illegalArgumentException("wrong number of arguments");
> + }
> +
> + RETURN_FROM_JNI((jobject)th->pushJNIRef(res));
> +
> + END_JNI_EXCEPTION
> +
> + return 0;
> }
>
> /*
> --
> 1.7.5.1
> _______________________________________________
> vmkit-commits mailing list
> vmkit-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/vmkit-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/vmkit-commits/attachments/20111104/3106a03c/attachment.html>
More information about the vmkit-commits
mailing list