Compare commits
2
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
1a8e97ba85 | ||
|
|
39ce491b80 |
@@ -3562,7 +3562,7 @@ TclDictWithFinish(
|
||||
* If the dictionary variable doesn't exist, drop everything silently.
|
||||
*/
|
||||
|
||||
dictPtr = TclPtrGetVar(interp, varPtr, arrayPtr, part1Ptr, part2Ptr,
|
||||
dictPtr = TclPtrGetVarIdx(interp, varPtr, arrayPtr, part1Ptr, part2Ptr,
|
||||
TCL_LEAVE_ERR_MSG, index);
|
||||
if (dictPtr == NULL) {
|
||||
return TCL_OK;
|
||||
@@ -3645,8 +3645,8 @@ TclDictWithFinish(
|
||||
* Write back the outermost dictionary to the variable.
|
||||
*/
|
||||
|
||||
if (TclPtrSetVar(interp, varPtr, arrayPtr, part1Ptr, part2Ptr, dictPtr,
|
||||
TCL_LEAVE_ERR_MSG, index) == NULL) {
|
||||
if (TclPtrSetVarIdx(interp, varPtr, arrayPtr, part1Ptr, part2Ptr,
|
||||
dictPtr, TCL_LEAVE_ERR_MSG, index) == NULL) {
|
||||
if (allocdict) {
|
||||
TclDecrRefCount(dictPtr);
|
||||
}
|
||||
|
||||
+24
-21
@@ -3207,7 +3207,7 @@ TEBCresume(
|
||||
*/
|
||||
|
||||
DECACHE_STACK_INFO();
|
||||
objResultPtr = TclPtrGetVar(interp, varPtr, arrayPtr,
|
||||
objResultPtr = TclPtrGetVarIdx(interp, varPtr, arrayPtr,
|
||||
part1Ptr, part2Ptr, TCL_LEAVE_ERR_MSG, opnd);
|
||||
CACHE_STACK_INFO();
|
||||
if (!objResultPtr) {
|
||||
@@ -3454,7 +3454,7 @@ TEBCresume(
|
||||
|
||||
doCallPtrSetVar:
|
||||
DECACHE_STACK_INFO();
|
||||
objResultPtr = TclPtrSetVar(interp, varPtr, arrayPtr,
|
||||
objResultPtr = TclPtrSetVarIdx(interp, varPtr, arrayPtr,
|
||||
part1Ptr, part2Ptr, valuePtr, storeFlags, opnd);
|
||||
CACHE_STACK_INFO();
|
||||
if (!objResultPtr) {
|
||||
@@ -3590,7 +3590,7 @@ TEBCresume(
|
||||
VarHashRefCount(arrayPtr)++;
|
||||
}
|
||||
DECACHE_STACK_INFO();
|
||||
objResultPtr = TclPtrGetVar(interp, varPtr, arrayPtr,
|
||||
objResultPtr = TclPtrGetVarIdx(interp, varPtr, arrayPtr,
|
||||
part1Ptr, part2Ptr, TCL_LEAVE_ERR_MSG, opnd);
|
||||
CACHE_STACK_INFO();
|
||||
if (TclIsVarInHash(varPtr)) {
|
||||
@@ -3619,7 +3619,7 @@ TEBCresume(
|
||||
}
|
||||
}
|
||||
DECACHE_STACK_INFO();
|
||||
objResultPtr = TclPtrSetVar(interp, varPtr, arrayPtr, part1Ptr,
|
||||
objResultPtr = TclPtrSetVarIdx(interp, varPtr, arrayPtr, part1Ptr,
|
||||
part2Ptr, objResultPtr, TCL_LEAVE_ERR_MSG, opnd);
|
||||
CACHE_STACK_INFO();
|
||||
if (!objResultPtr) {
|
||||
@@ -3883,7 +3883,7 @@ TEBCresume(
|
||||
Tcl_DecrRefCount(incrPtr);
|
||||
} else {
|
||||
DECACHE_STACK_INFO();
|
||||
objResultPtr = TclPtrIncrObjVar(interp, varPtr, arrayPtr,
|
||||
objResultPtr = TclPtrIncrObjVarIdx(interp, varPtr, arrayPtr,
|
||||
part1Ptr, part2Ptr, incrPtr, TCL_LEAVE_ERR_MSG, opnd);
|
||||
CACHE_STACK_INFO();
|
||||
Tcl_DecrRefCount(incrPtr);
|
||||
@@ -4038,7 +4038,7 @@ TEBCresume(
|
||||
|
||||
slowUnsetScalar:
|
||||
DECACHE_STACK_INFO();
|
||||
if (TclPtrUnsetVar(interp, varPtr, NULL, NULL, NULL, flags,
|
||||
if (TclPtrUnsetVarIdx(interp, varPtr, NULL, NULL, NULL, flags,
|
||||
opnd) != TCL_OK && flags) {
|
||||
goto errorInUnset;
|
||||
}
|
||||
@@ -4090,7 +4090,7 @@ TEBCresume(
|
||||
if (flags & TCL_LEAVE_ERR_MSG) {
|
||||
goto errorInUnset;
|
||||
}
|
||||
} else if (TclPtrUnsetVar(interp, varPtr, arrayPtr, NULL, part2Ptr,
|
||||
} else if (TclPtrUnsetVarIdx(interp, varPtr, arrayPtr, NULL, part2Ptr,
|
||||
flags, opnd) != TCL_OK && (flags & TCL_LEAVE_ERR_MSG)) {
|
||||
goto errorInUnset;
|
||||
}
|
||||
@@ -4147,7 +4147,7 @@ TEBCresume(
|
||||
varPtr->value.objPtr = NULL;
|
||||
} else {
|
||||
DECACHE_STACK_INFO();
|
||||
TclPtrUnsetVar(interp, varPtr, NULL, NULL, NULL, 0, opnd);
|
||||
TclPtrUnsetVarIdx(interp, varPtr, NULL, NULL, NULL, 0, opnd);
|
||||
CACHE_STACK_INFO();
|
||||
}
|
||||
NEXT_INST_F(5, 0, 0);
|
||||
@@ -4363,7 +4363,7 @@ TEBCresume(
|
||||
if (TclIsVarInHash(otherPtr)) {
|
||||
VarHashRefCount(otherPtr)++;
|
||||
}
|
||||
} else if (TclPtrObjMakeUpvar(interp, otherPtr, NULL, 0,
|
||||
} else if (TclPtrObjMakeUpvarIdx(interp, otherPtr, NULL, 0,
|
||||
opnd) != TCL_OK) {
|
||||
TRACE_ERROR(interp);
|
||||
goto gotError;
|
||||
@@ -6785,7 +6785,7 @@ TEBCresume(
|
||||
}
|
||||
} else {
|
||||
DECACHE_STACK_INFO();
|
||||
if (TclPtrSetVar(interp, varPtr, NULL, NULL, NULL,
|
||||
if (TclPtrSetVarIdx(interp, varPtr, NULL, NULL, NULL,
|
||||
valuePtr, TCL_LEAVE_ERR_MSG, varIndex)==NULL){
|
||||
CACHE_STACK_INFO();
|
||||
TRACE_APPEND((
|
||||
@@ -6956,7 +6956,7 @@ TEBCresume(
|
||||
}
|
||||
} else {
|
||||
DECACHE_STACK_INFO();
|
||||
if (TclPtrSetVar(interp, varPtr, NULL, NULL, NULL,
|
||||
if (TclPtrSetVarIdx(interp, varPtr, NULL, NULL, NULL,
|
||||
valuePtr, TCL_LEAVE_ERR_MSG, varIndex)==NULL){
|
||||
CACHE_STACK_INFO();
|
||||
TRACE_APPEND(("ERROR init. index temp %d: %.30s",
|
||||
@@ -7179,7 +7179,8 @@ TEBCresume(
|
||||
dictPtr = varPtr->value.objPtr;
|
||||
} else {
|
||||
DECACHE_STACK_INFO();
|
||||
dictPtr = TclPtrGetVar(interp, varPtr, NULL,NULL,NULL, 0, opnd2);
|
||||
dictPtr = TclPtrGetVarIdx(interp, varPtr, NULL, NULL, NULL, 0,
|
||||
opnd2);
|
||||
CACHE_STACK_INFO();
|
||||
}
|
||||
if (dictPtr == NULL) {
|
||||
@@ -7253,7 +7254,7 @@ TEBCresume(
|
||||
} else {
|
||||
Tcl_IncrRefCount(dictPtr);
|
||||
DECACHE_STACK_INFO();
|
||||
objResultPtr = TclPtrSetVar(interp, varPtr, NULL, NULL, NULL,
|
||||
objResultPtr = TclPtrSetVarIdx(interp, varPtr, NULL, NULL, NULL,
|
||||
dictPtr, TCL_LEAVE_ERR_MSG, opnd2);
|
||||
CACHE_STACK_INFO();
|
||||
TclDecrRefCount(dictPtr);
|
||||
@@ -7282,7 +7283,8 @@ TEBCresume(
|
||||
dictPtr = varPtr->value.objPtr;
|
||||
} else {
|
||||
DECACHE_STACK_INFO();
|
||||
dictPtr = TclPtrGetVar(interp, varPtr, NULL, NULL, NULL, 0, opnd);
|
||||
dictPtr = TclPtrGetVarIdx(interp, varPtr, NULL, NULL, NULL, 0,
|
||||
opnd);
|
||||
CACHE_STACK_INFO();
|
||||
}
|
||||
if (dictPtr == NULL) {
|
||||
@@ -7391,7 +7393,7 @@ TEBCresume(
|
||||
} else {
|
||||
Tcl_IncrRefCount(dictPtr);
|
||||
DECACHE_STACK_INFO();
|
||||
objResultPtr = TclPtrSetVar(interp, varPtr, NULL, NULL, NULL,
|
||||
objResultPtr = TclPtrSetVarIdx(interp, varPtr, NULL, NULL, NULL,
|
||||
dictPtr, TCL_LEAVE_ERR_MSG, opnd);
|
||||
CACHE_STACK_INFO();
|
||||
TclDecrRefCount(dictPtr);
|
||||
@@ -7485,7 +7487,7 @@ TEBCresume(
|
||||
dictPtr = varPtr->value.objPtr;
|
||||
} else {
|
||||
DECACHE_STACK_INFO();
|
||||
dictPtr = TclPtrGetVar(interp, varPtr, NULL, NULL, NULL,
|
||||
dictPtr = TclPtrGetVarIdx(interp, varPtr, NULL, NULL, NULL,
|
||||
TCL_LEAVE_ERR_MSG, opnd);
|
||||
CACHE_STACK_INFO();
|
||||
if (dictPtr == NULL) {
|
||||
@@ -7518,7 +7520,7 @@ TEBCresume(
|
||||
TclObjUnsetVar2(interp,
|
||||
localName(iPtr->varFramePtr, duiPtr->varIndices[i]),
|
||||
NULL, 0);
|
||||
} else if (TclPtrSetVar(interp, varPtr, NULL, NULL, NULL,
|
||||
} else if (TclPtrSetVarIdx(interp, varPtr, NULL, NULL, NULL,
|
||||
valuePtr, TCL_LEAVE_ERR_MSG,
|
||||
duiPtr->varIndices[i]) == NULL) {
|
||||
CACHE_STACK_INFO();
|
||||
@@ -7545,7 +7547,8 @@ TEBCresume(
|
||||
dictPtr = varPtr->value.objPtr;
|
||||
} else {
|
||||
DECACHE_STACK_INFO();
|
||||
dictPtr = TclPtrGetVar(interp, varPtr, NULL, NULL, NULL, 0, opnd);
|
||||
dictPtr = TclPtrGetVarIdx(interp, varPtr, NULL, NULL, NULL, 0,
|
||||
opnd);
|
||||
CACHE_STACK_INFO();
|
||||
}
|
||||
if (dictPtr == NULL) {
|
||||
@@ -7575,8 +7578,8 @@ TEBCresume(
|
||||
valuePtr = var2Ptr->value.objPtr;
|
||||
} else {
|
||||
DECACHE_STACK_INFO();
|
||||
valuePtr = TclPtrGetVar(interp, var2Ptr, NULL, NULL, NULL, 0,
|
||||
duiPtr->varIndices[i]);
|
||||
valuePtr = TclPtrGetVarIdx(interp, var2Ptr, NULL, NULL, NULL,
|
||||
0, duiPtr->varIndices[i]);
|
||||
CACHE_STACK_INFO();
|
||||
}
|
||||
if (valuePtr == NULL) {
|
||||
@@ -7594,7 +7597,7 @@ TEBCresume(
|
||||
varPtr->value.objPtr = dictPtr;
|
||||
} else {
|
||||
DECACHE_STACK_INFO();
|
||||
objResultPtr = TclPtrSetVar(interp, varPtr, NULL, NULL, NULL,
|
||||
objResultPtr = TclPtrSetVarIdx(interp, varPtr, NULL, NULL, NULL,
|
||||
dictPtr, TCL_LEAVE_ERR_MSG, opnd);
|
||||
CACHE_STACK_INFO();
|
||||
if (objResultPtr == NULL) {
|
||||
|
||||
@@ -1011,6 +1011,32 @@ declare 251 {
|
||||
int TclRegisterLiteral(void *envPtr,
|
||||
const char *bytes, int length, int flags)
|
||||
}
|
||||
|
||||
# Exporting of the internal API to variables.
|
||||
|
||||
declare 252 {
|
||||
Tcl_Obj *TclPtrGetVar(Tcl_Interp *interp, Tcl_Var varPtr,
|
||||
Tcl_Var arrayPtr, Tcl_Obj *part1Ptr, Tcl_Obj *part2Ptr,
|
||||
const int flags)
|
||||
}
|
||||
declare 253 {
|
||||
Tcl_Obj *TclPtrSetVar(Tcl_Interp *interp, Tcl_Var varPtr,
|
||||
Tcl_Var arrayPtr, Tcl_Obj *part1Ptr, Tcl_Obj *part2Ptr,
|
||||
Tcl_Obj *newValuePtr, const int flags)
|
||||
}
|
||||
declare 254 {
|
||||
Tcl_Obj *TclPtrIncrObjVar(Tcl_Interp *interp, Tcl_Var varPtr,
|
||||
Tcl_Var arrayPtr, Tcl_Obj *part1Ptr, Tcl_Obj *part2Ptr,
|
||||
Tcl_Obj *incrPtr, const int flags)
|
||||
}
|
||||
declare 255 {
|
||||
int TclPtrObjMakeUpvar(Tcl_Interp *interp, Tcl_Var otherPtr,
|
||||
Tcl_Obj *myNamePtr, int myFlags)
|
||||
}
|
||||
declare 256 {
|
||||
int TclPtrUnsetVar(Tcl_Interp *interp, Tcl_Var varPtr, Tcl_Var arrayPtr,
|
||||
Tcl_Obj *part1Ptr, Tcl_Obj *part2Ptr, const int flags)
|
||||
}
|
||||
|
||||
##############################################################################
|
||||
|
||||
|
||||
+7
-6
@@ -3983,20 +3983,21 @@ MODULE_SCOPE Var * TclLookupArrayElement(Tcl_Interp *interp,
|
||||
const int flags, const char *msg,
|
||||
const int createPart1, const int createPart2,
|
||||
Var *arrayPtr, int index);
|
||||
MODULE_SCOPE Tcl_Obj * TclPtrGetVar(Tcl_Interp *interp,
|
||||
MODULE_SCOPE Tcl_Obj * TclPtrGetVarIdx(Tcl_Interp *interp,
|
||||
Var *varPtr, Var *arrayPtr, Tcl_Obj *part1Ptr,
|
||||
Tcl_Obj *part2Ptr, const int flags, int index);
|
||||
MODULE_SCOPE Tcl_Obj * TclPtrSetVar(Tcl_Interp *interp,
|
||||
MODULE_SCOPE Tcl_Obj * TclPtrSetVarIdx(Tcl_Interp *interp,
|
||||
Var *varPtr, Var *arrayPtr, Tcl_Obj *part1Ptr,
|
||||
Tcl_Obj *part2Ptr, Tcl_Obj *newValuePtr,
|
||||
const int flags, int index);
|
||||
MODULE_SCOPE Tcl_Obj * TclPtrIncrObjVar(Tcl_Interp *interp,
|
||||
MODULE_SCOPE Tcl_Obj * TclPtrIncrObjVarIdx(Tcl_Interp *interp,
|
||||
Var *varPtr, Var *arrayPtr, Tcl_Obj *part1Ptr,
|
||||
Tcl_Obj *part2Ptr, Tcl_Obj *incrPtr,
|
||||
const int flags, int index);
|
||||
MODULE_SCOPE int TclPtrObjMakeUpvar(Tcl_Interp *interp, Var *otherPtr,
|
||||
Tcl_Obj *myNamePtr, int myFlags, int index);
|
||||
MODULE_SCOPE int TclPtrUnsetVar(Tcl_Interp *interp, Var *varPtr,
|
||||
MODULE_SCOPE int TclPtrObjMakeUpvarIdx(Tcl_Interp *interp,
|
||||
Var *otherPtr, Tcl_Obj *myNamePtr, int myFlags,
|
||||
int index);
|
||||
MODULE_SCOPE int TclPtrUnsetVarIdx(Tcl_Interp *interp, Var *varPtr,
|
||||
Var *arrayPtr, Tcl_Obj *part1Ptr,
|
||||
Tcl_Obj *part2Ptr, const int flags,
|
||||
int index);
|
||||
|
||||
@@ -617,6 +617,28 @@ EXTERN void TclSetSlaveCancelFlags(Tcl_Interp *interp, int flags,
|
||||
/* 251 */
|
||||
EXTERN int TclRegisterLiteral(void *envPtr, const char *bytes,
|
||||
int length, int flags);
|
||||
/* 252 */
|
||||
EXTERN Tcl_Obj * TclPtrGetVar(Tcl_Interp *interp, Tcl_Var varPtr,
|
||||
Tcl_Var arrayPtr, Tcl_Obj *part1Ptr,
|
||||
Tcl_Obj *part2Ptr, const int flags);
|
||||
/* 253 */
|
||||
EXTERN Tcl_Obj * TclPtrSetVar(Tcl_Interp *interp, Tcl_Var varPtr,
|
||||
Tcl_Var arrayPtr, Tcl_Obj *part1Ptr,
|
||||
Tcl_Obj *part2Ptr, Tcl_Obj *newValuePtr,
|
||||
const int flags);
|
||||
/* 254 */
|
||||
EXTERN Tcl_Obj * TclPtrIncrObjVar(Tcl_Interp *interp, Tcl_Var varPtr,
|
||||
Tcl_Var arrayPtr, Tcl_Obj *part1Ptr,
|
||||
Tcl_Obj *part2Ptr, Tcl_Obj *incrPtr,
|
||||
const int flags);
|
||||
/* 255 */
|
||||
EXTERN int TclPtrObjMakeUpvar(Tcl_Interp *interp,
|
||||
Tcl_Var otherPtr, Tcl_Obj *myNamePtr,
|
||||
int myFlags);
|
||||
/* 256 */
|
||||
EXTERN int TclPtrUnsetVar(Tcl_Interp *interp, Tcl_Var varPtr,
|
||||
Tcl_Var arrayPtr, Tcl_Obj *part1Ptr,
|
||||
Tcl_Obj *part2Ptr, const int flags);
|
||||
|
||||
typedef struct TclIntStubs {
|
||||
int magic;
|
||||
@@ -874,6 +896,11 @@ typedef struct TclIntStubs {
|
||||
char * (*tclDoubleDigits) (double dv, int ndigits, int flags, int *decpt, int *signum, char **endPtr); /* 249 */
|
||||
void (*tclSetSlaveCancelFlags) (Tcl_Interp *interp, int flags, int force); /* 250 */
|
||||
int (*tclRegisterLiteral) (void *envPtr, const char *bytes, int length, int flags); /* 251 */
|
||||
Tcl_Obj * (*tclPtrGetVar) (Tcl_Interp *interp, Tcl_Var varPtr, Tcl_Var arrayPtr, Tcl_Obj *part1Ptr, Tcl_Obj *part2Ptr, const int flags); /* 252 */
|
||||
Tcl_Obj * (*tclPtrSetVar) (Tcl_Interp *interp, Tcl_Var varPtr, Tcl_Var arrayPtr, Tcl_Obj *part1Ptr, Tcl_Obj *part2Ptr, Tcl_Obj *newValuePtr, const int flags); /* 253 */
|
||||
Tcl_Obj * (*tclPtrIncrObjVar) (Tcl_Interp *interp, Tcl_Var varPtr, Tcl_Var arrayPtr, Tcl_Obj *part1Ptr, Tcl_Obj *part2Ptr, Tcl_Obj *incrPtr, const int flags); /* 254 */
|
||||
int (*tclPtrObjMakeUpvar) (Tcl_Interp *interp, Tcl_Var otherPtr, Tcl_Obj *myNamePtr, int myFlags); /* 255 */
|
||||
int (*tclPtrUnsetVar) (Tcl_Interp *interp, Tcl_Var varPtr, Tcl_Var arrayPtr, Tcl_Obj *part1Ptr, Tcl_Obj *part2Ptr, const int flags); /* 256 */
|
||||
} TclIntStubs;
|
||||
|
||||
extern const TclIntStubs *tclIntStubsPtr;
|
||||
@@ -1305,6 +1332,16 @@ extern const TclIntStubs *tclIntStubsPtr;
|
||||
(tclIntStubsPtr->tclSetSlaveCancelFlags) /* 250 */
|
||||
#define TclRegisterLiteral \
|
||||
(tclIntStubsPtr->tclRegisterLiteral) /* 251 */
|
||||
#define TclPtrGetVar \
|
||||
(tclIntStubsPtr->tclPtrGetVar) /* 252 */
|
||||
#define TclPtrSetVar \
|
||||
(tclIntStubsPtr->tclPtrSetVar) /* 253 */
|
||||
#define TclPtrIncrObjVar \
|
||||
(tclIntStubsPtr->tclPtrIncrObjVar) /* 254 */
|
||||
#define TclPtrObjMakeUpvar \
|
||||
(tclIntStubsPtr->tclPtrObjMakeUpvar) /* 255 */
|
||||
#define TclPtrUnsetVar \
|
||||
(tclIntStubsPtr->tclPtrUnsetVar) /* 256 */
|
||||
|
||||
#endif /* defined(USE_TCL_STUBS) */
|
||||
|
||||
|
||||
@@ -664,6 +664,11 @@ static const TclIntStubs tclIntStubs = {
|
||||
TclDoubleDigits, /* 249 */
|
||||
TclSetSlaveCancelFlags, /* 250 */
|
||||
TclRegisterLiteral, /* 251 */
|
||||
TclPtrGetVar, /* 252 */
|
||||
TclPtrSetVar, /* 253 */
|
||||
TclPtrIncrObjVar, /* 254 */
|
||||
TclPtrObjMakeUpvar, /* 255 */
|
||||
TclPtrUnsetVar, /* 256 */
|
||||
};
|
||||
|
||||
static const TclIntPlatStubs tclIntPlatStubs = {
|
||||
|
||||
+247
-28
@@ -1247,7 +1247,7 @@ Tcl_ObjGetVar2(
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return TclPtrGetVar(interp, varPtr, arrayPtr, part1Ptr, part2Ptr,
|
||||
return TclPtrGetVarIdx(interp, varPtr, arrayPtr, part1Ptr, part2Ptr,
|
||||
flags, -1);
|
||||
}
|
||||
|
||||
@@ -1275,6 +1275,52 @@ Tcl_ObjGetVar2(
|
||||
|
||||
Tcl_Obj *
|
||||
TclPtrGetVar(
|
||||
Tcl_Interp *interp, /* Command interpreter in which variable is to
|
||||
* be looked up. */
|
||||
Tcl_Var varPtr, /* The variable to be read.*/
|
||||
Tcl_Var arrayPtr, /* NULL for scalar variables, pointer to the
|
||||
* containing array otherwise. */
|
||||
Tcl_Obj *part1Ptr, /* Name of an array (if part2 is non-NULL) or
|
||||
* the name of a variable. */
|
||||
Tcl_Obj *part2Ptr, /* If non-NULL, gives the name of an element
|
||||
* in the array part1. */
|
||||
const int flags) /* OR-ed combination of TCL_GLOBAL_ONLY, and
|
||||
* TCL_LEAVE_ERR_MSG bits. */
|
||||
{
|
||||
if (varPtr == NULL) {
|
||||
Tcl_Panic("varPtr must not be NULL");
|
||||
}
|
||||
if (part1Ptr == NULL) {
|
||||
Tcl_Panic("part1Ptr must not be NULL");
|
||||
}
|
||||
return TclPtrGetVarIdx(interp, (Var *) varPtr, (Var *) arrayPtr,
|
||||
part1Ptr, part2Ptr, flags, -1);
|
||||
}
|
||||
|
||||
/*
|
||||
*----------------------------------------------------------------------
|
||||
*
|
||||
* TclPtrGetVarIdx --
|
||||
*
|
||||
* Return the value of a Tcl variable as a Tcl object, given the pointers
|
||||
* to the variable's (and possibly containing array's) VAR structure.
|
||||
*
|
||||
* Results:
|
||||
* The return value points to the current object value of the variable
|
||||
* given by varPtr. If the specified variable doesn't exist, or if there
|
||||
* is a clash in array usage, then NULL is returned and a message will be
|
||||
* left in the interpreter's result if the TCL_LEAVE_ERR_MSG flag is set.
|
||||
*
|
||||
* Side effects:
|
||||
* The ref count for the returned object is _not_ incremented to reflect
|
||||
* the returned reference; if you want to keep a reference to the object
|
||||
* you must increment its ref count yourself.
|
||||
*
|
||||
*----------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
Tcl_Obj *
|
||||
TclPtrGetVarIdx(
|
||||
Tcl_Interp *interp, /* Command interpreter in which variable is to
|
||||
* be looked up. */
|
||||
register Var *varPtr, /* The variable to be read.*/
|
||||
@@ -1614,7 +1660,7 @@ Tcl_ObjSetVar2(
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return TclPtrSetVar(interp, varPtr, arrayPtr, part1Ptr, part2Ptr,
|
||||
return TclPtrSetVarIdx(interp, varPtr, arrayPtr, part1Ptr, part2Ptr,
|
||||
newValuePtr, flags, -1);
|
||||
}
|
||||
|
||||
@@ -1645,6 +1691,60 @@ Tcl_ObjSetVar2(
|
||||
|
||||
Tcl_Obj *
|
||||
TclPtrSetVar(
|
||||
Tcl_Interp *interp, /* Command interpreter in which variable is to
|
||||
* be looked up. */
|
||||
Tcl_Var varPtr, /* Reference to the variable to set. */
|
||||
Tcl_Var arrayPtr, /* Reference to the array containing the
|
||||
* variable, or NULL if the variable is a
|
||||
* scalar. */
|
||||
Tcl_Obj *part1Ptr, /* Name of an array (if part2 is non-NULL) or
|
||||
* the name of a variable. */
|
||||
Tcl_Obj *part2Ptr, /* If non-NULL, gives the name of an element
|
||||
* in the array part1. */
|
||||
Tcl_Obj *newValuePtr, /* New value for variable. */
|
||||
const int flags) /* OR-ed combination of TCL_GLOBAL_ONLY, and
|
||||
* TCL_LEAVE_ERR_MSG bits. */
|
||||
{
|
||||
if (varPtr == NULL) {
|
||||
Tcl_Panic("varPtr must not be NULL");
|
||||
}
|
||||
if (part1Ptr == NULL) {
|
||||
Tcl_Panic("part1Ptr must not be NULL");
|
||||
}
|
||||
if (newValuePtr == NULL) {
|
||||
Tcl_Panic("newValuePtr must not be NULL");
|
||||
}
|
||||
return TclPtrSetVarIdx(interp, (Var *) varPtr, (Var *) arrayPtr,
|
||||
part1Ptr, part2Ptr, newValuePtr, flags, -1);
|
||||
}
|
||||
|
||||
/*
|
||||
*----------------------------------------------------------------------
|
||||
*
|
||||
* TclPtrSetVarIdx --
|
||||
*
|
||||
* This function is the same as Tcl_SetVar2Ex above, except that it
|
||||
* requires pointers to the variable's Var structs in addition to the
|
||||
* variable names.
|
||||
*
|
||||
* Results:
|
||||
* Returns a pointer to the Tcl_Obj holding the new value of the
|
||||
* variable. If the write operation was disallowed because an array was
|
||||
* expected but not found (or vice versa), then NULL is returned; if the
|
||||
* TCL_LEAVE_ERR_MSG flag is set, then an explanatory message will be
|
||||
* left in the interpreter's result. Note that the returned object may
|
||||
* not be the same one referenced by newValuePtr; this is because
|
||||
* variable traces may modify the variable's value.
|
||||
*
|
||||
* Side effects:
|
||||
* The value of the given variable is set. If either the array or the
|
||||
* entry didn't exist then a new variable is created.
|
||||
*
|
||||
*----------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
Tcl_Obj *
|
||||
TclPtrSetVarIdx(
|
||||
Tcl_Interp *interp, /* Command interpreter in which variable is to
|
||||
* be looked up. */
|
||||
register Var *varPtr, /* Reference to the variable to set. */
|
||||
@@ -1889,7 +1989,7 @@ TclIncrObjVar2(
|
||||
"\n (reading value of variable to increment)");
|
||||
return NULL;
|
||||
}
|
||||
return TclPtrIncrObjVar(interp, varPtr, arrayPtr, part1Ptr, part2Ptr,
|
||||
return TclPtrIncrObjVarIdx(interp, varPtr, arrayPtr, part1Ptr, part2Ptr,
|
||||
incrPtr, flags, -1);
|
||||
}
|
||||
|
||||
@@ -1920,6 +2020,62 @@ TclIncrObjVar2(
|
||||
|
||||
Tcl_Obj *
|
||||
TclPtrIncrObjVar(
|
||||
Tcl_Interp *interp, /* Command interpreter in which variable is to
|
||||
* be found. */
|
||||
Tcl_Var varPtr, /* Reference to the variable to set. */
|
||||
Tcl_Var arrayPtr, /* Reference to the array containing the
|
||||
* variable, or NULL if the variable is a
|
||||
* scalar. */
|
||||
Tcl_Obj *part1Ptr, /* Points to an object holding the name of an
|
||||
* array (if part2 is non-NULL) or the name of
|
||||
* a variable. */
|
||||
Tcl_Obj *part2Ptr, /* If non-null, points to an object holding
|
||||
* the name of an element in the array
|
||||
* part1Ptr. */
|
||||
Tcl_Obj *incrPtr, /* Increment value. */
|
||||
/* TODO: Which of these flag values really make sense? */
|
||||
const int flags) /* Various flags that tell how to incr value:
|
||||
* any of TCL_GLOBAL_ONLY, TCL_NAMESPACE_ONLY,
|
||||
* TCL_APPEND_VALUE, TCL_LIST_ELEMENT,
|
||||
* TCL_LEAVE_ERR_MSG. */
|
||||
{
|
||||
if (varPtr == NULL) {
|
||||
Tcl_Panic("varPtr must not be NULL");
|
||||
}
|
||||
if (part1Ptr == NULL) {
|
||||
Tcl_Panic("part1Ptr must not be NULL");
|
||||
}
|
||||
return TclPtrIncrObjVarIdx(interp, (Var *) varPtr, (Var *) arrayPtr,
|
||||
part1Ptr, part2Ptr, incrPtr, flags, -1);
|
||||
}
|
||||
|
||||
/*
|
||||
*----------------------------------------------------------------------
|
||||
*
|
||||
* TclPtrIncrObjVarIdx --
|
||||
*
|
||||
* Given the pointers to a variable and possible containing array,
|
||||
* increment the Tcl object value of the variable by a Tcl_Obj increment.
|
||||
*
|
||||
* Results:
|
||||
* Returns a pointer to the Tcl_Obj holding the new value of the
|
||||
* variable. If the specified variable doesn't exist, or there is a clash
|
||||
* in array usage, or an error occurs while executing variable traces,
|
||||
* then NULL is returned and a message will be left in the interpreter's
|
||||
* result.
|
||||
*
|
||||
* Side effects:
|
||||
* The value of the given variable is incremented by the specified
|
||||
* amount. If either the array or the entry didn't exist then a new
|
||||
* variable is created. The ref count for the returned object is _not_
|
||||
* incremented to reflect the returned reference; if you want to keep a
|
||||
* reference to the object you must increment its ref count yourself.
|
||||
*
|
||||
*----------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
Tcl_Obj *
|
||||
TclPtrIncrObjVarIdx(
|
||||
Tcl_Interp *interp, /* Command interpreter in which variable is to
|
||||
* be found. */
|
||||
Var *varPtr, /* Reference to the variable to set. */
|
||||
@@ -1947,8 +2103,8 @@ TclPtrIncrObjVar(
|
||||
if (TclIsVarInHash(varPtr)) {
|
||||
VarHashRefCount(varPtr)++;
|
||||
}
|
||||
varValuePtr = TclPtrGetVar(interp, varPtr, arrayPtr, part1Ptr, part2Ptr,
|
||||
flags, index);
|
||||
varValuePtr = TclPtrGetVarIdx(interp, varPtr, arrayPtr, part1Ptr,
|
||||
part2Ptr, flags, index);
|
||||
if (TclIsVarInHash(varPtr)) {
|
||||
VarHashRefCount(varPtr)--;
|
||||
}
|
||||
@@ -1960,8 +2116,8 @@ TclPtrIncrObjVar(
|
||||
varValuePtr = Tcl_DuplicateObj(varValuePtr);
|
||||
|
||||
if (TCL_OK == TclIncrObj(interp, varValuePtr, incrPtr)) {
|
||||
return TclPtrSetVar(interp, varPtr, arrayPtr, part1Ptr, part2Ptr,
|
||||
varValuePtr, flags, index);
|
||||
return TclPtrSetVarIdx(interp, varPtr, arrayPtr, part1Ptr,
|
||||
part2Ptr, varValuePtr, flags, index);
|
||||
} else {
|
||||
Tcl_DecrRefCount(varValuePtr);
|
||||
return NULL;
|
||||
@@ -1977,8 +2133,8 @@ TclPtrIncrObjVar(
|
||||
* is the way to make that happen.
|
||||
*/
|
||||
|
||||
return TclPtrSetVar(interp, varPtr, arrayPtr, part1Ptr, part2Ptr,
|
||||
varValuePtr, flags, index);
|
||||
return TclPtrSetVarIdx(interp, varPtr, arrayPtr, part1Ptr,
|
||||
part2Ptr, varValuePtr, flags, index);
|
||||
} else {
|
||||
return NULL;
|
||||
}
|
||||
@@ -2127,8 +2283,8 @@ TclObjUnsetVar2(
|
||||
return TCL_ERROR;
|
||||
}
|
||||
|
||||
return TclPtrUnsetVar(interp, varPtr, arrayPtr, part1Ptr, part2Ptr, flags,
|
||||
-1);
|
||||
return TclPtrUnsetVarIdx(interp, varPtr, arrayPtr, part1Ptr, part2Ptr,
|
||||
flags, -1);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -2155,6 +2311,53 @@ TclObjUnsetVar2(
|
||||
|
||||
int
|
||||
TclPtrUnsetVar(
|
||||
Tcl_Interp *interp, /* Command interpreter in which varName is to
|
||||
* be looked up. */
|
||||
Tcl_Var varPtr, /* The variable to be unset. */
|
||||
Tcl_Var arrayPtr, /* NULL for scalar variables, pointer to the
|
||||
* containing array otherwise. */
|
||||
Tcl_Obj *part1Ptr, /* Name of an array (if part2 is non-NULL) or
|
||||
* the name of a variable. */
|
||||
Tcl_Obj *part2Ptr, /* If non-NULL, gives the name of an element
|
||||
* in the array part1. */
|
||||
const int flags) /* OR-ed combination of any of
|
||||
* TCL_GLOBAL_ONLY, TCL_NAMESPACE_ONLY,
|
||||
* TCL_LEAVE_ERR_MSG. */
|
||||
{
|
||||
if (varPtr == NULL) {
|
||||
Tcl_Panic("varPtr must not be NULL");
|
||||
}
|
||||
if (part1Ptr == NULL) {
|
||||
Tcl_Panic("part1Ptr must not be NULL");
|
||||
}
|
||||
return TclPtrUnsetVarIdx(interp, (Var *) varPtr, (Var *) arrayPtr,
|
||||
part1Ptr, part2Ptr, flags, -1);
|
||||
}
|
||||
|
||||
/*
|
||||
*----------------------------------------------------------------------
|
||||
*
|
||||
* TclPtrUnsetVarIdx --
|
||||
*
|
||||
* Delete a variable, given the pointers to the variable's (and possibly
|
||||
* containing array's) VAR structure.
|
||||
*
|
||||
* Results:
|
||||
* Returns TCL_OK if the variable was successfully deleted, TCL_ERROR if
|
||||
* the variable can't be unset. In the event of an error, if the
|
||||
* TCL_LEAVE_ERR_MSG flag is set then an error message is left in the
|
||||
* interp's result.
|
||||
*
|
||||
* Side effects:
|
||||
* If varPtr and arrayPtr indicate a local or global variable in interp,
|
||||
* it is deleted. If varPtr is an array reference and part2Ptr is NULL,
|
||||
* then the whole array is deleted.
|
||||
*
|
||||
*----------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
int
|
||||
TclPtrUnsetVarIdx(
|
||||
Tcl_Interp *interp, /* Command interpreter in which varName is to
|
||||
* be looked up. */
|
||||
register Var *varPtr, /* The variable to be unset. */
|
||||
@@ -2504,11 +2707,11 @@ Tcl_AppendObjCmd(
|
||||
/*
|
||||
* Note that we do not need to increase the refCount of the Var
|
||||
* pointers: should a trace delete the variable, the return value
|
||||
* of TclPtrSetVar will be NULL or emptyObjPtr, and we will not
|
||||
* of TclPtrSetVarIdx will be NULL or emptyObjPtr, and we will not
|
||||
* access the variable again.
|
||||
*/
|
||||
|
||||
varValuePtr = TclPtrSetVar(interp, varPtr, arrayPtr, objv[1],
|
||||
varValuePtr = TclPtrSetVarIdx(interp, varPtr, arrayPtr, objv[1],
|
||||
NULL, objv[i], TCL_APPEND_VALUE|TCL_LEAVE_ERR_MSG, -1);
|
||||
if ((varValuePtr == NULL) ||
|
||||
(varValuePtr == ((Interp *) interp)->emptyObjPtr)) {
|
||||
@@ -2588,7 +2791,7 @@ Tcl_LappendObjCmd(
|
||||
createdNewObj = 0;
|
||||
|
||||
/*
|
||||
* Protect the variable pointers around the TclPtrGetVar call
|
||||
* Protect the variable pointers around the TclPtrGetVarIdx call
|
||||
* to insure that they remain valid even if the variable was undefined
|
||||
* and unused.
|
||||
*/
|
||||
@@ -2604,7 +2807,7 @@ Tcl_LappendObjCmd(
|
||||
if (arrayPtr && TclIsVarInHash(arrayPtr)) {
|
||||
VarHashRefCount(arrayPtr)++;
|
||||
}
|
||||
varValuePtr = TclPtrGetVar(interp, varPtr, arrayPtr, objv[1], NULL,
|
||||
varValuePtr = TclPtrGetVarIdx(interp, varPtr, arrayPtr, objv[1], NULL,
|
||||
TCL_LEAVE_ERR_MSG, -1);
|
||||
if (TclIsVarInHash(varPtr)) {
|
||||
VarHashRefCount(varPtr)--;
|
||||
@@ -2645,7 +2848,7 @@ Tcl_LappendObjCmd(
|
||||
* and we didn't create the variable.
|
||||
*/
|
||||
|
||||
newValuePtr = TclPtrSetVar(interp, varPtr, arrayPtr, objv[1], NULL,
|
||||
newValuePtr = TclPtrSetVarIdx(interp, varPtr, arrayPtr, objv[1], NULL,
|
||||
varValuePtr, TCL_LEAVE_ERR_MSG, -1);
|
||||
if (newValuePtr == NULL) {
|
||||
return TCL_ERROR;
|
||||
@@ -2746,7 +2949,7 @@ TclArraySet(
|
||||
keyPtr, TCL_LEAVE_ERR_MSG, "set", 1, 1, varPtr, -1);
|
||||
|
||||
if ((elemVarPtr == NULL) ||
|
||||
(TclPtrSetVar(interp, elemVarPtr, varPtr, arrayNameObj,
|
||||
(TclPtrSetVarIdx(interp, elemVarPtr, varPtr, arrayNameObj,
|
||||
keyPtr, valuePtr, TCL_LEAVE_ERR_MSG, -1) == NULL)) {
|
||||
Tcl_DictObjDone(&search);
|
||||
return TCL_ERROR;
|
||||
@@ -2779,8 +2982,8 @@ TclArraySet(
|
||||
|
||||
/*
|
||||
* We needn't worry about traces invalidating arrayPtr: should that be
|
||||
* the case, TclPtrSetVar will return NULL so that we break out of the
|
||||
* loop and return an error.
|
||||
* the case, TclPtrSetVarIdx will return NULL so that we break out of
|
||||
* the loop and return an error.
|
||||
*/
|
||||
|
||||
copyListObj = TclListObjCopy(NULL, arrayElemObj);
|
||||
@@ -2789,7 +2992,7 @@ TclArraySet(
|
||||
elemPtrs[i], TCL_LEAVE_ERR_MSG, "set", 1, 1, varPtr, -1);
|
||||
|
||||
if ((elemVarPtr == NULL) ||
|
||||
(TclPtrSetVar(interp, elemVarPtr, varPtr, arrayNameObj,
|
||||
(TclPtrSetVarIdx(interp, elemVarPtr, varPtr, arrayNameObj,
|
||||
elemPtrs[i],elemPtrs[i+1],TCL_LEAVE_ERR_MSG,-1) == NULL)){
|
||||
result = TCL_ERROR;
|
||||
break;
|
||||
@@ -3937,8 +4140,8 @@ ArrayUnsetCmd(
|
||||
if (!varPtr2 || TclIsVarUndefined(varPtr2)) {
|
||||
return TCL_OK;
|
||||
}
|
||||
return TclPtrUnsetVar(interp, varPtr2, varPtr, varNameObj, patternObj,
|
||||
unsetFlags, -1);
|
||||
return TclPtrUnsetVarIdx(interp, varPtr2, varPtr, varNameObj,
|
||||
patternObj, unsetFlags, -1);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -3986,7 +4189,7 @@ ArrayUnsetCmd(
|
||||
|
||||
nameObj = VarHashGetKey(varPtr2);
|
||||
if (Tcl_StringMatch(TclGetString(nameObj), pattern)
|
||||
&& TclPtrUnsetVar(interp, varPtr2, varPtr, varNameObj,
|
||||
&& TclPtrUnsetVarIdx(interp, varPtr2, varPtr, varNameObj,
|
||||
nameObj, unsetFlags, -1) != TCL_OK) {
|
||||
/*
|
||||
* If we incremented a refcount, we must decrement it here as we
|
||||
@@ -4133,7 +4336,7 @@ ObjMakeUpvar(
|
||||
}
|
||||
}
|
||||
|
||||
return TclPtrObjMakeUpvar(interp, otherPtr, myNamePtr, myFlags, index);
|
||||
return TclPtrObjMakeUpvarIdx(interp, otherPtr, myNamePtr, myFlags, index);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -4175,17 +4378,32 @@ TclPtrMakeUpvar(
|
||||
myNamePtr = Tcl_NewStringObj(myName, -1);
|
||||
Tcl_IncrRefCount(myNamePtr);
|
||||
}
|
||||
result = TclPtrObjMakeUpvar(interp, otherPtr, myNamePtr, myFlags, index);
|
||||
result = TclPtrObjMakeUpvarIdx(interp, otherPtr, myNamePtr, myFlags,
|
||||
index);
|
||||
if (myNamePtr) {
|
||||
Tcl_DecrRefCount(myNamePtr);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
int
|
||||
TclPtrObjMakeUpvar(
|
||||
Tcl_Interp *interp, /* Interpreter containing variables. Used for
|
||||
* error messages, too. */
|
||||
Tcl_Var otherPtr, /* Pointer to the variable being linked-to. */
|
||||
Tcl_Obj *myNamePtr, /* Name of variable which will refer to
|
||||
* otherP1/otherP2. Must be a scalar. */
|
||||
int myFlags) /* 0, TCL_GLOBAL_ONLY or TCL_NAMESPACE_ONLY:
|
||||
* indicates scope of myName. */
|
||||
{
|
||||
return TclPtrObjMakeUpvarIdx(interp, (Var *) otherPtr, myNamePtr, myFlags,
|
||||
-1);
|
||||
}
|
||||
|
||||
/* Callers must Incr myNamePtr if they plan to Decr it. */
|
||||
|
||||
int
|
||||
TclPtrObjMakeUpvar(
|
||||
TclPtrObjMakeUpvarIdx(
|
||||
Tcl_Interp *interp, /* Interpreter containing variables. Used for
|
||||
* error messages, too. */
|
||||
Var *otherPtr, /* Pointer to the variable being linked-to. */
|
||||
@@ -4654,8 +4872,9 @@ Tcl_VariableObjCmd(
|
||||
*/
|
||||
|
||||
if (i+1 < objc) { /* A value was specified. */
|
||||
varValuePtr = TclPtrSetVar(interp, varPtr, arrayPtr, varNamePtr,
|
||||
NULL, objv[i+1], TCL_NAMESPACE_ONLY|TCL_LEAVE_ERR_MSG,-1);
|
||||
varValuePtr = TclPtrSetVarIdx(interp, varPtr, arrayPtr,
|
||||
varNamePtr, NULL, objv[i+1],
|
||||
(TCL_NAMESPACE_ONLY | TCL_LEAVE_ERR_MSG), -1);
|
||||
if (varValuePtr == NULL) {
|
||||
return TCL_ERROR;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user