diff options
author | Nathan Froyd <froydnj@codesourcery.com> | 2010-06-28 12:06:52 +0000 |
---|---|---|
committer | Nathan Froyd <froydnj@gcc.gnu.org> | 2010-06-28 12:06:52 +0000 |
commit | 9062f848ce87430efb0218a97068cbf3f2d9f214 (patch) | |
tree | aebfd63be8cd72586541ea999045763a67598c27 /gcc/java/class.c | |
parent | 04924d6a8881c2f4d4461e0e7a169846f2a34a05 (diff) | |
download | gcc-9062f848ce87430efb0218a97068cbf3f2d9f214.zip gcc-9062f848ce87430efb0218a97068cbf3f2d9f214.tar.gz gcc-9062f848ce87430efb0218a97068cbf3f2d9f214.tar.bz2 |
java-tree.h (struct lang_type): Change type to a VEC.
* java-tree.h (struct lang_type) [catch_classes]: Change type to a
VEC.
* except.c (prepare_eh_table_type): Call CONSTRUCTOR_APPEND_ELT
instead of tree_cons.
* class.c (make_class): Add dummy entry to TYPE_CATCH_CLASSES.
(emit_catch_table): Adjust for new type of TYPE_CATCH_CLASSES.
From-SVN: r161487
Diffstat (limited to 'gcc/java/class.c')
-rw-r--r-- | gcc/java/class.c | 31 |
1 files changed, 18 insertions, 13 deletions
diff --git a/gcc/java/class.c b/gcc/java/class.c index 47b721c..7d90a03 100644 --- a/gcc/java/class.c +++ b/gcc/java/class.c @@ -382,6 +382,12 @@ make_class (void) loading works. */ TYPE_BINFO (type) = make_tree_binfo (0); MAYBE_CREATE_TYPE_TYPE_LANG_SPECIFIC (type); + TYPE_CATCH_CLASSES (type) = NULL; + /* Push a dummy entry; we can't call make_catch_class_record here + because other infrastructure may not be set up yet. We'll come + back and fill it in later once said infrastructure is + initialized. */ + CONSTRUCTOR_APPEND_ELT (TYPE_CATCH_CLASSES (type), NULL_TREE, NULL_TREE); return type; } @@ -2960,18 +2966,17 @@ tree emit_catch_table (tree this_class) { tree table, table_size, array_type; - TYPE_CATCH_CLASSES (this_class) = - tree_cons (NULL, - make_catch_class_record (null_pointer_node, null_pointer_node), - TYPE_CATCH_CLASSES (this_class)); - TYPE_CATCH_CLASSES (this_class) = nreverse (TYPE_CATCH_CLASSES (this_class)); - TYPE_CATCH_CLASSES (this_class) = - tree_cons (NULL, - make_catch_class_record (null_pointer_node, null_pointer_node), - TYPE_CATCH_CLASSES (this_class)); - table_size = build_index_type - (build_int_cst (NULL_TREE, - list_length (TYPE_CATCH_CLASSES (this_class)))); + int n_catch_classes; + constructor_elt *e; + /* Fill in the dummy entry that make_class created. */ + e = VEC_index (constructor_elt, TYPE_CATCH_CLASSES (this_class), 0); + e->value = make_catch_class_record (null_pointer_node, null_pointer_node); + CONSTRUCTOR_APPEND_ELT (TYPE_CATCH_CLASSES (this_class), NULL_TREE, + make_catch_class_record (null_pointer_node, + null_pointer_node)); + n_catch_classes = VEC_length (constructor_elt, + TYPE_CATCH_CLASSES (this_class)); + table_size = build_index_type (build_int_cst (NULL_TREE, n_catch_classes)); array_type = build_array_type (TREE_TYPE (TREE_TYPE (TYPE_CTABLE_DECL (this_class))), table_size); @@ -2979,7 +2984,7 @@ emit_catch_table (tree this_class) build_decl (input_location, VAR_DECL, DECL_NAME (TYPE_CTABLE_DECL (this_class)), array_type); DECL_INITIAL (table) = - build_constructor_from_list (array_type, TYPE_CATCH_CLASSES (this_class)); + build_constructor (array_type, TYPE_CATCH_CLASSES (this_class)); TREE_STATIC (table) = 1; TREE_READONLY (table) = 1; DECL_IGNORED_P (table) = 1; |