ESUCCESS = 0 is not true, but exists.
[p5sagit/p5-mst-13.2.git] / ext / Storable / Storable.xs
index 4073f92..1bf09c1 100644 (file)
@@ -12,7 +12,7 @@
 #include <perl.h>
 #include <XSUB.h>
 
-#ifndef PERL_VERSION
+#ifndef PATCHLEVEL
 #    include <patchlevel.h>            /* Perl's one, needed since 5.6 */
 #    if !(defined(PERL_VERSION) || (SUBVERSION > 0 && defined(PATCHLEVEL)))
 #        include <could_not_find_Perl_patchlevel.h>
@@ -470,7 +470,7 @@ static stcxt_t *Context_ptr = NULL;
        if (!mbase) {                                           \
                TRACEME(("** allocating mbase of %d bytes", MGROW)); \
                New(10003, mbase, MGROW, char); \
-               msiz = MGROW;                                   \
+               msiz = (STRLEN)MGROW;                                   \
        }                                                                       \
        mptr = mbase;                                           \
        if (x)                                                          \
@@ -850,12 +850,12 @@ static const char byteorderstr_56[] = {BYTEORDER_BYTES_56, 0};
 #define STORE_SCALAR(pv, len)  STORE_PV_LEN(pv, len, SX_SCALAR, SX_LSCALAR)
 
 /*
- * Store undef in arrays and hashes without recursing through store().
+ * Store &PL_sv_undef in arrays without recursing through store().
  */
-#define STORE_UNDEF()                                  \
+#define STORE_SV_UNDEF()                                       \
   STMT_START {                                                 \
        cxt->tagnum++;                                          \
-       PUTMARK(SX_UNDEF);                                      \
+       PUTMARK(SX_SV_UNDEF);                                   \
   } STMT_END
 
 /*
@@ -1237,13 +1237,13 @@ static void clean_store_context(stcxt_t *cxt)
        if (cxt->hseen) {
                hv_iterinit(cxt->hseen);
                while ((he = hv_iternext(cxt->hseen)))  /* Extra () for -Wall, grr.. */
-                       HeVAL(he) = &PL_sv_undef;
+                       HeVAL(he) = &PL_sv_placeholder;
        }
 
        if (cxt->hclass) {
                hv_iterinit(cxt->hclass);
                while ((he = hv_iternext(cxt->hclass))) /* Extra () for -Wall, grr.. */
-                       HeVAL(he) = &PL_sv_undef;
+                       HeVAL(he) = &PL_sv_placeholder;
        }
 
        /*
@@ -1322,7 +1322,8 @@ static void init_retrieve_context(stcxt_t *cxt, int optype, int is_tainted)
         * new retrieve routines.
         */
 
-       cxt->hseen = ((cxt->retrieve_vtbl == sv_old_retrieve) ? newHV() : 0);
+       cxt->hseen = (((void*)cxt->retrieve_vtbl == (void*)sv_old_retrieve)
+                     ? newHV() : 0);
 
        cxt->aseen = newAV();                   /* Where retrieved objects are kept */
        cxt->aclass = newAV();                  /* Where seen classnames are kept */
@@ -1960,7 +1961,7 @@ static int store_scalar(stcxt_t *cxt, SV *sv)
 #else
 
             SvIV_please(sv);
