From 0f887e2e1f0a29b8ec3e1d5323c9b67a98f1d065 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Fredrik=20H=C3=BCbinette=20=28Hubbe=29?= <hubbe@hubbe.net>
Date: Mon, 12 Aug 1996 18:34:43 +0200
Subject: [PATCH] added stack_size variable

Rev: src/interpret.c:1.13
Rev: src/interpret.h:1.5
---
 src/interpret.c | 51 +++++++++++++++++++++++++------------------------
 src/interpret.h |  1 +
 2 files changed, 27 insertions(+), 25 deletions(-)

diff --git a/src/interpret.c b/src/interpret.c
index 30b3c004f4..b981692d0a 100644
--- a/src/interpret.c
+++ b/src/interpret.c
@@ -38,8 +38,6 @@
 #ifdef MMAP_NORESERV
 #define USE_MMAP_FOR_STACK
 
-/* Fixme: just multiplying by 32 is not what we want /Hubbe */
-#define EVALUATOR_STACK_SIZE EVALUATOR_STACK_SIZE*32
 #endif
 #endif
 
@@ -51,6 +49,7 @@
  */
 struct svalue *sp;     /* Current position */
 struct svalue *evaluator_stack; /* Start of stack */
+int stack_size = EVALUATOR_STACK_SIZE;
 
 /* mark stack, used to store markers into the normal stack */
 struct svalue **mark_sp; /* Current position */
@@ -81,15 +80,15 @@ void init_interpreter()
 
 #define MMALLOC(X,Y) (Y *)mmap(0,X*sizeof(Y),PROT_READ|PROT_WRITE, MAP_NORESERV | MAP_PRIVATE | MAP_ANONYMOUS, fd, 0)
 
-  evaluator_stack=MMALLOC(EVALUATOR_STACK_SIZE,struct svalue);
-  mark_stack=MMALLOC(EVALUATOR_STACK_SIZE, struct svalue *);
+  evaluator_stack=MMALLOC(stack_size,struct svalue);
+  mark_stack=MMALLOC(stack_size, struct svalue *);
 
   if(fd != -1) close(fd);
 
   if(!evaluator_stack || !mark_sp) fatal("Failed to mmap() stack space.\n");
 #else
-  evaluator_stack=(struct svalue *)malloc(EVALUATOR_STACK_SIZE*sizeof(struct svalue));
-  mark_stack=(struct svalue **)malloc(EVALUATOR_STACK_SIZE*sizeof(struct svalue *));
+  evaluator_stack=(struct svalue *)malloc(stack_size*sizeof(struct svalue));
+  mark_stack=(struct svalue **)malloc(stack_size*sizeof(struct svalue *));
 #endif
   sp=evaluator_stack;
   mark_sp=mark_stack;
@@ -101,13 +100,13 @@ void exit_interpreter()
 
 void check_stack(INT32 size)
 {
-  if(sp - evaluator_stack + size >= EVALUATOR_STACK_SIZE)
+  if(sp - evaluator_stack + size >= stack_size)
     error("Stack overflow.\n");
 }
 
 void check_mark_stack(INT32 size)
 {
-  if(mark_sp - mark_stack + size >= EVALUATOR_STACK_SIZE)
+  if(mark_sp - mark_stack + size >= stack_size)
     error("Stack overflow.\n");
 }
 
@@ -423,7 +422,7 @@ static void eval_instruction(unsigned char *pc)
     if(sp<evaluator_stack || mark_sp < mark_stack || fp->locals>sp)
       fatal("Stack error (generic).\n");
 
