2002-09-26 Andrew Haley <aph@redhat.com>
authoraph <aph@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 27 Sep 2002 18:27:44 +0000 (18:27 +0000)
committeraph <aph@138bc75d-0d04-0410-961f-82ee72b054a4>
Fri, 27 Sep 2002 18:27:44 +0000 (18:27 +0000)
* expr.c (build_java_array_length_access): Check for null pointer.
* expr.c (expand_java_arrayload): Likewise.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@57591 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/java/ChangeLog
gcc/java/expr.c

index 45776e6..620543a 100644 (file)
@@ -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 
index c192d46..0c434e9 100644 (file)
@@ -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);