summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJesse Luehrs <doy@tozt.net>2013-07-21 17:48:20 -0400
committerJesse Luehrs <doy@tozt.net>2013-07-21 17:48:20 -0400
commit7c7228f0a37b6ac15a6c16f4023159c439d471ad (patch)
tree56535ab9a6cb3910212fe52ddfb34a36d0b93aaa
parentd2d745bd9103847c5801bdce1696c96fb58fe1d0 (diff)
downloadparse-keyword-7c7228f0a37b6ac15a6c16f4023159c439d471ad.tar.gz
parse-keyword-7c7228f0a37b6ac15a6c16f4023159c439d471ad.zip
factor this out
-rw-r--r--Keyword.xs51
1 files changed, 21 insertions, 30 deletions
diff --git a/Keyword.xs b/Keyword.xs
index c5a9f4e..e53f001 100644
--- a/Keyword.xs
+++ b/Keyword.xs
@@ -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