diff options
| author | dkf <donal.k.fellows@manchester.ac.uk> | 2024-08-06 21:01:05 (GMT) |
|---|---|---|
| committer | dkf <donal.k.fellows@manchester.ac.uk> | 2024-08-06 21:01:05 (GMT) |
| commit | e49afd853d0618550411e935076cd91f36206955 (patch) | |
| tree | a8a444cdc96f59557014a9592258b594a8695a24 /generic/tclOOBasic.c | |
| parent | 1783fd4d20fe00c9745af65bee5c358f72323d14 (diff) | |
| download | tcl-e49afd853d0618550411e935076cd91f36206955.zip tcl-e49afd853d0618550411e935076cd91f36206955.tar.gz tcl-e49afd853d0618550411e935076cd91f36206955.tar.bz2 | |
Make varname method handle array elements better. [2da1cb0c80]
Diffstat (limited to 'generic/tclOOBasic.c')
| -rw-r--r-- | generic/tclOOBasic.c | 22 |
1 files changed, 15 insertions, 7 deletions
diff --git a/generic/tclOOBasic.c b/generic/tclOOBasic.c index 1506a34..3d24636 100644 --- a/generic/tclOOBasic.c +++ b/generic/tclOOBasic.c @@ -856,7 +856,19 @@ TclOO_Object_VarName( /* * The variable reference must not disappear too soon. [Bug 74b6110204] */ - TclSetVarNamespaceVar((Var *) varPtr); + if (!TclIsVarArrayElement((Var *) varPtr)) { + TclSetVarNamespaceVar((Var *) varPtr); + } + + /* + * If the varPtr points to an element of an array but we don't already + * have the array, find it now. Note that this can't be easily backported; + * the arrayPtr field is new in Tcl 9.0. [Bug 2da1cb0c80] + */ + + if (aryVar == NULL && TclIsVarArrayElement((Var *) varPtr)) { + aryVar = (Tcl_Var) TclVarParentArray(varPtr); + } /* * Now that we've pinned down what variable we're really talking about @@ -864,15 +876,11 @@ TclOO_Object_VarName( */ TclNewObj(varNamePtr); + if (aryVar != NULL) { Tcl_GetVariableFullName(interp, aryVar, varNamePtr); - - /* - * WARNING! This code pokes inside the implementation of hash tables! - */ - Tcl_AppendPrintfToObj(varNamePtr, "(%s)", Tcl_GetString( - ((VarInHash *) varPtr)->entry.key.objPtr)); + VarHashGetKey(varPtr))); } else { Tcl_GetVariableFullName(interp, varPtr, varNamePtr); } |
