Commit f2f3f409 by Andrew Haley Committed by Andrew Haley

[multiple changes]

2003-01-31  Andrew Haley  <aph@redhat.com>

	* except.c (prepare_eh_table_type): Use new encoding for exception
	handlers when using -fno-assume-compiled.

2003-08-20  Andrew Haley  <aph@redhat.com>

	* gnu/gcj/runtime/StackTrace.java (getClass): New method.
	* gnu/gcj/runtime/natStackTrace.cc (getClass): New method.
	(classAt): Break out class lookup function into getClass().
	* exception.cc (PERSONALITY_FUNCTION): Use new encoding for exception
	handlers when using -fno-assume-compiled.

From-SVN: r70605
parent 3e6d83ec
...@@ -324,10 +324,36 @@ prepare_eh_table_type (tree type) ...@@ -324,10 +324,36 @@ prepare_eh_table_type (tree type)
else if (is_compiled_class (type)) else if (is_compiled_class (type))
exp = build_class_ref (type); exp = build_class_ref (type);
else else
exp = fold (build {
(PLUS_EXPR, ptr_type_node, tree ctype = make_node (RECORD_TYPE);
build_utf8_ref (DECL_NAME (TYPE_NAME (type))), tree field = NULL_TREE;
size_one_node)); tree cinit, 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);
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);
}
return exp; return exp;
} }
......
2003-08-20 Andrew Haley <aph@redhat.com>
* gnu/gcj/runtime/StackTrace.java (getClass): New method.
* gnu/gcj/runtime/natStackTrace.cc (getClass): New method.
(classAt): Break out class lookup function into getClass().
* exception.cc (PERSONALITY_FUNCTION): Use new encoding for exception
handlers when using -fno-assume-compiled.
2003-08-20 Tom Tromey <tromey@redhat.com> 2003-08-20 Tom Tromey <tromey@redhat.com>
Fix for PR libgcj/9125: Fix for PR libgcj/9125:
......
...@@ -15,6 +15,9 @@ details. */ ...@@ -15,6 +15,9 @@ details. */
#include <java/lang/Class.h> #include <java/lang/Class.h>
#include <java/lang/NullPointerException.h> #include <java/lang/NullPointerException.h>
#include <gnu/gcj/runtime/StackTrace.h>
#include <gnu/gcj/runtime/MethodRef.h>
#include <gnu/gcj/RawData.h>
#include <gcj/cni.h> #include <gcj/cni.h>
#include <jvm.h> #include <jvm.h>
...@@ -335,10 +338,20 @@ PERSONALITY_FUNCTION (int version, ...@@ -335,10 +338,20 @@ PERSONALITY_FUNCTION (int version,
jclass catch_type = get_ttype_entry (context, &info, ar_filter); jclass catch_type = get_ttype_entry (context, &info, ar_filter);
// The catch_type is either a (java::lang::Class*) or typedef struct {
// is one more than a (Utf8Const*). int __attribute__ ((mode (pointer))) dummy;
if ((size_t)catch_type & 1) Utf8Const *utf8;
catch_type = _Jv_FindClass ((Utf8Const*)((size_t)catch_type ^ 1), NULL); } utf8_hdr;
utf8_hdr *p = (utf8_hdr *)catch_type;
if (p->dummy == -1)
{
using namespace gnu::gcj::runtime;
java::lang::Class *klass
= StackTrace::getClass ((gnu::gcj::RawData *)ip);
java::lang::ClassLoader *loader
= klass ? klass->getClassLoaderInternal () : NULL;
catch_type = _Jv_FindClass (p->utf8, loader);
}
if (_Jv_IsInstanceOf (xh->value, catch_type)) if (_Jv_IsInstanceOf (xh->value, catch_type))
{ {
......
...@@ -139,6 +139,8 @@ public final class StackTrace ...@@ -139,6 +139,8 @@ public final class StackTrace
return len; return len;
} }
public static native Class getClass(RawData ip);
private static native void update(); private static native void update();
private static MethodRef methodAtAddress(RawData addr) private static MethodRef methodAtAddress(RawData addr)
{ {
......
...@@ -124,6 +124,16 @@ gnu::gcj::runtime::StackTrace::getCompiledMethodRef (gnu::gcj::RawData *addr) ...@@ -124,6 +124,16 @@ gnu::gcj::runtime::StackTrace::getCompiledMethodRef (gnu::gcj::RawData *addr)
} }
java::lang::Class * java::lang::Class *
gnu::gcj::runtime::StackTrace::getClass (gnu::gcj::RawData *p)
{
gnu::gcj::runtime::MethodRef *ref = getCompiledMethodRef (p);
if (ref)
return ref->klass;
else
return NULL;
}
java::lang::Class *
gnu::gcj::runtime::StackTrace::classAt (jint n) gnu::gcj::runtime::StackTrace::classAt (jint n)
{ {
_Jv_frame_info *frame = GET_FRAME (n); _Jv_frame_info *frame = GET_FRAME (n);
...@@ -137,12 +147,7 @@ gnu::gcj::runtime::StackTrace::classAt (jint n) ...@@ -137,12 +147,7 @@ gnu::gcj::runtime::StackTrace::classAt (jint n)
} }
#endif // INTERPRETER #endif // INTERPRETER
gnu::gcj::runtime::MethodRef *ref return getClass ((gnu::gcj::RawData *)frame->addr);
= getCompiledMethodRef ((gnu::gcj::RawData *)frame->addr);
if (ref)
return ref->klass;
else
return NULL;
} }
java::lang::String* java::lang::String*
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment