diff options
author | griffin <briang42@easystreet.net> | 2022-10-11 03:49:20 (GMT) |
---|---|---|
committer | griffin <briang42@easystreet.net> | 2022-10-11 03:49:20 (GMT) |
commit | 48ae5e307eac7d511835a8745094a296116c48d8 (patch) | |
tree | 78c09eee656d02d6a9f166f94bb74dd56c622549 /generic/tclExecute.c | |
parent | 80303ffb39c4b720448ff14a21ff4c061698f702 (diff) | |
download | tcl-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.c | 44 |
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); } |