diff options
author | Bram Moolenaar <Bram@vim.org> | 2016-01-09 19:41:11 +0100 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2016-01-09 19:41:11 +0100 |
commit | 8a5115cf18751022387af2085f374d38c60dde83 (patch) | |
tree | 626c3e93cd3127931c85e631d50d6ced1b5f6380 /src/if_tcl.c | |
parent | 5f24542e5eda590acdbee89b120fa2e19ec7596e (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.c | 31 |
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; |