Skip to content

Commit ae83002

Browse files
JRaspassoalders
authored andcommitted
Modernise XS
- Add newer (and an older) perls to GitHub Actions. - Drop <5.8 checks (including UNICODE_HTML_PARSER), this dist is 5.8+. - Drop our compatibility defines, use `ppport.h` instead. - Use newer, simpler constructs in a few places: - newSVpvn(s, len) → newSVpvs(s) - perl_call_method(...) → call_method(...) - perl_call_sv(...) → call_sv(...) - XPUSHs(sv_2mortal(sv)) → mXPUSHs(sv) - etc.
1 parent 053749c commit ae83002

File tree

6 files changed

+5456
-181
lines changed

6 files changed

+5456
-181
lines changed

.github/workflows/linux.yml

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,9 @@ jobs:
1212
strategy:
1313
matrix:
1414
perl-version:
15-
- '5.32'
15+
- '5.36'
16+
# - '5.34'
17+
# - '5.32'
1618
# - '5.30'
1719
# - '5.28'
1820
# - '5.26'

.github/workflows/macos.yml

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,9 @@ jobs:
1212
strategy:
1313
matrix:
1414
perl-version:
15-
- '5.32'
15+
- '5.36'
16+
# - '5.34'
17+
# - '5.32'
1618
# - '5.30'
1719
# - '5.28'
1820
# - '5.26'
@@ -23,7 +25,8 @@ jobs:
2325
# - '5.16'
2426
# - '5.14'
2527
# - '5.12'
26-
- '5.10'
28+
# - '5.10'
29+
- '5.8'
2730
steps:
2831
- uses: actions/checkout@v2
2932
- name: Setup perl

Parser.xs

Lines changed: 14 additions & 126 deletions
Original file line numberDiff line numberDiff line change
@@ -6,101 +6,14 @@
66
* modify it under the same terms as Perl itself.
77
*/
88

9-
10-
/*
11-
* Standard XS greeting.
12-
*/
13-
#ifdef __cplusplus
14-
extern "C" {
15-
#endif
169
#define PERL_NO_GET_CONTEXT /* we want efficiency */
1710
#include "EXTERN.h"
1811
#include "perl.h"
1912
#include "XSUB.h"
20-
#ifdef __cplusplus
21-
}
22-
#endif
23-
24-
25-
26-
/*
27-
* Some perl version compatibility gruff.
28-
*/
29-
#include "patchlevel.h"
30-
#if PATCHLEVEL <= 4 /* perl5.004_XX */
31-
32-
#ifndef PL_sv_undef
33-
#define PL_sv_undef sv_undef
34-
#define PL_sv_yes sv_yes
35-
#endif
36-
37-
#ifndef PL_hexdigit
38-
#define PL_hexdigit hexdigit
39-
#endif
40-
41-
#ifndef ERRSV
42-
#define ERRSV GvSV(errgv)
43-
#endif
44-
45-
#if (PATCHLEVEL == 4 && SUBVERSION <= 4)
46-
/* The newSVpvn function was introduced in perl5.004_05 */
47-
static SV *
48-
newSVpvn(char *s, STRLEN len)
49-
{
50-
register SV *sv = newSV(0);
51-
sv_setpvn(sv,s,len);
52-
return sv;
53-
}
54-
#endif /* not perl5.004_05 */
55-
#endif /* perl5.004_XX */
56-
57-
#ifndef dNOOP
58-
#define dNOOP extern int errno
59-
#endif
60-
#ifndef dTHX
61-
#define dTHX dNOOP
62-
#define pTHX_
63-
#define aTHX_
64-
#endif
65-
66-
#ifndef MEMBER_TO_FPTR
67-
#define MEMBER_TO_FPTR(x) (x)
68-
#endif
13+
#include "ppport.h"
6914

