Mercurial > vim
diff src/if_perl.xs @ 2370:454f314d0e61 vim73
Make it possible to load Perl dynamically on Unix. (James Vega)
author | Bram Moolenaar <bram@vim.org> |
---|---|
date | Wed, 21 Jul 2010 22:05:20 +0200 |
parents | e5265e4d4725 |
children | a42d19b78c93 |
line wrap: on
line diff
--- a/src/if_perl.xs +++ b/src/if_perl.xs @@ -84,9 +84,32 @@ static void VIM_init __ARGS((void)); EXTERN_C void boot_DynaLoader __ARGS((pTHX_ CV*)); /* - * For dynamic linked perl. (Windows) + * For dynamic linked perl. */ #if defined(DYNAMIC_PERL) || defined(PROTO) + +#ifndef DYNAMIC_PERL /* just generating prototypes */ +#ifdef _MSWIN +typedef int HANDLE; +#endif +typedef int XSINIT_t; +typedef int XSUBADDR_t; +typedef int perl_key; +#endif + +#ifndef _MSWIN +#include <dlfcn.h> +#define HANDLE void* +#define PERL_PROC void* +#define load_dll(n) dlopen((n), RTLD_LAZY|RTLD_GLOBAL) +#define symbol_from_dll dlsym +#define close_dll dlclose +#else +#define PERL_PROC FARPROC +#define load_dll LoadLibrary +#define symbol_from_dll GetProcAddress +#define close_dll FreeLibrary +#endif /* * Wrapper defines */ @@ -173,6 +196,7 @@ EXTERN_C void boot_DynaLoader __ARGS((pT # define Perl_Ierrgv_ptr dll_Perl_Ierrgv_ptr # define Perl_Isv_yes_ptr dll_Perl_Isv_yes_ptr # define boot_DynaLoader dll_boot_DynaLoader +# define Perl_Gthr_key_ptr dll_Perl_Gthr_key_ptr # define Perl_sys_init dll_Perl_sys_init # define Perl_sys_term dll_Perl_sys_term @@ -191,12 +215,6 @@ EXTERN_C void boot_DynaLoader __ARGS((pT # define Perl_Iscopestack_ix_ptr dll_Perl_Iscopestack_ix_ptr # define Perl_Iunitcheckav_ptr dll_Perl_Iunitcheckav_ptr -#ifndef DYNAMIC_PERL /* just generating prototypes */ -typedef int HANDLE; -typedef int XSINIT_t; -typedef int XSUBADDR_t; -#endif - /* * Declare HANDLE for perl.dll and function pointers. */ @@ -265,6 +283,7 @@ static void (*Perl_sv_setsv_flags)(pTHX_ static void (*Perl_sv_setsv)(pTHX_ SV*, SV*); #endif static bool (*Perl_sv_upgrade)(pTHX_ SV*, U32); +#if (PERL_REVISION == 5) && (PERL_VERSION < 10) static SV*** (*Perl_Tstack_sp_ptr)(register PerlInterpreter*); static OP** (*Perl_Top_ptr)(register PerlInterpreter*); static SV*** (*Perl_Tstack_base_ptr)(register PerlInterpreter*); @@ -276,12 +295,7 @@ static I32** (*Perl_Tmarkstack_max_ptr)( static SV** (*Perl_TSv_ptr)(register PerlInterpreter*); static XPV** (*Perl_TXpv_ptr)(register PerlInterpreter*); static STRLEN* (*Perl_Tna_ptr)(register PerlInterpreter*); -static GV** (*Perl_Idefgv_ptr)(register PerlInterpreter*); -static GV** (*Perl_Ierrgv_ptr)(register PerlInterpreter*); -static SV* (*Perl_Isv_yes_ptr)(register PerlInterpreter*); -static void (*boot_DynaLoader)_((pTHX_ CV*)); - -#if (PERL_REVISION == 5) && (PERL_VERSION >= 10) +#else static void (*Perl_sv_free2)(pTHX_ SV*); static void (*Perl_sys_init)(int* argc, char*** argv); static void (*Perl_sys_term)(void); @@ -301,10 +315,15 @@ static I32* (*Perl_Iscopestack_ix_ptr)(r static AV** (*Perl_Iunitcheckav_ptr)(register PerlInterpreter*); #endif +static GV** (*Perl_Idefgv_ptr)(register PerlInterpreter*); +static GV** (*Perl_Ierrgv_ptr)(register PerlInterpreter*); +static SV* (*Perl_Isv_yes_ptr)(register PerlInterpreter*); +static void (*boot_DynaLoader)_((pTHX_ CV*)); +static perl_key* (*Perl_Gthr_key_ptr)_((pTHX)); + /* * Table of name to function pointer of perl. */ -#define PERL_PROC FARPROC static struct { char* name; PERL_PROC* ptr; @@ -389,17 +408,16 @@ static struct { {"Perl_sys_init", (PERL_PROC*)&Perl_sys_init}, {"Perl_sys_term", (PERL_PROC*)&Perl_sys_term}, {"Perl_ISv_ptr", (PERL_PROC*)&Perl_ISv_ptr}, - {"Perl_Istack_sp_ptr", (PERL_PROC*)&Perl_Istack_sp_ptr}, - {"Perl_Iop_ptr", (PERL_PROC*)&Perl_Iop_ptr}, + {"Perl_Istack_max_ptr", (PERL_PROC*)&Perl_Istack_max_ptr}, {"Perl_Istack_base_ptr", (PERL_PROC*)&Perl_Istack_base_ptr}, - {"Perl_Istack_max_ptr", (PERL_PROC*)&Perl_Istack_max_ptr}, + {"Perl_IXpv_ptr", (PERL_PROC*)&Perl_IXpv_ptr}, {"Perl_Itmps_ix_ptr", (PERL_PROC*)&Perl_Itmps_ix_ptr}, {"Perl_Itmps_floor_ptr", (PERL_PROC*)&Perl_Itmps_floor_ptr}, + {"Perl_Ina_ptr", (PERL_PROC*)&Perl_Ina_ptr}, {"Perl_Imarkstack_ptr_ptr", (PERL_PROC*)&Perl_Imarkstack_ptr_ptr}, {"Perl_Imarkstack_max_ptr", (PERL_PROC*)&Perl_Imarkstack_max_ptr}, - {"Perl_ISv_ptr", (PERL_PROC*)&Perl_ISv_ptr}, - {"Perl_IXpv_ptr", (PERL_PROC*)&Perl_IXpv_ptr}, - {"Perl_Ina_ptr", (PERL_PROC*)&Perl_Ina_ptr}, + {"Perl_Istack_sp_ptr", (PERL_PROC*)&Perl_Istack_sp_ptr}, + {"Perl_Iop_ptr", (PERL_PROC*)&Perl_Iop_ptr}, {"Perl_call_list", (PERL_PROC*)&Perl_call_list}, {"Perl_Iscopestack_ix_ptr", (PERL_PROC*)&Perl_Iscopestack_ix_ptr}, {"Perl_Iunitcheckav_ptr", (PERL_PROC*)&Perl_Iunitcheckav_ptr}, @@ -408,6 +426,7 @@ static struct { {"Perl_Ierrgv_ptr", (PERL_PROC*)&Perl_Ierrgv_ptr}, {"Perl_Isv_yes_ptr", (PERL_PROC*)&Perl_Isv_yes_ptr}, {"boot_DynaLoader", (PERL_PROC*)&boot_DynaLoader}, + {"Perl_Gthr_key_ptr", (PERL_PROC*)&Perl_Gthr_key_ptr}, {"", NULL}, }; @@ -428,7 +447,7 @@ perl_runtime_link_init(char *libname, in if (hPerlLib != NULL) return OK; - if (!(hPerlLib = LoadLibraryEx(libname, NULL, 0))) + if ((hPerlLib = load_dll(libname)) == NULL) { if (verbose) EMSG2(_("E370: Could not load library %s"), libname); @@ -436,10 +455,10 @@ perl_runtime_link_init(char *libname, in } for (i = 0; perl_funcname_table[i].ptr; ++i) { - if (!(*perl_funcname_table[i].ptr = GetProcAddress(hPerlLib, + if (!(*perl_funcname_table[i].ptr = symbol_from_dll(hPerlLib, perl_funcname_table[i].name))) { - FreeLibrary(hPerlLib); + close_dll(hPerlLib); hPerlLib = NULL; if (verbose) EMSG2(_(e_loadfunc), perl_funcname_table[i].name); @@ -508,7 +527,7 @@ perl_end() #ifdef DYNAMIC_PERL if (hPerlLib) { - FreeLibrary(hPerlLib); + close_dll(hPerlLib); hPerlLib = NULL; } #endif