+2001-10-01 Tom Tromey <tromey@redhat.com>
+
+ * prims.cc (_Jv_NewMultiArrayUnchecked): New method.
+ (_Jv_NewMultiArray): Use it. Check each array dimension.
+ (_Jv_NewMultiArray): Likewise.
+ * java/lang/reflect/natMethod.cc (can_widen): Nothing promotes to
+ `char'.
+ * java/lang/reflect/natArray.cc (newInstance): Throw
+ IllegalArgumentException if there are no dimensions.
+
2001-10-01 Mark Wielaard <mark@klomp.org>
* java/io/FileWriter.java: Merge with Classpath.
}
jobject
-java::lang::reflect::Array::newInstance (jclass componentType, jintArray dimensions)
+java::lang::reflect::Array::newInstance (jclass componentType,
+ jintArray dimensions)
{
jint ndims = dimensions->length;
if (ndims == 0)
- return componentType->newInstance ();
+ throw new java::lang::IllegalArgumentException ();
jint* dims = elements (dimensions);
if (ndims == 1)
return newInstance (componentType, dims[0]);
return NULL; // Placate compiler.
}
-jobject
-_Jv_NewMultiArray (jclass type, jint dimensions, jint *sizes)
+// Allocate a possibly multi-dimensional array but don't check that
+// any array length is <0.
+static jobject
+_Jv_NewMultiArrayUnchecked (jclass type, jint dimensions, jint *sizes)
{
JvAssert (type->isArray());
jclass element_type = type->getComponentType();
JvAssert (element_type->isArray());
jobject *contents = elements ((jobjectArray) result);
for (int i = 0; i < sizes[0]; ++i)
- contents[i] = _Jv_NewMultiArray (element_type, dimensions - 1,
- sizes + 1);
+ contents[i] = _Jv_NewMultiArrayUnchecked (element_type, dimensions - 1,
+ sizes + 1);
}
return result;
}
jobject
+_Jv_NewMultiArray (jclass type, jint dimensions, jint *sizes)
+{
+ for (int i = 0; i < dimensions; ++i)
+ if (sizes[i] < 0)
+ throw new java::lang::NegativeArraySizeException;
+
+ return _Jv_NewMultiArrayUnchecked (type, dimensions, sizes);
+}
+
+jobject
_Jv_NewMultiArray (jclass array_type, jint dimensions, ...)
{
va_list args;
for (int i = 0; i < dimensions; ++i)
{
jint size = va_arg (args, jint);
+ if (size < 0)
+ throw new java::lang::NegativeArraySizeException;
sizes[i] = size;
}
va_end (args);
- return _Jv_NewMultiArray (array_type, dimensions, sizes);
+ return _Jv_NewMultiArrayUnchecked (array_type, dimensions, sizes);
}
\f