diff --git a/Expat/Expat.xs b/Expat/Expat.xs index 02335ef..ed66531 100644 --- a/Expat/Expat.xs +++ b/Expat/Expat.xs @@ -11,7 +11,6 @@ #include <expat.h> -#define PERL_NO_GET_CONTEXT /* we want efficiency */ #include "EXTERN.h" #include "perl.h" #include "XSUB.h" @@ -33,10 +32,6 @@ #define PL_na na #endif -#if defined(PERL_IMPLICIT_CONTEXT) && ! defined(tTHX) -# define tTHX PerlInterpreter* -#endif - #define BUFSIZE 32768 #define NSDELIM '|' @@ -61,10 +56,6 @@ if (RETVAL != &PL_sv_undef && SvREFCNT(RETVAL)) sv_2mortal(RETVAL) typedef struct { -#ifdef PERL_IMPLICIT_CONTEXT - tTHX aTHX; /* on 5.8 and older, pTHX contains a "register" which is not - compatible with a struct def, so use something else */ -#endif SV* self_sv; XML_Parser p; @@ -115,12 +106,6 @@ typedef struct { } CallbackVector; -#ifdef PERL_IMPLICIT_CONTEXT -# define dXMLTHX(x) dTHXa((x)->aTHX) -#else -# define dXMLTHX(x) dNOOP -#endif - static HV* EncodingTable = NULL; static XML_Char nsdelim[] = {NSDELIM, '\0'}; @@ -129,9 +114,8 @@ static char *QuantChar[] = {"", "?", "*", "+"}; /* Forward declarations */ -static void suspend_callbacks(pTHX_ CallbackVector *); -static void resume_callbacks(pTHX_ CallbackVector *); -static int unknownEncoding(void *, const char *, XML_Encoding *); +static void suspend_callbacks(CallbackVector *); +static void resume_callbacks(CallbackVector *); #if PATCHLEVEL < 5 && SUBVERSION < 5 @@ -159,7 +143,7 @@ newSVpvn(char *s, STRLEN len) #ifdef SvUTF8_on static SV * -newUTF8SVpv_thx(pTHX_ char *s, STRLEN len) { +newUTF8SVpv(char *s, STRLEN len) { register SV *sv; sv = newSVpv(s, len); @@ -168,7 +152,7 @@ newUTF8SVpv_thx(pTHX_ char *s, STRLEN len) { } /* End new UTF8SVpv */ static SV * -newUTF8SVpvn_thx(pTHX_ char *s, STRLEN len) { +newUTF8SVpvn(char *s, STRLEN len) { register SV *sv; sv = newSV(0); @@ -177,9 +161,6 @@ newUTF8SVpvn_thx(pTHX_ char *s, STRLEN len) { return sv; } -#define newUTF8SVpv(s, len) newUTF8SVpv_thx(aTHX_ (s), (len)) -#define newUTF8SVpvn(s, len) newUTF8SVpvn_thx(aTHX_ (s), (len)) - #else /* SvUTF8_on not defined */ #define newUTF8SVpv newSVpv @@ -213,7 +194,7 @@ myfree(void *p) { static XML_Memory_Handling_Suite ms = {mymalloc, myrealloc, myfree}; static void -append_error(pTHX_ XML_Parser parser, char * err) +append_error(XML_Parser parser, char * err) { dSP; CallbackVector * cbv; @@ -267,7 +248,7 @@ append_error(pTHX_ XML_Parser parser, char * err) } /* End append_error */ static SV * -generate_model(pTHX_ XML_Content *model) { +generate_model(XML_Content *model) { HV * hash = newHV(); SV * obj = newRV_noinc((SV *) hash); @@ -292,7 +273,7 @@ generate_model(pTHX_ XML_Content *model) { int i; for (i = 0; i < model->numchildren; i++) { - av_push(children, generate_model(aTHX_ &model->children[i])); + av_push(children, generate_model(&model->children[i])); } hv_store(hash, "Children", 8, newRV_noinc((SV *) children), 0); @@ -304,7 +285,7 @@ generate_model(pTHX_ XML_Content *model) { } /* End generate_model */ static int -parse_stream(pTHX_ XML_Parser parser, SV * ioref) +parse_stream(XML_Parser parser, SV * ioref) { dSP; SV * tbuff; @@ -424,7 +405,7 @@ parse_stream(pTHX_ XML_Parser parser, SV * ioref) } if (! ret) - append_error(aTHX_ parser, msg); + append_error(parser, msg); if (! cbv->delim) { SvREFCNT_dec(tsiz); @@ -438,7 +419,7 @@ parse_stream(pTHX_ XML_Parser parser, SV * ioref) } /* End parse_stream */ static SV * -gen_ns_name(pTHX_ const char * name, HV * ns_table, AV * ns_list) +gen_ns_name(const char * name, HV * ns_table, AV * ns_list) { char *pos = strchr(name, NSDELIM); SV * ret; @@ -477,9 +458,8 @@ gen_ns_name(pTHX_ const char * name, HV * ns_table, AV * ns_list) static void characterData(void *userData, const char *s, int len) { - CallbackVector* cbv = (CallbackVector*) userData; - dXMLTHX(cbv); dSP; + CallbackVector* cbv = (CallbackVector*) userData; ENTER; SAVETMPS; @@ -498,9 +478,8 @@ characterData(void *userData, const char *s, int len) static void startElement(void *userData, const char *name, const char **atts) { - CallbackVector* cbv = (CallbackVector*) userData; - dXMLTHX(cbv); dSP; + CallbackVector* cbv = (CallbackVector*) userData; SV ** pcontext; unsigned do_ns = cbv->ns; unsigned skipping = 0; @@ -513,7 +492,7 @@ startElement(void *userData, const char *name, const char **atts) if (cbv->skip_until) { skipping = cbv->st_serial < cbv->skip_until; if (! skipping) { - resume_callbacks(aTHX_ cbv); + resume_callbacks(cbv); cbv->skip_until = 0; } } @@ -528,7 +507,7 @@ startElement(void *userData, const char *name, const char **atts) cbv->st_serial_stack[++cbv->st_serial_stackptr] = cbv->st_serial; if (do_ns) - elname = gen_ns_name(aTHX_ name, cbv->nstab, cbv->nslst); + elname = gen_ns_name(name, cbv->nstab, cbv->nslst); else elname = newUTF8SVpv((char *)name, 0); @@ -550,7 +529,7 @@ startElement(void *userData, const char *name, const char **atts) { SV * attname; - attname = (do_ns ? gen_ns_name(aTHX_ *atts, cbv->nstab, cbv->nslst) + attname = (do_ns ? gen_ns_name(*atts, cbv->nstab, cbv->nslst) : newUTF8SVpv((char *) *atts, 0)); atts++; @@ -575,9 +554,8 @@ startElement(void *userData, const char *name, const char **atts) static void endElement(void *userData, const char *name) { - CallbackVector* cbv = (CallbackVector*) userData; - dXMLTHX(cbv); dSP; + CallbackVector* cbv = (CallbackVector*) userData; SV *elname; elname = av_pop(cbv->context); @@ -610,9 +588,8 @@ endElement(void *userData, const char *name) static void processingInstruction(void *userData, const char *target, const char *data) { - CallbackVector* cbv = (CallbackVector*) userData; - dXMLTHX(cbv); dSP; + CallbackVector* cbv = (CallbackVector*) userData; ENTER; SAVETMPS; @@ -632,9 +609,8 @@ processingInstruction(void *userData, const char *target, const char *data) static void commenthandle(void *userData, const char *string) { - CallbackVector * cbv = (CallbackVector*) userData; - dXMLTHX(cbv); dSP; + CallbackVector * cbv = (CallbackVector*) userData; ENTER; SAVETMPS; @@ -653,9 +629,8 @@ commenthandle(void *userData, const char *string) static void startCdata(void *userData) { - CallbackVector* cbv = (CallbackVector*) userData; - dXMLTHX(cbv); dSP; + CallbackVector* cbv = (CallbackVector*) userData; if (cbv->startcd_sv) { ENTER; @@ -674,9 +649,8 @@ startCdata(void *userData) static void endCdata(void *userData) { - CallbackVector* cbv = (CallbackVector*) userData; - dXMLTHX(cbv); dSP; + CallbackVector* cbv = (CallbackVector*) userData; if (cbv->endcd_sv) { ENTER; @@ -694,9 +668,8 @@ endCdata(void *userData) static void nsStart(void *userdata, const XML_Char *prefix, const XML_Char *uri){ - CallbackVector* cbv = (CallbackVector*) userdata; - dXMLTHX(cbv); dSP; + CallbackVector* cbv = (CallbackVector*) userdata; ENTER; SAVETMPS; @@ -715,9 +688,8 @@ nsStart(void *userdata, const XML_Char *prefix, const XML_Char *uri){ static void nsEnd(void *userdata, const XML_Char *prefix) { - CallbackVector* cbv = (CallbackVector*) userdata; - dXMLTHX(cbv); dSP; + CallbackVector* cbv = (CallbackVector*) userdata; ENTER; SAVETMPS; @@ -736,9 +708,8 @@ nsEnd(void *userdata, const XML_Char *prefix) { static void defaulthandle(void *userData, const char *string, int len) { - CallbackVector* cbv = (CallbackVector*) userData; - dXMLTHX(cbv); dSP; + CallbackVector* cbv = (CallbackVector*) userData; ENTER; SAVETMPS; @@ -758,16 +729,15 @@ static void elementDecl(void *data, const char *name, XML_Content *model) { - CallbackVector *cbv = (CallbackVector*) data; - dXMLTHX(cbv); dSP; + CallbackVector *cbv = (CallbackVector*) data; SV *cmod; ENTER; SAVETMPS; - cmod = generate_model(aTHX_ model); + cmod = generate_model(model); Safefree(model); PUSHMARK(sp); @@ -789,9 +759,8 @@ attributeDecl(void *data, const char * att_type, const char * dflt, int reqorfix) { - CallbackVector *cbv = (CallbackVector*) data; - dXMLTHX(cbv); dSP; + CallbackVector *cbv = (CallbackVector*) data; SV * dfltsv; if (dflt) { @@ -831,9 +800,8 @@ entityDecl(void *data, const char *sysid, const char *pubid, const char *notation) { - CallbackVector *cbv = (CallbackVector*) data; - dXMLTHX(cbv); dSP; + CallbackVector *cbv = (CallbackVector*) data; ENTER; SAVETMPS; @@ -861,9 +829,8 @@ doctypeStart(void *userData, const char* sysid, const char* pubid, int hasinternal) { - CallbackVector *cbv = (CallbackVector*) userData; - dXMLTHX(cbv); dSP; + CallbackVector *cbv = (CallbackVector*) userData; ENTER; SAVETMPS; @@ -883,9 +850,8 @@ doctypeStart(void *userData, static void doctypeEnd(void *userData) { - CallbackVector *cbv = (CallbackVector*) userData; - dXMLTHX(cbv); dSP; + CallbackVector *cbv = (CallbackVector*) userData; ENTER; SAVETMPS; @@ -904,9 +870,8 @@ xmlDecl(void *userData, const char *version, const char *encoding, int standalone) { - CallbackVector *cbv = (CallbackVector*) userData; - dXMLTHX(cbv); dSP; + CallbackVector *cbv = (CallbackVector*) userData; ENTER; SAVETMPS; @@ -934,9 +899,8 @@ unparsedEntityDecl(void *userData, const char* pubid, const char* notation) { - CallbackVector* cbv = (CallbackVector*) userData; - dXMLTHX(cbv); dSP; + CallbackVector* cbv = (CallbackVector*) userData; ENTER; SAVETMPS; @@ -963,9 +927,8 @@ notationDecl(void *userData, const char *sysid, const char *pubid) { - CallbackVector* cbv = (CallbackVector*) userData; - dXMLTHX(cbv); dSP; + CallbackVector* cbv = (CallbackVector*) userData; PUSHMARK(sp); XPUSHs(cbv->self_sv); @@ -1002,14 +965,16 @@ externalEntityRef(XML_Parser parser, const char* sysid, const char* pubid) { + dSP; +#if defined(USE_THREADS) && PATCHLEVEL==6 + dTHX; +#endif int count; int ret = 0; int parse_done = 0; CallbackVector* cbv = (CallbackVector*) XML_GetUserData(parser); - dXMLTHX(cbv); - dSP; if (! cbv->extent_sv) return 0; @@ -1031,13 +996,12 @@ externalEntityRef(XML_Parser parser, if (count >= 1) { SV * result = POPs; int type; - SV * errsv; if (result && (type = SvTYPE(result)) > 0) { SV **pval = hv_fetch((HV*) SvRV(cbv->self_sv), "Parser", 6, 0); if (! pval || ! SvIOK(*pval)) - append_error(aTHX_ parser, "Can't find parser entry in XML::Parser object"); + append_error(parser, "Can't find parser entry in XML::Parser object"); else { XML_Parser entpar; char *errmsg = (char *) 0; @@ -1045,15 +1009,6 @@ externalEntityRef(XML_Parser parser, entpar = XML_ExternalEntityParserCreate(parser, open, 0); XML_SetBase(entpar, XML_GetBase(parser)); - /* inside XML_ExternalEntityParserCreate, oldUnknownEncodingHandler is copied - * to (new) unknownEncodingHandler but unknownEncodingHandlerData is NOT!, so - * later on when unknownEncoding executes, var unused is NULL and SEGVs, so - * manually set unknownEncodingHandlerData again so my_perl is stored and not - * NULL in this new parser - */ -#ifdef PERL_IMPLICIT_CONTEXT - XML_SetUnknownEncodingHandler(entpar, unknownEncoding, aTHX); -#endif sv_setiv(*pval, (IV) entpar); @@ -1068,13 +1023,12 @@ externalEntityRef(XML_Parser parser, G_SCALAR | G_EVAL); SPAGAIN; - errsv = ERRSV; - if (SvTRUE(errsv)) { + if (SvTRUE(ERRSV)) { char *hold; STRLEN len; POPs; - hold = SvPV(errsv, len); + hold = SvPV(ERRSV, len); New(326, errmsg, len + 1, char); if (len) Copy(hold, errmsg, len, char); @@ -1099,15 +1053,14 @@ externalEntityRef(XML_Parser parser, SPAGAIN; } - errsv = ERRSV; - if (SvTRUE(errsv)) - append_error(aTHX_ parser, SvPV_nolen(errsv)); + if (SvTRUE(ERRSV)) + append_error(parser, SvPV_nolen(ERRSV)); } } } if (! ret && ! parse_done) - append_error(aTHX_ parser, "Handler couldn't resolve external entity"); + append_error(parser, "Handler couldn't resolve external entity"); PUTBACK ; FREETMPS ; @@ -1163,9 +1116,6 @@ convert_to_unicode(void *data, const char *seq) { static int unknownEncoding(void *unused, const char *name, XML_Encoding *info) { -#ifdef PERL_IMPLICIT_CONTEXT - dTHXa(unused); -#endif SV ** encinfptr; Encinfo *enc; int namelen; @@ -1235,7 +1185,6 @@ static void recString(void *userData, const char *string, int len) { CallbackVector *cbv = (CallbackVector*) userData; - dXMLTHX(cbv); if (cbv->recstring) { sv_catpvn(cbv->recstring, (char *) string, len); @@ -1246,7 +1195,7 @@ recString(void *userData, const char *string, int len) } /* End recString */ static void -suspend_callbacks(pTHX_ CallbackVector *cbv) { +suspend_callbacks(CallbackVector *cbv) { if (SvTRUE(cbv->char_sv)) { XML_SetCharacterDataHandler(cbv->p, (XML_CharacterDataHandler) 0); @@ -1287,7 +1236,7 @@ suspend_callbacks(pTHX_ CallbackVector *cbv) { } /* End suspend_callbacks */ static void -resume_callbacks(pTHX_ CallbackVector *cbv) { +resume_callbacks(CallbackVector *cbv) { if (SvTRUE(cbv->char_sv)) { XML_SetCharacterDataHandler(cbv->p, characterData); } @@ -1335,9 +1284,6 @@ XML_ParserCreate(self_sv, enc_sv, namespaces) SV ** spp; Newz(320, cbv, 1, CallbackVector); -#ifdef PERL_IMPLICIT_CONTEXT - cbv->aTHX = aTHX; -#endif cbv->self_sv = SvREFCNT_inc(self_sv); Newz(325, cbv->st_serial_stack, 1024, unsigned int); spp = hv_fetch((HV*)SvRV(cbv->self_sv), "NoExpand", 8, 0); @@ -1384,12 +1330,7 @@ XML_ParserCreate(self_sv, enc_sv, namespaces) cbv->p = RETVAL; XML_SetUserData(RETVAL, (void *) cbv); XML_SetElementHandler(RETVAL, startElement, endElement); -#ifdef PERL_IMPLICIT_CONTEXT - XML_SetUnknownEncodingHandler(RETVAL, unknownEncoding, aTHX); -#else XML_SetUnknownEncodingHandler(RETVAL, unknownEncoding, 0); -#error bad -#endif spp = hv_fetch((HV*)SvRV(cbv->self_sv), "ParseParamEnt", 13, FALSE); @@ -1507,7 +1448,7 @@ XML_ParseString(parser, sv) RETVAL = XML_Parse(parser, s, len, 1); SPAGAIN; /* XML_Parse might have changed stack pointer */ if (! RETVAL) - append_error(aTHX_ parser, NULL); + append_error(parser, NULL); } OUTPUT: @@ -1531,7 +1472,7 @@ XML_ParseStream(parser, ioref, delim) cbv->delim = (char *) 0; } - RETVAL = parse_stream(aTHX_ parser, ioref); + RETVAL = parse_stream(parser, ioref); SPAGAIN; /* parse_stream might have changed stack pointer */ } @@ -1550,7 +1491,7 @@ XML_ParsePartial(parser, sv) RETVAL = XML_Parse(parser, s, len, 0); if (! RETVAL) - append_error(aTHX_ parser, NULL); + append_error(parser, NULL); } OUTPUT: @@ -1564,7 +1505,7 @@ XML_ParseDone(parser) { RETVAL = XML_Parse(parser, "", 0, 1); if (! RETVAL) - append_error(aTHX_ parser, NULL); + append_error(parser, NULL); } OUTPUT: @@ -1967,7 +1908,7 @@ GenerateNSName(name, xml_namespace, table, list) *bp++ = *nmstr++; *bp = '\0'; - RETVAL = gen_ns_name(aTHX_ buff, (HV *) SvRV(table), (AV *) SvRV(list)); + RETVAL = gen_ns_name(buff, (HV *) SvRV(table), (AV *) SvRV(list)); Safefree(buff); } OUTPUT: @@ -2204,7 +2145,7 @@ XML_UnsetAllHandlers(parser) { CallbackVector * cbv = (CallbackVector *) XML_GetUserData(parser); - suspend_callbacks(aTHX_ cbv); + suspend_callbacks(cbv); if (cbv->ns) { XML_SetNamespaceDeclHandler(cbv->p, (XML_StartNamespaceDeclHandler) 0, @@ -2241,7 +2182,7 @@ XML_SkipUntil(parser, index) if (index <= cbv->st_serial) return; cbv->skip_until = index; - suspend_callbacks(aTHX_ cbv); + suspend_callbacks(cbv); } int @@ -2255,10 +2196,10 @@ XML_Do_External_Parse(parser, result) CallbackVector * cbv = (CallbackVector *) XML_GetUserData(parser); if (SvROK(result) && SvOBJECT(SvRV(result))) { - RETVAL = parse_stream(aTHX_ parser, result); + RETVAL = parse_stream(parser, result); } else if (isGV(result)) { - RETVAL = parse_stream(aTHX_ parser, + RETVAL = parse_stream(parser, sv_2mortal(newRV((SV*) GvIOp(result)))); } else if (SvPOK(result)) { diff --git a/Expat/Makefile.PL b/Expat/Makefile.PL index 38b3695..6d5111c 100644 --- a/Expat/Makefile.PL +++ b/Expat/Makefile.PL @@ -5,16 +5,9 @@ use English; my $libs = "-lexpat"; my @extras = (); -push(@extras, INC => - (index($expat_incpath, ' ') != -1 - ?"\"-I$expat_incpath\"" - :"-I$expat_incpath")) - if $expat_incpath; +push(@extras, INC => "-I$expat_incpath") if $expat_incpath; -$libs = index($expat_libpath, ' ') != -1 - ?"\"-L$expat_libpath\" $libs" - :"-L$expat_libpath $libs" - if $expat_libpath; +$libs = "-L$expat_libpath $libs" if $expat_libpath; push(@extras, CAPI => 'TRUE') if (($PERL_VERSION >= 5.005) and ($OSNAME eq 'MSWin32')