summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--generic/tclCmdMZ.c7
-rw-r--r--tests/regexp.test6
2 files changed, 13 insertions, 0 deletions
diff --git a/generic/tclCmdMZ.c b/generic/tclCmdMZ.c
index d6d0152..110de4c 100644
--- a/generic/tclCmdMZ.c
+++ b/generic/tclCmdMZ.c
@@ -811,6 +811,13 @@ Tcl_RegsubObjCmd(
Tcl_AppendObjToObj(resultPtr, Tcl_GetObjResult(interp));
Tcl_ResetResult(interp);
+ /*
+ * Refetch the unicode, in case the representation was smashed by
+ * the user code.
+ */
+
+ wstring = Tcl_GetUnicodeFromObj(objPtr, &wlen);
+
offset += end;
if (end == 0 || start == end) {
/*
diff --git a/tests/regexp.test b/tests/regexp.test
index 6c3d774..ad770fa 100644
--- a/tests/regexp.test
+++ b/tests/regexp.test
@@ -1143,6 +1143,12 @@ test regexp-27.5 {regsub -command} {
test regexp-27.6 {regsub -command} {
regsub -command -all {(.)(.)} {abcdef} {list ,}
} {, ab a b, cd c d, ef e f}
+test regexp-27.7 {regsub -command representation smash} {
+ set ::s {123=456 789}
+ regsub -command -all {\d+} $::s {apply {n {
+ expr {[llength $::s] + $n}
+ }}}
+} {125=458 791}
# cleanup
::tcltest::cleanupTests