From 14795d175a44e80fa9bed1c5ef99944645198bdd Mon Sep 17 00:00:00 2001 From: tromey Date: Fri, 24 Aug 2001 17:24:02 +0000 Subject: [PATCH] * decl.c (init_decl_processing): Add `throws' field to method descriptor. * class.c (make_method_value): Compute `throws' field for method. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@45152 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/java/ChangeLog | 6 ++++++ gcc/java/class.c | 39 +++++++++++++++++++++++++++++++++++++++ gcc/java/decl.c | 1 + 3 files changed, 46 insertions(+) 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 + + * 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 * 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); -- 2.7.4