This is an automated email from the git hooks/post-receive script. gregoa pushed a commit to branch master in repository libdata-alias-perl.
commit 6faa4f258cf805b20cb34e300ae3fa027d703cbb Author: gregor herrmann <gre...@debian.org> Date: Wed Oct 21 17:03:00 2015 +0200 Imported Upstream version 1.19 --- .gitignore | 1 + Alias.xs | 128 ++++++++++++++++++++++++++++++++++++++++++++++-------- Changes | 22 ++++++++++ META.yml | 2 +- README | 2 +- lib/Data/Alias.pm | 4 +- 6 files changed, 136 insertions(+), 23 deletions(-) diff --git a/.gitignore b/.gitignore index 45b2336..7f7b25a 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,7 @@ /Makefile /pm_to_blib /blib +/MYMETA.json /MYMETA.yml /Data-Alias-* /Alias.c diff --git a/Alias.xs b/Alias.xs index 17a6d3d..32e7550 100644 --- a/Alias.xs +++ b/Alias.xs @@ -1,6 +1,6 @@ /* Copyright (C) 2003, 2004, 2006, 2007 Matthijs van Duin <xm...@cpan.org> * - * Copyright (C) 2010, 2011, 2013 Andrew Main (Zefram) <zef...@fysh.org> + * Copyright (C) 2010, 2011, 2013, 2015 Andrew Main (Zefram) <zef...@fysh.org> * * Parts from perl, which is Copyright (C) 1991-2013 Larry Wall and others * @@ -146,6 +146,22 @@ #define SVt_RV SVt_IV #endif +#ifndef IS_PADGV +#ifdef USE_ITHREADS +#define IS_PADGV(v) ((v) && SvTYPE(v) == SVt_PVGV) +#else +#define IS_PADGV(v) 0 +#endif +#endif + +#ifndef PadnamelistARRAY +#define PadnamelistARRAY(pnl) AvARRAY(pnl) +#endif + +#ifndef PadnameOUTER +#define PadnameOUTER(pn) (!!SvFAKE(pn)) +#endif + #if (PERL_COMBI_VERSION >= 5006000) && (PERL_COMBI_VERSION < 5011000) #define case_OP_SETSTATE_ case OP_SETSTATE: #else @@ -164,7 +180,9 @@ static char const msg_no_symref[] = #error "Data::Alias doesn't support Misc Attribute Decoration yet" #endif #define PL_lex_defer (PL_parser->lex_defer) +#if (PERL_COMBI_VERSION < 5021004) #define PL_lex_expect (PL_parser->lex_expect) +#endif #define PL_linestr (PL_parser->linestr) #define PL_expect (PL_parser->expect) #define PL_bufptr (PL_parser->bufptr) @@ -183,11 +201,11 @@ static char const msg_no_symref[] = #endif -#define OPpALIASAV 2 -#define OPpALIASHV 4 +#define OPpALIASAV 1 +#define OPpALIASHV 2 #define OPpALIAS (OPpALIASAV | OPpALIASHV) -#define OPpUSEFUL 128 +#define OPpUSEFUL OPpLVAL_INTRO #define MOD(op) op_lvalue((op), OP_GREPSTART) @@ -221,6 +239,10 @@ static char const msg_no_symref[] = STATIC OP *(*da_old_ck_rv2cv)(pTHX_ OP *op); STATIC OP *(*da_old_ck_entersub)(pTHX_ OP *op); +#if (PERL_COMBI_VERSION >= 5021007) +STATIC OP *(*da_old_ck_aelem)(pTHX_ OP *op); +STATIC OP *(*da_old_ck_helem)(pTHX_ OP *op); +#endif #ifdef USE_ITHREADS @@ -1485,7 +1507,8 @@ STATIC OP *DataAlias_pp_copy(pTHX) { STATIC void da_lvalue(pTHX_ OP *op, int list) { switch (op->op_type) { case OP_PADSV: op->op_ppaddr = DataAlias_pp_padsv; - if (SvFAKE(AvARRAY(PL_comppad_name)[op->op_targ]) + if (PadnameOUTER( + PadnamelistARRAY(PL_comppad_name)[op->op_targ]) && ckWARN(WARN_CLOSURE)) Perl_warner(aTHX_ packWARN(WARN_CLOSURE), DA_OUTER_ERR); @@ -1497,7 +1520,8 @@ STATIC void da_lvalue(pTHX_ OP *op, int list) { int i; if (!list) goto bad; for(i = start; i != start+count; i++) { - if (SvFAKE(AvARRAY(PL_comppad_name)[i]) + if (PadnameOUTER( + PadnamelistARRAY(PL_comppad_name)[i]) && ckWARN(WARN_CLOSURE)) Perl_warner(aTHX_ packWARN(WARN_CLOSURE), DA_OUTER_ERR); @@ -1704,6 +1728,7 @@ STATIC int da_transform(pTHX_ OP *op, int sib) { break; case OP_AASSIGN: op->op_ppaddr = DataAlias_pp_aassign; + op->op_private = 0; da_aassign(op, kid); MOD(kid); ksib = FALSE; @@ -1780,7 +1805,7 @@ STATIC int da_transform(pTHX_ OP *op, int sib) { } STATIC void da_peep2(pTHX_ OP *o) { - OP *sib, *k; + OP *sib, *k, *fk; int useful; while (o->op_ppaddr != da_tag_list) { while ((sib = o->op_sibling)) { @@ -1800,21 +1825,22 @@ STATIC void da_peep2(pTHX_ OP *o) { useful = o->op_private & OPpUSEFUL; op_null(o); o->op_ppaddr = PL_ppaddr[OP_NULL]; - k = o = cLISTOPo->op_first; + k = fk = cLISTOPo->op_first; while ((sib = k->op_sibling)) k = sib; - if (!(sib = cUNOPo->op_first) || sib->op_ppaddr != da_tag_rv2cv) { + if (!(sib = cUNOPx(fk)->op_first) || sib->op_ppaddr != da_tag_rv2cv) { Perl_warn(aTHX_ "da peep weirdness 1"); } else { k->op_sibling = sib; + cLISTOPo->op_last = sib; if (!(k = sib->op_next) || k->op_ppaddr != da_tag_entersub) { Perl_warn(aTHX_ "da peep weirdness 2"); } else { k->op_type = OP_ENTERSUB; if (sib->op_flags & OPf_SPECIAL) { k->op_ppaddr = DataAlias_pp_copy; - da_peep2(aTHX_ o); - } else if (!da_transform(aTHX_ o, TRUE) + da_peep2(aTHX_ fk); + } else if (!da_transform(aTHX_ fk, TRUE) && !useful && ckWARN(WARN_VOID)) { Perl_warner(aTHX_ packWARN(WARN_VOID), "Useless use of alias"); @@ -1846,7 +1872,7 @@ STATIC void da_peep(pTHX_ OP *o) { STATIC OP *da_ck_rv2cv(pTHX_ OP *o) { dDA; - SV **sp; + SV **sp, *gvsv; OP *kid; char *s, *start_s; CV *cv; @@ -1859,7 +1885,14 @@ STATIC OP *da_ck_rv2cv(pTHX_ OP *o) { return o; /* not lexing? */ kid = cUNOPo->op_first; if (kid->op_type != OP_GV || !DA_ACTIVE || ( - (cv = GvCV(kGVOP_gv)) != da_cv && cv != da_cvc )) + (gvsv = (SV*)kGVOP_gv, + cv = +#if (PERL_COMBI_VERSION >= 5021004) + SvROK(gvsv) ? (CV*)SvRV(gvsv) : +#endif + GvCV((GV*)gvsv), + 1) && + cv != da_cv && cv != da_cvc )) return o; if (o->op_private & OPpENTERSUB_AMPER) return o; @@ -1900,16 +1933,25 @@ STATIC OP *da_ck_rv2cv(pTHX_ OP *o) { if ((PL_nexttype[PL_nexttoke++] = yylex()) == '{') { PL_nexttype[PL_nexttoke++] = DO; sv_setpv((SV *) cv, "$"); - if (PERL_COMBI_VERSION >= 5011002 && - *PL_bufptr == '(') { + if ((PERL_COMBI_VERSION >= 5021004) || + (PERL_COMBI_VERSION >= 5011002 && + *PL_bufptr == '(')) { /* - * A paren here triggers special lexer + * On 5.21.4+, PL_expect can't be + * directly set as we'd like, and ends + * up wrong for parsing the interior of + * the block. Rectify it by injecting + * a semicolon, lexing of which sets + * PL_expect appropriately. On 5.11.2+, + * a paren here triggers special lexer * behaviour for a parenthesised argument * list, which screws up the normal * parsing that we want to continue. - * Suppress it by injecting a semicolon, - * which is otherwise a no-op coming just - * after the opening brace of a block. + * Suppress it by injecting a semicolon. + * Either way, apart from this tweaking of + * the lexer the semicolon is a no-op, + * coming as it does just after the + * opening brace of a block. */ Move(PL_bufptr, PL_bufptr+1, PL_bufend+1-PL_bufptr, char); @@ -1920,7 +1962,9 @@ STATIC OP *da_ck_rv2cv(pTHX_ OP *o) { } if(PL_lex_state != LEX_KNOWNEXT) { PL_lex_defer = PL_lex_state; +#if (PERL_COMBI_VERSION < 5021004) PL_lex_expect = PL_expect; +#endif PL_lex_state = LEX_KNOWNEXT; } PL_yylval = yylval; @@ -1994,6 +2038,9 @@ STATIC OP *da_ck_entersub(pTHX_ OP *o) { if (inside) op_null(tmp); RenewOpc(0, tmp, 1, UNOP, OP); +#if (PERL_COMBI_VERSION >= 5021006) + tmp->op_type = OP_CUSTOM; +#endif tmp->op_next = tmp; kLISTOP->op_first = tmp; kid = tmp; @@ -2008,6 +2055,10 @@ STATIC OP *da_ck_entersub(pTHX_ OP *o) { return o; } +#if (PERL_COMBI_VERSION >= 5021007) +STATIC OP *da_ck_aelem(pTHX_ OP *o) { return da_old_ck_aelem(aTHX_ o); } +STATIC OP *da_ck_helem(pTHX_ OP *o) { return da_old_ck_helem(aTHX_ o); } +#endif MODULE = Data::Alias PACKAGE = Data::Alias @@ -2025,6 +2076,45 @@ BOOT: PL_check[OP_RV2CV] = da_ck_rv2cv; da_old_ck_entersub = PL_check[OP_ENTERSUB]; PL_check[OP_ENTERSUB] = da_ck_entersub; +#if (PERL_COMBI_VERSION >= 5021007) + /* + * The multideref peep-time optimisation, introduced in + * Perl 5.21.7, is liable to incorporate into a multideref + * op aelem/helem ops that we need to modify. Because our + * modification of those ops gets applied late at peep + * time, after the main peeper, the specialness of the + * ops doesn't get a chance to inhibit incorporation + * into a multideref. As an ugly hack, we disable the + * multideref optimisation entirely for these op types + * by hooking their checking (and not actually doing + * anything in the checker). + * + * The multideref peep-time code has no logical + * reason to look at whether the op checking is in a + * non-default state. It deals with already-checked ops, + * so a check hook cannot make any difference to the + * future behaviour of those ops. Rather, it should, + * but currently (5.23.4) doesn't, check that op_ppaddr + * of the op to be incorporated has the standard value. + * If the superfluous PL_check[] check goes away, this + * hack will break. + * + * The proper fix for this problem would be to move our op + * munging from peep time to op check time. When ops are + * placed into an alias() wrapper they should be walked, + * and the contained assignments and lvalues modified. + * The modified lvalue aelem/helem ops would thereby be + * made visibly non-standard in plenty of time for the + * multideref peep-time code to avoid replacing them. + * If the multideref code is changed to look at op_ppaddr + * then that change alone will be sufficient; failing + * that the op_type can be changed to OP_CUSTOM. + */ + da_old_ck_aelem = PL_check[OP_AELEM]; + PL_check[OP_AELEM] = da_ck_aelem; + da_old_ck_helem = PL_check[OP_HELEM]; + PL_check[OP_HELEM] = da_ck_helem; +#endif } CvLVALUE_on(get_cv("Data::Alias::deref", TRUE)); da_old_peepp = PL_peepp; diff --git a/Changes b/Changes index 448a5eb..46bfb5f 100644 --- a/Changes +++ b/Changes @@ -1,3 +1,25 @@ +version 1.19; 2015-10-21 + + * update for new stricture on op_last in Perl 5.21.2 + + * update for the parser's PL_expect changes in Perl 5.21.4 + + * update for op_private stricture in Perl 5.21.4 + + * update for sub references directly in stash in Perl 5.21.4 + + * update for IS_PADGV()'s limited visibility in Perl 5.21.4 + + * update for increased specialness of OP_PUSHMARK in Perl 5.21.6 + + * update for distinct PADNAMELIST type in Perl 5.21.7 + + * update for multideref optimisation in Perl 5.21.7, by a disgusting + hack that depends on a flaw in the optimisation (which may disappear + in the future) and which disables the optimisation entirely + + * add MYMETA.json to .gitignore + version 1.18; 2013-09-21 * bugfix: store peep chain link reliably under threads diff --git a/META.yml b/META.yml index 3de735c..19fa62f 100644 --- a/META.yml +++ b/META.yml @@ -16,4 +16,4 @@ no_index: - t requires: perl: 5.8.1 -version: 1.18 +version: 1.19 diff --git a/README b/README index b5ade74..f9a3f00 100644 --- a/README +++ b/README @@ -29,7 +29,7 @@ updated it to work with Perl versions 5.11.0 and later. COPYRIGHT Copyright (C) 2003-2007 Matthijs van Duin. -Copyright (C) 2010, 2011, 2013 Andrew Main (Zefram) <zef...@fysh.org>. +Copyright (C) 2010, 2011, 2013, 2015 Andrew Main (Zefram) <zef...@fysh.org>. LICENSE diff --git a/lib/Data/Alias.pm b/lib/Data/Alias.pm index d315f0e..e7c0d69 100644 --- a/lib/Data/Alias.pm +++ b/lib/Data/Alias.pm @@ -5,7 +5,7 @@ use 5.008001; use strict; use warnings; -our $VERSION = '1.18'; +our $VERSION = '1.19'; use base 'Exporter'; use base 'DynaLoader'; @@ -412,7 +412,7 @@ updated it to work with Perl versions 5.11.0 and later. =head1 LICENSE Copyright (C) 2003-2007 Matthijs van Duin. -Copyright (C) 2010, 2011, 2013 Andrew Main (Zefram) <zef...@fysh.org>. +Copyright (C) 2010, 2011, 2013, 2015 Andrew Main (Zefram) <zef...@fysh.org>. All rights reserved. This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. -- Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-perl/packages/libdata-alias-perl.git _______________________________________________ Pkg-perl-cvs-commits mailing list Pkg-perl-cvs-commits@lists.alioth.debian.org http://lists.alioth.debian.org/cgi-bin/mailman/listinfo/pkg-perl-cvs-commits