On 5.9.5+ PL_parser is always available, although not always a define, but a symbol.
[p5sagit/Devel-Declare.git] / Declare.xs
index 69dd632..ae5b164 100644 (file)
@@ -25,7 +25,7 @@ static int in_declare = 0;
 
 #define DD_AM_LEXING_CHECK (PL_lex_state == LEX_NORMAL || PL_lex_state == LEX_INTERPNORMAL)
 
-#ifdef PL_parser
+#if defined(PL_parser) || defined(PERL_5_9_PLUS)
 #define DD_HAVE_PARSER PL_parser
 #define DD_HAVE_LEX_STUFF (PL_parser && PL_lex_stuff)
 #define DD_AM_LEXING (PL_parser && DD_AM_LEXING_CHECK)
@@ -51,6 +51,9 @@ int dd_is_declarator(pTHX_ char* name) {
 
   /* $declarators{$current_package_name} */
 
+  if (!HvNAME(PL_curstash))
+         return -1;
+
   is_declarator_pack_ref = hv_fetch(is_declarator, HvNAME(PL_curstash),
                              strlen(HvNAME(PL_curstash)), FALSE);
 
@@ -139,7 +142,11 @@ char* dd_get_curstash_name(pTHX) {
 }
 
 int dd_get_linestr_offset(pTHX) {
-  char* linestr = SvPVX(PL_linestr);
+  char* linestr;
+  if (!DD_HAVE_PARSER) {
+    return -1;
+  }
+  linestr = SvPVX(PL_linestr);
   return PL_bufptr - linestr;
 }
 
@@ -190,12 +197,10 @@ STATIC OP *(*dd_old_ck_rv2cv)(pTHX_ OP *op);
 STATIC OP *dd_ck_rv2cv(pTHX_ OP *o) {
   OP* kid;
   int dd_flags;
-  char* cb_args[6];
 
   o = dd_old_ck_rv2cv(aTHX_ o); /* let the original do its job */
 
   if (in_declare) {
-    cb_args[0] = NULL;
     if (dd_debug) {
       printf("Deconstructing declare\n");
       printf("PL_bufptr: %s\n", PL_bufptr);
@@ -203,7 +208,19 @@ STATIC OP *dd_ck_rv2cv(pTHX_ OP *o) {
       printf("linestr: %s\n", SvPVX(PL_linestr));
       printf("linestr len: %i\n", PL_bufend - SvPVX(PL_linestr));
     }
-    call_argv("Devel::Declare::done_declare", G_VOID|G_DISCARD, cb_args);
+
+    dSP;
+  
+    ENTER;
+    SAVETMPS;
+  
+    PUSHMARK(SP);
+  
+    call_pv("Devel::Declare::done_declare", G_VOID|G_DISCARD);
+
+    FREETMPS;
+    LEAVE;
+
     if (dd_debug) {
       printf("PL_bufptr: %s\n", PL_bufptr);
       printf("bufend at: %i\n", PL_bufend - PL_bufptr);