summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJesse Luehrs <doy@tozt.net>2013-07-21 10:56:55 -0400
committerJesse Luehrs <doy@tozt.net>2013-07-21 10:56:55 -0400
commitb96d96f8332b9aa42ede436c645e7add2ffb4638 (patch)
tree06a9cf391f8af9d1b9f3483a40779502eabc5fd2
parent61364ad449079a38afb60e4d27197ff2a61c460f (diff)
downloadparse-keyword-b96d96f8332b9aa42ede436c645e7add2ffb4638.tar.gz
parse-keyword-b96d96f8332b9aa42ede436c645e7add2ffb4638.zip
make some macros for this
-rw-r--r--Keyword.xs18
1 files changed, 14 insertions, 4 deletions
diff --git a/Keyword.xs b/Keyword.xs
index aeac9a0..800f474 100644
--- a/Keyword.xs
+++ b/Keyword.xs
@@ -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