From 87a6367939e7087a5d7c31caee9db2a4a1dbe5a2 Mon Sep 17 00:00:00 2001 From: jgarcia Date: Mon, 12 May 2008 08:12:31 +0000 Subject: [PATCH] Factor out some error calls to make code faster in Mac OS X (avoids references to cl_env in some functions) --- src/c/dpp.c | 13 ++++++++----- src/c/error.d | 3 +++ src/h/external.h | 2 +- src/h/stacks.h | 10 +++------- 4 files changed, 15 insertions(+), 13 deletions(-) diff --git a/src/c/dpp.c b/src/c/dpp.c index 8388bae8a..ca5c9c139 100644 --- a/src/c/dpp.c +++ b/src/c/dpp.c @@ -101,6 +101,7 @@ char pool[POOLSIZE]; char *poolp; char *function; +int function_code; char *function_symbol; char *function_c_name; @@ -248,7 +249,7 @@ search_keyword(const char *name) } char * -search_symbol(char *name) +search_symbol(char *name, int *symbol_code) { int i; for (i = 0; cl_symbols[i].name != NULL; i++) { @@ -271,6 +272,8 @@ search_symbol(char *name) pushstr(")"); pushc(0); } + if (symbol_code) + *symbol_code = i; return name; } } @@ -290,7 +293,7 @@ read_symbol() } pushc(0); - name = search_symbol(poolp = name); + name = search_symbol(poolp = name, 0); if (name == NULL) { name = poolp; printf("\nUnknown symbol: %s\n", name); @@ -442,7 +445,7 @@ void get_function(void) { function = read_function(); - function_symbol = search_symbol(function); + function_symbol = search_symbol(function, &function_code); if (function_symbol == NULL) { function_symbol = poolp; pushstr("Cnil"); @@ -667,7 +670,7 @@ put_declaration(void) } if (nopt == 0 && !rest_flag && !key_flag) { put_lineno(); - fprintf(out, "\tif (narg!=%d) FEwrong_num_arguments(%s);\n", nreq, function_symbol); + fprintf(out, "\tif (narg!=%d) FEwrong_num_arguments(MAKE_FIXNUM(%d));\n", nreq, function_code); } else { simple_varargs = !rest_flag && !key_flag && ((nreq + nopt) < 32); if (key_flag) { @@ -692,7 +695,7 @@ put_declaration(void) if (nopt > 0 && !rest_flag && !key_flag) { fprintf(out, "|| narg > %d", nreq + nopt); } - fprintf(out, ") FEwrong_num_arguments(%s);\n", function_symbol); + fprintf(out, ") FEwrong_num_arguments(MAKE_FIXNUM(%d));\n", function_code); for (i = 0; i < nopt; i++) { put_lineno(); fprintf(out, "\tif (narg > %d) {\n", nreq+i); diff --git a/src/c/error.d b/src/c/error.d index 12aae667a..39a406d12 100644 --- a/src/c/error.d +++ b/src/c/error.d @@ -174,6 +174,9 @@ FEundefined_function(cl_object fname) void FEwrong_num_arguments(cl_object fun) { + if (FIXNUMP(fun)) { + fun = (cl_object)(cl_symbols + fix(fun)); + } FEprogram_error("Wrong number of arguments passed to function ~S.", 1, fun); } diff --git a/src/h/external.h b/src/h/external.h index 343077a94..6bd6776e6 100644 --- a/src/h/external.h +++ b/src/h/external.h @@ -512,7 +512,7 @@ extern ECL_API cl_object cl_funcall _ARGS((cl_narg narg, cl_object fun, ...)); extern ECL_API cl_object cl_apply _ARGS((cl_narg narg, cl_object fun, cl_object arg, ...)); extern ECL_API cl_object si_safe_eval _ARGS((cl_narg narg, cl_object form, cl_object env, cl_object value, ...)); #define cl_safe_eval(form,env,value) si_safe_eval(3,form,env,value) - +extern ECL_API cl_object *_ecl_va_sp(cl_narg narg); extern ECL_API cl_object si_unlink_symbol(cl_object s); extern ECL_API cl_object cl_eval(cl_object form); extern ECL_API cl_object cl_constantp(cl_narg narg, cl_object arg, ...); diff --git a/src/h/stacks.h b/src/h/stacks.h index 229077ff6..335b583c2 100644 --- a/src/h/stacks.h +++ b/src/h/stacks.h @@ -151,13 +151,9 @@ extern ECL_API ecl_frame_ptr _frs_push(register cl_object val); */ #define cl_va_start(a,p,n,k) { \ - a[0].narg = (n)-(k); \ - if ((n) <= C_ARGUMENTS_LIMIT) { \ - va_start(a[0].args,p); \ - a[0].sp = 0; \ - } else { \ - a[0].sp = cl_env.stack_top - a[0].narg; \ - }} + a[0].narg = (n)-(k); \ + va_start(a[0].args,p); \ + a[0].sp = ((n) <= C_ARGUMENTS_LIMIT)? 0 : _ecl_va_sp(a[0].narg); } #define cl_va_arg(a) \ (a[0].narg--,(a[0].sp? *(a[0].sp++) : va_arg(a[0].args,cl_object))) #define cl_va_copy(dest,orig) { \