| // natField.cc - Implementation of java.lang.reflect.Field native methods. | |
| /* Copyright (C) 1999, 2000, 2001, 2003 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 <stdlib.h> | |
| #include <jvm.h> | |
| #include <gcj/cni.h> | |
| #include <java-stack.h> | |
| #include <java/lang/reflect/Array.h> | |
| #include <java/lang/ArrayIndexOutOfBoundsException.h> | |
| #include <java/lang/IllegalArgumentException.h> | |
| #include <java/lang/Byte.h> | |
| #include <java/lang/Short.h> | |
| #include <java/lang/Integer.h> | |
| #include <java/lang/Long.h> | |
| #include <java/lang/Float.h> | |
| #include <java/lang/Double.h> | |
| #include <java/lang/Boolean.h> | |
| #include <java/lang/Character.h> | |
| jobject | |
| java::lang::reflect::Array::newInstance (jclass componentType, jint length) | |
| { | |
| if (componentType->isPrimitive()) | |
| { | |
| // We could check for this in _Jv_NewPrimArray, but that seems | |
| // like needless overhead when the only real route to this | |
| // problem is here. | |
| if (componentType == JvPrimClass (void)) | |
| throw new java::lang::IllegalArgumentException (); | |
| return _Jv_NewPrimArray (componentType, length); | |
| } | |
| else | |
| // FIXME: class loader? | |
| return JvNewObjectArray (length, componentType, NULL); | |
| } | |
| jobject | |
| java::lang::reflect::Array::newInstance (jclass componentType, | |
| jintArray dimensions) | |
| { | |
| jint ndims = dimensions->length; | |
| if (ndims == 0) | |
| throw new java::lang::IllegalArgumentException (); | |
| jint* dims = elements (dimensions); | |
| if (ndims == 1) | |
| return newInstance (componentType, dims[0]); | |
| Class *caller = _Jv_StackTrace::GetCallingClass (&Array::class$); | |
| ClassLoader *caller_loader = NULL; | |
| if (caller) | |
| caller_loader = caller->getClassLoaderInternal(); | |
| jclass arrayType = componentType; | |
| for (int i = 0; i < ndims; i++) | |
| arrayType = _Jv_GetArrayClass (arrayType, caller_loader); | |
| return _Jv_NewMultiArray (arrayType, ndims, dims); | |
| } | |
| jint | |
| java::lang::reflect::Array::getLength (jobject array) | |
| { | |
| jclass arrayType = array->getClass(); | |
| if (! arrayType->isArray ()) | |
| throw new java::lang::IllegalArgumentException; | |
| return ((__JArray*) array)->length; | |
| } | |
| jclass | |
| java::lang::reflect::Array::getElementType (jobject array, jint index) | |
| { | |
| jclass arrayType = array->getClass(); | |
| if (! arrayType->isArray ()) | |
| throw new java::lang::IllegalArgumentException; | |
| jint length = ((__JArray*) array)->length; | |
| if ((_Jv_uint) index >= (_Jv_uint) length) | |
| _Jv_ThrowBadArrayIndex(index); | |
| return arrayType->getComponentType (); | |
| } | |
| jboolean | |
| java::lang::reflect::Array::getBoolean (jobject array, jint index) | |
| { | |
| jclass elementType = getElementType (array, index); | |
| if (elementType == JvPrimClass (boolean)) | |
| return elements ((jbooleanArray) array) [index]; | |
| throw new java::lang::IllegalArgumentException; | |
| } | |
| jchar | |
| java::lang::reflect::Array::getChar (jobject array, jint index) | |
| { | |
| jclass elementType = getElementType (array, index); | |
| if (elementType == JvPrimClass (char)) | |
| return elements ((jcharArray) array) [index]; | |
| throw new java::lang::IllegalArgumentException; | |
| } | |
| jbyte | |
| java::lang::reflect::Array::getByte (jobject array, jint index) | |
| { | |
| jclass elementType = getElementType (array, index); | |
| if (elementType == JvPrimClass (byte)) | |
| return elements ((jbyteArray) array) [index]; | |
| throw new java::lang::IllegalArgumentException; | |
| } | |
| jshort | |
| java::lang::reflect::Array::getShort (jobject array, jint index) | |
| { | |
| jclass elementType = getElementType (array, index); | |
| if (elementType == JvPrimClass (short)) | |
| return elements ((jshortArray) array) [index]; | |
| if (elementType == JvPrimClass (byte)) | |
| return elements ((jbyteArray) array) [index]; | |
| throw new java::lang::IllegalArgumentException; | |
| } | |
| jint | |
| java::lang::reflect::Array::getInt (jobject array, jint index) | |
| { | |
| jclass elementType = getElementType (array, index); | |
| if (elementType == JvPrimClass (int)) | |
| return elements ((jintArray) array) [index]; | |
| if (elementType == JvPrimClass (short)) | |
| return elements ((jshortArray) array) [index]; | |
| if (elementType == JvPrimClass (byte)) | |
| return elements ((jbyteArray) array) [index]; | |
| if (elementType == JvPrimClass (char)) | |
| return elements ((jcharArray) array) [index]; | |
| throw new java::lang::IllegalArgumentException; | |
| } | |
| jlong | |
| java::lang::reflect::Array::getLong (jobject array, jint index) | |
| { | |
| jclass elementType = getElementType (array, index); | |
| if (elementType == JvPrimClass (long)) | |
| return elements ((jlongArray) array) [index]; | |
| if (elementType == JvPrimClass (int)) | |
| return elements ((jintArray) array) [index]; | |
| if (elementType == JvPrimClass (short)) | |
| return elements ((jshortArray) array) [index]; | |
| if (elementType == JvPrimClass (byte)) | |
| return elements ((jbyteArray) array) [index]; | |
| if (elementType == JvPrimClass (char)) | |
| return elements ((jcharArray) array) [index]; | |
| throw new java::lang::IllegalArgumentException; | |
| } | |
| jfloat | |
| java::lang::reflect::Array::getFloat (jobject array, jint index) | |
| { | |
| jclass elementType = getElementType (array, index); | |
| if (elementType == JvPrimClass (float)) | |
| return elements ((jfloatArray) array) [index]; | |
| if (elementType == JvPrimClass (long)) | |
| return elements ((jlongArray) array) [index]; | |
| if (elementType == JvPrimClass (int)) | |
| return elements ((jintArray) array) [index]; | |
| if (elementType == JvPrimClass (short)) | |
| return elements ((jshortArray) array) [index]; | |
| if (elementType == JvPrimClass (byte)) | |
| return elements ((jbyteArray) array) [index]; | |
| if (elementType == JvPrimClass (char)) | |
| return elements ((jcharArray) array) [index]; | |
| throw new java::lang::IllegalArgumentException; | |
| } | |
| jdouble | |
| java::lang::reflect::Array::getDouble (jobject array, jint index) | |
| { | |
| jclass elementType = getElementType (array, index); | |
| if (elementType == JvPrimClass (double)) | |
| return elements ((jdoubleArray) array) [index]; | |
| if (elementType == JvPrimClass (float)) | |
| return elements ((jfloatArray) array) [index]; | |
| if (elementType == JvPrimClass (long)) | |
| return elements ((jlongArray) array) [index]; | |
| if (elementType == JvPrimClass (int)) | |
| return elements ((jintArray) array) [index]; | |
| if (elementType == JvPrimClass (short)) | |
| return elements ((jshortArray) array) [index]; | |
| if (elementType == JvPrimClass (byte)) | |
| return elements ((jbyteArray) array) [index]; | |
| if (elementType == JvPrimClass (char)) | |
| return elements ((jcharArray) array) [index]; | |
| throw new java::lang::IllegalArgumentException; | |
| } | |
| jobject | |
| java::lang::reflect::Array::get (jobject array, jint index) | |
| { | |
| jclass elementType = getElementType (array, index); | |
| if (! elementType->isPrimitive ()) | |
| return elements ((jobjectArray) array) [index]; | |
| if (elementType == JvPrimClass (double)) | |
| return new java::lang::Double (elements ((jdoubleArray) array) [index]); | |
| if (elementType == JvPrimClass (float)) | |
| return new java::lang::Float (elements ((jfloatArray) array) [index]); | |
| if (elementType == JvPrimClass (long)) | |
| return new java::lang::Long (elements ((jlongArray) array) [index]); | |
| if (elementType == JvPrimClass (int)) | |
| return new java::lang::Integer (elements ((jintArray) array) [index]); | |
| if (elementType == JvPrimClass (short)) | |
| return new java::lang::Short (elements ((jshortArray) array) [index]); | |
| if (elementType == JvPrimClass (byte)) | |
| return new java::lang::Byte (elements ((jbyteArray) array) [index]); | |
| if (elementType == JvPrimClass (char)) | |
| return new java::lang::Character (elements ((jcharArray) array) [index]); | |
| if (elementType == JvPrimClass (boolean)) | |
| { | |
| _Jv_InitClass (&java::lang::Boolean::class$); | |
| if (elements ((jbooleanArray) array) [index]) | |
| return java::lang::Boolean::TRUE; | |
| else | |
| return java::lang::Boolean::FALSE; | |
| } | |
| throw new java::lang::IllegalArgumentException; | |
| } | |
| void | |
| java::lang::reflect::Array::setChar (jobject array, jint index, jchar value) | |
| { | |
| jclass elementType = getElementType (array, index); | |
| if (elementType == JvPrimClass (char)) | |
| elements ((jcharArray) array) [index] = value; | |
| else if (elementType == JvPrimClass (int)) | |
| elements ((jintArray) array) [index] = value; | |
| else if (elementType == JvPrimClass (long)) | |
| elements ((jlongArray) array) [index] = value; | |
| else if (elementType == JvPrimClass (float)) | |
| elements ((jfloatArray) array) [index] = value; | |
| else if (elementType == JvPrimClass (double)) | |
| elements ((jdoubleArray) array) [index] = value; | |
| else | |
| throw new java::lang::IllegalArgumentException; | |
| } | |
| void | |
| java::lang::reflect::Array::setByte (jobject array, jint index, jbyte value) | |
| { | |
| jclass elementType = getElementType (array, index); | |
| if (elementType == JvPrimClass (byte)) | |
| elements ((jbyteArray) array) [index] = value; | |
| else if (elementType == JvPrimClass (short)) | |
| elements ((jshortArray) array) [index] = value; | |
| else if (elementType == JvPrimClass (int)) | |
| elements ((jintArray) array) [index] = value; | |
| else if (elementType == JvPrimClass (long)) | |
| elements ((jlongArray) array) [index] = value; | |
| else if (elementType == JvPrimClass (float)) | |
| elements ((jfloatArray) array) [index] = value; | |
| else if (elementType == JvPrimClass (double)) | |
| elements ((jdoubleArray) array) [index] = value; | |
| else | |
| throw new java::lang::IllegalArgumentException; | |
| } | |
| void | |
| java::lang::reflect::Array::setShort (jobject array, jint index, jshort value) | |
| { | |
| jclass elementType = getElementType (array, index); | |
| if (elementType == JvPrimClass (short)) | |
| elements ((jshortArray) array) [index] = value; | |
| else if (elementType == JvPrimClass (int)) | |
| elements ((jintArray) array) [index] = value; | |
| else if (elementType == JvPrimClass (long)) | |
| elements ((jlongArray) array) [index] = value; | |
| else if (elementType == JvPrimClass (float)) | |
| elements ((jfloatArray) array) [index] = value; | |
| else if (elementType == JvPrimClass (double)) | |
| elements ((jdoubleArray) array) [index] = value; | |
| else | |
| throw new java::lang::IllegalArgumentException; | |
| } | |
| void | |
| java::lang::reflect::Array::setInt (jobject array, jint index, jint value) | |
| { | |
| jclass elementType = getElementType (array, index); | |
| if (elementType == JvPrimClass (int)) | |
| elements ((jintArray) array) [index] = value; | |
| else if (elementType == JvPrimClass (long)) | |
| elements ((jlongArray) array) [index] = value; | |
| else if (elementType == JvPrimClass (float)) | |
| elements ((jfloatArray) array) [index] = value; | |
| else if (elementType == JvPrimClass (double)) | |
| elements ((jdoubleArray) array) [index] = value; | |
| else | |
| throw new java::lang::IllegalArgumentException; | |
| } | |
| void | |
| java::lang::reflect::Array::setLong (jobject array, jint index, jlong value) | |
| { | |
| jclass elementType = getElementType (array, index); | |
| if (elementType == JvPrimClass (long)) | |
| elements ((jlongArray) array) [index] = value; | |
| else if (elementType == JvPrimClass (float)) | |
| elements ((jfloatArray) array) [index] = value; | |
| else if (elementType == JvPrimClass (double)) | |
| elements ((jdoubleArray) array) [index] = value; | |
| else | |
| throw new java::lang::IllegalArgumentException; | |
| } | |
| void | |
| java::lang::reflect::Array::setFloat (jobject array, jint index, jfloat value) | |
| { | |
| jclass elementType = getElementType (array, index); | |
| if (elementType == JvPrimClass (float)) | |
| elements ((jfloatArray) array) [index] = value; | |
| else if (elementType == JvPrimClass (double)) | |
| elements ((jdoubleArray) array) [index] = value; | |
| else | |
| throw new java::lang::IllegalArgumentException; | |
| } | |
| void | |
| java::lang::reflect::Array::setDouble (jobject array, jint index, jdouble value) | |
| { | |
| jclass elementType = getElementType (array, index); | |
| if (elementType == JvPrimClass (double)) | |
| elements ((jdoubleArray) array) [index] = value; | |
| else | |
| throw new java::lang::IllegalArgumentException; | |
| } | |
| void | |
| java::lang::reflect::Array::setBoolean (jobject array, | |
| jint index, jboolean value) | |
| { | |
| jclass elementType = getElementType (array, index); | |
| if (elementType == JvPrimClass (boolean)) | |
| elements ((jbooleanArray) array) [index] = value; | |
| else | |
| throw new java::lang::IllegalArgumentException; | |
| } | |
| void | |
| java::lang::reflect::Array::set (jobject array, jint index, | |
| jobject value, jclass elType) | |
| { | |
| // We don't have to call getElementType here, or check INDEX, | |
| // because it was already done in the Java wrapper. | |
| if (value != NULL && ! _Jv_IsInstanceOf (value, elType)) | |
| throw new java::lang::IllegalArgumentException; | |
| elements ((jobjectArray) array) [index] = value; | |
| } |