summaryrefslogtreecommitdiff
path: root/pp_sort.c
diff options
context:
space:
mode:
authorFather Chrysostomos <sprout@cpan.org>2011-10-15 14:05:33 -0700
committerFather Chrysostomos <sprout@cpan.org>2011-10-15 14:24:27 -0700
commit2fc49ef14c391f64250e0f99fbbed2007b880289 (patch)
tree09a7cf04ca5912c7f2c2dec482ff0d5638f8e51b /pp_sort.c
parent67ecba2f90752611c774e73ef7ad292d8d4a03c9 (diff)
downloadperl-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.c10
1 files changed, 5 insertions, 5 deletions
diff --git a/pp_sort.c b/pp_sort.c
index 2257d2f8c9..d527d1e7e8 100644
--- a/pp_sort.c
+++ b/pp_sort.c
@@ -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))) {