From 53099361ccac273f69fea1f7739d884db52bbf1a Mon Sep 17 00:00:00 2001 From: Jesse Luehrs Date: Sun, 10 Jul 2011 04:35:36 -0500 Subject: hack around a parsing bug in earlier perls this may preclude us from being able to implement bug-compatible engines from both 5.12 and 5.14, but... shrug, can deal with that later if we decide we care --- smartmatch.xs | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) (limited to 'smartmatch.xs') diff --git a/smartmatch.xs b/smartmatch.xs index a639242..5fa0280 100644 --- a/smartmatch.xs +++ b/smartmatch.xs @@ -51,6 +51,46 @@ smartmatch_cb(pTHX_ OP *o, void *user_data) o->op_flags &= ~OPf_KIDS; op_free(o); +/* array slices used to parse incorrectly (perl RT#77468), + * fix (hack) this up */ +#if PERL_VERSION < 14 + if (left->op_type == OP_ASLICE) { + OP *sib; + sib = left->op_sibling; + left->op_flags &= ~OPf_WANT_SCALAR; + left->op_flags |= OPf_WANT_LIST + | OPf_PARENS + | OPf_REF + | OPf_MOD + | OPf_STACKED + | OPf_SPECIAL; + left->op_sibling = NULL; + left = newLISTOP(OP_ANONLIST, + OPf_WANT_SCALAR|OPf_SPECIAL, + newOP(OP_PUSHMARK, 0), + left); + left->op_sibling = sib; + } + if (right->op_type == OP_ASLICE) { + OP *sib; + sib = right->op_sibling; + right->op_flags &= ~OPf_WANT_SCALAR; + right->op_flags |= OPf_WANT_LIST + | OPf_PARENS + | OPf_REF + | OPf_MOD + | OPf_STACKED + | OPf_SPECIAL; + right->op_sibling = NULL; + right = newLISTOP(OP_ANONLIST, + OPf_WANT_SCALAR|OPf_SPECIAL, + newOP(OP_PUSHMARK, 0), + right); + right->op_sibling = sib; + left->op_sibling = right; + } +#endif + cb_op = newCVREF(0, newSVOP(OP_CONST, 0, newSVsv(*cb))); list = newLISTOP(OP_LIST, 0, left, right); new = newUNOP(OP_ENTERSUB, OPf_STACKED, -- cgit v1.2.3-54-g00ecf