aboutsummaryrefslogtreecommitdiffstats
path: root/src/mds-kbdc/compile-layout.c
diff options
context:
space:
mode:
authorMattias Andrée <maandree@operamail.com>2014-12-13 15:38:12 +0100
committerMattias Andrée <maandree@operamail.com>2014-12-13 15:38:16 +0100
commitf384ec72af2a60bd92d39e20791da99317d6ca60 (patch)
tree84522c38ce5250ae9dda455081fc0b407bbd7ca0 /src/mds-kbdc/compile-layout.c
parentmds-kbdc: call-stack: push and pop functions (diff)
downloadmds-f384ec72af2a60bd92d39e20791da99317d6ca60.tar.gz
mds-f384ec72af2a60bd92d39e20791da99317d6ca60.tar.bz2
mds-f384ec72af2a60bd92d39e20791da99317d6ca60.tar.xz
mds-kbdc: compile-layout: use the call-stack
Signed-off-by: Mattias Andrée <maandree@operamail.com>
Diffstat (limited to 'src/mds-kbdc/compile-layout.c')
-rw-r--r--src/mds-kbdc/compile-layout.c19
1 files changed, 16 insertions, 3 deletions
diff --git a/src/mds-kbdc/compile-layout.c b/src/mds-kbdc/compile-layout.c
index 371394d..b2cd5e0 100644
--- a/src/mds-kbdc/compile-layout.c
+++ b/src/mds-kbdc/compile-layout.c
@@ -290,6 +290,9 @@ static int call_function(mds_kbdc_tree_t* restrict tree, const char* restrict na
mds_kbdc_include_stack_t* our_include_stack = NULL;
int r, is_set, builtin, saved_errno;
+ /* Push call-stack. */
+ mds_kbdc_call_stack_push(tree, start, end);
+
/* Count the number of arguments we have. */
while (arguments[arg_count])
arg_count++;
@@ -370,11 +373,15 @@ static int call_function(mds_kbdc_tree_t* restrict tree, const char* restrict na
done:
+ /* Pop call-stack. */
+ mds_kbdc_call_stack_pop();
+
/* Pop return-stack. */
current_return_value = old_return_value;
return 0;
FAIL_BEGIN;
+ mds_kbdc_call_stack_pop();
mds_kbdc_include_stack_free(our_include_stack);
free(*return_value), *return_value = NULL;
current_return_value = old_return_value;
@@ -2462,6 +2469,9 @@ static int compile_macro_call(mds_kbdc_tree_macro_call_t* restrict tree)
last_value_statement = NULL;
+ /* Push call-stack. */
+ mds_kbdc_call_stack_push((mds_kbdc_tree_t*)tree, tree->loc_start, tree->loc_end);
+
/* Duplicate arguments and evaluate function calls,
variable dereferences and escapes in the macro
call arguments. */
@@ -2479,7 +2489,7 @@ static int compile_macro_call(mds_kbdc_tree_macro_call_t* restrict tree)
goto done;
- /* Push call stack and set parameters. */
+ /* Push variable-stack and set parameters. */
variables_stack_push();
for (arg_ = arg; arg_; arg_ = arg_->next)
fail_if (let(++variable, NULL, arg_, NULL, 0, 0));
@@ -2495,16 +2505,19 @@ static int compile_macro_call(mds_kbdc_tree_macro_call_t* restrict tree)
fail_if (mds_kbdc_include_stack_restore(our_include_stack));
mds_kbdc_include_stack_free(our_include_stack), our_include_stack = NULL;
- /* Pop call stack. */
+ /* Pop variable-stack. */
variables_stack_pop();
-
done:
+ /* Pop call-stack. */
+ mds_kbdc_call_stack_pop();
+
last_value_statement = NULL;
break_level = 0;
mds_kbdc_tree_free(arg);
return 0;
FAIL_BEGIN;
+ mds_kbdc_call_stack_pop();
mds_kbdc_tree_free(arg);
mds_kbdc_include_stack_free(our_include_stack);
FAIL_END;