Tcl Source Code

Changes On Branch bug-e87bcf819f
Login

Many hyperlinks are disabled.
Use anonymous login to enable hyperlinks.

Changes In Branch bug-e87bcf819f Excluding Merge-Ins

This is equivalent to a diff from 0cd538f301 to 4eda1d6aee

2018-04-29
21:14
Upgrade everything to Unicode 11 (still in beta, expected in june 2018) check-in: 8f0b52858b user: jan.nijtmans tags: core-8-branch
2018-04-27
13:21
merge 8.7 check-in: 1724282826 user: dgp tags: core_zip_vfs
2018-04-26
18:19
merge 8.7 Leaf check-in: 4eda1d6aee user: dgp tags: bug-e87bcf819f
08:33
Merge 8.7 check-in: b0c3db9294 user: jan.nijtmans tags: trunk
08:32
Update test-cases, so they are selected or not for -DTCL_UTF_MAX=6. Now all relevant test-cases pas... check-in: 0cd538f301 user: jan.nijtmans tags: core-8-branch
2018-04-25
11:48
merge 8.6 check-in: 146fed70ad user: dgp tags: core-8-branch
2018-04-23
13:51
merge 8.7 check-in: 743fa61e1c user: dgp tags: bug-e87bcf819f

Changes to generic/tclInt.h.

848
849
850
851
852
853
854


855
856
857
858
859
860
861
#define TclGetVarNsPtr(varPtr) \
    (TclIsVarInHash(varPtr) \
	? ((TclVarHashTable *) ((((VarInHash *) (varPtr))->entry.tablePtr)))->nsPtr \
	: NULL)

#define VarHashRefCount(varPtr) \
    ((VarInHash *) (varPtr))->refCount



/*
 * Macros for direct variable access by TEBC.
 */

#define TclIsVarDirectReadable(varPtr) \
    (   !((varPtr)->flags & (VAR_ARRAY|VAR_LINK|VAR_TRACED_READ)) \







>
>







848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
#define TclGetVarNsPtr(varPtr) \
    (TclIsVarInHash(varPtr) \
	? ((TclVarHashTable *) ((((VarInHash *) (varPtr))->entry.tablePtr)))->nsPtr \
	: NULL)

#define VarHashRefCount(varPtr) \
    ((VarInHash *) (varPtr))->refCount

MODULE_SCOPE Var *	TclArrayContaining(Var *varPtr);

/*
 * Macros for direct variable access by TEBC.
 */

#define TclIsVarDirectReadable(varPtr) \
    (   !((varPtr)->flags & (VAR_ARRAY|VAR_LINK|VAR_TRACED_READ)) \

Changes to generic/tclOOBasic.c.

724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758

    /*
     * Now that we've pinned down what variable we're really talking about
     * (including traversing variable links), convert back to a name.
     */

    varNamePtr = Tcl_NewObj();
    if (aryVar != NULL) {
	Tcl_HashEntry *hPtr;
	Tcl_HashSearch search;

	Tcl_GetVariableFullName(interp, (Tcl_Var) aryVar, varNamePtr);

	/*
	 * WARNING! This code pokes inside the implementation of hash tables!
	 */

	hPtr = Tcl_FirstHashEntry((Tcl_HashTable *) aryVar->value.tablePtr,
		&search);
	while (hPtr != NULL) {
	    if (varPtr == Tcl_GetHashValue(hPtr)) {
		Tcl_AppendToObj(varNamePtr, "(", -1);
		Tcl_AppendObjToObj(varNamePtr, hPtr->key.objPtr);
		Tcl_AppendToObj(varNamePtr, ")", -1);
		break;
	    }
	    hPtr = Tcl_NextHashEntry(&search);
	}
    } else {
	Tcl_GetVariableFullName(interp, (Tcl_Var) varPtr, varNamePtr);
    }
    Tcl_SetObjResult(interp, varNamePtr);
    return TCL_OK;
}








|
|
<



<
<
<
<
<
<
<
<
|
|
|
<
<
<
<







724
725
726
727
728
729
730
731
732

733
734
735








736
737
738




739
740
741
742
743
744
745

    /*
     * Now that we've pinned down what variable we're really talking about
     * (including traversing variable links), convert back to a name.
     */

    varNamePtr = Tcl_NewObj();
    if (TclIsVarArrayElement(varPtr)) {
	aryVar = TclArrayContaining(varPtr);


	Tcl_GetVariableFullName(interp, (Tcl_Var) aryVar, varNamePtr);









	Tcl_AppendToObj(varNamePtr, "(", -1);
	Tcl_AppendObjToObj(varNamePtr, ((VarInHash *)varPtr)->entry.key.objPtr);
	Tcl_AppendToObj(varNamePtr, ")", -1);




    } else {
	Tcl_GetVariableFullName(interp, (Tcl_Var) varPtr, varNamePtr);
    }
    Tcl_SetObjResult(interp, varNamePtr);
    return TCL_OK;
}


Changes to generic/tclVar.c.

107
108
109
110
111
112
113







114
115
116
117
118
119
120

    if (hPtr) {
	return VarHashGetValue(hPtr);
    } else {
	return NULL;
    }
}








#define VarHashGetKey(varPtr) \
    (((VarInHash *)(varPtr))->entry.key.objPtr)

#define VarHashDeleteTable(tablePtr) \
    Tcl_DeleteHashTable(&(tablePtr)->table)








