aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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);