Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package perl-XS-Parse-Keyword for 
openSUSE:Factory checked in at 2022-06-02 21:54:46
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/perl-XS-Parse-Keyword (Old)
 and      /work/SRC/openSUSE:Factory/.perl-XS-Parse-Keyword.new.1548 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "perl-XS-Parse-Keyword"

Thu Jun  2 21:54:46 2022 rev:6 rq:980494 version:0.23

Changes:
--------
--- 
/work/SRC/openSUSE:Factory/perl-XS-Parse-Keyword/perl-XS-Parse-Keyword.changes  
    2022-03-01 17:04:49.092353333 +0100
+++ 
/work/SRC/openSUSE:Factory/.perl-XS-Parse-Keyword.new.1548/perl-XS-Parse-Keyword.changes
    2022-06-02 21:55:02.412432048 +0200
@@ -1,0 +2,22 @@
+Thu May 19 03:07:43 UTC 2022 - Tina M??ller <timueller+p...@suse.de>
+
+- updated to 0.23
+   see /usr/share/doc/packages/perl-XS-Parse-Keyword/Changes
+
+  0.23    2022-05-18
+          [CHANGES]
+           * Defined XPK_KEYWORD, a better version of XPK_LITERAL for
+             keyword-like tokens
+           * Defined XPK_ARITHEXPR, a higher-precedence version of XPK_TERMEXPR
+           * Defined XPK_ARGSCOPE, a variant of XPK_PARENSCOPE where the parens
+             themselves are optional
+           * Undocument the old XPK_STRING token type
+
+          [BUGFIXES]
+           * Fixes for bugs that affect -DDEBUGGING-enabled perls
+              + Remember to clear OPf_KIDS when stealing the op_first of a
+                LISTOP (RT142770)
+              + Don't call cv_clone() at compiletime when unit testing; 
generate
+                an OP_ANONCODE instead (RT142771)
+
+-------------------------------------------------------------------

Old:
----
  XS-Parse-Keyword-0.22.tar.gz

New:
----
  XS-Parse-Keyword-0.23.tar.gz

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ perl-XS-Parse-Keyword.spec ++++++
--- /var/tmp/diff_new_pack.FzZU97/_old  2022-06-02 21:55:02.872432633 +0200
+++ /var/tmp/diff_new_pack.FzZU97/_new  2022-06-02 21:55:02.876432639 +0200
@@ -18,7 +18,7 @@
 
 %define cpan_name XS-Parse-Keyword
 Name:           perl-XS-Parse-Keyword
-Version:        0.22
+Version:        0.23
 Release:        0
 License:        Artistic-1.0 OR GPL-1.0-or-later
 Summary:        XS functions to assist in parsing keyword syntax

++++++ XS-Parse-Keyword-0.22.tar.gz -> XS-Parse-Keyword-0.23.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/XS-Parse-Keyword-0.22/Build.PL 
new/XS-Parse-Keyword-0.23/Build.PL
--- old/XS-Parse-Keyword-0.22/Build.PL  2022-02-21 22:38:00.000000000 +0100
+++ new/XS-Parse-Keyword-0.23/Build.PL  2022-05-18 18:50:09.000000000 +0200
@@ -46,7 +46,7 @@
 
 int main(void) { struct Perl_custom_infix def; return 0; }
 EOF
