diff options
author | Father Chrysostomos <sprout@cpan.org> | 2011-10-15 14:05:33 -0700 |
---|---|---|
committer | Father Chrysostomos <sprout@cpan.org> | 2011-10-15 14:24:27 -0700 |
commit | 2fc49ef14c391f64250e0f99fbbed2007b880289 (patch) | |
tree | 09a7cf04ca5912c7f2c2dec482ff0d5638f8e51b /pp_sort.c | |
parent | 67ecba2f90752611c774e73ef7ad292d8d4a03c9 (diff) | |
download | perl-2fc49ef14c391f64250e0f99fbbed2007b880289.tar.gz |
Make XS sort routines work again
These stopped working when the CvROOT and CvXSUB fields were merged
in 5.10.0:
$ perl5.8.9 -le 'print sort utf8::is_utf8 2,1'
Usage: utf8::is_utf8(sv) at -e line 1.
$ perl5.10.0 -le 'print sort utf8::is_utf8 2,1'
12
(In the latter case, the utf8::is_utf8 routine is not being called.)
pp_sort has this:
if (!(cv && CvROOT(cv))) {
if (cv && CvISXSUB(cv)) {
But CvROOT is the same as CvXSUB, so that block is never entered for
XSUBs, so this piece of code later on:
if (is_xsub)
PL_sortcop = (OP*)cv;
else
PL_sortcop = CvSTART(cv);
sets PL_sortcop to CvSTART for XSUBs, but CvSTART is NULL. Later on,
this if condition fails:
if (PL_sortcop) {
so the XSUB is treated as being absent.
Diffstat (limited to 'pp_sort.c')
-rw-r--r-- | pp_sort.c | 10 |
1 files changed, 5 insertions, 5 deletions
@@ -1525,11 +1525,11 @@ PP(pp_sort) hasargs = TRUE; } } - if (!(cv && CvROOT(cv))) { - if (cv && CvISXSUB(cv)) { - is_xsub = 1; - } - else if (gv) { + if (cv && CvISXSUB(cv) && CvXSUB(cv)) { + is_xsub = 1; + } + else if (!(cv && CvROOT(cv))) { + if (gv) { goto autoload; } else if (!CvANON(cv) && (gv = CvGV(cv))) { |