summaryrefslogtreecommitdiffstats
path: root/generic/tclExecute.c
diff options
context:
space:
mode:
authorgriffin <briang42@easystreet.net>2022-10-11 03:49:20 (GMT)
committergriffin <briang42@easystreet.net>2022-10-11 03:49:20 (GMT)
commit48ae5e307eac7d511835a8745094a296116c48d8 (patch)
tree78c09eee656d02d6a9f166f94bb74dd56c622549 /generic/tclExecute.c
parent80303ffb39c4b720448ff14a21ff4c061698f702 (diff)
downloadtcl-48ae5e307eac7d511835a8745094a296116c48d8.zip
tcl-48ae5e307eac7d511835a8745094a296116c48d8.tar.gz
tcl-48ae5e307eac7d511835a8745094a296116c48d8.tar.bz2
Modify AbstractList functions to include interp for error reporting. Other various improvements.
Diffstat (limited to 'generic/tclExecute.c')
-rw-r--r--generic/tclExecute.c44
1 files changed, 22 insertions, 22 deletions
diff --git a/generic/tclExecute.c b/generic/tclExecute.c
index 51a133b..dc27cd5 100644
--- a/generic/tclExecute.c
+++ b/generic/tclExecute.c
@@ -4871,15 +4871,17 @@ TEBCresume(
/* special case for AbstractList */
if (TclHasInternalRep(valuePtr,&tclAbstractListType)) {
- Tcl_AbstractListType *typePtr;
- typePtr = Tcl_AbstractListGetType(valuePtr);
- length = typePtr->lengthProc(valuePtr);
+ length = Tcl_AbstractListObjLength(valuePtr);
if (TclGetIntForIndexM(interp, value2Ptr, length-1, &index)!=TCL_OK) {
CACHE_STACK_INFO();
TRACE_ERROR(interp);
goto gotError;
}
- typePtr->indexProc(valuePtr, index, &objResultPtr);
+ if (Tcl_AbstractListObjIndex(interp, valuePtr, index, &objResultPtr)!=TCL_OK) {
+ CACHE_STACK_INFO();
+ TRACE_ERROR(interp);
+ goto gotError;
+ }
Tcl_IncrRefCount(objResultPtr); // reference held here
goto lindexDone;
}
@@ -4937,20 +4939,18 @@ TEBCresume(
/* special case for AbstractList */
if (TclHasInternalRep(valuePtr,&tclAbstractListType)) {
- Tcl_AbstractListType *typePtr;
- typePtr = Tcl_AbstractListGetType(valuePtr);
- length = typePtr->lengthProc(valuePtr);
+ length = Tcl_AbstractListObjLength(valuePtr);
/* Decode end-offset index values. */
-
index = TclIndexDecode(opnd, length-1);
/* Compute value @ index */
- if (index >= 0 && index < length) {
- typePtr->indexProc(valuePtr, index, &objResultPtr);
- } else {
- TclNewObj(objResultPtr);
+ if (Tcl_AbstractListObjIndex(interp, valuePtr, index, &objResultPtr)!=TCL_OK) {
+ CACHE_STACK_INFO();
+ TRACE_ERROR(interp);
+ goto gotError;
}
+
pcAdjustment = 5;
goto lindexFastPath2;
}
@@ -5150,18 +5150,15 @@ TEBCresume(
fromIdx = TclIndexDecode(fromIdx, objc - 1);
- {
- Tcl_AbstractListType *typePtr;
- typePtr = Tcl_AbstractListGetType(valuePtr);
-
- if (typePtr && TclAbstractListHasProc(valuePtr, TCL_ABSL_SLICE)) {
- objResultPtr = typePtr->sliceProc(valuePtr, fromIdx, toIdx);
- } else {
- objResultPtr = TclListObjRange(valuePtr, fromIdx, toIdx);
+ if (TclHasInternalRep(valuePtr,&tclAbstractListType)) {
+ if (Tcl_AbstractListObjRange(interp, valuePtr, fromIdx, toIdx, &objResultPtr) != TCL_OK) {
+ TRACE_ERROR(interp);
+ goto gotError;
}
+ } else {
+ objResultPtr = TclListObjRange(valuePtr, fromIdx, toIdx);
}
-
TRACE_APPEND(("\"%.30s\"", O2S(objResultPtr)));
NEXT_INST_F(9, 1, 1);
@@ -5188,7 +5185,10 @@ TEBCresume(
do {
if (isAbstractList) {
- Tcl_AbstractListObjIndex(value2Ptr, i, &o);
+ if (Tcl_AbstractListObjIndex(interp, value2Ptr, i, &o) != TCL_OK) {
+ TRACE_ERROR(interp);
+ goto gotError;
+ }
} else {
Tcl_ListObjIndex(NULL, value2Ptr, i, &o);
}