-   ) if $] >= 5.035010;
+   ) if $] >= 5.037000; # maybe I'll start this in 5.37...
 
    if( $have_pl_infix_plugin ) {
       print "Including support for core perl PL_infix_plugin\n";
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/XS-Parse-Keyword-0.22/Changes 
new/XS-Parse-Keyword-0.23/Changes
--- old/XS-Parse-Keyword-0.22/Changes   2022-02-21 22:38:00.000000000 +0100
+++ new/XS-Parse-Keyword-0.23/Changes   2022-05-18 18:50:09.000000000 +0200
@@ -1,5 +1,21 @@
 Revision history for XS-Parse-Keyword
 
+0.23    2022-05-18
+        [CHANGES]
+         * Defined XPK_KEYWORD, a better version of XPK_LITERAL for
+           keyword-like tokens
+         * Defined XPK_ARITHEXPR, a higher-precedence version of XPK_TERMEXPR
+         * Defined XPK_ARGSCOPE, a variant of XPK_PARENSCOPE where the parens
+           themselves are optional
+         * Undocument the old XPK_STRING token type
+
+        [BUGFIXES]
+         * Fixes for bugs that affect -DDEBUGGING-enabled perls
+            + Remember to clear OPf_KIDS when stealing the op_first of a
+              LISTOP (RT142770)
+            + Don't call cv_clone() at compiletime when unit testing; generate
+              an OP_ANONCODE instead (RT142771)
+
 0.22    2022-02-21
         [CHANGES]
          * Added XPK_AUTOSEMI piece type
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/XS-Parse-Keyword-0.22/MANIFEST 
new/XS-Parse-Keyword-0.23/MANIFEST
--- old/XS-Parse-Keyword-0.22/MANIFEST  2022-02-21 22:38:00.000000000 +0100
+++ new/XS-Parse-Keyword-0.23/MANIFEST  2022-05-18 18:50:09.000000000 +0200
@@ -16,7 +16,11 @@
 lib/XS/Parse/Keyword.xs
 lib/XS/Parse/Keyword/Builder.pm
 lib/XS/Parse/Keyword/Builder_data.pm.PL
+LICENSE
 MANIFEST                       This list of files
+META.json
+META.yml
+README
 src/infix.c
 src/infix.h
 src/keyword.c
@@ -27,6 +31,7 @@
 t/30pieces-literal.t
 t/31pieces-block.t
 t/32pieces-anonsub.t
+t/33pieces-arithexpr.t
 t/33pieces-listexpr.t
 t/33pieces-termexpr.t
 t/34pieces-ident.t
@@ -54,7 +59,3 @@
 t/testcase.pm
 XSParseInfix.h
 XSParseKeyword.h
-README
-LICENSE
-META.yml
-META.json
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/XS-Parse-Keyword-0.22/META.json 
new/XS-Parse-Keyword-0.23/META.json
--- old/XS-Parse-Keyword-0.22/META.json 2022-02-21 22:38:00.000000000 +0100
+++ new/XS-Parse-Keyword-0.23/META.json 2022-05-18 18:50:09.000000000 +0200
@@ -40,19 +40,19 @@
    "provides" : {
       "XS::Parse::Infix" : {
          "file" : "lib/XS/Parse/Infix.pm",
-         "version" : "0.22"
+         "version" : "0.23"
       },
       "XS::Parse::Infix::Builder" : {
          "file" : "lib/XS/Parse/Infix/Builder.pm",
-         "version" : "0.22"
+         "version" : "0.23"
       },
       "XS::Parse::Keyword" : {
          "file" : "lib/XS/Parse/Keyword.pm",
-         "version" : "0.22"
+         "version" : "0.23"
       },
       "XS::Parse::Keyword::Builder" : {
          "file" : "lib/XS/Parse/Keyword/Builder.pm",
-         "version" : "0.22"
+         "version" : "0.23"
       }
    },
    "release_status" : "stable",
@@ -61,6 +61,6 @@
          "http://dev.perl.org/licenses/";
       ]
    },
-   "version" : "0.22",
+   "version" : "0.23",
    "x_serialization_backend" : "JSON::PP version 4.06"
 }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/XS-Parse-Keyword-0.22/META.yml 
new/XS-Parse-Keyword-0.23/META.yml
--- old/XS-Parse-Keyword-0.22/META.yml  2022-02-21 22:38:00.000000000 +0100
+++ new/XS-Parse-Keyword-0.23/META.yml  2022-05-18 18:50:09.000000000 +0200
@@ -19,19 +19,19 @@
 provides:
   XS::Parse::Infix:
     file: lib/XS/Parse/Infix.pm
-    version: '0.22'
+    version: '0.23'
   XS::Parse::Infix::Builder:
     file: lib/XS/Parse/Infix/Builder.pm
-    version: '0.22'
+    version: '0.23'
   XS::Parse::Keyword:
     file: lib/XS/Parse/Keyword.pm
-    version: '0.22'
+    version: '0.23'
   XS::Parse::Keyword::Builder:
     file: lib/XS/Parse/Keyword/Builder.pm
-    version: '0.22'
+    version: '0.23'
 requires:
   perl: '5.014'
 resources:
   license: http://dev.perl.org/licenses/
-version: '0.22'
+version: '0.23'
 x_serialization_backend: 'CPAN::Meta::YAML version 0.018'
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/XS-Parse-Keyword-0.22/README 
new/XS-Parse-Keyword-0.23/README
--- old/XS-Parse-Keyword-0.22/README    2022-02-21 22:38:00.000000000 +0100
+++ new/XS-Parse-Keyword-0.23/README    2022-05-18 18:50:09.000000000 +0200
@@ -266,6 +266,20 @@
     body of a new anonymous subroutine. This will be passed as a protosub
     CV in the cv field.
 
