Report actual SEH code on Windows instead of 'signal 11'

db4
Slava Pestov 2009-04-20 01:55:27 -05:00
parent 1c68b389cc
commit 5ac1358aea
4 changed files with 7 additions and 19 deletions

6
vm/bignum.c Normal file → Executable file
View File

@ -170,7 +170,7 @@ bignum_divide(bignum_type numerator, bignum_type denominator,
{ {
if (BIGNUM_ZERO_P (denominator)) if (BIGNUM_ZERO_P (denominator))
{ {
divide_by_zero_error(NULL); divide_by_zero_error();
return; return;
} }
if (BIGNUM_ZERO_P (numerator)) if (BIGNUM_ZERO_P (numerator))
@ -242,7 +242,7 @@ bignum_quotient(bignum_type numerator, bignum_type denominator)
{ {
if (BIGNUM_ZERO_P (denominator)) if (BIGNUM_ZERO_P (denominator))
{ {
divide_by_zero_error(NULL); divide_by_zero_error();
return (BIGNUM_OUT_OF_BAND); return (BIGNUM_OUT_OF_BAND);
} }
if (BIGNUM_ZERO_P (numerator)) if (BIGNUM_ZERO_P (numerator))
@ -295,7 +295,7 @@ bignum_remainder(bignum_type numerator, bignum_type denominator)
{ {
if (BIGNUM_ZERO_P (denominator)) if (BIGNUM_ZERO_P (denominator))
{ {
divide_by_zero_error(NULL); divide_by_zero_error();
return (BIGNUM_OUT_OF_BAND); return (BIGNUM_OUT_OF_BAND);
} }
if (BIGNUM_ZERO_P (numerator)) if (BIGNUM_ZERO_P (numerator))

View File

@ -124,9 +124,9 @@ void signal_error(int signal, F_STACK_FRAME *native_stack)
general_error(ERROR_SIGNAL,tag_fixnum(signal),F,native_stack); general_error(ERROR_SIGNAL,tag_fixnum(signal),F,native_stack);
} }
void divide_by_zero_error(F_STACK_FRAME *native_stack) void divide_by_zero_error(void)
{ {
general_error(ERROR_DIVIDE_BY_ZERO,F,F,native_stack); general_error(ERROR_DIVIDE_BY_ZERO,F,F,NULL);
} }
void memory_signal_handler_impl(void) void memory_signal_handler_impl(void)
@ -134,11 +134,6 @@ void memory_signal_handler_impl(void)
memory_protection_error(signal_fault_addr,signal_callstack_top); memory_protection_error(signal_fault_addr,signal_callstack_top);
} }
void divide_by_zero_signal_handler_impl(void)
{
divide_by_zero_error(signal_callstack_top);
}
void misc_signal_handler_impl(void) void misc_signal_handler_impl(void)
{ {
signal_error(signal_number,signal_callstack_top); signal_error(signal_number,signal_callstack_top);

View File

@ -26,7 +26,7 @@ void primitive_die(void);
void throw_error(CELL error, F_STACK_FRAME *native_stack); void throw_error(CELL error, F_STACK_FRAME *native_stack);
void general_error(F_ERRORTYPE error, CELL arg1, CELL arg2, F_STACK_FRAME *native_stack); void general_error(F_ERRORTYPE error, CELL arg1, CELL arg2, F_STACK_FRAME *native_stack);
void divide_by_zero_error(F_STACK_FRAME *native_stack); void divide_by_zero_error(void);
void memory_protection_error(CELL addr, F_STACK_FRAME *native_stack); void memory_protection_error(CELL addr, F_STACK_FRAME *native_stack);
void signal_error(int signal, F_STACK_FRAME *native_stack); void signal_error(int signal, F_STACK_FRAME *native_stack);
void type_error(CELL type, CELL tagged); void type_error(CELL type, CELL tagged);
@ -53,7 +53,6 @@ CELL signal_fault_addr;
void *signal_callstack_top; void *signal_callstack_top;
void memory_signal_handler_impl(void); void memory_signal_handler_impl(void);
void divide_by_zero_signal_handler_impl(void);
void misc_signal_handler_impl(void); void misc_signal_handler_impl(void);
void primitive_unimplemented(void); void primitive_unimplemented(void);

View File

@ -23,12 +23,6 @@ long exception_handler(PEXCEPTION_POINTERS pe)
signal_fault_addr = e->ExceptionInformation[1]; signal_fault_addr = e->ExceptionInformation[1];
c->EIP = (CELL)memory_signal_handler_impl; c->EIP = (CELL)memory_signal_handler_impl;
} }
else if(e->ExceptionCode == EXCEPTION_FLT_DIVIDE_BY_ZERO
|| e->ExceptionCode == EXCEPTION_INT_DIVIDE_BY_ZERO)
{
signal_number = ERROR_DIVIDE_BY_ZERO;
c->EIP = (CELL)divide_by_zero_signal_handler_impl;
}
/* If the Widcomm bluetooth stack is installed, the BTTray.exe process /* If the Widcomm bluetooth stack is installed, the BTTray.exe process
injects code into running programs. For some reason this results in injects code into running programs. For some reason this results in
random SEH exceptions with this (undocumented) exception code being random SEH exceptions with this (undocumented) exception code being
@ -37,7 +31,7 @@ long exception_handler(PEXCEPTION_POINTERS pe)
this exception means. */ this exception means. */
else if(e->ExceptionCode != 0x40010006) else if(e->ExceptionCode != 0x40010006)
{ {
signal_number = 11; signal_number = e->ExceptionCode;
c->EIP = (CELL)misc_signal_handler_impl; c->EIP = (CELL)misc_signal_handler_impl;
} }