-            if (SvIOK(sv)) {
+           if (SvIOK_notUV(sv)) {
                 iv = SvIV(sv);
                 goto integer;          /* Share code above */
             }
@@ -2036,7 +2037,7 @@ static int store_array(stcxt_t *cxt, AV *av)
                sav = av_fetch(av, i, 0);
                if (!sav) {
                        TRACEME(("(#%d) undef item", i));
-                       STORE_UNDEF();
+                       STORE_SV_UNDEF();
                        continue;
                }
                TRACEME(("(#%d) item", i));
@@ -2207,7 +2208,7 @@ static int store_hash(stcxt_t *cxt, HV *hv)
                             = (((hash_flags & SHV_RESTRICTED)
                                 && SvREADONLY(val))
                                ? SHV_K_LOCKED : 0);
-                        if (val == &PL_sv_undef)
+                        if (val == &PL_sv_placeholder)
                             flags |= SHV_K_PLACEHOLDER;
 
                        keyval = SvPV(key, keylen_tmp);
@@ -2269,7 +2270,7 @@ static int store_hash(stcxt_t *cxt, HV *hv)
 
                /*
                 * Storing in "random" order (in the order the keys are stored
-                * within the the hash).  This is the default and will be faster!
+                * within the hash).  This is the default and will be faster!
                 */
   
                for (i = 0; i < len; i++) {
@@ -2303,7 +2304,7 @@ static int store_hash(stcxt_t *cxt, HV *hv)
                             = (((hash_flags & SHV_RESTRICTED)
                                 && SvREADONLY(val))
                                              ? SHV_K_LOCKED : 0);
-                        if (val == &PL_sv_undef)
+                        if (val == &PL_sv_placeholder)
                             flags |= SHV_K_PLACEHOLDER;
 
                         hek = HeKEY_hek(he);
@@ -2379,7 +2380,7 @@ static int store_code(stcxt_t *cxt, CV *cv)
 #else
        dSP;
        I32 len;
-       int ret, count, reallen;
+       int count, reallen;
        SV *text, *bdeparse;
 
        TRACEME(("store_code (0x%"UVxf")", PTR2UV(cv)));
@@ -2475,6 +2476,7 @@ static int store_code(stcxt_t *cxt, CV *cv)
 static int store_tied(stcxt_t *cxt, SV *sv)
 {
        MAGIC *mg;
+       SV *obj = NULL;
        int ret = 0;
        int svt = SvTYPE(sv);
        char mtype = 'P';
@@ -2520,7 +2522,9 @@ static int store_tied(stcxt_t *cxt, SV *sv)
         * accesses on the retrieved object will indeed call the magic methods...
         */
 
-       if ((ret = store(cxt, mg->mg_obj)))             /* Extra () for -Wall, grr... */
+       /* [#17040] mg_obj is NULL for scalar self-ties. AMS 20030416 */
+       obj = mg->mg_obj ? mg->mg_obj : newSV(0);
+       if ((ret = store(cxt, obj)))
                return ret;
 
        TRACEME(("ok (tied)"));
@@ -4263,19 +4267,27 @@ static SV *retrieve_tied_hash(stcxt_t *cxt, char *cname)
 static SV *retrieve_tied_scalar(stcxt_t *cxt, char *cname)
 {
        SV *tv;
-       SV *sv;
+       SV *sv, *obj = NULL;
 
        TRACEME(("retrieve_tied_scalar (#%d)", cxt->tagnum));
 
        tv = NEWSV(10002, 0);
        SEEN(tv, cname);                        /* Will return if rv is null */
        sv = retrieve(cxt, 0);          /* Retrieve <object> */
-       if (!sv)
+       if (!sv) {
                return (SV *) 0;                /* Failed */
+       }
+       else if (SvTYPE(sv) != SVt_NULL) {
+               obj = sv;
+       }
 
        sv_upgrade(tv, SVt_PVMG);
-       sv_magic(tv, sv, 'q', Nullch, 0);
-       SvREFCNT_dec(sv);                       /* Undo refcnt inc from sv_magic() */
+       sv_magic(tv, obj, 'q', Nullch, 0);
+
+       if (obj) {
+               /* Undo refcnt inc from sv_magic() */
+               SvREFCNT_dec(obj);
+       }
 
        TRACEME(("ok (retrieve_tied_scalar at 0x%"UVxf")", PTR2UV(tv)));
 
@@ -4884,7 +4896,7 @@ static SV *retrieve_flag_hash(stcxt_t *cxt, char *cname)
 
             if (flags & SHV_K_PLACEHOLDER) {
                 SvREFCNT_dec (sv);
-                sv = &PL_sv_undef;
+                sv = &PL_sv_placeholder;
                store_flags |= HVhek_PLACEHOLD;
            }
             if (flags & SHV_K_UTF8) {
@@ -4949,7 +4961,7 @@ static SV *retrieve_code(stcxt_t *cxt, char *cname)
        dSP;
        int type, count;
        SV *cv;
-       SV *sv, *text, *sub, *errsv;
+       SV *sv, *text, *sub;
 
        TRACEME(("retrieve_code (#%d)", cxt->tagnum));