* init.c (scm_boot_guile): Add level of indirection to
authorJim Blandy <jimb@red-bean.com>
Sat, 5 Oct 1996 17:47:51 +0000 (17:47 +0000)
committerJim Blandy <jimb@red-bean.com>
Sat, 5 Oct 1996 17:47:51 +0000 (17:47 +0000)
scm_boot_guile_1() to ensure that stack base pointer is properly
initialized.  There was no guarantee that variable i was the
highest/lowest variable on stack (i.e. the call frame of
scm_boot_guile was not completely protected from gc).

libguile/init.c

index ed138a0..07b4328 100644 (file)
@@ -316,6 +316,13 @@ typedef long setjmp_type;
  *                          prohibited.
  */
 
+static int scm_boot_guile_1 SCM_P ((SCM_STACKITEM *base,
+                                   char **result,
+                                   int argc, char **argv,
+                                   FILE *in, FILE *out, FILE *err,
+                                   void (*init_func) (),
+                                   char *boot_cmd));
+
 int
 scm_boot_guile (result, argc, argv, in, out, err, init_func, boot_cmd)
      char ** result;
@@ -326,10 +333,27 @@ scm_boot_guile (result, argc, argv, in, out, err, init_func, boot_cmd)
      FILE * err;
      void (*init_func) ();
      char * boot_cmd;
+{
+  SCM_STACKITEM dummy;
+
+  return scm_boot_guile_1 (&dummy, result, argc, argv, in, out, err, 
+                          init_func, boot_cmd);
+}
+
+static int
+scm_boot_guile_1 (base, result, argc, argv, in, out, err, init_func, boot_cmd)
+     SCM_STACKITEM *base;
+     char ** result;
+     int argc;
+     char ** argv;
+     FILE * in;
+     FILE * out;
+     FILE * err;
+     void (*init_func) ();
+     char * boot_cmd;
 {
   static int initialized = 0;
   static int live = 0;
-  SCM_STACKITEM i;
   setjmp_type setjmp_val;
   int stat;
 
@@ -345,7 +369,7 @@ scm_boot_guile (result, argc, argv, in, out, err, init_func, boot_cmd)
   
   if (initialized)
     {
-      scm_restart_stack (&i);
+      scm_restart_stack (base);
     }
   else
     {
@@ -357,7 +381,7 @@ scm_boot_guile (result, argc, argv, in, out, err, init_func, boot_cmd)
 #ifdef USE_THREADS
       scm_init_threads (&i);
 #endif
-      scm_start_stack (&i, in, out, err);
+      scm_start_stack (base, in, out, err);
       scm_init_gsubr ();
       scm_init_feature ();
       scm_init_alist ();