diff options
author | Jesse Luehrs <doy@tozt.net> | 2013-07-21 17:48:20 -0400 |
---|---|---|
committer | Jesse Luehrs <doy@tozt.net> | 2013-07-21 17:48:20 -0400 |
commit | 7c7228f0a37b6ac15a6c16f4023159c439d471ad (patch) | |
tree | 56535ab9a6cb3910212fe52ddfb34a36d0b93aaa | |
parent | d2d745bd9103847c5801bdce1696c96fb58fe1d0 (diff) | |
download | parse-keyword-7c7228f0a37b6ac15a6c16f4023159c439d471ad.tar.gz parse-keyword-7c7228f0a37b6ac15a6c16f4023159c439d471ad.zip |
factor this out
-rw-r--r-- | Keyword.xs | 51 |
1 files changed, 21 insertions, 30 deletions
@@ -15,6 +15,25 @@ #define LEAVE_PARSER LEAVE +static SV *parser_fn(OP *(fn)(U32)) +{ + I32 floor; + CV *code; + + REENTER_PARSER; + + floor = start_subparse(0, CVf_ANON); + code = newATTRSUB(floor, NULL, NULL, NULL, fn(0)); + + LEAVE_PARSER; + + if (CvCLONE(code)) { + code = cv_clone(code); + } + + return newRV_inc((SV*)code); +} + static OP *parser_callback(pTHX_ GV *namegv, SV *psobj, U32 *flagsp) { dSP; @@ -123,43 +142,15 @@ lex_stuff(str) SV * parse_block() - PREINIT: - I32 floor; - CV *code; CODE: - REENTER_PARSER; - - floor = start_subparse(0, CVf_ANON); - code = newATTRSUB(floor, NULL, NULL, NULL, parse_block(0)); - - LEAVE_PARSER; - - if (CvCLONE(code)) { - code = cv_clone(code); - } - - RETVAL = newRV_inc((SV*)code); + RETVAL = parser_fn(Perl_parse_block); OUTPUT: RETVAL SV * parse_arithexpr() - PREINIT: - I32 floor; - CV *code; CODE: - REENTER_PARSER; - - floor = start_subparse(0, CVf_ANON); - code = newATTRSUB(floor, NULL, NULL, NULL, parse_arithexpr(0)); - - LEAVE_PARSER; - - if (CvCLONE(code)) { - code = cv_clone(code); - } - - RETVAL = newRV_inc((SV*)code); + RETVAL = parser_fn(Perl_parse_arithexpr); OUTPUT: RETVAL |