xsubpp treats invalid (indented) cpp directives as comments
[p5sagit/p5-mst-13.2.git] / ext / B / B.xs
index 35e3233..491c640 100644 (file)
 #include "perl.h"
 #include "XSUB.h"
 
-#ifdef PERL_OBJECT
-#undef PL_op_name
-#undef PL_opargs 
-#undef PL_op_desc
-#define PL_op_name (get_op_names())
-#define PL_opargs (get_opargs())
-#define PL_op_desc (get_op_descs())
-#endif
-
 #ifdef PerlIO
 typedef PerlIO * InputStream;
 #else
@@ -79,9 +70,17 @@ static char *opclassnames[] = {
     "B::COP"   
 };
 
-static int walkoptree_debug = 0;       /* Flag for walkoptree debug hook */
+#define MY_CXT_KEY "B::_guts" XS_VERSION
+
+typedef struct {
+    int                x_walkoptree_debug;     /* Flag for walkoptree debug hook */
+    SV *       x_specialsv_list[6];
+} my_cxt_t;
 
-static SV *specialsv_list[6];
+START_MY_CXT
+
+#define walkoptree_debug       (MY_CXT.x_walkoptree_debug)
+#define specialsv_list         (MY_CXT.x_specialsv_list)
 
 static opclass
 cc_opclass(pTHX_ OP *o)
@@ -201,6 +200,7 @@ make_sv_object(pTHX_ SV *arg, SV *sv)
 {
     char *type = 0;
     IV iv;
+    dMY_CXT;
     
     for (iv = 0; iv < sizeof(specialsv_list)/sizeof(SV*); iv++) {
        if (sv == specialsv_list[iv]) {
@@ -321,7 +321,8 @@ walkoptree(pTHX_ SV *opsv, char *method)
 {
     dSP;
     OP *o;
-    
+    dMY_CXT;
+
     if (!SvROK(opsv))
        croak("opsv is not a reference");
     opsv = sv_mortalcopy(opsv);
@@ -382,6 +383,7 @@ BOOT:
 {
     HV *stash = gv_stashpvn("B", 1, TRUE);
     AV *export_ok = perl_get_av("B::EXPORT_OK",TRUE);
+    MY_CXT_INIT;
     specialsv_list[0] = Nullsv;
     specialsv_list[1] = &PL_sv_undef;
     specialsv_list[2] = &PL_sv_yes;
@@ -449,6 +451,7 @@ walkoptree(opsv, method)
 int
 walkoptree_debug(...)
     CODE:
+       dMY_CXT;
        RETVAL = walkoptree_debug;
        if (items > 0 && SvTRUE(ST(1)))
            walkoptree_debug = 1;
@@ -528,7 +531,7 @@ minus_c()
 void
 save_BEGINs()
     CODE:
-       PL_minus_c |= 0x10;
+       PL_savebegin = TRUE;
 
 SV *
 cstring(sv)
@@ -549,7 +552,7 @@ cchar(sv)
 void
 threadsv_names()
     PPCODE:
-#ifdef USE_THREADS
+#ifdef USE_5005THREADS
        int i;
        STRLEN len = strlen(PL_threadsv_names);
 
@@ -667,7 +670,7 @@ LISTOP_children(o)
 #define PMOP_pmreplroot(o)     o->op_pmreplroot
 #define PMOP_pmreplstart(o)    o->op_pmreplstart
 #define PMOP_pmnext(o)         o->op_pmnext
-#define PMOP_pmregexp(o)       o->op_pmregexp
+#define PMOP_pmregexp(o)       PM_GETRE(o)
 #define PMOP_pmflags(o)                o->op_pmflags
 #define PMOP_pmpermflags(o)    o->op_pmpermflags
 
@@ -712,7 +715,7 @@ PMOP_precomp(o)
        REGEXP *        rx = NO_INIT
     CODE:
        ST(0) = sv_newmortal();
-       rx = o->op_pmregexp;
+       rx = PM_GETRE(o);
        if (rx)
            sv_setpvn(ST(0), rx->precomp, rx->prelen);
 
@@ -756,11 +759,22 @@ PVOP_pv(o)
        B::PVOP o
     CODE:
        /*
-        * OP_TRANS uses op_pv to point to a table of 256 shorts
+        * OP_TRANS uses op_pv to point to a table of 256 or >=258 shorts
         * whereas other PVOPs point to a null terminated string.
         */
-       ST(0) = sv_2mortal(newSVpv(o->op_pv, (o->op_type == OP_TRANS) ?
-                                  256 * sizeof(short) : 0));
+       if (o->op_type == OP_TRANS &&
+               (o->op_private & OPpTRANS_COMPLEMENT) &&
+               !(o->op_private & OPpTRANS_DELETE))
+       {
+           short* tbl = (short*)o->op_pv;
+           short entries = 257 + tbl[256];
+           ST(0) = sv_2mortal(newSVpv(o->op_pv, entries * sizeof(short)));
+       }
+       else if (o->op_type == OP_TRANS) {
+           ST(0) = sv_2mortal(newSVpv(o->op_pv, 256 * sizeof(short)));
+       }
+       else
+           ST(0) = sv_2mortal(newSVpv(o->op_pv, 0));
 
 #define LOOP_redoop(o) o->op_redoop
 #define LOOP_nextop(o) o->op_nextop