summaryrefslogtreecommitdiff
path: root/gcc/java/except.c
diff options
context:
space:
mode:
authoraph <aph@138bc75d-0d04-0410-961f-82ee72b054a4>2003-10-24 09:29:43 +0000
committeraph <aph@138bc75d-0d04-0410-961f-82ee72b054a4>2003-10-24 09:29:43 +0000
commite164eae76e4e677e729d62cf39e1c51e4ef7f311 (patch)
tree8c726fb42c811bb6652ba1a759bae78c2c8d9378 /gcc/java/except.c
parentaeac46d4895e26ae7c0fb8976229512eaa26a922 (diff)
downloadgcc-e164eae76e4e677e729d62cf39e1c51e4ef7f311.tar.gz
2003-10-22 Andrew Haley <aph@redhat.com>
* lang.c (LANG_HOOKS_GET_CALLEE_FNDECL): New. (java_get_callee_fndecl): New. * jcf-parse.c (java_parse_file): Call emit_catch_table(). * java-tree.h (ctable_decl): New. (catch_classes): New. (java_tree_index): Add JTI_CTABLE_DECL, JTI_CATCH_CLASSES. * decl.c (java_init_decl_processing): Add catch_class_type. Add ctable_decl. Add catch_classes field. * class.c (build_indirect_class_ref): Break out from build_class_ref. (make_field_value): Check flag_indirect_dispatch. (make_class_data): Ditto. Tidy uses of PUSH_FIELD_VALUE. Add field catch_classes. (make_catch_class_record): New. * java-tree.h (PUSH_FIELD_VALUE): Tidy. 2003-10-22 Andrew Haley <aph@redhat.com> * java/lang/natClass.cc (initializeClass): Call _Jv_linkExceptionClassTable. (_Jv_LinkSymbolTable): Call )_Jv_ThrowNoSuchMethodError. Call _Jv_Defer_Resolution on a method whose ncode is NULL. (_Jv_linkExceptionClassTable): New function. (_Jv_LayoutVTableMethods): If superclass looks like a constant pool entry, look it up. * java/lang/Class.h (struct _Jv_CatchClass): New. (_Jv_linkExceptionClassTable): New friend. (_Jv_Defer_Resolution): New friend. (class Class.catch_classes): New field. * include/java-interp.h (Jv_Defer_Resolution): New method. (_Jv_PrepareClass): Make a friend of _Jv_MethodBase. (_Jv_MethodBase.deferred): New field. (_Jv_Defer_Resolution): New function. * resolve.cc (_Jv_PrepareClass): Resolve deferred handlers. * exception.cc (get_ttype_entry): Change return type to void**. (PERSONALITY_FUNCTION): Remove all code related to using a Utf8Const* for a match type. Change match type to be a pointer to a pointer, rather than a pointer to a Class. * defineclass.cc (handleCodeAttribute): Initialize method->deferred. (handleMethodsEnd): Likewise. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@72886 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/java/except.c')
-rw-r--r--gcc/java/except.c48
1 files changed, 27 insertions, 21 deletions
diff --git a/gcc/java/except.c b/gcc/java/except.c
index 6aeff65ea25..dc97b42fabf 100644
--- a/gcc/java/except.c
+++ b/gcc/java/except.c
@@ -313,46 +313,52 @@ prepare_eh_table_type (tree type)
{
tree exp;
- /* The "type" (metch_info) in a (Java) exception table is one:
+ /* The "type" (match_info) in a (Java) exception table is a pointer to:
* a) NULL - meaning match any type in a try-finally.
- * b) a pointer to a (compiled) class (low-order bit 0).
- * c) a pointer to the Utf8Const name of the class, plus one
- * (which yields a value with low-order bit 1). */
+ * b) a pointer to a pointer to a class.
+ * c) a pointer to a pointer to a utf8_ref. The pointer is
+ * rewritten to point to the appropriate class. */
if (type == NULL_TREE)
exp = NULL_TREE;
- else if (is_compiled_class (type))
- exp = build_class_ref (type);
+ else if (is_compiled_class (type) && !flag_indirect_dispatch)
+ {
+ char buf[64];
+ tree decl;
+ sprintf (buf, "%s_ref",
+ IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (type))));
+ decl = build_decl (VAR_DECL, get_identifier (buf), ptr_type_node);
+ TREE_STATIC (decl) = 1;
+ DECL_ARTIFICIAL (decl) = 1;
+ DECL_IGNORED_P (decl) = 1;
+ TREE_READONLY (decl) = 1;
+ TREE_THIS_VOLATILE (decl) = 0;
+ DECL_INITIAL (decl) = build_class_ref (type);
+ layout_decl (decl, 0);
+ pushdecl (decl);
+ rest_of_decl_compilation (decl, (char*) 0, global_bindings_p (), 0);
+ make_decl_rtl (decl, (char*) 0);
+ exp = build1 (ADDR_EXPR, ptr_type_node, decl);
+ }
else
{
- tree ctype = make_node (RECORD_TYPE);
- tree field = NULL_TREE;
- tree cinit, decl;
+ tree decl;
tree utf8_ref = build_utf8_ref (DECL_NAME (TYPE_NAME (type)));
char buf[64];
sprintf (buf, "%s_ref",
IDENTIFIER_POINTER (DECL_NAME (TREE_OPERAND (utf8_ref, 0))));
- PUSH_FIELD (ctype, field, "dummy", ptr_type_node);
- PUSH_FIELD (ctype, field, "utf8", utf8const_ptr_type);
- FINISH_RECORD (ctype);
- START_RECORD_CONSTRUCTOR (cinit, ctype);
- PUSH_FIELD_VALUE (cinit, "dummy",
- convert (ptr_type_node, integer_minus_one_node));
- PUSH_FIELD_VALUE (cinit, "utf8", utf8_ref);
- FINISH_RECORD_CONSTRUCTOR (cinit);
- TREE_CONSTANT (cinit) = 1;
- decl = build_decl (VAR_DECL, get_identifier (buf), ctype);
+ decl = build_decl (VAR_DECL, get_identifier (buf), utf8const_ptr_type);
TREE_STATIC (decl) = 1;
DECL_ARTIFICIAL (decl) = 1;
DECL_IGNORED_P (decl) = 1;
TREE_READONLY (decl) = 1;
TREE_THIS_VOLATILE (decl) = 0;
- DECL_INITIAL (decl) = cinit;
layout_decl (decl, 0);
pushdecl (decl);
rest_of_decl_compilation (decl, (char*) 0, global_bindings_p (), 0);
make_decl_rtl (decl, (char*) 0);
- exp = build1 (ADDR_EXPR, build_pointer_type (ctype), decl);
+ exp = build1 (ADDR_EXPR, build_pointer_type (utf8const_ptr_type), decl);
+ catch_classes = tree_cons (NULL, make_catch_class_record (exp, utf8_ref), catch_classes);
}
return exp;
}