[INTERPRETER]

* BUG: Add a small reserved area in the stack for the Eval() function, so 
  that the debugger can return the contents of a variable after a stack 
  overflow without raising a new stack overflow error and then crashing.


git-svn-id: svn://localhost/gambas/trunk@6276 867c0c6c-44f3-4631-809d-bfa615b0a4ec
This commit is contained in:
Benoît Minisini 2014-05-18 21:39:52 +00:00
parent 123baa9b6f
commit 224bb2aed0
3 changed files with 12 additions and 3 deletions

View File

@ -104,6 +104,8 @@ bool EVAL_expression(EXPRESSION *expr, EVAL_FUNCTION func)
fprintf(stderr, "EVAL: %s\n", EVAL->source); fprintf(stderr, "EVAL: %s\n", EVAL->source);
#endif #endif
STACK_enable_for_eval();
nvar = EVAL->nvar; nvar = EVAL->nvar;
STACK_check(nvar); STACK_check(nvar);
@ -139,6 +141,7 @@ bool EVAL_expression(EXPRESSION *expr, EVAL_FUNCTION func)
} }
END_TRY END_TRY
STACK_disable_for_eval();
EXEC_debug = debug; EXEC_debug = debug;
return error; return error;
} }

View File

@ -68,9 +68,10 @@ void STACK_init(void)
STACK_process_stack_limit = (uintptr_t)&stack - max + 65536; STACK_process_stack_limit = (uintptr_t)&stack - max + 65536;
STACK_limit = (STACK_base + STACK_size); STACK_limit = STACK_base + STACK_size;
STACK_frame = (STACK_CONTEXT *)STACK_limit; STACK_frame = (STACK_CONTEXT *)STACK_limit;
STACK_frame_count = 0; STACK_frame_count = 0;
STACK_limit -= STACK_FOR_EVAL * sizeof(VALUE);
SP = (VALUE *)STACK_base; SP = (VALUE *)STACK_base;
} }

View File

@ -69,6 +69,8 @@ EXTERN uintptr_t STACK_process_stack_limit;
#endif #endif
#define STACK_FOR_EVAL 16
void STACK_init(void); void STACK_init(void);
void STACK_exit(void); void STACK_exit(void);
@ -119,7 +121,7 @@ STACK_CONTEXT *STACK_get_frame(int frame);
STACK_copy(STACK_frame, _context); \ STACK_copy(STACK_frame, _context); \
\ \
STACK_frame_count++; \ STACK_frame_count++; \
STACK_limit = (char *)STACK_frame; \ STACK_limit -= sizeof(STACK_CONTEXT); \
}) })
#define STACK_pop_frame(_context) \ #define STACK_pop_frame(_context) \
@ -127,7 +129,10 @@ STACK_CONTEXT *STACK_get_frame(int frame);
STACK_copy(_context, STACK_frame); \ STACK_copy(_context, STACK_frame); \
STACK_frame++; \ STACK_frame++; \
STACK_frame_count--; \ STACK_frame_count--; \
STACK_limit = (char *)STACK_frame; \ STACK_limit += sizeof(STACK_CONTEXT); \
}) })
#define STACK_enable_for_eval() STACK_limit += STACK_FOR_EVAL * sizeof(VALUE)
#define STACK_disable_for_eval() STACK_limit -= STACK_FOR_EVAL * sizeof(VALUE)
#endif #endif