summaryrefslogtreecommitdiffstats
path: root/src/if_tcl.c
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2016-01-09 19:41:11 +0100
committerBram Moolenaar <Bram@vim.org>2016-01-09 19:41:11 +0100
commit8a5115cf18751022387af2085f374d38c60dde83 (patch)
tree626c3e93cd3127931c85e631d50d6ced1b5f6380 /src/if_tcl.c
parent5f24542e5eda590acdbee89b120fa2e19ec7596e (diff)
patch 7.4.1070v7.4.1070
Problem: The Tcl interface can't be loaded dynamically on Unix. Solution: Make it possible to load it dynamically. (Ken Takata)
Diffstat (limited to 'src/if_tcl.c')
-rw-r--r--src/if_tcl.c31
1 files changed, 24 insertions, 7 deletions
diff --git a/src/if_tcl.c b/src/if_tcl.c
index 1f37e12778..995a5c7273 100644
--- a/src/if_tcl.c
+++ b/src/if_tcl.c
@@ -160,6 +160,20 @@ static struct ref refsdeleted; /* dummy object for deleted ref list */
typedef int HANDLE;
# endif
+# ifndef WIN3264
+# include <dlfcn.h>
+# define HANDLE void*
+# define TCL_PROC void*
+# define load_dll(n) dlopen((n), RTLD_LAZY|RTLD_GLOBAL)
+# define symbol_from_dll dlsym
+# define close_dll dlclose
+# else
+# define TCL_PROC FARPROC
+# define load_dll vimLoadLib
+# define symbol_from_dll GetProcAddress
+# define close_dll FreeLibrary
+# endif
+
/*
* Declare HANDLE for tcl.dll and function pointers.
*/
@@ -170,7 +184,6 @@ void (*dll_Tcl_FindExecutable)(const void *);
/*
* Table of name to function pointer of tcl.
*/
-#define TCL_PROC FARPROC
static struct {
char* name;
TCL_PROC* ptr;
@@ -197,7 +210,7 @@ tcl_runtime_link_init(char *libname, int verbose)
if (hTclLib)
return OK;
- if (!(hTclLib = vimLoadLib(libname)))
+ if (!(hTclLib = load_dll(libname)))
{
if (verbose)
EMSG2(_(e_loadlib), libname);
@@ -205,10 +218,10 @@ tcl_runtime_link_init(char *libname, int verbose)
}
for (i = 0; tcl_funcname_table[i].ptr; ++i)
{
- if (!(*tcl_funcname_table[i].ptr = GetProcAddress(hTclLib,
+ if (!(*tcl_funcname_table[i].ptr = symbol_from_dll(hTclLib,
tcl_funcname_table[i].name)))
{
- FreeLibrary(hTclLib);
+ close_dll(hTclLib);
hTclLib = NULL;
if (verbose)
EMSG2(_(e_loadfunc), tcl_funcname_table[i].name);
@@ -246,13 +259,13 @@ tcl_enabled(verbose)
int verbose;
{
if (!stubs_initialized && find_executable_arg != NULL
- && tcl_runtime_link_init(DYNAMIC_TCL_DLL, verbose) == OK)
+ && tcl_runtime_link_init((char *)p_tcldll, verbose) == OK)
{
Tcl_Interp *interp;
dll_Tcl_FindExecutable(find_executable_arg);
- if (interp = dll_Tcl_CreateInterp())
+ if ((interp = dll_Tcl_CreateInterp()) != NULL)
{
if (Tcl_InitStubs(interp, DYNAMIC_TCL_VER, 0))
{
@@ -272,7 +285,7 @@ tcl_end()
#ifdef DYNAMIC_TCL
if (hTclLib)
{
- FreeLibrary(hTclLib);
+ close_dll(hTclLib);
hTclLib = NULL;
}
#endif
@@ -2039,6 +2052,10 @@ tcldelallrefs(ref)
int err;
char *result;
+ /* TODO: this code currently crashes Vim on exit */
+ if (exiting)
+ return;
+
while (ref != NULL)
{
next = ref->next;