+ XPK_ARITHEXPR
+
+    atomic, emits op.
+
+       XPK_ARITHEXPR
+
+    An arithmetic expression is expected, parsed using parse_arithexpr(),
+    and passed as an optree in the op field.
+
+ XPK_ARITHEXPR_VOIDCTX, XPK_ARITHEXPR_SCALARCTX
+
+    Variants of XPK_ARITHEXPR which puts the expression in void or scalar
+    context.
+
  XPK_TERMEXPR
 
     atomic, emits op.
@@ -424,8 +438,20 @@
     XPK_OPTIONAL or XPK_REPEATED sequence, to provide a "secondary keyword"
     that such a repeated item can look out for.
 
-    This was previously called XPK_STRING, and is provided as a synonym for
-    back-compatibility but new code should use this new name instead.
+ XPK_KEYWORD
+
+    atomic, can probe, emits nothing.
+
+       XPK_KEYWORD("keyword")
+
+    A literal string match is expected. No argument value is passed.
+
+    This is similar to XPK_LITERAL except that it additionally checks that
+    the following character is not an identifier character. This ensures
+    that the expected keyword-like behaviour is preserved. For example,
+    given the input "keyword", the piece XPK_LITERAL("key") would match it,
+    whereas XPK_KEYWORD("key") would not because of the subsequent "w"
+    character.
 
  XPK_SEQUENCE
 
@@ -529,6 +555,22 @@
     A structural type which expects to find a sequence of pieces, all
     contained in parentheses as ( ... ). This will pass no extra arguments.
 
+ XPK_ARGSCOPE
+
+    structural, emits nothing.
+
+       XPK_ARGSCOPE(pieces ...)
+
+    A structural type similar to XPK_PARENSCOPE, except that the
+    parentheses themselves are optional; much like Perl's parsing of calls
+    to known functions.
+
+    If parentheses are encountered in the input, they will be consumed by
+    this piece and it will behave identically to XPK_PARENSCOPE. If there
+    is no open parenthesis, this piece will behave like XPK_SEQUENCE and
+    consume all the pieces inside it, without expecting a closing
+    parenthesis.
+
  XPK_BRACKETSCOPE
 
     structural, can probe, emits nothing.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/XS-Parse-Keyword-0.22/XSParseKeyword.h 
new/XS-Parse-Keyword-0.23/XSParseKeyword.h
--- old/XS-Parse-Keyword-0.22/XSParseKeyword.h  2022-02-21 22:38:00.000000000 
+0100
+++ new/XS-Parse-Keyword-0.23/XSParseKeyword.h  2022-05-18 18:50:09.000000000 
+0200
@@ -31,8 +31,8 @@
 
   XS_PARSE_KEYWORD_BLOCK = 0x10,      /* op */
   XS_PARSE_KEYWORD_ANONSUB,           /* cv */
-  /* TODO: XS_PARSE_KEYWORD_ARITHEXPR = 0x12 */
-  XS_PARSE_KEYWORD_TERMEXPR = 0x13,   /* op */
+  XS_PARSE_KEYWORD_ARITHEXPR,         /* op */
+  XS_PARSE_KEYWORD_TERMEXPR,          /* op */
   XS_PARSE_KEYWORD_LISTEXPR,          /* op */
   /* TODO: XS_PARSE_KEYWORD_FULLEXPR = 0x15 */
   XS_PARSE_KEYWORD_IDENT = 0x16,      /* sv */
@@ -66,7 +66,8 @@
 
 enum {
   XPK_TYPEFLAG_OPT      = (1<<16),
-  XPK_TYPEFLAG_SPECIAL  = (1<<17), /* on XPK_BLOCK: scoped
+  XPK_TYPEFLAG_SPECIAL  = (1<<17), /* on XPK_LITERALSTR: keyword
+                                      on XPK_BLOCK: scoped
                                       on XPK_LEXVAR: my */
 
   /* These three are shifted versions of perl's G_VOID, G_SCALAR, G_LIST */
@@ -75,6 +76,8 @@
   XPK_TYPEFLAG_G_LIST   = (3<<18),
 
   XPK_TYPEFLAG_ENTERLEAVE = (1<<20), /* wrap ENTER/LEAVE pair around the item 
*/
+
+  XPK_TYPEFLAG_MAYBEPARENS = (1<<21), /* parens themselves are optional on 
PARENSCOPE */
 };
 
 #define XPK_BLOCK_flags(flags) {.type = XS_PARSE_KEYWORD_BLOCK|(flags), 
.u.pieces = NULL}
@@ -92,6 +95,10 @@
 
 #define XPK_ANONSUB {.type = XS_PARSE_KEYWORD_ANONSUB}
 
