summaryrefslogtreecommitdiff
path: root/pp_ctl.c
diff options
context:
space:
mode:
Diffstat (limited to 'pp_ctl.c')
-rw-r--r--pp_ctl.c17
1 files changed, 16 insertions, 1 deletions
diff --git a/pp_ctl.c b/pp_ctl.c
index 153d98e604..9b9bff9a8f 100644
--- a/pp_ctl.c
+++ b/pp_ctl.c
@@ -4131,6 +4131,11 @@ PP(pp_entereval)
if (PL_op->op_private & OPpEVAL_HAS_HH) {
saved_hh = MUTABLE_HV(SvREFCNT_inc(POPs));
}
+ else if (PL_op->op_private & OPpEVAL_COPHH
+ && PL_curcop->cop_hints & HINT_LOCALIZE_HH) {
+ saved_hh = cop_hints_2hv(PL_curcop, 0);
+ hv_magic(saved_hh, NULL, PERL_MAGIC_hints);
+ }
sv = POPs;
if (!SvPOK(sv)) {
/* make sure we've got a plain PV (no overload etc) before testing
@@ -4140,6 +4145,15 @@ PP(pp_entereval)
const char * const p = SvPV_const(sv, len);
sv = newSVpvn_flags(p, len, SVs_TEMP | SvUTF8(sv));
+
+ if (PL_op->op_private & OPpEVAL_BYTES && SvUTF8(sv))
+ SvPVbyte_force(sv, len);
+ }
+ else if (PL_op->op_private & OPpEVAL_BYTES && SvUTF8(sv)) {
+ /* Don’t modify someone else’s scalar */
+ STRLEN len;
+ sv = newSVsv(sv);
+ SvPVbyte_force(sv,len);
}
TAINT_IF(SvTAINTED(sv));
@@ -4173,7 +4187,8 @@ PP(pp_entereval)
ensues, we always turn GvMULTI_on for any globals that were
introduced within evals. See force_ident(). GSAR 96-10-12 */
SAVEHINTS();
- PL_hints = PL_op->op_targ;
+ PL_hints = PL_op->op_private & OPpEVAL_COPHH
+ ? PL_curcop->cop_hints : PL_op->op_targ;
if (saved_hh) {
/* SAVEHINTS created a new HV in PL_hintgv, which we need to GC */
SvREFCNT_dec(GvHV(PL_hintgv));