summaryrefslogtreecommitdiff
path: root/op.c
diff options
context:
space:
mode:
authorGurusamy Sarathy <gsar@cpan.org>2000-02-15 20:57:12 +0000
committerGurusamy Sarathy <gsar@cpan.org>2000-02-15 20:57:12 +0000
commit9615e7416438b376811c3ef177cc7b681939bbd1 (patch)
treed24728ce356401ec0ac7a324cfbe17cb7896b862 /op.c
parent6ecd3fcb18ad9971602fef37d1b614877840f7a8 (diff)
downloadperl-9615e7416438b376811c3ef177cc7b681939bbd1.tar.gz
fix change#5104 under useithreads
p4raw-link: @5104 on //depot/perl: 345599ca7248bba771c8a9cadc2422a744a61ff2 p4raw-id: //depot/perl@5112
Diffstat (limited to 'op.c')
-rw-r--r--op.c25
1 files changed, 19 insertions, 6 deletions
diff --git a/op.c b/op.c
index ea58e6fdb0..430b11c171 100644
--- a/op.c
+++ b/op.c
@@ -6458,11 +6458,12 @@ Perl_peep(pTHX_ register OP *o)
UNOP *rop;
SV *lexname;
GV **fields;
- SV **svp, **indsvp;
+ SV **svp, **indsvp, *sv;
I32 ind;
char *key;
STRLEN keylen;
+ o->op_seq = PL_op_seqmax++;
if ((o->op_private & (OPpLVAL_INTRO))
|| ((BINOP*)o)->op_last->op_type != OP_CONST)
break;
@@ -6489,8 +6490,13 @@ Perl_peep(pTHX_ register OP *o)
rop->op_ppaddr = PL_ppaddr[OP_RV2AV];
o->op_type = OP_AELEM;
o->op_ppaddr = PL_ppaddr[OP_AELEM];
+ sv = newSViv(ind);
+ if (SvREADONLY(*svp))
+ SvREADONLY_on(sv);
+ SvFLAGS(sv) |= (SvFLAGS(*svp)
+ & (SVs_PADBUSY|SVs_PADTMP|SVs_PADMY));
SvREFCNT_dec(*svp);
- *svp = newSViv(ind);
+ *svp = sv;
break;
}
@@ -6498,12 +6504,13 @@ Perl_peep(pTHX_ register OP *o)
UNOP *rop;
SV *lexname;
GV **fields;
- SV **svp, **indsvp;
+ SV **svp, **indsvp, *sv;
I32 ind;
char *key;
STRLEN keylen;
SVOP *first_key_op, *key_op;
-
+
+ o->op_seq = PL_op_seqmax++;
if ((o->op_private & (OPpLVAL_INTRO))
/* I bet there's always a pushmark... */
|| ((LISTOP*)o)->op_first->op_sibling->op_type != OP_LIST)
@@ -6538,14 +6545,20 @@ Perl_peep(pTHX_ register OP *o)
key = SvPV(*svp, keylen);
indsvp = hv_fetch(GvHV(*fields), key, keylen, FALSE);
if (!indsvp) {
- Perl_croak(aTHX_ "No such pseudo-hash field \"%s\" in variable %s of type %s",
+ Perl_croak(aTHX_ "No such pseudo-hash field \"%s\" "
+ "in variable %s of type %s",
key, SvPV(lexname, n_a), HvNAME(SvSTASH(lexname)));
}
ind = SvIV(*indsvp);
if (ind < 1)
Perl_croak(aTHX_ "Bad index while coercing array into hash");
+ sv = newSViv(ind);
+ if (SvREADONLY(*svp))
+ SvREADONLY_on(sv);
+ SvFLAGS(sv) |= (SvFLAGS(*svp)
+ & (SVs_PADBUSY|SVs_PADTMP|SVs_PADMY));
SvREFCNT_dec(*svp);
- *svp = newSViv(ind);
+ *svp = sv;
}
break;
}