+#define XPK_ARITHEXPR_flags(flags) {.type = XS_PARSE_KEYWORD_ARITHEXPR|(flags)}
+#define XPK_ARITHEXPR              XPK_ARITHEXPR_flags(0)
+#define XPK_ARITHEXPR_VOIDCTX      XPK_ARITHEXPR_flags(XPK_TYPEFLAG_G_VOID)
+#define XPK_ARITHEXPR_SCALARCTX    XPK_ARITHEXPR_flags(XPK_TYPEFLAG_G_SCALAR)
 #define XPK_TERMEXPR_flags(flags) {.type = XS_PARSE_KEYWORD_TERMEXPR|(flags)}
 #define XPK_TERMEXPR              XPK_TERMEXPR_flags(0)
 #define XPK_TERMEXPR_VOIDCTX      XPK_TERMEXPR_flags(XPK_TYPEFLAG_G_VOID)
@@ -121,6 +128,7 @@
 #define XPK_LITERAL(s) {.type = XS_PARSE_KEYWORD_LITERALSTR, .u.str = (const 
char *)s}
 #define XPK_STRING(s)  XPK_LITERAL(s)
 #define XPK_AUTOSEMI   {.type = XS_PARSE_KEYWORD_AUTOSEMI}
+#define XPK_KEYWORD(s) {.type = 
XS_PARSE_KEYWORD_LITERALSTR|XPK_TYPEFLAG_SPECIAL, .u.str = (const char *)s}
 
 #define XPK_INFIX(select) {.type = XS_PARSE_KEYWORD_INFIX, .u.c = select}
 #define XPK_INFIX_RELATION       XPK_INFIX(XPI_SELECT_RELATION)
@@ -154,6 +162,9 @@
 #define XPK_PARENSCOPE_OPT(...) \
   {.type = XS_PARSE_KEYWORD_PARENSCOPE|XPK_TYPEFLAG_OPT, .u.pieces = (const 
struct XSParseKeywordPieceType []){ __VA_ARGS__, {0} }}
 
+#define XPK_ARGSCOPE(...) \
+  {.type = XS_PARSE_KEYWORD_PARENSCOPE|XPK_TYPEFLAG_MAYBEPARENS, .u.pieces = 
(const struct XSParseKeywordPieceType []){ __VA_ARGS__, {0} }}
+
 #define XPK_BRACKETSCOPE(...) \
   {.type = XS_PARSE_KEYWORD_BRACKETSCOPE, .u.pieces = (const struct 
XSParseKeywordPieceType []){ __VA_ARGS__, {0} }}
 #define XPK_BRACKETSCOPE_OPT(...) \
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/XS-Parse-Keyword-0.22/lib/XS/Parse/Infix/Builder.pm 
new/XS-Parse-Keyword-0.23/lib/XS/Parse/Infix/Builder.pm
--- old/XS-Parse-Keyword-0.22/lib/XS/Parse/Infix/Builder.pm     2022-02-21 
22:38:00.000000000 +0100
+++ new/XS-Parse-Keyword-0.23/lib/XS/Parse/Infix/Builder.pm     2022-05-18 
18:50:09.000000000 +0200
@@ -3,7 +3,7 @@
 #
 #  (C) Paul Evans, 2021 -- leon...@leonerd.org.uk
 
-package XS::Parse::Infix::Builder 0.22;
+package XS::Parse::Infix::Builder 0.23;
 
 use v5.14;
 use warnings;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/XS-Parse-Keyword-0.22/lib/XS/Parse/Infix/Builder_data.pm.PL 
new/XS-Parse-Keyword-0.23/lib/XS/Parse/Infix/Builder_data.pm.PL
--- old/XS-Parse-Keyword-0.22/lib/XS/Parse/Infix/Builder_data.pm.PL     
2022-02-21 22:38:00.000000000 +0100
+++ new/XS-Parse-Keyword-0.23/lib/XS/Parse/Infix/Builder_data.pm.PL     
2022-05-18 18:50:09.000000000 +0200
@@ -28,7 +28,7 @@
    <$in_h> } );
 
 __DATA__
-package XS::Parse::Infix::Builder_data 0.22;
+package XS::Parse::Infix::Builder_data 0.23;
 
 use v5.14;
 use warnings;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/XS-Parse-Keyword-0.22/lib/XS/Parse/Infix.pm 
new/XS-Parse-Keyword-0.23/lib/XS/Parse/Infix.pm
--- old/XS-Parse-Keyword-0.22/lib/XS/Parse/Infix.pm     2022-02-21 
22:38:00.000000000 +0100
+++ new/XS-Parse-Keyword-0.23/lib/XS/Parse/Infix.pm     2022-05-18 
18:50:09.000000000 +0200
@@ -3,7 +3,7 @@
 #
 #  (C) Paul Evans, 2021 -- leon...@leonerd.org.uk
 
