From a6ee7caf97742f40bdfb9494d70d5f8350898f4d Mon Sep 17 00:00:00 2001
From: wlott <wlott>
Date: Wed, 28 Nov 1990 17:14:26 +0000
Subject: [PATCH] Added a boolean to enable calling into lisp to handle
 internal errors.  If said boolean is not set, just call the signal handler
 instead of INTERNAL-ERROR.

---
 ldb/interrupt.c | 55 ++++++++++++++++++++++++++++++++-----------------
 1 file changed, 36 insertions(+), 19 deletions(-)

diff --git a/ldb/interrupt.c b/ldb/interrupt.c
index b572d3684..88d7d7ff4 100644
--- a/ldb/interrupt.c
+++ b/ldb/interrupt.c
@@ -1,4 +1,4 @@
-/* $Header: /Volumes/share2/src/cmucl/cvs2git/cvsroot/src/ldb/Attic/interrupt.c,v 1.16 1990/11/27 10:05:06 wlott Exp $ */
+/* $Header: /Volumes/share2/src/cmucl/cvs2git/cvsroot/src/ldb/Attic/interrupt.c,v 1.17 1990/11/28 17:14:26 wlott Exp $ */
 
 /* Interrupt handing magic. */
 
@@ -16,6 +16,8 @@
 
 #define crap_out(msg) do { write(2, msg, sizeof(msg)); abort(); } while (0)
 
+boolean internal_errors_enabled = 0;
+
 struct sigcontext *lisp_interrupt_contexts[MAX_INTERRUPTS];
 
 union interrupt_handler interrupt_handlers[NSIG];
@@ -122,12 +124,17 @@ struct sigcontext *context;
     handler = interrupt_handlers[signal];
     were_in_lisp = !foreign_function_call_active;
     
+    if (handler.c == SIG_DFL || handler.c == SIG_IGN)
+	/* This can happen if someone tries to ignore or default on of the */
+	/* signals we need for runtime support. */
+	return;
+
     if (were_in_lisp)
         fake_foreign_function_call(context);
     
     /* Allow signals again. */
     sigsetmask(context->sc_mask);
-    
+
     if (LowtagOf(handler.lisp) == type_EvenFixnum ||
         LowtagOf(handler.lisp) == type_OddFixnum)
         (*handler.c)(signal, code, context);
@@ -246,26 +253,36 @@ struct sigcontext *context;
 	crap_out("%primitive halt called; the party is over.\n");
 
       case trap_Error:
-	sigsetmask(context->sc_mask);
-	fake_foreign_function_call(context);
-	args = current_control_stack_pointer;
-	current_control_stack_pointer += 2;
-	args[0] = alloc_sap(context);
-	args[1] = NIL;
-	call_into_lisp(INTERNAL_ERROR,SymbolFunction(INTERNAL_ERROR),args,2);
-	undo_fake_foreign_function_call(context);
+	if (internal_errors_enabled) {
+	    sigsetmask(context->sc_mask);
+	    fake_foreign_function_call(context);
+	    args = current_control_stack_pointer;
+	    current_control_stack_pointer += 2;
+	    args[0] = alloc_sap(context);
+	    args[1] = NIL;
+	    call_into_lisp(INTERNAL_ERROR, SymbolFunction(INTERNAL_ERROR),
+			   args, 2);
+	    undo_fake_foreign_function_call(context);
+	}
+	else
+	    handle_now(signal, code, context);
 	break;
 
       case trap_Cerror:
-	sigsetmask(context->sc_mask);
-	fake_foreign_function_call(context);
-	args = current_control_stack_pointer;
-	current_control_stack_pointer += 2;
-	args[0] = alloc_sap(context);
-	args[1] = T;
-	call_into_lisp(INTERNAL_ERROR,SymbolFunction(INTERNAL_ERROR),args,2);
-	undo_fake_foreign_function_call(context);
-	skip_instruction(context);
+	if (internal_errors_enabled) {
+	    sigsetmask(context->sc_mask);
+	    fake_foreign_function_call(context);
+	    args = current_control_stack_pointer;
+	    current_control_stack_pointer += 2;
+	    args[0] = alloc_sap(context);
+	    args[1] = T;
+	    call_into_lisp(INTERNAL_ERROR, SymbolFunction(INTERNAL_ERROR),
+			   args, 2);
+	    undo_fake_foreign_function_call(context);
+	    skip_instruction(context);
+	}
+	else
+	    handle_now(signal, code, context);
 	break;
 
       default:
-- 
GitLab