summaryrefslogtreecommitdiffstats
path: root/generic/tclOOBasic.c
diff options
context:
space:
mode:
authordkf <donal.k.fellows@manchester.ac.uk>2024-08-06 21:01:05 (GMT)
committerdkf <donal.k.fellows@manchester.ac.uk>2024-08-06 21:01:05 (GMT)
commite49afd853d0618550411e935076cd91f36206955 (patch)
treea8a444cdc96f59557014a9592258b594a8695a24 /generic/tclOOBasic.c
parent1783fd4d20fe00c9745af65bee5c358f72323d14 (diff)
downloadtcl-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.c22
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);
}