-package XS::Parse::Infix 0.22;
+package XS::Parse::Infix 0.23;
 
 use v5.14;
 use warnings;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/XS-Parse-Keyword-0.22/lib/XS/Parse/Keyword/Builder.pm 
new/XS-Parse-Keyword-0.23/lib/XS/Parse/Keyword/Builder.pm
--- old/XS-Parse-Keyword-0.22/lib/XS/Parse/Keyword/Builder.pm   2022-02-21 
22:38:00.000000000 +0100
+++ new/XS-Parse-Keyword-0.23/lib/XS/Parse/Keyword/Builder.pm   2022-05-18 
18:50:09.000000000 +0200
@@ -3,7 +3,7 @@
 #
 #  (C) Paul Evans, 2021 -- leon...@leonerd.org.uk
 
-package XS::Parse::Keyword::Builder 0.22;
+package XS::Parse::Keyword::Builder 0.23;
 
 use v5.14;
 use warnings;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/XS-Parse-Keyword-0.22/lib/XS/Parse/Keyword/Builder_data.pm.PL 
new/XS-Parse-Keyword-0.23/lib/XS/Parse/Keyword/Builder_data.pm.PL
--- old/XS-Parse-Keyword-0.22/lib/XS/Parse/Keyword/Builder_data.pm.PL   
2022-02-21 22:38:00.000000000 +0100
+++ new/XS-Parse-Keyword-0.23/lib/XS/Parse/Keyword/Builder_data.pm.PL   
2022-05-18 18:50:09.000000000 +0200
@@ -28,7 +28,7 @@
    <$in_h> } );
 
 __DATA__
-package XS::Parse::Keyword::Builder_data 0.22;
+package XS::Parse::Keyword::Builder_data 0.23;
 
 use v5.14;
 use warnings;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/XS-Parse-Keyword-0.22/lib/XS/Parse/Keyword.pm 
new/XS-Parse-Keyword-0.23/lib/XS/Parse/Keyword.pm
--- old/XS-Parse-Keyword-0.22/lib/XS/Parse/Keyword.pm   2022-02-21 
22:38:00.000000000 +0100
+++ new/XS-Parse-Keyword-0.23/lib/XS/Parse/Keyword.pm   2022-05-18 
18:50:09.000000000 +0200
@@ -3,7 +3,7 @@
 #
 #  (C) Paul Evans, 2021-2022 -- leon...@leonerd.org.uk
 
-package XS::Parse::Keyword 0.22;
+package XS::Parse::Keyword 0.23;
 
 use v5.14;
 use warnings;
@@ -283,6 +283,19 @@
 new anonymous subroutine. This will be passed as a protosub CV in the I<cv>
 field.
 
+=head2 XPK_ARITHEXPR
+
+I<atomic, emits op.>
+
+   XPK_ARITHEXPR
+
+An arithmetic expression is expected, parsed using C<parse_arithexpr()>, and
+passed as an optree in the I<op> field.
+
+=head2 XPK_ARITHEXPR_VOIDCTX, XPK_ARITHEXPR_SCALARCTX
+
+Variants of C<XPK_ARITHEXPR> which puts the expression in void or scalar 
context.
+
 =head2 XPK_TERMEXPR
 
 I<atomic, emits op.>
@@ -438,8 +451,19 @@
 C<XPK_OPTIONAL> or C<XPK_REPEATED> sequence, to provide a "secondary keyword"
 that such a repeated item can look out for.
 
-This was previously called C<XPK_STRING>, and is provided as a synonym for
-back-compatibility but new code should use this new name instead.
+=head2 XPK_KEYWORD
+
+I<atomic, can probe, emits nothing.>
+
+   XPK_KEYWORD("keyword")
+
+A literal string match is expected. No argument value is passed.
+
+This is similar to C<XPK_LITERAL> except that it additionally checks that the
+following character is not an identifier character. This ensures that the
+expected keyword-like behaviour is preserved. For example, given the input
+C<"keyword">, the piece C<XPK_LITERAL("key")> would match it, whereas
+C<XPK_KEYWORD("key")> would not because of the subsequent C<"w"> character.
 
 =head2 XPK_SEQUENCE
 
@@ -539,6 +563,20 @@
 A structural type which expects to find a sequence of pieces, all contained in
 parentheses as C<( ... )>. This will pass no extra arguments.
 
