Script 'mail_helper' called by obssrc
Hello community,
here is the log from the commit of package perl-Syntax-Keyword-Try for
openSUSE:Factory checked in at 2021-08-31 19:55:41
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/perl-Syntax-Keyword-Try (Old)
and /work/SRC/openSUSE:Factory/.perl-Syntax-Keyword-Try.new.1899 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "perl-Syntax-Keyword-Try"
Tue Aug 31 19:55:41 2021 rev:12 rq:915220 version:0.25
Changes:
--------
---
/work/SRC/openSUSE:Factory/perl-Syntax-Keyword-Try/perl-Syntax-Keyword-Try.changes
2021-05-12 19:33:30.222732858 +0200
+++
/work/SRC/openSUSE:Factory/.perl-Syntax-Keyword-Try.new.1899/perl-Syntax-Keyword-Try.changes
2021-08-31 19:56:35.254029696 +0200
@@ -1,0 +2,13 @@
+Wed Jun 2 03:07:19 UTC 2021 - Tina M??ller <[email protected]>
+
+- updated to 0.25
+ see /usr/share/doc/packages/perl-Syntax-Keyword-Try/Changes
+
+ 0.25 2021-06-01
+ [CHANGES]
+ * Rewrite parsing logic to use XS::Parse::Keyword 0.06
+ * Removed the new-deprecated `try do { ... }` experimental syntax
+ * Updated docs now that 5.34 is officially released, including
+ `use feature 'try'`.
+
+-------------------------------------------------------------------
Old:
----
Syntax-Keyword-Try-0.24.tar.gz
New:
----
Syntax-Keyword-Try-0.25.tar.gz
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ perl-Syntax-Keyword-Try.spec ++++++
--- /var/tmp/diff_new_pack.pTWaq2/_old 2021-08-31 19:56:35.678030283 +0200
+++ /var/tmp/diff_new_pack.pTWaq2/_new 2021-08-31 19:56:35.682030288 +0200
@@ -18,7 +18,7 @@
%define cpan_name Syntax-Keyword-Try
Name: perl-Syntax-Keyword-Try
-Version: 0.24
+Version: 0.25
Release: 0
Summary: C<try/catch/finally> syntax for perl
License: Artistic-1.0 OR GPL-1.0-or-later
@@ -30,6 +30,9 @@
BuildRequires: perl(ExtUtils::CBuilder)
BuildRequires: perl(Module::Build) >= 0.400400
BuildRequires: perl(Test::More) >= 0.88
+BuildRequires: perl(XS::Parse::Keyword) >= 0.06
+BuildRequires: perl(XS::Parse::Keyword::Builder) >= 0.06
+Requires: perl(XS::Parse::Keyword) >= 0.06
%{perl_requires}
%description
@@ -44,10 +47,9 @@
for perl code.
Syntax similar to this module has now been added to core perl, starting at
-development version 5.33.7, and is expected to become generally available
-when perl 5.34 is released. If you are writing new code, it is suggested
-that you instead use the Feature::Compat::Try module instead, as that will
-enable the core feature on those supported perl versions, falling back to
+version 5.34.0. If you are writing new code, it is suggested that you
+instead use the Feature::Compat::Try module instead, as that will enable
+the core feature on those supported perl versions, falling back to
'Syntax::Keyword::Try' on older perls.
%prep
++++++ Syntax-Keyword-Try-0.24.tar.gz -> Syntax-Keyword-Try-0.25.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/Syntax-Keyword-Try-0.24/Build.PL
new/Syntax-Keyword-Try-0.25/Build.PL
--- old/Syntax-Keyword-Try-0.24/Build.PL 2021-05-10 15:39:16.000000000
+0200
+++ new/Syntax-Keyword-Try-0.25/Build.PL 2021-06-01 22:49:17.000000000
+0200
@@ -3,6 +3,7 @@
use warnings;
use Module::Build;
+use XS::Parse::Keyword::Builder;
my $build = Module::Build->new(
module_name => "Syntax::Keyword::Try",
@@ -11,9 +12,11 @@
},
configure_requires => {
'Module::Build' => '0.4004', # test_requires
+ 'XS::Parse::Keyword::Builder' => '0.06',
},
requires => {
'perl' => '5.014', # pluggable keywords, XOP
+ 'XS::Parse::Keyword' => '0.06',
},
license => 'perl',
create_license => 1,
@@ -27,4 +30,6 @@
extra_compiler_flags => [qw( -Ihax )],
);
+XS::Parse::Keyword::Builder->extend_module_build( $build );
+
$build->create_build_script;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/Syntax-Keyword-Try-0.24/Changes
new/Syntax-Keyword-Try-0.25/Changes
--- old/Syntax-Keyword-Try-0.24/Changes 2021-05-10 15:39:16.000000000 +0200
+++ new/Syntax-Keyword-Try-0.25/Changes 2021-06-01 22:49:17.000000000 +0200
@@ -1,5 +1,12 @@
Revision history for Syntax-Keyword-Try
+0.25 2021-06-01
+ [CHANGES]
+ * Rewrite parsing logic to use XS::Parse::Keyword 0.06
+ * Removed the new-deprecated `try do { ... }` experimental syntax
+ * Updated docs now that 5.34 is officially released, including
+ `use feature 'try'`.
+
0.24 2021-05-10
[CHANGES]
* Deprecate the `try do { ... }` (experimental) syntax now that
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/Syntax-Keyword-Try-0.24/MANIFEST
new/Syntax-Keyword-Try-0.25/MANIFEST
--- old/Syntax-Keyword-Try-0.24/MANIFEST 2021-05-10 15:39:16.000000000
+0200
+++ new/Syntax-Keyword-Try-0.25/MANIFEST 2021-06-01 22:49:17.000000000
+0200
@@ -1,9 +1,7 @@
Build.PL
Changes
-hax/lexer-additions.c.inc
hax/perl-additions.c.inc
hax/perl-backcompat.c.inc
-hax/wrap_keyword_plugin.c.inc
lib/Syntax/Keyword/Try.pm
lib/Syntax/Keyword/Try.xs
lib/Syntax/Keyword/Try/Deparse.pm
@@ -24,8 +22,6 @@
t/14try-localises.t
t/15context.t
t/16final-expr.t
-t/20try-do.t
-t/21try-do-finally.t
t/30compat.t
t/70deparse.t
t/80await+SKT.t
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/Syntax-Keyword-Try-0.24/META.json
new/Syntax-Keyword-Try-0.25/META.json
--- old/Syntax-Keyword-Try-0.24/META.json 2021-05-10 15:39:16.000000000
+0200
+++ new/Syntax-Keyword-Try-0.25/META.json 2021-06-01 22:49:17.000000000
+0200
@@ -21,11 +21,13 @@
},
"configure" : {
"requires" : {
- "Module::Build" : "0.4004"
+ "Module::Build" : "0.4004",
+ "XS::Parse::Keyword::Builder" : "0.06"
}
},
"runtime" : {
"requires" : {
+ "XS::Parse::Keyword" : "0.06",
"perl" : "5.014"
}
},
@@ -38,11 +40,11 @@
"provides" : {
"Syntax::Keyword::Try" : {
"file" : "lib/Syntax/Keyword/Try.pm",
- "version" : "0.24"
+ "version" : "0.25"
},
"Syntax::Keyword::Try::Deparse" : {
"file" : "lib/Syntax/Keyword/Try/Deparse.pm",
- "version" : "0.24"
+ "version" : "0.25"
}
},
"release_status" : "stable",
@@ -52,6 +54,6 @@
],
"x_IRC" : "irc://irc.perl.org/#io-async"
},
- "version" : "0.24",
+ "version" : "0.25",
"x_serialization_backend" : "JSON::PP version 4.05"
}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/Syntax-Keyword-Try-0.24/META.yml
new/Syntax-Keyword-Try-0.25/META.yml
--- old/Syntax-Keyword-Try-0.24/META.yml 2021-05-10 15:39:16.000000000
+0200
+++ new/Syntax-Keyword-Try-0.25/META.yml 2021-06-01 22:49:17.000000000
+0200
@@ -7,6 +7,7 @@
Test::More: '0.88'
configure_requires:
Module::Build: '0.4004'
+ XS::Parse::Keyword::Builder: '0.06'
dynamic_config: 1
generated_by: 'Module::Build version 0.4231, CPAN::Meta::Converter version
2.150010'
license: perl
@@ -17,14 +18,15 @@
provides:
Syntax::Keyword::Try:
file: lib/Syntax/Keyword/Try.pm
- version: '0.24'
+ version: '0.25'
Syntax::Keyword::Try::Deparse:
file: lib/Syntax/Keyword/Try/Deparse.pm
- version: '0.24'
+ version: '0.25'
requires:
+ XS::Parse::Keyword: '0.06'
perl: '5.014'
resources:
IRC: irc://irc.perl.org/#io-async
license: http://dev.perl.org/licenses/
-version: '0.24'
+version: '0.25'
x_serialization_backend: 'CPAN::Meta::YAML version 0.018'
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/Syntax-Keyword-Try-0.24/README
new/Syntax-Keyword-Try-0.25/README
--- old/Syntax-Keyword-Try-0.24/README 2021-05-10 15:39:16.000000000 +0200
+++ new/Syntax-Keyword-Try-0.25/README 2021-06-01 22:49:17.000000000 +0200
@@ -30,11 +30,10 @@
and behaviours for perl code.
Syntax similar to this module has now been added to core perl, starting
- at development version 5.33.7, and is expected to become generally
- available when perl 5.34 is released. If you are writing new code, it
- is suggested that you instead use the Feature::Compat::Try module
- instead, as that will enable the core feature on those supported perl
- versions, falling back to Syntax::Keyword::Try on older perls.
+ at version 5.34.0. If you are writing new code, it is suggested that
+ you instead use the Feature::Compat::Try module instead, as that will
+ enable the core feature on those supported perl versions, falling back
+ to Syntax::Keyword::Try on older perls.
Experimental Features
@@ -50,8 +49,6 @@
use Syntax::Keyword::Try qw( try :experimental(typed) );
- use Syntax::Keyword::Try qw( try :experimental(try_value) ); #
deprecated
-
use Syntax::Keyword::Try qw( try :experimental ); # all of the above
Don't forget to import the main try symbol itself, to activate the
@@ -220,51 +217,6 @@
with that feature instead, you should consider using
Syntax::Keyword::Defer rather than using finally statements.
-VALUE SEMANTICS
-
- Warning: the feature described in this section was experimental and
- is now deprecated. This experiment has existed for a while, though
- given that since version 0.22 the regular try syntax already behaves
- fine inside a do block, there is no longer any reason for this
- experimental feature to exist. It will print a deprecation warning,
- and eventually will be removed in a later version. You should use do
- { try ... } instead.
-
- Additionally, on perl versions 5.18 and later, it will produce a
- warning in the experimental category.
-
- The syntax provided by this module may be used as a value-yielding
- expression. Because this syntax is new, experimental, and somewhat
- surprising, it must be specifically requested by name try_value:
-
- use Syntax::Keyword::Try qw( try try_value );
-
- my $result = try do { ... } catch { ... };
-
- Also, on Perl versions 5.24 and later:
-
- my $result = try do { ... } finally { ... };
-
- my $result = try do { ... } catch { ... } finally { ... };
-
- Specifically, note that the expression must be spelled as try do { ...
- } so that the syntax is distinct from that used by control-flow
- statements. The interposed do keyword reminds the reader, and instructs
- the syntax parser, that this will be an expression, not a statement. It
- is not necessary to similarly notate the catch or finally blocks.
-
- In this case, the syntax behaves syntactically like an expression, and
- may appear anywhere a normal expression is allowed. It follows similar
- semantics to the purely control-flow case; if the code in the try block
- does not throw an exception, then the expression as a whole yields
- whatever value the try expression did. If it fails, then the catch
- block is executed and the expression yields its resulting value
- instead. A finally block, if present, will be evaluated for
- side-effects before the rest of the expression returns.
-
- Remember that, as in the control-flow case, the return keyword will
- cause the entire containing function to return, not just the try block.
-
OTHER MODULES
There are already quite a number of modules on CPAN that provide a
@@ -279,9 +231,7 @@
* Syntax::Feature::Try
In addition, core perl itself gained a try/catch syntax based on this
- module at developemnt version 5.33.7, and should become generally
- available when 5.34 is released. It will be available as use feature
- 'try'.
+ module at version 5.34.0. It is available as use feature 'try'.
They are compared here, by feature:
@@ -337,10 +287,9 @@
Value Semantics
Like Try and Syntax::Feature::Try, the syntax provided by this module
- only works as a syntax-level statement and not an expression when the
- experimental try_value feature described above has not been enabled.
- You cannot assign from the result of a try block. A common workaround
- is to wrap the try/catch statement inside a do block, where its final
+ only works as a syntax-level statement and not an expression. You
+ cannot assign from the result of a try block. A common workaround is to
+ wrap the try/catch statement inside a do block, where its final
expression can be captured and used as a value.
The same do block wrapping also works for the core feature 'try'.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/Syntax-Keyword-Try-0.24/hax/lexer-additions.c.inc
new/Syntax-Keyword-Try-0.25/hax/lexer-additions.c.inc
--- old/Syntax-Keyword-Try-0.24/hax/lexer-additions.c.inc 2021-05-10
15:39:16.000000000 +0200
+++ new/Syntax-Keyword-Try-0.25/hax/lexer-additions.c.inc 1970-01-01
01:00:00.000000000 +0100
@@ -1,298 +0,0 @@
-/* vi: set ft=c inde=: */
-
-/* Perls before 5.18 lack isIDCONT_uni, but baring minor differences of weird
- * Unicode characters, isALNUM_uni is close enough
- */
-#ifndef isIDCONT_uni
-#define isIDCONT_uni(c) isALNUM_uni(c)
-#endif
-
-#define sv_cat_c(sv, c) MY_sv_cat_c(aTHX_ sv, c)
-static void MY_sv_cat_c(pTHX_ SV *sv, U32 c)
-{
- char ds[UTF8_MAXBYTES + 1], *d;
- d = (char *)uvchr_to_utf8((U8 *)ds, c);
- if (d - ds > 1) {
- sv_utf8_upgrade(sv);
- }
- sv_catpvn(sv, ds, d - ds);
-}
-
-#define lex_consume(s) MY_lex_consume(aTHX_ s)
-static int MY_lex_consume(pTHX_ char *s)
-{
- /* I want strprefix() */
- size_t i;
- for(i = 0; s[i]; i++) {
- if(s[i] != PL_parser->bufptr[i])
- return 0;
- }
-
- lex_read_to(PL_parser->bufptr + i);
- return i;
-}
-
-enum {
- LEX_IDENT_PACKAGENAME = (1<<0),
-};
-
-#define lex_scan_ident( ) MY_lex_scan_ident(aTHX_ 0)
-#define lex_scan_packagename() MY_lex_scan_ident(aTHX_ LEX_IDENT_PACKAGENAME)
-static SV *MY_lex_scan_ident(pTHX_ int flags)
-{
- I32 c;
- bool at_start = TRUE;
-
- char *ident = PL_parser->bufptr;
-
- while((c = lex_peek_unichar(0))) {
- if(at_start ? isIDFIRST_uni(c) : isALNUM_uni(c))
- at_start = FALSE;
- /* TODO: This sucks in the case of a false Foo:Bar match */
- else if((flags & LEX_IDENT_PACKAGENAME) && (c == ':')) {
- lex_read_unichar(0);
- if(lex_read_unichar(0) != ':')
- croak("Expected colon to be followed by another in package name");
- }
- else
- break;
-
- lex_read_unichar(0);
- }
-
- STRLEN len = PL_parser->bufptr - ident;
- if(!len)
- return NULL;
-
- SV *ret = newSVpvn(ident, len);
- if(lex_bufutf8())
- SvUTF8_on(ret);
-
- return ret;
-}
-
-#define lex_scan_attrval_into(name, val) MY_lex_scan_attrval_into(aTHX_ name,
val)
-static bool MY_lex_scan_attrval_into(pTHX_ SV *name, SV *val)
-{
- /* TODO: really want lex_scan_ident_into() */
- SV *n = lex_scan_ident();
- if(!n)
- return FALSE;
-
- sv_setsv(name, n);
- SvREFCNT_dec(n);
-
- if(name != val)
- SvPOK_off(val);
-
- /* Do not read space here as space is not allowed between NAME(ARGS) */
-
- if(lex_peek_unichar(0) != '(')
- return TRUE;
-
- lex_read_unichar(0);
- if(name == val)
- sv_cat_c(val, '(');
- else
- sv_setpvs(val, "");
-
- int count = 1;
- I32 c = lex_peek_unichar(0);
- while(count && c != -1) {
- if(c == '(')
- count++;
- if(c == ')')
- count--;
- if(c == '\\') {
- /* The next char does not bump count even if it is ( or );
- * the \\ is still captured
- */
- sv_cat_c(val, lex_read_unichar(0));
- c = lex_peek_unichar(0);
- if(c == -1)
- goto unterminated;
- }
-
- /* Don't append final closing ')' on split name/val */
- if(count || (name == val))
- sv_cat_c(val, c);
- lex_read_unichar(0);
-
- c = lex_peek_unichar(0);
- }
-
- if(c == -1)
- return FALSE;
-
- return TRUE;
-
-unterminated:
- croak("Unterminated attribute parameter in attribute list");
-}
-
-#define lex_scan_attr() MY_lex_scan_attr(aTHX)
-static SV *MY_lex_scan_attr(pTHX)
-{
- SV *ret = newSV(0);
- if(MY_lex_scan_attrval_into(aTHX_ ret, ret))
- return ret;
-
- SvREFCNT_dec(ret);
- return NULL;
-}
-
-#define lex_scan_attrs(compcv) MY_lex_scan_attrs(aTHX_ compcv)
-static OP *MY_lex_scan_attrs(pTHX_ CV *compcv)
-{
- /* Attributes are supplied to newATTRSUB() as an OP_LIST containing
- * OP_CONSTs, one attribute in each as a plain SV. Note that we don't have
- * to parse inside the contents of the parens; that is handled by the
- * attribute handlers themselves
- */
- OP *attrs = NULL;
- SV *attr;
-
- lex_read_space(0);
- while((attr = lex_scan_attr())) {
- lex_read_space(0);
-
- if(compcv && strEQ(SvPV_nolen(attr), "lvalue")) {
- CvLVALUE_on(compcv);
- }
-
- if(!attrs)
- attrs = newLISTOP(OP_LIST, 0, NULL, NULL);
-
- attrs = op_append_elem(OP_LIST, attrs, newSVOP(OP_CONST, 0, attr));
-
- /* Accept additional colons to prefix additional attrs */
- if(lex_peek_unichar(0) == ':') {
- lex_read_unichar(0);
- lex_read_space(0);
- }
- }
-
- return attrs;
-}
-
-#define lex_scan_lexvar() MY_lex_scan_lexvar(aTHX)
-static SV *MY_lex_scan_lexvar(pTHX)
-{
- int sigil = lex_peek_unichar(0);
- switch(sigil) {
- case '$':
- case '@':
- case '%':
- lex_read_unichar(0);
- break;
-
- default:
- croak("Expected a lexical variable");
- }
-
- SV *ret = lex_scan_ident();
- if(!ret)
- return NULL;
-
- /* prepend sigil - which we know to be a single byte */
- SvGROW(ret, SvCUR(ret) + 1);
- Move(SvPVX(ret), SvPVX(ret) + 1, SvCUR(ret), char);
- SvPVX(ret)[0] = sigil;
- SvCUR(ret)++;
-
- SvPVX(ret)[SvCUR(ret)] = 0;
-
- return ret;
-}
-
-#define lex_scan_parenthesized() MY_lex_scan_parenthesized(aTHX)
-static SV *MY_lex_scan_parenthesized(pTHX)
-{
- I32 c;
- int parencount = 0;
- SV *ret = newSVpvs("");
- if(lex_bufutf8())
- SvUTF8_on(ret);
-
- c = lex_peek_unichar(0);
-
- while(c != -1) {
- sv_cat_c(ret, lex_read_unichar(0));
-
- switch(c) {
- case '(': parencount++; break;
- case ')': parencount--; break;
- }
- if(!parencount)
- break;
-
- c = lex_peek_unichar(0);
- }
-
- if(SvCUR(ret))
- return ret;
-
- SvREFCNT_dec(ret);
- return NULL;
-}
-
-#define lex_scan_version(flags) MY_lex_scan_version(aTHX_ flags)
-static SV *MY_lex_scan_version(pTHX_ int flags)
-{
- I32 c;
- SV *tmpsv = sv_2mortal(newSVpvs(""));
-
- /* scan_version() expects a version to end in linefeed, semicolon or
- * openbrace; gets confused if other keywords are fine. We'll have to
- * extract it first.
- * https://rt.cpan.org/Ticket/Display.html?id=132903
- */
-
- while((c = lex_peek_unichar(0))) {
- /* Allow a single leading v before accepting only digits, dot, underscore
*/
- if((!SvCUR(tmpsv) && (c == 'v')) || strchr("0123456789._", c))
- sv_cat_c(tmpsv, lex_read_unichar(0));
- else
- break;
- }
-
- if(!SvCUR(tmpsv) && (flags & PARSE_OPTIONAL))
- return NULL;
-
- SV *ret = newSV(0);
- scan_version(SvPVX(tmpsv), ret, FALSE);
-
- return ret;
-}
-
-#define parse_lexvar() MY_parse_lexvar(aTHX)
-static PADOFFSET MY_parse_lexvar(pTHX)
-{
- /* TODO: Rewrite this in terms of using lex_scan_lexvar()
- */
- char *lexname = PL_parser->bufptr;
-
- if(lex_read_unichar(0) != '$')
- croak("Expected a lexical scalar at %s", lexname);
-
- if(!isIDFIRST_uni(lex_peek_unichar(0)))
- croak("Expected a lexical scalar at %s", lexname);
- lex_read_unichar(0);
- while(isIDCONT_uni(lex_peek_unichar(0)))
- lex_read_unichar(0);
-
- /* Forbid $_ */
- if(PL_parser->bufptr - lexname == 2 && lexname[1] == '_')
- croak("Can't use global $_ in \"my\"");
-
- return pad_add_name_pvn(lexname, PL_parser->bufptr - lexname, 0, NULL, NULL);
-}
-
-#define parse_scoped_block(flags) MY_parse_scoped_block(aTHX_ flags)
-static OP *MY_parse_scoped_block(pTHX_ int flags)
-{
- OP *ret;
- I32 save_ix = block_start(TRUE);
- ret = parse_block(flags);
- return block_end(save_ix, ret);
-}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/Syntax-Keyword-Try-0.24/hax/perl-additions.c.inc
new/Syntax-Keyword-Try-0.25/hax/perl-additions.c.inc
--- old/Syntax-Keyword-Try-0.24/hax/perl-additions.c.inc 2021-05-10
15:39:16.000000000 +0200
+++ new/Syntax-Keyword-Try-0.25/hax/perl-additions.c.inc 2021-06-01
22:49:17.000000000 +0200
@@ -1,4 +1,4 @@
-/* vi: set ft=c inde=: */
+/* vi: set ft=c */
#ifndef av_count
# define av_count(av) (AvFILL(av) + 1)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/Syntax-Keyword-Try-0.24/hax/wrap_keyword_plugin.c.inc
new/Syntax-Keyword-Try-0.25/hax/wrap_keyword_plugin.c.inc
--- old/Syntax-Keyword-Try-0.24/hax/wrap_keyword_plugin.c.inc 2021-05-10
15:39:16.000000000 +0200
+++ new/Syntax-Keyword-Try-0.25/hax/wrap_keyword_plugin.c.inc 1970-01-01
01:00:00.000000000 +0100
@@ -1,28 +0,0 @@
-/* vi: set ft=c inde=: */
-
-#ifndef OP_CHECK_MUTEX_LOCK /* < 5.15.8 */
-# define OP_CHECK_MUTEX_LOCK ((void)0)
-# define OP_CHECK_MUTEX_UNLOCK ((void)0)
-#endif
-
-#define wrap_keyword_plugin(func, var) S_wrap_keyword_plugin(aTHX_ func, var)
-
-static void S_wrap_keyword_plugin(pTHX_ Perl_keyword_plugin_t func,
Perl_keyword_plugin_t *var)
-{
- /* BOOT can potentially race with other threads (RT123547) */
-
- /* Perl doesn't really provide us a nice mutex for doing this so this is the
- * best we can find. See also
- * https://rt.perl.org/Public/Bug/Display.html?id=132413
- */
- if(*var)
- return;
-
- OP_CHECK_MUTEX_LOCK;
- if(!*var) {
- *var = PL_keyword_plugin;
- PL_keyword_plugin = func;
- }
-
- OP_CHECK_MUTEX_UNLOCK;
-}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/Syntax-Keyword-Try-0.24/lib/Syntax/Keyword/Try/Deparse.pm
new/Syntax-Keyword-Try-0.25/lib/Syntax/Keyword/Try/Deparse.pm
--- old/Syntax-Keyword-Try-0.24/lib/Syntax/Keyword/Try/Deparse.pm
2021-05-10 15:39:16.000000000 +0200
+++ new/Syntax-Keyword-Try-0.25/lib/Syntax/Keyword/Try/Deparse.pm
2021-06-01 22:49:17.000000000 +0200
@@ -3,7 +3,7 @@
#
# (C) Paul Evans, 2021 -- [email protected]
-package Syntax::Keyword::Try::Deparse 0.24;
+package Syntax::Keyword::Try::Deparse 0.25;
use v5.14;
use warnings;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/Syntax-Keyword-Try-0.24/lib/Syntax/Keyword/Try.pm
new/Syntax-Keyword-Try-0.25/lib/Syntax/Keyword/Try.pm
--- old/Syntax-Keyword-Try-0.24/lib/Syntax/Keyword/Try.pm 2021-05-10
15:39:16.000000000 +0200
+++ new/Syntax-Keyword-Try-0.25/lib/Syntax/Keyword/Try.pm 2021-06-01
22:49:17.000000000 +0200
@@ -3,7 +3,7 @@
#
# (C) Paul Evans, 2016-2021 -- [email protected]
-package Syntax::Keyword::Try 0.24;
+package Syntax::Keyword::Try 0.25;
use v5.14;
use warnings;
@@ -45,10 +45,9 @@
code.
Syntax similar to this module has now been added to core perl, starting at
-development version 5.33.7, and is expected to become generally available when
-perl 5.34 is released. If you are writing new code, it is suggested that you
-instead use the L<Feature::Compat::Try> module instead, as that will enable
-the core feature on those supported perl versions, falling back to
+version 5.34.0. If you are writing new code, it is suggested that you instead
+use the L<Feature::Compat::Try> module instead, as that will enable the core
+feature on those supported perl versions, falling back to
C<Syntax::Keyword::Try> on older perls.
=head1 Experimental Features
@@ -63,8 +62,6 @@
use Syntax::Keyword::Try qw( try :experimental(typed) );
- use Syntax::Keyword::Try qw( try :experimental(try_value) ); # deprecated
-
use Syntax::Keyword::Try qw( try :experimental ); # all of the above
Don't forget to import the main C<try> symbol itself, to activate the syntax.
@@ -234,56 +231,6 @@
should consider using L<Syntax::Keyword::Defer> rather than using C<finally>
statements.
-=head1 VALUE SEMANTICS
-
-=over 4
-
-B<Warning:> the feature described in this section was experimental and is now
-deprecated. This experiment has existed for a while, though given that since
-version 0.22 the regular C<try> syntax already behaves fine inside a C<do>
-block, there is no longer any reason for this experimental feature to exist.
-It will print a deprecation warning, and eventually will be removed in a later
-version. You should use C<do { try ... }> instead.
-
-Additionally, on I<perl> versions 5.18 and later, it will produce a warning
-in the C<experimental> category.
-
-=back
-
-The syntax provided by this module may be used as a value-yielding expression.
-Because this syntax is new, experimental, and somewhat surprising, it must be
-specifically requested by name C<try_value>:
-
- use Syntax::Keyword::Try qw( try try_value );
-
- my $result = try do { ... } catch { ... };
-
-Also, on Perl versions 5.24 and later:
-
- my $result = try do { ... } finally { ... };
-
- my $result = try do { ... } catch { ... } finally { ... };
-
-Specifically, note that the expression must be spelled as C<try do { ... }> so
-that the syntax is distinct from that used by control-flow statements. The
-interposed C<do> keyword reminds the reader, and instructs the syntax parser,
-that this will be an expression, not a statement. It is not necessary to
-similarly notate the C<catch> or C<finally> blocks.
-
-In this case, the syntax behaves syntactically like an expression, and may
-appear anywhere a normal expression is allowed. It follows similar semantics
-to the purely control-flow case; if the code in the C<try> block does not
-throw an exception, then the expression as a whole yields whatever value the
-C<try> expression did. If it fails, then the C<catch> block is executed and
-the expression yields its resulting value instead. A C<finally> block, if
-present, will be evaluated for side-effects before the rest of the expression
-returns.
-
-Remember that, as in the control-flow case, the C<return> keyword will cause
-the entire containing function to return, not just the C<try> block.
-
-=cut
-
=head1 OTHER MODULES
There are already quite a number of modules on CPAN that provide a
@@ -310,8 +257,7 @@
=back
In addition, core perl itself gained a C<try/catch> syntax based on this
-module at developemnt version 5.33.7, and should become generally available
-when 5.34 is released. It will be available as C<use feature 'try'>.
+module at version 5.34.0. It is available as C<use feature 'try'>.
They are compared here, by feature:
@@ -366,11 +312,10 @@
=head2 Value Semantics
Like L<Try> and L<Syntax::Feature::Try>, the syntax provided by this module
-only works as a syntax-level statement and not an expression when the
-experimental C<try_value> feature described above has not been enabled. You
-cannot assign from the result of a C<try> block. A common workaround is to
-wrap the C<try/catch> statement inside a C<do> block, where its final
-expression can be captured and used as a value.
+only works as a syntax-level statement and not an expression. You cannot
+assign from the result of a C<try> block. A common workaround is to wrap
+the C<try/catch> statement inside a C<do> block, where its final expression
+can be captured and used as a value.
The same C<do> block wrapping also works for the core C<feature 'try'>.
@@ -422,7 +367,7 @@
$class->import_into( $caller, @_ );
}
-my @EXPERIMENTAL = qw( typed try_value );
+my @EXPERIMENTAL = qw( typed );
sub import_into
{
@@ -433,7 +378,6 @@
my %syms = map { $_ => 1 } @syms;
$^H{"Syntax::Keyword::Try/try"}++ if delete $syms{try};
- $^H{"Syntax::Keyword::Try/try_value"}++ if delete $syms{try_value};
# Largely for Feature::Compat::Try's benefit
$^H{"Syntax::Keyword::Try/no_finally"}++ if delete $syms{"-no_finally"};
@@ -453,7 +397,10 @@
# Ignore requests for these, as they come automatically with `try`
delete @syms{qw( catch finally )};
- $^H{"Syntax::Keyword::Try/try_value"}++ if
$^H{"Syntax::Keyword::Try/experimental(try_value)"};
+ if( $syms{try_value} or $syms{":experimental(try_value)"} ) {
+ croak "The 'try_value' experimental feature is now removed\n" .
+ "Instead, you should use do { try ... } to yield a value from a
try/catch statement";
+ }
croak "Unrecognised import symbols @{[ keys %syms ]}" if keys %syms;
}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/Syntax-Keyword-Try-0.24/lib/Syntax/Keyword/Try.xs
new/Syntax-Keyword-Try-0.25/lib/Syntax/Keyword/Try.xs
--- old/Syntax-Keyword-Try-0.24/lib/Syntax/Keyword/Try.xs 2021-05-10
15:39:16.000000000 +0200
+++ new/Syntax-Keyword-Try-0.25/lib/Syntax/Keyword/Try.xs 2021-06-01
22:49:17.000000000 +0200
@@ -7,6 +7,8 @@
#include "perl.h"
#include "XSUB.h"
+#include "XSParseKeyword.h"
+
#include "perl-backcompat.c.inc"
#if HAVE_PERL_VERSION(5,32,0)
@@ -23,12 +25,6 @@
typedef I32 array_ix_t;
#endif /* <5.19.4 */
-#ifndef wrap_keyword_plugin
-# include "wrap_keyword_plugin.c.inc"
-#endif
-
-#include "lexer-additions.c.inc"
-
#include "perl-additions.c.inc"
static OP *pp_entertrycatch(pTHX);
@@ -415,66 +411,37 @@
}
#endif
-static int try_keyword(pTHX_ OP **op)
+static int build_try(pTHX_ OP **out, XSParseKeywordPiece *args[], size_t
nargs, void *hookdata)
{
- OP *try = NULL, *catch = NULL;
- AV *condcatch = NULL;
- CV *finally = NULL;
- OP *ret = NULL;
- bool is_value = FALSE;
- HV *hints = GvHV(PL_hintgv);
-
- lex_read_space(0);
+ U32 argi = 0;
- if(hints && hv_fetchs(hints, "Syntax::Keyword::Try/try_value", 0) &&
- lex_consume("do")) {
- lex_read_space(0);
- is_value = TRUE;
-
-#ifdef WARN_EXPERIMENTAL
- if(!hints || !hv_fetchs(hints,
"Syntax::Keyword::Try/experimental(try_value)", 0)) {
- Perl_ck_warner(aTHX_ packWARN(WARN_EXPERIMENTAL),
- "'try do' syntax is experimental and may be changed or removed without
notice");
- }
-#endif
-
- Perl_ck_warner(aTHX_ packWARN(WARN_DEPRECATED),
- "'try do' syntax is deprecated and will be removed. Use do { try ... }
instead");
- }
+ OP *try = args[argi++]->op;
- if(lex_peek_unichar(0) != '{')
- croak("Expected try to be followed by '{'");
-
- try = parse_scoped_block(0);
- lex_read_space(0);
+ OP *ret = NULL;
+ HV *hints = GvHV(PL_hintgv);
bool require_var = hints && hv_fetchs(hints,
"Syntax::Keyword::Try/require_var", 0);
- while(lex_consume("catch")) {
- OP *assignop = NULL, *condop = NULL;
- OP *body;
- I32 save_ix;
+ U32 ncatches = args[argi++]->i;
- if(catch)
- croak("Already have a default catch {} block");
-
- save_ix = block_start(TRUE);
- lex_read_space(0);
+ AV *condcatch = NULL;
+ OP *catch = NULL;
+ while(ncatches--) {
+ bool has_catchvar = args[argi++]->i;
+ PADOFFSET catchvar = has_catchvar ? args[argi++]->padix : 0;
+ int catchtype = has_catchvar ? args[argi++]->i : -1;
- if(lex_consume("(")) {
- PADOFFSET catchvar = 0;
- bool warned = FALSE;
+ bool warned = FALSE;
- lex_read_space(0);
- catchvar = parse_lexvar();
+ OP *condop = NULL;
- /* my $var = $@ */
- assignop = newBINOP(OP_SASSIGN, 0,
- newGVOP(OP_GVSV, 0, PL_errgv), newPADxVOP(OP_PADSV, catchvar, OPf_MOD,
OPpLVAL_INTRO));
+ switch(catchtype) {
+ case -1: /* no type */
+ break;
- lex_read_space(0);
- if(lex_consume("isa")) {
- OP *type = parse_termexpr(0);
+ case 0: /* isa */
+ {
+ OP *type = args[argi++]->op;
#ifdef HAVE_OP_ISA
condop = newBINOP(OP_ISA, 0,
newPADxVOP(OP_PADSV, catchvar, 0, 0), type);
@@ -486,9 +453,12 @@
condop = newBINOP_CUSTOM(&pp_isa, 0,
newPADxVOP(OP_PADSV, catchvar, 0, 0), type);
#endif
+ break;
}
- else if(lex_consume("=~")) {
- OP *regexp = parse_termexpr(0);
+
+ case 1: /* =~ */
+ {
+ OP *regexp = args[argi++]->op;
if(regexp->op_type != OP_MATCH || cPMOPx(regexp)->op_first)
croak("Expected a regexp match");
@@ -501,30 +471,36 @@
regexp->op_flags |= OPf_KIDS|OPf_STACKED;
#endif
condop = regexp;
+ break;
}
+ default:
+ croak("TODO\n");
+ }
+
#ifdef WARN_EXPERIMENTAL
- if(condop && !warned &&
- (!hints || !hv_fetchs(hints,
"Syntax::Keyword::Try/experimental(typed)", 0))) {
- warned = true;
- Perl_ck_warner(aTHX_ packWARN(WARN_EXPERIMENTAL),
- "typed catch syntax is experimental and may be changed or removed
without notice");
- }
+ if(condop && !warned &&
+ (!hints || !hv_fetchs(hints, "Syntax::Keyword::Try/experimental(typed)",
0))) {
+ warned = true;
+ Perl_ck_warner(aTHX_ packWARN(WARN_EXPERIMENTAL),
+ "typed catch syntax is experimental and may be changed or removed
without notice");
+ }
#endif
- if(!lex_consume(")"))
- croak("Expected close paren for catch (VAR)");
+ OP *body = args[argi++]->op;
- lex_read_space(0);
-
- intro_my();
- }
- else if(require_var) {
+ if(require_var && !has_catchvar)
croak("Expected (VAR) for catch");
- }
- body = block_end(save_ix, parse_block(0));
- lex_read_space(0);
+ if(catch)
+ croak("Already have a default catch {} block");
+
+ OP *assignop = NULL;
+ if(catchvar) {
+ /* my $var = $@ */
+ assignop = newBINOP(OP_SASSIGN, 0,
+ newGVOP(OP_GVSV, 0, PL_errgv), newPADxVOP(OP_PADSV, catchvar, OPf_MOD,
OPpLVAL_INTRO));
+ }
if(condop) {
if(!condcatch)
@@ -536,8 +512,7 @@
}
else if(assignop) {
catch = op_prepend_elem(OP_LINESEQ,
- assignop,
- body);
+ assignop, body);
}
else
catch = body;
@@ -564,29 +539,11 @@
bool no_finally = hints && hv_fetchs(hints,
"Syntax::Keyword::Try/no_finally", 0);
- if(!no_finally && lex_consume("finally")) {
- I32 floor_ix, save_ix;
- OP *body;
+ U32 has_finally = args[argi++]->i;
+ CV *finally = has_finally ? args[argi++]->cv : NULL;
-#if !HAVE_PERL_VERSION(5,24,0)
- if(is_value)
- croak("try do {} finally {} is not supported on this version of perl");
-#endif
-
- lex_read_space(0);
-
- floor_ix = start_subparse(FALSE, CVf_ANON);
- SAVEFREESV(PL_compcv);
-
- save_ix = block_start(0);
- body = parse_block(0);
- SvREFCNT_inc(PL_compcv);
- body = block_end(save_ix, body);
-
- finally = newATTRSUB(floor_ix, NULL, NULL, NULL, body);
-
- lex_read_space(0);
- }
+ if(no_finally && finally)
+ croak("finally {} is not permitted here");
if(!catch && !finally) {
op_free(try);
@@ -598,7 +555,7 @@
ret = try;
if(catch) {
- ret = newENTERTRYCATCHOP(is_value ? OPf_WANT_SCALAR : 0, try, catch);
+ ret = newENTERTRYCATCHOP(0, try, catch);
}
/* If there's a finally, make
@@ -614,30 +571,35 @@
newOP(OP_ENTER, 0),
ret);
- if(is_value)
- ret->op_ppaddr = &pp_leave_keeping_stack;
-
- *op = ret;
- return is_value ? KEYWORD_PLUGIN_EXPR : KEYWORD_PLUGIN_STMT;
+ *out = ret;
+ return KEYWORD_PLUGIN_STMT;
}
-static int (*next_keyword_plugin)(pTHX_ char *, STRLEN, OP **);
-
-static int my_keyword_plugin(pTHX_ char *kw, STRLEN kwlen, OP **op)
-{
- HV *hints;
- if(PL_parser && PL_parser->error_count)
- return (*next_keyword_plugin)(aTHX_ kw, kwlen, op);
-
- if(!(hints = GvHV(PL_hintgv)))
- return (*next_keyword_plugin)(aTHX_ kw, kwlen, op);
+static struct XSParseKeywordHooks hooks_try = {
+ .permit_hintkey = "Syntax::Keyword::Try/try",
- if(kwlen == 3 && strEQ(kw, "try") &&
- hv_fetchs(hints, "Syntax::Keyword::Try/try", 0))
- return try_keyword(aTHX_ op);
-
- return (*next_keyword_plugin)(aTHX_ kw, kwlen, op);
-}
+ .pieces = (const struct XSParseKeywordPieceType []){
+ XPK_BLOCK,
+ XPK_REPEATED(
+ XPK_LITERAL("catch"),
+ XPK_PREFIXED_BLOCK(
+ /* optionally ($var), ($var isa Type) or ($var =~ m/.../) */
+ XPK_PARENSCOPE_OPT(
+ XPK_LEXVAR_MY(XPK_LEXVAR_SCALAR),
+ XPK_CHOICE(
+ XPK_SEQUENCE(XPK_LITERAL("isa"), XPK_TERMEXPR),
+ XPK_SEQUENCE(XPK_LITERAL("=~"), XPK_TERMEXPR)
+ )
+ )
+ )
+ ),
+ XPK_OPTIONAL(
+ XPK_LITERAL("finally"), XPK_ANONSUB
+ ),
+ {0},
+ },
+ .build = &build_try,
+};
MODULE = Syntax::Keyword::Try PACKAGE = Syntax::Keyword::Try
@@ -661,4 +623,6 @@
Perl_custom_op_register(aTHX_ &pp_isa, &xop_isa);
#endif
- wrap_keyword_plugin(&my_keyword_plugin, &next_keyword_plugin);
+ boot_xs_parse_keyword(0.06);
+
+ register_xs_parse_keyword("try", &hooks_try, NULL);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/Syntax-Keyword-Try-0.24/t/20try-do.t
new/Syntax-Keyword-Try-0.25/t/20try-do.t
--- old/Syntax-Keyword-Try-0.24/t/20try-do.t 2021-05-10 15:39:16.000000000
+0200
+++ new/Syntax-Keyword-Try-0.25/t/20try-do.t 1970-01-01 01:00:00.000000000
+0100
@@ -1,88 +0,0 @@
-#!/usr/bin/perl
-
-use v5.14;
-use warnings;
-
-use Test::More;
-
-use constant HAVE_WARN_EXPERIMENTAL => $] >= 5.018;
-
-no if HAVE_WARN_EXPERIMENTAL, warnings => 'experimental';
-use Syntax::Keyword::Try qw( try try_value );
-
-no warnings 'deprecated';
-
-# try do { } yields result
-{
- is( try do { "result" } catch ($e) {},
- "result",
- 'try do { } yields result' );
-}
-
-# try do { } failure returns catch
-{
- is( try do { die "oops\n" } catch ($e) { "failure" },
- "failure",
- 'try do { } yields catch result on failure' );
-}
-
-# stack discipline
-{
- my @v = ( 1, [ 2, try do { 3 } catch ($e) {}, 4 ], 5 );
- is_deeply( \@v, [ 1, [ 2 .. 4 ], 5 ],
- 'try do { } preserves stack discipline' ) or
- diag "Got ", explain \@v;
-}
-
-# list context
-{
- my @v = try do { 1, 2, 3 } catch ($e) {};
- is_deeply( \@v, [ 1 .. 3 ],
- 'try do can yield lists' );
-}
-
-# $@ localising
-SKIP: {
- # RT124366
- skip "perls before 5.24 fail to lexicalise \$@ properly (RT124366)", 1
unless $] >= 5.024;
-
- eval { die "oopsie" };
-
- my $ret = try do { die "another failure" } catch ($e) {};
- like( $@, qr/^oopsie at /, '$@ after try do/catch' );
-}
-
-# Non-try do { ... } unaffected
-{
- is( do { 1 + 2 }, 3,
- 'Plain do { ... } unaffected' );
-}
-
-# try do syntax produces experimental and deprecated warnings
-SKIP: {
- use if HAVE_WARN_EXPERIMENTAL, warnings => 'experimental';
- skip "No 'experimental' warnings category", 1 unless HAVE_WARN_EXPERIMENTAL;
-
- use warnings 'deprecated';
-
- my $warnings = "";
- local $SIG{__WARN__} = sub { $warnings .= join "", @_ };
-
- eval "try do { 1 } catch (\$e) { 2 }" or die $@;
-
- like( $warnings, qr/^'try do' syntax is experimental/,
- 'try do syntax produces experimental warnings' );
- like( $warnings, qr/^'try do' syntax is deprecated /m,
- 'try do syntax produces deprecated warnings' );
-
- # warning can be disabled
- use Syntax::Keyword::Try qw( :experimental(try_value) );
- no warnings 'deprecated';
-
- $warnings = "";
-
- eval "try do { 3 } catch (\$e) { 4 }" or die $@;
- is( $warnings, "", 'no warnings when :experimental(try_value) is enabled' );
-}
-
-done_testing;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/Syntax-Keyword-Try-0.24/t/21try-do-finally.t
new/Syntax-Keyword-Try-0.25/t/21try-do-finally.t
--- old/Syntax-Keyword-Try-0.24/t/21try-do-finally.t 2021-05-10
15:39:16.000000000 +0200
+++ new/Syntax-Keyword-Try-0.25/t/21try-do-finally.t 1970-01-01
01:00:00.000000000 +0100
@@ -1,39 +0,0 @@
-#!/usr/bin/perl
-
-use v5.14;
-use warnings;
-
-use Test::More;
-BEGIN {
- # Before 5.24 this code won't even compile
- plan skip_all => "try do { } finally { } is not supported before perl 5.24"
if $] < 5.024;
-}
-
-use constant HAVE_WARN_EXPERIMENTAL => $] >= 5.018;
-
-no if HAVE_WARN_EXPERIMENTAL, warnings => 'experimental';
-use Syntax::Keyword::Try qw( try try_value );
-
-no warnings 'deprecated';
-
-# try do { } finally { }
-{
- my $x;
- my $result = try do { $x .= 1; "result" }
- finally { $x .= 2 }, $x .= 3;
-
- is( $result, "result", 'try do { } finally yields result' );
- is( $x, "123", 'try do {} finally has finally side-effect' );
-}
-
-# try do { } catch { } finally { }
-{
- my $x;
- my $result = try do { $x .= 4; die "oops" }
- catch ($e) { $x .= 5; "failure" }
- finally { $x .= 6 };
- is( $result, "failure", 'try do {} catch finally catches exception' );
- is( $x, "456", 'try do {} catch finally has finally side-effect' );
-}
-
-done_testing;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/Syntax-Keyword-Try-0.24/t/30compat.t
new/Syntax-Keyword-Try-0.25/t/30compat.t
--- old/Syntax-Keyword-Try-0.24/t/30compat.t 2021-05-10 15:39:16.000000000
+0200
+++ new/Syntax-Keyword-Try-0.25/t/30compat.t 2021-06-01 22:49:17.000000000
+0200
@@ -16,7 +16,7 @@
finally { 456 }
EOPERL
'try/finally is forbidden' );
- like( $@, qr/^Expected try \{\} to be followed by catch \{\} / );
+ like( $@, qr/^finally \{\} is not permitted here / );
}
# require var