tcl broken?

Elan Ruusamäe glen at
Mon May 11 21:26:20 CEST 2009

On Thursday 19 February 2009 10:02:18 Adam Gołębiowski wrote:
> Hi,
> [adamg at carme-pld-i686 SPECS]$ echo 'puts stdout "a"'  | tclsh
> a
> Tcl_SetObjLength called with shared object
> Aborted
> [adamg at carme-pld-i686 SPECS]$
> this causes sqlite3 build failure (and probably other software).

appears the history.tcl or history related entry in tclIndex is the cause.

thus, one of these provide the fix:
1. remove /usr/lib/tcl8.5/history.tcl
2. removing (commenting out) from /usr/lib/tcl8.5/tclIndex this line:
set auto_index(history) [list source [file join $dir history.tcl]]

manual for Tcl_IsShared says: 
       Command  procedures that directly modify objects such as those for lap-
       pend and linsert must be careful to copy a shared object before  chang-
       ing  it.  They must first check whether the object is shared by calling
       Tcl_IsShared.  If the object is shared they must  copy  the  object  by
       using  Tcl_DuplicateObj;  this  returns a new duplicate of the original
       object that has refCount 0.  If the object is not shared,  the  command
       procedure  “owns”  the  object  and can safely modify it directly.  For
       example, the following code  appears  in  the  command  procedure  that
       implements  linsert.  This procedure modifies the list object passed to
       it in objv[1] by inserting objc-3 new elements before index.

              listPtr = objv[1];
              if (Tcl_IsShared(listPtr)) {
                  listPtr = Tcl_DuplicateObj(listPtr);
              result = Tcl_ListObjReplace(interp, listPtr, index, 0,
                      (objc-3), &(objv[3]));

... from which i conclude history.tcl does something too early...


More information about the pld-devel-en mailing list