70-
#ifndef INT2PTR
71-
#define INT2PTR(any,d) (any)(d)
72-
#define PTR2IV(p) (IV)(p)
73-
#endif
74-
75-
76-
#if PATCHLEVEL > 6 || (PATCHLEVEL == 6 && SUBVERSION > 0)
77-
#define RETHROW croak(Nullch)
78-
#else
79-
#define RETHROW { STRLEN my_na; croak("%s", SvPV(ERRSV, my_na)); }
80-
#endif
81-
82-
#if PATCHLEVEL < 8
83-
/* No useable Unicode support */
84-
/* Make these harmless if present */
85-
#undef SvUTF8
86-
#undef SvUTF8_on
87-
#undef SvUTF8_off
88-
#define SvUTF8(sv) 0
89-
#define SvUTF8_on(sv) 0
90-
#define SvUTF8_off(sv) 0
91-
#else
92-
#define UNICODE_HTML_PARSER
93-
#endif
94-
95-
#ifdef G_WARN_ON
96-
#define DOWARN (PL_dowarn & G_WARN_ON)
97-
#else
98-
#define DOWARN PL_dowarn
99-
#endif
100-
101-
#ifndef CLONEf_JOIN_IN
102-
#define CLONEf_JOIN_IN 0
103-
#endif
15+
#define DOWARN (PL_dowarn & G_WARN_ON)
16+
#define RETHROW croak(Nullch)
10417

