| // natConstructor.cc - Native code for Constructor class. |
| |
| /* Copyright (C) 1999, 2000, 2001, 2002, 2003, 2006 Free Software Foundation |
| |
| This file is part of libgcj. |
| |
| This software is copyrighted work licensed under the terms of the |
| Libgcj License. Please consult the file "LIBGCJ_LICENSE" for |
| details. */ |
| |
| #include <config.h> |
| |
| #include <gcj/cni.h> |
| #include <jvm.h> |
| #include <java-stack.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::getModifiersInternal () |
| { |
| return _Jv_FromReflectedConstructor (this)->accflags; |
| } |
| |
| void |
| java::lang::reflect::Constructor::getType () |
| { |
| _Jv_GetTypesFromSignature (_Jv_FromReflectedConstructor (this), |
| declaringClass, |
| ¶meter_types, |
| NULL); |
| |
| // FIXME: for now we have no way to get exception information. |
| 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); |
| |
| // Check accessibility, if required. |
| if (! (Modifier::isPublic (meth->accflags) || this->isAccessible())) |
| { |
| Class *caller = _Jv_StackTrace::GetCallingClass (&Constructor::class$); |
| if (! _Jv_CheckAccess(caller, declaringClass, meth->accflags)) |
| throw new IllegalAccessException; |
| } |
| |
| if (Modifier::isAbstract (declaringClass->getModifiers())) |
| throw new InstantiationException; |
| |
| _Jv_InitClass (declaringClass); |
| |
| // In the constructor case the return type is the type of the |
| // constructor. |
| return _Jv_CallAnyMethodA (NULL, declaringClass, meth, true, |
| parameter_types, args); |
| } |