stacks.d: introduce function `si_reset_margin'

When stack overflow condition is risen, to throw cerror stack limit
has to be raised by pre-allocated margin. This function resets stack
limit to original value. The only argument is stack designator.

Signed-off-by: Daniel Kochmański <dkochmanski@turtle-solutions.eu>
This commit is contained in:
Daniel Kochmański 2015-06-24 13:45:07 +02:00
parent f849b4a99a
commit 44c58e95f7
4 changed files with 19 additions and 0 deletions

View file

@ -645,6 +645,22 @@ si_get_limit(cl_object type)
@(return ecl_make_unsigned_integer(output))
}
cl_object
si_reset_margin(cl_object type)
{
cl_env_ptr env = ecl_process_env();
if (type == @'ext::frame-stack')
frs_set_size(env, env->frs_limit_size);
else if (type == @'ext::binding-stack')
ecl_bds_set_size(env, env->bds_limit_size);
else if (type == @'ext::c-stack')
cs_set_size(env, env->cs_limit_size);
else
return ECL_NIL;
return ECL_T;
}
void
init_stacks(cl_env_ptr env)
{

View file

@ -1863,6 +1863,7 @@ cl_symbols[] = {
{EXT_ "ILLEGAL-INSTRUCTION", EXT_ORDINARY, NULL, -1, OBJNULL},
{EXT_ "SET-LIMIT", EXT_ORDINARY, si_set_limit, 2, OBJNULL},
{EXT_ "GET-LIMIT", EXT_ORDINARY, si_get_limit, 1, OBJNULL},
{SYS_ "RESET-MARGIN", EXT_ORDINARY, si_reset_margin, 1, OBJNULL},
{EXT_ "SEGMENTATION-VIOLATION", EXT_ORDINARY, NULL, -1, OBJNULL},
{EXT_ "EXTENDED-STRING", EXT_ORDINARY, NULL, -1, OBJNULL},

View file

@ -1863,6 +1863,7 @@ cl_symbols[] = {
{EXT_ "ILLEGAL-INSTRUCTION",NULL},
{EXT_ "SET-LIMIT","si_set_limit"},
{EXT_ "GET-LIMIT","si_get_limit"},
{SYS_ "RESET-MARGIN","si_reset_margin"},
{EXT_ "SEGMENTATION-VIOLATION",NULL},
{EXT_ "EXTENDED-STRING",NULL},

View file

@ -471,6 +471,7 @@ extern cl_object ecl_deserialize(uint8_t *data);
ecl_stack_pop_values(the_env,__i); }
extern void ecl_cs_set_org(cl_env_ptr env);
extern cl_object si_reset_margin(cl_object type);
/* threads.d */