aboutsummaryrefslogtreecommitdiff
path: root/libjava/prims.cc
diff options
context:
space:
mode:
authorTom Tromey <tromey@redhat.com>2001-10-02 13:44:32 +0000
committerTom Tromey <tromey@gcc.gnu.org>2001-10-02 13:44:32 +0000
commit62a040818aae81ad8558ebbe3c8973a16e7c250f (patch)
tree671927c18dd4a69605e4bc5e6e956d6b870a48d6 /libjava/prims.cc
parent6cbd1b6f7ebf08244942dd1aaae5ae73ef79da48 (diff)
downloadgcc-62a040818aae81ad8558ebbe3c8973a16e7c250f.zip
gcc-62a040818aae81ad8558ebbe3c8973a16e7c250f.tar.gz
gcc-62a040818aae81ad8558ebbe3c8973a16e7c250f.tar.bz2
prims.cc (_Jv_NewMultiArrayUnchecked): New method.
* 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. From-SVN: r45951
Diffstat (limited to 'libjava/prims.cc')
-rw-r--r--libjava/prims.cc24
1 files changed, 19 insertions, 5 deletions
diff --git a/libjava/prims.cc b/libjava/prims.cc
index 6a13ed5..9b4ac24 100644
--- a/libjava/prims.cc
+++ b/libjava/prims.cc
@@ -516,8 +516,10 @@ _Jv_NewArray (jint type, jint size)
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();
@@ -533,14 +535,24 @@ _Jv_NewMultiArray (jclass type, jint dimensions, jint *sizes)
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;
@@ -549,11 +561,13 @@ _Jv_NewMultiArray (jclass array_type, jint dimensions, ...)
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);
}