mirror of
https://git.savannah.gnu.org/git/guile.git
synced 2025-05-20 11:40:18 +02:00
* init.c (scm_boot_guile): Add level of indirection to
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).
This commit is contained in:
parent
00fb6d20d9
commit
c275ddc708
1 changed files with 27 additions and 3 deletions
|
@ -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 ();
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue