Merge tag 'upstream/0.29' into openkylin/nile

Upstream version 0.29
This commit is contained in:
zhouganqing 2024-07-09 17:34:00 +08:00
commit 7ef27b534a
32 changed files with 222 additions and 96 deletions

4
.editorconfig Normal file
View File

@ -0,0 +1,4 @@
root = true
[*.{pm,pl,t}]
indent_size = 3

View File

@ -8,7 +8,7 @@ use XS::Parse::Keyword::Builder;
my $build = Module::Build->new( my $build = Module::Build->new(
module_name => "Syntax::Keyword::Try", module_name => "Syntax::Keyword::Try",
test_requires => { test_requires => {
'Test::More' => '0.88', # done_testing 'Test2::V0' => 0,
}, },
configure_requires => { configure_requires => {
'Module::Build' => '0.4004', # test_requires 'Module::Build' => '0.4004', # test_requires

13
Changes
View File

@ -1,5 +1,18 @@
Revision history for Syntax-Keyword-Try Revision history for Syntax-Keyword-Try
0.29 2023-07-13
[CHANGES]
* Updates to compile cleanly on perl v5.38
* Remember to implement `no Syntax::Keyword::Try` to disable the
syntax
* Swap all the unit tests to `Test2::V0`
0.28 2022-12-08
[CHANGES]
* Account for the new structure of ->cop_warnings in perl v5.37.6
* Updated to latest hax/ support files; accounting for newPADxVOP in
latest bleadperl
0.27 2022-02-22 0.27 2022-02-22
[CHANGES] [CHANGES]
* Updates to support Feature::Compat::Try 0.05 with new `finally {}` * Updates to support Feature::Compat::Try 0.05 with new `finally {}`

View File

@ -1,4 +1,4 @@
This software is copyright (c) 2022 by Paul Evans <leonerd@leonerd.org.uk>. This software is copyright (c) 2023 by Paul Evans <leonerd@leonerd.org.uk>.
This is free software; you can redistribute it and/or modify it under This is free software; you can redistribute it and/or modify it under
the same terms as the Perl 5 programming language system itself. the same terms as the Perl 5 programming language system itself.
@ -12,7 +12,7 @@ b) the "Artistic License"
--- The GNU General Public License, Version 1, February 1989 --- --- The GNU General Public License, Version 1, February 1989 ---
This software is Copyright (c) 2022 by Paul Evans <leonerd@leonerd.org.uk>. This software is Copyright (c) 2023 by Paul Evans <leonerd@leonerd.org.uk>.
This is free software, licensed under: This is free software, licensed under:
@ -272,7 +272,7 @@ That's all there is to it!
--- The Artistic License 1.0 --- --- The Artistic License 1.0 ---
This software is Copyright (c) 2022 by Paul Evans <leonerd@leonerd.org.uk>. This software is Copyright (c) 2023 by Paul Evans <leonerd@leonerd.org.uk>.
This is free software, licensed under: This is free software, licensed under:

View File

@ -1,3 +1,4 @@
.editorconfig
Build.PL Build.PL
Changes Changes
hax/newOP_CUSTOM.c.inc hax/newOP_CUSTOM.c.inc
@ -8,7 +9,11 @@ hax/perl-backcompat.c.inc
lib/Syntax/Keyword/Try.pm lib/Syntax/Keyword/Try.pm
lib/Syntax/Keyword/Try.xs lib/Syntax/Keyword/Try.xs
lib/Syntax/Keyword/Try/Deparse.pm lib/Syntax/Keyword/Try/Deparse.pm
LICENSE
MANIFEST This list of files MANIFEST This list of files
META.json
META.yml
README
t/00use.t t/00use.t
t/01trycatch.t t/01trycatch.t
t/02tryfinally.t t/02tryfinally.t
@ -28,7 +33,3 @@ t/80defer+SKT.t
t/90rt123547.t t/90rt123547.t
t/90rt125971.t t/90rt125971.t
t/99pod.t t/99pod.t
README
LICENSE
META.yml
META.json

View File

@ -33,18 +33,18 @@
}, },
"test" : { "test" : {
"requires" : { "requires" : {
"Test::More" : "0.88" "Test2::V0" : "0"
} }
} }
}, },
"provides" : { "provides" : {
"Syntax::Keyword::Try" : { "Syntax::Keyword::Try" : {
"file" : "lib/Syntax/Keyword/Try.pm", "file" : "lib/Syntax/Keyword/Try.pm",
"version" : "0.27" "version" : "0.29"
}, },
"Syntax::Keyword::Try::Deparse" : { "Syntax::Keyword::Try::Deparse" : {
"file" : "lib/Syntax/Keyword/Try/Deparse.pm", "file" : "lib/Syntax/Keyword/Try/Deparse.pm",
"version" : "0.27" "version" : "0.29"
} }
}, },
"release_status" : "stable", "release_status" : "stable",
@ -54,6 +54,6 @@
], ],
"x_IRC" : "irc://irc.perl.org/#io-async" "x_IRC" : "irc://irc.perl.org/#io-async"
}, },
"version" : "0.27", "version" : "0.29",
"x_serialization_backend" : "JSON::PP version 4.06" "x_serialization_backend" : "JSON::PP version 4.07"
} }

View File

@ -4,7 +4,7 @@ author:
- 'Paul Evans <leonerd@leonerd.org.uk>' - 'Paul Evans <leonerd@leonerd.org.uk>'
build_requires: build_requires:
ExtUtils::CBuilder: '0' ExtUtils::CBuilder: '0'
Test::More: '0.88' Test2::V0: '0'
configure_requires: configure_requires:
Module::Build: '0.4004' Module::Build: '0.4004'
XS::Parse::Keyword::Builder: '0.06' XS::Parse::Keyword::Builder: '0.06'
@ -18,15 +18,15 @@ name: Syntax-Keyword-Try
provides: provides:
Syntax::Keyword::Try: Syntax::Keyword::Try:
file: lib/Syntax/Keyword/Try.pm file: lib/Syntax/Keyword/Try.pm
version: '0.27' version: '0.29'
Syntax::Keyword::Try::Deparse: Syntax::Keyword::Try::Deparse:
file: lib/Syntax/Keyword/Try/Deparse.pm file: lib/Syntax/Keyword/Try/Deparse.pm
version: '0.27' version: '0.29'
requires: requires:
XS::Parse::Keyword: '0.06' XS::Parse::Keyword: '0.06'
perl: '5.014' perl: '5.014'
resources: resources:
IRC: irc://irc.perl.org/#io-async IRC: irc://irc.perl.org/#io-async
license: http://dev.perl.org/licenses/ license: http://dev.perl.org/licenses/
version: '0.27' version: '0.29'
x_serialization_backend: 'CPAN::Meta::YAML version 0.018' x_serialization_backend: 'CPAN::Meta::YAML version 0.018'

View File

@ -16,15 +16,6 @@ static OP *S_newAELEMOP(pTHX_ U32 flags, OP *first, I32 key)
return newBINOP(OP_AELEM, flags, first, newSVOP(OP_CONST, 0, newSViv(key))); return newBINOP(OP_AELEM, flags, first, newSVOP(OP_CONST, 0, newSViv(key)));
} }
#define newPADxVOP(type, padix, flags, private) S_newPADxVOP(aTHX_ type, padix, flags, private)
static OP *S_newPADxVOP(pTHX_ I32 type, PADOFFSET padix, I32 flags, U32 private)
{
OP *op = newOP(type, flags);
op->op_targ = padix;
op->op_private = private;
return op;
}
#if HAVE_PERL_VERSION(5, 22, 0) #if HAVE_PERL_VERSION(5, 22, 0)
# define HAVE_UNOP_AUX # define HAVE_UNOP_AUX
#endif #endif
@ -80,3 +71,14 @@ static OP *S_newMETHOD_REDIR_OP(pTHX_ SV *rclass, SV *methname, I32 flags)
return op; return op;
} }
/* If `@_` is called "snail", then elements of it can be called "slugs"; i.e.
* snails without their container
*/
#define newSLUGOP(idx) S_newSLUGOP(aTHX_ idx)
static OP *S_newSLUGOP(pTHX_ int idx)
{
OP *op = newGVOP(OP_AELEMFAST, 0, PL_defgv);
op->op_private = idx;
return op;
}

View File

@ -1,9 +1,5 @@
/* vi: set ft=c : */ /* vi: set ft=c : */
#ifndef av_count
# define av_count(av) (AvFILL(av) + 1)
#endif
#if HAVE_PERL_VERSION(5, 22, 0) #if HAVE_PERL_VERSION(5, 22, 0)
# define PadnameIsNULL(pn) (!(pn)) # define PadnameIsNULL(pn) (!(pn))
#else #else
@ -30,16 +26,6 @@ static char *S_save_strndup(pTHX_ char *s, STRLEN l)
return ret; return ret;
} }
#define sv_setrv(s, r) S_sv_setrv(aTHX_ s, r)
static void S_sv_setrv(pTHX_ SV *sv, SV *rv)
{
sv_setiv(sv, (IV)rv);
#if !HAVE_PERL_VERSION(5, 24, 0)
SvIOK_off(sv);
#endif
SvROK_on(sv);
}
static char *PL_savetype_name[] PERL_UNUSED_DECL = { static char *PL_savetype_name[] PERL_UNUSED_DECL = {
/* These have been present since 5.16 */ /* These have been present since 5.16 */
[SAVEt_ADELETE] = "ADELETE", [SAVEt_ADELETE] = "ADELETE",
@ -249,15 +235,19 @@ static bool MY_lex_consume_unichar(pTHX_ U32 c)
return TRUE; return TRUE;
} }
#if HAVE_PERL_VERSION(5, 16, 0) #define av_push_from_av_inc(dst, src) S_av_push_from_av(aTHX_ dst, src, TRUE)
/* TODO: perl 5.14 lacks HvNAMEUTF8, HvNAMELEN, sv_derived_from_pvn */ #define av_push_from_av_noinc(dst, src) S_av_push_from_av(aTHX_ dst, src, FALSE)
# define sv_derived_from_hv(sv, hv) MY_sv_derived_from_hv(aTHX_ sv, hv) static void S_av_push_from_av(pTHX_ AV *dst, AV *src, bool refcnt_inc)
static bool MY_sv_derived_from_hv(pTHX_ SV *sv, HV *hv)
{ {
char *hvname = HvNAME(hv); SSize_t count = av_count(src);
if(!hvname) SSize_t i;
return FALSE;
return sv_derived_from_pvn(sv, hvname, HvNAMELEN(hv), HvNAMEUTF8(hv) ? SVf_UTF8 : 0); av_extend(dst, av_count(dst) + count - 1);
SV **vals = AvARRAY(src);
for(i = 0; i < count; i++) {
SV *sv = vals[i];
av_push(dst, refcnt_inc ? SvREFCNT_inc(sv) : sv);
}
} }
#endif /* HAVE_PERL_VERSION(5, 16, 0) */

View File

@ -23,6 +23,7 @@ typedef AV PADNAMELIST;
typedef SV PADNAME; typedef SV PADNAME;
# define PadnamePV(pn) (SvPOKp(pn) ? SvPVX(pn) : NULL) # define PadnamePV(pn) (SvPOKp(pn) ? SvPVX(pn) : NULL)
# define PadnameLEN(pn) SvCUR(pn) # define PadnameLEN(pn) SvCUR(pn)
# define PadnameIsSTATE(pn) (!!SvPAD_STATE(pn))
# define PadnameOUTER(pn) (SvFAKE(pn) && !SvPAD_STATE(pn)) # define PadnameOUTER(pn) (SvFAKE(pn) && !SvPAD_STATE(pn))
# define PadnamelistARRAY(pnl) AvARRAY(pnl) # define PadnamelistARRAY(pnl) AvARRAY(pnl)
# define PadnamelistMAX(pnl) AvFILLp(pnl) # define PadnamelistMAX(pnl) AvFILLp(pnl)
@ -31,6 +32,24 @@ typedef SV PADNAME;
# define PadMAX(pad) AvFILLp(pad) # define PadMAX(pad) AvFILLp(pad)
#endif #endif
#if !HAVE_PERL_VERSION(5, 22, 0)
# define CvPADLIST_set(cv, padlist) (CvPADLIST(cv) = padlist)
# define newPADNAMEpvn(p,n) S_newPADNAMEpvn(aTHX_ p,n)
static PADNAME *S_newPADNAMEpvn(pTHX_ const char *pv, STRLEN n)
{
PADNAME *pn = newSVpvn(pv, n);
/* PADNAMEs need to be at least SVt_PVNV in order to store the COP_SEQ_*
* fields */
sv_upgrade(pn, SVt_PVNV);
return pn;
}
# define PadnameREFCNT_dec(pn) SvREFCNT_dec(pn)
#endif
#ifndef av_count
# define av_count(av) (AvFILL(av) + 1)
#endif
#ifndef av_top_index #ifndef av_top_index
# define av_top_index(av) AvFILL(av) # define av_top_index(av) AvFILL(av)
#endif #endif
@ -43,6 +62,10 @@ typedef SV PADNAME;
# define block_start(a) Perl_block_start(aTHX_ a) # define block_start(a) Perl_block_start(aTHX_ a)
#endif #endif
#ifndef cophh_exists_pvs
# define cophh_exists_pvs(a,b,c) cBOOL(cophh_fetch_pvs(a,b,c))
#endif
#ifndef cv_clone #ifndef cv_clone
# define cv_clone(a) Perl_cv_clone(aTHX_ a) # define cv_clone(a) Perl_cv_clone(aTHX_ a)
#endif #endif
@ -69,6 +92,10 @@ typedef SV PADNAME;
# define OpSIBLING(op) ((op)->op_sibling) # define OpSIBLING(op) ((op)->op_sibling)
#endif #endif
#ifndef OpHAS_SIBLING
# define OpHAS_SIBLING(op) (cBOOL(OpSIBLING(op)))
#endif
#ifndef OpMORESIB_set #ifndef OpMORESIB_set
# define OpMORESIB_set(op,sib) ((op)->op_sibling = (sib)) # define OpMORESIB_set(op,sib) ((op)->op_sibling = (sib))
#endif #endif
@ -123,7 +150,7 @@ static OP *S_op_convert_list(pTHX_ I32 type, I32 flags, OP *o)
/* On Perl 5.14 this had a different name */ /* On Perl 5.14 this had a different name */
#ifndef pad_add_name_pvn #ifndef pad_add_name_pvn
#define pad_add_name_pvn(name, len, flags, typestash, ourstash) MY_pad_add_name(aTHX_ name, len, flags, typestash, ourstash) #define pad_add_name_pvn(name, len, flags, typestash, ourstash) MY_pad_add_name(aTHX_ name, len, flags, typestash, ourstash)
PADOFFSET MY_pad_add_name(pTHX_ const char *name, STRLEN len, U32 flags, HV *typestash, HV *ourstash) static PADOFFSET MY_pad_add_name(pTHX_ const char *name, STRLEN len, U32 flags, HV *typestash, HV *ourstash)
{ {
/* perl 5.14's Perl_pad_add_name requires a NUL-terminated name */ /* perl 5.14's Perl_pad_add_name requires a NUL-terminated name */
SV *namesv = sv_2mortal(newSVpvn(name, len)); SV *namesv = sv_2mortal(newSVpvn(name, len));
@ -136,3 +163,60 @@ PADOFFSET MY_pad_add_name(pTHX_ const char *name, STRLEN len, U32 flags, HV *typ
# define isIDFIRST_utf8_safe(s, e) (PERL_UNUSED_ARG(e), isIDFIRST_utf8(s)) # define isIDFIRST_utf8_safe(s, e) (PERL_UNUSED_ARG(e), isIDFIRST_utf8(s))
# define isIDCONT_utf8_safe(s, e) (PERL_UNUSED_ARG(e), isIDCONT_utf8(s)) # define isIDCONT_utf8_safe(s, e) (PERL_UNUSED_ARG(e), isIDCONT_utf8(s))
#endif #endif
#ifndef CXp_EVALBLOCK
/* before perl 5.34 this was called CXp_TRYBLOCK */
# define CXp_EVALBLOCK CXp_TRYBLOCK
#endif
#if !HAVE_PERL_VERSION(5, 26, 0)
# define sv_set_undef(sv) sv_setsv(sv, &PL_sv_undef)
#endif
#ifndef newAVav
# define newAVav(av) S_newAVav(aTHX_ av)
static AV *S_newAVav(pTHX_ AV *av)
{
AV *ret = newAV();
U32 count = av_count(av);
U32 i;
for(i = 0; i < count; i++)
av_push(ret, newSVsv(AvARRAY(av)[i]));
return ret;
}
#endif
#if !defined(sv_derived_from_hv) && HAVE_PERL_VERSION(5, 16, 0)
# define sv_derived_from_hv(sv, hv) MY_sv_derived_from_hv(aTHX_ sv, hv)
static bool MY_sv_derived_from_hv(pTHX_ SV *sv, HV *hv)
{
char *hvname = HvNAME(hv);
if(!hvname)
return FALSE;
return sv_derived_from_pvn(sv, hvname, HvNAMELEN(hv), HvNAMEUTF8(hv) ? SVf_UTF8 : 0);
}
#endif
#ifndef xV_FROM_REF
# ifdef PERL_USE_GCC_BRACE_GROUPS
# define xV_FROM_REF(XV, ref) \
({ SV *_ref = ref; assert(SvROK(_ref)); assert(SvTYPE(SvRV(_ref)) == SVt_PV ## XV); (XV *)(SvRV(_ref)); })
# else
# define xV_FROM_REF(XV, ref) ((XV *)SvRV(ref))
# endif
# define AV_FROM_REF(ref) xV_FROM_REF(AV, ref)
# define CV_FROM_REF(ref) xV_FROM_REF(CV, ref)
# define HV_FROM_REF(ref) xV_FROM_REF(HV, ref)
#endif
#ifndef newPADxVOP
# define newPADxVOP(type, flags, padix) S_newPADxVOP(aTHX_ type, flags, padix)
static OP *S_newPADxVOP(pTHX_ I32 type, I32 flags, PADOFFSET padix)
{
OP *op = newOP(type, flags);
op->op_targ = padix;
return op;
}
#endif

View File

@ -1,9 +1,9 @@
# You may distribute under the terms of either the GNU General Public License # You may distribute under the terms of either the GNU General Public License
# or the Artistic License (the same terms as Perl itself) # or the Artistic License (the same terms as Perl itself)
# #
# (C) Paul Evans, 2016-2022 -- leonerd@leonerd.org.uk # (C) Paul Evans, 2016-2023 -- leonerd@leonerd.org.uk
package Syntax::Keyword::Try 0.27; package Syntax::Keyword::Try 0.29;
use v5.14; use v5.14;
use warnings; use warnings;
@ -353,38 +353,49 @@ L<https://rt.cpan.org/Ticket/Display.html?id=123918>.
sub import sub import
{ {
my $class = shift; my $pkg = shift;
my $caller = caller; my $caller = caller;
$class->import_into( $caller, @_ ); $pkg->import_into( $caller, @_ );
}
sub unimport
{
my $pkg = shift;
my $caller = caller;
$pkg->unimport_into( $caller, @_ );
} }
my @EXPERIMENTAL = qw( typed ); my @EXPERIMENTAL = qw( typed );
sub import_into sub import_into { shift->apply( sub { $^H{ $_[0] }++ }, @_ ) }
sub unimport_into { shift->apply( sub { delete $^H{ $_[0] } }, @_ ) }
sub apply
{ {
my $class = shift; my $pkg = shift;
my ( $caller, @syms ) = @_; my ( $cb, $caller, @syms ) = @_;
@syms or @syms = qw( try ); @syms or @syms = qw( try );
my %syms = map { $_ => 1 } @syms; my %syms = map { $_ => 1 } @syms;
$^H{"Syntax::Keyword::Try/try"}++ if delete $syms{try}; $cb->( "Syntax::Keyword::Try/try" ) if delete $syms{try};
# Largely for Feature::Compat::Try's benefit # Largely for Feature::Compat::Try's benefit
$^H{"Syntax::Keyword::Try/no_finally"}++ if delete $syms{"-no_finally"}; $cb->( "Syntax::Keyword::Try/no_finally" ) if delete $syms{"-no_finally"};
$^H{"Syntax::Keyword::Try/require_catch"}++ if delete $syms{"-require_catch"}; $cb->( "Syntax::Keyword::Try/require_catch" ) if delete $syms{"-require_catch"};
$^H{"Syntax::Keyword::Try/require_var"}++ if delete $syms{"-require_var"}; $cb->( "Syntax::Keyword::Try/require_var" ) if delete $syms{"-require_var"};
# stablised experiments # stablised experiments
delete $syms{":experimental($_)"} for qw( var ); delete $syms{":experimental($_)"} for qw( var );
foreach ( @EXPERIMENTAL ) { foreach ( @EXPERIMENTAL ) {
$^H{"Syntax::Keyword::Try/experimental($_)"}++ if delete $syms{":experimental($_)"}; $cb->( "Syntax::Keyword::Try/experimental($_)" ) if delete $syms{":experimental($_)"};
} }
if( delete $syms{":experimental"} ) { if( delete $syms{":experimental"} ) {
$^H{"Syntax::Keyword::Try/experimental($_)"}++ for @EXPERIMENTAL; $cb->( "Syntax::Keyword::Try/experimental($_)" ) for @EXPERIMENTAL;
} }
# Ignore requests for these, as they come automatically with `try` # Ignore requests for these, as they come automatically with `try`

View File

@ -179,7 +179,16 @@ static OP *MY_newLOCALISEOP(pTHX_ GV *gv)
static OP *MY_newSTATEOP_nowarnings(pTHX) static OP *MY_newSTATEOP_nowarnings(pTHX)
{ {
OP *op = newSTATEOP(0, NULL, NULL); OP *op = newSTATEOP(0, NULL, NULL);
#if HAVE_PERL_VERSION(5,37,6)
/* cop_warnings no longer has the weird STRLEN prefix on it
* https://github.com/Perl/perl5/pull/20469
*/
char *warnings = ((COP *)op)->cop_warnings;
# define WARNING_BITS warnings
#else
STRLEN *warnings = ((COP *)op)->cop_warnings; STRLEN *warnings = ((COP *)op)->cop_warnings;
# define WARNING_BITS (char *)(warnings + 1)
#endif
char *warning_bits; char *warning_bits;
if(warnings == pWARN_NONE) if(warnings == pWARN_NONE)
@ -191,15 +200,17 @@ static OP *MY_newSTATEOP_nowarnings(pTHX)
else if(warnings == pWARN_ALL) else if(warnings == pWARN_ALL)
warning_bits = WARN_ALLstring; warning_bits = WARN_ALLstring;
else else
warning_bits = (char *)(warnings + 1); warning_bits = WARNING_BITS;
warnings = Perl_new_warnings_bitfield(aTHX_ warnings, warning_bits, WARNsize); warnings = Perl_new_warnings_bitfield(aTHX_ warnings, warning_bits, WARNsize);
((COP *)op)->cop_warnings = warnings; ((COP *)op)->cop_warnings = warnings;
warning_bits = (char *)(warnings + 1); warning_bits = WARNING_BITS;
warning_bits[(2*WARN_EXITING) / 8] &= ~(1 << (2*WARN_EXITING % 8)); warning_bits[(2*WARN_EXITING) / 8] &= ~(1 << (2*WARN_EXITING % 8));
return op; return op;
#undef WARNING_BITS
} }
static void rethread_op(OP *op, OP *old, OP *new) static void rethread_op(OP *op, OP *old, OP *new)
@ -437,14 +448,14 @@ static int build_try(pTHX_ OP **out, XSParseKeywordPiece *args[], size_t nargs,
OP *type = args[argi++]->op; OP *type = args[argi++]->op;
#ifdef HAVE_OP_ISA #ifdef HAVE_OP_ISA
condop = newBINOP(OP_ISA, 0, condop = newBINOP(OP_ISA, 0,
newPADxVOP(OP_PADSV, catchvar, 0, 0), type); newPADxVOP(OP_PADSV, 0, catchvar), type);
#else #else
/* Allow a bareword on RHS of `isa` */ /* Allow a bareword on RHS of `isa` */
if(type->op_type == OP_CONST) if(type->op_type == OP_CONST)
type->op_private &= ~(OPpCONST_BARE|OPpCONST_STRICT); type->op_private &= ~(OPpCONST_BARE|OPpCONST_STRICT);
condop = newBINOP_CUSTOM(&pp_isa, 0, condop = newBINOP_CUSTOM(&pp_isa, 0,
newPADxVOP(OP_PADSV, catchvar, 0, 0), type); newPADxVOP(OP_PADSV, 0, catchvar), type);
#endif #endif
break; break;
} }
@ -460,7 +471,7 @@ static int build_try(pTHX_ OP **out, XSParseKeywordPiece *args[], size_t nargs,
regexp->op_targ = catchvar; regexp->op_targ = catchvar;
#else #else
/* Older perls need a stacked OP_PADSV op */ /* Older perls need a stacked OP_PADSV op */
cPMOPx(regexp)->op_first = newPADxVOP(OP_PADSV, catchvar, 0, 0); cPMOPx(regexp)->op_first = newPADxVOP(OP_PADSV, 0, catchvar);
regexp->op_flags |= OPf_KIDS|OPf_STACKED; regexp->op_flags |= OPf_KIDS|OPf_STACKED;
#endif #endif
condop = regexp; condop = regexp;
@ -492,7 +503,7 @@ static int build_try(pTHX_ OP **out, XSParseKeywordPiece *args[], size_t nargs,
if(catchvar) { if(catchvar) {
/* my $var = $@ */ /* my $var = $@ */
assignop = newBINOP(OP_SASSIGN, 0, assignop = newBINOP(OP_SASSIGN, 0,
newGVOP(OP_GVSV, 0, PL_errgv), newPADxVOP(OP_PADSV, catchvar, OPf_MOD, OPpLVAL_INTRO)); newGVOP(OP_GVSV, 0, PL_errgv), newPADxVOP(OP_PADSV, OPf_MOD | OPpLVAL_INTRO << 8, catchvar));
} }
if(condop) { if(condop) {

View File

@ -3,7 +3,7 @@
# #
# (C) Paul Evans, 2021 -- leonerd@leonerd.org.uk # (C) Paul Evans, 2021 -- leonerd@leonerd.org.uk
package Syntax::Keyword::Try::Deparse 0.27; package Syntax::Keyword::Try::Deparse 0.29;
use v5.14; use v5.14;
use warnings; use warnings;

View File

@ -3,8 +3,9 @@
use v5.14; use v5.14;
use warnings; use warnings;
use Test::More; use Test2::V0;
use_ok( "Syntax::Keyword::Try" ); require Syntax::Keyword::Try;
pass( "Modules loaded" );
done_testing; done_testing;

View File

@ -3,7 +3,7 @@
use v5.14; use v5.14;
use warnings; use warnings;
use Test::More; use Test2::V0;
use Syntax::Keyword::Try; use Syntax::Keyword::Try;
@ -120,4 +120,12 @@ use Syntax::Keyword::Try;
ok( $destroyed, 'catch ($var) does not retain value' ); ok( $destroyed, 'catch ($var) does not retain value' );
} }
{
no Syntax::Keyword::Try;
sub try { return "normal function" }
is( try, "normal function", 'try() parses as a normal function call' );
}
done_testing; done_testing;

View File

@ -3,7 +3,7 @@
use v5.14; use v5.14;
use warnings; use warnings;
use Test::More; use Test2::V0;
use Syntax::Keyword::Try; use Syntax::Keyword::Try;

View File

@ -3,7 +3,7 @@
use v5.14; use v5.14;
use warnings; use warnings;
use Test::More; use Test2::V0;
use Syntax::Keyword::Try; use Syntax::Keyword::Try;

View File

@ -3,7 +3,7 @@
use v5.14; use v5.14;
use warnings; use warnings;
use Test::More; use Test2::V0;
use Syntax::Keyword::Try qw( try :experimental ); use Syntax::Keyword::Try qw( try :experimental );

View File

@ -3,7 +3,7 @@
use v5.14; use v5.14;
use warnings; use warnings;
use Test::More; use Test2::V0;
use Syntax::Keyword::Try; use Syntax::Keyword::Try;
@ -15,7 +15,7 @@ use Syntax::Keyword::Try;
catch ($e) {} catch ($e) {}
} )->( 1, 2, 3 ); } )->( 1, 2, 3 );
is_deeply( \@args, [ 1, 2, 3 ], 'try{} sees surrounding @_' ); is( \@args, [ 1, 2, 3 ], 'try{} sees surrounding @_' );
} }
# catch sees @_ # catch sees @_
@ -26,7 +26,7 @@ use Syntax::Keyword::Try;
catch ($e) { @args = @_ } catch ($e) { @args = @_ }
} )->( 4, 5, 6 ); } )->( 4, 5, 6 );
is_deeply( \@args, [ 4, 5, 6 ], 'catch{} sees @_' ); is( \@args, [ 4, 5, 6 ], 'catch{} sees @_' );
} }
done_testing; done_testing;

View File

@ -3,7 +3,7 @@
use v5.14; use v5.14;
use warnings; use warnings;
use Test::More; use Test2::V0;
use Syntax::Keyword::Try; use Syntax::Keyword::Try;

View File

@ -3,7 +3,7 @@
use v5.14; use v5.14;
use warnings; use warnings;
use Test::More; use Test2::V0;
use Syntax::Keyword::Try; use Syntax::Keyword::Try;
@ -33,7 +33,7 @@ use Syntax::Keyword::Try;
# return LIST from try # return LIST from try
{ {
is_deeply( is(
[ sub { [ sub {
try { return qw( A B C ) } catch ($e) {} try { return qw( A B C ) } catch ($e) {}
}->() ], }->() ],

View File

@ -3,7 +3,7 @@
use v5.14; use v5.14;
use warnings; use warnings;
use Test::More; use Test2::V0;
use Syntax::Keyword::Try; use Syntax::Keyword::Try;

View File

@ -3,7 +3,7 @@
use v5.14; use v5.14;
use warnings; use warnings;
use Test::More; use Test2::V0;
use Syntax::Keyword::Try; use Syntax::Keyword::Try;

View File

@ -3,7 +3,7 @@
use v5.14; use v5.14;
use warnings; use warnings;
use Test::More; use Test2::V0;
use Syntax::Keyword::Try; use Syntax::Keyword::Try;

View File

@ -3,7 +3,7 @@
use v5.14; use v5.14;
use warnings; use warnings;
use Test::More; use Test2::V0;
use Syntax::Keyword::Try; use Syntax::Keyword::Try;
@ -19,7 +19,7 @@ use Syntax::Keyword::Try;
try { 1, 2, 3 } try { 1, 2, 3 }
catch ($e) { 4, 5, 6 } catch ($e) { 4, 5, 6 }
}; };
is_deeply(\@list, [1, 2, 3], 'do { try } in list context'); is(\@list, [1, 2, 3], 'do { try } in list context');
} }
# catch as final expression yields correct value # catch as final expression yields correct value
@ -34,7 +34,7 @@ use Syntax::Keyword::Try;
try { die "Oops" } try { die "Oops" }
catch ($e) { 4, 5, 6 } catch ($e) { 4, 5, 6 }
}; };
is_deeply(\@list, [4, 5, 6], 'do { try/catch } in list context'); is(\@list, [4, 5, 6], 'do { try/catch } in list context');
$scalar = do { $scalar = do {
try { die "Oops" } try { die "Oops" }

View File

@ -3,7 +3,7 @@
use v5.14; use v5.14;
use warnings; use warnings;
use Test::More; use Test2::V0;
use Syntax::Keyword::Try; use Syntax::Keyword::Try;

View File

@ -3,7 +3,7 @@
use v5.14; use v5.14;
use warnings; use warnings;
use Test::More; use Test2::V0;
use Syntax::Keyword::Try; use Syntax::Keyword::Try;
use Syntax::Keyword::Try::Deparse; use Syntax::Keyword::Try::Deparse;

View File

@ -3,7 +3,7 @@
use v5.14; use v5.14;
use warnings; use warnings;
use Test::More; use Test2::V0;
BEGIN { BEGIN {
plan skip_all => "Future is not available" plan skip_all => "Future is not available"

View File

@ -3,7 +3,7 @@
use v5.14; use v5.14;
use warnings; use warnings;
use Test::More; use Test2::V0;
BEGIN { BEGIN {
plan skip_all => "Syntax::Keyword::Defer >= 0.02 is not available" plan skip_all => "Syntax::Keyword::Defer >= 0.02 is not available"

View File

@ -3,7 +3,8 @@
use v5.14; use v5.14;
use warnings; use warnings;
use Test::More; use Test2::V0;
use Test2::IPC;
# RT123547 observes that if S:K:T is loaded late after multiple threads # RT123547 observes that if S:K:T is loaded late after multiple threads
# are actually started, it will crash # are actually started, it will crash

View File

@ -3,7 +3,7 @@
use v5.14; use v5.14;
use warnings; use warnings;
use Test::More; use Test2::V0;
use Syntax::Keyword::Try; use Syntax::Keyword::Try;
@ -31,7 +31,7 @@ sub outer
return @result; return @result;
} }
is_deeply [ outer() ], [ 1, 123 ], "No extra data in return"; is [ outer() ], [ 1, 123 ], "No extra data in return";
done_testing; done_testing;

View File

@ -3,7 +3,7 @@
use v5.14; use v5.14;
use warnings; use warnings;
use Test::More; use Test2::V0;
eval "use Test::Pod 1.00"; eval "use Test::Pod 1.00";
plan skip_all => "Test::Pod 1.00 required for testing POD" if $@; plan skip_all => "Test::Pod 1.00 required for testing POD" if $@;