diff options
author | Malcolm Beattie <mbeattie@sable.ox.ac.uk> | 1997-03-28 13:32:21 +0000 |
---|---|---|
committer | Malcolm Beattie <mbeattie@sable.ox.ac.uk> | 1997-03-28 13:32:21 +0000 |
commit | c750a3ec3b866067ab46dbcc9083205d823047c3 (patch) | |
tree | df8ac921c8928fe673a259a2f22aa1f53156cb92 /pp.c | |
parent | cfe4554026dfe078c2d7c706ace0e327f16b2c05 (diff) | |
download | perl-c750a3ec3b866067ab46dbcc9083205d823047c3.tar.gz |
Initial devel changes.
Pseudo-hashes. Optional strong typing. RESTART {}.
p4raw-id: //depot/perl@2
Diffstat (limited to 'pp.c')
-rw-r--r-- | pp.c | 40 |
1 files changed, 27 insertions, 13 deletions
@@ -1791,20 +1791,24 @@ PP(pp_each) HE *entry; I32 i; char *tmps; + I32 realhv = (SvTYPE(hash) == SVt_PVHV); PUTBACK; - entry = hv_iternext(hash); /* might clobber stack_sp */ + /* might clobber stack_sp */ + entry = realhv ? hv_iternext(hash) : avhv_iternext((AV*)hash); SPAGAIN; EXTEND(SP, 2); if (entry) { - tmps = hv_iterkey(entry, &i); /* won't clobber stack_sp */ + tmps = hv_iterkey(entry, &i); /* won't clobber stack_sp */ if (!i) tmps = ""; PUSHs(sv_2mortal(newSVpv(tmps, i))); if (GIMME == G_ARRAY) { PUTBACK; - sv_setsv(TARG, hv_iterval(hash, entry)); /* might clobber stack_sp */ + /* might clobber stack_sp */ + sv_setsv(TARG, realhv ? + hv_iterval(hash, entry) : avhv_iterval((AV*)hash, entry)); SPAGAIN; PUSHs(TARG); } @@ -1833,12 +1837,16 @@ PP(pp_delete) HV *hv = (HV*)POPs; char *tmps; STRLEN len; - if (SvTYPE(hv) != SVt_PVHV) { + I32 flags = op->op_private & OPpLEAVE_VOID ? G_DISCARD : 0; + + tmps = SvPV(tmpsv, len); + if (SvTYPE(hv) == SVt_PVHV) + sv = hv_delete(hv, tmps, len, flags); + else if (SvTYPE(hv) == SVt_PVAV) { + sv = avhv_delete((AV*)hv, tmps, len, flags); + } else { DIE("Not a HASH reference"); } - tmps = SvPV(tmpsv, len); - sv = hv_delete(hv, tmps, len, - op->op_private & OPpLEAVE_VOID ? G_DISCARD : 0); if (!sv) RETPUSHUNDEF; PUSHs(sv); @@ -1852,12 +1860,16 @@ PP(pp_exists) HV *hv = (HV*)POPs; char *tmps; STRLEN len; - if (SvTYPE(hv) != SVt_PVHV) { + tmps = SvPV(tmpsv, len); + if (SvTYPE(hv) == SVt_PVHV) { + if (hv_exists(hv, tmps, len)) + RETPUSHYES; + } else if (SvTYPE(hv) == SVt_PVAV) { + if (avhv_exists((AV*)hv, tmps, len)) + RETPUSHYES; + } else { DIE("Not a HASH reference"); } - tmps = SvPV(tmpsv, len); - if (hv_exists(hv, tmps, len)) - RETPUSHYES; RETPUSHNO; } @@ -1867,13 +1879,15 @@ PP(pp_hslice) register SV **svp; register HV *hv = (HV*)POPs; register I32 lval = op->op_flags & OPf_MOD; + I32 realhv = (SvTYPE(hv) == SVt_PVHV); - if (SvTYPE(hv) == SVt_PVHV) { + if (realhv || SvTYPE(hv) == SVt_PVAV) { while (++MARK <= SP) { STRLEN keylen; char *key = SvPV(*MARK, keylen); - svp = hv_fetch(hv, key, keylen, lval); + svp = realhv ? hv_fetch(hv, key, keylen, lval) + : avhv_fetch((AV*)hv, key, keylen, lval); if (lval) { if (!svp || *svp == &sv_undef) DIE(no_helem, key); |