/* -*-C-*-
-$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/microcode/boot.c,v 9.50 1988/08/15 20:43:04 cph Exp $
+$Header: /Users/cph/tmp/foo/mit-scheme/mit-scheme/v7/src/microcode/boot.c,v 9.51 1988/09/29 04:51:09 jinx Exp $
Copyright (c) 1988 Massachusetts Institute of Technology
{-stack stack-size}
{-constant constant-size}
{-utabmd utab-filename} or {-utab utab-filename}
+ {-recover}
{other arguments ignored by the core microcode}
with filespec either {-band band-name} or {-fasl file-name} or
#include <ctype.h>
#endif
-#define STRING_SIZE 512
-#define BLOCKSIZE 1024
-#define blocks(n) ((n)*BLOCKSIZE)
+#define STRING_SIZE 512
+#define BLOCKSIZE 1024
+#define blocks(n) ((n)*BLOCKSIZE)
+#define unblocks(n) (((n) + (BLOCKSIZE - 1)) / BLOCKSIZE)
+#define MIN_HEAP_DELTA 50
/* Utilities for command line parsing */
\f
/* Used to test whether it is a dumped executable version */
-extern Boolean Was_Scheme_Dumped;
-Boolean Was_Scheme_Dumped = false;
+extern Boolean Was_Scheme_Dumped, Recover_Automatically;
+Boolean
+ Was_Scheme_Dumped = false,
+ Recover_Automatically = false;
int Saved_Heap_Size, Saved_Stack_Size, Saved_Constant_Size;
*cold_load_p = false;
*file_name = DEFAULT_BAND_NAME;
+ Recover_Automatically =
+ (Parse_Option("-recover", Saved_argc, Saved_argv, true) != NOT_THERE);
+
if (!Was_Scheme_Dumped)
{
Heap_Size = HEAP_SIZE;
Saved_argc = argc;
Saved_argv = argv;
+
find_image_parameters(&file_name, &cold_load_p, &supplied_p);
if (Was_Scheme_Dumped)
}
Command_Line_Hook();
-
Setup_Memory(blocks(Heap_Size), blocks(Stack_Size),
blocks(Constant_Size));
compiler_initialize((long) cold_load_p);
Microcode_Termination(code)
long code;
{
+ extern long death_blow;
extern char *Term_Messages[];
Pointer Term_Vector;
Boolean abnormal_p;
TC_VECTOR) &&
(Vector_Length(Term_Vector) > code))
{
- extern long death_blow;
Pointer Handler;
Handler = User_Vector_Ref(Term_Vector, code);
abnormal_p = false;
break;
+ case TERM_SIGNAL:
+ {
+ extern char *assassin_signal;
+
+ if (assassin_signal != ((char *) NULL))
+ printf("Killed by %s.\n", assassin_signal);
+ goto normal_termination;
+ }
+
case TERM_TRAP:
/* This claims not to be abnormal so that the user will
not be asked a second time about dumping core.
*/
value = 1;
abnormal_p = true;
+ if (death_blow == ERR_FASL_FILE_TOO_BIG)
+ {
+ extern void get_band_parameters();
+ long heap_size, const_size;
+
+ get_band_parameters(&heap_size, &const_size);
+ printf("Try again with values at least as large as\n");
+ printf(" -heap %d (%d + %d)\n",
+ (MIN_HEAP_DELTA + unblocks(heap_size)),
+ unblocks(heap_size), MIN_HEAP_DELTA);
+ printf(" -constant %d\n", unblocks(const_size));
+ }
break;
-
+\f
case TERM_NON_EXISTENT_CONTINUATION:
printf("Return code = 0x%lx\n", Fetch_Return());
goto normal_termination;