This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
[PATCH] function to parse Perl statement sequence
[perl5.git] / ext / XS-APItest / APItest.xs
index 67c2738..4b3d470 100644 (file)
@@ -381,7 +381,7 @@ my_rpeep (pTHX_ OP *o)
      (SvFLAGS(sv) & (SVf_IOK|SVf_NOK|SVf_POK|SVp_IOK|SVp_NOK|SVp_POK)))
 
 static SV *hintkey_rpn_sv, *hintkey_calcrpn_sv, *hintkey_stufftest_sv;
-static SV *hintkey_swaptwostmts_sv;
+static SV *hintkey_swaptwostmts_sv, *hintkey_looprest_sv;
 static int (*next_keyword_plugin)(pTHX_ char *, STRLEN, OP **);
 
 /* low-level parser helpers */
@@ -553,6 +553,17 @@ static OP *THX_parse_keyword_swaptwostmts(pTHX)
     return !a ? b : !b ? a : newLISTOP(OP_LINESEQ, 0, b, a);
 }
 
+#define parse_keyword_looprest() THX_parse_keyword_looprest(aTHX)
+static OP *THX_parse_keyword_looprest(pTHX)
+{
+    I32 condline;
+    OP *body;
+    condline = CopLINE(PL_curcop);
+    body = parse_stmtseq(0);
+    return newWHILEOP(0, 1, NULL, condline, newSVOP(OP_CONST, 0, &PL_sv_yes),
+                       body, NULL, 1);
+}
+
 /* plugin glue */
 
 #define keyword_active(hintkey_sv) THX_keyword_active(aTHX_ hintkey_sv)
@@ -585,6 +596,10 @@ static int my_keyword_plugin(pTHX_
                    keyword_active(hintkey_swaptwostmts_sv)) {
        *op_ptr = parse_keyword_swaptwostmts();
        return KEYWORD_PLUGIN_STMT;
+    } else if(keyword_len == 8 && strnEQ(keyword_ptr, "looprest", 8) &&
+                   keyword_active(hintkey_looprest_sv)) {
+       *op_ptr = parse_keyword_looprest();
+       return KEYWORD_PLUGIN_STMT;
     } else {
        return next_keyword_plugin(aTHX_ keyword_ptr, keyword_len, op_ptr);
     }
@@ -1544,6 +1559,7 @@ BOOT:
     hintkey_calcrpn_sv = newSVpvs_share("XS::APItest/calcrpn");
     hintkey_stufftest_sv = newSVpvs_share("XS::APItest/stufftest");
     hintkey_swaptwostmts_sv = newSVpvs_share("XS::APItest/swaptwostmts");
+    hintkey_looprest_sv = newSVpvs_share("XS::APItest/looprest");
     next_keyword_plugin = PL_keyword_plugin;
     PL_keyword_plugin = my_keyword_plugin;
 }