10518
/*
10619
* Include stuff. We include .c files instead of linking them,
@@ -142,17 +55,13 @@ static PSTATE*
14255
get_pstate_iv(pTHX_ SV* sv)
14356
{
14457
PSTATE *p;
145-
#if PATCHLEVEL < 8
146-
p = INT2PTR(PSTATE*, SvIV(sv));
147-
#else
14858
MAGIC *mg = SvMAGICAL(sv) ? mg_find(sv, '~') : NULL;
14959

15060
if (!mg)
15161
croak("Lost parser state magic");
15262
p = (PSTATE *)mg->mg_ptr;
15363
if (!p)
15464
croak("Lost parser state magic");
155-
#endif
15665
if (p->signature != P_SIGNATURE)
15766
croak("Bad signature in parser state object at %p", p);
15867
return p;
@@ -169,7 +78,7 @@ get_pstate_hv(pTHX_ SV* sv) /* used by XS typemap
16978
if (!sv || SvTYPE(sv) != SVt_PVHV)
17079
croak("Not a reference to a hash");
17180
hv = (HV*)sv;
172-
svp = hv_fetch(hv, "_hparser_xs_state", 17, 0);
81+
svp = hv_fetchs(hv, "_hparser_xs_state", 0);
17382
if (svp) {
17483
if (SvROK(*svp))
17584
return get_pstate_iv(aTHX_ SvRV(*svp));
@@ -211,15 +120,11 @@ free_pstate(pTHX_ PSTATE* pstate)
211120
static int
212121
magic_free_pstate(pTHX_ SV *sv, MAGIC *mg)
213122
{
214-
#if PATCHLEVEL < 8
215-
free_pstate(aTHX_ get_pstate_iv(aTHX_ sv));
216-
#else
217123
free_pstate(aTHX_ (PSTATE *)mg->mg_ptr);
218-
#endif
219124
return 0;
220125
}
221126

222-
#if defined(USE_ITHREADS) && PATCHLEVEL >= 8
127+
#if defined(USE_ITHREADS)
223128

224129
static PSTATE *
225130
dup_pstate(pTHX_ PSTATE *pstate, CLONE_PARAMS *params)
@@ -294,7 +199,7 @@ dup_pstate(pTHX_ PSTATE *pstate, CLONE_PARAMS *params)
294199

295200
if (params->flags & CLONEf_JOIN_IN) {
296201
pstate2->entity2char =
297-
perl_get_hv("HTML::Entities::entity2char", TRUE);
202+
get_hv("HTML::Entities::entity2char", GV_ADD);
298203
} else {
299204
pstate2->entity2char = (HV *)sv_dup((SV *)pstate->entity2char, params);
300205
}
@@ -319,7 +224,7 @@ const MGVTBL vtbl_pstate =
319224
0,
320225
0,
321226
MEMBER_TO_FPTR(magic_free_pstate),
322-
#if defined(USE_ITHREADS) && PATCHLEVEL >= 8
227+
#if defined(USE_ITHREADS)
323228
0,
324229
MEMBER_TO_FPTR(magic_dup_pstate),
325230
#endif
@@ -351,24 +256,20 @@ _alloc_pstate(self)
351256

352257
Newz(56, pstate, 1, PSTATE);
353258
pstate->signature = P_SIGNATURE;
354-
pstate->entity2char = perl_get_hv("HTML::Entities::entity2char", TRUE);
259+
pstate->entity2char = get_hv("HTML::Entities::entity2char", GV_ADD);
355260
pstate->tmp = NEWSV(0, 20);
356261

357262
sv = newSViv(PTR2IV(pstate));
358-
#if PATCHLEVEL < 8
359-
sv_magic(sv, 0, '~', 0, 0);
360-
#else
361263
sv_magic(sv, 0, '~', (char *)pstate, 0);
362-
#endif
363264
mg = mg_find(sv, '~');
364265
assert(mg);
365266
mg->mg_virtual = (MGVTBL*)&vtbl_pstate;
366-
#if defined(USE_ITHREADS) && PATCHLEVEL >= 8
267+
#if defined(USE_ITHREADS)
367268
mg->mg_flags |= MGf_DUP;
368269
#endif
369270
SvREADONLY_on(sv);
370271

371-
hv_store(hv, "_hparser_xs_state", 17, newRV_noinc(sv), 0);
272+
hv_stores(hv, "_hparser_xs_state", newRV_noinc(sv));
372273

373274
void
374275
parse(self, chunk)
@@ -387,7 +288,7 @@ parse(self, chunk)
387288
do {
388289
int count;
389290
PUSHMARK(SP);
390-
count = perl_call_sv(generator, G_SCALAR|G_EVAL);
291+
count = call_sv(generator, G_SCALAR|G_EVAL);
391292
SPAGAIN;
392293
chunk = count ? POPs : 0;
393294
PUTBACK;
@@ -473,11 +374,7 @@ strict_comment(pstate,...)
473374
case 7: attr = &pstate->case_sensitive; break;
474375
case 8: attr = &pstate->strict_end; break;
475376
case 9: attr = &pstate->closing_plaintext; break;
476-
#ifdef UNICODE_HTML_PARSER
477377
case 10: attr = &pstate->utf8_mode; break;
478-
#else
479-
case 10: croak("The utf8_mode does not work with this perl; perl-5.8 or better required");
480-
#endif
481378
case 11: attr = &pstate->empty_element_tags; break;
482379
case 12: attr = &pstate->xml_pic; break;
483380
case 13: attr = &pstate->backquote; break;
@@ -538,8 +435,8 @@ ignore_tags(pstate,...)
538435
if (SvTYPE(sv) == SVt_PVAV) {
539436
AV* av = (AV*)sv;
540437
STRLEN j;
541-
STRLEN len = av_len(av) + 1;
542-
for (j = 0; j < len; j++) {
438+
STRLEN top = av_top_index(av);
439+
for (j = 0; j <= top; j++) {
543440
SV**svp = av_fetch(av, j, 0);
544441
if (svp) {
545442
hv_store_ent(*attr, *svp, newSViv(0), 0);
@@ -611,7 +508,7 @@ void
611508
decode_entities(...)
612509
PREINIT:
613510
int i;
614-
HV *entity2char = perl_get_hv("HTML::Entities::entity2char", FALSE);
511+
HV *entity2char = get_hv("HTML::Entities::entity2char", 0);
615512
PPCODE:
616513
if (GIMME_V == G_SCALAR && items > 1)
617514
items = 1;
@@ -662,26 +559,17 @@ _probably_utf8_chunk(string)
662559
STRLEN len;
663560
char *s;
664561
CODE:
665-
#ifdef UNICODE_HTML_PARSER
666562
sv_utf8_downgrade(string, 0);
667563
s = SvPV(string, len);
668564
RETVAL = probably_utf8_chunk(aTHX_ s, len);
669-
#else
670-
RETVAL = 0; /* avoid never initialized complains from compiler */
671-
croak("_probably_utf8_chunk() only works for Unicode enabled perls");
672-
#endif
673565
OUTPUT:
674566
RETVAL
675567

676568
int
677569
UNICODE_SUPPORT()
678570
PROTOTYPE:
679571
CODE:
680-
#ifdef UNICODE_HTML_PARSER
681572
RETVAL = 1;
682-
#else
683-
RETVAL = 0;
684-
#endif
685573
OUTPUT:
686574
RETVAL
687575

0 commit comments

Comments
 (0)