From 8b894ab295af35f4793ab68580a0f2cb6477a638 Mon Sep 17 00:00:00 2001 From: dgp Date: Fri, 14 Oct 2016 19:28:46 +0000 Subject: [eb6b68c1a9] Simple fix for [string replace] error demonstrated by new test. --- generic/tclExecute.c | 11 ----------- tests/stringComp.test | 3 +++ 2 files changed, 3 insertions(+), 11 deletions(-) diff --git a/generic/tclExecute.c b/generic/tclExecute.c index e7ff8dc..2ab0277 100644 --- a/generic/tclExecute.c +++ b/generic/tclExecute.c @@ -5724,17 +5724,6 @@ TEBCresume( length3 = Tcl_GetCharLength(value3Ptr); /* - * Remove substring. In-place. - */ - - if (length3 == 0 && !Tcl_IsShared(valuePtr) && toIdx == length) { - TclDecrRefCount(value3Ptr); - Tcl_SetObjLength(valuePtr, fromIdx); - TRACE_APPEND(("\"%.30s\"\n", O2S(valuePtr))); - NEXT_INST_F(1, 0, 0); - } - - /* * See if we can splice in place. This happens when the number of * characters being replaced is the same as the number of characters * in the string to be inserted. diff --git a/tests/stringComp.test b/tests/stringComp.test index 140a270..2aeb08e 100644 --- a/tests/stringComp.test +++ b/tests/stringComp.test @@ -738,6 +738,9 @@ test stringComp-14.4 {Bug 1af8de570511} { string replace $val[unset val] 1 1 $y }} 4 x } 0x00 +test stringComp-14.5 {} { + string length [string replace [string repeat a\u00fe 2] 3 end {}] +} 3 ## string tolower ## not yet bc -- cgit v0.12 From 925bd5794ece33708050a4d1af75ecb118a7d6da Mon Sep 17 00:00:00 2001 From: dgp Date: Tue, 18 Oct 2016 19:16:35 +0000 Subject: Use memcmp where possible. --- generic/tclCmdMZ.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/generic/tclCmdMZ.c b/generic/tclCmdMZ.c index 5479971..591e31c 100644 --- a/generic/tclCmdMZ.c +++ b/generic/tclCmdMZ.c @@ -1242,8 +1242,8 @@ StringFirstCmd( * Scan forward to find the first character. */ - if ((*p == *needleStr) && (TclUniCharNcmp(needleStr, p, - (unsigned long) needleLen) == 0)) { + if ((*p == *needleStr) && (memcmp(needleStr, p, + sizeof(Tcl_UniChar) * (size_t)needleLen) == 0)) { match = p - haystackStr; break; } -- cgit v0.12 From bfae5bf49268737c01fe601a9c556ca7af4f8973 Mon Sep 17 00:00:00 2001 From: dgp Date: Thu, 20 Oct 2016 17:54:47 +0000 Subject: EVIL HACKs are bad. Unnecessary ones are intolerable. Bad tests cause trouble. --- generic/tclCompCmds.c | 11 ----------- tests/format.test | 7 +++++-- 2 files changed, 5 insertions(+), 13 deletions(-) diff --git a/generic/tclCompCmds.c b/generic/tclCompCmds.c index 3ab03cc..7dba232 100644 --- a/generic/tclCompCmds.c +++ b/generic/tclCompCmds.c @@ -3206,17 +3206,6 @@ TclCompileFormatCmd( */ TclEmitInstInt1(INST_STR_CONCAT1, i, envPtr); - } else { - /* - * EVIL HACK! Force there to be a string representation in the case - * where there's just a "%s" in the format; case covered by the test - * format-20.1 (and it is horrible...) - */ - - TclEmitOpcode(INST_DUP, envPtr); - PushStringLiteral(envPtr, ""); - TclEmitOpcode(INST_STR_EQ, envPtr); - TclEmitOpcode(INST_POP, envPtr); } return TCL_OK; } diff --git a/tests/format.test b/tests/format.test index 27eac31..e199398 100644 --- a/tests/format.test +++ b/tests/format.test @@ -564,9 +564,12 @@ test format-19.3 {Bug 2830354} { test format-20.1 {Bug 2932421: plain %s caused intrep change of args} -body { set x [dict create a b c d] format %s $x - # After this, obj in $x should be a dict with a non-NULL bytes field + # After this, obj in $x should be a dict + # We are testing to make sure it has not been shimmered to a + # different intrep when that is not necessary. + # Whether or not there is a string rep - we should not care! tcl::unsupported::representation $x -} -match glob -result {value is a dict with *, string representation "*"} +} -match glob -result {value is a dict *} # cleanup catch {unset a} -- cgit v0.12 From 9afdf28497341de3c2540fd8a9f8a1e1b6331d1b Mon Sep 17 00:00:00 2001 From: dgp Date: Thu, 20 Oct 2016 20:02:19 +0000 Subject: Repair recently opened memleak. --- generic/tclExecute.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/generic/tclExecute.c b/generic/tclExecute.c index 2ab0277..b9ef582 100644 --- a/generic/tclExecute.c +++ b/generic/tclExecute.c @@ -5797,10 +5797,14 @@ TEBCresume( /* which has result {} which is same as value3Ptr. */ objResultPtr = value3Ptr; } - if (objResultPtr != value3Ptr) { + if (objResultPtr == value3Ptr) { /* See [Bug 82e7f67325] */ - TclDecrRefCount(value3Ptr); + TclDecrRefCount(OBJ_AT_TOS); + OBJ_AT_TOS = value3Ptr; + TRACE_APPEND(("\"%.30s\"\n", O2S(value3Ptr))); + NEXT_INST_F(1, 0, 0); } + TclDecrRefCount(value3Ptr); TRACE_APPEND(("\"%.30s\"\n", O2S(objResultPtr))); NEXT_INST_F(1, 1, 1); -- cgit v0.12