aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorTom Tromey <tromey@redhat.com>2001-08-24 17:24:02 +0000
committerTom Tromey <tromey@gcc.gnu.org>2001-08-24 17:24:02 +0000
commit66b461ce02570f05b7ddd76e2de1a82f3a6618e3 (patch)
treec022ddf73be4bc070372f075be9b84b48990b1db /gcc
parent20787c010ac0cd423df4ca43a6d850e8131506f8 (diff)
downloadgcc-66b461ce02570f05b7ddd76e2de1a82f3a6618e3.zip
gcc-66b461ce02570f05b7ddd76e2de1a82f3a6618e3.tar.gz
gcc-66b461ce02570f05b7ddd76e2de1a82f3a6618e3.tar.bz2
decl.c (init_decl_processing): Add `throws' field to method descriptor.
* decl.c (init_decl_processing): Add `throws' field to method descriptor. * class.c (make_method_value): Compute `throws' field for method. From-SVN: r45152
Diffstat (limited to 'gcc')
-rw-r--r--gcc/java/ChangeLog6
-rw-r--r--gcc/java/class.c39
-rw-r--r--gcc/java/decl.c1
3 files changed, 46 insertions, 0 deletions
diff --git a/gcc/java/ChangeLog b/gcc/java/ChangeLog
index e763b18..45b145e 100644
--- a/gcc/java/ChangeLog
+++ b/gcc/java/ChangeLog
@@ -1,3 +1,9 @@
+2001-08-21 Tom Tromey <tromey@redhat.com>
+
+ * decl.c (init_decl_processing): Add `throws' field to method
+ descriptor.
+ * class.c (make_method_value): Compute `throws' field for method.
+
2001-08-22 Alexandre Petit-Bianco <apbianco@redhat.com>
* parse.y (resolve_inner_class): Keep local_enclosing to NULL if
diff --git a/gcc/java/class.c b/gcc/java/class.c
index e8f7e6f..e0caeae 100644
--- a/gcc/java/class.c
+++ b/gcc/java/class.c
@@ -1151,6 +1151,7 @@ static tree
make_method_value (mdecl)
tree mdecl;
{
+ static int method_name_count = 0;
tree minit;
tree code;
#define ACC_TRANSLATED 0x4000
@@ -1173,6 +1174,44 @@ make_method_value (mdecl)
}
PUSH_FIELD_VALUE (minit, "accflags", build_int_2 (accflags, 0));
PUSH_FIELD_VALUE (minit, "ncode", code);
+
+ {
+ /* Compute the `throws' information for the method. */
+ tree table = integer_zero_node;
+ if (DECL_FUNCTION_THROWS (mdecl) != NULL_TREE)
+ {
+ int length = 1 + list_length (DECL_FUNCTION_THROWS (mdecl));
+ tree iter, type, array;
+ char buf[60];
+
+ table = tree_cons (NULL_TREE, table, NULL_TREE);
+ for (iter = DECL_FUNCTION_THROWS (mdecl);
+ iter != NULL_TREE;
+ iter = TREE_CHAIN (iter))
+ {
+ tree sig = build_java_signature (TREE_VALUE (iter));
+ tree utf8
+ = build_utf8_ref (unmangle_classname (IDENTIFIER_POINTER (sig),
+ IDENTIFIER_LENGTH (sig)));
+ table = tree_cons (NULL_TREE, utf8, table);
+ }
+ type = build_prim_array_type (ptr_type_node, length);
+ table = build (CONSTRUCTOR, type, NULL_TREE, table);
+ /* Compute something unique enough. */
+ sprintf (buf, "_methods%d", method_name_count++);
+ array = build_decl (VAR_DECL, get_identifier (buf), type);
+ DECL_INITIAL (array) = table;
+ TREE_STATIC (array) = 1;
+ DECL_ARTIFICIAL (array) = 1;
+ DECL_IGNORED_P (array) = 1;
+ rest_of_decl_compilation (array, (char*) 0, 1, 0);
+
+ table = build1 (ADDR_EXPR, ptr_type_node, array);
+ }
+
+ PUSH_FIELD_VALUE (minit, "throws", table);
+ }
+
FINISH_RECORD_CONSTRUCTOR (minit);
return minit;
}
diff --git a/gcc/java/decl.c b/gcc/java/decl.c
index ecfa9aa..21cc3bd 100644
--- a/gcc/java/decl.c
+++ b/gcc/java/decl.c
@@ -715,6 +715,7 @@ init_decl_processing ()
PUSH_FIELD (method_type_node, field, "signature", utf8const_ptr_type);
PUSH_FIELD (method_type_node, field, "accflags", access_flags_type_node);
PUSH_FIELD (method_type_node, field, "ncode", nativecode_ptr_type_node);
+ PUSH_FIELD (method_type_node, field, "throws", ptr_type_node);
FINISH_RECORD (method_type_node);
build_decl (TYPE_DECL, get_identifier ("Method"), method_type_node);