diff options
author | Jesse Luehrs <doy@tozt.net> | 2013-07-21 10:56:55 -0400 |
---|---|---|
committer | Jesse Luehrs <doy@tozt.net> | 2013-07-21 10:56:55 -0400 |
commit | b96d96f8332b9aa42ede436c645e7add2ffb4638 (patch) | |
tree | 06a9cf391f8af9d1b9f3483a40779502eabc5fd2 | |
parent | 61364ad449079a38afb60e4d27197ff2a61c460f (diff) | |
download | parse-keyword-b96d96f8332b9aa42ede436c645e7add2ffb4638.tar.gz parse-keyword-b96d96f8332b9aa42ede436c645e7add2ffb4638.zip |
make some macros for this
-rw-r--r-- | Keyword.xs | 18 |
1 files changed, 14 insertions, 4 deletions
@@ -3,6 +3,14 @@ #include "callparser1.h" #include "XSUB.h" +#define REENTER_PARSER STMT_START { \ + ENTER; \ + PL_curcop = &PL_compiling; \ + SAVEVPTR(PL_op); \ +} STMT_END + +#define LEAVE_PARSER LEAVE + static OP *parser_callback(pTHX_ GV *namegv, SV *psobj, U32 *flagsp) { dSP; @@ -83,16 +91,18 @@ parse_block() PREINIT: I32 floor; CV *code; - OP *old_pl_op; CODE: - PL_curcop = &PL_compiling; - old_pl_op = PL_op; + 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); } - PL_op = old_pl_op; + RETVAL = newRV_inc((SV*)code); OUTPUT: RETVAL |