summaryrefslogtreecommitdiffstats
path: root/generic/tclEnsemble.c
diff options
context:
space:
mode:
Diffstat (limited to 'generic/tclEnsemble.c')
-rw-r--r--generic/tclEnsemble.c44
1 files changed, 31 insertions, 13 deletions
diff --git a/generic/tclEnsemble.c b/generic/tclEnsemble.c
index ccd43b9..850d5d0 100644
--- a/generic/tclEnsemble.c
+++ b/generic/tclEnsemble.c
@@ -84,18 +84,18 @@ static const Tcl_ObjType ensembleCmdType = {
NULL /* setFromAnyProc */
};
-#define ECRSetIntRep(objPtr, ecRepPtr) \
+#define ECRSetInternalRep(objPtr, ecRepPtr) \
do { \
- Tcl_ObjIntRep ir; \
+ Tcl_ObjInternalRep ir; \
ir.twoPtrValue.ptr1 = (ecRepPtr); \
ir.twoPtrValue.ptr2 = NULL; \
- Tcl_StoreIntRep((objPtr), &ensembleCmdType, &ir); \
+ Tcl_StoreInternalRep((objPtr), &ensembleCmdType, &ir); \
} while (0)
-#define ECRGetIntRep(objPtr, ecRepPtr) \
+#define ECRGetInternalRep(objPtr, ecRepPtr) \
do { \
- const Tcl_ObjIntRep *irPtr; \
- irPtr = TclFetchIntRep((objPtr), &ensembleCmdType); \
+ const Tcl_ObjInternalRep *irPtr; \
+ irPtr = TclFetchInternalRep((objPtr), &ensembleCmdType); \
(ecRepPtr) = irPtr ? (EnsembleCmdRep *)irPtr->twoPtrValue.ptr1 : NULL; \
} while (0)
@@ -1759,7 +1759,7 @@ NsEnsembleImplementationCmdNR(
*/
EnsembleCmdRep *ensembleCmd;
- ECRGetIntRep(subObj, ensembleCmd);
+ ECRGetInternalRep(subObj, ensembleCmd);
if (ensembleCmd) {
if (ensembleCmd->epoch == ensemblePtr->epoch &&
ensembleCmd->token == (Command *)ensemblePtr->token) {
@@ -2201,6 +2201,18 @@ TclSpellFix(
TclNRAddCallback(interp, TclNRReleaseValues, fix, NULL, NULL, NULL);
}
+Tcl_Obj *const *TclEnsembleGetRewriteValues(
+ Tcl_Interp *interp /* Current interpreter. */
+)
+{
+ Interp *iPtr = (Interp *) interp;
+ Tcl_Obj *const *origObjv = iPtr->ensembleRewrite.sourceObjs;
+ if (origObjv[0] == NULL) {
+ origObjv = (Tcl_Obj *const *)origObjv[2];
+ }
+ return origObjv;
+}
+
/*
*----------------------------------------------------------------------
*
@@ -2225,12 +2237,18 @@ TclFetchEnsembleRoot(
int objc,
int *objcPtr)
{
+ Tcl_Obj *const *sourceObjs;
Interp *iPtr = (Interp *) interp;
if (iPtr->ensembleRewrite.sourceObjs) {
*objcPtr = objc + iPtr->ensembleRewrite.numRemovedObjs
- iPtr->ensembleRewrite.numInsertedObjs;
- return iPtr->ensembleRewrite.sourceObjs;
+ if (iPtr->ensembleRewrite.sourceObjs[0] == NULL) {
+ sourceObjs = (Tcl_Obj *const *)iPtr->ensembleRewrite.sourceObjs[1];
+ } else {
+ sourceObjs = iPtr->ensembleRewrite.sourceObjs;
+ }
+ return sourceObjs;
}
*objcPtr = objc;
return objv;
@@ -2406,7 +2424,7 @@ MakeCachedEnsembleCommand(
{
EnsembleCmdRep *ensembleCmd;
- ECRGetIntRep(objPtr, ensembleCmd);
+ ECRGetInternalRep(objPtr, ensembleCmd);
if (ensembleCmd) {
TclCleanupCommandMacro(ensembleCmd->token);
if (ensembleCmd->fix) {
@@ -2419,7 +2437,7 @@ MakeCachedEnsembleCommand(
*/
ensembleCmd = (EnsembleCmdRep *)ckalloc(sizeof(EnsembleCmdRep));
- ECRSetIntRep(objPtr, ensembleCmd);
+ ECRSetInternalRep(objPtr, ensembleCmd);
}
/*
@@ -2829,7 +2847,7 @@ FreeEnsembleCmdRep(
{
EnsembleCmdRep *ensembleCmd;
- ECRGetIntRep(objPtr, ensembleCmd);
+ ECRGetInternalRep(objPtr, ensembleCmd);
TclCleanupCommandMacro(ensembleCmd->token);
if (ensembleCmd->fix) {
Tcl_DecrRefCount(ensembleCmd->fix);
@@ -2863,8 +2881,8 @@ DupEnsembleCmdRep(
EnsembleCmdRep *ensembleCmd;
EnsembleCmdRep *ensembleCopy = (EnsembleCmdRep *)ckalloc(sizeof(EnsembleCmdRep));
- ECRGetIntRep(objPtr, ensembleCmd);
- ECRSetIntRep(copyPtr, ensembleCopy);
+ ECRGetInternalRep(objPtr, ensembleCmd);
+ ECRSetInternalRep(copyPtr, ensembleCopy);
ensembleCopy->epoch = ensembleCmd->epoch;
ensembleCopy->token = ensembleCmd->token;