+=head2 XPK_ARGSCOPE
+
+I<structural, emits nothing.>
+
+   XPK_ARGSCOPE(pieces ...)
+
+A structural type similar to C<XPK_PARENSCOPE>, except that the parentheses
+themselves are optional; much like Perl's parsing of calls to known functions.
+
+If parentheses are encountered in the input, they will be consumed by this
+piece and it will behave identically to C<XPK_PARENSCOPE>. If there is no open
+parenthesis, this piece will behave like C<XPK_SEQUENCE> and consume all the
+pieces inside it, without expecting a closing parenthesis.
+
 =head2 XPK_BRACKETSCOPE
 
 I<structural, can probe, emits nothing.>
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/XS-Parse-Keyword-0.22/src/infix.c 
new/XS-Parse-Keyword-0.23/src/infix.c
--- old/XS-Parse-Keyword-0.22/src/infix.c       2022-02-21 22:38:00.000000000 
+0100
+++ new/XS-Parse-Keyword-0.23/src/infix.c       2022-05-18 18:50:09.000000000 
+0200
@@ -167,6 +167,7 @@
     if(kid->op_type == OP_PADAV) {
       /* \@padav can just yield the array directly */
       cLISTOPx(cUNOPo->op_first)->op_first = NULL;
+      cLISTOPx(cUNOPo->op_first)->op_flags &= ~OPf_KIDS;
       op_free(o);
 
       kid->op_flags &= ~(OPf_MOD|OPf_REF);
@@ -177,6 +178,7 @@
        * or something else, but whatever it is we might as well do it
        */
       cLISTOPx(cUNOPo->op_first)->op_first = NULL;
+      cLISTOPx(cUNOPo->op_first)->op_flags &= ~OPf_KIDS;
       op_free(o);
 
       kid->op_flags &= ~(OPf_MOD|OPf_REF);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/XS-Parse-Keyword-0.22/src/keyword.c 
new/XS-Parse-Keyword-0.23/src/keyword.c
--- old/XS-Parse-Keyword-0.22/src/keyword.c     2022-02-21 22:38:00.000000000 
+0100
+++ new/XS-Parse-Keyword-0.23/src/keyword.c     2022-05-18 18:50:09.000000000 
+0200
@@ -87,8 +87,8 @@
     croak("parse failed--compilation aborted")
 
 /* TODO: Only ASCII */
-#define lex_probe_str(s)   MY_lex_probe_str(aTHX_ s)
-STRLEN MY_lex_probe_str(pTHX_ const char *s)
+#define lex_probe_str(s, b)   MY_lex_probe_str(aTHX_ s, b)
+STRLEN MY_lex_probe_str(pTHX_ const char *s, bool boundarycheck)
 {
   STRLEN i;
   for(i = 0; s[i]; i++) {
@@ -96,13 +96,16 @@
       return 0;
   }
 
+  if(boundarycheck && isALNUM(PL_parser->bufptr[i]))
+    return 0;
+
   return i;
 }
 
-#define lex_expect_str(s)  MY_lex_expect_str(aTHX_ s)
-void MY_lex_expect_str(pTHX_ const char *s)
+#define lex_expect_str(s, b)  MY_lex_expect_str(aTHX_ s, b)
+void MY_lex_expect_str(pTHX_ const char *s, bool boundarycheck)
 {
-  STRLEN len = lex_probe_str(s);
+  STRLEN len = lex_probe_str(s, boundarycheck);
   if(!len)
     yycroakf("Expected \"%s\"", s);
 
@@ -168,6 +171,8 @@
 #endif
     CopLINE(PL_curcop);
 
+  bool is_special  = !!(piece->type & XPK_TYPEFLAG_SPECIAL);
+
   U32 type = piece->type & 0xFFFF;
 
   switch(type) {
@@ -181,7 +186,7 @@
 
     case XS_PARSE_KEYWORD_LITERALSTR:
     {
-      STRLEN len = lex_probe_str(piece->u.str);
+      STRLEN len = lex_probe_str(piece->u.str, is_special);
       if(!len)
         return FALSE;
 
@@ -303,6 +308,9 @@
     }
 
     case XS_PARSE_KEYWORD_PARENSCOPE:
+      if(piece->type & XPK_TYPEFLAG_MAYBEPARENS)
+        croak("TODO: probe_piece on type=PARENSCOPE+MAYBEPARENS");
+
       if(lex_peek_unichar(0) != '(')
         return FALSE;
 
@@ -372,7 +380,7 @@
       return;
 
     case XS_PARSE_KEYWORD_LITERALSTR:
-      lex_expect_str(piece->u.str);
+      lex_expect_str(piece->u.str, is_special);
       return;
 
     case XS_PARSE_KEYWORD_AUTOSEMI:
@@ -455,6 +463,7 @@
       return;
     }
 
+    case XS_PARSE_KEYWORD_ARITHEXPR:
     case XS_PARSE_KEYWORD_TERMEXPR:
       /* TODO: This auto-parens behaviour ought to be tuneable, depend on how
        * many args, open at i=0 and close at i=MAX, etc...
@@ -471,7 +480,14 @@
         lex_expect_unichar(')');
       }
       else {
-        THISARG.op = parse_termexpr(0);
+        switch(type) {
+          case XS_PARSE_KEYWORD_ARITHEXPR:
+            THISARG.op = parse_arithexpr(0);
+            break;
+          case XS_PARSE_KEYWORD_TERMEXPR:
+            THISARG.op = parse_termexpr(0);
+            break;
+        }
         CHECK_PARSEFAIL;
       }
 
@@ -646,21 +662,34 @@
       return;
 
     case XS_PARSE_KEYWORD_PARENSCOPE:
+    {
+      bool has_paren = (lex_peek_unichar(0) == '(');
+
       if(is_optional) {
         THISARG.i = 0;
         (*argidx)++;
-        if(lex_peek_unichar(0) != '(') return;
+        if(!has_paren) return;
         THISARG.i++;
       }
 
-      lex_expect_unichar('(');
-      lex_read_space(0);
+      if(has_paren) {
+        lex_expect_unichar('(');
+        lex_read_space(0);
 
-      parse_pieces(aTHX_ argsv, argidx, piece->u.pieces, hookdata);
+        parse_pieces(aTHX_ argsv, argidx, piece->u.pieces, hookdata);
 
-      lex_expect_unichar(')');
+        lex_expect_unichar(')');
+      }
+      else if(piece->type & XPK_TYPEFLAG_MAYBEPARENS) {
+        /* We didn't find a '(' but that's OK; they're optional */
+        parse_pieces(aTHX_ argsv, argidx, piece->u.pieces, hookdata);
+      }
+      else
+        /* We know this should fail */
+        lex_expect_unichar('(');
 
       return;
+    }
 
     case XS_PARSE_KEYWORD_BRACKETSCOPE:
       if(is_optional) {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/XS-Parse-Keyword-0.22/t/30pieces-literal.t 
new/XS-Parse-Keyword-0.23/t/30pieces-literal.t
--- old/XS-Parse-Keyword-0.22/t/30pieces-literal.t      2022-02-21 
22:38:00.000000000 +0100
+++ new/XS-Parse-Keyword-0.23/t/30pieces-literal.t      2022-05-18 
18:50:09.000000000 +0200
@@ -21,6 +21,11 @@
 }
 
 {
+   my $ret = piecekw bar ;
+   is( $ret, "bar", 'result of piecekw' );
+}
+
+{
    my $ret1 = do { pieceautosemi; };
    is( $ret1, "EOS", 'result of pieceautosemi with ;' );
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/XS-Parse-Keyword-0.22/t/33pieces-arithexpr.t 
new/XS-Parse-Keyword-0.23/t/33pieces-arithexpr.t
--- old/XS-Parse-Keyword-0.22/t/33pieces-arithexpr.t    1970-01-01 
01:00:00.000000000 +0100
+++ new/XS-Parse-Keyword-0.23/t/33pieces-arithexpr.t    2022-05-18 
18:50:09.000000000 +0200
@@ -0,0 +1,38 @@
+#!/usr/bin/perl
+
+use v5.14;
+use warnings;
+
+use Test::More;
+
+use lib "t";
+use testcase "t::pieces";
+
+BEGIN { $^H{"t::pieces/permit"} = 1; }
+
+my $ret;
+
+{
+   $ret = piecearithexpr "a term";
+   is( $ret, "(a term)", 'a single term' );
+}
+
+# arithexpr vs concat
+{
+   $ret = piecearithexpr "x" . "y";
+   is( $ret, "(xy)", 'arithexpr consumes concat' );
+}
+
+# arithexpr vs comma
+{
+   $ret = join "", "x", piecearithexpr "inside", "y";
+   is( $ret, "x(inside)y", 'arithexpr stops before comma' );
+}
+
+# arithexpr in piece1 can act as entire parens
+{
+   $ret = piecearithexpr( "x" ) . "y";
+   is( $ret, "(x)y", 'arithexpr treats (PARENS) as entire expression' );
+}
+
+done_testing;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/XS-Parse-Keyword-0.22/t/42scopes.t 
new/XS-Parse-Keyword-0.23/t/42scopes.t
--- old/XS-Parse-Keyword-0.22/t/42scopes.t      2022-02-21 22:38:00.000000000 
+0100
+++ new/XS-Parse-Keyword-0.23/t/42scopes.t      2022-05-18 18:50:09.000000000 
+0200
@@ -15,6 +15,12 @@
    is( scopeparen ( "abc" ), "abc", 'parenthesis scope' );
 }
 
