filter exception handlers by catch_type

This commit is contained in:
Zack Buhman 2025-01-05 23:29:05 -06:00
parent e163621ebe
commit 832c182471
7 changed files with 63 additions and 13 deletions

View File

@ -7,7 +7,7 @@ CC ?= gcc
ARCH = -m32 ARCH = -m32
CFLAGS += -Wall -Werror -Wfatal-errors -Wno-error=unused-variable -fstack-protector -std=c2x -g CFLAGS += -Wall -Werror -Wfatal-errors -Wno-error=unused-variable -fstack-protector -std=c2x -g
CFLAGS += -DDEBUG CFLAGS += -DDEBUG
CFLAGS += -DDEBUG_PRINT #CFLAGS += -DDEBUG_PRINT
LDFLAGS = -lm LDFLAGS = -lm
OPT ?= -O0 OPT ?= -O0
DEPFLAGS = -MMD -MP DEPFLAGS = -MMD -MP

View File

@ -464,6 +464,8 @@ struct method_entry class_resolver_lookup_method_from_interfacemethodref_index(i
assert(class_entry != nullptr); assert(class_entry != nullptr);
} }
print__class_file__class_name(objectref_class_entry->class_file);
printc('\n');
assert(!"interfacemethodref method does not exist"); assert(!"interfacemethodref method does not exist");
} }

View File

@ -39,6 +39,13 @@ void debug_print__method_info__method_name(struct class_file * class_file, struc
debug_print__constant__method_name(method_name_constant, method_descriptor_constant); debug_print__constant__method_name(method_name_constant, method_descriptor_constant);
} }
void print__string(const uint8_t * bytes, int length)
{
for (int i = 0; i < length; i++) {
printc(bytes[i]);
}
}
void print__constant__utf8_string(struct constant * constant) void print__constant__utf8_string(struct constant * constant)
{ {
assert(constant->tag == CONSTANT_Utf8); assert(constant->tag == CONSTANT_Utf8);

View File

@ -9,6 +9,7 @@ void debug_print__class_file__class_name(struct class_file * class_file);
void debug_print__constant__method_name(struct constant * name_constant, struct constant * descriptor_constant); void debug_print__constant__method_name(struct constant * name_constant, struct constant * descriptor_constant);
void debug_print__method_info__method_name(struct class_file * class_file, struct method_info * method_info); void debug_print__method_info__method_name(struct class_file * class_file, struct method_info * method_info);
void print__string(const uint8_t * bytes, int length);
void print__constant__utf8_string(struct constant * constant); void print__constant__utf8_string(struct constant * constant);
void print__class_file__class_name(struct class_file * class_file); void print__class_file__class_name(struct class_file * class_file);
void print__constant__method_name(struct constant * name_constant, struct constant * descriptor_constant); void print__constant__method_name(struct constant * name_constant, struct constant * descriptor_constant);

View File

@ -497,7 +497,14 @@ void vm_exception(struct vm * vm, int32_t * objectref)
while (vm->frame_stack.ix > 0) { while (vm->frame_stack.ix > 0) {
for (int i = 0; i < vm->current_frame->code_attribute->exception_table_length; i++) { for (int i = 0; i < vm->current_frame->code_attribute->exception_table_length; i++) {
struct exception_table_entry * entry = &vm->current_frame->code_attribute->exception_table[i]; struct exception_table_entry * entry = &vm->current_frame->code_attribute->exception_table[i];
if (vm->current_frame->pc >= entry->start_pc && vm->current_frame->pc < entry->end_pc) { bool caught =
vm->current_frame->pc >= entry->start_pc &&
vm->current_frame->pc < entry->end_pc &&
exception_class_entry == class_resolver_lookup_class_from_class_index(vm->class_hash_table.length,
vm->class_hash_table.entry,
vm->current_frame->class_entry,
entry->catch_type);
if (caught) {
operand_stack_push_u32(vm->current_frame, (uint32_t)objectref); operand_stack_push_u32(vm->current_frame, (uint32_t)objectref);
vm->current_frame->next_pc = entry->handler_pc; vm->current_frame->next_pc = entry->handler_pc;
@ -515,10 +522,27 @@ void vm_exception(struct vm * vm, int32_t * objectref)
vm->current_frame = stack_pop_frame(&vm->frame_stack, 1); vm->current_frame = stack_pop_frame(&vm->frame_stack, 1);
} }
prints("exception: ");
print__class_file__class_name(exception_class_entry->class_file);
printc('\n');
{
int32_t * string_objectref = (int32_t *)objectref[2];
if (string_objectref != nullptr) {
prints(" message: ");
struct class_entry * string_class_entry = (struct class_entry *)string_objectref[0];
prints("(class: ");
print__class_file__class_name(string_class_entry->class_file);
printc(')');
prints("\n ");
int32_t * arrayref = (int32_t *)string_objectref[1];
int32_t length = arrayref[0];
uint8_t * bytes = (uint8_t *)&arrayref[1];
print__string(bytes, length);
printc('\n');
}
}
assert(objectref[1] != 0); assert(objectref[1] != 0);
backtrace_print((struct backtrace *)objectref[1]); backtrace_print((struct backtrace *)objectref[1]);
assert(!"exception");
} }
static void print_vm_stack(struct vm * vm) static void print_vm_stack(struct vm * vm)

View File

@ -48,6 +48,10 @@ public class PrintStream
write(String.valueOf(obj)); write(String.valueOf(obj));
} }
public void print(String s) {
write(String.valueOf(s));
}
public void println() { public void println() {
write(newline); write(newline);
} }
@ -91,4 +95,9 @@ public class PrintStream
write(String.valueOf(obj)); write(String.valueOf(obj));
write(newline); write(newline);
} }
public void println(String s) {
write(String.valueOf(s));
write(newline);
}
} }

View File

@ -1,20 +1,27 @@
package p; package p;
class Exception2 extends Exception {
public Exception2(String message) {
super(message);
}
}
class TestException { class TestException {
static void test2() throws Exception { static void test2() throws Exception2 {
throw new Exception("asdf exception"); throw new Exception2("asdf exception");
} }
static void test() throws Exception { static void test() throws Exception2 {
// try { try {
test2(); test2();
//} catch (Exception e) { } catch (Exception e) {
//System.out.println(e); System.out.print("exception handler: ");
//throw e; System.out.println(e);
//} throw e;
}
} }
public static void main() throws Exception { public static void main() throws Exception2 {
test(); test();
} }
} }