aboutsummaryrefslogtreecommitdiff
path: root/gcc/java
diff options
context:
space:
mode:
authorBryce McKinlay <bryce@albatross.co.nz>2000-12-24 00:43:40 +0000
committerBryce McKinlay <bryce@gcc.gnu.org>2000-12-24 00:43:40 +0000
commitd27fd99a031b87c810c1fec5f8a82ce5bfd791fc (patch)
tree933ecd6a4250e4eba29b9292dde0fe6fcd8d2d65 /gcc/java
parent93b0dee7798f3a068d5a3e1ea3a421829548f2b4 (diff)
downloadgcc-d27fd99a031b87c810c1fec5f8a82ce5bfd791fc.zip
gcc-d27fd99a031b87c810c1fec5f8a82ce5bfd791fc.tar.gz
gcc-d27fd99a031b87c810c1fec5f8a82ce5bfd791fc.tar.bz2
Shorten primitive array allocation path:
* decl.c (init_decl_processing): Use _Jv_NewPrimArray not _Jv_NewArray to create new primitive arrays. * expr.c (build_newarray): If generating native code, call soft_newarray_node with a reference to the primitive TYPE identifier instead of type_value. From-SVN: r38482
Diffstat (limited to 'gcc/java')
-rw-r--r--gcc/java/ChangeLog9
-rw-r--r--gcc/java/decl.c2
-rw-r--r--gcc/java/expr.c21
3 files changed, 26 insertions, 6 deletions
diff --git a/gcc/java/ChangeLog b/gcc/java/ChangeLog
index 42a82bf..c52b529 100644
--- a/gcc/java/ChangeLog
+++ b/gcc/java/ChangeLog
@@ -1,3 +1,12 @@
+2000-12-22 Bryce McKinlay <bryce@albatross.co.nz>
+
+ Shorten primitive array allocation path:
+ * decl.c (init_decl_processing): Use _Jv_NewPrimArray not _Jv_NewArray
+ to create new primitive arrays.
+ * expr.c (build_newarray): If generating native code, call
+ soft_newarray_node with a reference to the primitive TYPE identifier
+ instead of type_value.
+
2000-12-17 Bryce McKinlay <bryce@albatross.co.nz>
Fix for PRs gcj/312 and gcj/253:
diff --git a/gcc/java/decl.c b/gcc/java/decl.c
index 0ed7170..df6b236 100644
--- a/gcc/java/decl.c
+++ b/gcc/java/decl.c
@@ -775,7 +775,7 @@ init_decl_processing ()
t = tree_cons (NULL_TREE, int_type_node,
tree_cons (NULL_TREE, int_type_node, endlink));
soft_newarray_node
- = builtin_function ("_Jv_NewArray",
+ = builtin_function ("_Jv_NewPrimArray",
build_function_type(ptr_type_node, t),
0, NOT_BUILT_IN, NULL_PTR);
DECL_IS_MALLOC (soft_newarray_node) = 1;
diff --git a/gcc/java/expr.c b/gcc/java/expr.c
index 5b90488..95a27fd 100644
--- a/gcc/java/expr.c
+++ b/gcc/java/expr.c
@@ -784,24 +784,35 @@ build_java_check_indexed_type (array_node, indexed_type)
return indexed_type;
}
-/* newarray triggers a call to _Jv_NewArray. This function should be called
- with an integer code (the type of array to create) and get from the stack
- the size of the dimmension. */
+/* newarray triggers a call to _Jv_NewPrimArray. This function should be
+ called with an integer code (the type of array to create), and the length
+ of the array to create. */
tree
build_newarray (atype_value, length)
int atype_value;
tree length;
{
+ tree type_arg;
+
+ tree prim_type = decode_newarray_type (atype_value);
tree type
- = build_java_array_type (decode_newarray_type (atype_value),
+ = build_java_array_type (prim_type,
host_integerp (length, 0) == INTEGER_CST
? tree_low_cst (length, 0) : -1);
+ /* If compiling to native, pass a reference to the primitive type class
+ and save the runtime some work. However, the bytecode generator
+ expects to find the type_code int here. */
+ if (flag_emit_class_files)
+ type_arg = build_int_2 (atype_value, 0);
+ else
+ type_arg = build_class_ref (prim_type);
+
return build (CALL_EXPR, promote_type (type),
build_address_of (soft_newarray_node),
tree_cons (NULL_TREE,
- build_int_2 (atype_value, 0),
+ type_arg,
build_tree_list (NULL_TREE, length)),
NULL_TREE);
}