From 44c58e95f74d6c31e7c55d2a6ac8291fee8427e7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Kochma=C5=84ski?= Date: Wed, 24 Jun 2015 13:45:07 +0200 Subject: [PATCH] stacks.d: introduce function `si_reset_margin' MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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 --- src/c/stacks.d | 16 ++++++++++++++++ src/c/symbols_list.h | 1 + src/c/symbols_list2.h | 1 + src/h/internal.h | 1 + 4 files changed, 19 insertions(+) diff --git a/src/c/stacks.d b/src/c/stacks.d index 621af142c..48f947e51 100644 --- a/src/c/stacks.d +++ b/src/c/stacks.d @@ -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) { diff --git a/src/c/symbols_list.h b/src/c/symbols_list.h index b35674bdf..5d5e6c2cb 100755 --- a/src/c/symbols_list.h +++ b/src/c/symbols_list.h @@ -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}, diff --git a/src/c/symbols_list2.h b/src/c/symbols_list2.h index 5c6786c31..cb5d6406e 100644 --- a/src/c/symbols_list2.h +++ b/src/c/symbols_list2.h @@ -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}, diff --git a/src/h/internal.h b/src/h/internal.h index 4350f454c..b6528b35f 100755 --- a/src/h/internal.h +++ b/src/h/internal.h @@ -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 */