From 8f94a1b5df88af853e56efc184d49d5914b5866e Mon Sep 17 00:00:00 2001 From: Miguel Sofer Date: Sun, 2 Mar 2008 18:46:37 +0000 Subject: * generic/tclNamesp.c (GetNamespaceFromObj): spoil the intrep of an nsNameType obj when the reference crosses interpreter boundaries. --- ChangeLog | 6 ++++++ generic/tclNamesp.c | 14 ++++++++------ 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/ChangeLog b/ChangeLog index b580b01..881fe15 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2008-03-02 Miguel Sofer + + * generic/tclNamesp.c (GetNamespaceFromObj): spoil the intrep of + an nsNameType obj when the reference crosses interpreter + boundaries. + 2008-02-29 Don Porter * generic/tclResult.c (Tcl_SetReturnOptions): Revised the refcount diff --git a/generic/tclNamesp.c b/generic/tclNamesp.c index 9baf60d..f7fa9c1 100644 --- a/generic/tclNamesp.c +++ b/generic/tclNamesp.c @@ -23,7 +23,7 @@ * See the file "license.terms" for information on usage and redistribution of * this file, and for a DISCLAIMER OF ALL WARRANTIES. * - * RCS: @(#) $Id: tclNamesp.c,v 1.161 2007/12/13 15:23:19 dgp Exp $ + * RCS: @(#) $Id: tclNamesp.c,v 1.162 2008/03/02 18:46:39 msofer Exp $ */ #include "tclInt.h" @@ -2699,18 +2699,20 @@ GetNamespaceFromObj( Tcl_Namespace **nsPtrPtr) /* Result namespace pointer goes here. */ { ResolvedNsName *resNamePtr; - Namespace *nsPtr; + Namespace *nsPtr, *refNsPtr; if (objPtr->typePtr == &nsNameType) { /* - * Check that the ResolvedNsName is still valid. + * Check that the ResolvedNsName is still valid; avoid letting the ref + * cross interps. */ resNamePtr = (ResolvedNsName *) objPtr->internalRep.twoPtrValue.ptr1; nsPtr = resNamePtr->nsPtr; - if (!(nsPtr->flags & NS_DYING) - && ((resNamePtr->refNsPtr == NULL) || (resNamePtr->refNsPtr - == (Namespace *) Tcl_GetCurrentNamespace(interp)))) { + refNsPtr = resNamePtr->refNsPtr; + if (!(nsPtr->flags & NS_DYING) && (interp == nsPtr->interp) && + (!refNsPtr || ((interp == refNsPtr->interp) && + (refNsPtr== (Namespace *) Tcl_GetCurrentNamespace(interp))))) { *nsPtrPtr = (Tcl_Namespace *) nsPtr; return TCL_OK; } -- cgit v0.12