mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-04-14 15:21:01 +08:00
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
This commit is contained in:
parent
20787c010a
commit
66b461ce02
@ -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
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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);
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user