blob: db21bc271680f579eb0b3006350a75466b153885 [file] [log] [blame]
//===- ClasspathConstructor.cpp -------------------------------------------===//
//===----------- GNU classpath java/lang/reflect/Constructor --------------===//
//
// JnJVM
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
#include <string.h>
#include "types.h"
#include "JavaArray.h"
#include "JavaClass.h"
#include "JavaObject.h"
#include "JavaTypes.h"
#include "JavaThread.h"
#include "JavaUpcalls.h"
#include "Jnjvm.h"
#include "JnjvmClassLoader.h"
#include "NativeUtil.h"
using namespace jnjvm;
extern "C" {
JNIEXPORT jobject JNICALL Java_java_lang_reflect_Constructor_getParameterTypes(
#ifdef NATIVE_JNI
JNIEnv *env,
#endif
jobject cons) {
Jnjvm* vm = JavaThread::get()->isolate;
JavaMethod* meth = (JavaMethod*)(vm->upcalls->constructorSlot->getInt32Field((JavaObject*)cons));
#ifdef MULTIPLE_VM
jclass Cl = (jclass)vm->upcalls->constructorClass->getInt32Field((JavaObject*)cons);
UserCommonClass* cl = NativeUtil::resolvedImplClass(Cl, false);
JnjvmClassLoader* loader = cl->classLoader;
#else
JnjvmClassLoader* loader = meth->classDef->classLoader;
#endif
return (jobject)(NativeUtil::getParameterTypes(loader, meth));
}
JNIEXPORT jint JNICALL Java_java_lang_reflect_Constructor_getModifiersInternal(
#ifdef NATIVE_JNI
JNIEnv *env,
#endif
jobject cons) {
Jnjvm* vm = JavaThread::get()->isolate;
JavaMethod* meth = (JavaMethod*)(vm->upcalls->constructorSlot->getInt32Field((JavaObject*)cons));
return meth->access;
}
JNIEXPORT jobject JNICALL Java_java_lang_reflect_Constructor_constructNative(
#ifdef NATIVE_JNI
JNIEnv *env,
#endif
jobject _cons,
jobject _args,
jclass Clazz,
jint _meth) {
JavaMethod* meth = (JavaMethod*)_meth;
JavaArray* args = (JavaArray*)_args;
sint32 nbArgs = args ? args->size : 0;
sint32 size = meth->getSignature()->args.size();
Jnjvm* vm = JavaThread::get()->isolate;
void** buf = (void**)alloca(size * sizeof(uint64));
void* _buf = (void*)buf;
sint32 index = 0;
if (nbArgs == size) {
UserCommonClass* _cl = NativeUtil::resolvedImplClass(Clazz, false);
if (!_cl->isArray()) {
UserClass* cl = (UserClass*)_cl;
cl->initialiseClass(vm);
JavaObject* res = cl->doNew(vm);
JavaObject** ptr = (JavaObject**)(void*)(args->elements);
for (std::vector<Typedef*>::iterator i = meth->getSignature()->args.begin(),
e = meth->getSignature()->args.end(); i != e; ++i, ++index) {
NativeUtil::decapsulePrimitive(vm, buf, ptr[index], *i);
}
JavaObject* excp = 0;
try {
meth->invokeIntSpecialBuf(vm, cl, res, _buf);
}catch(...) {
excp = JavaThread::getJavaException();
JavaThread::clearException();
}
if (excp) {
if (excp->classOf->isAssignableFrom(vm->upcalls->newException)) {
vm->invocationTargetException(excp);
} else {
JavaThread::throwException(excp);
}
}
return (jobject)res;
}
}
vm->illegalArgumentExceptionForMethod(meth, 0, 0);
return 0;
}
JNIEXPORT jobjectArray JNICALL Java_java_lang_reflect_Constructor_getExceptionTypes(
#ifdef NATIVE_JNI
JNIEnv *env,
#endif
jobject cons) {
verifyNull(cons);
Jnjvm* vm = JavaThread::get()->isolate;
JavaMethod* meth = (JavaMethod*)vm->upcalls->constructorSlot->getInt32Field((JavaObject*)cons);
UserClass* cl = 0;
#ifdef MULTIPLE_VM
jclass Cl = (jclass)vm->upcalls->methodClass->getInt32Field((JavaObject*)cons);
cl = (UserClass*)NativeUtil::resolvedImplClass(Cl, false);
#else
cl = meth->classDef;
#endif
return (jobjectArray)NativeUtil::getExceptionTypes(cl, meth);
}
}