- switch (PL_op->op_private & ~hasutf & (
- OPpTRANS_FROM_UTF|OPpTRANS_TO_UTF|OPpTRANS_IDENTICAL|
- OPpTRANS_SQUASH|OPpTRANS_DELETE|OPpTRANS_COMPLEMENT)) {
- case 0:
- if (hasutf)
- return do_trans_simple_utf8(sv);
- else
- return do_trans_simple(sv);
-
- case OPpTRANS_IDENTICAL:
- case OPpTRANS_IDENTICAL|OPpTRANS_COMPLEMENT:
- if (hasutf)
- return do_trans_count_utf8(sv);
- else
- return do_trans_count(sv);
-
- default:
- if (hasutf)
- return do_trans_complex_utf8(sv);
- else
- return do_trans_complex(sv);
+ /* If we use only OPpTRANS_IDENTICAL to bypass the READONLY check,
+ * we must also rely on it to choose the readonly strategy.
+ */
+ if (flags & OPpTRANS_IDENTICAL) {
+ return hasutf ? do_trans_count_utf8(sv) : do_trans_count(sv);
+ } else if (flags & (OPpTRANS_SQUASH|OPpTRANS_DELETE|OPpTRANS_COMPLEMENT)) {
+ return hasutf ? do_trans_complex_utf8(sv) : do_trans_complex(sv);
+ } else {
+ return hasutf ? do_trans_simple_utf8(sv) : do_trans_simple(sv);