summaryrefslogtreecommitdiff
path: root/libguile
diff options
context:
space:
mode:
authorDirk Herrmann <dirk@dirk-herrmanns-seiten.de>2000-05-04 08:07:18 +0000
committerDirk Herrmann <dirk@dirk-herrmanns-seiten.de>2000-05-04 08:07:18 +0000
commitb82c6ce052e2cb3b9e0f50c18ea7c562dd1b08c3 (patch)
tree46effa817c45aeb97871bdbf5d33cda8686c8988 /libguile
parent106428b3fe936051027dde7907fd0d618882d988 (diff)
downloadguile-b82c6ce052e2cb3b9e0f50c18ea7c562dd1b08c3.tar.gz
Avoid modifications of cells via pointers. Use SCM_SET_CELL... instead.
Diffstat (limited to 'libguile')
-rw-r--r--libguile/ChangeLog17
-rw-r--r--libguile/dynl.c78
-rw-r--r--libguile/numbers.h2
3 files changed, 52 insertions, 45 deletions
diff --git a/libguile/ChangeLog b/libguile/ChangeLog
index 04fff4458..d6a893735 100644
--- a/libguile/ChangeLog
+++ b/libguile/ChangeLog
@@ -1,3 +1,20 @@
+2000-05-04 Dirk Herrmann <D.Herrmann@tu-bs.de>
+
+ * numbers.h (SCM_INUM0): Uses SCM_MAKINUM instead of SCM_PACK.
+
+ * dynl.c (dynl_obj, DYNL_OBJ, get_dynl_obj): Removed.
+
+ (DYNL_FILENAME, DYNL_HANDLE): Use SCM_CELL... macros instead of
+ pointer trickery.
+
+ (SET_DYNL_HANDLE): Added.
+
+ (scm_dynamic_object_p): Simplified.
+
+ (scm_dynamic_unlink, scm_dynamic_func): Changed comment. Deliver
+ better error message when accessing unlinked dynamic objects.
+ Eliminated call to get_dynl_obj.
+
2000-05-03 Marius Vollmer <mvo@zagadka.ping.de>
* scmsigs.c (orig_handlers) [HAVE_SIGACTION]: Fix declaration to
diff --git a/libguile/dynl.c b/libguile/dynl.c
index 701fa4d3a..0ba0b13b8 100644
--- a/libguile/dynl.c
+++ b/libguile/dynl.c
@@ -326,15 +326,10 @@ sysdep_dynl_func (const char *symbol,
int scm_tc16_dynamic_obj;
-struct dynl_obj {
- SCM filename;
- void *handle;
-};
-
-#define DYNL_OBJ(x) ((struct dynl_obj *) &SCM_CDR (x))
+#define DYNL_FILENAME(x) (SCM_CELL_OBJECT_1 (x))
+#define DYNL_HANDLE(x) ((void *) SCM_CELL_WORD_2 (x))
+#define SET_DYNL_HANDLE(x, v) (SCM_SET_CELL_WORD_2 ((x), (v)))
-#define DYNL_FILENAME(x) (DYNL_OBJ (x)->filename)
-#define DYNL_HANDLE(x) (DYNL_OBJ (x)->handle)
static SCM
mark_dynl_obj (SCM ptr)
@@ -398,16 +393,6 @@ SCM_DEFINE (scm_dynamic_link, "dynamic-link", 1, 0, 1,
}
#undef FUNC_NAME
-static struct dynl_obj *
-get_dynl_obj (SCM dobj, const char *subr, int argn)
-{
- struct dynl_obj *d;
- SCM_ASSERT (SCM_NIMP (dobj) && SCM_UNPACK_CAR (dobj) == scm_tc16_dynamic_obj,
- dobj, argn, subr);
- d = DYNL_OBJ (dobj);
- SCM_ASSERT (d->handle != NULL, dobj, argn, subr);
- return d;
-}
SCM_DEFINE (scm_dynamic_object_p, "dynamic-object?", 1, 0, 0,
(SCM obj),
@@ -415,34 +400,37 @@ SCM_DEFINE (scm_dynamic_object_p, "dynamic-object?", 1, 0, 0,
"otherwise.")
#define FUNC_NAME s_scm_dynamic_object_p
{
- return SCM_BOOL (SCM_NIMP (obj)
- && SCM_UNPACK_CAR (obj) == scm_tc16_dynamic_obj);
+ return SCM_BOOL (SCM_SMOB_PREDICATE (scm_tc16_dynamic_obj, obj));
}
#undef FUNC_NAME
+
SCM_DEFINE (scm_dynamic_unlink, "dynamic-unlink", 1, 0, 0,
(SCM dobj),
- "Unlink the library represented by @var{library-handle}, and remove any\n"
- "imported symbols from the address space.\n"
+ "Unlink the library represented by @var{library-handle},\n"
+ "and remove any imported symbols from the address space.\n"
"GJB:FIXME:DOC: 2nd version below:\n"
- "Unlink the indicated object file from the application. The argument\n"
- "@var{dynobj} should be one of the values returned by\n"
- "@code{dynamic-link}. When @code{dynamic-unlink} has been called on\n"
- "@var{dynobj}, it is no longer usable as an argument to the functions\n"
- "below and you will get type mismatch errors when you try to.\n"
- "")
+ "Unlink the indicated object file from the application. The\n"
+ "argument @var{dynobj} must have been obtained by a call to\n"
+ "@code{dynamic-link}. After @code{dynamic-unlink} has been\n"
+ "called on @var{dynobj}, its content is no longer accessible.\n")
#define FUNC_NAME s_scm_dynamic_unlink
{
/*fixme* GC-problem */
- struct dynl_obj *d = get_dynl_obj (dobj, FUNC_NAME, SCM_ARG1);
- SCM_DEFER_INTS;
- sysdep_dynl_unlink (d->handle, FUNC_NAME);
- d->handle = NULL;
- SCM_ALLOW_INTS;
- return SCM_UNSPECIFIED;
+ SCM_VALIDATE_SMOB (SCM_ARG1, dobj, dynamic_obj);
+ if (DYNL_HANDLE (dobj) == NULL) {
+ SCM_MISC_ERROR ("Already unlinked: ~S", dobj);
+ } else {
+ SCM_DEFER_INTS;
+ sysdep_dynl_unlink (DYNL_HANDLE (dobj), FUNC_NAME);
+ SET_DYNL_HANDLE (dobj, NULL);
+ SCM_ALLOW_INTS;
+ return SCM_UNSPECIFIED;
+ }
}
#undef FUNC_NAME
+
SCM_DEFINE (scm_dynamic_func, "dynamic-func", 2, 0, 0,
(SCM symb, SCM dobj),
"Import the symbol @var{func} from @var{lib} (a dynamic library handle).\n"
@@ -460,23 +448,25 @@ SCM_DEFINE (scm_dynamic_func, "dynamic-func", 2, 0, 0,
"")
#define FUNC_NAME s_scm_dynamic_func
{
- struct dynl_obj *d;
void (*func) ();
SCM_COERCE_ROSTRING (1, symb);
/*fixme* GC-problem */
- d = get_dynl_obj (dobj, FUNC_NAME, SCM_ARG2);
-
- SCM_DEFER_INTS;
- func = (void (*) ()) sysdep_dynl_func (SCM_CHARS (symb),
- d->handle,
- FUNC_NAME);
- SCM_ALLOW_INTS;
-
- return scm_ulong2num ((unsigned long) func);
+ SCM_VALIDATE_SMOB (SCM_ARG2, dobj, dynamic_obj);
+ if (DYNL_HANDLE (dobj) == NULL) {
+ SCM_MISC_ERROR ("Already unlinked: ~S", dobj);
+ } else {
+ SCM_DEFER_INTS;
+ func = (void (*) ()) sysdep_dynl_func (SCM_CHARS (symb),
+ DYNL_HANDLE (dobj),
+ FUNC_NAME);
+ SCM_ALLOW_INTS;
+ return scm_ulong2num ((unsigned long) func);
+ }
}
#undef FUNC_NAME
+
SCM_DEFINE (scm_dynamic_call, "dynamic-call", 2, 0, 0,
(SCM func, SCM dobj),
"Call @var{lib-thunk}, a procedure of no arguments. If @var{lib-thunk}\n"
diff --git a/libguile/numbers.h b/libguile/numbers.h
index cab2389b5..ec1612eb8 100644
--- a/libguile/numbers.h
+++ b/libguile/numbers.h
@@ -98,7 +98,7 @@
/* A name for 0.
*/
-#define SCM_INUM0 (SCM_PACK (2))
+#define SCM_INUM0 (SCM_MAKINUM (0))
/* SCM_MAXEXP is the maximum double precision expontent