summaryrefslogtreecommitdiffstats
path: root/generic/tclNamesp.c
diff options
context:
space:
mode:
authordgp <dgp@users.sourceforge.net>2011-03-09 16:42:06 (GMT)
committerdgp <dgp@users.sourceforge.net>2011-03-09 16:42:06 (GMT)
commit66c00a872668c60fedb51c5b242df305c7557826 (patch)
treea7cb38052fffb01584c3102dd50121cc02f7855b /generic/tclNamesp.c
parent47412dd55bfb480602e28ca7d73b0aef74b622cb (diff)
parent2b0f7b4b159055bf1ef1f1a51a31ab0373929824 (diff)
downloadtcl-66c00a872668c60fedb51c5b242df305c7557826.zip
tcl-66c00a872668c60fedb51c5b242df305c7557826.tar.gz
tcl-66c00a872668c60fedb51c5b242df305c7557826.tar.bz2
* generic/tclNamesp.c: Tighten the detector of nested [namespace code]
* tests/namespace.test: quoting that the quoted scripts function properly even in a namespace that contains a custom "namespace" command. [Bug 3202171] * doc/tclvars.n: Formatting fix. Thanks to Pat Thotys.
Diffstat (limited to 'generic/tclNamesp.c')
-rw-r--r--generic/tclNamesp.c22
1 files changed, 9 insertions, 13 deletions
diff --git a/generic/tclNamesp.c b/generic/tclNamesp.c
index a777d27..1d84131 100644
--- a/generic/tclNamesp.c
+++ b/generic/tclNamesp.c
@@ -3077,7 +3077,7 @@ NamespaceCodeCmd(
{
Namespace *currNsPtr;
Tcl_Obj *listPtr, *objPtr;
- register const char *arg, *p;
+ register const char *arg;
int length;
if (objc != 3) {
@@ -3087,21 +3087,17 @@ NamespaceCodeCmd(
/*
* If "arg" is already a scoped value, then return it directly.
+ * Take care to only check for scoping in precisely the style that
+ * [::namespace code] generates it. Anything more forgiving can have
+ * the effect of failing in namespaces that contain their own custom
+ " "namespace" command. [Bug 3202171].
*/
arg = TclGetStringFromObj(objv[2], &length);
- while (*arg == ':') {
- arg++;
- length--;
- }
- if (*arg=='n' && length>17 && strncmp(arg, "namespace", 9)==0) {
- for (p=arg+9 ; isspace(UCHAR(*p)) ; p++) {
- /* empty body: skip over whitespace */
- }
- if (*p=='i' && (p+7 <= arg+length) && strncmp(p, "inscope", 7)==0) {
- Tcl_SetObjResult(interp, objv[2]);
- return TCL_OK;
- }
+ if (*arg==':' && length > 20
+ && strncmp(arg, "::namespace inscope ", 20) == 0) {
+ Tcl_SetObjResult(interp, objv[2]);
+ return TCL_OK;
}
/*