2005-01-25
2005-01-25 18:01:24 by Henrik Grubbström (Grubba) <grubba@grubba.org>
-
ded049301b9ac2ce3a81578c5462edd5a5c247c0
(87 lines)
(+55/-32)
[
Show
| Annotate
]
Branch: 7.9
Added low_init_interpreter().
Rev: src/interpret.c:1.362
Rev: src/interpret.h:1.157
2:
|| This file is part of Pike. For copyright information see COPYRIGHT.
|| Pike is distributed under GPL, LGPL and MPL. See the file COPYING
|| for more information.
- || $Id: interpret.c,v 1.361 2004/12/30 13:44:20 grubba Exp $
+ || $Id: interpret.c,v 1.362 2005/01/25 18:01:24 grubba Exp $
*/
#include "global.h"
183:
*/
static int eval_instruction(PIKE_OPCODE_T *pc);
- PMOD_EXPORT void init_interpreter(void)
+ PMOD_EXPORT int low_init_interpreter(struct Pike_interpreter *interpreter)
{
#ifdef USE_MMAP_FOR_STACK
static int fd = -1;
-
+
#ifndef MAP_VARIABLE
#define MAP_VARIABLE 0
#endif
211:
if(fd >= 0) break;
if(errno != EINTR)
{
- Pike_interpreter.evaluator_stack=0;
- Pike_interpreter.mark_stack=0;
+ interpreter->evaluator_stack=0;
+ interpreter->mark_stack=0;
goto use_malloc;
#define NEED_USE_MALLOC_LABEL
}
222:
}
#endif
- #define MMALLOC(X,Y) (Y *)mmap(0,X*sizeof(Y),PROT_READ|PROT_WRITE, MAP_NORESERVE | MAP_PRIVATE | MAP_ANONYMOUS, fd, 0)
+ #define MMALLOC(X,Y) \
+ (Y *)mmap(0, (X)*sizeof(Y), PROT_READ|PROT_WRITE, \
+ MAP_NORESERVE|MAP_PRIVATE|MAP_ANONYMOUS, fd, 0)
- Pike_interpreter.evaluator_stack_malloced=0;
- Pike_interpreter.mark_stack_malloced=0;
- Pike_interpreter.evaluator_stack=MMALLOC(Pike_stack_size,struct svalue);
- Pike_interpreter.mark_stack=MMALLOC(Pike_stack_size, struct svalue *);
- if((char *)MAP_FAILED == (char *)Pike_interpreter.evaluator_stack) Pike_interpreter.evaluator_stack=0;
- if((char *)MAP_FAILED == (char *)Pike_interpreter.mark_stack) Pike_interpreter.mark_stack=0;
+ interpreter->evaluator_stack_malloced = 0;
+ interpreter->mark_stack_malloced = 0;
+ interpreter->evaluator_stack = MMALLOC(Pike_stack_size,struct svalue);
+ interpreter->mark_stack = MMALLOC(Pike_stack_size, struct svalue *);
+ if((char *)MAP_FAILED == (char *)interpreter->evaluator_stack) {
+ interpreter->evaluator_stack = 0;
+ interpreter->evaluator_stack_malloced = 1;
+ }
+ if((char *)MAP_FAILED == (char *)interpreter->mark_stack) {
+ interpreter->mark_stack = 0;
+ interpreter->mark_stack_malloced = 1;
+ }
#ifdef NEED_USE_MALLOC_LABEL
use_malloc:
#endif /* NEED_USE_MALLOC_LABEL */
#else /* !USE_MMAP_FOR_STACK */
- Pike_interpreter.evaluator_stack=0;
- Pike_interpreter.mark_stack=0;
+ interpreter->evaluator_stack = 0;
+ interpreter->evaluator_stack_malloced = 1;
+ interpreter->mark_stack = 0;
+ interpreter->mark_stack_malloced = 1;
#endif /* USE_MMAP_FOR_STACK */
- if(!Pike_interpreter.evaluator_stack)
+ if(!interpreter->evaluator_stack)
{
- Pike_interpreter.evaluator_stack=(struct svalue *)xalloc(Pike_stack_size*sizeof(struct svalue));
- Pike_interpreter.evaluator_stack_malloced=1;
+ if (!(interpreter->evaluator_stack =
+ (struct svalue *)malloc(Pike_stack_size*sizeof(struct svalue))))
+ return 1; /* Out of memory (evaluator stack). */
}
- if(!Pike_interpreter.mark_stack)
+ if(!interpreter->mark_stack)
{
- Pike_interpreter.mark_stack=(struct svalue **)xalloc(Pike_stack_size*sizeof(struct svalue *));
- Pike_interpreter.mark_stack_malloced=1;
+ if (!(interpreter->mark_stack =
+ (struct svalue **)malloc(Pike_stack_size*sizeof(struct svalue *))))
+ return 2; /* Out of memory (mark stack). */
}
- Pike_sp=Pike_interpreter.evaluator_stack;
- Pike_mark_sp=Pike_interpreter.mark_stack;
- Pike_fp=0;
+ interpreter->stack_pointer = interpreter->evaluator_stack;
+ interpreter->mark_stack_pointer = interpreter->mark_stack;
+ interpreter->frame_pointer = 0;
- Pike_interpreter.svalue_stack_margin = SVALUE_STACK_MARGIN;
- Pike_interpreter.c_stack_margin = C_STACK_MARGIN;
+ interpreter->svalue_stack_margin = SVALUE_STACK_MARGIN;
+ interpreter->c_stack_margin = C_STACK_MARGIN;
-
+ #ifdef PROFILING
+ interpreter->unlocked_time = 0;
+ interpreter->accounted_time = 0;
+ #endif
+
+ return 0; /* OK. */
+ }
+
+ PMOD_EXPORT void init_interpreter(void)
+ {
+ if (low_init_interpreter(&Pike_interpreter)) {
+ Pike_fatal("Out of memory initializing the interpreter stack.\n");
+ }
+
#ifdef PIKE_DEBUG
{
static struct callback *spcb;
269: Inside #if defined(PIKE_DEBUG)
}
}
#endif
- #ifdef PROFILING
- Pike_interpreter.unlocked_time = 0;
- Pike_interpreter.accounted_time = 0;
- #endif
+
#if defined(HAVE_COMPUTED_GOTO) || defined(PIKE_USE_MACHINE_CODE)
{
static int tables_need_init=1;
304:
#endif /* HAVE_COMPUTED_GOTO || PIKE_USE_MACHINE_CODE */
}
-
+
/*
* lvalues are stored in two svalues in one of these formats:
* array[index] : { array, index }
2835:
}
#endif
- if(Pike_interpreter.evaluator_stack) free((char *)Pike_interpreter.evaluator_stack);
- if(Pike_interpreter.mark_stack) free((char *)Pike_interpreter.mark_stack);
+ if(Pike_interpreter.evaluator_stack)
+ free((char *)Pike_interpreter.evaluator_stack);
+ if(Pike_interpreter.mark_stack)
+ free((char *)Pike_interpreter.mark_stack);
Pike_interpreter.mark_stack=0;
Pike_interpreter.evaluator_stack=0;