summaryrefslogtreecommitdiff
path: root/libguile/modules.c
diff options
context:
space:
mode:
authorKeisuke Nishida <kxn30@po.cwru.edu>2000-09-10 22:22:36 +0000
committerKeisuke Nishida <kxn30@po.cwru.edu>2000-09-10 22:22:36 +0000
commitfb43bf74e2a2131ec80bf9e71de2fddab7696ff7 (patch)
tree2fbcba188edcf7d6d219300b1f2690d982a0825c /libguile/modules.c
parent4c7cb8ba9447b5d51c88032b2b90eae618e2460e (diff)
downloadguile-fb43bf74e2a2131ec80bf9e71de2fddab7696ff7.tar.gz
* modules.c: Use applicable smobs for eval closures instead of
compiled closures. Include "libguile/smob.h". (f_eval_closure): Removed. (scm_eval_closure_tag): New variable. (scm_eval_closure_lookup): Renamed from eval_closure. This function now takes a smob instead of a compiled closure. (scm_standard_eval_closure): Create a smob instead of a compiled closure. (scm_init_modules): Initialize the eval closure type as a smob. * modules.h (SCM_EVAL_CLOSURE_P): New macro. (scm_eval_closure_tag, scm_eval_closure_lookup): Declare. * symbols.c: Include "libguile/smob.h". (scm_sym2vcell): Call scm_eval_closure_lookup directly if THUNK is an eval closure.
Diffstat (limited to 'libguile/modules.c')
-rw-r--r--libguile/modules.c22
1 files changed, 11 insertions, 11 deletions
diff --git a/libguile/modules.c b/libguile/modules.c
index ae062ab74..04ba8546d 100644
--- a/libguile/modules.c
+++ b/libguile/modules.c
@@ -47,6 +47,7 @@
#include "libguile/_scm.h"
#include "libguile/eval.h"
+#include "libguile/smob.h"
#include "libguile/procprop.h"
#include "libguile/vectors.h"
#include "libguile/hashtab.h"
@@ -240,12 +241,14 @@ module_variable (SCM module, SCM sym)
}
}
-static SCM f_eval_closure;
+SCM scm_eval_closure_tag;
-static SCM
-eval_closure (SCM cclo, SCM sym, SCM definep)
+/* NOTE: This function may be called by a smob application
+ or from another C function directly. */
+SCM
+scm_eval_closure_lookup (SCM eclo, SCM sym, SCM definep)
{
- SCM module = SCM_VELTS (cclo) [1];
+ SCM module = SCM_PACK (SCM_SMOB_DATA (eclo));
if (SCM_NFALSEP (definep))
return scm_apply (SCM_CDR (module_make_local_var_x),
SCM_LIST2 (module, sym),
@@ -259,9 +262,7 @@ SCM_DEFINE (scm_standard_eval_closure, "standard-eval-closure", 1, 0, 0,
"")
#define FUNC_NAME s_scm_standard_eval_closure
{
- SCM cclo = scm_makcclo (f_eval_closure, 2);
- SCM_VELTS (cclo) [1] = module;
- return cclo;
+ SCM_RETURN_NEWSMOB (scm_eval_closure_tag, SCM_UNPACK (module));
}
#undef FUNC_NAME
@@ -271,10 +272,9 @@ scm_init_modules ()
#include "libguile/modules.x"
module_make_local_var_x = scm_sysintern ("module-make-local-var!",
SCM_UNDEFINED);
- f_eval_closure = scm_make_subr_opt ("eval-closure",
- scm_tc7_subr_3,
- eval_closure,
- 0);
+ scm_eval_closure_tag = scm_make_smob_type ("eval-closure", 0);
+ scm_set_smob_mark (scm_eval_closure_tag, scm_markcdr);
+ scm_set_smob_apply (scm_eval_closure_tag, scm_eval_closure_lookup, 2, 0, 0);
}
void