avoid hiding child process window
[p5sagit/p5-mst-13.2.git] / mg.c
diff --git a/mg.c b/mg.c
index 6418b27..1923ce4 100644 (file)
--- a/mg.c
+++ b/mg.c
 #  endif
 #endif
 
-#ifdef PERL_OBJECT
-#  define VTBL            this->*vtbl
-#else
-#  define VTBL                 *vtbl
-#endif
-
 static void restore_magic(pTHXo_ void *p);
 static void unwind_handler_stack(pTHXo_ void *p);
 
@@ -99,7 +93,7 @@ Perl_mg_get(pTHX_ SV *sv)
     while ((mg = *mgp) != 0) {
        MGVTBL* vtbl = mg->mg_virtual;
        if (!(mg->mg_flags & MGf_GSKIP) && vtbl && (vtbl->svt_get != NULL)) {
-           (VTBL->svt_get)(aTHX_ sv, mg);
+           CALL_FTPR(vtbl->svt_get)(aTHX_ sv, mg);
            /* Ignore this magic if it's been deleted */
            if ((mg == (mgp_valid ? *mgp : SvMAGIC(sv))) &&
                  (mg->mg_flags & MGf_GSKIP))
@@ -137,7 +131,7 @@ Perl_mg_set(pTHX_ SV *sv)
            (SSPTR(mgs_ix, MGS*))->mgs_flags = 0;
        }
        if (vtbl && (vtbl->svt_set != NULL))
-           (VTBL->svt_set)(aTHX_ sv, mg);
+           CALL_FPTR(vtbl->svt_set)(aTHX_ sv, mg);
     }
 
     restore_magic(aTHXo_ (void*)mgs_ix);
@@ -159,7 +153,7 @@ Perl_mg_length(pTHX_ SV *sv)
            mgs_ix = SSNEW(sizeof(MGS));
            save_magic(mgs_ix, sv);
            /* omit MGf_GSKIP -- not changed here */
-           len = (VTBL->svt_len)(aTHX_ sv, mg);
+           len = CALL_FPTR(vtbl->svt_len)(aTHX_ sv, mg);
            restore_magic(aTHXo_ (void*)mgs_ix);
            return len;
        }
@@ -183,7 +177,7 @@ Perl_mg_size(pTHX_ SV *sv)
            mgs_ix = SSNEW(sizeof(MGS));
            save_magic(mgs_ix, sv);
            /* omit MGf_GSKIP -- not changed here */
-           len = (VTBL->svt_len)(aTHX_ sv, mg);
+           len = CALL_FPTR(vtbl->svt_len)(aTHX_ sv, mg);
            restore_magic(aTHXo_ (void*)mgs_ix);
            return len;
        }
@@ -216,7 +210,7 @@ Perl_mg_clear(pTHX_ SV *sv)
        /* omit GSKIP -- never set here */
        
        if (vtbl && (vtbl->svt_clear != NULL))
-           (VTBL->svt_clear)(aTHX_ sv, mg);
+           CALL_FPTR(vtbl->svt_clear)(aTHX_ sv, mg);
     }
 
     restore_magic(aTHXo_ (void*)mgs_ix);
@@ -259,7 +253,7 @@ Perl_mg_free(pTHX_ SV *sv)
        MGVTBL* vtbl = mg->mg_virtual;
        moremagic = mg->mg_moremagic;
        if (vtbl && (vtbl->svt_free != NULL))
-           (VTBL->svt_free)(aTHX_ sv, mg);
+           CALL_FPTR(vtbl->svt_free)(aTHX_ sv, mg);
        if (mg->mg_ptr && mg->mg_type != 'g')
            if (mg->mg_len >= 0)
                Safefree(mg->mg_ptr);
@@ -1361,65 +1355,13 @@ int
 Perl_magic_getvec(pTHX_ SV *sv, MAGIC *mg)
 {
     SV *lsv = LvTARG(sv);
-    unsigned char *s;
-    unsigned long retnum;
-    STRLEN lsvlen;
-    I32 len;
-    I32 offset;
-    I32 size;
 
     if (!lsv) {
        SvOK_off(sv);
        return 0;
     }
-    s = (unsigned char *) SvPV(lsv, lsvlen);
-    offset = LvTARGOFF(sv);
-    size = LvTARGLEN(sv);
-    len = (offset + size + 7) / 8;
-
-    /* Copied from pp_vec() */
-
-    if (len > lsvlen) {
-       if (size <= 8)
-           retnum = 0;
-       else {
-           offset >>= 3;
-           if (size == 16) {
-               if (offset >= lsvlen)
-                   retnum = 0;
-               else
-                   retnum = (unsigned long) s[offset] << 8;
-           }
-           else if (size == 32) {
-               if (offset >= lsvlen)
-                   retnum = 0;
-               else if (offset + 1 >= lsvlen)
-                   retnum = (unsigned long) s[offset] << 24;
-               else if (offset + 2 >= lsvlen)
-                   retnum = ((unsigned long) s[offset] << 24) +
-                       ((unsigned long) s[offset + 1] << 16);
-               else
-                   retnum = ((unsigned long) s[offset] << 24) +
-                       ((unsigned long) s[offset + 1] << 16) +
-                       (s[offset + 2] << 8);
-           }
-       }
-    }
-    else if (size < 8)
-       retnum = (s[offset >> 3] >> (offset & 7)) & ((1 << size) - 1);
-    else {
-       offset >>= 3;
-       if (size == 8)
-           retnum = s[offset];
-       else if (size == 16)
-           retnum = ((unsigned long) s[offset] << 8) + s[offset+1];
-       else if (size == 32)
-           retnum = ((unsigned long) s[offset] << 24) +
-               ((unsigned long) s[offset + 1] << 16) +
-               (s[offset + 2] << 8) + s[offset+3];
-    }
 
-    sv_setuv(sv, (UV)retnum);
+    sv_setuv(sv, do_vecget(lsv, LvTARGOFF(sv), LvTARGLEN(sv)));
     return 0;
 }
 
@@ -1840,7 +1782,7 @@ Perl_magic_set(pTHX_ SV *sv, MAGIC *mg)
        if (PL_euid == PL_uid)          /* special case $> = $< */
            PerlProc_setuid(PL_euid);
        else {
-           PL_euid = rlProc_geteuid();
+           PL_euid = PerlProc_geteuid();
            Perl_croak(aTHX_ "seteuid() not implemented");
        }
 #endif
@@ -1884,7 +1826,7 @@ Perl_magic_set(pTHX_ SV *sv, MAGIC *mg)
 
            while (isSPACE(*p))
                ++p;
-           PL_egid = I_V(Atol(p));
+           PL_egid = Atol(p);
            for (i = 0; i < NGROUPS; ++i) {
                while (*p && !isSPACE(*p))
                    ++p;
@@ -1892,7 +1834,7 @@ Perl_magic_set(pTHX_ SV *sv, MAGIC *mg)
                    ++p;
                if (!*p)
                    break;
-               gary[i] = I_V(Atol(p));
+               gary[i] = Atol(p);
            }
            if (i)
                (void)setgroups(i, gary);