Array-Each-Override

 view release on metacpan or  search on metacpan

Override.xs  view on Meta::CPAN

    AV *av;
PPCODE:
    if (!SvROK(sv))
        croak("Argument to Array::Each::Override::array_each must be a reference");
    sv = SvRV(sv);
    if (SvTYPE(sv) == SVt_PVHV) {
        HV *hv = (HV *) sv;
        HE *entry;
        const I32 gimme = GIMME_V;

        /* PUTBACK; */
        entry = hv_iternext(hv);
        /* SPAGAIN; */

        if (entry) {
            SV *const key_sv = hv_iterkeysv(entry);
            EXTEND(SP, 2);
            PUSHs(key_sv);
            if (gimme != G_ARRAY)
               XSRETURN(1);
            else {
                SV *val;
                /* PUTBACK; */
                val = hv_iterval(hv, entry);
                /* SPAGAIN; */
                PUSHs(val);
                XSRETURN(2);
            }
        }
        else if (gimme == G_SCALAR) {
            XSRETURN_UNDEF;
        }
        else {

Override.xs  view on Meta::CPAN

                while (hv_iternext(hv))
                    i++;
            }

            PUSHi(i);
            XSRETURN(1);
        }
        else {
            I32 n = HvKEYS(hv);
            EXTEND(SP, n);
            /* PUTBACK; */
            while ((entry = hv_iternext(hv))) {
                SV *key_sv;
                /* SPAGAIN; */
                key_sv = hv_iterkeysv(entry);
                PUSHs(key_sv);
                /* PUTBACK; */
            }
            /* SPAGAIN; */
            XSRETURN(n);
        }
    }
    if (SvTYPE(sv) != SVt_PVAV) {
        Perl_croak(aTHX_ "Argument to Array::Each::Override::array_keys must "
            "be a hash or array reference");
    }
    av = (AV *) sv;

Override.xs  view on Meta::CPAN

                while (hv_iternext(keys))
                    i++;
            }

            PUSHi(i);
            XSRETURN(1);
        }
        else {
            I32 n = HvKEYS(keys);
            EXTEND(SP, n);
            /* PUTBACK; */
            while ((entry = hv_iternext(keys))) {
                SV *val;
                val = hv_iterval(hv, entry);
                /* SPAGAIN; */
                PUSHs(val);
            }
            /* PUTBACK; */
            XSRETURN(n);
        }
    }
    if (SvTYPE(sv) != SVt_PVAV) {
        Perl_croak(aTHX_ "Argument to Array::Each::Override::array_values must "
            "be a hash or array reference");
    }
    av = (AV *) sv;
    clear_iterator(aTHX_ sv);
    if (GIMME_V == G_SCALAR) {



( run in 0.402 second using v1.01-cache-2.11-cpan-4e96b696675 )