mirror of git://gcc.gnu.org/git/gcc.git
				
				
				
			
		
			
				
	
	
		
			361 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			361 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			C++
		
	
	
	
| // 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;
 | |
| }
 |