summaryrefslogtreecommitdiff
path: root/pp.c
diff options
context:
space:
mode:
authorMalcolm Beattie <mbeattie@sable.ox.ac.uk>1997-03-28 13:32:21 +0000
committerMalcolm Beattie <mbeattie@sable.ox.ac.uk>1997-03-28 13:32:21 +0000
commitc750a3ec3b866067ab46dbcc9083205d823047c3 (patch)
treedf8ac921c8928fe673a259a2f22aa1f53156cb92 /pp.c
parentcfe4554026dfe078c2d7c706ace0e327f16b2c05 (diff)
downloadperl-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.c40
1 files changed, 27 insertions, 13 deletions
diff --git a/pp.c b/pp.c
index 54433af292..40c0e778bd 100644
--- a/pp.c
+++ b/pp.c
@@ -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);