From ec9727f9f5b189d37b2233073c6181eafcf86aaa Mon Sep 17 00:00:00 2001 From: Juan Jose Garcia Ripoll Date: Sat, 20 Feb 2010 22:04:50 +0100 Subject: [PATCH] Safer inline expansion for BOUNDP --- src/c/reference.d | 25 +++++++++++++------------ src/cmp/sysfun.lsp | 3 ++- src/h/external.h | 1 + src/new-cmp/sysfun.lsp | 4 +++- 4 files changed, 19 insertions(+), 14 deletions(-) diff --git a/src/c/reference.d b/src/c/reference.d index d270c83ee..40a01baeb 100644 --- a/src/c/reference.d +++ b/src/c/reference.d @@ -141,22 +141,23 @@ cl_symbol_value(cl_object sym) @(return value) } +bool +ecl_boundp(cl_env_ptr env, cl_object sym) +{ + if (Null(sym)) { + return 1; + } else { + if (!SYMBOLP(sym)) + FEtype_error_symbol(sym); + return ECL_SYM_VAL(the_env, sym) != OBJNULL; + } +} + cl_object cl_boundp(cl_object sym) { const cl_env_ptr the_env = ecl_process_env(); - cl_object output; - if (Null(sym)) { - output = Ct; - } else { - if (!SYMBOLP(sym)) - FEtype_error_symbol(sym); - if (ECL_SYM_VAL(the_env, sym) == OBJNULL) - output = Cnil; - else - output = Ct; - } - @(return output) + @(return (ecl_boundp(the_env,sym)? Ct : Cnil)) } cl_object diff --git a/src/cmp/sysfun.lsp b/src/cmp/sysfun.lsp index 246df3b74..2149b0c38 100644 --- a/src/cmp/sysfun.lsp +++ b/src/cmp/sysfun.lsp @@ -1227,7 +1227,8 @@ (proclaim-function fboundp (symbol) t :predicate t) (proclaim-function symbol-value (symbol) t) (proclaim-function boundp (symbol) t :predicate t :no-side-effects t) -(def-inline boundp :always (symbol) :bool "ECL_SYM_VAL(cl_env_copy,#0)!=OBJNULL") +(def-inline boundp :always (t) :bool "ecl_boundp(cl_env_copy,#0)") +(def-inline boundp :unsafe ((and symbol (not null))) :bool "ECL_SYM_VAL(cl_env_copy,#0)!=OBJNULL") (proclaim-function macro-function (symbol) t) (proclaim-function special-operator-p (symbol) t :predicate t) diff --git a/src/h/external.h b/src/h/external.h index 0e16e68fa..cee9c2f5a 100755 --- a/src/h/external.h +++ b/src/h/external.h @@ -1467,6 +1467,7 @@ extern ECL_API cl_object cl_symbol_value(cl_object sym); extern ECL_API cl_object cl_boundp(cl_object sym); extern ECL_API cl_object cl_special_operator_p(cl_object form); extern ECL_API cl_object ecl_fdefinition(cl_object fname); +extern ECL_API bool ecl_boundp(cl_env_ptr env, cl_object o); /* sequence.c */ diff --git a/src/new-cmp/sysfun.lsp b/src/new-cmp/sysfun.lsp index ce78f3996..3188e8fd9 100644 --- a/src/new-cmp/sysfun.lsp +++ b/src/new-cmp/sysfun.lsp @@ -1851,7 +1851,9 @@ (def-inline copy-readtable :always (null null) t "standard_readtable") -(def-inline boundp :always (symbol) :bool "ECL_SYM_VAL(cl_env_copy,#0)!=OBJNULL") +(def-inline boundp :always (t) :bool "ecl_boundp(cl_env_copy,#0)") +(def-inline boundp :unsafe (symbol) :bool "@0;Null(#0)||(ECL_SYM_VAL(cl_env_copy,#0)!=OBJNULL)") + ;; file sequence.d