From 18767d76aebbbe6083839cb96580e907fd9fde51 Mon Sep 17 00:00:00 2001 From: Juan Jose Garcia Ripoll Date: Sun, 22 Feb 2009 00:39:51 +0100 Subject: [PATCH] Slight optimizations in the code for lisp stacks + values --- src/c/interpreter.d | 32 ++++++++++++++++++++++++-------- 1 file changed, 24 insertions(+), 8 deletions(-) diff --git a/src/c/interpreter.d b/src/c/interpreter.d index 4e03c3461..816510953 100644 --- a/src/c/interpreter.d +++ b/src/c/interpreter.d @@ -54,6 +54,12 @@ ecl_stack_set_size(cl_env_ptr env, cl_index tentative_new_size) ecl_stack_push(env, MAKE_FIXNUM(0)); } +static void +FEstack_underflow(void) +{ + FEerror("Internal error: stack underflow.",0); +} + static void ecl_stack_grow(cl_env_ptr env) { @@ -70,7 +76,7 @@ ecl_stack_push(cl_env_ptr env, cl_object x) { cl_object ecl_stack_pop(cl_env_ptr env) { if (env->stack_top == env->stack) - FEerror("Internal error: stack underflow.",0); + FEstack_underflow(); return *(--env->stack_top); } @@ -93,23 +99,33 @@ void ecl_stack_pop_n(cl_env_ptr env, cl_index index) { cl_object *new_top = env->stack_top - index; if (new_top < env->stack) - FEerror("Internal error: stack underflow.",0); + FEstack_underflow(); env->stack_top = new_top; } cl_index ecl_stack_push_values(cl_env_ptr env) { - cl_index i; - for (i=0; i < env->nvalues; i++) - ecl_stack_push(env, env->values[i]); + cl_index i = env->nvalues; + cl_object *b = env->stack_top; + cl_object *p = b + i; + if (p >= env->stack_limit) { + ecl_stack_grow(env); + b = env->stack_top; + p = b + i; + } + env->stack_top = p; + memcpy(b, env->values, i * sizeof(cl_object)); return i; } void ecl_stack_pop_values(cl_env_ptr env, cl_index n) { - env->nvalues = n; - while (n > 0) - env->values[--n] = ecl_stack_pop(env); + cl_object *p = env->stack_top - n; + if (p < env->stack) + FEstack_underflow(); + env->nvalues = n; + env->stack_top = p; + memcpy(env->values, p, n * sizeof(cl_object)); } cl_object