summaryrefslogtreecommitdiffstats
path: root/generic/tclBasic.c
diff options
context:
space:
mode:
authorMiguel Sofer <miguel.sofer@gmail.com>2005-02-10 18:58:30 (GMT)
committerMiguel Sofer <miguel.sofer@gmail.com>2005-02-10 18:58:30 (GMT)
commit07e0b116171eb0e1b10cd691be7995103106a174 (patch)
tree65db8e9dc92a108560b7f32ffb095ae7e7ef52c6 /generic/tclBasic.c
parent7c7f5ce019e8eff60777b642821f2232c1ef7d3b (diff)
downloadtcl-07e0b116171eb0e1b10cd691be7995103106a174.zip
tcl-07e0b116171eb0e1b10cd691be7995103106a174.tar.gz
tcl-07e0b116171eb0e1b10cd691be7995103106a174.tar.bz2
* generic/tclBasic.c (Tcl_EvalObjEx):
* tests/basic.test (basic-26.2): preserve the arguments passed to TEOV in the pure-list branch, in case the list shimmers away. Fix for [Bug 1119369], reported by Peter MacDonald.
Diffstat (limited to 'generic/tclBasic.c')
-rw-r--r--generic/tclBasic.c23
1 files changed, 20 insertions, 3 deletions
diff --git a/generic/tclBasic.c b/generic/tclBasic.c
index 9d6255c..ea3bdf8 100644
--- a/generic/tclBasic.c
+++ b/generic/tclBasic.c
@@ -13,7 +13,7 @@
* See the file "license.terms" for information on usage and redistribution
* of this file, and for a DISCLAIMER OF ALL WARRANTIES.
*
- * RCS: @(#) $Id: tclBasic.c,v 1.75.2.11 2005/01/28 01:50:26 hobbs Exp $
+ * RCS: @(#) $Id: tclBasic.c,v 1.75.2.12 2005/02/10 18:58:35 msofer Exp $
*/
#include "tclInt.h"
@@ -4003,8 +4003,25 @@ Tcl_EvalObjEx(interp, objPtr, flags)
(objPtr->bytes == NULL) /* ...without a string rep */) {
register List *listRepPtr =
(List *) objPtr->internalRep.twoPtrValue.ptr1;
- result = Tcl_EvalObjv(interp, listRepPtr->elemCount,
- listRepPtr->elements, flags);
+ int i, objc = listRepPtr->elemCount;
+#define TEOE_PREALLOC 10
+ Tcl_Obj *staticObjv[TEOE_PREALLOC], **objv = staticObjv;
+
+ if (objc > TEOE_PREALLOC) {
+ objv = (Tcl_Obj **) ckalloc(objc*sizeof(Tcl_Obj *));
+ }
+#undef TEOE_PREALLOC
+ for (i=0; i < objc; i++) {
+ objv[i] = listRepPtr->elements[i];
+ Tcl_IncrRefCount(objv[i]);
+ }
+ result = Tcl_EvalObjv(interp, objc, objv, flags);
+ for (i=0; i < objc; i++) {
+ TclDecrRefCount(objv[i]);
+ }
+ if (objv != staticObjv) {
+ ckfree((char *) objv);
+ }
} else {
script = Tcl_GetStringFromObj(objPtr, &numSrcBytes);
result = Tcl_EvalEx(interp, script, numSrcBytes, flags);