mirror of
https://git.savannah.gnu.org/git/guile.git
synced 2025-05-28 16:00:22 +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.
|
* 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
|
int
|
||||||
scm_boot_guile (result, argc, argv, in, out, err, init_func, boot_cmd)
|
scm_boot_guile (result, argc, argv, in, out, err, init_func, boot_cmd)
|
||||||
char ** result;
|
char ** result;
|
||||||
|
@ -326,10 +333,27 @@ scm_boot_guile (result, argc, argv, in, out, err, init_func, boot_cmd)
|
||||||
FILE * err;
|
FILE * err;
|
||||||
void (*init_func) ();
|
void (*init_func) ();
|
||||||
char * boot_cmd;
|
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 initialized = 0;
|
||||||
static int live = 0;
|
static int live = 0;
|
||||||
SCM_STACKITEM i;
|
|
||||||
setjmp_type setjmp_val;
|
setjmp_type setjmp_val;
|
||||||
int stat;
|
int stat;
|
||||||
|
|
||||||
|
@ -345,7 +369,7 @@ scm_boot_guile (result, argc, argv, in, out, err, init_func, boot_cmd)
|
||||||
|
|
||||||
if (initialized)
|
if (initialized)
|
||||||
{
|
{
|
||||||
scm_restart_stack (&i);
|
scm_restart_stack (base);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -357,7 +381,7 @@ scm_boot_guile (result, argc, argv, in, out, err, init_func, boot_cmd)
|
||||||
#ifdef USE_THREADS
|
#ifdef USE_THREADS
|
||||||
scm_init_threads (&i);
|
scm_init_threads (&i);
|
||||||
#endif
|
#endif
|
||||||
scm_start_stack (&i, in, out, err);
|
scm_start_stack (base, in, out, err);
|
||||||
scm_init_gsubr ();
|
scm_init_gsubr ();
|
||||||
scm_init_feature ();
|
scm_init_feature ();
|
||||||
scm_init_alist ();
|
scm_init_alist ();
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue