summaryrefslogtreecommitdiff
path: root/libguile/dynl.c
diff options
context:
space:
mode:
authorAndy Wingo <wingo@pobox.com>2010-01-04 12:21:02 +0100
committerAndy Wingo <wingo@pobox.com>2010-01-04 12:39:21 +0100
commite773b1e6ce2af1753034cb1065518c2341228008 (patch)
tree81981844565228e6a0b1b37e1eb97deec64b05af /libguile/dynl.c
parente2c2a6994d05124760ea7f18caf5d28fb47e453c (diff)
downloadguile-e773b1e6ce2af1753034cb1065518c2341228008.tar.gz
dynamic-func returns foreign objects, not bignums
* libguile/dynl.c (scm_dynamic_func, scm_dynamic_call) (scm_dynamic_args_call): Change the representation of dynamic functions to be foreign objects. Shouldn't affect any users, as people should be treating the return value of dynamic-func as an opaque object.
Diffstat (limited to 'libguile/dynl.c')
-rw-r--r--libguile/dynl.c16
1 files changed, 8 insertions, 8 deletions
diff --git a/libguile/dynl.c b/libguile/dynl.c
index 52c43e542..a55ba86ea 100644
--- a/libguile/dynl.c
+++ b/libguile/dynl.c
@@ -1,7 +1,7 @@
/* dynl.c - dynamic linking
*
* Copyright (C) 1990, 91, 92, 93, 94, 95, 96, 97, 98, 99, 2000, 2001, 2002,
- * 2003, 2008, 2009 Free Software Foundation, Inc.
+ * 2003, 2008, 2009, 2010 Free Software Foundation, Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public License
@@ -58,6 +58,7 @@ maybe_drag_in_eprintf ()
#include "libguile/lang.h"
#include "libguile/validate.h"
#include "libguile/dynwind.h"
+#include "libguile/foreign.h"
#include <ltdl.h>
@@ -225,10 +226,6 @@ SCM_DEFINE (scm_dynamic_func, "dynamic-func", 2, 0, 0,
"since it will be added automatically when necessary.")
#define FUNC_NAME s_scm_dynamic_func
{
- /* The returned handle is formed by casting the address of the function to a
- * long value and converting this to a scheme number
- */
-
void (*func) ();
SCM_VALIDATE_STRING (1, name);
@@ -245,7 +242,7 @@ SCM_DEFINE (scm_dynamic_func, "dynamic-func", 2, 0, 0,
func = (void (*) ()) sysdep_dynl_func (chars, DYNL_HANDLE (dobj),
FUNC_NAME);
scm_dynwind_end ();
- return scm_from_ulong ((unsigned long) func);
+ return scm_c_from_foreign (SCM_FOREIGN_TYPE_POINTER, &func, 0, NULL);
}
}
#undef FUNC_NAME
@@ -275,7 +272,9 @@ SCM_DEFINE (scm_dynamic_call, "dynamic-call", 2, 0, 0,
if (scm_is_string (func))
func = scm_dynamic_func (func, dobj);
- fptr = (void (*) ()) scm_to_ulong (func);
+ SCM_VALIDATE_FOREIGN_TYPED (SCM_ARG1, func, POINTER);
+
+ fptr = SCM_FOREIGN_OBJECT_REF (func, void*);
fptr ();
return SCM_UNSPECIFIED;
}
@@ -303,8 +302,9 @@ SCM_DEFINE (scm_dynamic_args_call, "dynamic-args-call", 3, 0, 0,
if (scm_is_string (func))
func = scm_dynamic_func (func, dobj);
+ SCM_VALIDATE_FOREIGN_TYPED (SCM_ARG1, func, POINTER);
- fptr = (int (*) (int, char **)) scm_to_ulong (func);
+ fptr = SCM_FOREIGN_OBJECT_REF (func, void*);
argv = scm_i_allocate_string_pointers (args);
for (argc = 0; argv[argc]; argc++)