+# arg scope - parens are optional
+{
+   is( scopeargs ( "123" ), "123", 'arguments scope with parens' );
+   is( scopeargs "123",     "123", 'arguments scope without parens' );
+}
+
 # bracket scope
 {
    is( scopebracket [ "def" ], "def", 'bracket scope' );
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/XS-Parse-Keyword-0.22/t/pieces.xs 
new/XS-Parse-Keyword-0.23/t/pieces.xs
--- old/XS-Parse-Keyword-0.22/t/pieces.xs       2022-02-21 22:38:00.000000000 
+0100
+++ new/XS-Parse-Keyword-0.23/t/pieces.xs       2022-05-18 18:50:09.000000000 
+0200
@@ -42,7 +42,8 @@
 
 static int build_anonsub(pTHX_ OP **out, XSParseKeywordPiece *arg0, void 
*hookdata)
 {
-  *out = newSVOP(OP_CONST, 0, newRV_noinc((SV *)cv_clone(arg0->cv)));
+  *out = newUNOP(OP_REFGEN, 0,
+    newSVOP(OP_ANONCODE, 0, (SV *)arg0->cv));
   return KEYWORD_PLUGIN_EXPR;
 }
 
@@ -176,6 +177,13 @@
   .build1 = &build_anonsub,
 };
 
