+
+Tue Nov 9 17:30:20 CET 2004 Paolo Molaro <lupus@ximian.com>
+
+ * aot.c, mini.c, exceptions-ppc.c, exceptions-s390.c, exceptions-s390x.c,
+ mini-exceptions.c: update to exception clause structure changes.
+
2004-11-08 Zoltan Varga <vargaz@freemail.hu>
* exceptions-x86.c (throw_exception): Fix warnings.
if (ei->flags == MONO_EXCEPTION_CLAUSE_FILTER)
ei->data.filter = (guint8*)ei->data.filter + offset;
+ else
+ ei->data.catch_class = header->clauses [i].data.catch_class;
ei->try_start = (guint8*)ei->try_start + offset;
ei->try_end = (guint8*)ei->try_end + offset;
ei->handler_start = (guint8*)ei->handler_start + offset;
if (ei->flags == MONO_EXCEPTION_CLAUSE_FILTER)
ei->data.filter = code + *(guint32*)info;
else
- ei->data.token = *(guint32*)info;
+ ei->data.catch_class = ec->data.catch_class;
info += 4;
ei->try_start = code + *(guint32*)info;
info += 4;
if (ei->flags == MONO_EXCEPTION_CLAUSE_FILTER)
fprintf (tmpfp, "\t.long %d\n", (gint)((guint8*)ei->data.filter - code));
else
- /* fixme: tokens are not global */
- fprintf (tmpfp, "\t.long %d\n", ei->data.token);
+ /* the class is loaded from the header: optimize away later */
+ fprintf (tmpfp, "\t.long %d\n", 0);
fprintf (tmpfp, "\t.long %d\n", (gint)((guint8*)ei->try_start - code));
fprintf (tmpfp, "\t.long %d\n", (gint)((guint8*)ei->try_end - code));
filtered = call_filter (ctx, ei->data.filter, mono_ex);
if ((ei->flags == MONO_EXCEPTION_CLAUSE_NONE &&
- mono_object_isinst (obj, mono_class_get (ji->method->klass->image, ei->data.token))) || filtered) {
+ mono_object_isinst (obj, ei->data.catch_class)) || filtered) {
if (test_only) {
if (mono_ex) {
trace_ips = g_list_reverse (trace_ips);
filtered = call_filter (ctx, ei->data.filter, obj);
if ((ei->flags == MONO_EXCEPTION_CLAUSE_NONE) &&
- (mono_object_isinst (obj, mono_class_get (ji->method->klass->image, ei->data.token))) ||
+ (mono_object_isinst (obj, ei->data.catch_class)) ||
(filtered)) {
if (test_only) {
if (mono_ex) {
MONO_CONTEXT_GET_IP (ctx) <= ei->try_end) {
/* catch block */
if ((ei->flags == MONO_EXCEPTION_CLAUSE_NONE &&
- mono_object_isinst (obj, mono_class_get (ji->method->klass->image, ei->data.token))) ||
+ mono_object_isinst (obj, ei->data.catch_class)) ||
((ei->flags == MONO_EXCEPTION_CLAUSE_FILTER &&
call_filter (ctx, ei->data.filter, obj)))) {
if (test_only) {
}
if ((ei->flags == MONO_EXCEPTION_CLAUSE_NONE &&
- mono_object_isinst (obj, mono_class_get (ji->method->klass->image, ei->data.token))) || filtered) {
+ mono_object_isinst (obj, ei->data.catch_class)) || filtered) {
if (test_only) {
if (mono_ex) {
trace_ips = g_list_reverse (trace_ips);
/* first search for handlers and filters */
for (i = 0; i < header->num_clauses; ++i) {
clause = &header->clauses [i];
- if ((clause->flags & MONO_EXCEPTION_CLAUSE_FILTER) && (offset >= clause->token_or_filter) &&
- (offset < (clause->token_or_filter + filter_lengths [i])))
+ if ((clause->flags == MONO_EXCEPTION_CLAUSE_FILTER) && (offset >= clause->data.filter_offset) &&
+ (offset < (clause->data.filter_offset + filter_lengths [i])))
return ((i + 1) << 8) | MONO_REGION_FILTER | clause->flags;
if (MONO_OFFSET_IN_HANDLER (clause, offset)) {
tblock->in_stack [0] = cfg->exvar;
if (clause->flags == MONO_EXCEPTION_CLAUSE_FILTER) {
- GET_BBLOCK (cfg, bbhash, tblock, ip + clause->token_or_filter);
- tblock->real_offset = clause->token_or_filter;
+ GET_BBLOCK (cfg, bbhash, tblock, ip + clause->data.filter_offset);
+ tblock->real_offset = clause->data.filter_offset;
tblock->in_scount = 1;
tblock->in_stack = mono_mempool_alloc (cfg->mempool, sizeof (MonoInst*));
tblock->in_stack [0] = cfg->exvar;
for (cc = 0; cc < header->num_clauses; ++cc) {
clause = &header->clauses [cc];
if ((clause->flags & MONO_EXCEPTION_CLAUSE_FILTER) &&
- (!nearest || (clause->token_or_filter > nearest->token_or_filter))) {
+ (!nearest || (clause->data.filter_offset > nearest->data.filter_offset))) {
nearest = clause;
nearest_num = cc;
}
}
g_assert (nearest);
- filter_lengths [nearest_num] = (ip - header->code) - nearest->token_or_filter;
+ filter_lengths [nearest_num] = (ip - header->code) - nearest->data.filter_offset;
break;
}
ei->flags = ec->flags;
if (ei->flags == MONO_EXCEPTION_CLAUSE_FILTER) {
- tblock = g_hash_table_lookup (cfg->bb_hash, ip + ec->token_or_filter);
+ tblock = g_hash_table_lookup (cfg->bb_hash, ip + ec->data.filter_offset);
g_assert (tblock);
ei->data.filter = cfg->native_code + tblock->native_offset;
} else {
- ei->data.token = ec->token_or_filter;
+ ei->data.catch_class = ec->data.catch_class;
}
tblock = g_hash_table_lookup (cfg->bb_hash, ip + ec->try_offset);