#include <config.h>
#include <gcj/cni.h>
#include <jvm.h>
#include <java/lang/ArrayIndexOutOfBoundsException.h>
#include <java/lang/IllegalAccessException.h>
#include <java/lang/reflect/Constructor.h>
#include <java/lang/reflect/Method.h>
#include <java/lang/reflect/InvocationTargetException.h>
#include <java/lang/reflect/Modifier.h>
#include <java/lang/InstantiationException.h>
#include <gcj/method.h>
jint
java::lang::reflect::Constructor::getModifiers ()
{
return _Jv_FromReflectedConstructor (this)->accflags & Modifier::ALL_FLAGS;
}
void
java::lang::reflect::Constructor::getType ()
{
_Jv_GetTypesFromSignature (_Jv_FromReflectedConstructor (this),
declaringClass,
¶meter_types,
NULL);
exception_types =
(JArray<jclass> *) JvNewObjectArray (0, &java::lang::Class::class$, NULL);
}
jobject
java::lang::reflect::Constructor::newInstance (jobjectArray args)
{
using namespace java::lang::reflect;
if (parameter_types == NULL)
getType ();
jmethodID meth = _Jv_FromReflectedConstructor (this);
if (! (Modifier::isPublic (meth->accflags) || this->isAccessible()))
{
gnu::gcj::runtime::StackTrace *t
= new gnu::gcj::runtime::StackTrace(4);
Class *caller = NULL;
try
{
for (int i = 1; !caller; i++)
{
caller = t->classAt (i);
}
}
catch (::java::lang::ArrayIndexOutOfBoundsException *e)
{
}
if (! _Jv_CheckAccess(caller, declaringClass, meth->accflags))
throw new IllegalAccessException;
}
if (Modifier::isAbstract (declaringClass->getModifiers()))
throw new InstantiationException;
_Jv_InitClass (declaringClass);
return _Jv_CallAnyMethodA (NULL, declaringClass, meth, true,
parameter_types, args);
}