aboutsummaryrefslogtreecommitdiff
path: root/gcc/java
diff options
context:
space:
mode:
authorAndrew Haley <aph@redhat.com>2002-09-27 18:27:44 +0000
committerAndrew Haley <aph@redhat.com>2002-09-27 18:27:44 +0000
commiteab6389a764a7f26a475d3dca5c66a1883836b47 (patch)
tree14791d5379a12f2c854f9406cda926a0e922573b /gcc/java
parent73e910dcbf89b5eda0e664b424e2d104e3ef83a0 (diff)
2002-09-26 Andrew Haley <aph@redhat.com>
* expr.c (build_java_array_length_access): Check for null pointer. * expr.c (expand_java_arrayload): Likewise. git-svn-id: https://gcc.gnu.org/svn/gcc/trunk@57591 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/java')
-rw-r--r--gcc/java/ChangeLog5
-rw-r--r--gcc/java/expr.c30
2 files changed, 29 insertions, 6 deletions
diff --git a/gcc/java/ChangeLog b/gcc/java/ChangeLog
index 45776e6e95c..620543a5ca2 100644
--- a/gcc/java/ChangeLog
+++ b/gcc/java/ChangeLog
@@ -1,3 +1,8 @@
+2002-09-26 Andrew Haley <aph@redhat.com>
+
+ * expr.c (build_java_array_length_access): Check for null pointer.
+ * expr.c (expand_java_arrayload): Likewise.
+
2002-09-21 Richard Henderson <rth@redhat.com>
* jcf-parse.c (get_constant): Decode from IEEE no matter
diff --git a/gcc/java/expr.c b/gcc/java/expr.c
index c192d46f41d..0c434e96d5f 100644
--- a/gcc/java/expr.c
+++ b/gcc/java/expr.c
@@ -675,6 +675,15 @@ build_java_array_length_access (node)
tree array_type = TREE_TYPE (type);
HOST_WIDE_INT length;
+ /* JVM spec: If the arrayref is null, the arraylength instruction
+ throws a NullPointerException. The only way we could get a node
+ of type ptr_type_node at this point is `aconst_null; arraylength'
+ or something equivalent. */
+ if (type == ptr_type_node)
+ return build (CALL_EXPR, int_type_node,
+ build_address_of (soft_nullpointer_node),
+ NULL_TREE, NULL_TREE);
+
if (!is_array_type_p (type))
abort ();
@@ -1028,12 +1037,21 @@ expand_java_arrayload (lhs_type_node )
index_node = save_expr (index_node);
array_node = save_expr (array_node);
- lhs_type_node = build_java_check_indexed_type (array_node, lhs_type_node);
-
- load_node = build_java_arrayaccess (array_node,
- lhs_type_node,
- index_node);
-
+
+ if (TREE_TYPE (array_node) == ptr_type_node)
+ /* The only way we could get a node of type ptr_type_node at this
+ point is `aconst_null; arraylength' or something equivalent, so
+ unconditionally throw NullPointerException. */
+ load_node = build (CALL_EXPR, lhs_type_node,
+ build_address_of (soft_nullpointer_node),
+ NULL_TREE, NULL_TREE);
+ else
+ {
+ lhs_type_node = build_java_check_indexed_type (array_node, lhs_type_node);
+ load_node = build_java_arrayaccess (array_node,
+ lhs_type_node,
+ index_node);
+ }
if (INTEGRAL_TYPE_P (lhs_type_node) && TYPE_PRECISION (lhs_type_node) <= 32)
load_node = fold (build1 (NOP_EXPR, int_type_node, load_node));
push_value (load_node);