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;
 | 
						|
}
 |