+static const struct XSParseKeywordHooks hooks_arithexpr = {
+  .permit_hintkey = hintkey,
+
+  .piece1 = XPK_ARITHEXPR,
+  .build1 = &build_expr,
+};
+
 static const struct XSParseKeywordHooks hooks_termexpr = {
   .permit_hintkey = hintkey,
 
@@ -277,6 +285,13 @@
   .build1 = &build_literal,
 };
 
+static const struct XSParseKeywordHooks hooks_kw = {
+  .permit_hintkey = hintkey,
+
+  .piece1 = XPK_KEYWORD("bar"),
+  .build1 = &build_literal,
+};
+
 static const struct XSParseKeywordHooks hooks_autosemi = {
   .permit_hintkey = hintkey,
 
@@ -297,6 +312,7 @@
   register_xs_parse_keyword("pieceprefixedblock_VAR", 
&hooks_prefixedblock_VAR, "$VAR");
 
   register_xs_parse_keyword("pieceanonsub", &hooks_anonsub, NULL);
+  register_xs_parse_keyword("piecearithexpr", &hooks_arithexpr, NULL);
   register_xs_parse_keyword("piecetermexpr", &hooks_termexpr, NULL);
   register_xs_parse_keyword("piecelistexpr", &hooks_listexpr, NULL);
 
@@ -318,5 +334,6 @@
   register_xs_parse_keyword("piececolon", &hooks_colon, newSVpvs("colon"));
 
   register_xs_parse_keyword("piecestr", &hooks_str, newSVpvs("foo"));
+  register_xs_parse_keyword("piecekw",  &hooks_kw,  newSVpvs("bar"));
 
   register_xs_parse_keyword("pieceautosemi", &hooks_autosemi, newSVpvs("EOS"));
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/XS-Parse-Keyword-0.22/t/structures.xs 
new/XS-Parse-Keyword-0.23/t/structures.xs
--- old/XS-Parse-Keyword-0.22/t/structures.xs   2022-02-21 22:38:00.000000000 
+0100
+++ new/XS-Parse-Keyword-0.23/t/structures.xs   2022-05-18 18:50:09.000000000 
+0200
@@ -117,6 +117,16 @@
   .build = &build_op,
 };
 
+static const struct XSParseKeywordHooks hooks_scope_args = {
+  .permit_hintkey = hintkey,
+
+  .pieces = (const struct XSParseKeywordPieceType []){
+    XPK_ARGSCOPE( XPK_TERMEXPR ),
+    {0}
+  },
+  .build = &build_op,
+};
+
 static const struct XSParseKeywordHooks hooks_scope_bracket = {
   .permit_hintkey = hintkey,
 
@@ -161,6 +171,7 @@
   register_xs_parse_keyword("structcommalist", &hooks_commalist, NULL);
 
   register_xs_parse_keyword("scopeparen",   &hooks_scope_paren,   NULL);
+  register_xs_parse_keyword("scopeargs",    &hooks_scope_args,    NULL);
   register_xs_parse_keyword("scopebracket", &hooks_scope_bracket, NULL);
   register_xs_parse_keyword("scopebrace",   &hooks_scope_brace,   NULL);
   register_xs_parse_keyword("scopechevron", &hooks_scope_chevron, NULL);

Reply via email to