From 731a9a73cd8afcf688c7733260be9431a95caece Mon Sep 17 00:00:00 2001 From: "jan.nijtmans" Date: Tue, 5 Feb 2013 12:37:10 +0000 Subject: Enable "list" optimize, fix cmdIL-1.29 test case --- generic/tclListObj.c | 12 ++++++++++++ generic/tclStringObj.c | 3 ++- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/generic/tclListObj.c b/generic/tclListObj.c index ca9286d..a6985e0 100644 --- a/generic/tclListObj.c +++ b/generic/tclListObj.c @@ -647,6 +647,10 @@ Tcl_ListObjAppendElement( * representation has changed. */ + if ((listPtr)->internalRep.twoPtrValue.ptr2) { + ckfree((listPtr)->internalRep.twoPtrValue.ptr2); + (listPtr)->internalRep.twoPtrValue.ptr2 = NULL; + } Tcl_InvalidateStringRep(listPtr); return TCL_OK; } @@ -997,6 +1001,10 @@ Tcl_ListObjReplace( * reflects the list's internal representation. */ + if ((listPtr)->internalRep.twoPtrValue.ptr2) { + ckfree((listPtr)->internalRep.twoPtrValue.ptr2); + (listPtr)->internalRep.twoPtrValue.ptr2 = NULL; + } Tcl_InvalidateStringRep(listPtr); return TCL_OK; } @@ -1440,6 +1448,10 @@ TclLsetFlat( * of all containing lists. */ + if ((objPtr)->internalRep.twoPtrValue.ptr2) { + ckfree((objPtr)->internalRep.twoPtrValue.ptr2); + (objPtr)->internalRep.twoPtrValue.ptr2 = NULL; + } Tcl_InvalidateStringRep(objPtr); } diff --git a/generic/tclStringObj.c b/generic/tclStringObj.c index 099bb27..b3937e2 100644 --- a/generic/tclStringObj.c +++ b/generic/tclStringObj.c @@ -409,7 +409,7 @@ Tcl_GetCharLength( (objPtr->typePtr == &tclExprCodeType) || (objPtr->typePtr == &tclFsPathType) || (objPtr->typePtr == &tclIndexType) || - /*(objPtr->typePtr == &tclListType) || This one causes cmdIL-1.29 failure */ + (objPtr->typePtr == &tclListType) || (objPtr->typePtr == &tclNsNameType) || (objPtr->typePtr == &tclProcBodyType)) { /* Try to convert object to String type, but remember old intRep. */ @@ -417,6 +417,7 @@ Tcl_GetCharLength( Tcl_ObjType *prevtype = objPtr->typePtr; void *prevdata = objPtr->internalRep.twoPtrValue.ptr1; + (void)Tcl_GetString(objPtr); objPtr->internalRep.twoPtrValue.ptr1 = objPtr->internalRep.twoPtrValue.ptr2; objPtr->typePtr = objPtr->internalRep.twoPtrValue.ptr1 ? &tclStringType: NULL; objPtr->internalRep.twoPtrValue.ptr2 = NULL; -- cgit v0.12