>
>
>
>
>
>
>







107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127

    if (hPtr) {
	return VarHashGetValue(hPtr);
    } else {
	return NULL;
    }
}

Var *
TclArrayContaining(
    Var *varPtr)
{
    return (Var *) Tcl_GetHashValue( &(((VarInHash *)varPtr)->entry));
}

#define VarHashGetKey(varPtr) \
    (((VarInHash *)(varPtr))->entry.key.objPtr)

#define VarHashDeleteTable(tablePtr) \
    Tcl_DeleteHashTable(&(tablePtr)->table)

1068
1069
1070
1071
1072
1073
1074

1075
1076
1077
1078
1079
1080
1081
	varPtr = VarHashCreateVar(arrayPtr->value.tablePtr, elNamePtr,
		&isNew);
	if (isNew) {
	    if (arrayPtr->flags & VAR_SEARCH_ACTIVE) {
		DeleteSearches((Interp *) interp, arrayPtr);
	    }
	    TclSetVarArrayElement(varPtr);

	}
    } else {
	varPtr = VarHashFindVar(arrayPtr->value.tablePtr, elNamePtr);
	if (varPtr == NULL) {
	    if (flags & TCL_LEAVE_ERR_MSG) {
		TclObjVarErrMsg(interp, arrayNamePtr, elNamePtr, msg,
			noSuchElement, index);







>







1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
	varPtr = VarHashCreateVar(arrayPtr->value.tablePtr, elNamePtr,
		&isNew);
	if (isNew) {
	    if (arrayPtr->flags & VAR_SEARCH_ACTIVE) {
		DeleteSearches((Interp *) interp, arrayPtr);
	    }
	    TclSetVarArrayElement(varPtr);
	    Tcl_SetHashValue( &(((VarInHash *)varPtr)->entry), arrayPtr);
	}
    } else {
	varPtr = VarHashFindVar(arrayPtr->value.tablePtr, elNamePtr);
	if (varPtr == NULL) {
	    if (flags & TCL_LEAVE_ERR_MSG) {
		TclObjVarErrMsg(interp, arrayNamePtr, elNamePtr, msg,
			noSuchElement, index);
2483
2484
2485
2486
2487
2488
2489






2490
2491
2492
2493
2494
2495
2496
2497
    Interp *iPtr,
    Tcl_Obj *part1Ptr,
    Tcl_Obj *part2Ptr,
    int flags,
    int index)
{
    Var dummyVar;






    int traced = TclIsVarTraced(varPtr)
	    || (arrayPtr && (arrayPtr->flags & VAR_TRACED_UNSET));

    if (arrayPtr && (arrayPtr->flags & VAR_SEARCH_ACTIVE)) {
	DeleteSearches(iPtr, arrayPtr);
    } else if (varPtr->flags & VAR_SEARCH_ACTIVE) {
	DeleteSearches(iPtr, varPtr);
    }







>
>
>
>
>
>
|







2491
2492
2493
2494
2495
2496
2497
2498
2499
2500
2501
2502
2503
2504
2505
2506
2507
2508
2509
2510
2511
    Interp *iPtr,
    Tcl_Obj *part1Ptr,
    Tcl_Obj *part2Ptr,
    int flags,
    int index)
{
    Var dummyVar;
    int traced;

    if (arrayPtr == NULL && TclIsVarArrayElement(varPtr)) {
	arrayPtr = TclArrayContaining(varPtr);
    }

    traced = TclIsVarTraced(varPtr)
	    || (arrayPtr && (arrayPtr->flags & VAR_TRACED_UNSET));

    if (arrayPtr && (arrayPtr->flags & VAR_SEARCH_ACTIVE)) {
	DeleteSearches(iPtr, arrayPtr);
    } else if (varPtr->flags & VAR_SEARCH_ACTIVE) {
	DeleteSearches(iPtr, varPtr);
    }

Changes to tests/var.test.

1198
1199
1200
1201
1202
1203
1204





















1205
1206
1207
1208
1209
1210
1211
    unset -nocomplain $vn
} -body {
    array set $vn {a 1 b 2 c 3}
    array for $vn $vn {}
} -cleanup {
    unset -nocomplain $vn vn
} -result {}






















catch {namespace delete ns}
catch {unset arr}
catch {unset v}

catch {rename getbytes ""}
catch {rename p ""}







>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>







1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
    unset -nocomplain $vn
} -body {
    array set $vn {a 1 b 2 c 3}
    array for $vn $vn {}
} -cleanup {
    unset -nocomplain $vn vn
} -result {}
test var-23.15 {array for, [Bug e87bcf819f]} -setup {
    unset -nocomplain a
    array set a {m 1 n 2}
    upvar 0 a(n) l
    set unset unset
} -body {
    array for {k v} a {$unset l}
} -cleanup {
    unset -nocomplain a
} -returnCodes error -result {array changed during iteration}
test var-23.15.1 {array for, [Bug e87bcf819f]} -setup {
    unset -nocomplain a
    array set a {m 1 n 2}
    upvar 0 a(n) l
} -body {
    array for {k v} a {unset l}
} -cleanup {
    unset -nocomplain a
} -returnCodes error -result {array changed during iteration}



catch {namespace delete ns}
catch {unset arr}
catch {unset v}

catch {rename getbytes ""}
catch {rename p ""}