-    if(sp > evaluator_stack+EVALUATOR_STACK_SIZE)
+    if(sp > evaluator_stack+stack_size)
       fatal("Stack error (overflow).\n");
 
     if(fp->fun>=0 && fp->current_object->prog &&
@@ -455,7 +454,7 @@ static void eval_instruction(unsigned char *pc)
 	set_nonblocking(2,0);
 
       file=get_line(pc-1,fp->context.prog,&linep);
-      while((f=strchr(file,'/'))) file=f+1;
+      while((f=STRCHR(file,'/'))) file=f+1;
       fprintf(stderr,"- %s:%4ld:(%lx): %-25s %4ld %4ld\n",
 	      file,(long)linep,
 	      (long)(pc-fp->context.prog->program-1),
@@ -1131,7 +1130,7 @@ void apply_low(struct object *o, int fun, int args)
     if(fp && fp->pc)
     {
       file=get_line(fp->pc,fp->context.prog,&linep);
-      while((f=strchr(file,'/'))) file=f+1;
+      while((f=STRCHR(file,'/'))) file=f+1;
     }else{
       linep=0;
       file="-";
@@ -1171,11 +1170,10 @@ void apply_low(struct object *o, int fun, int args)
 
   if(function->flags & IDENTIFIER_C_FUNCTION)
   {
-#if 0
-    function->func.c_fun(args);
-#else
-    (*function->func.c_fun)(args);
+#ifdef DEBUG
+    if(d_flag) check_signals();
 #endif
+    (*function->func.c_fun)(args);
   }else{
     int num_args;
     int num_locals;
@@ -1352,7 +1350,7 @@ void strict_apply_svalue(struct svalue *s, INT32 args)
     if(fp && fp->pc)
     {
       file=get_line(fp->pc,fp->context.prog,&linep);
-      while((f=strchr(file,'/'))) file=f+1;
+      while((f=STRCHR(file,'/'))) file=f+1;
     }else{
       linep=0;
       file="-";
@@ -1463,10 +1461,10 @@ void slow_check_stack()
 
   debug_check_stack();
 
-  if(sp > &(evaluator_stack[EVALUATOR_STACK_SIZE]))
+  if(sp > &(evaluator_stack[stack_size]))
     fatal("Stack overflow\n");
 
-  if(mark_sp > &(mark_stack[EVALUATOR_STACK_SIZE]))
+  if(mark_sp > &(mark_stack[stack_size]))
     fatal("Mark stack overflow.\n");
 
   if(mark_sp < mark_stack)
@@ -1483,17 +1481,20 @@ void slow_check_stack()
     s=*m;
   }
 
-  if(s > &(evaluator_stack[EVALUATOR_STACK_SIZE]))
+  if(s > &(evaluator_stack[stack_size]))
     fatal("Mark stack exceeds svalue stack\n");
 
   for(f=fp;f;f=f->parent_frame)
   {
-    if(f->locals < evaluator_stack ||
-       f->locals > &(evaluator_stack[EVALUATOR_STACK_SIZE]))
+    if(f->locals)
+    {
+      if(f->locals < evaluator_stack ||
+	f->locals > &(evaluator_stack[stack_size]))
       fatal("Local variable pointer points to Finsp�ng.\n");
 
-    if(f->args < 0 || f->args > EVALUATOR_STACK_SIZE)
-      fatal("FEL FEL FEL! HELP!! (corrupted frame)\n");
+      if(f->args < 0 || f->args > stack_size)
+	fatal("FEL FEL FEL! HELP!! (corrupted frame)\n");
+    }
   }
 }
 #endif
@@ -1525,8 +1526,8 @@ void cleanup_interpret()
   reset_evaluator();
 
 #ifdef USE_MMAP_FOR_STACK
-  munmap((char *)evaluator_stack, EVALUATOR_STACK_SIZE*sizeof(struct svalue));
-  munmap((char *)mark_stack, EVALUATOR_STACK_SIZE*sizeof(struct svalue *));
+  munmap((char *)evaluator_stack, stack_size*sizeof(struct svalue));
+  munmap((char *)mark_stack, stack_size*sizeof(struct svalue *));
 #else
   free((char *)evaluator_stack);
   free((char *)mark_stack);
diff --git a/src/interpret.h b/src/interpret.h
index ed2bf26332..1b0bc3b0d7 100644
--- a/src/interpret.h
+++ b/src/interpret.h
@@ -100,5 +100,6 @@ extern struct svalue **mark_sp;
 extern struct svalue *evaluator_stack;
 extern struct svalue **mark_stack;
 extern struct frame *fp; /* frame pointer */
+extern int stack_size;
 #endif
 
-- 
GitLab