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-08-17 18:16:38 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/perl-XS-Parse-Keyword (Old) and /work/SRC/openSUSE:Factory/.perl-XS-Parse-Keyword.new.1521 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "perl-XS-Parse-Keyword" Wed Aug 17 18:16:38 2022 rev:8 rq:997338 version:0.25 Changes: -------- --- /work/SRC/openSUSE:Factory/perl-XS-Parse-Keyword/perl-XS-Parse-Keyword.changes 2022-06-28 15:21:43.733884762 +0200 +++ /work/SRC/openSUSE:Factory/.perl-XS-Parse-Keyword.new.1521/perl-XS-Parse-Keyword.changes 2022-08-17 18:23:04.175168450 +0200 @@ -1,0 +2,15 @@ +Wed Jul 27 03:09:17 UTC 2022 - Tina M??ller <timueller+p...@suse.de> + +- updated to 0.25 + see /usr/share/doc/packages/perl-XS-Parse-Keyword/Changes + + 0.25 2022-07-25 + [CHANGES] + * Permit infix operators to consume fewer than all the available + symbols; allowing for RHS operands that begin with symbols without + intervening whitespace + * Improved unit-testing of infix operator parser precedence issues + * Added `XPI_OPERAND_ARITH`; renumbered `XPI_OPERAND_TERM` to be + non-zero. Currently zero is accepted for back-compat + +------------------------------------------------------------------- Old: ---- XS-Parse-Keyword-0.24.tar.gz New: ---- XS-Parse-Keyword-0.25.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ perl-XS-Parse-Keyword.spec ++++++ --- /var/tmp/diff_new_pack.RoDUPo/_old 2022-08-17 18:23:04.563169255 +0200 +++ /var/tmp/diff_new_pack.RoDUPo/_new 2022-08-17 18:23:04.567169263 +0200 @@ -18,7 +18,7 @@ %define cpan_name XS-Parse-Keyword Name: perl-XS-Parse-Keyword -Version: 0.24 +Version: 0.25 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.24.tar.gz -> XS-Parse-Keyword-0.25.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/XS-Parse-Keyword-0.24/Changes new/XS-Parse-Keyword-0.25/Changes --- old/XS-Parse-Keyword-0.24/Changes 2022-06-26 20:38:08.000000000 +0200 +++ new/XS-Parse-Keyword-0.25/Changes 2022-07-26 00:36:23.000000000 +0200 @@ -1,5 +1,14 @@ Revision history for XS-Parse-Keyword +0.25 2022-07-25 + [CHANGES] + * Permit infix operators to consume fewer than all the available + symbols; allowing for RHS operands that begin with symbols without + intervening whitespace + * Improved unit-testing of infix operator parser precedence issues + * Added `XPI_OPERAND_ARITH`; renumbered `XPI_OPERAND_TERM` to be + non-zero. Currently zero is accepted for back-compat + 0.24 2022-06-26 [CHANGES] * Skip attempting to create duplicate wrapper funcs, in case of diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/XS-Parse-Keyword-0.24/META.json new/XS-Parse-Keyword-0.25/META.json --- old/XS-Parse-Keyword-0.24/META.json 2022-06-26 20:38:08.000000000 +0200 +++ new/XS-Parse-Keyword-0.25/META.json 2022-07-26 00:36:23.000000000 +0200 @@ -40,19 +40,19 @@ "provides" : { "XS::Parse::Infix" : { "file" : "lib/XS/Parse/Infix.pm", - "version" : "0.24" + "version" : "0.25" }, "XS::Parse::Infix::Builder" : { "file" : "lib/XS/Parse/Infix/Builder.pm", - "version" : "0.24" + "version" : "0.25" }, "XS::Parse::Keyword" : { "file" : "lib/XS/Parse/Keyword.pm", - "version" : "0.24" + "version" : "0.25" }, "XS::Parse::Keyword::Builder" : { "file" : "lib/XS/Parse/Keyword/Builder.pm", - "version" : "0.24" + "version" : "0.25" } }, "release_status" : "stable", @@ -61,6 +61,6 @@ "http://dev.perl.org/licenses/" ] }, - "version" : "0.24", + "version" : "0.25", "x_serialization_backend" : "JSON::PP version 4.06" } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/XS-Parse-Keyword-0.24/META.yml new/XS-Parse-Keyword-0.25/META.yml --- old/XS-Parse-Keyword-0.24/META.yml 2022-06-26 20:38:08.000000000 +0200 +++ new/XS-Parse-Keyword-0.25/META.yml 2022-07-26 00:36:23.000000000 +0200 @@ -19,19 +19,19 @@ provides: XS::Parse::Infix: file: lib/XS/Parse/Infix.pm - version: '0.24' + version: '0.25' XS::Parse::Infix::Builder: file: lib/XS/Parse/Infix/Builder.pm - version: '0.24' + version: '0.25' XS::Parse::Keyword: file: lib/XS/Parse/Keyword.pm - version: '0.24' + version: '0.25' XS::Parse::Keyword::Builder: file: lib/XS/Parse/Keyword/Builder.pm - version: '0.24' + version: '0.25' requires: perl: '5.014' resources: 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/XS-Parse-Keyword-0.24/XSParseInfix.h new/XS-Parse-Keyword-0.25/XSParseInfix.h --- old/XS-Parse-Keyword-0.24/XSParseInfix.h 2022-06-26 20:38:08.000000000 +0200 +++ new/XS-Parse-Keyword-0.25/XSParseInfix.h 2022-07-26 00:36:23.000000000 +0200 @@ -31,13 +31,15 @@ /* lhs_flags, rhs_flags */ enum { - XPI_OPERAND_TERM = 0, /* the "default" termexpr with no context */ /* other space reserved for other scalar types */ + XPI_OPERAND_ARITH = 2, + XPI_OPERAND_TERM = 4, XPI_OPERAND_TERM_LIST = 6, /* term in list context */ XPI_OPERAND_LIST = 7, /* list in list context */ /* Other bitflags */ XPI_OPERAND_ONLY_LOOK = (1<<3), + XPI_OPERAND_CUSTOM = (1<<7), /* rhs_flags only */ }; struct XSParseInfixHooks { @@ -54,6 +56,9 @@ /* These hooks are alternatives; the first one defined is used */ OP *(*new_op)(pTHX_ U32 flags, OP *lhs, OP *rhs, void *hookdata); OP *(*ppaddr)(pTHX); /* A pp func used directly in newBINOP_custom() */ + + /* Used if rhs_flags & XPI_OPERAND_CUSTOM */ + OP *(*parse_rhs)(pTHX_ void *hookdata); }; struct XSParseInfixInfo { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/XS-Parse-Keyword-0.24/hax/perl-backcompat.c.inc new/XS-Parse-Keyword-0.25/hax/perl-backcompat.c.inc --- old/XS-Parse-Keyword-0.24/hax/perl-backcompat.c.inc 2022-06-26 20:38:08.000000000 +0200 +++ new/XS-Parse-Keyword-0.25/hax/perl-backcompat.c.inc 2022-07-26 00:36:23.000000000 +0200 @@ -23,6 +23,7 @@ typedef SV PADNAME; # define PadnamePV(pn) (SvPOKp(pn) ? SvPVX(pn) : NULL) # define PadnameLEN(pn) SvCUR(pn) +# define PadnameIsSTATE(pn) (!!SvPAD_STATE(pn)) # define PadnameOUTER(pn) (SvFAKE(pn) && !SvPAD_STATE(pn)) # define PadnamelistARRAY(pnl) AvARRAY(pnl) # define PadnamelistMAX(pnl) AvFILLp(pnl) @@ -31,6 +32,14 @@ # define PadMAX(pad) AvFILLp(pad) #endif +#if !HAVE_PERL_VERSION(5, 22, 0) +# define CvPADLIST_set(cv, padlist) (CvPADLIST(cv) = padlist) +#endif + +#ifndef av_count +# define av_count(av) (AvFILL(av) + 1) +#endif + #ifndef av_top_index # define av_top_index(av) AvFILL(av) #endif @@ -43,6 +52,10 @@ # define block_start(a) Perl_block_start(aTHX_ a) #endif +#ifndef cophh_exists_pvs +# define cophh_exists_pvs(a,b,c) cBOOL(cophh_fetch_pvs(a,b,c)) +#endif + #ifndef cv_clone # define cv_clone(a) Perl_cv_clone(aTHX_ a) #endif diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/XS-Parse-Keyword-0.24/lib/XS/Parse/Infix/Builder.pm new/XS-Parse-Keyword-0.25/lib/XS/Parse/Infix/Builder.pm --- old/XS-Parse-Keyword-0.24/lib/XS/Parse/Infix/Builder.pm 2022-06-26 20:38:08.000000000 +0200 +++ new/XS-Parse-Keyword-0.25/lib/XS/Parse/Infix/Builder.pm 2022-07-26 00:36:23.000000000 +0200 @@ -3,7 +3,7 @@ # # (C) Paul Evans, 2021 -- leon...@leonerd.org.uk -package XS::Parse::Infix::Builder 0.24; +package XS::Parse::Infix::Builder 0.25; use v5.14; use warnings; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/XS-Parse-Keyword-0.24/lib/XS/Parse/Infix/Builder_data.pm.PL new/XS-Parse-Keyword-0.25/lib/XS/Parse/Infix/Builder_data.pm.PL --- old/XS-Parse-Keyword-0.24/lib/XS/Parse/Infix/Builder_data.pm.PL 2022-06-26 20:38:08.000000000 +0200 +++ new/XS-Parse-Keyword-0.25/lib/XS/Parse/Infix/Builder_data.pm.PL 2022-07-26 00:36:23.000000000 +0200 @@ -28,7 +28,7 @@ <$in_h> } ); __DATA__ -package XS::Parse::Infix::Builder_data 0.24; +package XS::Parse::Infix::Builder_data 0.25; use v5.14; use warnings; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/XS-Parse-Keyword-0.24/lib/XS/Parse/Infix.pm new/XS-Parse-Keyword-0.25/lib/XS/Parse/Infix.pm --- old/XS-Parse-Keyword-0.24/lib/XS/Parse/Infix.pm 2022-06-26 20:38:08.000000000 +0200 +++ new/XS-Parse-Keyword-0.25/lib/XS/Parse/Infix.pm 2022-07-26 00:36:23.000000000 +0200 @@ -3,7 +3,7 @@ # # (C) Paul Evans, 2021 -- leon...@leonerd.org.uk -package XS::Parse::Infix 0.24; +package XS::Parse::Infix 0.25; use v5.14; use warnings; @@ -137,9 +137,13 @@ =over 4 -=item XPI_OPERAND_TERM (0) +=item XPI_OPERAND_ARITH -Default. The operand is a term expression. +The operand is an arithmetic expression. + +=item XPI_OPERAND_TERM + +The operand is a term expression. =item XPI_OPERAND_TERM_LIST diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/XS-Parse-Keyword-0.24/lib/XS/Parse/Keyword/Builder.pm new/XS-Parse-Keyword-0.25/lib/XS/Parse/Keyword/Builder.pm --- old/XS-Parse-Keyword-0.24/lib/XS/Parse/Keyword/Builder.pm 2022-06-26 20:38:08.000000000 +0200 +++ new/XS-Parse-Keyword-0.25/lib/XS/Parse/Keyword/Builder.pm 2022-07-26 00:36:23.000000000 +0200 @@ -3,7 +3,7 @@ # # (C) Paul Evans, 2021 -- leon...@leonerd.org.uk -package XS::Parse::Keyword::Builder 0.24; +package XS::Parse::Keyword::Builder 0.25; use v5.14; use warnings; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/XS-Parse-Keyword-0.24/lib/XS/Parse/Keyword/Builder_data.pm.PL new/XS-Parse-Keyword-0.25/lib/XS/Parse/Keyword/Builder_data.pm.PL --- old/XS-Parse-Keyword-0.24/lib/XS/Parse/Keyword/Builder_data.pm.PL 2022-06-26 20:38:08.000000000 +0200 +++ new/XS-Parse-Keyword-0.25/lib/XS/Parse/Keyword/Builder_data.pm.PL 2022-07-26 00:36:23.000000000 +0200 @@ -28,7 +28,7 @@ <$in_h> } ); __DATA__ -package XS::Parse::Keyword::Builder_data 0.24; +package XS::Parse::Keyword::Builder_data 0.25; use v5.14; use warnings; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/XS-Parse-Keyword-0.24/lib/XS/Parse/Keyword.pm new/XS-Parse-Keyword-0.25/lib/XS/Parse/Keyword.pm --- old/XS-Parse-Keyword-0.24/lib/XS/Parse/Keyword.pm 2022-06-26 20:38:08.000000000 +0200 +++ new/XS-Parse-Keyword-0.25/lib/XS/Parse/Keyword.pm 2022-07-26 00:36:23.000000000 +0200 @@ -3,7 +3,7 @@ # # (C) Paul Evans, 2021-2022 -- leon...@leonerd.org.uk -package XS::Parse::Keyword 0.24; +package XS::Parse::Keyword 0.25; use v5.14; use warnings; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/XS-Parse-Keyword-0.24/src/infix.c new/XS-Parse-Keyword-0.25/src/infix.c --- old/XS-Parse-Keyword-0.24/src/infix.c 2022-06-26 20:38:08.000000000 +0200 +++ new/XS-Parse-Keyword-0.25/src/infix.c 2022-07-26 00:36:23.000000000 +0200 @@ -73,26 +73,58 @@ static enum OperandShape operand_shape(const struct HooksAndData *hd) { - U8 args_flags = (hd->hooks->lhs_flags & 0x07) << 4 | (hd->hooks->rhs_flags & 0x07); + U8 lhs_gimme; + switch(hd->hooks->lhs_flags & 0x07) { + case 0: /* back-compat */ + case XPI_OPERAND_ARITH: + case XPI_OPERAND_TERM: + lhs_gimme = G_SCALAR; + break; - switch(args_flags) { - /* scalar OP scalar */ + case XPI_OPERAND_TERM_LIST: + case XPI_OPERAND_LIST: + lhs_gimme = G_LIST; + break; + + default: + croak("TODO: Unsure how to classify operand shape of .lhs_flags=%02X\n", + hd->hooks->lhs_flags & 0x07); + } + + U8 rhs_gimme; + switch(hd->hooks->rhs_flags & 0x07) { + case 0: /* back-compat */ + case XPI_OPERAND_ARITH: case XPI_OPERAND_TERM: - return SHAPE_SCALARSCALAR; + rhs_gimme = G_SCALAR; + break; - /* scalar OP list */ case XPI_OPERAND_TERM_LIST: case XPI_OPERAND_LIST: + rhs_gimme = G_LIST; + break; + + default: + croak("TODO: Unsure how to classify operand shape of .rhs_flags=%02X\n", + hd->hooks->rhs_flags & 0x07); + } + + switch((lhs_gimme << 4) | (rhs_gimme)) { + /* scalar OP scalar */ + case (G_SCALAR<<4) | G_SCALAR: + return SHAPE_SCALARSCALAR; + + /* scalar OP list */ + case (G_SCALAR<<4) | G_LIST: return SHAPE_SCALARLIST; /* list OP list */ - case (XPI_OPERAND_TERM_LIST<<4) | XPI_OPERAND_TERM_LIST: - case (XPI_OPERAND_TERM_LIST<<4) | XPI_OPERAND_LIST: + case (G_LIST<<4) | G_LIST: return SHAPE_LISTLIST; default: - croak("TODO: Unsure how to classify operand shape of args_flags=%02X\n", - args_flags); + croak("TODO: Unsure how to classify operand shape of lhs_gimme=%d rhs_gimme=%d\n", + lhs_gimme, rhs_gimme); break; } } @@ -217,7 +249,12 @@ lex_read_space(0); OP *rhs = NULL; - switch(reg->hd.hooks->rhs_flags & 0x07) { + switch(reg->hd.hooks->rhs_flags & 0x87) { + case XPI_OPERAND_ARITH: + rhs = parse_arithexpr(0); + break; + + case 0: /* back-compat */ case XPI_OPERAND_TERM: rhs = parse_termexpr(0); break; @@ -230,6 +267,10 @@ rhs = force_list_keeping_pushmark(parse_listexpr(0)); break; + case XPI_OPERAND_CUSTOM: + rhs = (*reg->hd.hooks->parse_rhs)(aTHX_ reg->hd.data); + break; + default: croak("hooks->rhs_flags did not provide a valid RHS type"); } @@ -246,13 +287,13 @@ HV *hints = GvHV(PL_hintgv); - struct Registration *reg; + struct Registration *reg, *bestreg = NULL; for(reg = registrations; reg; reg = reg->next) { /* custom registrations have hooks, builtin ones do not */ if(!reg->hd.hooks) continue; - if(reg->oplen != oplen || !strEQ(reg->info.opname, op)) + if(reg->oplen > oplen || !strnEQ(reg->info.opname, op, reg->oplen)) continue; if(reg->hd.hooks->permit_hintkey && @@ -263,11 +304,20 @@ !(*reg->hd.hooks->permit)(aTHX_ reg->hd.data)) continue; - *def = ®->def; - return oplen; + /* This is a candidate and the best one, unless we already have something + * longer + */ + if(bestreg && bestreg->oplen > reg->oplen) + continue; + + bestreg = reg; } - return (*next_infix_plugin)(aTHX_ op, oplen, def); + if(!bestreg) + return (*next_infix_plugin)(aTHX_ op, oplen, def); + + *def = &bestreg->def; + return bestreg->oplen; } #endif @@ -622,6 +672,9 @@ } switch(hooks->lhs_flags & ~(XPI_OPERAND_ONLY_LOOK)) { + case 0: + //warn("No .lhs_flags specified for XSParseInfixHooks; defaulting to XPI_OPERAND_TERM"); + /* FALLTHROUGH */ case XPI_OPERAND_TERM: case XPI_OPERAND_TERM_LIST: break; @@ -630,9 +683,14 @@ } switch(hooks->rhs_flags & ~(XPI_OPERAND_ONLY_LOOK)) { + case 0: + //warn("No .rhs_flags specified for XSParseInfixHooks; defaulting to XPI_OPERAND_TERM"); + /* FALLTHROUGH */ + case XPI_OPERAND_ARITH: case XPI_OPERAND_TERM: case XPI_OPERAND_TERM_LIST: case XPI_OPERAND_LIST: + case XPI_OPERAND_CUSTOM: break; default: croak("Unrecognised XSParseInfixHooks.rhs_flags value 0x%X", hooks->rhs_flags); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/XS-Parse-Keyword-0.24/t/70infix.t new/XS-Parse-Keyword-0.25/t/70infix.t --- old/XS-Parse-Keyword-0.24/t/70infix.t 2022-06-26 20:38:08.000000000 +0200 +++ new/XS-Parse-Keyword-0.25/t/70infix.t 2022-07-26 00:36:23.000000000 +0200 @@ -6,16 +6,16 @@ use Test::More; -use B qw( svref_2object walkoptree ); - use B::Deparse; -my $deparser = B::Deparse->new(); +my $deparser = B::Deparse->new( "-p" ); use lib "t"; use testcase "t::infix"; BEGIN { plan skip_all => "No PL_infix_plugin" unless XS::Parse::Infix::HAVE_PL_INFIX_PLUGIN; } +use v5.16; + BEGIN { $^H{"t::infix/permit"} = 1; } { @@ -38,6 +38,64 @@ [ 3, 5, 7 ], 'addpairs infix operator' ); } +sub _getoptree +{ + my ( $sub ) = @_; + + # Ugh - this would be so much neater if we could pass coderefs into + # B::walkoptree directly + # Additionally there's no pre-mid-postfix walk options :( + + my $dump_optree = sub { + my $sub = __SUB__; + my ( $op ) = @_; + my $opname = $op->name; + + # Avoid test-dependence on the actual ppaddr by mangling out the name + $opname =~ s/0x[[:xdigit:]]+/0xXXX/; + + return $op->first->$sub if $opname eq "null"; + + my @kids; + if( $op->flags & B::OPf_KIDS ) { + my $kid = $op->first; + while( $kid ) { + push @kids, $kid->$sub; + + $kid = $kid->sibling; undef $kid if ref($kid) eq "B::NULL"; + } + } + + my $ret = $opname; + $ret .= "[" . join( ", ", @kids ) . "]" if @kids; + return $ret; + }; + + # Reach inside to the first statement + return B::svref_2object( $sub )->ROOT->first->first->sibling + ->$dump_optree; +} + +sub is_optree +{ + my ( $sub, $exp, $name ) = @_; + is( _getoptree( $sub ), $exp, $name ); +} + +{ + is_optree sub { $_[0] add $_[1] }, + "infix_add_0xXXX[aelemfast, aelemfast]", + 'optree of call to infix operator'; + + is_optree sub { $_[0] * $_[1] add $_[2] * $_[3] }, + "infix_add_0xXXX[multiply[aelemfast, aelemfast], multiply[aelemfast, aelemfast]]", + 'optree of call to infix operator at default precedence'; + + is_optree sub { $_[0] * ($_[1] add $_[2]) * $_[3] }, + "multiply[multiply[aelemfast, infix_add_0xXXX[aelemfast, aelemfast]], aelemfast]", + 'optree of call to infix operator at forced precedence'; +} + sub is_deparsed { my ( $sub, $exp, $name ) = @_; @@ -60,6 +118,10 @@ '$_[0] add $_[1];', 'deparsed call to infix operator'; + is_deparsed sub { $_[0] * $_[1] add $_[2] * $_[3] }, + '($_[0] * $_[1]) add ($_[2] * $_[3]);', + 'deparsed call to infix operator at default precedence'; + is_deparsed sub { $_[0] ??? $_[1] }, '$_[0] ??? $_[1];', 'deparsed operator yields UTF-8'; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/XS-Parse-Keyword-0.24/t/infix.xs new/XS-Parse-Keyword-0.25/t/infix.xs --- old/XS-Parse-Keyword-0.24/t/infix.xs 2022-06-26 20:38:08.000000000 +0200 +++ new/XS-Parse-Keyword-0.25/t/infix.xs 2022-07-26 00:36:23.000000000 +0200 @@ -26,6 +26,8 @@ } static const struct XSParseInfixHooks hooks_add = { + .lhs_flags = XPI_OPERAND_TERM, + .rhs_flags = XPI_OPERAND_TERM, .permit_hintkey = hintkey, .cls = 0, @@ -44,6 +46,8 @@ } static const struct XSParseInfixHooks hooks_xor = { + .lhs_flags = XPI_OPERAND_TERM, + .rhs_flags = XPI_OPERAND_TERM, .permit_hintkey = hintkey, .cls = 0, @@ -82,6 +86,7 @@ } static const struct XSParseInfixHooks hooks_intersperse = { + .lhs_flags = XPI_OPERAND_TERM, .rhs_flags = XPI_OPERAND_LIST, .permit_hintkey = hintkey, .cls = 0,