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