comparison src/if_perl.xs @ 33101:8cbdd2cbf10a v9.0.1835

patch 9.0.1835: Perl interface has problems with load PL_current_context Commit: https://github.com/vim/vim/commit/7a9d1aa878d8724e28893b968016b86a3a70c63f Author: Yee Cheng Chin <ychin.git@gmail.com> Date: Fri Sep 1 18:46:17 2023 +0200 patch 9.0.1835: Perl interface has problems with load PL_current_context Problem: Perl interface has problems with load PL_current_context Solution: Fix Perl interface to load PL_current_context from library In #12914, in order to fix an issue with Perl 5.36 dynamic builds, (that version introduced a thread-local `PL_current_context`), the file added the variable manually so we can satisfy the linker. However, the variable is a different one from the one in the library, so there could be unpredictable behavior. Instead, just use `dlsym` to load the context from the library. The fact that it's thread-local doesn't matter too much to us because Vim's interface is single-threaded so it will work properly. closes: #12996 Signed-off-by: Christian Brabandt <cb@256bit.org> Co-authored-by: Yee Cheng Chin <ychin.git@gmail.com>
author Christian Brabandt <cb@256bit.org>
date Fri, 01 Sep 2023 19:00:04 +0200
parents 897f3ed27be2
children 9b35b4c6df4c
comparison
equal deleted inserted replaced
33100:d6ca39752b4f 33101:8cbdd2cbf10a
312 # endif 312 # endif
313 # if (PERL_REVISION == 5) && (PERL_VERSION >= 14) 313 # if (PERL_REVISION == 5) && (PERL_VERSION >= 14)
314 # ifdef USE_ITHREADS 314 # ifdef USE_ITHREADS
315 # define PL_thr_key *dll_PL_thr_key 315 # define PL_thr_key *dll_PL_thr_key
316 # endif 316 # endif
317 # endif
318 # ifdef PERL_USE_THREAD_LOCAL
319 # define PL_current_context *dll_PL_current_context
317 # endif 320 # endif
318 # define Perl_hv_iternext_flags dll_Perl_hv_iternext_flags 321 # define Perl_hv_iternext_flags dll_Perl_hv_iternext_flags
319 # define Perl_hv_iterinit dll_Perl_hv_iterinit 322 # define Perl_hv_iterinit dll_Perl_hv_iterinit
320 # define Perl_hv_iterkey dll_Perl_hv_iterkey 323 # define Perl_hv_iterkey dll_Perl_hv_iterkey
321 # define Perl_hv_iterval dll_Perl_hv_iterval 324 # define Perl_hv_iterval dll_Perl_hv_iterval
482 static GV** (*Perl_Idefgv_ptr)(register PerlInterpreter*); 485 static GV** (*Perl_Idefgv_ptr)(register PerlInterpreter*);
483 static GV** (*Perl_Ierrgv_ptr)(register PerlInterpreter*); 486 static GV** (*Perl_Ierrgv_ptr)(register PerlInterpreter*);
484 static SV* (*Perl_Isv_yes_ptr)(register PerlInterpreter*); 487 static SV* (*Perl_Isv_yes_ptr)(register PerlInterpreter*);
485 static perl_key* (*Perl_Gthr_key_ptr)_((pTHX)); 488 static perl_key* (*Perl_Gthr_key_ptr)_((pTHX));
486 # endif 489 # endif
490 # ifdef PERL_USE_THREAD_LOCAL
491 static void** dll_PL_current_context;
492 # endif
487 static void (*boot_DynaLoader)_((pTHX_ CV*)); 493 static void (*boot_DynaLoader)_((pTHX_ CV*));
488 static HE * (*Perl_hv_iternext_flags)(pTHX_ HV *, I32); 494 static HE * (*Perl_hv_iternext_flags)(pTHX_ HV *, I32);
489 static I32 (*Perl_hv_iterinit)(pTHX_ HV *); 495 static I32 (*Perl_hv_iterinit)(pTHX_ HV *);
490 static char * (*Perl_hv_iterkey)(pTHX_ HE *, I32 *); 496 static char * (*Perl_hv_iterkey)(pTHX_ HE *, I32 *);
491 static SV * (*Perl_hv_iterval)(pTHX_ HV *, HE *); 497 static SV * (*Perl_hv_iterval)(pTHX_ HV *, HE *);
631 # endif 637 # endif
632 # if (PERL_REVISION == 5) && (PERL_VERSION >= 14) 638 # if (PERL_REVISION == 5) && (PERL_VERSION >= 14)
633 # ifdef USE_ITHREADS 639 # ifdef USE_ITHREADS
634 {"PL_thr_key", (PERL_PROC*)&dll_PL_thr_key}, 640 {"PL_thr_key", (PERL_PROC*)&dll_PL_thr_key},
635 # endif 641 # endif
642 # ifdef PERL_USE_THREAD_LOCAL
643 {"PL_current_context", (PERL_PROC*)&dll_PL_current_context},
644 # endif
636 # else 645 # else
637 {"Perl_Idefgv_ptr", (PERL_PROC*)&Perl_Idefgv_ptr}, 646 {"Perl_Idefgv_ptr", (PERL_PROC*)&Perl_Idefgv_ptr},
638 {"Perl_Ierrgv_ptr", (PERL_PROC*)&Perl_Ierrgv_ptr}, 647 {"Perl_Ierrgv_ptr", (PERL_PROC*)&Perl_Ierrgv_ptr},
639 {"Perl_Isv_yes_ptr", (PERL_PROC*)&Perl_Isv_yes_ptr}, 648 {"Perl_Isv_yes_ptr", (PERL_PROC*)&Perl_Isv_yes_ptr},
640 {"Perl_Gthr_key_ptr", (PERL_PROC*)&Perl_Gthr_key_ptr}, 649 {"Perl_Gthr_key_ptr", (PERL_PROC*)&Perl_Gthr_key_ptr},
1514 { 1523 {
1515 return (*dll_Perl_sv_2iv_flags)(aTHX_ sv, flags); 1524 return (*dll_Perl_sv_2iv_flags)(aTHX_ sv, flags);
1516 } 1525 }
1517 # endif 1526 # endif
1518 1527
1519 # ifdef PERL_USE_THREAD_LOCAL
1520 PERL_THREAD_LOCAL void *PL_current_context;
1521 # endif
1522
1523 #endif // DYNAMIC_PERL 1528 #endif // DYNAMIC_PERL
1524 1529
1525 XS(boot_VIM); 1530 XS(boot_VIM);
1526 1531
1527 static void 1532 static void