- register char *lc;
- register char *rc;
- register I32 len;
- I32 lensave;
- char *lsave;
- char *rsave;
- bool left_utf = DO_UTF8(left);
- bool right_utf = DO_UTF8(right);
- I32 needlen = 0;
-
- if (left_utf && !right_utf)
+ register const char *lc;
+ register const char *rc;
+ register STRLEN len;
+ STRLEN lensave;
+ const char *lsave;
+ const char *rsave;
+ bool left_utf;
+ bool right_utf;
+ STRLEN needlen = 0;
+
+ PERL_ARGS_ASSERT_DO_VOP;
+
+ if (sv != left || (optype != OP_BIT_AND && !SvOK(sv) && !SvGMAGICAL(sv)))
+ sv_setpvs(sv, ""); /* avoid undef warning on |= and ^= */
+ if (sv == left) {
+ lsave = lc = SvPV_force_nomg(left, leftlen);
+ }
+ else {
+ lsave = lc = SvPV_nomg_const(left, leftlen);
+ SvPV_force_nomg_nolen(sv);
+ }
+ rsave = rc = SvPV_nomg_const(right, rightlen);
+
+ /* This need to come after SvPV to ensure that string overloading has
+ fired off. */
+
+ left_utf = DO_UTF8(left);
+ right_utf = DO_UTF8(right);
+
+ if (left_utf && !right_utf) {
+ /* Avoid triggering overloading again by using temporaries.
+ Maybe there should be a variant of sv_utf8_upgrade that takes pvn
+ */
+ right = newSVpvn_flags(rsave, rightlen, SVs_TEMP);