Make the toke.c functions always operate on PL_compiling, even if we call them at...
[p5sagit/Devel-Declare.git] / stolen_chunk_of_toke.c
index 7abecc5..04dee1a 100644 (file)
@@ -64,6 +64,19 @@ STATIC char*    S_scan_word(pTHX_ char *s, char *dest, STRLEN destlen, int allow
 #define SPACE_OR_TAB(c) ((c)==' '||(c)=='\t')
 #endif
 
+/*
+ * Normally, during compile time, PL_curcop == &PL_compiling is true. However,
+ * Devel::Declare makes the interpreter call back to perl during compile time,
+ * which temporarily enters runtime. Then perl space calls various functions
+ * from this file, which are designed to work during compile time. They all
+ * happen to operate on PL_curcop, not PL_compiling. That doesn't make a
+ * difference in the core, but it does for Devel::Declare, which operates at
+ * runtime, but still wants to mangle the things that are about to be compiled.
+ * That's why we define our own PL_curcop and make it point to PL_compiling
+ * here.
+ */
+#define PL_curcop &PL_compiling
+
 #define CLINE (PL_copline = (CopLINE(PL_curcop) < PL_copline ? CopLINE(PL_curcop) : PL_copline))
 
 #define LEX_NORMAL    10 /* normal code (ie not within "...")     */
@@ -850,8 +863,8 @@ S_scan_str(pTHX_ char *start, int keep_quoted, int keep_delims)
 STATIC void
 S_force_next(pTHX_ I32 type)
 {
-    dVAR;
 #ifdef PERL_MAD
+    dVAR;
     if (PL_curforce < 0)
     start_force(PL_lasttoke);
     PL_nexttoke[PL_curforce].next_type = type;