Mercurial > vim
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 |