diff options
author | aph <aph@138bc75d-0d04-0410-961f-82ee72b054a4> | 2003-10-24 09:29:43 +0000 |
---|---|---|
committer | aph <aph@138bc75d-0d04-0410-961f-82ee72b054a4> | 2003-10-24 09:29:43 +0000 |
commit | e164eae76e4e677e729d62cf39e1c51e4ef7f311 (patch) | |
tree | 8c726fb42c811bb6652ba1a759bae78c2c8d9378 /gcc/java/except.c | |
parent | aeac46d4895e26ae7c0fb8976229512eaa26a922 (diff) | |
download | gcc-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.c | 48 |
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; } |