Tcl Source Code

Hex Artifact Content
Login

Artifact 0b7c55ad693411b7408be4143991538236bc4f2c13369f838d891b3929f67246:


0000: 2f 2a 0a 20 2a 20 74 63 6c 4c 69 73 74 4f 62 6a  /*. * tclListObj
0010: 2e 63 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73  .c --. *. *.This
0020: 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 66   file contains f
0030: 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 20 69 6d  unctions that im
0040: 70 6c 65 6d 65 6e 74 20 74 68 65 20 54 63 6c 20  plement the Tcl 
0050: 6c 69 73 74 20 6f 62 6a 65 63 74 20 74 79 70 65  list object type
0060: 2e 0a 20 2a 0a 20 2a 20 43 6f 70 79 72 69 67 68  .. *. * Copyrigh
0070: 74 20 28 63 29 20 31 39 39 35 2d 31 39 39 37 20  t (c) 1995-1997 
0080: 53 75 6e 20 4d 69 63 72 6f 73 79 73 74 65 6d 73  Sun Microsystems
0090: 2c 20 49 6e 63 2e 0a 20 2a 20 43 6f 70 79 72 69  , Inc.. * Copyri
00a0: 67 68 74 20 28 63 29 20 31 39 39 38 20 62 79 20  ght (c) 1998 by 
00b0: 53 63 72 69 70 74 69 63 73 20 43 6f 72 70 6f 72  Scriptics Corpor
00c0: 61 74 69 6f 6e 2e 0a 20 2a 20 43 6f 70 79 72 69  ation.. * Copyri
00d0: 67 68 74 20 28 63 29 20 32 30 30 31 20 62 79 20  ght (c) 2001 by 
00e0: 4b 65 76 69 6e 20 42 2e 20 4b 65 6e 6e 79 2e 20  Kevin B. Kenny. 
00f0: 20 41 6c 6c 20 72 69 67 68 74 73 20 72 65 73 65   All rights rese
0100: 72 76 65 64 2e 0a 20 2a 0a 20 2a 20 53 65 65 20  rved.. *. * See 
0110: 74 68 65 20 66 69 6c 65 20 22 6c 69 63 65 6e 73  the file "licens
0120: 65 2e 74 65 72 6d 73 22 20 66 6f 72 20 69 6e 66  e.terms" for inf
0130: 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20 75 73 61 67  ormation on usag
0140: 65 20 61 6e 64 20 72 65 64 69 73 74 72 69 62 75  e and redistribu
0150: 74 69 6f 6e 20 6f 66 0a 20 2a 20 74 68 69 73 20  tion of. * this 
0160: 66 69 6c 65 2c 20 61 6e 64 20 66 6f 72 20 61 20  file, and for a 
0170: 44 49 53 43 4c 41 49 4d 45 52 20 4f 46 20 41 4c  DISCLAIMER OF AL
0180: 4c 20 57 41 52 52 41 4e 54 49 45 53 2e 0a 20 2a  L WARRANTIES.. *
0190: 2f 0a 0a 23 69 6e 63 6c 75 64 65 20 22 74 63 6c  /..#include "tcl
01a0: 49 6e 74 2e 68 22 0a 0a 2f 2a 0a 20 2a 20 50 72  Int.h"../*. * Pr
01b0: 6f 74 6f 74 79 70 65 73 20 66 6f 72 20 66 75 6e  ototypes for fun
01c0: 63 74 69 6f 6e 73 20 64 65 66 69 6e 65 64 20 6c  ctions defined l
01d0: 61 74 65 72 20 69 6e 20 74 68 69 73 20 66 69 6c  ater in this fil
01e0: 65 3a 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20 4c  e:. */..static L
01f0: 69 73 74 20 2a 09 09 41 74 74 65 6d 70 74 4e 65  ist *..AttemptNe
0200: 77 4c 69 73 74 28 54 63 6c 5f 49 6e 74 65 72 70  wList(Tcl_Interp
0210: 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74 20 6f 62   *interp, int ob
0220: 6a 63 2c 0a 09 09 09 20 20 20 20 54 63 6c 5f 4f  jc,....    Tcl_O
0230: 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d  bj *const objv[]
0240: 29 3b 0a 73 74 61 74 69 63 20 4c 69 73 74 20 2a  );.static List *
0250: 09 09 4e 65 77 4c 69 73 74 49 6e 74 52 65 70 28  ..NewListIntRep(
0260: 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62  int objc, Tcl_Ob
0270: 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 2c  j *const objv[],
0280: 20 69 6e 74 20 70 29 3b 0a 73 74 61 74 69 63 20   int p);.static 
0290: 76 6f 69 64 09 09 44 75 70 4c 69 73 74 49 6e 74  void..DupListInt
02a0: 65 72 6e 61 6c 52 65 70 28 54 63 6c 5f 4f 62 6a  ernalRep(Tcl_Obj
02b0: 20 2a 73 72 63 50 74 72 2c 20 54 63 6c 5f 4f 62   *srcPtr, Tcl_Ob
02c0: 6a 20 2a 63 6f 70 79 50 74 72 29 3b 0a 73 74 61  j *copyPtr);.sta
02d0: 74 69 63 20 76 6f 69 64 09 09 46 72 65 65 4c 69  tic void..FreeLi
02e0: 73 74 49 6e 74 65 72 6e 61 6c 52 65 70 28 54 63  stInternalRep(Tc
02f0: 6c 5f 4f 62 6a 20 2a 6c 69 73 74 50 74 72 29 3b  l_Obj *listPtr);
0300: 0a 73 74 61 74 69 63 20 69 6e 74 09 09 53 65 74  .static int..Set
0310: 4c 69 73 74 46 72 6f 6d 41 6e 79 28 54 63 6c 5f  ListFromAny(Tcl_
0320: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20  Interp *interp, 
0330: 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 29  Tcl_Obj *objPtr)
0340: 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 09 09 55  ;.static void..U
0350: 70 64 61 74 65 53 74 72 69 6e 67 4f 66 4c 69 73  pdateStringOfLis
0360: 74 28 54 63 6c 5f 4f 62 6a 20 2a 6c 69 73 74 50  t(Tcl_Obj *listP
0370: 74 72 29 3b 0a 0a 2f 2a 0a 20 2a 20 54 68 65 20  tr);../*. * The 
0380: 73 74 72 75 63 74 75 72 65 20 62 65 6c 6f 77 20  structure below 
0390: 64 65 66 69 6e 65 73 20 74 68 65 20 6c 69 73 74  defines the list
03a0: 20 54 63 6c 20 6f 62 6a 65 63 74 20 74 79 70 65   Tcl object type
03b0: 20 62 79 20 6d 65 61 6e 73 20 6f 66 20 66 75 6e   by means of fun
03c0: 63 74 69 6f 6e 73 0a 20 2a 20 74 68 61 74 20 63  ctions. * that c
03d0: 61 6e 20 62 65 20 69 6e 76 6f 6b 65 64 20 62 79  an be invoked by
03e0: 20 67 65 6e 65 72 69 63 20 6f 62 6a 65 63 74 20   generic object 
03f0: 63 6f 64 65 2e 0a 20 2a 0a 20 2a 20 54 68 65 20  code.. *. * The 
0400: 69 6e 74 65 72 6e 61 6c 20 72 65 70 72 65 73 65  internal represe
0410: 6e 74 61 74 69 6f 6e 20 6f 66 20 61 20 6c 69 73  ntation of a lis
0420: 74 20 6f 62 6a 65 63 74 20 69 73 20 61 20 74 77  t object is a tw
0430: 6f 2d 70 6f 69 6e 74 65 72 0a 20 2a 20 72 65 70  o-pointer. * rep
0440: 72 65 73 65 6e 74 61 74 69 6f 6e 2e 20 54 68 65  resentation. The
0450: 20 66 69 72 73 74 20 70 6f 69 6e 74 65 72 20 64   first pointer d
0460: 65 73 69 67 6e 61 74 65 73 20 61 20 4c 69 73 74  esignates a List
0470: 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
0480: 63 6f 6e 74 61 69 6e 73 0a 20 2a 20 61 6e 20 61  contains. * an a
0490: 72 72 61 79 20 6f 66 20 70 6f 69 6e 74 65 72 73  rray of pointers
04a0: 20 74 6f 20 74 68 65 20 65 6c 65 6d 65 6e 74 20   to the element 
04b0: 6f 62 6a 65 63 74 73 2c 20 74 6f 67 65 74 68 65  objects, togethe
04c0: 72 20 77 69 74 68 20 69 6e 74 65 67 65 72 73 20  r with integers 
04d0: 74 68 61 74 0a 20 2a 20 72 65 70 72 65 73 65 6e  that. * represen
04e0: 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 65 6c  t the current el
04f0: 65 6d 65 6e 74 20 63 6f 75 6e 74 20 61 6e 64 20  ement count and 
0500: 74 68 65 20 61 6c 6c 6f 63 61 74 65 64 20 73 69  the allocated si
0510: 7a 65 20 6f 66 20 74 68 65 20 61 72 72 61 79 2e  ze of the array.
0520: 0a 20 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 70  . * The second p
0530: 6f 69 6e 74 65 72 20 69 73 20 6e 6f 72 6d 61 6c  ointer is normal
0540: 6c 79 20 4e 55 4c 4c 3b 20 64 75 72 69 6e 67 20  ly NULL; during 
0550: 65 78 65 63 75 74 69 6f 6e 20 6f 66 20 66 75 6e  execution of fun
0560: 63 74 69 6f 6e 73 20 69 6e 20 74 68 69 73 0a 20  ctions in this. 
0570: 2a 20 66 69 6c 65 20 74 68 61 74 20 6f 70 65 72  * file that oper
0580: 61 74 65 20 6f 6e 20 6e 65 73 74 65 64 20 73 75  ate on nested su
0590: 62 6c 69 73 74 73 2c 20 69 74 20 69 73 20 6f 63  blists, it is oc
05a0: 63 61 73 69 6f 6e 61 6c 6c 79 20 75 73 65 64 20  casionally used 
05b0: 61 73 20 77 6f 72 6b 69 6e 67 0a 20 2a 20 73 74  as working. * st
05c0: 6f 72 61 67 65 20 74 6f 20 61 76 6f 69 64 20 61  orage to avoid a
05d0: 6e 20 61 75 78 69 6c 69 61 72 79 20 73 74 61 63  n auxiliary stac
05e0: 6b 2e 0a 20 2a 2f 0a 0a 63 6f 6e 73 74 20 54 63  k.. */..const Tc
05f0: 6c 5f 4f 62 6a 54 79 70 65 20 74 63 6c 4c 69 73  l_ObjType tclLis
0600: 74 54 79 70 65 20 3d 20 7b 0a 20 20 20 20 22 6c  tType = {.    "l
0610: 69 73 74 22 2c 09 09 09 2f 2a 20 6e 61 6d 65 20  ist",.../* name 
0620: 2a 2f 0a 20 20 20 20 46 72 65 65 4c 69 73 74 49  */.    FreeListI
0630: 6e 74 65 72 6e 61 6c 52 65 70 2c 09 2f 2a 20 66  nternalRep,./* f
0640: 72 65 65 49 6e 74 52 65 70 50 72 6f 63 20 2a 2f  reeIntRepProc */
0650: 0a 20 20 20 20 44 75 70 4c 69 73 74 49 6e 74 65  .    DupListInte
0660: 72 6e 61 6c 52 65 70 2c 09 09 2f 2a 20 64 75 70  rnalRep,../* dup
0670: 49 6e 74 52 65 70 50 72 6f 63 20 2a 2f 0a 20 20  IntRepProc */.  
0680: 20 20 55 70 64 61 74 65 53 74 72 69 6e 67 4f 66    UpdateStringOf
0690: 4c 69 73 74 2c 09 09 2f 2a 20 75 70 64 61 74 65  List,../* update
06a0: 53 74 72 69 6e 67 50 72 6f 63 20 2a 2f 0a 20 20  StringProc */.  
06b0: 20 20 53 65 74 4c 69 73 74 46 72 6f 6d 41 6e 79    SetListFromAny
06c0: 09 09 2f 2a 20 73 65 74 46 72 6f 6d 41 6e 79 50  ../* setFromAnyP
06d0: 72 6f 63 20 2a 2f 0a 7d 3b 0a 0a 23 69 66 6e 64  roc */.};..#ifnd
06e0: 65 66 20 54 43 4c 5f 4d 49 4e 5f 45 4c 45 4d 45  ef TCL_MIN_ELEME
06f0: 4e 54 5f 47 52 4f 57 54 48 0a 23 64 65 66 69 6e  NT_GROWTH.#defin
0700: 65 20 54 43 4c 5f 4d 49 4e 5f 45 4c 45 4d 45 4e  e TCL_MIN_ELEMEN
0710: 54 5f 47 52 4f 57 54 48 20 54 43 4c 5f 4d 49 4e  T_GROWTH TCL_MIN
0720: 5f 47 52 4f 57 54 48 2f 73 69 7a 65 6f 66 28 54  _GROWTH/sizeof(T
0730: 63 6c 5f 4f 62 6a 20 2a 29 0a 23 65 6e 64 69 66  cl_Obj *).#endif
0740: 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  .../*. *--------
0750: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0760: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0770: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0780: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
0790: 2a 0a 20 2a 20 4e 65 77 4c 69 73 74 49 6e 74 52  *. * NewListIntR
07a0: 65 70 20 2d 2d 0a 20 2a 0a 20 2a 09 43 72 65 61  ep --. *. *.Crea
07b0: 74 65 73 20 61 20 27 4c 69 73 74 27 20 73 74 72  tes a 'List' str
07c0: 75 63 74 75 72 65 20 77 69 74 68 20 73 70 61 63  ucture with spac
07d0: 65 20 66 6f 72 20 27 6f 62 6a 63 27 20 65 6c 65  e for 'objc' ele
07e0: 6d 65 6e 74 73 2e 20 20 27 6f 62 6a 63 27 20 6d  ments.  'objc' m
07f0: 75 73 74 0a 20 2a 09 62 65 20 3e 20 30 2e 20 20  ust. *.be > 0.  
0800: 49 66 20 27 6f 62 6a 76 27 20 69 73 20 6e 6f 74  If 'objv' is not
0810: 20 4e 55 4c 4c 2c 20 54 68 65 20 6c 69 73 74 20   NULL, The list 
0820: 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 77  is initialized w
0830: 69 74 68 20 66 69 72 73 74 0a 20 2a 09 27 6f 62  ith first. *.'ob
0840: 6a 63 27 20 76 61 6c 75 65 73 20 69 6e 20 74 68  jc' values in th
0850: 61 74 20 61 72 72 61 79 2e 20 20 4f 74 68 65 72  at array.  Other
0860: 77 69 73 65 20 74 68 65 20 6c 69 73 74 20 69 73  wise the list is
0870: 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20   initialized to 
0880: 68 61 76 65 0a 20 2a 09 30 20 65 6c 65 6d 65 6e  have. *.0 elemen
0890: 74 73 2c 20 77 69 74 68 20 73 70 61 63 65 20 74  ts, with space t
08a0: 6f 20 61 64 64 20 27 6f 62 6a 63 27 20 6d 6f 72  o add 'objc' mor
08b0: 65 2e 20 20 46 6c 61 67 20 76 61 6c 75 65 20 27  e.  Flag value '
08c0: 70 27 20 69 6e 64 69 63 61 74 65 73 0a 20 2a 09  p' indicates. *.
08d0: 68 6f 77 20 74 6f 20 62 65 68 61 76 65 20 6f 6e  how to behave on
08e0: 20 66 61 69 6c 75 72 65 2e 0a 20 2a 0a 20 2a 20   failure.. *. * 
08f0: 56 61 6c 75 65 0a 20 2a 0a 20 2a 09 41 20 6e 65  Value. *. *.A ne
0900: 77 20 27 4c 69 73 74 27 20 73 74 72 75 63 74 75  w 'List' structu
0910: 72 65 20 77 69 74 68 20 72 65 66 43 6f 75 6e 74  re with refCount
0920: 20 30 2e 20 49 66 20 73 6f 6d 65 20 66 61 69 6c   0. If some fail
0930: 75 72 65 0a 20 2a 09 70 72 65 76 65 6e 74 73 20  ure. *.prevents 
0940: 74 68 69 73 20 4e 55 4c 4c 20 69 73 20 72 65 74  this NULL is ret
0950: 75 72 6e 65 64 20 69 66 20 27 70 27 20 69 73 20  urned if 'p' is 
0960: 30 20 2c 20 61 6e 64 20 27 54 63 6c 5f 50 61 6e  0 , and 'Tcl_Pan
0970: 69 63 27 0a 20 2a 09 69 73 20 63 61 6c 6c 65 64  ic'. *.is called
0980: 20 69 66 20 69 74 20 69 73 20 6e 6f 74 2e 0a 20   if it is not.. 
0990: 2a 0a 20 2a 20 45 66 66 65 63 74 0a 20 2a 0a 20  *. * Effect. *. 
09a0: 2a 09 54 68 65 20 72 65 66 43 6f 75 6e 74 20 6f  *.The refCount o
09b0: 66 20 65 61 63 68 20 76 61 6c 75 65 20 69 6e 20  f each value in 
09c0: 27 6f 62 6a 76 27 20 69 73 20 69 6e 63 72 65 6d  'objv' is increm
09d0: 65 6e 74 65 64 20 61 73 20 69 74 20 69 73 20 61  ented as it is a
09e0: 64 64 65 64 0a 20 2a 09 74 6f 20 74 68 65 20 6c  dded. *.to the l
09f0: 69 73 74 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  ist.. *. *------
0a00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0a10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0a20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0a30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0a40: 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20 4c 69 73  . */..static Lis
0a50: 74 20 2a 0a 4e 65 77 4c 69 73 74 49 6e 74 52 65  t *.NewListIntRe
0a60: 70 28 0a 20 20 20 20 69 6e 74 20 6f 62 6a 63 2c  p(.    int objc,
0a70: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f  .    Tcl_Obj *co
0a80: 6e 73 74 20 6f 62 6a 76 5b 5d 2c 0a 20 20 20 20  nst objv[],.    
0a90: 69 6e 74 20 70 29 0a 7b 0a 20 20 20 20 4c 69 73  int p).{.    Lis
0aa0: 74 20 2a 6c 69 73 74 52 65 70 50 74 72 3b 0a 0a  t *listRepPtr;..
0ab0: 20 20 20 20 69 66 20 28 6f 62 6a 63 20 3c 3d 20      if (objc <= 
0ac0: 30 29 20 7b 0a 09 54 63 6c 5f 50 61 6e 69 63 28  0) {..Tcl_Panic(
0ad0: 22 4e 65 77 4c 69 73 74 49 6e 74 52 65 70 3a 20  "NewListIntRep: 
0ae0: 65 78 70 65 63 74 73 20 70 6f 73 74 69 76 65 20  expects postive 
0af0: 65 6c 65 6d 65 6e 74 20 63 6f 75 6e 74 22 29 3b  element count");
0b00: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20  .    }..    /*. 
0b10: 20 20 20 20 2a 20 46 69 72 73 74 20 63 68 65 63      * First chec
0b20: 6b 20 74 6f 20 73 65 65 20 69 66 20 77 65 27 64  k to see if we'd
0b30: 20 6f 76 65 72 66 6c 6f 77 20 61 6e 64 20 74 72   overflow and tr
0b40: 79 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 61 6e  y to allocate an
0b50: 20 6f 62 6a 65 63 74 0a 20 20 20 20 20 2a 20 6c   object.     * l
0b60: 61 72 67 65 72 20 74 68 61 6e 20 6f 75 72 20 6d  arger than our m
0b70: 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 6f 72 20  emory allocator 
0b80: 61 6c 6c 6f 77 73 2e 20 4e 6f 74 65 20 74 68 61  allows. Note tha
0b90: 74 20 74 68 69 73 20 69 73 20 61 63 74 75 61 6c  t this is actual
0ba0: 6c 79 20 61 0a 20 20 20 20 20 2a 20 66 61 69 72  ly a.     * fair
0bb0: 6c 79 20 73 6d 61 6c 6c 20 76 61 6c 75 65 20 77  ly small value w
0bc0: 68 65 6e 20 79 6f 75 27 72 65 20 6f 6e 20 61 20  hen you're on a 
0bd0: 73 65 72 69 6f 75 73 20 36 34 2d 62 69 74 20 6d  serious 64-bit m
0be0: 61 63 68 69 6e 65 2c 20 62 75 74 20 74 68 61 74  achine, but that
0bf0: 0a 20 20 20 20 20 2a 20 72 65 71 75 69 72 65 73  .     * requires
0c00: 20 41 50 49 20 63 68 61 6e 67 65 73 20 74 6f 20   API changes to 
0c10: 66 69 78 2e 20 53 65 65 20 5b 42 75 67 20 32 31  fix. See [Bug 21
0c20: 39 31 39 36 5d 20 66 6f 72 20 61 20 64 69 73 63  9196] for a disc
0c30: 75 73 73 69 6f 6e 2e 0a 20 20 20 20 20 2a 2f 0a  ussion..     */.
0c40: 0a 20 20 20 20 69 66 20 28 28 73 69 7a 65 5f 74  .    if ((size_t
0c50: 29 6f 62 6a 63 20 3e 20 4c 49 53 54 5f 4d 41 58  )objc > LIST_MAX
0c60: 29 20 7b 0a 09 69 66 20 28 70 29 20 7b 0a 09 20  ) {..if (p) {.. 
0c70: 20 20 20 54 63 6c 5f 50 61 6e 69 63 28 22 6d 61     Tcl_Panic("ma
0c80: 78 20 6c 65 6e 67 74 68 20 6f 66 20 61 20 54 63  x length of a Tc
0c90: 6c 20 6c 69 73 74 20 28 25 64 20 65 6c 65 6d 65  l list (%d eleme
0ca0: 6e 74 73 29 20 65 78 63 65 65 64 65 64 22 2c 0a  nts) exceeded",.
0cb0: 09 09 20 20 20 20 4c 49 53 54 5f 4d 41 58 29 3b  ..    LIST_MAX);
0cc0: 0a 09 7d 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c  ..}..return NULL
0cd0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6c 69 73  ;.    }..    lis
0ce0: 74 52 65 70 50 74 72 20 3d 20 61 74 74 65 6d 70  tRepPtr = attemp
0cf0: 74 63 6b 61 6c 6c 6f 63 28 4c 49 53 54 5f 53 49  tckalloc(LIST_SI
0d00: 5a 45 28 6f 62 6a 63 29 29 3b 0a 20 20 20 20 69  ZE(objc));.    i
0d10: 66 20 28 6c 69 73 74 52 65 70 50 74 72 20 3d 3d  f (listRepPtr ==
0d20: 20 4e 55 4c 4c 29 20 7b 0a 09 69 66 20 28 70 29   NULL) {..if (p)
0d30: 20 7b 0a 09 20 20 20 20 54 63 6c 5f 50 61 6e 69   {..    Tcl_Pani
0d40: 63 28 22 6c 69 73 74 20 63 72 65 61 74 69 6f 6e  c("list creation
0d50: 20 66 61 69 6c 65 64 3a 20 75 6e 61 62 6c 65 20   failed: unable 
0d60: 74 6f 20 61 6c 6c 6f 63 20 25 75 20 62 79 74 65  to alloc %u byte
0d70: 73 22 2c 0a 09 09 20 20 20 20 4c 49 53 54 5f 53  s",...    LIST_S
0d80: 49 5a 45 28 6f 62 6a 63 29 29 3b 0a 09 7d 0a 09  IZE(objc));..}..
0d90: 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20  return NULL;.   
0da0: 20 7d 0a 0a 20 20 20 20 6c 69 73 74 52 65 70 50   }..    listRepP
0db0: 74 72 2d 3e 63 61 6e 6f 6e 69 63 61 6c 46 6c 61  tr->canonicalFla
0dc0: 67 20 3d 20 30 3b 0a 20 20 20 20 6c 69 73 74 52  g = 0;.    listR
0dd0: 65 70 50 74 72 2d 3e 72 65 66 43 6f 75 6e 74 20  epPtr->refCount 
0de0: 3d 20 30 3b 0a 20 20 20 20 6c 69 73 74 52 65 70  = 0;.    listRep
0df0: 50 74 72 2d 3e 6d 61 78 45 6c 65 6d 43 6f 75 6e  Ptr->maxElemCoun
0e00: 74 20 3d 20 6f 62 6a 63 3b 0a 0a 20 20 20 20 69  t = objc;..    i
0e10: 66 20 28 6f 62 6a 76 29 20 7b 0a 09 54 63 6c 5f  f (objv) {..Tcl_
0e20: 4f 62 6a 20 2a 2a 65 6c 65 6d 50 74 72 73 3b 0a  Obj **elemPtrs;.
0e30: 09 69 6e 74 20 69 3b 0a 0a 09 6c 69 73 74 52 65  .int i;...listRe
0e40: 70 50 74 72 2d 3e 65 6c 65 6d 43 6f 75 6e 74 20  pPtr->elemCount 
0e50: 3d 20 6f 62 6a 63 3b 0a 09 65 6c 65 6d 50 74 72  = objc;..elemPtr
0e60: 73 20 3d 20 26 6c 69 73 74 52 65 70 50 74 72 2d  s = &listRepPtr-
0e70: 3e 65 6c 65 6d 65 6e 74 73 3b 0a 09 66 6f 72 20  >elements;..for 
0e80: 28 69 20 3d 20 30 3b 20 20 69 20 3c 20 6f 62 6a  (i = 0;  i < obj
0e90: 63 3b 20 20 69 2b 2b 29 20 7b 0a 09 20 20 20 20  c;  i++) {..    
0ea0: 65 6c 65 6d 50 74 72 73 5b 69 5d 20 3d 20 6f 62  elemPtrs[i] = ob
0eb0: 6a 76 5b 69 5d 3b 0a 09 20 20 20 20 54 63 6c 5f  jv[i];..    Tcl_
0ec0: 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 65 6c 65  IncrRefCount(ele
0ed0: 6d 50 74 72 73 5b 69 5d 29 3b 0a 09 7d 0a 20 20  mPtrs[i]);..}.  
0ee0: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 6c 69 73 74    } else {..list
0ef0: 52 65 70 50 74 72 2d 3e 65 6c 65 6d 43 6f 75 6e  RepPtr->elemCoun
0f00: 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  t = 0;.    }.   
0f10: 20 72 65 74 75 72 6e 20 6c 69 73 74 52 65 70 50   return listRepP
0f20: 74 72 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d  tr;.}.../*. *---
0f30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0f40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0f50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0f60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0f70: 2d 2d 2d 0a 20 2a 0a 20 2a 20 20 41 74 74 65 6d  ---. *. *  Attem
0f80: 70 74 4e 65 77 4c 69 73 74 20 2d 2d 0a 20 2a 0a  ptNewList --. *.
0f90: 20 2a 09 4c 69 6b 65 20 4e 65 77 4c 69 73 74 49   *.Like NewListI
0fa0: 6e 74 52 65 70 2c 20 62 75 74 20 61 64 64 69 74  ntRep, but addit
0fb0: 69 6f 6e 61 6c 6c 79 20 73 65 74 73 20 61 6e 20  ionally sets an 
0fc0: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 6f 6e  error message on
0fd0: 20 66 61 69 6c 75 72 65 2e 20 0a 20 2a 20 0a 20   failure. . * . 
0fe0: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
0ff0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1000: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1010: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1020: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61  -------. */..sta
1030: 74 69 63 20 4c 69 73 74 20 2a 0a 41 74 74 65 6d  tic List *.Attem
1040: 70 74 4e 65 77 4c 69 73 74 28 0a 20 20 20 20 54  ptNewList(.    T
1050: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
1060: 70 2c 0a 20 20 20 20 69 6e 74 20 6f 62 6a 63 2c  p,.    int objc,
1070: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f  .    Tcl_Obj *co
1080: 6e 73 74 20 6f 62 6a 76 5b 5d 29 0a 7b 0a 20 20  nst objv[]).{.  
1090: 20 20 4c 69 73 74 20 2a 6c 69 73 74 52 65 70 50    List *listRepP
10a0: 74 72 20 3d 20 4e 65 77 4c 69 73 74 49 6e 74 52  tr = NewListIntR
10b0: 65 70 28 6f 62 6a 63 2c 20 6f 62 6a 76 2c 20 30  ep(objc, objv, 0
10c0: 29 3b 0a 0a 20 20 20 20 69 66 20 28 69 6e 74 65  );..    if (inte
10d0: 72 70 20 21 3d 20 4e 55 4c 4c 20 26 26 20 6c 69  rp != NULL && li
10e0: 73 74 52 65 70 50 74 72 20 3d 3d 20 4e 55 4c 4c  stRepPtr == NULL
10f0: 29 20 7b 0a 09 69 66 20 28 6f 62 6a 63 20 3e 20  ) {..if (objc > 
1100: 4c 49 53 54 5f 4d 41 58 29 20 7b 0a 09 20 20 20  LIST_MAX) {..   
1110: 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c   Tcl_SetObjResul
1120: 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4f 62  t(interp, Tcl_Ob
1130: 6a 50 72 69 6e 74 66 28 0a 09 09 20 20 20 20 22  jPrintf(...    "
1140: 6d 61 78 20 6c 65 6e 67 74 68 20 6f 66 20 61 20  max length of a 
1150: 54 63 6c 20 6c 69 73 74 20 28 25 64 20 65 6c 65  Tcl list (%d ele
1160: 6d 65 6e 74 73 29 20 65 78 63 65 65 64 65 64 22  ments) exceeded"
1170: 2c 0a 09 09 20 20 20 20 4c 49 53 54 5f 4d 41 58  ,...    LIST_MAX
1180: 29 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20  ));..} else {.. 
1190: 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73     Tcl_SetObjRes
11a0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f  ult(interp, Tcl_
11b0: 4f 62 6a 50 72 69 6e 74 66 28 0a 09 09 20 20 20  ObjPrintf(...   
11c0: 20 22 6c 69 73 74 20 63 72 65 61 74 69 6f 6e 20   "list creation 
11d0: 66 61 69 6c 65 64 3a 20 75 6e 61 62 6c 65 20 74  failed: unable t
11e0: 6f 20 61 6c 6c 6f 63 20 25 75 20 62 79 74 65 73  o alloc %u bytes
11f0: 22 2c 0a 09 09 20 20 20 20 4c 49 53 54 5f 53 49  ",...    LIST_SI
1200: 5a 45 28 6f 62 6a 63 29 29 29 3b 0a 09 7d 0a 09  ZE(objc)));..}..
1210: 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65  Tcl_SetErrorCode
1220: 28 69 6e 74 65 72 70 2c 20 22 54 43 4c 22 2c 20  (interp, "TCL", 
1230: 22 4d 45 4d 4f 52 59 22 2c 20 4e 55 4c 4c 29 3b  "MEMORY", NULL);
1240: 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
1250: 6e 20 6c 69 73 74 52 65 70 50 74 72 3b 0a 7d 0a  n listRepPtr;.}.
1260: 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  ../*. *---------
1270: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1280: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1290: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
12b0: 0a 20 2a 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f  . * Tcl_NewListO
12c0: 62 6a 20 2d 2d 0a 20 2a 0a 20 2a 09 43 72 65 61  bj --. *. *.Crea
12d0: 74 65 73 20 61 20 6e 65 77 20 6c 69 73 74 20 6f  tes a new list o
12e0: 62 6a 65 63 74 20 61 6e 64 20 61 64 64 73 20 76  bject and adds v
12f0: 61 6c 75 65 73 20 74 6f 20 69 74 2e 20 57 68 65  alues to it. Whe
1300: 6e 20 54 43 4c 5f 4d 45 4d 5f 44 45 42 55 47 20  n TCL_MEM_DEBUG 
1310: 69 73 0a 20 2a 09 64 65 66 69 6e 65 64 2c 20 27  is. *.defined, '
1320: 54 63 6c 5f 44 62 4e 65 77 4c 69 73 74 4f 62 6a  Tcl_DbNewListObj
1330: 27 20 69 73 20 63 61 6c 6c 65 64 20 69 6e 73 74  ' is called inst
1340: 65 61 64 2e 0a 20 2a 0a 20 2a 20 56 61 6c 75 65  ead.. *. * Value
1350: 0a 20 2a 0a 20 2a 09 41 20 6e 65 77 20 6c 69 73  . *. *.A new lis
1360: 74 20 27 54 63 6c 5f 4f 62 6a 27 20 74 6f 20 77  t 'Tcl_Obj' to w
1370: 68 69 63 68 20 69 73 20 61 70 70 65 6e 64 65 64  hich is appended
1380: 20 76 61 6c 75 65 73 20 66 72 6f 6d 20 27 6f 62   values from 'ob
1390: 6a 76 27 2c 20 6f 72 20 69 66 0a 20 2a 09 27 6f  jv', or if. *.'o
13a0: 62 6a 63 27 20 69 73 20 6c 65 73 73 20 74 68 61  bjc' is less tha
13b0: 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 7a 65  n or equal to ze
13c0: 72 6f 2c 20 61 20 6c 69 73 74 20 27 54 63 6c 5f  ro, a list 'Tcl_
13d0: 4f 62 6a 27 20 68 61 76 69 6e 67 20 6e 6f 0a 20  Obj' having no. 
13e0: 2a 09 65 6c 65 6d 65 6e 74 73 2e 20 20 54 68 65  *.elements.  The
13f0: 20 73 74 72 69 6e 67 20 72 65 70 72 65 73 65 6e   string represen
1400: 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6e 65  tation of the ne
1410: 77 20 27 54 63 6c 5f 4f 62 6a 27 20 69 73 20 73  w 'Tcl_Obj' is s
1420: 65 74 20 74 6f 0a 20 2a 09 4e 55 4c 4c 2e 20 20  et to. *.NULL.  
1430: 54 68 65 20 72 65 66 43 6f 75 6e 74 20 6f 66 20  The refCount of 
1440: 74 68 65 20 6c 69 73 74 20 69 73 20 30 2e 0a 20  the list is 0.. 
1450: 2a 0a 20 2a 20 45 66 66 65 63 74 0a 20 2a 0a 20  *. * Effect. *. 
1460: 2a 09 54 68 65 20 72 65 66 43 6f 75 6e 74 20 6f  *.The refCount o
1470: 66 20 65 61 63 68 20 65 6c 65 6d 65 6e 74 73 20  f each elements 
1480: 69 6e 20 27 6f 62 6a 76 27 20 69 73 20 69 6e 63  in 'objv' is inc
1490: 72 65 6d 65 6e 74 65 64 20 61 73 20 69 74 20 69  remented as it i
14a0: 73 20 61 64 64 65 64 0a 20 2a 09 74 6f 20 74 68  s added. *.to th
14b0: 65 20 6c 69 73 74 2e 0a 20 2a 0a 20 2a 2d 2d 2d  e list.. *. *---
14c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1500: 2d 2d 2d 0a 20 2a 2f 0a 0a 23 69 66 64 65 66 20  ---. */..#ifdef 
1510: 54 43 4c 5f 4d 45 4d 5f 44 45 42 55 47 0a 23 75  TCL_MEM_DEBUG.#u
1520: 6e 64 65 66 20 54 63 6c 5f 4e 65 77 4c 69 73 74  ndef Tcl_NewList
1530: 4f 62 6a 0a 0a 54 63 6c 5f 4f 62 6a 20 2a 0a 54  Obj..Tcl_Obj *.T
1540: 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 0a 20  cl_NewListObj(. 
1550: 20 20 20 69 6e 74 20 6f 62 6a 63 2c 09 09 09 2f     int objc,.../
1560: 2a 20 43 6f 75 6e 74 20 6f 66 20 6f 62 6a 65 63  * Count of objec
1570: 74 73 20 72 65 66 65 72 65 6e 63 65 64 20 62 79  ts referenced by
1580: 20 6f 62 6a 76 2e 20 2a 2f 0a 20 20 20 20 54 63   objv. */.    Tc
1590: 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a  l_Obj *const obj
15a0: 76 5b 5d 29 09 2f 2a 20 41 6e 20 61 72 72 61 79  v[])./* An array
15b0: 20 6f 66 20 70 6f 69 6e 74 65 72 73 20 74 6f 20   of pointers to 
15c0: 54 63 6c 20 6f 62 6a 65 63 74 73 2e 20 2a 2f 0a  Tcl objects. */.
15d0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 63 6c  {.    return Tcl
15e0: 5f 44 62 4e 65 77 4c 69 73 74 4f 62 6a 28 6f 62  _DbNewListObj(ob
15f0: 6a 63 2c 20 6f 62 6a 76 2c 20 22 75 6e 6b 6e 6f  jc, objv, "unkno
1600: 77 6e 22 2c 20 30 29 3b 0a 7d 0a 0a 23 65 6c 73  wn", 0);.}..#els
1610: 65 20 2f 2a 20 69 66 20 6e 6f 74 20 54 43 4c 5f  e /* if not TCL_
1620: 4d 45 4d 5f 44 45 42 55 47 20 2a 2f 0a 0a 54 63  MEM_DEBUG */..Tc
1630: 6c 5f 4f 62 6a 20 2a 0a 54 63 6c 5f 4e 65 77 4c  l_Obj *.Tcl_NewL
1640: 69 73 74 4f 62 6a 28 0a 20 20 20 20 69 6e 74 20  istObj(.    int 
1650: 6f 62 6a 63 2c 09 09 09 2f 2a 20 43 6f 75 6e 74  objc,.../* Count
1660: 20 6f 66 20 6f 62 6a 65 63 74 73 20 72 65 66 65   of objects refe
1670: 72 65 6e 63 65 64 20 62 79 20 6f 62 6a 76 2e 20  renced by objv. 
1680: 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a  */.    Tcl_Obj *
1690: 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 09 2f 2a  const objv[])./*
16a0: 20 41 6e 20 61 72 72 61 79 20 6f 66 20 70 6f 69   An array of poi
16b0: 6e 74 65 72 73 20 74 6f 20 54 63 6c 20 6f 62 6a  nters to Tcl obj
16c0: 65 63 74 73 2e 20 2a 2f 0a 7b 0a 20 20 20 20 4c  ects. */.{.    L
16d0: 69 73 74 20 2a 6c 69 73 74 52 65 70 50 74 72 3b  ist *listRepPtr;
16e0: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6c 69  .    Tcl_Obj *li
16f0: 73 74 50 74 72 3b 0a 0a 20 20 20 20 54 63 6c 4e  stPtr;..    TclN
1700: 65 77 4f 62 6a 28 6c 69 73 74 50 74 72 29 3b 0a  ewObj(listPtr);.
1710: 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 3c 3d  .    if (objc <=
1720: 20 30 29 20 7b 0a 09 72 65 74 75 72 6e 20 6c 69   0) {..return li
1730: 73 74 50 74 72 3b 0a 20 20 20 20 7d 0a 0a 20 20  stPtr;.    }..  
1740: 20 20 2f 2a 0a 20 20 20 20 20 2a 20 43 72 65 61    /*.     * Crea
1750: 74 65 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20  te the internal 
1760: 72 65 70 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20  rep..     */..  
1770: 20 20 6c 69 73 74 52 65 70 50 74 72 20 3d 20 4e    listRepPtr = N
1780: 65 77 4c 69 73 74 49 6e 74 52 65 70 28 6f 62 6a  ewListIntRep(obj
1790: 63 2c 20 6f 62 6a 76 2c 20 31 29 3b 0a 0a 20 20  c, objv, 1);..  
17a0: 20 20 2f 2a 0a 20 20 20 20 20 2a 20 4e 6f 77 20    /*.     * Now 
17b0: 63 72 65 61 74 65 20 74 68 65 20 6f 62 6a 65 63  create the objec
17c0: 74 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20  t..     */..    
17d0: 54 63 6c 49 6e 76 61 6c 69 64 61 74 65 53 74 72  TclInvalidateStr
17e0: 69 6e 67 52 65 70 28 6c 69 73 74 50 74 72 29 3b  ingRep(listPtr);
17f0: 0a 20 20 20 20 4c 69 73 74 53 65 74 49 6e 74 52  .    ListSetIntR
1800: 65 70 28 6c 69 73 74 50 74 72 2c 20 6c 69 73 74  ep(listPtr, list
1810: 52 65 70 50 74 72 29 3b 0a 20 20 20 20 72 65 74  RepPtr);.    ret
1820: 75 72 6e 20 6c 69 73 74 50 74 72 3b 0a 7d 0a 23  urn listPtr;.}.#
1830: 65 6e 64 69 66 20 2f 2a 20 69 66 20 54 43 4c 5f  endif /* if TCL_
1840: 4d 45 4d 5f 44 45 42 55 47 20 2a 2f 0a 0c 0a 2f  MEM_DEBUG */.../
1850: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
1860: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1870: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1880: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1890: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a  ----------. *. *
18a0: 20 20 54 63 6c 5f 44 62 4e 65 77 4c 69 73 74 4f    Tcl_DbNewListO
18b0: 62 6a 20 2d 2d 0a 20 2a 20 0a 20 2a 09 4c 69 6b  bj --. * . *.Lik
18c0: 65 20 27 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62  e 'Tcl_NewListOb
18d0: 6a 27 2c 20 62 75 74 20 69 74 20 63 61 6c 6c 73  j', but it calls
18e0: 20 54 63 6c 5f 44 62 43 6b 61 6c 6c 6f 63 20 64   Tcl_DbCkalloc d
18f0: 69 72 65 63 74 6c 79 20 77 69 74 68 20 74 68 65  irectly with the
1900: 0a 20 2a 09 66 69 6c 65 20 6e 61 6d 65 20 61 6e  . *.file name an
1910: 64 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20 66 72  d line number fr
1920: 6f 6d 20 69 74 73 20 63 61 6c 6c 65 72 2e 20 20  om its caller.  
1930: 54 68 69 73 20 73 69 6d 70 6c 69 66 69 65 73 20  This simplifies 
1940: 64 65 62 75 67 67 69 6e 67 0a 20 2a 09 73 69 6e  debugging. *.sin
1950: 63 65 20 74 68 65 20 5b 6d 65 6d 6f 72 79 20 61  ce the [memory a
1960: 63 74 69 76 65 5d 20 63 6f 6d 6d 61 6e 64 20 77  ctive] command w
1970: 69 6c 6c 20 72 65 70 6f 72 74 20 74 68 65 20 63  ill report the c
1980: 6f 72 72 65 63 74 20 66 69 6c 65 0a 20 2a 09 6e  orrect file. *.n
1990: 61 6d 65 20 61 6e 64 20 6c 69 6e 65 20 6e 75 6d  ame and line num
19a0: 62 65 72 20 77 68 65 6e 20 72 65 70 6f 72 74 69  ber when reporti
19b0: 6e 67 20 6f 62 6a 65 63 74 73 20 74 68 61 74 20  ng objects that 
19c0: 68 61 76 65 6e 27 74 20 62 65 65 6e 20 66 72 65  haven't been fre
19d0: 65 64 2e 0a 20 2a 20 0a 20 2a 09 57 68 65 6e 20  ed.. * . *.When 
19e0: 54 43 4c 5f 4d 45 4d 5f 44 45 42 55 47 20 69 73  TCL_MEM_DEBUG is
19f0: 20 6e 6f 74 20 64 65 66 69 6e 65 64 2c 20 27 54   not defined, 'T
1a00: 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 27 20 69  cl_NewListObj' i
1a10: 73 20 63 61 6c 6c 65 64 20 69 6e 73 74 65 61 64  s called instead
1a20: 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  .. *. *---------
1a30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1a40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1a50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1a60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
1a70: 2f 0a 0a 23 69 66 64 65 66 20 54 43 4c 5f 4d 45  /..#ifdef TCL_ME
1a80: 4d 5f 44 45 42 55 47 0a 0a 54 63 6c 5f 4f 62 6a  M_DEBUG..Tcl_Obj
1a90: 20 2a 0a 54 63 6c 5f 44 62 4e 65 77 4c 69 73 74   *.Tcl_DbNewList
1aa0: 4f 62 6a 28 0a 20 20 20 20 69 6e 74 20 6f 62 6a  Obj(.    int obj
1ab0: 63 2c 09 09 09 2f 2a 20 43 6f 75 6e 74 20 6f 66  c,.../* Count of
1ac0: 20 6f 62 6a 65 63 74 73 20 72 65 66 65 72 65 6e   objects referen
1ad0: 63 65 64 20 62 79 20 6f 62 6a 76 2e 20 2a 2f 0a  ced by objv. */.
1ae0: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e      Tcl_Obj *con
1af0: 73 74 20 6f 62 6a 76 5b 5d 2c 09 2f 2a 20 41 6e  st objv[],./* An
1b00: 20 61 72 72 61 79 20 6f 66 20 70 6f 69 6e 74 65   array of pointe
1b10: 72 73 20 74 6f 20 54 63 6c 20 6f 62 6a 65 63 74  rs to Tcl object
1b20: 73 2e 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20  s. */.    const 
1b30: 63 68 61 72 20 2a 66 69 6c 65 2c 09 09 2f 2a 20  char *file,../* 
1b40: 54 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  The name of the 
1b50: 73 6f 75 72 63 65 20 66 69 6c 65 20 63 61 6c 6c  source file call
1b60: 69 6e 67 20 74 68 69 73 0a 09 09 09 09 20 2a 20  ing this..... * 
1b70: 66 75 6e 63 74 69 6f 6e 3b 20 75 73 65 64 20 66  function; used f
1b80: 6f 72 20 64 65 62 75 67 67 69 6e 67 2e 20 2a 2f  or debugging. */
1b90: 0a 20 20 20 20 69 6e 74 20 6c 69 6e 65 29 09 09  .    int line)..
1ba0: 09 2f 2a 20 4c 69 6e 65 20 6e 75 6d 62 65 72 20  ./* Line number 
1bb0: 69 6e 20 74 68 65 20 73 6f 75 72 63 65 20 66 69  in the source fi
1bc0: 6c 65 3b 20 75 73 65 64 20 66 6f 72 0a 09 09 09  le; used for....
1bd0: 09 20 2a 20 64 65 62 75 67 67 69 6e 67 2e 20 2a  . * debugging. *
1be0: 2f 0a 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20  /.{.    Tcl_Obj 
1bf0: 2a 6c 69 73 74 50 74 72 3b 0a 20 20 20 20 4c 69  *listPtr;.    Li
1c00: 73 74 20 2a 6c 69 73 74 52 65 70 50 74 72 3b 0a  st *listRepPtr;.
1c10: 0a 20 20 20 20 54 63 6c 44 62 4e 65 77 4f 62 6a  .    TclDbNewObj
1c20: 28 6c 69 73 74 50 74 72 2c 20 66 69 6c 65 2c 20  (listPtr, file, 
1c30: 6c 69 6e 65 29 3b 0a 0a 20 20 20 20 69 66 20 28  line);..    if (
1c40: 6f 62 6a 63 20 3c 3d 20 30 29 20 7b 0a 09 72 65  objc <= 0) {..re
1c50: 74 75 72 6e 20 6c 69 73 74 50 74 72 3b 0a 20 20  turn listPtr;.  
1c60: 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20    }..    /*.    
1c70: 20 2a 20 43 72 65 61 74 65 20 74 68 65 20 69 6e   * Create the in
1c80: 74 65 72 6e 61 6c 20 72 65 70 2e 0a 20 20 20 20  ternal rep..    
1c90: 20 2a 2f 0a 0a 20 20 20 20 6c 69 73 74 52 65 70   */..    listRep
1ca0: 50 74 72 20 3d 20 4e 65 77 4c 69 73 74 49 6e 74  Ptr = NewListInt
1cb0: 52 65 70 28 6f 62 6a 63 2c 20 6f 62 6a 76 2c 20  Rep(objc, objv, 
1cc0: 31 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20  1);..    /*.    
1cd0: 20 2a 20 4e 6f 77 20 63 72 65 61 74 65 20 74 68   * Now create th
1ce0: 65 20 6f 62 6a 65 63 74 2e 0a 20 20 20 20 20 2a  e object..     *
1cf0: 2f 0a 0a 20 20 20 20 54 63 6c 49 6e 76 61 6c 69  /..    TclInvali
1d00: 64 61 74 65 53 74 72 69 6e 67 52 65 70 28 6c 69  dateStringRep(li
1d10: 73 74 50 74 72 29 3b 0a 20 20 20 20 4c 69 73 74  stPtr);.    List
1d20: 53 65 74 49 6e 74 52 65 70 28 6c 69 73 74 50 74  SetIntRep(listPt
1d30: 72 2c 20 6c 69 73 74 52 65 70 50 74 72 29 3b 0a  r, listRepPtr);.
1d40: 0a 20 20 20 20 72 65 74 75 72 6e 20 6c 69 73 74  .    return list
1d50: 50 74 72 3b 0a 7d 0a 0a 23 65 6c 73 65 20 2f 2a  Ptr;.}..#else /*
1d60: 20 69 66 20 6e 6f 74 20 54 43 4c 5f 4d 45 4d 5f   if not TCL_MEM_
1d70: 44 45 42 55 47 20 2a 2f 0a 0a 54 63 6c 5f 4f 62  DEBUG */..Tcl_Ob
1d80: 6a 20 2a 0a 54 63 6c 5f 44 62 4e 65 77 4c 69 73  j *.Tcl_DbNewLis
1d90: 74 4f 62 6a 28 0a 20 20 20 20 69 6e 74 20 6f 62  tObj(.    int ob
1da0: 6a 63 2c 09 09 09 2f 2a 20 43 6f 75 6e 74 20 6f  jc,.../* Count o
1db0: 66 20 6f 62 6a 65 63 74 73 20 72 65 66 65 72 65  f objects refere
1dc0: 6e 63 65 64 20 62 79 20 6f 62 6a 76 2e 20 2a 2f  nced by objv. */
1dd0: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f  .    Tcl_Obj *co
1de0: 6e 73 74 20 6f 62 6a 76 5b 5d 2c 09 2f 2a 20 41  nst objv[],./* A
1df0: 6e 20 61 72 72 61 79 20 6f 66 20 70 6f 69 6e 74  n array of point
1e00: 65 72 73 20 74 6f 20 54 63 6c 20 6f 62 6a 65 63  ers to Tcl objec
1e10: 74 73 2e 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74  ts. */.    const
1e20: 20 63 68 61 72 20 2a 66 69 6c 65 2c 09 09 2f 2a   char *file,../*
1e30: 20 54 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   The name of the
1e40: 20 73 6f 75 72 63 65 20 66 69 6c 65 20 63 61 6c   source file cal
1e50: 6c 69 6e 67 20 74 68 69 73 0a 09 09 09 09 20 2a  ling this..... *
1e60: 20 66 75 6e 63 74 69 6f 6e 3b 20 75 73 65 64 20   function; used 
1e70: 66 6f 72 20 64 65 62 75 67 67 69 6e 67 2e 20 2a  for debugging. *
1e80: 2f 0a 20 20 20 20 69 6e 74 20 6c 69 6e 65 29 09  /.    int line).
1e90: 09 09 2f 2a 20 4c 69 6e 65 20 6e 75 6d 62 65 72  ../* Line number
1ea0: 20 69 6e 20 74 68 65 20 73 6f 75 72 63 65 20 66   in the source f
1eb0: 69 6c 65 3b 20 75 73 65 64 20 66 6f 72 0a 09 09  ile; used for...
1ec0: 09 09 20 2a 20 64 65 62 75 67 67 69 6e 67 2e 20  .. * debugging. 
1ed0: 2a 2f 0a 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  */.{.    return 
1ee0: 54 63 6c 5f 4e 65 77 4c 69 73 74 4f 62 6a 28 6f  Tcl_NewListObj(o
1ef0: 62 6a 63 2c 20 6f 62 6a 76 29 3b 0a 7d 0a 23 65  bjc, objv);.}.#e
1f00: 6e 64 69 66 20 2f 2a 20 54 43 4c 5f 4d 45 4d 5f  ndif /* TCL_MEM_
1f10: 44 45 42 55 47 20 2a 2f 0a 0c 0a 2f 2a 0a 20 2a  DEBUG */.../*. *
1f20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1f30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1f40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1f50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1f60: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 63 6c  ------. *. * Tcl
1f70: 5f 53 65 74 4c 69 73 74 4f 62 6a 20 2d 2d 0a 20  _SetListObj --. 
1f80: 2a 0a 20 2a 09 4c 69 6b 65 20 27 54 63 6c 5f 4e  *. *.Like 'Tcl_N
1f90: 65 77 4c 69 73 74 4f 62 6a 27 2c 20 62 75 74 20  ewListObj', but 
1fa0: 6f 70 65 72 61 74 65 73 20 6f 6e 20 61 6e 20 65  operates on an e
1fb0: 78 69 73 74 69 6e 67 20 27 54 63 6c 5f 4f 62 6a  xisting 'Tcl_Obj
1fc0: 27 69 6e 73 74 65 61 64 20 6f 66 0a 20 2a 09 63  'instead of. *.c
1fd0: 72 65 61 74 69 6e 67 20 61 20 6e 65 77 20 6f 6e  reating a new on
1fe0: 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  e.. *. *--------
1ff0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2000: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2010: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
2030: 2a 2f 0a 0a 76 6f 69 64 0a 54 63 6c 5f 53 65 74  */..void.Tcl_Set
2040: 4c 69 73 74 4f 62 6a 28 0a 20 20 20 20 54 63 6c  ListObj(.    Tcl
2050: 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 2c 09 09 2f  _Obj *objPtr,../
2060: 2a 20 4f 62 6a 65 63 74 20 77 68 6f 73 65 20 69  * Object whose i
2070: 6e 74 65 72 6e 61 6c 20 72 65 70 20 74 6f 20 69  nternal rep to i
2080: 6e 69 74 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20  nit. */.    int 
2090: 6f 62 6a 63 2c 09 09 09 2f 2a 20 43 6f 75 6e 74  objc,.../* Count
20a0: 20 6f 66 20 6f 62 6a 65 63 74 73 20 72 65 66 65   of objects refe
20b0: 72 65 6e 63 65 64 20 62 79 20 6f 62 6a 76 2e 20  renced by objv. 
20c0: 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a  */.    Tcl_Obj *
20d0: 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 09 2f 2a  const objv[])./*
20e0: 20 41 6e 20 61 72 72 61 79 20 6f 66 20 70 6f 69   An array of poi
20f0: 6e 74 65 72 73 20 74 6f 20 54 63 6c 20 6f 62 6a  nters to Tcl obj
2100: 65 63 74 73 2e 20 2a 2f 0a 7b 0a 20 20 20 20 4c  ects. */.{.    L
2110: 69 73 74 20 2a 6c 69 73 74 52 65 70 50 74 72 3b  ist *listRepPtr;
2120: 0a 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 49 73  ..    if (Tcl_Is
2130: 53 68 61 72 65 64 28 6f 62 6a 50 74 72 29 29 20  Shared(objPtr)) 
2140: 7b 0a 09 54 63 6c 5f 50 61 6e 69 63 28 22 25 73  {..Tcl_Panic("%s
2150: 20 63 61 6c 6c 65 64 20 77 69 74 68 20 73 68 61   called with sha
2160: 72 65 64 20 6f 62 6a 65 63 74 22 2c 20 22 54 63  red object", "Tc
2170: 6c 5f 53 65 74 4c 69 73 74 4f 62 6a 22 29 3b 0a  l_SetListObj");.
2180: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20      }..    /*.  
2190: 20 20 20 2a 20 46 72 65 65 20 61 6e 79 20 6f 6c     * Free any ol
21a0: 64 20 73 74 72 69 6e 67 20 72 65 70 20 61 6e 64  d string rep and
21b0: 20 61 6e 79 20 69 6e 74 65 72 6e 61 6c 20 72 65   any internal re
21c0: 70 20 66 6f 72 20 74 68 65 20 6f 6c 64 20 74 79  p for the old ty
21d0: 70 65 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20  pe..     */..   
21e0: 20 54 63 6c 46 72 65 65 49 6e 74 52 65 70 28 6f   TclFreeIntRep(o
21f0: 62 6a 50 74 72 29 3b 0a 20 20 20 20 54 63 6c 49  bjPtr);.    TclI
2200: 6e 76 61 6c 69 64 61 74 65 53 74 72 69 6e 67 52  nvalidateStringR
2210: 65 70 28 6f 62 6a 50 74 72 29 3b 0a 0a 20 20 20  ep(objPtr);..   
2220: 20 2f 2a 0a 20 20 20 20 20 2a 20 53 65 74 20 74   /*.     * Set t
2230: 68 65 20 6f 62 6a 65 63 74 27 73 20 74 79 70 65  he object's type
2240: 20 74 6f 20 22 6c 69 73 74 22 20 61 6e 64 20 69   to "list" and i
2250: 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 69 6e  nitialize the in
2260: 74 65 72 6e 61 6c 20 72 65 70 2e 0a 20 20 20 20  ternal rep..    
2270: 20 2a 20 48 6f 77 65 76 65 72 2c 20 69 66 20 74   * However, if t
2280: 68 65 72 65 20 61 72 65 20 6e 6f 20 65 6c 65 6d  here are no elem
2290: 65 6e 74 73 20 74 6f 20 70 75 74 20 69 6e 20 74  ents to put in t
22a0: 68 65 20 6c 69 73 74 2c 20 6a 75 73 74 20 67 69  he list, just gi
22b0: 76 65 20 74 68 65 0a 20 20 20 20 20 2a 20 6f 62  ve the.     * ob
22c0: 6a 65 63 74 20 61 6e 20 65 6d 70 74 79 20 73 74  ject an empty st
22d0: 72 69 6e 67 20 72 65 70 20 61 6e 64 20 61 20 4e  ring rep and a N
22e0: 55 4c 4c 20 74 79 70 65 2e 0a 20 20 20 20 20 2a  ULL type..     *
22f0: 2f 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20  /..    if (objc 
2300: 3e 20 30 29 20 7b 0a 09 6c 69 73 74 52 65 70 50  > 0) {..listRepP
2310: 74 72 20 3d 20 4e 65 77 4c 69 73 74 49 6e 74 52  tr = NewListIntR
2320: 65 70 28 6f 62 6a 63 2c 20 6f 62 6a 76 2c 20 31  ep(objc, objv, 1
2330: 29 3b 0a 09 4c 69 73 74 53 65 74 49 6e 74 52 65  );..ListSetIntRe
2340: 70 28 6f 62 6a 50 74 72 2c 20 6c 69 73 74 52 65  p(objPtr, listRe
2350: 70 50 74 72 29 3b 0a 20 20 20 20 7d 20 65 6c 73  pPtr);.    } els
2360: 65 20 7b 0a 09 6f 62 6a 50 74 72 2d 3e 62 79 74  e {..objPtr->byt
2370: 65 73 20 3d 20 74 63 6c 45 6d 70 74 79 53 74 72  es = tclEmptyStr
2380: 69 6e 67 52 65 70 3b 0a 09 6f 62 6a 50 74 72 2d  ingRep;..objPtr-
2390: 3e 6c 65 6e 67 74 68 20 3d 20 30 3b 0a 20 20 20  >length = 0;.   
23a0: 20 7d 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d   }.}.../*. *----
23b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
23c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
23d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
23e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
23f0: 2d 2d 0a 20 2a 0a 20 2a 20 54 63 6c 4c 69 73 74  --. *. * TclList
2400: 4f 62 6a 43 6f 70 79 20 2d 2d 0a 20 2a 0a 20 2a  ObjCopy --. *. *
2410: 09 43 72 65 61 74 65 73 20 61 20 6e 65 77 20 27  .Creates a new '
2420: 54 63 6c 5f 4f 62 6a 27 20 77 68 69 63 68 20 69  Tcl_Obj' which i
2430: 73 20 61 20 70 75 72 65 20 63 6f 70 79 20 6f 66  s a pure copy of
2440: 20 61 20 6c 69 73 74 20 76 61 6c 75 65 2e 20 54   a list value. T
2450: 68 69 73 0a 20 2a 09 70 72 6f 76 69 64 65 73 20  his. *.provides 
2460: 66 6f 72 20 74 68 65 20 43 20 6c 65 76 65 6c 20  for the C level 
2470: 61 20 63 6f 75 6e 74 65 72 70 61 72 74 20 6f 66  a counterpart of
2480: 20 74 68 65 20 5b 6c 72 61 6e 67 65 20 24 6c 69   the [lrange $li
2490: 73 74 20 30 20 65 6e 64 5d 0a 20 2a 09 63 6f 6d  st 0 end]. *.com
24a0: 6d 61 6e 64 2c 20 77 68 69 6c 65 20 75 73 69 6e  mand, while usin
24b0: 67 20 69 6e 74 65 72 6e 61 6c 73 20 64 65 74 61  g internals deta
24c0: 69 6c 73 20 74 6f 20 62 65 20 61 73 20 65 66 66  ils to be as eff
24d0: 69 63 69 65 6e 74 20 61 73 20 70 6f 73 73 69 62  icient as possib
24e0: 6c 65 2e 0a 20 2a 0a 20 2a 20 56 61 6c 75 65 0a  le.. *. * Value.
24f0: 20 2a 0a 20 2a 09 54 68 65 20 61 64 64 72 65 73   *. *.The addres
2500: 73 20 6f 66 20 74 68 65 20 6e 65 77 20 27 54 63  s of the new 'Tc
2510: 6c 5f 4f 62 6a 27 20 77 68 69 63 68 20 73 68 61  l_Obj' which sha
2520: 72 65 73 20 69 74 73 20 69 6e 74 65 72 6e 61 6c  res its internal
2530: 0a 20 2a 09 72 65 70 72 65 73 65 6e 74 61 74 69  . *.representati
2540: 6f 6e 20 77 69 74 68 20 27 6c 69 73 74 50 74 72  on with 'listPtr
2550: 27 2c 20 61 6e 64 20 77 68 6f 73 65 20 72 65 66  ', and whose ref
2560: 43 6f 75 6e 74 20 69 73 20 30 2e 20 20 49 66 20  Count is 0.  If 
2570: 27 6c 69 73 74 50 74 72 27 0a 20 2a 09 69 73 20  'listPtr'. *.is 
2580: 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 61 20 6c  not actually a l
2590: 69 73 74 2c 20 74 68 65 20 76 61 6c 75 65 20 69  ist, the value i
25a0: 73 20 4e 55 4c 4c 2c 20 61 6e 64 20 61 6e 20 65  s NULL, and an e
25b0: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20  rror message is 
25c0: 6c 65 66 74 0a 20 2a 09 69 6e 20 27 69 6e 74 65  left. *.in 'inte
25d0: 72 70 27 20 69 66 20 69 74 20 69 73 20 6e 6f 74  rp' if it is not
25e0: 20 4e 55 4c 4c 2e 0a 20 2a 0a 20 2a 20 45 66 66   NULL.. *. * Eff
25f0: 65 63 74 0a 20 2a 0a 20 2a 09 27 6c 69 73 74 50  ect. *. *.'listP
2600: 74 72 27 20 69 73 20 63 6f 6e 76 65 72 74 65 64  tr' is converted
2610: 20 74 6f 20 61 20 6c 69 73 74 20 69 66 20 69 74   to a list if it
2620: 20 69 73 6e 27 74 20 6f 6e 65 20 61 6c 72 65 61   isn't one alrea
2630: 64 79 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  dy.. *. *-------
2640: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2650: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2660: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2670: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
2680: 20 2a 2f 0a 0a 54 63 6c 5f 4f 62 6a 20 2a 0a 54   */..Tcl_Obj *.T
2690: 63 6c 4c 69 73 74 4f 62 6a 43 6f 70 79 28 0a 20  clListObjCopy(. 
26a0: 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69     Tcl_Interp *i
26b0: 6e 74 65 72 70 2c 09 09 2f 2a 20 55 73 65 64 20  nterp,../* Used 
26c0: 74 6f 20 72 65 70 6f 72 74 20 65 72 72 6f 72 73  to report errors
26d0: 20 69 66 20 6e 6f 74 20 4e 55 4c 4c 2e 20 2a 2f   if not NULL. */
26e0: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6c 69  .    Tcl_Obj *li
26f0: 73 74 50 74 72 29 09 09 2f 2a 20 4c 69 73 74 20  stPtr)../* List 
2700: 6f 62 6a 65 63 74 20 66 6f 72 20 77 68 69 63 68  object for which
2710: 20 61 6e 20 65 6c 65 6d 65 6e 74 20 61 72 72 61   an element arra
2720: 79 20 69 73 0a 09 09 09 09 20 2a 20 74 6f 20 62  y is..... * to b
2730: 65 20 72 65 74 75 72 6e 65 64 2e 20 2a 2f 0a 7b  e returned. */.{
2740: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f  .    Tcl_Obj *co
2750: 70 79 50 74 72 3b 0a 0a 20 20 20 20 69 66 20 28  pyPtr;..    if (
2760: 6c 69 73 74 50 74 72 2d 3e 74 79 70 65 50 74 72  listPtr->typePtr
2770: 20 21 3d 20 26 74 63 6c 4c 69 73 74 54 79 70 65   != &tclListType
2780: 29 20 7b 0a 09 69 66 20 28 53 65 74 4c 69 73 74  ) {..if (SetList
2790: 46 72 6f 6d 41 6e 79 28 69 6e 74 65 72 70 2c 20  FromAny(interp, 
27a0: 6c 69 73 74 50 74 72 29 20 21 3d 20 54 43 4c 5f  listPtr) != TCL_
27b0: 4f 4b 29 20 7b 0a 09 20 20 20 20 72 65 74 75 72  OK) {..    retur
27c0: 6e 20 4e 55 4c 4c 3b 0a 09 7d 0a 20 20 20 20 7d  n NULL;..}.    }
27d0: 0a 0a 20 20 20 20 54 63 6c 4e 65 77 4f 62 6a 28  ..    TclNewObj(
27e0: 63 6f 70 79 50 74 72 29 3b 0a 20 20 20 20 54 63  copyPtr);.    Tc
27f0: 6c 49 6e 76 61 6c 69 64 61 74 65 53 74 72 69 6e  lInvalidateStrin
2800: 67 52 65 70 28 63 6f 70 79 50 74 72 29 3b 0a 20  gRep(copyPtr);. 
2810: 20 20 20 44 75 70 4c 69 73 74 49 6e 74 65 72 6e     DupListIntern
2820: 61 6c 52 65 70 28 6c 69 73 74 50 74 72 2c 20 63  alRep(listPtr, c
2830: 6f 70 79 50 74 72 29 3b 0a 20 20 20 20 72 65 74  opyPtr);.    ret
2840: 75 72 6e 20 63 6f 70 79 50 74 72 3b 0a 7d 0a 0c  urn copyPtr;.}..
2850: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ./*. *----------
2860: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2870: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2880: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2890: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a  ------------. *.
28a0: 20 2a 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 47 65   * Tcl_ListObjGe
28b0: 74 45 6c 65 6d 65 6e 74 73 20 2d 2d 0a 20 2a 0a  tElements --. *.
28c0: 20 2a 09 52 65 74 72 65 69 76 65 20 74 68 65 20   *.Retreive the 
28d0: 65 6c 65 6d 65 6e 74 73 20 69 6e 20 61 20 6c 69  elements in a li
28e0: 73 74 20 27 54 63 6c 5f 4f 62 6a 27 2e 0a 20 2a  st 'Tcl_Obj'.. *
28f0: 0a 20 2a 20 56 61 6c 75 65 0a 20 2a 0a 20 2a 09  . * Value. *. *.
2900: 54 43 4c 5f 4f 4b 0a 20 2a 0a 20 2a 09 20 20 20  TCL_OK. *. *.   
2910: 20 41 20 63 6f 75 6e 74 20 6f 66 20 6c 69 73 74   A count of list
2920: 20 65 6c 65 6d 65 6e 74 73 20 69 73 20 73 74 6f   elements is sto
2930: 72 65 64 2c 20 27 6f 62 6a 63 50 74 72 27 2c 20  red, 'objcPtr', 
2940: 41 6e 64 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  And a pointer to
2950: 20 74 68 65 0a 20 2a 09 20 20 20 20 61 72 72 61   the. *.    arra
2960: 79 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e  y of elements in
2970: 20 74 68 65 20 6c 69 73 74 20 69 73 20 73 74 6f   the list is sto
2980: 72 65 64 20 69 6e 20 27 6f 62 6a 76 50 74 72 27  red in 'objvPtr'
2990: 2e 0a 20 2a 0a 20 2a 09 20 20 20 20 54 68 65 20  .. *. *.    The 
29a0: 65 6c 65 6d 65 6e 74 73 20 61 63 63 65 73 73 69  elements accessi
29b0: 62 6c 65 20 76 69 61 20 27 6f 62 6a 76 50 74 72  ble via 'objvPtr
29c0: 27 20 73 68 6f 75 6c 64 20 62 65 20 74 72 65 61  ' should be trea
29d0: 74 65 64 20 61 73 20 72 65 61 64 6f 6e 6c 79 0a  ted as readonly.
29e0: 20 2a 09 20 20 20 20 61 6e 64 20 74 68 65 20 72   *.    and the r
29f0: 65 66 43 6f 75 6e 74 20 66 6f 72 20 65 61 63 68  efCount for each
2a00: 20 6f 62 6a 65 63 74 20 69 73 20 5f 6e 6f 74 5f   object is _not_
2a10: 20 69 6e 63 72 65 6d 65 6e 74 65 64 3b 20 74 68   incremented; th
2a20: 65 20 63 61 6c 6c 65 72 0a 20 2a 09 20 20 20 20  e caller. *.    
2a30: 6d 75 73 74 20 64 6f 20 74 68 61 74 20 69 66 20  must do that if 
2a40: 69 74 20 68 6f 6c 64 73 20 6f 6e 20 74 6f 20 61  it holds on to a
2a50: 20 72 65 66 65 72 65 6e 63 65 2e 20 46 75 72 74   reference. Furt
2a60: 68 65 72 6d 6f 72 65 2c 20 74 68 65 0a 20 2a 09  hermore, the. *.
2a70: 20 20 20 20 70 6f 69 6e 74 65 72 20 61 6e 64 20      pointer and 
2a80: 6c 65 6e 67 74 68 20 72 65 74 75 72 6e 65 64 20  length returned 
2a90: 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  by this function
2aa0: 20 6d 61 79 20 63 68 61 6e 67 65 20 61 73 20 73   may change as s
2ab0: 6f 6f 6e 20 61 73 0a 20 2a 09 20 20 20 20 61 6e  oon as. *.    an
2ac0: 79 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  y function is ca
2ad0: 6c 6c 65 64 20 6f 6e 20 74 68 65 20 6c 69 73 74  lled on the list
2ae0: 20 6f 62 6a 65 63 74 2e 20 42 65 20 63 61 72 65   object. Be care
2af0: 66 75 6c 20 61 62 6f 75 74 0a 20 2a 09 20 20 20  ful about. *.   
2b00: 20 72 65 74 61 69 6e 69 6e 67 20 74 68 65 20 70   retaining the p
2b10: 6f 69 6e 74 65 72 20 69 6e 20 61 20 6c 6f 63 61  ointer in a loca
2b20: 6c 20 64 61 74 61 20 73 74 72 75 63 74 75 72 65  l data structure
2b30: 2e 0a 20 2a 0a 20 2a 09 54 43 4c 5f 45 52 52 4f  .. *. *.TCL_ERRO
2b40: 52 0a 20 2a 0a 20 2a 09 20 20 20 20 27 6c 69 73  R. *. *.    'lis
2b50: 74 50 74 72 27 20 69 73 20 6e 6f 74 20 61 20 76  tPtr' is not a v
2b60: 61 6c 69 64 20 6c 69 73 74 2e 20 41 6e 20 65 72  alid list. An er
2b70: 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20 6c  ror message is l
2b80: 65 66 74 20 69 6e 20 74 68 65 0a 20 2a 09 20 20  eft in the. *.  
2b90: 20 20 69 6e 74 65 72 70 72 65 74 65 72 27 73 20    interpreter's 
2ba0: 72 65 73 75 6c 74 20 69 66 20 27 69 6e 74 65 72  result if 'inter
2bb0: 70 27 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e 0a  p' is not NULL..
2bc0: 20 2a 0a 20 2a 20 45 66 66 65 63 74 0a 20 2a 0a   *. * Effect. *.
2bd0: 20 2a 09 27 6c 69 73 74 50 74 72 27 20 69 73 20   *.'listPtr' is 
2be0: 63 6f 6e 76 65 72 74 65 64 20 74 6f 20 61 20 6c  converted to a l
2bf0: 69 73 74 20 6f 62 6a 65 63 74 20 69 66 20 69 74  ist object if it
2c00: 20 69 73 6e 27 74 20 6f 6e 65 20 61 6c 72 65 61   isn't one alrea
2c10: 64 79 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  dy.. *. *-------
2c20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2c30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2c40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2c50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
2c60: 20 2a 2f 0a 0a 69 6e 74 0a 54 63 6c 5f 4c 69 73   */..int.Tcl_Lis
2c70: 74 4f 62 6a 47 65 74 45 6c 65 6d 65 6e 74 73 28  tObjGetElements(
2c80: 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  .    Tcl_Interp 
2c90: 2a 69 6e 74 65 72 70 2c 09 09 2f 2a 20 55 73 65  *interp,../* Use
2ca0: 64 20 74 6f 20 72 65 70 6f 72 74 20 65 72 72 6f  d to report erro
2cb0: 72 73 20 69 66 20 6e 6f 74 20 4e 55 4c 4c 2e 20  rs if not NULL. 
2cc0: 2a 2f 0a 20 20 20 20 72 65 67 69 73 74 65 72 20  */.    register 
2cd0: 54 63 6c 5f 4f 62 6a 20 2a 6c 69 73 74 50 74 72  Tcl_Obj *listPtr
2ce0: 2c 09 2f 2a 20 4c 69 73 74 20 6f 62 6a 65 63 74  ,./* List object
2cf0: 20 66 6f 72 20 77 68 69 63 68 20 61 6e 20 65 6c   for which an el
2d00: 65 6d 65 6e 74 20 61 72 72 61 79 20 69 73 0a 09  ement array is..
2d10: 09 09 09 20 2a 20 74 6f 20 62 65 20 72 65 74 75  ... * to be retu
2d20: 72 6e 65 64 2e 20 2a 2f 0a 20 20 20 20 69 6e 74  rned. */.    int
2d30: 20 2a 6f 62 6a 63 50 74 72 2c 09 09 2f 2a 20 57   *objcPtr,../* W
2d40: 68 65 72 65 20 74 6f 20 73 74 6f 72 65 20 74 68  here to store th
2d50: 65 20 63 6f 75 6e 74 20 6f 66 20 6f 62 6a 65 63  e count of objec
2d60: 74 73 0a 09 09 09 09 20 2a 20 72 65 66 65 72 65  ts..... * refere
2d70: 6e 63 65 64 20 62 79 20 6f 62 6a 76 2e 20 2a 2f  nced by objv. */
2d80: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a 2a  .    Tcl_Obj ***
2d90: 6f 62 6a 76 50 74 72 29 09 09 2f 2a 20 57 68 65  objvPtr)../* Whe
2da0: 72 65 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20  re to store the 
2db0: 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 61 72  pointer to an ar
2dc0: 72 61 79 20 6f 66 0a 09 09 09 09 20 2a 20 70 6f  ray of..... * po
2dd0: 69 6e 74 65 72 73 20 74 6f 20 74 68 65 20 6c 69  inters to the li
2de0: 73 74 27 73 20 6f 62 6a 65 63 74 73 2e 20 2a 2f  st's objects. */
2df0: 0a 7b 0a 20 20 20 20 72 65 67 69 73 74 65 72 20  .{.    register 
2e00: 4c 69 73 74 20 2a 6c 69 73 74 52 65 70 50 74 72  List *listRepPtr
2e10: 3b 0a 0a 20 20 20 20 69 66 20 28 6c 69 73 74 50  ;..    if (listP
2e20: 74 72 2d 3e 74 79 70 65 50 74 72 20 21 3d 20 26  tr->typePtr != &
2e30: 74 63 6c 4c 69 73 74 54 79 70 65 29 20 7b 0a 09  tclListType) {..
2e40: 69 6e 74 20 72 65 73 75 6c 74 3b 0a 0a 09 69 66  int result;...if
2e50: 20 28 6c 69 73 74 50 74 72 2d 3e 62 79 74 65 73   (listPtr->bytes
2e60: 20 3d 3d 20 74 63 6c 45 6d 70 74 79 53 74 72 69   == tclEmptyStri
2e70: 6e 67 52 65 70 29 20 7b 0a 09 20 20 20 20 2a 6f  ngRep) {..    *o
2e80: 62 6a 63 50 74 72 20 3d 20 30 3b 0a 09 20 20 20  bjcPtr = 0;..   
2e90: 20 2a 6f 62 6a 76 50 74 72 20 3d 20 4e 55 4c 4c   *objvPtr = NULL
2ea0: 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43  ;..    return TC
2eb0: 4c 5f 4f 4b 3b 0a 09 7d 0a 09 72 65 73 75 6c 74  L_OK;..}..result
2ec0: 20 3d 20 53 65 74 4c 69 73 74 46 72 6f 6d 41 6e   = SetListFromAn
2ed0: 79 28 69 6e 74 65 72 70 2c 20 6c 69 73 74 50 74  y(interp, listPt
2ee0: 72 29 3b 0a 09 69 66 20 28 72 65 73 75 6c 74 20  r);..if (result 
2ef0: 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20  != TCL_OK) {..  
2f00: 20 20 72 65 74 75 72 6e 20 72 65 73 75 6c 74 3b    return result;
2f10: 0a 09 7d 0a 20 20 20 20 7d 0a 20 20 20 20 6c 69  ..}.    }.    li
2f20: 73 74 52 65 70 50 74 72 20 3d 20 4c 69 73 74 52  stRepPtr = ListR
2f30: 65 70 50 74 72 28 6c 69 73 74 50 74 72 29 3b 0a  epPtr(listPtr);.
2f40: 20 20 20 20 2a 6f 62 6a 63 50 74 72 20 3d 20 6c      *objcPtr = l
2f50: 69 73 74 52 65 70 50 74 72 2d 3e 65 6c 65 6d 43  istRepPtr->elemC
2f60: 6f 75 6e 74 3b 0a 20 20 20 20 2a 6f 62 6a 76 50  ount;.    *objvP
2f70: 74 72 20 3d 20 26 6c 69 73 74 52 65 70 50 74 72  tr = &listRepPtr
2f80: 2d 3e 65 6c 65 6d 65 6e 74 73 3b 0a 20 20 20 20  ->elements;.    
2f90: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d  return TCL_OK;.}
2fa0: 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  .../*. *--------
2fb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2fc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2fd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2fe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
2ff0: 2a 0a 20 2a 20 54 63 6c 5f 4c 69 73 74 4f 62 6a  *. * Tcl_ListObj
3000: 41 70 70 65 6e 64 4c 69 73 74 20 2d 2d 0a 20 2a  AppendList --. *
3010: 0a 20 2a 09 41 70 70 65 6e 64 73 20 74 68 65 20  . *.Appends the 
3020: 65 6c 65 6d 65 6e 74 73 20 6f 66 20 65 6c 65 6d  elements of elem
3030: 4c 69 73 74 50 74 72 20 74 6f 20 74 68 6f 73 65  ListPtr to those
3040: 20 6f 66 20 6c 69 73 74 50 74 72 2e 0a 20 2a 0a   of listPtr.. *.
3050: 20 2a 20 56 61 6c 75 65 0a 20 2a 0a 20 2a 09 54   * Value. *. *.T
3060: 43 4c 5f 4f 4b 0a 20 2a 0a 20 2a 09 20 20 20 20  CL_OK. *. *.    
3070: 53 75 63 63 65 73 73 2e 0a 20 2a 0a 20 2a 09 54  Success.. *. *.T
3080: 43 4c 5f 45 52 52 4f 52 0a 20 2a 0a 20 2a 09 20  CL_ERROR. *. *. 
3090: 20 20 20 27 6c 69 73 74 50 74 72 27 20 6f 72 20     'listPtr' or 
30a0: 27 65 6c 65 6d 4c 69 73 74 50 74 72 27 20 61 72  'elemListPtr' ar
30b0: 65 20 6e 6f 74 20 76 61 6c 69 64 20 6c 69 73 74  e not valid list
30c0: 73 2e 20 20 41 6e 20 65 72 72 6f 72 0a 20 2a 09  s.  An error. *.
30d0: 20 20 20 20 6d 65 73 73 61 67 65 20 69 73 20 6c      message is l
30e0: 65 66 74 20 69 6e 20 74 68 65 20 69 6e 74 65 72  eft in the inter
30f0: 70 72 65 74 65 72 27 73 20 72 65 73 75 6c 74 20  preter's result 
3100: 69 66 20 27 69 6e 74 65 72 70 27 20 69 73 20 6e  if 'interp' is n
3110: 6f 74 20 4e 55 4c 4c 2e 0a 20 2a 0a 20 2a 20 45  ot NULL.. *. * E
3120: 66 66 65 63 74 0a 20 2a 0a 20 2a 09 54 68 65 20  ffect. *. *.The 
3130: 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
3140: 6f 66 20 65 61 63 68 20 65 6c 65 6d 65 6e 74 20  of each element 
3150: 6f 66 20 27 65 6c 65 6d 4c 69 73 74 50 74 72 27  of 'elemListPtr'
3160: 20 61 73 20 69 74 20 69 73 20 61 64 64 65 64 20   as it is added 
3170: 74 6f 0a 20 2a 09 27 6c 69 73 74 50 74 72 27 2e  to. *.'listPtr'.
3180: 20 27 6c 69 73 74 50 74 72 27 20 61 6e 64 20 27   'listPtr' and '
3190: 65 6c 65 6d 4c 69 73 74 50 74 72 27 20 61 72 65  elemListPtr' are
31a0: 20 63 6f 6e 76 65 72 74 65 64 20 74 6f 20 27 74   converted to 't
31b0: 63 6c 4c 69 73 74 54 79 70 65 27 0a 20 2a 09 69  clListType'. *.i
31c0: 66 20 74 68 65 79 20 61 72 65 20 6e 6f 74 20 61  f they are not a
31d0: 6c 72 65 61 64 79 2e 20 41 70 70 65 6e 64 69 6e  lready. Appendin
31e0: 67 20 74 68 65 20 6e 65 77 20 65 6c 65 6d 65 6e  g the new elemen
31f0: 74 73 20 6d 61 79 20 63 61 75 73 65 20 74 68 65  ts may cause the
3200: 0a 20 2a 09 61 72 72 61 79 20 6f 66 20 65 6c 65  . *.array of ele
3210: 6d 65 6e 74 20 70 6f 69 6e 74 65 72 73 20 69 6e  ment pointers in
3220: 20 27 6c 69 73 74 4f 62 6a 27 20 74 6f 20 67 72   'listObj' to gr
3230: 6f 77 2e 20 20 49 66 20 61 6e 79 20 6f 62 6a 65  ow.  If any obje
3240: 63 74 73 20 61 72 65 0a 20 2a 09 61 70 70 65 6e  cts are. *.appen
3250: 64 65 64 20 74 6f 20 27 6c 69 73 74 50 74 72 27  ded to 'listPtr'
3260: 2e 20 41 6e 79 20 70 72 65 65 78 69 73 74 69 6e  . Any preexistin
3270: 67 20 73 74 72 69 6e 67 20 72 65 70 72 65 73 65  g string represe
3280: 6e 74 61 74 69 6f 6e 20 6f 66 0a 20 2a 09 27 6c  ntation of. *.'l
3290: 69 73 74 50 74 72 27 20 69 73 20 69 6e 76 61 6c  istPtr' is inval
32a0: 69 64 61 74 65 64 2e 0a 20 2a 0a 20 2a 2d 2d 2d  idated.. *. *---
32b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
32c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
32d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
32e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
32f0: 2d 2d 2d 0a 20 2a 2f 0a 0a 69 6e 74 0a 54 63 6c  ---. */..int.Tcl
3300: 5f 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 4c 69  _ListObjAppendLi
3310: 73 74 28 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65  st(.    Tcl_Inte
3320: 72 70 20 2a 69 6e 74 65 72 70 2c 09 09 2f 2a 20  rp *interp,../* 
3330: 55 73 65 64 20 74 6f 20 72 65 70 6f 72 74 20 65  Used to report e
3340: 72 72 6f 72 73 20 69 66 20 6e 6f 74 20 4e 55 4c  rrors if not NUL
3350: 4c 2e 20 2a 2f 0a 20 20 20 20 72 65 67 69 73 74  L. */.    regist
3360: 65 72 20 54 63 6c 5f 4f 62 6a 20 2a 6c 69 73 74  er Tcl_Obj *list
3370: 50 74 72 2c 09 2f 2a 20 4c 69 73 74 20 6f 62 6a  Ptr,./* List obj
3380: 65 63 74 20 74 6f 20 61 70 70 65 6e 64 20 65 6c  ect to append el
3390: 65 6d 65 6e 74 73 20 74 6f 2e 20 2a 2f 0a 20 20  ements to. */.  
33a0: 20 20 54 63 6c 5f 4f 62 6a 20 2a 65 6c 65 6d 4c    Tcl_Obj *elemL
33b0: 69 73 74 50 74 72 29 09 2f 2a 20 4c 69 73 74 20  istPtr)./* List 
33c0: 6f 62 6a 20 77 69 74 68 20 65 6c 65 6d 65 6e 74  obj with element
33d0: 73 20 74 6f 20 61 70 70 65 6e 64 2e 20 2a 2f 0a  s to append. */.
33e0: 7b 0a 20 20 20 20 69 6e 74 20 6f 62 6a 63 3b 0a  {.    int objc;.
33f0: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a 6f 62      Tcl_Obj **ob
3400: 6a 76 3b 0a 0a 20 20 20 20 69 66 20 28 54 63 6c  jv;..    if (Tcl
3410: 5f 49 73 53 68 61 72 65 64 28 6c 69 73 74 50 74  _IsShared(listPt
3420: 72 29 29 20 7b 0a 09 54 63 6c 5f 50 61 6e 69 63  r)) {..Tcl_Panic
3430: 28 22 25 73 20 63 61 6c 6c 65 64 20 77 69 74 68  ("%s called with
3440: 20 73 68 61 72 65 64 20 6f 62 6a 65 63 74 22 2c   shared object",
3450: 20 22 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70   "Tcl_ListObjApp
3460: 65 6e 64 4c 69 73 74 22 29 3b 0a 20 20 20 20 7d  endList");.    }
3470: 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20  ..    /*.     * 
3480: 50 75 6c 6c 20 74 68 65 20 65 6c 65 6d 65 6e 74  Pull the element
3490: 73 20 74 6f 20 61 70 70 65 6e 64 20 66 72 6f 6d  s to append from
34a0: 20 65 6c 65 6d 4c 69 73 74 50 74 72 2e 0a 20 20   elemListPtr..  
34b0: 20 20 20 2a 2f 0a 0a 20 20 20 20 69 66 20 28 54     */..    if (T
34c0: 43 4c 5f 4f 4b 20 21 3d 20 54 63 6c 4c 69 73 74  CL_OK != TclList
34d0: 4f 62 6a 47 65 74 45 6c 65 6d 65 6e 74 73 28 69  ObjGetElements(i
34e0: 6e 74 65 72 70 2c 20 65 6c 65 6d 4c 69 73 74 50  nterp, elemListP
34f0: 74 72 2c 20 26 6f 62 6a 63 2c 20 26 6f 62 6a 76  tr, &objc, &objv
3500: 29 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c  )) {..return TCL
3510: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20  _ERROR;.    }.. 
3520: 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 49 6e 73     /*.     * Ins
3530: 65 72 74 20 74 68 65 20 6e 65 77 20 65 6c 65 6d  ert the new elem
3540: 65 6e 74 73 20 73 74 61 72 74 69 6e 67 20 61 66  ents starting af
3550: 74 65 72 20 74 68 65 20 6c 69 73 74 73 27 73 20  ter the lists's 
3560: 6c 61 73 74 20 65 6c 65 6d 65 6e 74 2e 0a 20 20  last element..  
3570: 20 20 20 2a 20 44 65 6c 65 74 65 20 7a 65 72 6f     * Delete zero
3580: 20 65 78 69 73 74 69 6e 67 20 65 6c 65 6d 65 6e   existing elemen
3590: 74 73 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20  ts..     */..   
35a0: 20 72 65 74 75 72 6e 20 54 63 6c 5f 4c 69 73 74   return Tcl_List
35b0: 4f 62 6a 52 65 70 6c 61 63 65 28 69 6e 74 65 72  ObjReplace(inter
35c0: 70 2c 20 6c 69 73 74 50 74 72 2c 20 4c 49 53 54  p, listPtr, LIST
35d0: 5f 4d 41 58 2c 20 30 2c 20 6f 62 6a 63 2c 20 6f  _MAX, 0, objc, o
35e0: 62 6a 76 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d  bjv);.}.../*. *-
35f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3600: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3610: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3620: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3630: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 63 6c 5f  -----. *. * Tcl_
3640: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65  ListObjAppendEle
3650: 6d 65 6e 74 20 2d 2d 0a 20 2a 0a 20 2a 09 4c 69  ment --. *. *.Li
3660: 6b 65 20 27 54 63 6c 5f 4c 69 73 74 4f 62 6a 41  ke 'Tcl_ListObjA
3670: 70 70 65 6e 64 4c 69 73 74 27 2c 20 62 75 74 20  ppendList', but 
3680: 41 70 70 65 6e 64 73 20 61 20 73 69 6e 67 6c 65  Appends a single
3690: 20 76 61 6c 75 65 20 74 6f 20 61 20 6c 69 73 74   value to a list
36a0: 2e 0a 20 2a 0a 20 2a 20 56 61 6c 75 65 0a 20 2a  .. *. * Value. *
36b0: 0a 20 2a 09 54 43 4c 5f 4f 4b 0a 20 2a 0a 20 2a  . *.TCL_OK. *. *
36c0: 09 20 20 20 20 27 6f 62 6a 50 74 72 27 20 69 73  .    'objPtr' is
36d0: 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65   appended to the
36e0: 20 65 6c 65 6d 65 6e 74 73 20 6f 66 20 27 6c 69   elements of 'li
36f0: 73 74 50 74 72 27 2e 0a 20 2a 0a 20 2a 09 54 43  stPtr'.. *. *.TC
3700: 4c 5f 45 52 52 4f 52 0a 20 2a 0a 20 2a 09 20 20  L_ERROR. *. *.  
3710: 20 20 6c 69 73 74 50 74 72 20 64 6f 65 73 20 6e    listPtr does n
3720: 6f 74 20 72 65 66 65 72 20 74 6f 20 61 20 6c 69  ot refer to a li
3730: 73 74 20 6f 62 6a 65 63 74 20 61 6e 64 20 74 68  st object and th
3740: 65 20 6f 62 6a 65 63 74 20 63 61 6e 20 6e 6f 74  e object can not
3750: 20 62 65 0a 20 2a 09 20 20 20 20 63 6f 6e 76 65   be. *.    conve
3760: 72 74 65 64 20 74 6f 20 6f 6e 65 2e 20 41 6e 20  rted to one. An 
3770: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 77 69  error message wi
3780: 6c 6c 20 62 65 20 6c 65 66 74 20 69 6e 20 74 68  ll be left in th
3790: 65 0a 20 2a 09 20 20 20 20 69 6e 74 65 72 70 72  e. *.    interpr
37a0: 65 74 65 72 27 73 20 72 65 73 75 6c 74 20 69 66  eter's result if
37b0: 20 69 6e 74 65 72 70 20 69 73 20 6e 6f 74 20 4e   interp is not N
37c0: 55 4c 4c 2e 0a 20 2a 0a 20 2a 20 45 66 66 65 63  ULL.. *. * Effec
37d0: 74 0a 20 2a 0a 20 2a 09 49 66 20 27 6c 69 73 74  t. *. *.If 'list
37e0: 50 74 72 27 20 69 73 20 6e 6f 74 20 61 6c 72 65  Ptr' is not alre
37f0: 61 64 79 20 6f 66 20 74 79 70 65 20 27 74 63 6c  ady of type 'tcl
3800: 4c 69 73 74 54 79 70 65 27 2c 20 69 74 20 69 73  ListType', it is
3810: 20 63 6f 6e 76 65 72 74 65 64 2e 0a 20 2a 09 54   converted.. *.T
3820: 68 65 20 27 72 65 66 43 6f 75 6e 74 27 20 6f 66  he 'refCount' of
3830: 20 27 6f 62 6a 50 74 72 27 20 69 73 20 69 6e 63   'objPtr' is inc
3840: 72 65 6d 65 6e 74 65 64 20 61 73 20 69 74 20 69  remented as it i
3850: 73 20 61 64 64 65 64 20 74 6f 20 27 6c 69 73 74  s added to 'list
3860: 50 74 72 27 2e 0a 20 2a 09 41 70 70 65 6e 64 69  Ptr'.. *.Appendi
3870: 6e 67 20 74 68 65 20 6e 65 77 20 65 6c 65 6d 65  ng the new eleme
3880: 6e 74 20 6d 61 79 20 63 61 75 73 65 20 74 68 65  nt may cause the
3890: 20 74 68 65 20 61 72 72 61 79 20 6f 66 20 65 6c   the array of el
38a0: 65 6d 65 6e 74 20 70 6f 69 6e 74 65 72 73 0a 20  ement pointers. 
38b0: 2a 09 69 6e 20 27 6c 69 73 74 4f 62 6a 27 20 74  *.in 'listObj' t
38c0: 6f 20 67 72 6f 77 2e 20 20 41 6e 79 20 70 72 65  o grow.  Any pre
38d0: 65 78 69 73 74 69 6e 67 20 73 74 72 69 6e 67 20  existing string 
38e0: 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f  representation o
38f0: 66 0a 20 2a 09 27 6c 69 73 74 50 74 72 27 20 69  f. *.'listPtr' i
3900: 73 20 69 6e 76 61 6c 69 64 61 74 65 64 2e 0a 20  s invalidated.. 
3910: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
3920: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3930: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3940: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3950: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a  ----------. */..
3960: 69 6e 74 0a 54 63 6c 5f 4c 69 73 74 4f 62 6a 41  int.Tcl_ListObjA
3970: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 0a 20 20  ppendElement(.  
3980: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
3990: 74 65 72 70 2c 09 09 2f 2a 20 55 73 65 64 20 74  terp,../* Used t
39a0: 6f 20 72 65 70 6f 72 74 20 65 72 72 6f 72 73 20  o report errors 
39b0: 69 66 20 6e 6f 74 20 4e 55 4c 4c 2e 20 2a 2f 0a  if not NULL. */.
39c0: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6c 69 73      Tcl_Obj *lis
39d0: 74 50 74 72 2c 09 09 2f 2a 20 4c 69 73 74 20 6f  tPtr,../* List o
39e0: 62 6a 65 63 74 20 74 6f 20 61 70 70 65 6e 64 20  bject to append 
39f0: 6f 62 6a 50 74 72 20 74 6f 2e 20 2a 2f 0a 20 20  objPtr to. */.  
3a00: 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74    Tcl_Obj *objPt
3a10: 72 29 09 09 2f 2a 20 4f 62 6a 65 63 74 20 74 6f  r)../* Object to
3a20: 20 61 70 70 65 6e 64 20 74 6f 20 6c 69 73 74 50   append to listP
3a30: 74 72 27 73 20 6c 69 73 74 2e 20 2a 2f 0a 7b 0a  tr's list. */.{.
3a40: 20 20 20 20 72 65 67 69 73 74 65 72 20 4c 69 73      register Lis
3a50: 74 20 2a 6c 69 73 74 52 65 70 50 74 72 2c 20 2a  t *listRepPtr, *
3a60: 6e 65 77 50 74 72 20 3d 20 4e 55 4c 4c 3b 0a 20  newPtr = NULL;. 
3a70: 20 20 20 69 6e 74 20 6e 75 6d 45 6c 65 6d 73 2c     int numElems,
3a80: 20 6e 75 6d 52 65 71 75 69 72 65 64 2c 20 6e 65   numRequired, ne
3a90: 65 64 47 72 6f 77 2c 20 69 73 53 68 61 72 65 64  edGrow, isShared
3aa0: 2c 20 61 74 74 65 6d 70 74 3b 0a 0a 20 20 20 20  , attempt;..    
3ab0: 69 66 20 28 54 63 6c 5f 49 73 53 68 61 72 65 64  if (Tcl_IsShared
3ac0: 28 6c 69 73 74 50 74 72 29 29 20 7b 0a 09 54 63  (listPtr)) {..Tc
3ad0: 6c 5f 50 61 6e 69 63 28 22 25 73 20 63 61 6c 6c  l_Panic("%s call
3ae0: 65 64 20 77 69 74 68 20 73 68 61 72 65 64 20 6f  ed with shared o
3af0: 62 6a 65 63 74 22 2c 20 22 54 63 6c 5f 4c 69 73  bject", "Tcl_Lis
3b00: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
3b10: 74 22 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  t");.    }.    i
3b20: 66 20 28 6c 69 73 74 50 74 72 2d 3e 74 79 70 65  f (listPtr->type
3b30: 50 74 72 20 21 3d 20 26 74 63 6c 4c 69 73 74 54  Ptr != &tclListT
3b40: 79 70 65 29 20 7b 0a 09 69 6e 74 20 72 65 73 75  ype) {..int resu
3b50: 6c 74 3b 0a 0a 09 69 66 20 28 6c 69 73 74 50 74  lt;...if (listPt
3b60: 72 2d 3e 62 79 74 65 73 20 3d 3d 20 74 63 6c 45  r->bytes == tclE
3b70: 6d 70 74 79 53 74 72 69 6e 67 52 65 70 29 20 7b  mptyStringRep) {
3b80: 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 4c 69 73  ..    Tcl_SetLis
3b90: 74 4f 62 6a 28 6c 69 73 74 50 74 72 2c 20 31 2c  tObj(listPtr, 1,
3ba0: 20 26 6f 62 6a 50 74 72 29 3b 0a 09 20 20 20 20   &objPtr);..    
3bb0: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 09  return TCL_OK;..
3bc0: 7d 0a 09 72 65 73 75 6c 74 20 3d 20 53 65 74 4c  }..result = SetL
3bd0: 69 73 74 46 72 6f 6d 41 6e 79 28 69 6e 74 65 72  istFromAny(inter
3be0: 70 2c 20 6c 69 73 74 50 74 72 29 3b 0a 09 69 66  p, listPtr);..if
3bf0: 20 28 72 65 73 75 6c 74 20 21 3d 20 54 43 4c 5f   (result != TCL_
3c00: 4f 4b 29 20 7b 0a 09 20 20 20 20 72 65 74 75 72  OK) {..    retur
3c10: 6e 20 72 65 73 75 6c 74 3b 0a 09 7d 0a 20 20 20  n result;..}.   
3c20: 20 7d 0a 0a 20 20 20 20 6c 69 73 74 52 65 70 50   }..    listRepP
3c30: 74 72 20 3d 20 4c 69 73 74 52 65 70 50 74 72 28  tr = ListRepPtr(
3c40: 6c 69 73 74 50 74 72 29 3b 0a 20 20 20 20 6e 75  listPtr);.    nu
3c50: 6d 45 6c 65 6d 73 20 3d 20 6c 69 73 74 52 65 70  mElems = listRep
3c60: 50 74 72 2d 3e 65 6c 65 6d 43 6f 75 6e 74 3b 0a  Ptr->elemCount;.
3c70: 20 20 20 20 6e 75 6d 52 65 71 75 69 72 65 64 20      numRequired 
3c80: 3d 20 6e 75 6d 45 6c 65 6d 73 20 2b 20 31 20 3b  = numElems + 1 ;
3c90: 0a 20 20 20 20 6e 65 65 64 47 72 6f 77 20 3d 20  .    needGrow = 
3ca0: 28 6e 75 6d 52 65 71 75 69 72 65 64 20 3e 20 6c  (numRequired > l
3cb0: 69 73 74 52 65 70 50 74 72 2d 3e 6d 61 78 45 6c  istRepPtr->maxEl
3cc0: 65 6d 43 6f 75 6e 74 29 3b 0a 20 20 20 20 69 73  emCount);.    is
3cd0: 53 68 61 72 65 64 20 3d 20 28 6c 69 73 74 52 65  Shared = (listRe
3ce0: 70 50 74 72 2d 3e 72 65 66 43 6f 75 6e 74 20 3e  pPtr->refCount >
3cf0: 20 31 29 3b 0a 0a 20 20 20 20 69 66 20 28 6e 75   1);..    if (nu
3d00: 6d 52 65 71 75 69 72 65 64 20 3e 20 4c 49 53 54  mRequired > LIST
3d10: 5f 4d 41 58 29 20 7b 0a 09 69 66 20 28 69 6e 74  _MAX) {..if (int
3d20: 65 72 70 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09  erp != NULL) {..
3d30: 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65      Tcl_SetObjRe
3d40: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c  sult(interp, Tcl
3d50: 5f 4f 62 6a 50 72 69 6e 74 66 28 0a 09 09 20 20  _ObjPrintf(...  
3d60: 20 20 22 6d 61 78 20 6c 65 6e 67 74 68 20 6f 66    "max length of
3d70: 20 61 20 54 63 6c 20 6c 69 73 74 20 28 25 64 20   a Tcl list (%d 
3d80: 65 6c 65 6d 65 6e 74 73 29 20 65 78 63 65 65 64  elements) exceed
3d90: 65 64 22 2c 0a 09 09 20 20 20 20 4c 49 53 54 5f  ed",...    LIST_
3da0: 4d 41 58 29 29 3b 0a 09 20 20 20 20 54 63 6c 5f  MAX));..    Tcl_
3db0: 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74  SetErrorCode(int
3dc0: 65 72 70 2c 20 22 54 43 4c 22 2c 20 22 4d 45 4d  erp, "TCL", "MEM
3dd0: 4f 52 59 22 2c 20 4e 55 4c 4c 29 3b 0a 09 7d 0a  ORY", NULL);..}.
3de0: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f  .return TCL_ERRO
3df0: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  R;.    }..    if
3e00: 20 28 6e 65 65 64 47 72 6f 77 20 26 26 20 21 69   (needGrow && !i
3e10: 73 53 68 61 72 65 64 29 20 7b 0a 09 2f 2a 0a 09  sShared) {../*..
3e20: 20 2a 20 4e 65 65 64 20 74 6f 20 67 72 6f 77 20   * Need to grow 
3e30: 2b 20 75 6e 73 68 61 72 65 64 20 69 6e 74 72 65  + unshared intre
3e40: 70 20 3d 3e 20 74 72 79 20 74 6f 20 72 65 61 6c  p => try to real
3e50: 6c 6f 63 0a 09 20 2a 2f 0a 0a 09 61 74 74 65 6d  loc.. */...attem
3e60: 70 74 20 3d 20 32 20 2a 20 6e 75 6d 52 65 71 75  pt = 2 * numRequ
3e70: 69 72 65 64 3b 0a 09 69 66 20 28 61 74 74 65 6d  ired;..if (attem
3e80: 70 74 20 3c 3d 20 4c 49 53 54 5f 4d 41 58 29 20  pt <= LIST_MAX) 
3e90: 7b 0a 09 20 20 20 20 6e 65 77 50 74 72 20 3d 20  {..    newPtr = 
3ea0: 61 74 74 65 6d 70 74 63 6b 72 65 61 6c 6c 6f 63  attemptckrealloc
3eb0: 28 6c 69 73 74 52 65 70 50 74 72 2c 20 4c 49 53  (listRepPtr, LIS
3ec0: 54 5f 53 49 5a 45 28 61 74 74 65 6d 70 74 29 29  T_SIZE(attempt))
3ed0: 3b 0a 09 7d 0a 09 69 66 20 28 6e 65 77 50 74 72  ;..}..if (newPtr
3ee0: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20   == NULL) {..   
3ef0: 20 61 74 74 65 6d 70 74 20 3d 20 6e 75 6d 52 65   attempt = numRe
3f00: 71 75 69 72 65 64 20 2b 20 31 20 2b 20 54 43 4c  quired + 1 + TCL
3f10: 5f 4d 49 4e 5f 45 4c 45 4d 45 4e 54 5f 47 52 4f  _MIN_ELEMENT_GRO
3f20: 57 54 48 3b 0a 09 20 20 20 20 69 66 20 28 61 74  WTH;..    if (at
3f30: 74 65 6d 70 74 20 3e 20 4c 49 53 54 5f 4d 41 58  tempt > LIST_MAX
3f40: 29 20 7b 0a 09 09 61 74 74 65 6d 70 74 20 3d 20  ) {...attempt = 
3f50: 4c 49 53 54 5f 4d 41 58 3b 0a 09 20 20 20 20 7d  LIST_MAX;..    }
3f60: 0a 09 20 20 20 20 6e 65 77 50 74 72 20 3d 20 61  ..    newPtr = a
3f70: 74 74 65 6d 70 74 63 6b 72 65 61 6c 6c 6f 63 28  ttemptckrealloc(
3f80: 6c 69 73 74 52 65 70 50 74 72 2c 20 4c 49 53 54  listRepPtr, LIST
3f90: 5f 53 49 5a 45 28 61 74 74 65 6d 70 74 29 29 3b  _SIZE(attempt));
3fa0: 0a 09 7d 0a 09 69 66 20 28 6e 65 77 50 74 72 20  ..}..if (newPtr 
3fb0: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20  == NULL) {..    
3fc0: 61 74 74 65 6d 70 74 20 3d 20 6e 75 6d 52 65 71  attempt = numReq
3fd0: 75 69 72 65 64 3b 0a 09 20 20 20 20 6e 65 77 50  uired;..    newP
3fe0: 74 72 20 3d 20 61 74 74 65 6d 70 74 63 6b 72 65  tr = attemptckre
3ff0: 61 6c 6c 6f 63 28 6c 69 73 74 52 65 70 50 74 72  alloc(listRepPtr
4000: 2c 20 4c 49 53 54 5f 53 49 5a 45 28 61 74 74 65  , LIST_SIZE(atte
4010: 6d 70 74 29 29 3b 0a 09 7d 0a 09 69 66 20 28 6e  mpt));..}..if (n
4020: 65 77 50 74 72 29 20 7b 0a 09 20 20 20 20 6c 69  ewPtr) {..    li
4030: 73 74 52 65 70 50 74 72 20 3d 20 6e 65 77 50 74  stRepPtr = newPt
4040: 72 3b 0a 09 20 20 20 20 6c 69 73 74 52 65 70 50  r;..    listRepP
4050: 74 72 2d 3e 6d 61 78 45 6c 65 6d 43 6f 75 6e 74  tr->maxElemCount
4060: 20 3d 20 61 74 74 65 6d 70 74 3b 0a 09 20 20 20   = attempt;..   
4070: 20 6e 65 65 64 47 72 6f 77 20 3d 20 30 3b 0a 09   needGrow = 0;..
4080: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28  }.    }.    if (
4090: 69 73 53 68 61 72 65 64 20 7c 7c 20 6e 65 65 64  isShared || need
40a0: 47 72 6f 77 29 20 7b 0a 09 54 63 6c 5f 4f 62 6a  Grow) {..Tcl_Obj
40b0: 20 2a 2a 64 73 74 2c 20 2a 2a 73 72 63 20 3d 20   **dst, **src = 
40c0: 26 6c 69 73 74 52 65 70 50 74 72 2d 3e 65 6c 65  &listRepPtr->ele
40d0: 6d 65 6e 74 73 3b 0a 0a 09 2f 2a 0a 09 20 2a 20  ments;.../*.. * 
40e0: 45 69 74 68 65 72 20 77 65 20 68 61 76 65 20 61  Either we have a
40f0: 20 73 68 61 72 65 64 20 69 6e 74 72 65 70 20 61   shared intrep a
4100: 6e 64 20 77 65 20 6d 75 73 74 20 63 6f 70 79 20  nd we must copy 
4110: 74 6f 20 77 72 69 74 65 2c 20 6f 72 20 77 65 0a  to write, or we.
4120: 09 20 2a 20 6e 65 65 64 20 74 6f 20 67 72 6f 77  . * need to grow
4130: 20 61 6e 64 20 72 65 61 6c 6c 6f 63 20 61 74 74   and realloc att
4140: 65 6d 70 74 73 20 66 61 69 6c 65 64 2e 20 20 41  empts failed.  A
4150: 74 74 65 6d 70 74 20 69 6e 74 72 65 70 20 63 6f  ttempt intrep co
4160: 70 79 2e 0a 09 20 2a 2f 0a 0a 09 61 74 74 65 6d  py... */...attem
4170: 70 74 20 3d 20 32 20 2a 20 6e 75 6d 52 65 71 75  pt = 2 * numRequ
4180: 69 72 65 64 3b 0a 09 6e 65 77 50 74 72 20 3d 20  ired;..newPtr = 
4190: 41 74 74 65 6d 70 74 4e 65 77 4c 69 73 74 28 4e  AttemptNewList(N
41a0: 55 4c 4c 2c 20 61 74 74 65 6d 70 74 2c 20 4e 55  ULL, attempt, NU
41b0: 4c 4c 29 3b 0a 09 69 66 20 28 6e 65 77 50 74 72  LL);..if (newPtr
41c0: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20   == NULL) {..   
41d0: 20 61 74 74 65 6d 70 74 20 3d 20 6e 75 6d 52 65   attempt = numRe
41e0: 71 75 69 72 65 64 20 2b 20 31 20 2b 20 54 43 4c  quired + 1 + TCL
41f0: 5f 4d 49 4e 5f 45 4c 45 4d 45 4e 54 5f 47 52 4f  _MIN_ELEMENT_GRO
4200: 57 54 48 3b 0a 09 20 20 20 20 69 66 20 28 61 74  WTH;..    if (at
4210: 74 65 6d 70 74 20 3e 20 4c 49 53 54 5f 4d 41 58  tempt > LIST_MAX
4220: 29 20 7b 0a 09 09 61 74 74 65 6d 70 74 20 3d 20  ) {...attempt = 
4230: 4c 49 53 54 5f 4d 41 58 3b 0a 09 20 20 20 20 7d  LIST_MAX;..    }
4240: 0a 09 20 20 20 20 6e 65 77 50 74 72 20 3d 20 41  ..    newPtr = A
4250: 74 74 65 6d 70 74 4e 65 77 4c 69 73 74 28 4e 55  ttemptNewList(NU
4260: 4c 4c 2c 20 61 74 74 65 6d 70 74 2c 20 4e 55 4c  LL, attempt, NUL
4270: 4c 29 3b 0a 09 7d 0a 09 69 66 20 28 6e 65 77 50  L);..}..if (newP
4280: 74 72 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20  tr == NULL) {.. 
4290: 20 20 20 61 74 74 65 6d 70 74 20 3d 20 6e 75 6d     attempt = num
42a0: 52 65 71 75 69 72 65 64 3b 0a 09 20 20 20 20 6e  Required;..    n
42b0: 65 77 50 74 72 20 3d 20 41 74 74 65 6d 70 74 4e  ewPtr = AttemptN
42c0: 65 77 4c 69 73 74 28 69 6e 74 65 72 70 2c 20 61  ewList(interp, a
42d0: 74 74 65 6d 70 74 2c 20 4e 55 4c 4c 29 3b 0a 09  ttempt, NULL);..
42e0: 7d 0a 09 69 66 20 28 6e 65 77 50 74 72 20 3d 3d  }..if (newPtr ==
42f0: 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 2f 2a   NULL) {..    /*
4300: 0a 09 20 20 20 20 20 2a 20 41 6c 6c 20 67 72 6f  ..     * All gro
4310: 77 74 68 20 61 74 74 65 6d 70 74 73 20 66 61 69  wth attempts fai
4320: 6c 65 64 3b 20 74 68 72 6f 77 20 74 68 65 20 65  led; throw the e
4330: 72 72 6f 72 2e 0a 09 20 20 20 20 20 2a 2f 0a 0a  rror...     */..
4340: 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
4350: 45 52 52 4f 52 3b 0a 09 7d 0a 0a 09 64 73 74 20  ERROR;..}...dst 
4360: 3d 20 26 6e 65 77 50 74 72 2d 3e 65 6c 65 6d 65  = &newPtr->eleme
4370: 6e 74 73 3b 0a 09 6e 65 77 50 74 72 2d 3e 72 65  nts;..newPtr->re
4380: 66 43 6f 75 6e 74 2b 2b 3b 0a 09 6e 65 77 50 74  fCount++;..newPt
4390: 72 2d 3e 63 61 6e 6f 6e 69 63 61 6c 46 6c 61 67  r->canonicalFlag
43a0: 20 3d 20 6c 69 73 74 52 65 70 50 74 72 2d 3e 63   = listRepPtr->c
43b0: 61 6e 6f 6e 69 63 61 6c 46 6c 61 67 3b 0a 09 6e  anonicalFlag;..n
43c0: 65 77 50 74 72 2d 3e 65 6c 65 6d 43 6f 75 6e 74  ewPtr->elemCount
43d0: 20 3d 20 6c 69 73 74 52 65 70 50 74 72 2d 3e 65   = listRepPtr->e
43e0: 6c 65 6d 43 6f 75 6e 74 3b 0a 0a 09 69 66 20 28  lemCount;...if (
43f0: 69 73 53 68 61 72 65 64 29 20 7b 0a 09 20 20 20  isShared) {..   
4400: 20 2f 2a 0a 09 20 20 20 20 20 2a 20 54 68 65 20   /*..     * The 
4410: 6f 72 69 67 69 6e 61 6c 20 69 6e 74 72 65 70 20  original intrep 
4420: 6d 75 73 74 20 72 65 6d 61 69 6e 20 75 6e 64 69  must remain undi
4430: 73 74 75 72 62 65 64 2e 20 20 43 6f 70 79 20 69  sturbed.  Copy i
4440: 6e 74 6f 20 74 68 65 20 6e 65 77 0a 09 20 20 20  nto the new..   
4450: 20 20 2a 20 6f 6e 65 20 61 6e 64 20 62 75 6d 70    * one and bump
4460: 20 72 65 66 63 6f 75 6e 74 73 0a 09 20 20 20 20   refcounts..    
4470: 20 2a 2f 0a 09 20 20 20 20 77 68 69 6c 65 20 28   */..    while (
4480: 6e 75 6d 45 6c 65 6d 73 2d 2d 29 20 7b 0a 09 09  numElems--) {...
4490: 2a 64 73 74 20 3d 20 2a 73 72 63 2b 2b 3b 0a 09  *dst = *src++;..
44a0: 09 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e  .Tcl_IncrRefCoun
44b0: 74 28 2a 64 73 74 2b 2b 29 3b 0a 09 20 20 20 20  t(*dst++);..    
44c0: 7d 0a 09 20 20 20 20 6c 69 73 74 52 65 70 50 74  }..    listRepPt
44d0: 72 2d 3e 72 65 66 43 6f 75 6e 74 2d 2d 3b 0a 09  r->refCount--;..
44e0: 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 2f 2a  } else {..    /*
44f0: 0a 09 20 20 20 20 20 2a 20 4f 6c 64 20 69 6e 74  ..     * Old int
4500: 72 65 70 20 74 6f 20 62 65 20 66 72 65 65 64 2c  rep to be freed,
4510: 20 72 65 2d 75 73 65 20 72 65 66 43 6f 75 6e 74   re-use refCount
4520: 73 2e 0a 09 20 20 20 20 20 2a 2f 0a 0a 09 20 20  s...     */...  
4530: 20 20 6d 65 6d 63 70 79 28 64 73 74 2c 20 73 72    memcpy(dst, sr
4540: 63 2c 20 28 73 69 7a 65 5f 74 29 20 6e 75 6d 45  c, (size_t) numE
4550: 6c 65 6d 73 20 2a 20 73 69 7a 65 6f 66 28 54 63  lems * sizeof(Tc
4560: 6c 5f 4f 62 6a 20 2a 29 29 3b 0a 09 20 20 20 20  l_Obj *));..    
4570: 63 6b 66 72 65 65 28 6c 69 73 74 52 65 70 50 74  ckfree(listRepPt
4580: 72 29 3b 0a 09 7d 0a 09 6c 69 73 74 52 65 70 50  r);..}..listRepP
4590: 74 72 20 3d 20 6e 65 77 50 74 72 3b 0a 20 20 20  tr = newPtr;.   
45a0: 20 7d 0a 20 20 20 20 6c 69 73 74 50 74 72 2d 3e   }.    listPtr->
45b0: 69 6e 74 65 72 6e 61 6c 52 65 70 2e 74 77 6f 50  internalRep.twoP
45c0: 74 72 56 61 6c 75 65 2e 70 74 72 31 20 3d 20 6c  trValue.ptr1 = l
45d0: 69 73 74 52 65 70 50 74 72 3b 0a 0a 20 20 20 20  istRepPtr;..    
45e0: 2f 2a 0a 20 20 20 20 20 2a 20 41 64 64 20 6f 62  /*.     * Add ob
45f0: 6a 50 74 72 20 74 6f 20 74 68 65 20 65 6e 64 20  jPtr to the end 
4600: 6f 66 20 6c 69 73 74 50 74 72 27 73 20 61 72 72  of listPtr's arr
4610: 61 79 20 6f 66 20 65 6c 65 6d 65 6e 74 20 70 6f  ay of element po
4620: 69 6e 74 65 72 73 2e 20 49 6e 63 72 65 6d 65 6e  inters. Incremen
4630: 74 0a 20 20 20 20 20 2a 20 74 68 65 20 72 65 66  t.     * the ref
4640: 20 63 6f 75 6e 74 20 66 6f 72 20 74 68 65 20 28   count for the (
4650: 6e 6f 77 20 73 68 61 72 65 64 29 20 6f 62 6a 50  now shared) objP
4660: 74 72 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20  tr..     */..   
4670: 20 2a 28 26 6c 69 73 74 52 65 70 50 74 72 2d 3e   *(&listRepPtr->
4680: 65 6c 65 6d 65 6e 74 73 20 2b 20 6c 69 73 74 52  elements + listR
4690: 65 70 50 74 72 2d 3e 65 6c 65 6d 43 6f 75 6e 74  epPtr->elemCount
46a0: 29 20 3d 20 6f 62 6a 50 74 72 3b 0a 20 20 20 20  ) = objPtr;.    
46b0: 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74  Tcl_IncrRefCount
46c0: 28 6f 62 6a 50 74 72 29 3b 0a 20 20 20 20 6c 69  (objPtr);.    li
46d0: 73 74 52 65 70 50 74 72 2d 3e 65 6c 65 6d 43 6f  stRepPtr->elemCo
46e0: 75 6e 74 2b 2b 3b 0a 0a 20 20 20 20 2f 2a 0a 20  unt++;..    /*. 
46f0: 20 20 20 20 2a 20 49 6e 76 61 6c 69 64 61 74 65      * Invalidate
4700: 20 61 6e 79 20 6f 6c 64 20 73 74 72 69 6e 67 20   any old string 
4710: 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 73  representation s
4720: 69 6e 63 65 20 74 68 65 20 6c 69 73 74 27 73 20  ince the list's 
4730: 69 6e 74 65 72 6e 61 6c 0a 20 20 20 20 20 2a 20  internal.     * 
4740: 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 68  representation h
4750: 61 73 20 63 68 61 6e 67 65 64 2e 0a 20 20 20 20  as changed..    
4760: 20 2a 2f 0a 0a 20 20 20 20 54 63 6c 49 6e 76 61   */..    TclInva
4770: 6c 69 64 61 74 65 53 74 72 69 6e 67 52 65 70 28  lidateStringRep(
4780: 6c 69 73 74 50 74 72 29 3b 0a 20 20 20 20 72 65  listPtr);.    re
4790: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c  turn TCL_OK;.}..
47a0: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ./*. *----------
47b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
47c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
47d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
47e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a  ------------. *.
47f0: 20 2a 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 49 6e   * Tcl_ListObjIn
4800: 64 65 78 20 2d 2d 0a 20 2a 0a 20 2a 20 09 52 65  dex --. *. * .Re
4810: 74 72 69 65 76 65 20 61 20 70 6f 69 6e 74 65 72  trieve a pointer
4820: 20 74 6f 20 74 68 65 20 65 6c 65 6d 65 6e 74 20   to the element 
4830: 6f 66 20 27 6c 69 73 74 50 74 72 27 20 61 74 20  of 'listPtr' at 
4840: 27 69 6e 64 65 78 27 2e 20 20 54 68 65 20 69 6e  'index'.  The in
4850: 64 65 78 0a 20 2a 20 09 6f 66 20 74 68 65 20 66  dex. * .of the f
4860: 69 72 73 74 20 65 6c 65 6d 65 6e 74 20 69 73 20  irst element is 
4870: 30 2e 0a 20 2a 0a 20 2a 20 56 61 6c 75 65 0a 20  0.. *. * Value. 
4880: 2a 0a 20 2a 20 09 54 43 4c 5f 4f 4b 0a 20 2a 0a  *. * .TCL_OK. *.
4890: 20 2a 09 20 20 20 20 41 20 70 6f 69 6e 74 65 72   *.    A pointer
48a0: 20 74 6f 20 74 68 65 20 65 6c 65 6d 65 6e 74 20   to the element 
48b0: 61 74 20 27 69 6e 64 65 78 27 20 69 73 20 73 74  at 'index' is st
48c0: 6f 72 65 64 20 69 6e 20 27 6f 62 6a 50 74 72 50  ored in 'objPtrP
48d0: 74 72 27 2e 20 20 49 66 0a 20 2a 09 20 20 20 20  tr'.  If. *.    
48e0: 27 69 6e 64 65 78 27 20 69 73 20 6f 75 74 20 6f  'index' is out o
48f0: 66 20 72 61 6e 67 65 2c 20 4e 55 4c 4c 20 69 73  f range, NULL is
4900: 20 73 74 6f 72 65 64 20 69 6e 20 27 6f 62 6a 50   stored in 'objP
4910: 74 72 50 74 72 27 2e 20 20 54 68 69 73 0a 20 2a  trPtr'.  This. *
4920: 09 20 20 20 20 6f 62 6a 65 63 74 20 73 68 6f 75  .    object shou
4930: 6c 64 20 62 65 20 74 72 65 61 74 65 64 20 61 73  ld be treated as
4940: 20 72 65 61 64 6f 6e 6c 79 20 61 6e 64 20 69 74   readonly and it
4950: 73 20 27 72 65 66 43 6f 75 6e 74 27 20 69 73 20  s 'refCount' is 
4960: 5f 6e 6f 74 5f 0a 20 2a 09 20 20 20 20 69 6e 63  _not_. *.    inc
4970: 72 65 6d 65 6e 74 65 64 2e 20 54 68 65 20 63 61  remented. The ca
4980: 6c 6c 65 72 20 6d 75 73 74 20 64 6f 20 74 68 61  ller must do tha
4990: 74 20 69 66 20 69 74 20 68 6f 6c 64 73 20 6f 6e  t if it holds on
49a0: 20 74 6f 20 74 68 65 0a 20 2a 09 20 20 20 20 72   to the. *.    r
49b0: 65 66 65 72 65 6e 63 65 2e 0a 20 2a 20 0a 20 2a  eference.. * . *
49c0: 20 09 54 43 4c 5f 45 52 52 4f 52 0a 20 2a 0a 20   .TCL_ERROR. *. 
49d0: 2a 20 09 20 20 20 20 27 6c 69 73 74 50 74 72 27  * .    'listPtr'
49e0: 20 69 73 20 6e 6f 74 20 61 20 76 61 6c 69 64 20   is not a valid 
49f0: 6c 69 73 74 2e 20 41 6e 20 61 6e 20 65 72 72 6f  list. An an erro
4a00: 72 20 6d 65 73 73 61 67 65 20 69 73 20 6c 65 66  r message is lef
4a10: 74 20 69 6e 20 74 68 65 0a 20 2a 20 09 20 20 20  t in the. * .   
4a20: 20 69 6e 74 65 72 70 72 65 74 65 72 27 73 20 72   interpreter's r
4a30: 65 73 75 6c 74 20 69 66 20 27 69 6e 74 65 72 70  esult if 'interp
4a40: 27 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e 0a 20  ' is not NULL.. 
4a50: 2a 0a 20 2a 20 20 45 66 66 65 63 74 0a 20 2a 0a  *. *  Effect. *.
4a60: 20 2a 20 09 49 66 20 27 6c 69 73 74 50 74 72 27   * .If 'listPtr'
4a70: 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
4a80: 6f 66 20 74 79 70 65 20 27 74 63 6c 4c 69 73 74  of type 'tclList
4a90: 54 79 70 65 27 2c 20 69 74 20 69 73 20 63 6f 6e  Type', it is con
4aa0: 76 65 72 74 65 64 2e 0a 20 2a 0a 20 2a 2d 2d 2d  verted.. *. *---
4ab0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4ac0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4ad0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4ae0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4af0: 2d 2d 2d 0a 20 2a 2f 0a 0a 69 6e 74 0a 54 63 6c  ---. */..int.Tcl
4b00: 5f 4c 69 73 74 4f 62 6a 49 6e 64 65 78 28 0a 20  _ListObjIndex(. 
4b10: 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69     Tcl_Interp *i
4b20: 6e 74 65 72 70 2c 09 09 2f 2a 20 55 73 65 64 20  nterp,../* Used 
4b30: 74 6f 20 72 65 70 6f 72 74 20 65 72 72 6f 72 73  to report errors
4b40: 20 69 66 20 6e 6f 74 20 4e 55 4c 4c 2e 20 2a 2f   if not NULL. */
4b50: 0a 20 20 20 20 72 65 67 69 73 74 65 72 20 54 63  .    register Tc
4b60: 6c 5f 4f 62 6a 20 2a 6c 69 73 74 50 74 72 2c 09  l_Obj *listPtr,.
4b70: 2f 2a 20 4c 69 73 74 20 6f 62 6a 65 63 74 20 74  /* List object t
4b80: 6f 20 69 6e 64 65 78 20 69 6e 74 6f 2e 20 2a 2f  o index into. */
4b90: 0a 20 20 20 20 72 65 67 69 73 74 65 72 20 69 6e  .    register in
4ba0: 74 20 69 6e 64 65 78 2c 09 09 2f 2a 20 49 6e 64  t index,../* Ind
4bb0: 65 78 20 6f 66 20 65 6c 65 6d 65 6e 74 20 74 6f  ex of element to
4bc0: 20 72 65 74 75 72 6e 2e 20 2a 2f 0a 20 20 20 20   return. */.    
4bd0: 54 63 6c 5f 4f 62 6a 20 2a 2a 6f 62 6a 50 74 72  Tcl_Obj **objPtr
4be0: 50 74 72 29 09 2f 2a 20 54 68 65 20 72 65 73 75  Ptr)./* The resu
4bf0: 6c 74 69 6e 67 20 54 63 6c 5f 4f 62 6a 2a 20 69  lting Tcl_Obj* i
4c00: 73 20 73 74 6f 72 65 64 20 68 65 72 65 2e 20 2a  s stored here. *
4c10: 2f 0a 7b 0a 20 20 20 20 72 65 67 69 73 74 65 72  /.{.    register
4c20: 20 4c 69 73 74 20 2a 6c 69 73 74 52 65 70 50 74   List *listRepPt
4c30: 72 3b 0a 0a 20 20 20 20 69 66 20 28 6c 69 73 74  r;..    if (list
4c40: 50 74 72 2d 3e 74 79 70 65 50 74 72 20 21 3d 20  Ptr->typePtr != 
4c50: 26 74 63 6c 4c 69 73 74 54 79 70 65 29 20 7b 0a  &tclListType) {.
4c60: 09 69 6e 74 20 72 65 73 75 6c 74 3b 0a 0a 09 69  .int result;...i
4c70: 66 20 28 6c 69 73 74 50 74 72 2d 3e 62 79 74 65  f (listPtr->byte
4c80: 73 20 3d 3d 20 74 63 6c 45 6d 70 74 79 53 74 72  s == tclEmptyStr
4c90: 69 6e 67 52 65 70 29 20 7b 0a 09 20 20 20 20 2a  ingRep) {..    *
4ca0: 6f 62 6a 50 74 72 50 74 72 20 3d 20 4e 55 4c 4c  objPtrPtr = NULL
4cb0: 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43  ;..    return TC
4cc0: 4c 5f 4f 4b 3b 0a 09 7d 0a 09 72 65 73 75 6c 74  L_OK;..}..result
4cd0: 20 3d 20 53 65 74 4c 69 73 74 46 72 6f 6d 41 6e   = SetListFromAn
4ce0: 79 28 69 6e 74 65 72 70 2c 20 6c 69 73 74 50 74  y(interp, listPt
4cf0: 72 29 3b 0a 09 69 66 20 28 72 65 73 75 6c 74 20  r);..if (result 
4d00: 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20  != TCL_OK) {..  
4d10: 20 20 72 65 74 75 72 6e 20 72 65 73 75 6c 74 3b    return result;
4d20: 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6c  ..}.    }..    l
4d30: 69 73 74 52 65 70 50 74 72 20 3d 20 4c 69 73 74  istRepPtr = List
4d40: 52 65 70 50 74 72 28 6c 69 73 74 50 74 72 29 3b  RepPtr(listPtr);
4d50: 0a 20 20 20 20 69 66 20 28 28 69 6e 64 65 78 20  .    if ((index 
4d60: 3c 20 30 29 20 7c 7c 20 28 69 6e 64 65 78 20 3e  < 0) || (index >
4d70: 3d 20 6c 69 73 74 52 65 70 50 74 72 2d 3e 65 6c  = listRepPtr->el
4d80: 65 6d 43 6f 75 6e 74 29 29 20 7b 0a 09 2a 6f 62  emCount)) {..*ob
4d90: 6a 50 74 72 50 74 72 20 3d 20 4e 55 4c 4c 3b 0a  jPtrPtr = NULL;.
4da0: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 2a 6f      } else {..*o
4db0: 62 6a 50 74 72 50 74 72 20 3d 20 28 26 6c 69 73  bjPtrPtr = (&lis
4dc0: 74 52 65 70 50 74 72 2d 3e 65 6c 65 6d 65 6e 74  tRepPtr->element
4dd0: 73 29 5b 69 6e 64 65 78 5d 3b 0a 20 20 20 20 7d  s)[index];.    }
4de0: 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c  ..    return TCL
4df0: 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d  _OK;.}.../*. *--
4e00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4e10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4e20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4e30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4e40: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 63 6c 5f 4c  ----. *. * Tcl_L
4e50: 69 73 74 4f 62 6a 4c 65 6e 67 74 68 20 2d 2d 0a  istObjLength --.
4e60: 20 2a 0a 20 2a 20 09 52 65 74 72 69 65 76 65 20   *. * .Retrieve 
4e70: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c  the number of el
4e80: 65 6d 65 6e 74 73 20 69 6e 20 61 20 6c 69 73 74  ements in a list
4e90: 2e 0a 20 2a 0a 20 2a 20 56 61 6c 75 65 0a 20 2a  .. *. * Value. *
4ea0: 0a 20 2a 09 54 43 4c 5f 4f 4b 0a 20 2a 0a 20 2a  . *.TCL_OK. *. *
4eb0: 09 20 20 20 20 41 20 63 6f 75 6e 74 20 6f 66 20  .    A count of 
4ec0: 6c 69 73 74 20 65 6c 65 6d 65 6e 74 73 20 69 73  list elements is
4ed0: 20 73 74 6f 72 65 64 20 61 74 20 74 68 65 20 61   stored at the a
4ee0: 64 64 72 65 73 73 20 70 72 6f 76 69 64 65 64 20  ddress provided 
4ef0: 62 79 0a 20 2a 09 20 20 20 20 27 69 6e 74 50 74  by. *.    'intPt
4f00: 72 27 2e 20 49 66 20 27 6c 69 73 74 50 74 72 27  r'. If 'listPtr'
4f10: 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20   is not already 
4f20: 6f 66 20 74 79 70 65 20 27 74 63 6c 4c 69 73 74  of type 'tclList
4f30: 50 74 72 27 2c 20 69 74 20 69 73 0a 20 2a 09 20  Ptr', it is. *. 
4f40: 20 20 20 63 6f 6e 76 65 72 74 65 64 2e 0a 20 2a     converted.. *
4f50: 0a 20 2a 09 54 43 4c 5f 45 52 52 4f 52 0a 20 2a  . *.TCL_ERROR. *
4f60: 0a 20 2a 09 20 20 20 20 27 6c 69 73 74 50 74 72  . *.    'listPtr
4f70: 27 20 69 73 20 6e 6f 74 20 61 20 76 61 6c 69 64  ' is not a valid
4f80: 20 6c 69 73 74 2e 20 20 41 6e 20 65 72 72 6f 72   list.  An error
4f90: 20 6d 65 73 73 61 67 65 20 77 69 6c 6c 20 62 65   message will be
4fa0: 20 6c 65 66 74 20 69 6e 0a 20 2a 09 20 20 20 20   left in. *.    
4fb0: 74 68 65 20 69 6e 74 65 72 70 72 65 74 65 72 27  the interpreter'
4fc0: 73 20 72 65 73 75 6c 74 20 69 66 20 27 69 6e 74  s result if 'int
4fd0: 65 72 70 27 20 69 73 20 6e 6f 74 20 4e 55 4c 4c  erp' is not NULL
4fe0: 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  .. *. *---------
4ff0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5000: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5010: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
5030: 2f 0a 0a 69 6e 74 0a 54 63 6c 5f 4c 69 73 74 4f  /..int.Tcl_ListO
5040: 62 6a 4c 65 6e 67 74 68 28 0a 20 20 20 20 54 63  bjLength(.    Tc
5050: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
5060: 2c 09 09 2f 2a 20 55 73 65 64 20 74 6f 20 72 65  ,../* Used to re
5070: 70 6f 72 74 20 65 72 72 6f 72 73 20 69 66 20 6e  port errors if n
5080: 6f 74 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 20 20  ot NULL. */.    
5090: 72 65 67 69 73 74 65 72 20 54 63 6c 5f 4f 62 6a  register Tcl_Obj
50a0: 20 2a 6c 69 73 74 50 74 72 2c 09 2f 2a 20 4c 69   *listPtr,./* Li
50b0: 73 74 20 6f 62 6a 65 63 74 20 77 68 6f 73 65 20  st object whose 
50c0: 23 65 6c 65 6d 65 6e 74 73 20 74 6f 20 72 65 74  #elements to ret
50d0: 75 72 6e 2e 20 2a 2f 0a 20 20 20 20 72 65 67 69  urn. */.    regi
50e0: 73 74 65 72 20 69 6e 74 20 2a 69 6e 74 50 74 72  ster int *intPtr
50f0: 29 09 2f 2a 20 54 68 65 20 72 65 73 75 6c 74 69  )./* The resulti
5100: 6e 67 20 69 6e 74 20 69 73 20 73 74 6f 72 65 64  ng int is stored
5110: 20 68 65 72 65 2e 20 2a 2f 0a 7b 0a 20 20 20 20   here. */.{.    
5120: 72 65 67 69 73 74 65 72 20 4c 69 73 74 20 2a 6c  register List *l
5130: 69 73 74 52 65 70 50 74 72 3b 0a 0a 20 20 20 20  istRepPtr;..    
5140: 69 66 20 28 6c 69 73 74 50 74 72 2d 3e 74 79 70  if (listPtr->typ
5150: 65 50 74 72 20 21 3d 20 26 74 63 6c 4c 69 73 74  ePtr != &tclList
5160: 54 79 70 65 29 20 7b 0a 09 69 6e 74 20 72 65 73  Type) {..int res
5170: 75 6c 74 3b 0a 0a 09 69 66 20 28 6c 69 73 74 50  ult;...if (listP
5180: 74 72 2d 3e 62 79 74 65 73 20 3d 3d 20 74 63 6c  tr->bytes == tcl
5190: 45 6d 70 74 79 53 74 72 69 6e 67 52 65 70 29 20  EmptyStringRep) 
51a0: 7b 0a 09 20 20 20 20 2a 69 6e 74 50 74 72 20 3d  {..    *intPtr =
51b0: 20 30 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20   0;..    return 
51c0: 54 43 4c 5f 4f 4b 3b 0a 09 7d 0a 09 72 65 73 75  TCL_OK;..}..resu
51d0: 6c 74 20 3d 20 53 65 74 4c 69 73 74 46 72 6f 6d  lt = SetListFrom
51e0: 41 6e 79 28 69 6e 74 65 72 70 2c 20 6c 69 73 74  Any(interp, list
51f0: 50 74 72 29 3b 0a 09 69 66 20 28 72 65 73 75 6c  Ptr);..if (resul
5200: 74 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09  t != TCL_OK) {..
5210: 20 20 20 20 72 65 74 75 72 6e 20 72 65 73 75 6c      return resul
5220: 74 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20  t;..}.    }..   
5230: 20 6c 69 73 74 52 65 70 50 74 72 20 3d 20 4c 69   listRepPtr = Li
5240: 73 74 52 65 70 50 74 72 28 6c 69 73 74 50 74 72  stRepPtr(listPtr
5250: 29 3b 0a 20 20 20 20 2a 69 6e 74 50 74 72 20 3d  );.    *intPtr =
5260: 20 6c 69 73 74 52 65 70 50 74 72 2d 3e 65 6c 65   listRepPtr->ele
5270: 6d 43 6f 75 6e 74 3b 0a 20 20 20 20 72 65 74 75  mCount;.    retu
5280: 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f  rn TCL_OK;.}.../
5290: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
52a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
52b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
52c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
52d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a  ----------. *. *
52e0: 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 52 65 70 6c   Tcl_ListObjRepl
52f0: 61 63 65 20 2d 2d 0a 20 2a 0a 20 2a 09 52 65 70  ace --. *. *.Rep
5300: 6c 61 63 65 20 76 61 6c 75 65 73 20 69 6e 20 61  lace values in a
5310: 20 6c 69 73 74 2e 0a 20 2a 0a 20 2a 09 49 66 20   list.. *. *.If 
5320: 27 66 69 72 73 74 27 20 69 73 20 7a 65 72 6f 20  'first' is zero 
5330: 6f 72 20 6e 65 67 61 74 69 76 65 2c 20 69 74 20  or negative, it 
5340: 72 65 66 65 72 73 20 74 6f 20 74 68 65 20 66 69  refers to the fi
5350: 72 73 74 20 65 6c 65 6d 65 6e 74 2e 20 49 66 0a  rst element. If.
5360: 20 2a 09 27 66 69 72 73 74 27 20 6f 75 74 73 69   *.'first' outsi
5370: 64 65 20 74 68 65 20 72 61 6e 67 65 20 6f 66 20  de the range of 
5380: 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20  elements in the 
5390: 6c 69 73 74 2c 20 6e 6f 20 65 6c 65 6d 65 6e 74  list, no element
53a0: 73 20 61 72 65 0a 20 2a 09 64 65 6c 65 74 65 64  s are. *.deleted
53b0: 2e 0a 20 2a 0a 20 2a 09 49 66 20 27 63 6f 75 6e  .. *. *.If 'coun
53c0: 74 27 20 69 73 20 7a 65 72 6f 20 6f 72 20 6e 65  t' is zero or ne
53d0: 67 61 74 69 76 65 20 6e 6f 20 65 6c 65 6d 65 6e  gative no elemen
53e0: 74 73 20 61 72 65 20 64 65 6c 65 74 65 64 2c 20  ts are deleted, 
53f0: 61 6e 64 20 61 6e 79 20 6e 65 77 0a 20 2a 09 65  and any new. *.e
5400: 6c 65 6d 65 6e 74 73 20 61 72 65 20 69 6e 73 65  lements are inse
5410: 72 74 65 64 20 61 74 20 74 68 65 20 62 65 67 69  rted at the begi
5420: 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 6c 69 73  nning of the lis
5430: 74 2e 0a 20 2a 0a 20 2a 20 56 61 6c 75 65 0a 20  t.. *. * Value. 
5440: 2a 0a 20 2a 09 54 43 4c 5f 4f 4b 0a 20 2a 0a 20  *. *.TCL_OK. *. 
5450: 2a 09 20 20 20 20 54 68 65 20 66 69 72 73 74 20  *.    The first 
5460: 27 6f 62 6a 63 27 20 76 61 6c 75 65 73 20 6f 66  'objc' values of
5470: 20 27 6f 62 6a 76 27 20 72 65 70 6c 61 63 65 64   'objv' replaced
5480: 20 27 63 6f 75 6e 74 27 20 65 6c 65 6d 65 6e 74   'count' element
5490: 73 20 69 6e 20 27 6c 69 73 74 50 74 72 27 0a 20  s in 'listPtr'. 
54a0: 2a 09 20 20 20 20 73 74 61 72 74 69 6e 67 20 61  *.    starting a
54b0: 74 20 27 66 69 72 73 74 27 2e 20 20 49 66 20 27  t 'first'.  If '
54c0: 6f 62 6a 63 27 20 30 2c 20 6e 6f 20 6e 65 77 20  objc' 0, no new 
54d0: 65 6c 65 6d 65 6e 74 73 20 61 72 65 20 61 64 64  elements are add
54e0: 65 64 2e 0a 20 2a 0a 20 2a 09 54 43 4c 5f 45 52  ed.. *. *.TCL_ER
54f0: 52 4f 52 0a 20 2a 0a 20 2a 09 20 20 20 20 27 6c  ROR. *. *.    'l
5500: 69 73 74 50 74 72 27 20 69 73 20 6e 6f 74 20 61  istPtr' is not a
5510: 20 76 61 6c 69 64 20 6c 69 73 74 2e 20 20 20 41   valid list.   A
5520: 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  n error message 
5530: 69 73 20 6c 65 66 74 20 69 6e 20 74 68 65 0a 20  is left in the. 
5540: 2a 09 20 20 20 20 69 6e 74 65 72 70 72 65 74 65  *.    interprete
5550: 72 27 73 20 72 65 73 75 6c 74 20 69 66 20 27 69  r's result if 'i
5560: 6e 74 65 72 70 27 20 69 73 20 6e 6f 74 20 4e 55  nterp' is not NU
5570: 4c 4c 2e 0a 20 2a 0a 20 2a 20 45 66 66 65 63 74  LL.. *. * Effect
5580: 0a 20 2a 0a 20 2a 09 49 66 20 27 6c 69 73 74 50  . *. *.If 'listP
5590: 74 72 27 20 69 73 20 6e 6f 74 20 6f 66 20 74 79  tr' is not of ty
55a0: 70 65 20 27 74 63 6c 4c 69 73 74 54 79 70 65 27  pe 'tclListType'
55b0: 2c 20 69 74 20 69 73 20 63 6f 6e 76 65 72 74 65  , it is converte
55c0: 64 20 69 66 20 70 6f 73 73 69 62 6c 65 2e 0a 20  d if possible.. 
55d0: 2a 0a 20 2a 09 54 68 65 20 27 72 65 66 43 6f 75  *. *.The 'refCou
55e0: 6e 74 27 20 6f 66 20 65 61 63 68 20 65 6c 65 6d  nt' of each elem
55f0: 65 6e 74 20 61 70 70 65 6e 64 65 64 20 74 6f 20  ent appended to 
5600: 74 68 65 20 6c 69 73 74 20 69 73 20 69 6e 63 72  the list is incr
5610: 65 6d 65 6e 74 65 64 2e 0a 20 2a 09 53 69 6d 69  emented.. *.Simi
5620: 6c 61 72 6c 79 2c 20 74 68 65 20 27 72 65 66 43  larly, the 'refC
5630: 6f 75 6e 74 27 20 66 6f 72 20 65 61 63 68 20 72  ount' for each r
5640: 65 70 6c 61 63 65 64 20 65 6c 65 6d 65 6e 74 20  eplaced element 
5650: 69 73 20 64 65 63 72 65 6d 65 6e 74 65 64 2e 0a  is decremented..
5660: 20 2a 0a 20 2a 09 49 66 20 27 6c 69 73 74 50 74   *. *.If 'listPt
5670: 72 27 20 69 73 20 6d 6f 64 69 66 69 65 64 2c 20  r' is modified, 
5680: 61 6e 79 20 70 72 65 76 69 6f 75 73 20 73 74 72  any previous str
5690: 69 6e 67 20 72 65 70 72 65 73 65 6e 74 61 74 69  ing representati
56a0: 6f 6e 20 69 73 0a 20 2a 09 69 6e 76 61 6c 69 64  on is. *.invalid
56b0: 61 74 65 64 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d  ated.. *. *-----
56c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
56d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
56e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
56f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5700: 2d 0a 20 2a 2f 0a 0a 69 6e 74 0a 54 63 6c 5f 4c  -. */..int.Tcl_L
5710: 69 73 74 4f 62 6a 52 65 70 6c 61 63 65 28 0a 20  istObjReplace(. 
5720: 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69     Tcl_Interp *i
5730: 6e 74 65 72 70 2c 09 09 2f 2a 20 55 73 65 64 20  nterp,../* Used 
5740: 66 6f 72 20 65 72 72 6f 72 20 72 65 70 6f 72 74  for error report
5750: 69 6e 67 20 69 66 20 6e 6f 74 20 4e 55 4c 4c 2e  ing if not NULL.
5760: 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20   */.    Tcl_Obj 
5770: 2a 6c 69 73 74 50 74 72 2c 09 09 2f 2a 20 4c 69  *listPtr,../* Li
5780: 73 74 20 6f 62 6a 65 63 74 20 77 68 6f 73 65 20  st object whose 
5790: 65 6c 65 6d 65 6e 74 73 20 74 6f 20 72 65 70 6c  elements to repl
57a0: 61 63 65 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ace. */.    int 
57b0: 66 69 72 73 74 2c 09 09 09 2f 2a 20 49 6e 64 65  first,.../* Inde
57c0: 78 20 6f 66 20 66 69 72 73 74 20 65 6c 65 6d 65  x of first eleme
57d0: 6e 74 20 74 6f 20 72 65 70 6c 61 63 65 2e 20 2a  nt to replace. *
57e0: 2f 0a 20 20 20 20 69 6e 74 20 63 6f 75 6e 74 2c  /.    int count,
57f0: 09 09 09 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20  .../* Number of 
5800: 65 6c 65 6d 65 6e 74 73 20 74 6f 20 72 65 70 6c  elements to repl
5810: 61 63 65 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ace. */.    int 
5820: 6f 62 6a 63 2c 09 09 09 2f 2a 20 4e 75 6d 62 65  objc,.../* Numbe
5830: 72 20 6f 66 20 6f 62 6a 65 63 74 73 20 74 6f 20  r of objects to 
5840: 69 6e 73 65 72 74 2e 20 2a 2f 0a 20 20 20 20 54  insert. */.    T
5850: 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62  cl_Obj *const ob
5860: 6a 76 5b 5d 29 09 2f 2a 20 41 6e 20 61 72 72 61  jv[])./* An arra
5870: 79 20 6f 66 20 6f 62 6a 63 20 70 6f 69 6e 74 65  y of objc pointe
5880: 72 73 20 74 6f 20 54 63 6c 20 6f 62 6a 65 63 74  rs to Tcl object
5890: 73 20 74 6f 0a 09 09 09 09 20 2a 20 69 6e 73 65  s to..... * inse
58a0: 72 74 2e 20 2a 2f 0a 7b 0a 20 20 20 20 4c 69 73  rt. */.{.    Lis
58b0: 74 20 2a 6c 69 73 74 52 65 70 50 74 72 3b 0a 20  t *listRepPtr;. 
58c0: 20 20 20 72 65 67 69 73 74 65 72 20 54 63 6c 5f     register Tcl_
58d0: 4f 62 6a 20 2a 2a 65 6c 65 6d 50 74 72 73 3b 0a  Obj **elemPtrs;.
58e0: 20 20 20 20 69 6e 74 20 6e 65 65 64 47 72 6f 77      int needGrow
58f0: 2c 20 6e 75 6d 45 6c 65 6d 73 2c 20 6e 75 6d 52  , numElems, numR
5900: 65 71 75 69 72 65 64 2c 20 6e 75 6d 41 66 74 65  equired, numAfte
5910: 72 4c 61 73 74 2c 20 73 74 61 72 74 2c 20 69 2c  rLast, start, i,
5920: 20 6a 2c 20 69 73 53 68 61 72 65 64 3b 0a 0a 20   j, isShared;.. 
5930: 20 20 20 69 66 20 28 54 63 6c 5f 49 73 53 68 61     if (Tcl_IsSha
5940: 72 65 64 28 6c 69 73 74 50 74 72 29 29 20 7b 0a  red(listPtr)) {.
5950: 09 54 63 6c 5f 50 61 6e 69 63 28 22 25 73 20 63  .Tcl_Panic("%s c
5960: 61 6c 6c 65 64 20 77 69 74 68 20 73 68 61 72 65  alled with share
5970: 64 20 6f 62 6a 65 63 74 22 2c 20 22 54 63 6c 5f  d object", "Tcl_
5980: 4c 69 73 74 4f 62 6a 52 65 70 6c 61 63 65 22 29  ListObjReplace")
5990: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28  ;.    }.    if (
59a0: 6c 69 73 74 50 74 72 2d 3e 74 79 70 65 50 74 72  listPtr->typePtr
59b0: 20 21 3d 20 26 74 63 6c 4c 69 73 74 54 79 70 65   != &tclListType
59c0: 29 20 7b 0a 09 69 66 20 28 6c 69 73 74 50 74 72  ) {..if (listPtr
59d0: 2d 3e 62 79 74 65 73 20 3d 3d 20 74 63 6c 45 6d  ->bytes == tclEm
59e0: 70 74 79 53 74 72 69 6e 67 52 65 70 29 20 7b 0a  ptyStringRep) {.
59f0: 09 20 20 20 20 69 66 20 28 21 6f 62 6a 63 29 20  .    if (!objc) 
5a00: 7b 0a 09 09 72 65 74 75 72 6e 20 54 43 4c 5f 4f  {...return TCL_O
5a10: 4b 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 54  K;..    }..    T
5a20: 63 6c 5f 53 65 74 4c 69 73 74 4f 62 6a 28 6c 69  cl_SetListObj(li
5a30: 73 74 50 74 72 2c 20 6f 62 6a 63 2c 20 4e 55 4c  stPtr, objc, NUL
5a40: 4c 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20  L);..} else {.. 
5a50: 20 20 20 69 6e 74 20 72 65 73 75 6c 74 20 3d 20     int result = 
5a60: 53 65 74 4c 69 73 74 46 72 6f 6d 41 6e 79 28 69  SetListFromAny(i
5a70: 6e 74 65 72 70 2c 20 6c 69 73 74 50 74 72 29 3b  nterp, listPtr);
5a80: 0a 0a 09 20 20 20 20 69 66 20 28 72 65 73 75 6c  ...    if (resul
5a90: 74 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09  t != TCL_OK) {..
5aa0: 09 72 65 74 75 72 6e 20 72 65 73 75 6c 74 3b 0a  .return result;.
5ab0: 09 20 20 20 20 7d 0a 09 7d 0a 20 20 20 20 7d 0a  .    }..}.    }.
5ac0: 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 4e  .    /*.     * N
5ad0: 6f 74 65 20 74 68 61 74 20 77 68 65 6e 20 63 6f  ote that when co
5ae0: 75 6e 74 20 3d 3d 20 30 20 61 6e 64 20 6f 62 6a  unt == 0 and obj
5af0: 63 20 3d 3d 20 30 2c 20 74 68 69 73 20 72 6f 75  c == 0, this rou
5b00: 74 69 6e 65 20 69 73 20 6c 6f 67 69 63 61 6c 6c  tine is logicall
5b10: 79 20 61 0a 20 20 20 20 20 2a 20 6e 6f 2d 6f 70  y a.     * no-op
5b20: 2c 20 72 65 6d 6f 76 69 6e 67 20 61 6e 64 20 61  , removing and a
5b30: 64 64 69 6e 67 20 6e 6f 20 65 6c 65 6d 65 6e 74  dding no element
5b40: 73 20 74 6f 20 74 68 65 20 6c 69 73 74 2e 20 48  s to the list. H
5b50: 6f 77 65 76 65 72 2c 20 62 79 20 66 6c 6f 77 69  owever, by flowi
5b60: 6e 67 0a 20 20 20 20 20 2a 20 74 68 72 6f 75 67  ng.     * throug
5b70: 68 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61  h this routine a
5b80: 6e 79 77 61 79 2c 20 77 65 20 67 65 74 20 74 68  nyway, we get th
5b90: 65 20 69 6d 70 6f 72 74 61 6e 74 20 73 69 64 65  e important side
5ba0: 20 65 66 66 65 63 74 20 74 68 61 74 20 74 68 65   effect that the
5bb0: 0a 20 20 20 20 20 2a 20 72 65 73 75 6c 74 69 6e  .     * resultin
5bc0: 67 20 6c 69 73 74 50 74 72 20 69 73 20 61 20 6c  g listPtr is a l
5bd0: 69 73 74 20 69 6e 20 63 61 6e 6f 6e 63 69 61 6c  ist in canoncial
5be0: 20 66 6f 72 6d 2e 20 54 68 69 73 20 69 73 20 69   form. This is i
5bf0: 6d 70 6f 72 74 61 6e 74 2e 0a 20 20 20 20 20 2a  mportant..     *
5c00: 20 52 65 73 69 73 74 20 61 6e 79 20 74 65 6d 70   Resist any temp
5c10: 74 61 74 69 6f 6e 20 74 6f 20 6f 70 74 69 6d 69  tation to optimi
5c20: 7a 65 20 74 68 69 73 20 63 61 73 65 2e 0a 20 20  ze this case..  
5c30: 20 20 20 2a 2f 0a 0a 20 20 20 20 6c 69 73 74 52     */..    listR
5c40: 65 70 50 74 72 20 3d 20 4c 69 73 74 52 65 70 50  epPtr = ListRepP
5c50: 74 72 28 6c 69 73 74 50 74 72 29 3b 0a 20 20 20  tr(listPtr);.   
5c60: 20 65 6c 65 6d 50 74 72 73 20 3d 20 26 6c 69 73   elemPtrs = &lis
5c70: 74 52 65 70 50 74 72 2d 3e 65 6c 65 6d 65 6e 74  tRepPtr->element
5c80: 73 3b 0a 20 20 20 20 6e 75 6d 45 6c 65 6d 73 20  s;.    numElems 
5c90: 3d 20 6c 69 73 74 52 65 70 50 74 72 2d 3e 65 6c  = listRepPtr->el
5ca0: 65 6d 43 6f 75 6e 74 3b 0a 0a 20 20 20 20 69 66  emCount;..    if
5cb0: 20 28 66 69 72 73 74 20 3c 20 30 29 20 7b 0a 09   (first < 0) {..
5cc0: 66 69 72 73 74 20 3d 20 30 3b 0a 20 20 20 20 7d  first = 0;.    }
5cd0: 0a 20 20 20 20 69 66 20 28 66 69 72 73 74 20 3e  .    if (first >
5ce0: 3d 20 6e 75 6d 45 6c 65 6d 73 29 20 7b 0a 09 66  = numElems) {..f
5cf0: 69 72 73 74 20 3d 20 6e 75 6d 45 6c 65 6d 73 3b  irst = numElems;
5d00: 09 2f 2a 20 53 6f 20 77 65 27 6c 6c 20 69 6e 73  ./* So we'll ins
5d10: 65 72 74 20 61 66 74 65 72 20 6c 61 73 74 20 65  ert after last e
5d20: 6c 65 6d 65 6e 74 2e 20 2a 2f 0a 20 20 20 20 7d  lement. */.    }
5d30: 0a 20 20 20 20 69 66 20 28 63 6f 75 6e 74 20 3c  .    if (count <
5d40: 20 30 29 20 7b 0a 09 63 6f 75 6e 74 20 3d 20 30   0) {..count = 0
5d50: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20  ;.    } else if 
5d60: 28 66 69 72 73 74 20 3e 20 49 4e 54 5f 4d 41 58  (first > INT_MAX
5d70: 20 2d 20 63 6f 75 6e 74 20 2f 2a 20 48 61 6e 64   - count /* Hand
5d80: 6c 65 20 69 6e 74 65 67 65 72 20 6f 76 65 72 66  le integer overf
5d90: 6c 6f 77 20 2a 2f 0a 09 20 20 20 20 7c 7c 20 6e  low */..    || n
5da0: 75 6d 45 6c 65 6d 73 20 3c 20 66 69 72 73 74 2b  umElems < first+
5db0: 63 6f 75 6e 74 29 20 7b 0a 0a 09 63 6f 75 6e 74  count) {...count
5dc0: 20 3d 20 6e 75 6d 45 6c 65 6d 73 20 2d 20 66 69   = numElems - fi
5dd0: 72 73 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  rst;.    }..    
5de0: 69 66 20 28 6f 62 6a 63 20 3e 20 4c 49 53 54 5f  if (objc > LIST_
5df0: 4d 41 58 20 2d 20 28 6e 75 6d 45 6c 65 6d 73 20  MAX - (numElems 
5e00: 2d 20 63 6f 75 6e 74 29 29 20 7b 0a 09 69 66 20  - count)) {..if 
5e10: 28 69 6e 74 65 72 70 20 21 3d 20 4e 55 4c 4c 29  (interp != NULL)
5e20: 20 7b 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 4f   {..    Tcl_SetO
5e30: 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
5e40: 20 54 63 6c 5f 4f 62 6a 50 72 69 6e 74 66 28 0a   Tcl_ObjPrintf(.
5e50: 09 09 20 20 20 20 22 6d 61 78 20 6c 65 6e 67 74  ..    "max lengt
5e60: 68 20 6f 66 20 61 20 54 63 6c 20 6c 69 73 74 20  h of a Tcl list 
5e70: 28 25 64 20 65 6c 65 6d 65 6e 74 73 29 20 65 78  (%d elements) ex
5e80: 63 65 65 64 65 64 22 2c 0a 09 09 20 20 20 20 4c  ceeded",...    L
5e90: 49 53 54 5f 4d 41 58 29 29 3b 0a 09 7d 0a 09 72  IST_MAX));..}..r
5ea0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
5eb0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 73 53 68 61  .    }.    isSha
5ec0: 72 65 64 20 3d 20 28 6c 69 73 74 52 65 70 50 74  red = (listRepPt
5ed0: 72 2d 3e 72 65 66 43 6f 75 6e 74 20 3e 20 31 29  r->refCount > 1)
5ee0: 3b 0a 20 20 20 20 6e 75 6d 52 65 71 75 69 72 65  ;.    numRequire
5ef0: 64 20 3d 20 6e 75 6d 45 6c 65 6d 73 20 2d 20 63  d = numElems - c
5f00: 6f 75 6e 74 20 2b 20 6f 62 6a 63 3b 20 2f 2a 20  ount + objc; /* 
5f10: 4b 6e 6f 77 6e 20 3c 3d 20 4c 49 53 54 5f 4d 41  Known <= LIST_MA
5f20: 58 20 2a 2f 0a 20 20 20 20 6e 65 65 64 47 72 6f  X */.    needGro
5f30: 77 20 3d 20 6e 75 6d 52 65 71 75 69 72 65 64 20  w = numRequired 
5f40: 3e 20 6c 69 73 74 52 65 70 50 74 72 2d 3e 6d 61  > listRepPtr->ma
5f50: 78 45 6c 65 6d 43 6f 75 6e 74 3b 0a 0a 20 20 20  xElemCount;..   
5f60: 20 66 6f 72 20 28 69 20 3d 20 30 3b 20 20 69 20   for (i = 0;  i 
5f70: 3c 20 6f 62 6a 63 3b 20 20 69 2b 2b 29 20 7b 0a  < objc;  i++) {.
5f80: 09 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e  .Tcl_IncrRefCoun
5f90: 74 28 6f 62 6a 76 5b 69 5d 29 3b 0a 20 20 20 20  t(objv[i]);.    
5fa0: 7d 0a 0a 20 20 20 20 69 66 20 28 6e 65 65 64 47  }..    if (needG
5fb0: 72 6f 77 20 26 26 20 21 69 73 53 68 61 72 65 64  row && !isShared
5fc0: 29 20 7b 0a 09 2f 2a 20 54 72 79 20 74 6f 20 75  ) {../* Try to u
5fd0: 73 65 20 72 65 61 6c 6c 6f 63 20 2a 2f 0a 09 4c  se realloc */..L
5fe0: 69 73 74 20 2a 6e 65 77 50 74 72 20 3d 20 4e 55  ist *newPtr = NU
5ff0: 4c 4c 3b 0a 09 69 6e 74 20 61 74 74 65 6d 70 74  LL;..int attempt
6000: 20 3d 20 32 20 2a 20 6e 75 6d 52 65 71 75 69 72   = 2 * numRequir
6010: 65 64 3b 0a 09 69 66 20 28 61 74 74 65 6d 70 74  ed;..if (attempt
6020: 20 3c 3d 20 4c 49 53 54 5f 4d 41 58 29 20 7b 0a   <= LIST_MAX) {.
6030: 09 20 20 20 20 6e 65 77 50 74 72 20 3d 20 61 74  .    newPtr = at
6040: 74 65 6d 70 74 63 6b 72 65 61 6c 6c 6f 63 28 6c  temptckrealloc(l
6050: 69 73 74 52 65 70 50 74 72 2c 20 4c 49 53 54 5f  istRepPtr, LIST_
6060: 53 49 5a 45 28 61 74 74 65 6d 70 74 29 29 3b 0a  SIZE(attempt));.
6070: 09 7d 0a 09 69 66 20 28 6e 65 77 50 74 72 20 3d  .}..if (newPtr =
6080: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 61  = NULL) {..    a
6090: 74 74 65 6d 70 74 20 3d 20 6e 75 6d 52 65 71 75  ttempt = numRequ
60a0: 69 72 65 64 20 2b 20 31 20 2b 20 54 43 4c 5f 4d  ired + 1 + TCL_M
60b0: 49 4e 5f 45 4c 45 4d 45 4e 54 5f 47 52 4f 57 54  IN_ELEMENT_GROWT
60c0: 48 3b 0a 09 20 20 20 20 69 66 20 28 61 74 74 65  H;..    if (atte
60d0: 6d 70 74 20 3e 20 4c 49 53 54 5f 4d 41 58 29 20  mpt > LIST_MAX) 
60e0: 7b 0a 09 09 61 74 74 65 6d 70 74 20 3d 20 4c 49  {...attempt = LI
60f0: 53 54 5f 4d 41 58 3b 0a 09 20 20 20 20 7d 0a 09  ST_MAX;..    }..
6100: 20 20 20 20 6e 65 77 50 74 72 20 3d 20 61 74 74      newPtr = att
6110: 65 6d 70 74 63 6b 72 65 61 6c 6c 6f 63 28 6c 69  emptckrealloc(li
6120: 73 74 52 65 70 50 74 72 2c 20 4c 49 53 54 5f 53  stRepPtr, LIST_S
6130: 49 5a 45 28 61 74 74 65 6d 70 74 29 29 3b 0a 09  IZE(attempt));..
6140: 7d 0a 09 69 66 20 28 6e 65 77 50 74 72 20 3d 3d  }..if (newPtr ==
6150: 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 61 74   NULL) {..    at
6160: 74 65 6d 70 74 20 3d 20 6e 75 6d 52 65 71 75 69  tempt = numRequi
6170: 72 65 64 3b 0a 09 20 20 20 20 6e 65 77 50 74 72  red;..    newPtr
6180: 20 3d 20 61 74 74 65 6d 70 74 63 6b 72 65 61 6c   = attemptckreal
6190: 6c 6f 63 28 6c 69 73 74 52 65 70 50 74 72 2c 20  loc(listRepPtr, 
61a0: 4c 49 53 54 5f 53 49 5a 45 28 61 74 74 65 6d 70  LIST_SIZE(attemp
61b0: 74 29 29 3b 0a 09 7d 0a 09 69 66 20 28 6e 65 77  t));..}..if (new
61c0: 50 74 72 29 20 7b 0a 09 20 20 20 20 6c 69 73 74  Ptr) {..    list
61d0: 52 65 70 50 74 72 20 3d 20 6e 65 77 50 74 72 3b  RepPtr = newPtr;
61e0: 0a 09 20 20 20 20 6c 69 73 74 50 74 72 2d 3e 69  ..    listPtr->i
61f0: 6e 74 65 72 6e 61 6c 52 65 70 2e 74 77 6f 50 74  nternalRep.twoPt
6200: 72 56 61 6c 75 65 2e 70 74 72 31 20 3d 20 6c 69  rValue.ptr1 = li
6210: 73 74 52 65 70 50 74 72 3b 0a 09 20 20 20 20 65  stRepPtr;..    e
6220: 6c 65 6d 50 74 72 73 20 3d 20 26 6c 69 73 74 52  lemPtrs = &listR
6230: 65 70 50 74 72 2d 3e 65 6c 65 6d 65 6e 74 73 3b  epPtr->elements;
6240: 0a 09 20 20 20 20 6c 69 73 74 52 65 70 50 74 72  ..    listRepPtr
6250: 2d 3e 6d 61 78 45 6c 65 6d 43 6f 75 6e 74 20 3d  ->maxElemCount =
6260: 20 61 74 74 65 6d 70 74 3b 0a 09 20 20 20 20 6e   attempt;..    n
6270: 65 65 64 47 72 6f 77 20 3d 20 6e 75 6d 52 65 71  eedGrow = numReq
6280: 75 69 72 65 64 20 3e 20 6c 69 73 74 52 65 70 50  uired > listRepP
6290: 74 72 2d 3e 6d 61 78 45 6c 65 6d 43 6f 75 6e 74  tr->maxElemCount
62a0: 3b 0a 09 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69  ;..}.    }.    i
62b0: 66 20 28 21 6e 65 65 64 47 72 6f 77 20 26 26 20  f (!needGrow && 
62c0: 21 69 73 53 68 61 72 65 64 29 20 7b 0a 09 69 6e  !isShared) {..in
62d0: 74 20 73 68 69 66 74 3b 0a 0a 09 2f 2a 0a 09 20  t shift;.../*.. 
62e0: 2a 20 43 61 6e 20 75 73 65 20 74 68 65 20 63 75  * Can use the cu
62f0: 72 72 65 6e 74 20 4c 69 73 74 20 73 74 72 75 63  rrent List struc
6300: 74 2e 20 46 69 72 73 74 20 22 64 65 6c 65 74 65  t. First "delete
6310: 22 20 63 6f 75 6e 74 20 65 6c 65 6d 65 6e 74 73  " count elements
6320: 0a 09 20 2a 20 73 74 61 72 74 69 6e 67 20 61 74  .. * starting at
6330: 20 66 69 72 73 74 2e 0a 09 20 2a 2f 0a 0a 09 66   first... */...f
6340: 6f 72 20 28 6a 20 3d 20 66 69 72 73 74 3b 20 20  or (j = first;  
6350: 6a 20 3c 20 66 69 72 73 74 20 2b 20 63 6f 75 6e  j < first + coun
6360: 74 3b 20 20 6a 2b 2b 29 20 7b 0a 09 20 20 20 20  t;  j++) {..    
6370: 54 63 6c 5f 4f 62 6a 20 2a 76 69 63 74 69 6d 50  Tcl_Obj *victimP
6380: 74 72 20 3d 20 65 6c 65 6d 50 74 72 73 5b 6a 5d  tr = elemPtrs[j]
6390: 3b 0a 0a 09 20 20 20 20 54 63 6c 44 65 63 72 52  ;...    TclDecrR
63a0: 65 66 43 6f 75 6e 74 28 76 69 63 74 69 6d 50 74  efCount(victimPt
63b0: 72 29 3b 0a 09 7d 0a 0a 09 2f 2a 0a 09 20 2a 20  r);..}.../*.. * 
63c0: 53 68 69 66 74 20 74 68 65 20 65 6c 65 6d 65 6e  Shift the elemen
63d0: 74 73 20 61 66 74 65 72 20 74 68 65 20 6c 61 73  ts after the las
63e0: 74 20 6f 6e 65 20 72 65 6d 6f 76 65 64 20 74 6f  t one removed to
63f0: 20 74 68 65 69 72 20 6e 65 77 0a 09 20 2a 20 6c   their new.. * l
6400: 6f 63 61 74 69 6f 6e 73 2e 0a 09 20 2a 2f 0a 0a  ocations... */..
6410: 09 73 74 61 72 74 20 3d 20 66 69 72 73 74 20 2b  .start = first +
6420: 20 63 6f 75 6e 74 3b 0a 09 6e 75 6d 41 66 74 65   count;..numAfte
6430: 72 4c 61 73 74 20 3d 20 6e 75 6d 45 6c 65 6d 73  rLast = numElems
6440: 20 2d 20 73 74 61 72 74 3b 0a 09 73 68 69 66 74   - start;..shift
6450: 20 3d 20 6f 62 6a 63 20 2d 20 63 6f 75 6e 74 3b   = objc - count;
6460: 09 2f 2a 20 6e 75 6d 4e 65 77 45 6c 65 6d 73 20  ./* numNewElems 
6470: 2d 20 6e 75 6d 44 65 6c 65 74 65 64 20 2a 2f 0a  - numDeleted */.
6480: 09 69 66 20 28 28 6e 75 6d 41 66 74 65 72 4c 61  .if ((numAfterLa
6490: 73 74 20 3e 20 30 29 20 26 26 20 28 73 68 69 66  st > 0) && (shif
64a0: 74 20 21 3d 20 30 29 29 20 7b 0a 09 20 20 20 20  t != 0)) {..    
64b0: 54 63 6c 5f 4f 62 6a 20 2a 2a 73 72 63 20 3d 20  Tcl_Obj **src = 
64c0: 65 6c 65 6d 50 74 72 73 20 2b 20 73 74 61 72 74  elemPtrs + start
64d0: 3b 0a 0a 09 20 20 20 20 6d 65 6d 6d 6f 76 65 28  ;...    memmove(
64e0: 73 72 63 2b 73 68 69 66 74 2c 20 73 72 63 2c 20  src+shift, src, 
64f0: 28 73 69 7a 65 5f 74 29 20 6e 75 6d 41 66 74 65  (size_t) numAfte
6500: 72 4c 61 73 74 20 2a 20 73 69 7a 65 6f 66 28 54  rLast * sizeof(T
6510: 63 6c 5f 4f 62 6a 2a 29 29 3b 0a 09 7d 0a 20 20  cl_Obj*));..}.  
6520: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 2f 2a 0a 09    } else {../*..
6530: 20 2a 20 43 61 6e 6e 6f 74 20 75 73 65 20 74 68   * Cannot use th
6540: 65 20 63 75 72 72 65 6e 74 20 4c 69 73 74 20 73  e current List s
6550: 74 72 75 63 74 3b 20 69 74 20 69 73 20 73 68 61  truct; it is sha
6560: 72 65 64 2c 20 74 6f 6f 20 73 6d 61 6c 6c 2c 20  red, too small, 
6570: 6f 72 0a 09 20 2a 20 62 6f 74 68 2e 20 41 6c 6c  or.. * both. All
6580: 6f 63 61 74 65 20 61 20 6e 65 77 20 73 74 72 75  ocate a new stru
6590: 63 74 20 61 6e 64 20 69 6e 73 65 72 74 20 65 6c  ct and insert el
65a0: 65 6d 65 6e 74 73 20 69 6e 74 6f 20 69 74 2e 0a  ements into it..
65b0: 09 20 2a 2f 0a 0a 09 4c 69 73 74 20 2a 6f 6c 64  . */...List *old
65c0: 4c 69 73 74 52 65 70 50 74 72 20 3d 20 6c 69 73  ListRepPtr = lis
65d0: 74 52 65 70 50 74 72 3b 0a 09 54 63 6c 5f 4f 62  tRepPtr;..Tcl_Ob
65e0: 6a 20 2a 2a 6f 6c 64 50 74 72 73 20 3d 20 65 6c  j **oldPtrs = el
65f0: 65 6d 50 74 72 73 3b 0a 09 69 6e 74 20 6e 65 77  emPtrs;..int new
6600: 4d 61 78 3b 0a 0a 09 69 66 20 28 6e 65 65 64 47  Max;...if (needG
6610: 72 6f 77 29 7b 0a 09 20 20 20 20 6e 65 77 4d 61  row){..    newMa
6620: 78 20 3d 20 32 20 2a 20 6e 75 6d 52 65 71 75 69  x = 2 * numRequi
6630: 72 65 64 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09  red;..} else {..
6640: 20 20 20 20 6e 65 77 4d 61 78 20 3d 20 6c 69 73      newMax = lis
6650: 74 52 65 70 50 74 72 2d 3e 6d 61 78 45 6c 65 6d  tRepPtr->maxElem
6660: 43 6f 75 6e 74 3b 0a 09 7d 0a 0a 09 6c 69 73 74  Count;..}...list
6670: 52 65 70 50 74 72 20 3d 20 41 74 74 65 6d 70 74  RepPtr = Attempt
6680: 4e 65 77 4c 69 73 74 28 4e 55 4c 4c 2c 20 6e 65  NewList(NULL, ne
6690: 77 4d 61 78 2c 20 4e 55 4c 4c 29 3b 0a 09 69 66  wMax, NULL);..if
66a0: 20 28 6c 69 73 74 52 65 70 50 74 72 20 3d 3d 20   (listRepPtr == 
66b0: 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 75 6e 73  NULL) {..    uns
66c0: 69 67 6e 65 64 20 69 6e 74 20 6c 69 6d 69 74 20  igned int limit 
66d0: 3d 20 4c 49 53 54 5f 4d 41 58 20 2d 20 6e 75 6d  = LIST_MAX - num
66e0: 52 65 71 75 69 72 65 64 3b 0a 09 20 20 20 20 75  Required;..    u
66f0: 6e 73 69 67 6e 65 64 20 69 6e 74 20 65 78 74 72  nsigned int extr
6700: 61 20 3d 20 6e 75 6d 52 65 71 75 69 72 65 64 20  a = numRequired 
6710: 2d 20 6e 75 6d 45 6c 65 6d 73 0a 09 09 20 20 20  - numElems...   
6720: 20 2b 20 54 43 4c 5f 4d 49 4e 5f 45 4c 45 4d 45   + TCL_MIN_ELEME
6730: 4e 54 5f 47 52 4f 57 54 48 3b 0a 09 20 20 20 20  NT_GROWTH;..    
6740: 69 6e 74 20 67 72 6f 77 74 68 20 3d 20 28 69 6e  int growth = (in
6750: 74 29 20 28 28 65 78 74 72 61 20 3e 20 6c 69 6d  t) ((extra > lim
6760: 69 74 29 20 3f 20 6c 69 6d 69 74 20 3a 20 65 78  it) ? limit : ex
6770: 74 72 61 29 3b 0a 0a 09 20 20 20 20 6c 69 73 74  tra);...    list
6780: 52 65 70 50 74 72 20 3d 20 41 74 74 65 6d 70 74  RepPtr = Attempt
6790: 4e 65 77 4c 69 73 74 28 4e 55 4c 4c 2c 20 6e 75  NewList(NULL, nu
67a0: 6d 52 65 71 75 69 72 65 64 20 2b 20 67 72 6f 77  mRequired + grow
67b0: 74 68 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20  th, NULL);..    
67c0: 69 66 20 28 6c 69 73 74 52 65 70 50 74 72 20 3d  if (listRepPtr =
67d0: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 6c 69 73 74  = NULL) {...list
67e0: 52 65 70 50 74 72 20 3d 20 41 74 74 65 6d 70 74  RepPtr = Attempt
67f0: 4e 65 77 4c 69 73 74 28 69 6e 74 65 72 70 2c 20  NewList(interp, 
6800: 6e 75 6d 52 65 71 75 69 72 65 64 2c 20 4e 55 4c  numRequired, NUL
6810: 4c 29 3b 0a 09 09 69 66 20 28 6c 69 73 74 52 65  L);...if (listRe
6820: 70 50 74 72 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  pPtr == NULL) {.
6830: 09 09 20 20 20 20 66 6f 72 20 28 69 20 3d 20 30  ..    for (i = 0
6840: 3b 20 20 69 20 3c 20 6f 62 6a 63 3b 20 20 69 2b  ;  i < objc;  i+
6850: 2b 29 20 7b 0a 09 09 09 2f 2a 20 53 65 65 20 62  +) {..../* See b
6860: 75 67 20 33 35 39 38 35 38 30 20 2a 2f 0a 23 69  ug 3598580 */.#i
6870: 66 20 54 43 4c 5f 4d 41 4a 4f 52 5f 56 45 52 53  f TCL_MAJOR_VERS
6880: 49 4f 4e 20 3e 20 38 0a 09 09 09 54 63 6c 5f 44  ION > 8....Tcl_D
6890: 65 63 72 52 65 66 43 6f 75 6e 74 28 6f 62 6a 76  ecrRefCount(objv
68a0: 5b 69 5d 29 3b 0a 23 65 6c 73 65 0a 09 09 09 6f  [i]);.#else....o
68b0: 62 6a 76 5b 69 5d 2d 3e 72 65 66 43 6f 75 6e 74  bjv[i]->refCount
68c0: 2d 2d 3b 0a 23 65 6e 64 69 66 0a 09 09 20 20 20  --;.#endif...   
68d0: 20 7d 0a 09 09 20 20 20 20 72 65 74 75 72 6e 20   }...    return 
68e0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 09 7d 0a 09  TCL_ERROR;...}..
68f0: 20 20 20 20 7d 0a 09 7d 0a 0a 09 6c 69 73 74 50      }..}...listP
6900: 74 72 2d 3e 69 6e 74 65 72 6e 61 6c 52 65 70 2e  tr->internalRep.
6910: 74 77 6f 50 74 72 56 61 6c 75 65 2e 70 74 72 31  twoPtrValue.ptr1
6920: 20 3d 20 6c 69 73 74 52 65 70 50 74 72 3b 0a 09   = listRepPtr;..
6930: 6c 69 73 74 52 65 70 50 74 72 2d 3e 72 65 66 43  listRepPtr->refC
6940: 6f 75 6e 74 2b 2b 3b 0a 0a 09 65 6c 65 6d 50 74  ount++;...elemPt
6950: 72 73 20 3d 20 26 6c 69 73 74 52 65 70 50 74 72  rs = &listRepPtr
6960: 2d 3e 65 6c 65 6d 65 6e 74 73 3b 0a 0a 09 69 66  ->elements;...if
6970: 20 28 69 73 53 68 61 72 65 64 29 20 7b 0a 09 20   (isShared) {.. 
6980: 20 20 20 2f 2a 0a 09 20 20 20 20 20 2a 20 54 68     /*..     * Th
6990: 65 20 6f 6c 64 20 73 74 72 75 63 74 20 77 69 6c  e old struct wil
69a0: 6c 20 72 65 6d 61 69 6e 20 69 6e 20 70 6c 61 63  l remain in plac
69b0: 65 3b 20 6e 65 65 64 20 6e 65 77 20 72 65 66 43  e; need new refC
69c0: 6f 75 6e 74 73 20 66 6f 72 20 74 68 65 0a 09 20  ounts for the.. 
69d0: 20 20 20 20 2a 20 6e 65 77 20 4c 69 73 74 20 73      * new List s
69e0: 74 72 75 63 74 20 72 65 66 65 72 65 6e 63 65 73  truct references
69f0: 2e 20 43 6f 70 79 20 6f 76 65 72 20 6f 6e 6c 79  . Copy over only
6a00: 20 74 68 65 20 73 75 72 76 69 76 69 6e 67 0a 09   the surviving..
6a10: 20 20 20 20 20 2a 20 65 6c 65 6d 65 6e 74 73 2e       * elements.
6a20: 0a 09 20 20 20 20 20 2a 2f 0a 0a 09 20 20 20 20  ..     */...    
6a30: 66 6f 72 20 28 69 3d 30 3b 20 69 20 3c 20 66 69  for (i=0; i < fi
6a40: 72 73 74 3b 20 69 2b 2b 29 20 7b 0a 09 09 65 6c  rst; i++) {...el
6a50: 65 6d 50 74 72 73 5b 69 5d 20 3d 20 6f 6c 64 50  emPtrs[i] = oldP
6a60: 74 72 73 5b 69 5d 3b 0a 09 09 54 63 6c 5f 49 6e  trs[i];...Tcl_In
6a70: 63 72 52 65 66 43 6f 75 6e 74 28 65 6c 65 6d 50  crRefCount(elemP
6a80: 74 72 73 5b 69 5d 29 3b 0a 09 20 20 20 20 7d 0a  trs[i]);..    }.
6a90: 09 20 20 20 20 66 6f 72 20 28 69 20 3d 20 66 69  .    for (i = fi
6aa0: 72 73 74 20 2b 20 63 6f 75 6e 74 2c 20 6a 20 3d  rst + count, j =
6ab0: 20 66 69 72 73 74 20 2b 20 6f 62 6a 63 3b 0a 09   first + objc;..
6ac0: 09 20 20 20 20 6a 20 3c 20 6e 75 6d 52 65 71 75  .    j < numRequ
6ad0: 69 72 65 64 3b 20 69 2b 2b 2c 20 6a 2b 2b 29 20  ired; i++, j++) 
6ae0: 7b 0a 09 09 65 6c 65 6d 50 74 72 73 5b 6a 5d 20  {...elemPtrs[j] 
6af0: 3d 20 6f 6c 64 50 74 72 73 5b 69 5d 3b 0a 09 09  = oldPtrs[i];...
6b00: 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74  Tcl_IncrRefCount
6b10: 28 65 6c 65 6d 50 74 72 73 5b 6a 5d 29 3b 0a 09  (elemPtrs[j]);..
6b20: 20 20 20 20 7d 0a 0a 09 20 20 20 20 6f 6c 64 4c      }...    oldL
6b30: 69 73 74 52 65 70 50 74 72 2d 3e 72 65 66 43 6f  istRepPtr->refCo
6b40: 75 6e 74 2d 2d 3b 0a 09 7d 20 65 6c 73 65 20 7b  unt--;..} else {
6b50: 0a 09 20 20 20 20 2f 2a 0a 09 20 20 20 20 20 2a  ..    /*..     *
6b60: 20 54 68 65 20 6f 6c 64 20 73 74 72 75 63 74 20   The old struct 
6b70: 77 69 6c 6c 20 62 65 20 72 65 6d 6f 76 65 64 3b  will be removed;
6b80: 20 75 73 65 20 69 74 73 20 69 6e 68 65 72 69 74   use its inherit
6b90: 65 64 20 72 65 66 43 6f 75 6e 74 73 2e 0a 09 20  ed refCounts... 
6ba0: 20 20 20 20 2a 2f 0a 0a 09 20 20 20 20 69 66 20      */...    if 
6bb0: 28 66 69 72 73 74 20 3e 20 30 29 20 7b 0a 09 09  (first > 0) {...
6bc0: 6d 65 6d 63 70 79 28 65 6c 65 6d 50 74 72 73 2c  memcpy(elemPtrs,
6bd0: 20 6f 6c 64 50 74 72 73 2c 20 28 73 69 7a 65 5f   oldPtrs, (size_
6be0: 74 29 20 66 69 72 73 74 20 2a 20 73 69 7a 65 6f  t) first * sizeo
6bf0: 66 28 54 63 6c 5f 4f 62 6a 20 2a 29 29 3b 0a 09  f(Tcl_Obj *));..
6c00: 20 20 20 20 7d 0a 0a 09 20 20 20 20 2f 2a 0a 09      }...    /*..
6c10: 20 20 20 20 20 2a 20 22 44 65 6c 65 74 65 22 20       * "Delete" 
6c20: 63 6f 75 6e 74 20 65 6c 65 6d 65 6e 74 73 20 73  count elements s
6c30: 74 61 72 74 69 6e 67 20 61 74 20 66 69 72 73 74  tarting at first
6c40: 2e 0a 09 20 20 20 20 20 2a 2f 0a 0a 09 20 20 20  ...     */...   
6c50: 20 66 6f 72 20 28 6a 20 3d 20 66 69 72 73 74 3b   for (j = first;
6c60: 20 20 6a 20 3c 20 66 69 72 73 74 20 2b 20 63 6f    j < first + co
6c70: 75 6e 74 3b 20 20 6a 2b 2b 29 20 7b 0a 09 09 54  unt;  j++) {...T
6c80: 63 6c 5f 4f 62 6a 20 2a 76 69 63 74 69 6d 50 74  cl_Obj *victimPt
6c90: 72 20 3d 20 6f 6c 64 50 74 72 73 5b 6a 5d 3b 0a  r = oldPtrs[j];.
6ca0: 0a 09 09 54 63 6c 44 65 63 72 52 65 66 43 6f 75  ...TclDecrRefCou
6cb0: 6e 74 28 76 69 63 74 69 6d 50 74 72 29 3b 0a 09  nt(victimPtr);..
6cc0: 20 20 20 20 7d 0a 0a 09 20 20 20 20 2f 2a 0a 09      }...    /*..
6cd0: 20 20 20 20 20 2a 20 43 6f 70 79 20 74 68 65 20       * Copy the 
6ce0: 65 6c 65 6d 65 6e 74 73 20 61 66 74 65 72 20 74  elements after t
6cf0: 68 65 20 6c 61 73 74 20 6f 6e 65 20 72 65 6d 6f  he last one remo
6d00: 76 65 64 2c 20 73 68 69 66 74 65 64 20 74 6f 20  ved, shifted to 
6d10: 74 68 65 69 72 0a 09 20 20 20 20 20 2a 20 6e 65  their..     * ne
6d20: 77 20 6c 6f 63 61 74 69 6f 6e 73 2e 0a 09 20 20  w locations...  
6d30: 20 20 20 2a 2f 0a 0a 09 20 20 20 20 73 74 61 72     */...    star
6d40: 74 20 3d 20 66 69 72 73 74 20 2b 20 63 6f 75 6e  t = first + coun
6d50: 74 3b 0a 09 20 20 20 20 6e 75 6d 41 66 74 65 72  t;..    numAfter
6d60: 4c 61 73 74 20 3d 20 6e 75 6d 45 6c 65 6d 73 20  Last = numElems 
6d70: 2d 20 73 74 61 72 74 3b 0a 09 20 20 20 20 69 66  - start;..    if
6d80: 20 28 6e 75 6d 41 66 74 65 72 4c 61 73 74 20 3e   (numAfterLast >
6d90: 20 30 29 20 7b 0a 09 09 6d 65 6d 63 70 79 28 65   0) {...memcpy(e
6da0: 6c 65 6d 50 74 72 73 20 2b 20 66 69 72 73 74 20  lemPtrs + first 
6db0: 2b 20 6f 62 6a 63 2c 20 6f 6c 64 50 74 72 73 20  + objc, oldPtrs 
6dc0: 2b 20 73 74 61 72 74 2c 0a 09 09 09 28 73 69 7a  + start,....(siz
6dd0: 65 5f 74 29 20 6e 75 6d 41 66 74 65 72 4c 61 73  e_t) numAfterLas
6de0: 74 20 2a 20 73 69 7a 65 6f 66 28 54 63 6c 5f 4f  t * sizeof(Tcl_O
6df0: 62 6a 20 2a 29 29 3b 0a 09 20 20 20 20 7d 0a 0a  bj *));..    }..
6e00: 09 20 20 20 20 63 6b 66 72 65 65 28 6f 6c 64 4c  .    ckfree(oldL
6e10: 69 73 74 52 65 70 50 74 72 29 3b 0a 09 7d 0a 20  istRepPtr);..}. 
6e20: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20     }..    /*.   
6e30: 20 20 2a 20 49 6e 73 65 72 74 20 74 68 65 20 6e    * Insert the n
6e40: 65 77 20 65 6c 65 6d 65 6e 74 73 20 69 6e 74 6f  ew elements into
6e50: 20 65 6c 65 6d 50 74 72 73 20 62 65 66 6f 72 65   elemPtrs before
6e60: 20 22 66 69 72 73 74 22 2e 0a 20 20 20 20 20 2a   "first"..     *
6e70: 2f 0a 0a 20 20 20 20 66 6f 72 20 28 69 3d 30 2c  /..    for (i=0,
6e80: 6a 3d 66 69 72 73 74 20 3b 20 69 3c 6f 62 6a 63  j=first ; i<objc
6e90: 20 3b 20 69 2b 2b 2c 6a 2b 2b 29 20 7b 0a 09 65   ; i++,j++) {..e
6ea0: 6c 65 6d 50 74 72 73 5b 6a 5d 20 3d 20 6f 62 6a  lemPtrs[j] = obj
6eb0: 76 5b 69 5d 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  v[i];.    }..   
6ec0: 20 2f 2a 0a 20 20 20 20 20 2a 20 55 70 64 61 74   /*.     * Updat
6ed0: 65 20 74 68 65 20 63 6f 75 6e 74 20 6f 66 20 65  e the count of e
6ee0: 6c 65 6d 65 6e 74 73 2e 0a 20 20 20 20 20 2a 2f  lements..     */
6ef0: 0a 0a 20 20 20 20 6c 69 73 74 52 65 70 50 74 72  ..    listRepPtr
6f00: 2d 3e 65 6c 65 6d 43 6f 75 6e 74 20 3d 20 6e 75  ->elemCount = nu
6f10: 6d 52 65 71 75 69 72 65 64 3b 0a 0a 20 20 20 20  mRequired;..    
6f20: 2f 2a 0a 20 20 20 20 20 2a 20 49 6e 76 61 6c 69  /*.     * Invali
6f30: 64 61 74 65 20 61 6e 64 20 66 72 65 65 20 61 6e  date and free an
6f40: 79 20 6f 6c 64 20 73 74 72 69 6e 67 20 72 65 70  y old string rep
6f50: 72 65 73 65 6e 74 61 74 69 6f 6e 20 73 69 6e 63  resentation sinc
6f60: 65 20 69 74 20 6e 6f 20 6c 6f 6e 67 65 72 0a 20  e it no longer. 
6f70: 20 20 20 20 2a 20 72 65 66 6c 65 63 74 73 20 74      * reflects t
6f80: 68 65 20 6c 69 73 74 27 73 20 69 6e 74 65 72 6e  he list's intern
6f90: 61 6c 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  al representatio
6fa0: 6e 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20  n..     */..    
6fb0: 54 63 6c 49 6e 76 61 6c 69 64 61 74 65 53 74 72  TclInvalidateStr
6fc0: 69 6e 67 52 65 70 28 6c 69 73 74 50 74 72 29 3b  ingRep(listPtr);
6fd0: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
6fe0: 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d  OK;.}.../*. *---
6ff0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7000: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7010: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7030: 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 63 6c 4c 69 6e  ---. *. * TclLin
7040: 64 65 78 4c 69 73 74 20 2d 2d 0a 20 2a 0a 20 2a  dexList --. *. *
7050: 09 49 6d 70 6c 65 6d 65 6e 74 73 20 74 68 65 20  .Implements the 
7060: 27 6c 69 6e 64 65 78 27 20 63 6f 6d 6d 61 6e 64  'lindex' command
7070: 20 77 68 65 6e 20 6f 62 6a 63 3d 3d 33 2e 0a 20   when objc==3.. 
7080: 2a 0a 20 2a 09 49 6d 70 6c 65 6d 65 6e 74 65 64  *. *.Implemented
7090: 20 65 6e 74 69 72 65 6c 79 20 61 73 20 61 20 77   entirely as a w
70a0: 72 61 70 70 65 72 20 61 72 6f 75 6e 64 20 27 54  rapper around 'T
70b0: 63 6c 4c 69 6e 64 65 78 46 6c 61 74 27 2e 20 52  clLindexFlat'. R
70c0: 65 63 6f 6e 66 69 67 75 72 65 73 0a 20 2a 09 74  econfigures. *.t
70d0: 68 65 20 61 72 67 75 6d 65 6e 74 20 66 6f 72 6d  he argument form
70e0: 61 74 20 69 6e 74 6f 20 72 65 71 75 69 72 65 64  at into required
70f0: 20 66 6f 72 6d 20 77 68 69 6c 65 20 74 61 6b 69   form while taki
7100: 6e 67 20 63 61 72 65 20 74 6f 20 6d 61 6e 61 67  ng care to manag
7110: 65 0a 20 2a 09 73 68 69 6d 6d 65 72 69 6e 67 20  e. *.shimmering 
7120: 73 6f 20 61 73 20 74 6f 20 74 65 6e 64 20 74 6f  so as to tend to
7130: 20 6b 65 65 70 20 74 68 65 20 6d 6f 73 74 20 75   keep the most u
7140: 73 65 66 75 6c 20 69 6e 74 72 65 70 73 0a 20 2a  seful intreps. *
7150: 09 61 6e 64 2f 6f 72 20 61 76 6f 69 64 20 74 68  .and/or avoid th
7160: 65 20 6d 6f 73 74 20 65 78 70 65 6e 73 69 76 65  e most expensive
7170: 20 63 6f 6e 76 65 72 73 69 6f 6e 73 2e 0a 20 2a   conversions.. *
7180: 0a 20 2a 20 56 61 6c 75 65 0a 20 2a 0a 20 2a 09  . * Value. *. *.
7190: 41 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  A pointer to the
71a0: 20 73 70 65 63 69 66 69 65 64 20 65 6c 65 6d 65   specified eleme
71b0: 6e 74 2c 20 77 69 74 68 20 69 74 73 20 27 72 65  nt, with its 're
71c0: 66 43 6f 75 6e 74 27 20 69 6e 63 72 65 6d 65 6e  fCount' incremen
71d0: 74 65 64 2c 20 6f 72 0a 20 2a 09 4e 55 4c 4c 20  ted, or. *.NULL 
71e0: 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  if an error occu
71f0: 72 72 65 64 2e 0a 20 2a 0a 20 2a 20 4e 6f 74 65  rred.. *. * Note
7200: 73 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  s. *. *---------
7210: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7220: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7230: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7240: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
7250: 2f 0a 0a 54 63 6c 5f 4f 62 6a 20 2a 0a 54 63 6c  /..Tcl_Obj *.Tcl
7260: 4c 69 6e 64 65 78 4c 69 73 74 28 0a 20 20 20 20  LindexList(.    
7270: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
7280: 72 70 2c 09 09 2f 2a 20 54 63 6c 20 69 6e 74 65  rp,../* Tcl inte
7290: 72 70 72 65 74 65 72 2e 20 2a 2f 0a 20 20 20 20  rpreter. */.    
72a0: 54 63 6c 5f 4f 62 6a 20 2a 6c 69 73 74 50 74 72  Tcl_Obj *listPtr
72b0: 2c 09 09 2f 2a 20 4c 69 73 74 20 62 65 69 6e 67  ,../* List being
72c0: 20 75 6e 70 61 63 6b 65 64 2e 20 2a 2f 0a 20 20   unpacked. */.  
72d0: 20 20 54 63 6c 5f 4f 62 6a 20 2a 61 72 67 50 74    Tcl_Obj *argPt
72e0: 72 29 09 09 2f 2a 20 49 6e 64 65 78 20 6f 72 20  r)../* Index or 
72f0: 69 6e 64 65 78 20 6c 69 73 74 2e 20 2a 2f 0a 7b  index list. */.{
7300: 0a 0a 20 20 20 20 69 6e 74 20 69 6e 64 65 78 3b  ..    int index;
7310: 09 09 09 2f 2a 20 49 6e 64 65 78 20 69 6e 74 6f  .../* Index into
7320: 20 74 68 65 20 6c 69 73 74 2e 20 2a 2f 0a 20 20   the list. */.  
7330: 20 20 54 63 6c 5f 4f 62 6a 20 2a 69 6e 64 65 78    Tcl_Obj *index
7340: 4c 69 73 74 43 6f 70 79 3b 0a 0a 20 20 20 20 2f  ListCopy;..    /
7350: 2a 0a 20 20 20 20 20 2a 20 44 65 74 65 72 6d 69  *.     * Determi
7360: 6e 65 20 77 68 65 74 68 65 72 20 61 72 67 50 74  ne whether argPt
7370: 72 20 64 65 73 69 67 6e 61 74 65 73 20 61 20 6c  r designates a l
7380: 69 73 74 20 6f 72 20 61 20 73 69 6e 67 6c 65 20  ist or a single 
7390: 69 6e 64 65 78 2e 20 57 65 20 68 61 76 65 0a 20  index. We have. 
73a0: 20 20 20 20 2a 20 74 6f 20 62 65 20 63 61 72 65      * to be care
73b0: 66 75 6c 20 61 62 6f 75 74 20 74 68 65 20 6f 72  ful about the or
73c0: 64 65 72 20 6f 66 20 74 68 65 20 63 68 65 63 6b  der of the check
73d0: 73 20 74 6f 20 61 76 6f 69 64 20 72 65 70 65 61  s to avoid repea
73e0: 74 65 64 0a 20 20 20 20 20 2a 20 73 68 69 6d 6d  ted.     * shimm
73f0: 65 72 69 6e 67 3b 20 73 65 65 20 54 49 50 23 32  ering; see TIP#2
7400: 32 20 61 6e 64 20 54 49 50 23 33 33 20 66 6f 72  2 and TIP#33 for
7410: 20 74 68 65 20 64 65 74 61 69 6c 73 2e 0a 20 20   the details..  
7420: 20 20 20 2a 2f 0a 0a 20 20 20 20 69 66 20 28 61     */..    if (a
7430: 72 67 50 74 72 2d 3e 74 79 70 65 50 74 72 20 21  rgPtr->typePtr !
7440: 3d 20 26 74 63 6c 4c 69 73 74 54 79 70 65 0a 09  = &tclListType..
7450: 20 20 20 20 26 26 20 54 63 6c 47 65 74 49 6e 74      && TclGetInt
7460: 46 6f 72 49 6e 64 65 78 4d 28 4e 55 4c 4c 20 2c  ForIndexM(NULL ,
7470: 20 61 72 67 50 74 72 2c 20 30 2c 20 26 69 6e 64   argPtr, 0, &ind
7480: 65 78 29 20 3d 3d 20 54 43 4c 5f 4f 4b 29 20 7b  ex) == TCL_OK) {
7490: 0a 09 2f 2a 0a 09 20 2a 20 61 72 67 50 74 72 20  ../*.. * argPtr 
74a0: 64 65 73 69 67 6e 61 74 65 73 20 61 20 73 69 6e  designates a sin
74b0: 67 6c 65 20 69 6e 64 65 78 2e 0a 09 20 2a 2f 0a  gle index... */.
74c0: 0a 09 72 65 74 75 72 6e 20 54 63 6c 4c 69 6e 64  ..return TclLind
74d0: 65 78 46 6c 61 74 28 69 6e 74 65 72 70 2c 20 6c  exFlat(interp, l
74e0: 69 73 74 50 74 72 2c 20 31 2c 20 26 61 72 67 50  istPtr, 1, &argP
74f0: 74 72 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  tr);.    }..    
7500: 2f 2a 0a 20 20 20 20 20 2a 20 48 65 72 65 20 77  /*.     * Here w
7510: 65 20 6d 61 6b 65 20 61 20 70 72 69 76 61 74 65  e make a private
7520: 20 63 6f 70 79 20 6f 66 20 74 68 65 20 69 6e 64   copy of the ind
7530: 65 78 20 6c 69 73 74 20 61 72 67 75 6d 65 6e 74  ex list argument
7540: 20 74 6f 20 61 76 6f 69 64 20 61 6e 79 0a 20 20   to avoid any.  
7550: 20 20 20 2a 20 73 68 69 6d 6d 65 72 69 6e 67 20     * shimmering 
7560: 69 73 73 75 65 73 20 74 68 61 74 20 6d 69 67 68  issues that migh
7570: 74 20 69 6e 76 61 6c 69 64 61 74 65 20 74 68 65  t invalidate the
7580: 20 69 6e 64 69 63 65 73 20 61 72 72 61 79 20 62   indices array b
7590: 65 6c 6f 77 20 77 68 69 6c 65 0a 20 20 20 20 20  elow while.     
75a0: 2a 20 77 65 20 61 72 65 20 73 74 69 6c 6c 20 75  * we are still u
75b0: 73 69 6e 67 20 69 74 2e 20 54 68 69 73 20 69 73  sing it. This is
75c0: 20 70 72 6f 62 61 62 6c 79 20 75 6e 6e 65 63 65   probably unnece
75d0: 73 73 61 72 79 2e 20 49 74 20 64 6f 65 73 20 6e  ssary. It does n
75e0: 6f 74 20 61 70 70 65 61 72 0a 20 20 20 20 20 2a  ot appear.     *
75f0: 20 74 68 61 74 20 61 6e 79 20 64 61 6d 61 67 69   that any damagi
7600: 6e 67 20 73 68 69 6d 6d 65 72 69 6e 67 20 69 73  ng shimmering is
7610: 20 70 6f 73 73 69 62 6c 65 2c 20 61 6e 64 20 6e   possible, and n
7620: 6f 20 74 65 73 74 20 68 61 73 20 62 65 65 6e 20  o test has been 
7630: 64 65 76 69 73 65 64 0a 20 20 20 20 20 2a 20 74  devised.     * t
7640: 6f 20 73 68 6f 77 20 61 6e 79 20 65 72 72 6f 72  o show any error
7650: 20 77 68 65 6e 20 74 68 69 73 20 70 72 69 76 61   when this priva
7660: 74 65 20 63 6f 70 79 20 69 73 20 6e 6f 74 20 6d  te copy is not m
7670: 61 64 65 2e 20 42 75 74 20 69 74 27 73 20 63 68  ade. But it's ch
7680: 65 61 70 2c 0a 20 20 20 20 20 2a 20 61 6e 64 20  eap,.     * and 
7690: 69 74 20 6f 66 66 65 72 73 20 73 6f 6d 65 20 66  it offers some f
76a0: 75 74 75 72 65 2d 70 72 6f 6f 66 69 6e 67 20 69  uture-proofing i
76b0: 6e 73 75 72 61 6e 63 65 20 69 6e 20 63 61 73 65  nsurance in case
76c0: 20 74 68 65 20 54 63 6c 4c 69 6e 64 65 78 46 6c   the TclLindexFl
76d0: 61 74 0a 20 20 20 20 20 2a 20 69 6d 70 6c 65 6d  at.     * implem
76e0: 65 6e 74 61 74 69 6f 6e 20 63 68 61 6e 67 65 73  entation changes
76f0: 20 69 6e 20 73 6f 6d 65 20 75 6e 65 78 70 65 63   in some unexpec
7700: 74 65 64 20 77 61 79 2c 20 6f 72 20 73 6f 6d 65  ted way, or some
7710: 20 6e 65 77 20 66 6f 72 6d 20 6f 66 0a 20 20 20   new form of.   
7720: 20 20 2a 20 74 72 61 63 65 20 6f 72 20 63 61 6c    * trace or cal
7730: 6c 62 61 63 6b 20 70 65 72 6d 69 74 73 20 74 68  lback permits th
7740: 69 6e 67 73 20 74 6f 20 68 61 70 70 65 6e 20 74  ings to happen t
7750: 68 61 74 20 74 68 65 20 63 75 72 72 65 6e 74 0a  hat the current.
7760: 20 20 20 20 20 2a 20 69 6d 70 6c 65 6d 65 6e 74       * implement
7770: 61 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 2e 0a  ation does not..
7780: 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 69 6e 64       */..    ind
7790: 65 78 4c 69 73 74 43 6f 70 79 20 3d 20 54 63 6c  exListCopy = Tcl
77a0: 4c 69 73 74 4f 62 6a 43 6f 70 79 28 4e 55 4c 4c  ListObjCopy(NULL
77b0: 2c 20 61 72 67 50 74 72 29 3b 0a 20 20 20 20 69  , argPtr);.    i
77c0: 66 20 28 69 6e 64 65 78 4c 69 73 74 43 6f 70 79  f (indexListCopy
77d0: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 2f 2a 0a   == NULL) {../*.
77e0: 09 20 2a 20 61 72 67 50 74 72 20 64 65 73 69 67  . * argPtr desig
77f0: 6e 61 74 65 73 20 73 6f 6d 65 74 68 69 6e 67 20  nates something 
7800: 74 68 61 74 20 69 73 20 6e 65 69 74 68 65 72 20  that is neither 
7810: 61 6e 20 69 6e 64 65 78 20 6e 6f 72 20 61 0a 09  an index nor a..
7820: 20 2a 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 6c   * well-formed l
7830: 69 73 74 2e 20 52 65 70 6f 72 74 20 74 68 65 20  ist. Report the 
7840: 65 72 72 6f 72 20 76 69 61 20 54 63 6c 4c 69 6e  error via TclLin
7850: 64 65 78 46 6c 61 74 2e 0a 09 20 2a 2f 0a 0a 09  dexFlat... */...
7860: 72 65 74 75 72 6e 20 54 63 6c 4c 69 6e 64 65 78  return TclLindex
7870: 46 6c 61 74 28 69 6e 74 65 72 70 2c 20 6c 69 73  Flat(interp, lis
7880: 74 50 74 72 2c 20 31 2c 20 26 61 72 67 50 74 72  tPtr, 1, &argPtr
7890: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 7b 0a  );.    }..    {.
78a0: 09 69 6e 74 20 69 6e 64 65 78 43 6f 75 6e 74 20  .int indexCount 
78b0: 3d 20 2d 31 3b 09 09 2f 2a 20 53 69 7a 65 20 6f  = -1;../* Size o
78c0: 66 20 74 68 65 20 61 72 72 61 79 20 6f 66 20 6c  f the array of l
78d0: 69 73 74 20 69 6e 64 69 63 65 73 2e 20 2a 2f 0a  ist indices. */.
78e0: 09 54 63 6c 5f 4f 62 6a 20 2a 2a 69 6e 64 69 63  .Tcl_Obj **indic
78f0: 65 73 20 3d 20 4e 55 4c 4c 3b 20 09 2f 2a 20 41  es = NULL; ./* A
7900: 72 72 61 79 20 6f 66 20 6c 69 73 74 20 69 6e 64  rray of list ind
7910: 69 63 65 73 2e 20 2a 2f 0a 0a 09 54 63 6c 4c 69  ices. */...TclLi
7920: 73 74 4f 62 6a 47 65 74 45 6c 65 6d 65 6e 74 73  stObjGetElements
7930: 28 4e 55 4c 4c 2c 20 69 6e 64 65 78 4c 69 73 74  (NULL, indexList
7940: 43 6f 70 79 2c 20 26 69 6e 64 65 78 43 6f 75 6e  Copy, &indexCoun
7950: 74 2c 20 26 69 6e 64 69 63 65 73 29 3b 0a 09 6c  t, &indices);..l
7960: 69 73 74 50 74 72 20 3d 20 54 63 6c 4c 69 6e 64  istPtr = TclLind
7970: 65 78 46 6c 61 74 28 69 6e 74 65 72 70 2c 20 6c  exFlat(interp, l
7980: 69 73 74 50 74 72 2c 20 69 6e 64 65 78 43 6f 75  istPtr, indexCou
7990: 6e 74 2c 20 69 6e 64 69 63 65 73 29 3b 0a 20 20  nt, indices);.  
79a0: 20 20 7d 0a 20 20 20 20 54 63 6c 5f 44 65 63 72    }.    Tcl_Decr
79b0: 52 65 66 43 6f 75 6e 74 28 69 6e 64 65 78 4c 69  RefCount(indexLi
79c0: 73 74 43 6f 70 79 29 3b 0a 20 20 20 20 72 65 74  stCopy);.    ret
79d0: 75 72 6e 20 6c 69 73 74 50 74 72 3b 0a 7d 0a 0c  urn listPtr;.}..
79e0: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ./*. *----------
79f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7a00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7a10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7a20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a  ------------. *.
7a30: 20 2a 20 20 54 63 6c 4c 69 6e 64 65 78 46 6c 61   *  TclLindexFla
7a40: 74 20 2d 2d 0a 20 2a 0a 20 2a 20 09 54 68 65 20  t --. *. * .The 
7a50: 63 6f 72 65 20 6f 66 20 74 68 65 20 27 6c 69 6e  core of the 'lin
7a60: 64 65 78 27 20 63 6f 6d 6d 61 6e 64 2c 20 77 69  dex' command, wi
7a70: 74 68 20 61 6c 6c 20 69 6e 64 65 78 0a 20 2a 20  th all index. * 
7a80: 09 61 72 67 75 6d 65 6e 74 73 20 70 72 65 73 65  .arguments prese
7a90: 6e 74 65 64 20 61 73 20 61 20 66 6c 61 74 20 6c  nted as a flat l
7aa0: 69 73 74 2e 0a 20 2a 0a 20 2a 20 20 56 61 6c 75  ist.. *. *  Valu
7ab0: 65 0a 20 2a 0a 20 2a 09 41 20 70 6f 69 6e 74 65  e. *. *.A pointe
7ac0: 72 20 74 6f 20 74 68 65 20 6f 62 6a 65 63 74 20  r to the object 
7ad0: 65 78 74 72 61 63 74 65 64 2c 20 77 69 74 68 20  extracted, with 
7ae0: 69 74 73 20 27 72 65 66 43 6f 75 6e 74 27 20 69  its 'refCount' i
7af0: 6e 63 72 65 6d 65 6e 74 65 64 2c 20 20 6f 72 0a  ncremented,  or.
7b00: 20 2a 09 4e 55 4c 4c 20 69 66 20 61 6e 20 65 72   *.NULL if an er
7b10: 72 6f 72 20 6f 63 63 75 72 72 65 64 2e 20 20 54  ror occurred.  T
7b20: 68 75 73 2c 20 74 68 65 20 63 61 6c 6c 69 6e 67  hus, the calling
7b30: 20 63 6f 64 65 20 77 69 6c 6c 20 75 73 75 61 6c   code will usual
7b40: 6c 79 20 64 6f 0a 20 2a 09 73 6f 6d 65 74 68 69  ly do. *.somethi
7b50: 6e 67 20 6c 69 6b 65 3a 0a 20 2a 0a 20 2a 20 09  ng like:. *. * .
7b60: 09 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c  .Tcl_SetObjResul
7b70: 74 28 69 6e 74 65 72 70 2c 20 72 65 73 75 6c 74  t(interp, result
7b80: 29 3b 0a 20 2a 20 09 09 54 63 6c 5f 44 65 63 72  );. * ..Tcl_Decr
7b90: 52 65 66 43 6f 75 6e 74 28 72 65 73 75 6c 74 29  RefCount(result)
7ba0: 3b 0a 20 2a 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  ;. *. *. *------
7bb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7bc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7bd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7be0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7bf0: 0a 20 2a 2f 0a 0a 54 63 6c 5f 4f 62 6a 20 2a 0a  . */..Tcl_Obj *.
7c00: 54 63 6c 4c 69 6e 64 65 78 46 6c 61 74 28 0a 20  TclLindexFlat(. 
7c10: 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69     Tcl_Interp *i
7c20: 6e 74 65 72 70 2c 09 09 2f 2a 20 54 63 6c 20 69  nterp,../* Tcl i
7c30: 6e 74 65 72 70 72 65 74 65 72 2e 20 2a 2f 0a 20  nterpreter. */. 
7c40: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6c 69 73 74     Tcl_Obj *list
7c50: 50 74 72 2c 09 09 2f 2a 20 54 63 6c 20 6f 62 6a  Ptr,../* Tcl obj
7c60: 65 63 74 20 72 65 70 72 65 73 65 6e 74 69 6e 67  ect representing
7c70: 20 74 68 65 20 6c 69 73 74 2e 20 2a 2f 0a 20 20   the list. */.  
7c80: 20 20 69 6e 74 20 69 6e 64 65 78 43 6f 75 6e 74    int indexCount
7c90: 2c 09 09 2f 2a 20 43 6f 75 6e 74 20 6f 66 20 69  ,../* Count of i
7ca0: 6e 64 69 63 65 73 2e 20 2a 2f 0a 20 20 20 20 54  ndices. */.    T
7cb0: 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 69 6e  cl_Obj *const in
7cc0: 64 65 78 41 72 72 61 79 5b 5d 29 2f 2a 20 41 72  dexArray[])/* Ar
7cd0: 72 61 79 20 6f 66 20 70 6f 69 6e 74 65 72 73 20  ray of pointers 
7ce0: 74 6f 20 54 63 6c 20 6f 62 6a 65 63 74 73 20 74  to Tcl objects t
7cf0: 68 61 74 0a 09 09 09 09 20 2a 20 72 65 70 72 65  hat..... * repre
7d00: 73 65 6e 74 20 74 68 65 20 69 6e 64 69 63 65 73  sent the indices
7d10: 20 69 6e 20 74 68 65 20 6c 69 73 74 2e 20 2a 2f   in the list. */
7d20: 0a 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 0a 20  .{.    int i;.. 
7d30: 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f     Tcl_IncrRefCo
7d40: 75 6e 74 28 6c 69 73 74 50 74 72 29 3b 0a 0a 20  unt(listPtr);.. 
7d50: 20 20 20 66 6f 72 20 28 69 3d 30 20 3b 20 69 3c     for (i=0 ; i<
7d60: 69 6e 64 65 78 43 6f 75 6e 74 20 26 26 20 6c 69  indexCount && li
7d70: 73 74 50 74 72 20 3b 20 69 2b 2b 29 20 7b 0a 09  stPtr ; i++) {..
7d80: 69 6e 74 20 69 6e 64 65 78 2c 20 6c 69 73 74 4c  int index, listL
7d90: 65 6e 20 3d 20 30 3b 0a 09 54 63 6c 5f 4f 62 6a  en = 0;..Tcl_Obj
7da0: 20 2a 2a 65 6c 65 6d 50 74 72 73 20 3d 20 4e 55   **elemPtrs = NU
7db0: 4c 4c 2c 20 2a 73 75 62 6c 69 73 74 43 6f 70 79  LL, *sublistCopy
7dc0: 3b 0a 0a 09 2f 2a 0a 09 20 2a 20 48 65 72 65 20  ;.../*.. * Here 
7dd0: 77 65 20 6d 61 6b 65 20 61 20 70 72 69 76 61 74  we make a privat
7de0: 65 20 63 6f 70 79 20 6f 66 20 74 68 65 20 63 75  e copy of the cu
7df0: 72 72 65 6e 74 20 73 75 62 6c 69 73 74 2c 20 73  rrent sublist, s
7e00: 6f 20 77 65 20 61 76 6f 69 64 20 61 6e 79 0a 09  o we avoid any..
7e10: 20 2a 20 73 68 69 6d 6d 65 72 69 6e 67 20 69 73   * shimmering is
7e20: 73 75 65 73 20 74 68 61 74 20 6d 69 67 68 74 20  sues that might 
7e30: 69 6e 76 61 6c 69 64 61 74 65 20 74 68 65 20 65  invalidate the e
7e40: 6c 65 6d 50 74 72 20 61 72 72 61 79 20 62 65 6c  lemPtr array bel
7e50: 6f 77 0a 09 20 2a 20 77 68 69 6c 65 20 77 65 20  ow.. * while we 
7e60: 61 72 65 20 73 74 69 6c 6c 20 75 73 69 6e 67 20  are still using 
7e70: 69 74 2e 20 53 65 65 20 74 65 73 74 20 6c 69 6e  it. See test lin
7e80: 64 65 78 2d 38 2e 34 2e 0a 09 20 2a 2f 0a 0a 09  dex-8.4... */...
7e90: 73 75 62 6c 69 73 74 43 6f 70 79 20 3d 20 54 63  sublistCopy = Tc
7ea0: 6c 4c 69 73 74 4f 62 6a 43 6f 70 79 28 69 6e 74  lListObjCopy(int
7eb0: 65 72 70 2c 20 6c 69 73 74 50 74 72 29 3b 0a 09  erp, listPtr);..
7ec0: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
7ed0: 28 6c 69 73 74 50 74 72 29 3b 0a 09 6c 69 73 74  (listPtr);..list
7ee0: 50 74 72 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 69 66  Ptr = NULL;...if
7ef0: 20 28 73 75 62 6c 69 73 74 43 6f 70 79 20 3d 3d   (sublistCopy ==
7f00: 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 2f 2a   NULL) {..    /*
7f10: 0a 09 20 20 20 20 20 2a 20 54 68 65 20 73 75 62  ..     * The sub
7f20: 6c 69 73 74 20 69 73 20 6e 6f 74 20 61 20 6c 69  list is not a li
7f30: 73 74 20 61 74 20 61 6c 6c 20 3d 3e 20 65 72 72  st at all => err
7f40: 6f 72 2e 0a 09 20 20 20 20 20 2a 2f 0a 0a 09 20  or...     */... 
7f50: 20 20 20 62 72 65 61 6b 3b 0a 09 7d 0a 09 54 63     break;..}..Tc
7f60: 6c 4c 69 73 74 4f 62 6a 47 65 74 45 6c 65 6d 65  lListObjGetEleme
7f70: 6e 74 73 28 4e 55 4c 4c 2c 20 73 75 62 6c 69 73  nts(NULL, sublis
7f80: 74 43 6f 70 79 2c 20 26 6c 69 73 74 4c 65 6e 2c  tCopy, &listLen,
7f90: 20 26 65 6c 65 6d 50 74 72 73 29 3b 0a 0a 09 69   &elemPtrs);...i
7fa0: 66 20 28 54 63 6c 47 65 74 49 6e 74 46 6f 72 49  f (TclGetIntForI
7fb0: 6e 64 65 78 4d 28 69 6e 74 65 72 70 2c 20 69 6e  ndexM(interp, in
7fc0: 64 65 78 41 72 72 61 79 5b 69 5d 2c 20 2f 2a 65  dexArray[i], /*e
7fd0: 6e 64 56 61 6c 75 65 2a 2f 20 6c 69 73 74 4c 65  ndValue*/ listLe
7fe0: 6e 2d 31 2c 0a 09 09 26 69 6e 64 65 78 29 20 3d  n-1,...&index) =
7ff0: 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20 20  = TCL_OK) {..   
8000: 20 69 66 20 28 69 6e 64 65 78 3c 30 20 7c 7c 20   if (index<0 || 
8010: 69 6e 64 65 78 3e 3d 6c 69 73 74 4c 65 6e 29 20  index>=listLen) 
8020: 7b 0a 09 09 2f 2a 0a 09 09 20 2a 20 49 6e 64 65  {.../*... * Inde
8030: 78 20 69 73 20 6f 75 74 20 6f 66 20 72 61 6e 67  x is out of rang
8040: 65 2e 20 42 72 65 61 6b 20 6f 75 74 20 6f 66 20  e. Break out of 
8050: 6c 6f 6f 70 20 77 69 74 68 20 65 6d 70 74 79 20  loop with empty 
8060: 72 65 73 75 6c 74 2e 0a 09 09 20 2a 20 46 69 72  result.... * Fir
8070: 73 74 20 63 68 65 63 6b 20 72 65 6d 61 69 6e 69  st check remaini
8080: 6e 67 20 69 6e 64 69 63 65 73 20 66 6f 72 20 76  ng indices for v
8090: 61 6c 69 64 69 74 79 0a 09 09 20 2a 2f 0a 0a 09  alidity... */...
80a0: 09 77 68 69 6c 65 20 28 2b 2b 69 20 3c 20 69 6e  .while (++i < in
80b0: 64 65 78 43 6f 75 6e 74 29 20 7b 0a 09 09 20 20  dexCount) {...  
80c0: 20 20 69 66 20 28 54 63 6c 47 65 74 49 6e 74 46    if (TclGetIntF
80d0: 6f 72 49 6e 64 65 78 4d 28 69 6e 74 65 72 70 2c  orIndexM(interp,
80e0: 20 69 6e 64 65 78 41 72 72 61 79 5b 69 5d 2c 20   indexArray[i], 
80f0: 2d 31 2c 20 26 69 6e 64 65 78 29 0a 09 09 09 21  -1, &index)....!
8100: 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 09 09 54  = TCL_OK) {....T
8110: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
8120: 73 75 62 6c 69 73 74 43 6f 70 79 29 3b 0a 09 09  sublistCopy);...
8130: 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 09 09  .return NULL;...
8140: 20 20 20 20 7d 0a 09 09 7d 0a 09 09 6c 69 73 74      }...}...list
8150: 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a  Ptr = Tcl_NewObj
8160: 28 29 3b 0a 09 20 20 20 20 7d 20 65 6c 73 65 20  ();..    } else 
8170: 7b 0a 09 09 2f 2a 0a 09 09 20 2a 20 45 78 74 72  {.../*... * Extr
8180: 61 63 74 20 74 68 65 20 70 6f 69 6e 74 65 72 20  act the pointer 
8190: 74 6f 20 74 68 65 20 61 70 70 72 6f 70 72 69 61  to the appropria
81a0: 74 65 20 65 6c 65 6d 65 6e 74 2e 0a 09 09 20 2a  te element.... *
81b0: 2f 0a 0a 09 09 6c 69 73 74 50 74 72 20 3d 20 65  /....listPtr = e
81c0: 6c 65 6d 50 74 72 73 5b 69 6e 64 65 78 5d 3b 0a  lemPtrs[index];.
81d0: 09 20 20 20 20 7d 0a 09 20 20 20 20 54 63 6c 5f  .    }..    Tcl_
81e0: 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 6c 69 73  IncrRefCount(lis
81f0: 74 50 74 72 29 3b 0a 09 7d 0a 09 54 63 6c 5f 44  tPtr);..}..Tcl_D
8200: 65 63 72 52 65 66 43 6f 75 6e 74 28 73 75 62 6c  ecrRefCount(subl
8210: 69 73 74 43 6f 70 79 29 3b 0a 20 20 20 20 7d 0a  istCopy);.    }.
8220: 0a 20 20 20 20 72 65 74 75 72 6e 20 6c 69 73 74  .    return list
8230: 50 74 72 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d  Ptr;.}.../*. *--
8240: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8250: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8260: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8270: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8280: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 63 6c 4c 73  ----. *. * TclLs
8290: 65 74 4c 69 73 74 20 2d 2d 0a 20 2a 0a 20 2a 09  etList --. *. *.
82a0: 54 68 65 20 63 6f 72 65 20 6f 66 20 5b 6c 73 65  The core of [lse
82b0: 74 5d 20 77 68 65 6e 20 6f 62 6a 63 20 3d 3d 20  t] when objc == 
82c0: 34 2e 20 4f 62 6a 76 5b 32 5d 20 6d 61 79 20 62  4. Objv[2] may b
82d0: 65 20 65 69 74 68 65 72 20 61 0a 20 2a 09 73 63  e either a. *.sc
82e0: 61 6c 61 72 20 69 6e 64 65 78 20 6f 72 20 61 20  alar index or a 
82f0: 6c 69 73 74 20 6f 66 20 69 6e 64 69 63 65 73 2e  list of indices.
8300: 0a 20 2a 0a 20 2a 09 49 6d 70 6c 65 6d 65 6e 74  . *. *.Implement
8310: 65 64 20 65 6e 74 69 72 65 6c 79 20 61 73 20 61  ed entirely as a
8320: 20 77 72 61 70 70 65 72 20 61 72 6f 75 6e 64 20   wrapper around 
8330: 27 54 63 6c 4c 69 6e 64 65 78 46 6c 61 74 27 2c  'TclLindexFlat',
8340: 20 61 73 20 64 65 73 63 72 69 62 65 64 0a 20 2a   as described. *
8350: 09 66 6f 72 20 27 54 63 6c 4c 69 6e 64 65 78 4c  .for 'TclLindexL
8360: 69 73 74 27 2e 0a 20 2a 0a 20 2a 20 56 61 6c 75  ist'.. *. * Valu
8370: 65 0a 20 2a 0a 20 2a 09 54 68 65 20 6e 65 77 20  e. *. *.The new 
8380: 6c 69 73 74 2c 20 77 69 74 68 20 74 68 65 20 27  list, with the '
8390: 72 65 66 43 6f 75 6e 74 27 20 6f 66 20 27 76 61  refCount' of 'va
83a0: 6c 75 50 74 72 27 20 69 6e 63 72 65 6d 65 6e 74  luPtr' increment
83b0: 65 64 2c 20 6f 72 20 4e 55 4c 4c 20 69 66 0a 20  ed, or NULL if. 
83c0: 2a 09 74 68 65 72 65 20 77 61 73 20 61 6e 20 65  *.there was an e
83d0: 72 72 6f 72 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d  rror.. *. *-----
83e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
83f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8400: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8410: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8420: 2d 0a 20 2a 2f 0a 0a 54 63 6c 5f 4f 62 6a 20 2a  -. */..Tcl_Obj *
8430: 0a 54 63 6c 4c 73 65 74 4c 69 73 74 28 0a 20 20  .TclLsetList(.  
8440: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e    Tcl_Interp *in
8450: 74 65 72 70 2c 09 09 2f 2a 20 54 63 6c 20 69 6e  terp,../* Tcl in
8460: 74 65 72 70 72 65 74 65 72 2e 20 2a 2f 0a 20 20  terpreter. */.  
8470: 20 20 54 63 6c 5f 4f 62 6a 20 2a 6c 69 73 74 50    Tcl_Obj *listP
8480: 74 72 2c 09 09 2f 2a 20 50 6f 69 6e 74 65 72 20  tr,../* Pointer 
8490: 74 6f 20 74 68 65 20 6c 69 73 74 20 62 65 69 6e  to the list bein
84a0: 67 20 6d 6f 64 69 66 69 65 64 2e 20 2a 2f 0a 20  g modified. */. 
84b0: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 69 6e 64 65     Tcl_Obj *inde
84c0: 78 41 72 67 50 74 72 2c 09 2f 2a 20 49 6e 64 65  xArgPtr,./* Inde
84d0: 78 20 6f 72 20 69 6e 64 65 78 2d 6c 69 73 74 20  x or index-list 
84e0: 61 72 67 20 74 6f 20 27 6c 73 65 74 27 2e 20 2a  arg to 'lset'. *
84f0: 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 76  /.    Tcl_Obj *v
8500: 61 6c 75 65 50 74 72 29 09 09 2f 2a 20 56 61 6c  aluePtr)../* Val
8510: 75 65 20 61 72 67 20 74 6f 20 27 6c 73 65 74 27  ue arg to 'lset'
8520: 2e 20 2a 2f 0a 7b 0a 20 20 20 20 69 6e 74 20 69  . */.{.    int i
8530: 6e 64 65 78 43 6f 75 6e 74 20 3d 20 30 3b 09 09  ndexCount = 0;..
8540: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 69 6e 64  /* Number of ind
8550: 69 63 65 73 20 69 6e 20 74 68 65 20 69 6e 64 65  ices in the inde
8560: 78 20 6c 69 73 74 2e 20 2a 2f 0a 20 20 20 20 54  x list. */.    T
8570: 63 6c 5f 4f 62 6a 20 2a 2a 69 6e 64 69 63 65 73  cl_Obj **indices
8580: 20 3d 20 4e 55 4c 4c 3b 09 2f 2a 20 56 65 63 74   = NULL;./* Vect
8590: 6f 72 20 6f 66 20 69 6e 64 69 63 65 73 20 69 6e  or of indices in
85a0: 20 74 68 65 20 69 6e 64 65 78 20 6c 69 73 74 2e   the index list.
85b0: 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20   */.    Tcl_Obj 
85c0: 2a 72 65 74 56 61 6c 75 65 50 74 72 3b 09 2f 2a  *retValuePtr;./*
85d0: 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   Pointer to the 
85e0: 6c 69 73 74 20 74 6f 20 62 65 20 72 65 74 75 72  list to be retur
85f0: 6e 65 64 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ned. */.    int 
8600: 69 6e 64 65 78 3b 09 09 09 2f 2a 20 43 75 72 72  index;.../* Curr
8610: 65 6e 74 20 69 6e 64 65 78 20 69 6e 20 74 68 65  ent index in the
8620: 20 6c 69 73 74 20 2d 20 64 69 73 63 61 72 64 65   list - discarde
8630: 64 2e 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62  d. */.    Tcl_Ob
8640: 6a 20 2a 69 6e 64 65 78 4c 69 73 74 43 6f 70 79  j *indexListCopy
8650: 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a  ;..    /*.     *
8660: 20 44 65 74 65 72 6d 69 6e 65 20 77 68 65 74 68   Determine wheth
8670: 65 72 20 74 68 65 20 69 6e 64 65 78 20 61 72 67  er the index arg
8680: 20 64 65 73 69 67 6e 61 74 65 73 20 61 20 6c 69   designates a li
8690: 73 74 20 6f 72 20 61 20 73 69 6e 67 6c 65 20 69  st or a single i
86a0: 6e 64 65 78 2e 0a 20 20 20 20 20 2a 20 57 65 20  ndex..     * We 
86b0: 68 61 76 65 20 74 6f 20 62 65 20 63 61 72 65 66  have to be caref
86c0: 75 6c 20 61 62 6f 75 74 20 74 68 65 20 6f 72 64  ul about the ord
86d0: 65 72 20 6f 66 20 74 68 65 20 63 68 65 63 6b 73  er of the checks
86e0: 20 74 6f 20 61 76 6f 69 64 20 72 65 70 65 61 74   to avoid repeat
86f0: 65 64 0a 20 20 20 20 20 2a 20 73 68 69 6d 6d 65  ed.     * shimme
8700: 72 69 6e 67 3b 20 73 65 65 20 54 49 50 20 23 32  ring; see TIP #2
8710: 32 20 61 6e 64 20 23 32 33 20 66 6f 72 20 64 65  2 and #23 for de
8720: 74 61 69 6c 73 2e 0a 20 20 20 20 20 2a 2f 0a 0a  tails..     */..
8730: 20 20 20 20 69 66 20 28 69 6e 64 65 78 41 72 67      if (indexArg
8740: 50 74 72 2d 3e 74 79 70 65 50 74 72 20 21 3d 20  Ptr->typePtr != 
8750: 26 74 63 6c 4c 69 73 74 54 79 70 65 0a 09 20 20  &tclListType..  
8760: 20 20 26 26 20 54 63 6c 47 65 74 49 6e 74 46 6f    && TclGetIntFo
8770: 72 49 6e 64 65 78 4d 28 4e 55 4c 4c 2c 20 69 6e  rIndexM(NULL, in
8780: 64 65 78 41 72 67 50 74 72 2c 20 30 2c 20 26 69  dexArgPtr, 0, &i
8790: 6e 64 65 78 29 20 3d 3d 20 54 43 4c 5f 4f 4b 29  ndex) == TCL_OK)
87a0: 20 7b 0a 09 2f 2a 0a 09 20 2a 20 69 6e 64 65 78   {../*.. * index
87b0: 41 72 67 50 74 72 20 64 65 73 69 67 6e 61 74 65  ArgPtr designate
87c0: 73 20 61 20 73 69 6e 67 6c 65 20 69 6e 64 65 78  s a single index
87d0: 2e 0a 09 20 2a 2f 0a 0a 09 72 65 74 75 72 6e 20  ... */...return 
87e0: 54 63 6c 4c 73 65 74 46 6c 61 74 28 69 6e 74 65  TclLsetFlat(inte
87f0: 72 70 2c 20 6c 69 73 74 50 74 72 2c 20 31 2c 20  rp, listPtr, 1, 
8800: 26 69 6e 64 65 78 41 72 67 50 74 72 2c 20 76 61  &indexArgPtr, va
8810: 6c 75 65 50 74 72 29 3b 0a 0a 20 20 20 20 7d 0a  luePtr);..    }.
8820: 0a 20 20 20 20 69 6e 64 65 78 4c 69 73 74 43 6f  .    indexListCo
8830: 70 79 20 3d 20 54 63 6c 4c 69 73 74 4f 62 6a 43  py = TclListObjC
8840: 6f 70 79 28 4e 55 4c 4c 2c 20 69 6e 64 65 78 41  opy(NULL, indexA
8850: 72 67 50 74 72 29 3b 0a 20 20 20 20 69 66 20 28  rgPtr);.    if (
8860: 69 6e 64 65 78 4c 69 73 74 43 6f 70 79 20 3d 3d  indexListCopy ==
8870: 20 4e 55 4c 4c 29 20 7b 0a 09 2f 2a 0a 09 20 2a   NULL) {../*.. *
8880: 20 69 6e 64 65 78 41 72 67 50 74 72 20 64 65 73   indexArgPtr des
8890: 69 67 6e 61 74 65 73 20 73 6f 6d 65 74 68 69 6e  ignates somethin
88a0: 67 20 74 68 61 74 20 69 73 20 6e 65 69 74 68 65  g that is neithe
88b0: 72 20 61 6e 20 69 6e 64 65 78 20 6e 6f 72 20 61  r an index nor a
88c0: 0a 09 20 2a 20 77 65 6c 6c 20 66 6f 72 6d 65 64  .. * well formed
88d0: 20 6c 69 73 74 2e 20 52 65 70 6f 72 74 20 74 68   list. Report th
88e0: 65 20 65 72 72 6f 72 20 76 69 61 20 54 63 6c 4c  e error via TclL
88f0: 73 65 74 46 6c 61 74 2e 0a 09 20 2a 2f 0a 0a 09  setFlat... */...
8900: 72 65 74 75 72 6e 20 54 63 6c 4c 73 65 74 46 6c  return TclLsetFl
8910: 61 74 28 69 6e 74 65 72 70 2c 20 6c 69 73 74 50  at(interp, listP
8920: 74 72 2c 20 31 2c 20 26 69 6e 64 65 78 41 72 67  tr, 1, &indexArg
8930: 50 74 72 2c 20 76 61 6c 75 65 50 74 72 29 3b 0a  Ptr, valuePtr);.
8940: 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 4c 69 73      }.    TclLis
8950: 74 4f 62 6a 47 65 74 45 6c 65 6d 65 6e 74 73 28  tObjGetElements(
8960: 4e 55 4c 4c 2c 20 69 6e 64 65 78 41 72 67 50 74  NULL, indexArgPt
8970: 72 2c 20 26 69 6e 64 65 78 43 6f 75 6e 74 2c 20  r, &indexCount, 
8980: 26 69 6e 64 69 63 65 73 29 3b 0a 0a 20 20 20 20  &indices);..    
8990: 2f 2a 0a 20 20 20 20 20 2a 20 4c 65 74 20 54 63  /*.     * Let Tc
89a0: 6c 4c 73 65 74 46 6c 61 74 20 68 61 6e 64 6c 65  lLsetFlat handle
89b0: 20 74 68 65 20 61 63 74 75 61 6c 20 6c 73 65 74   the actual lset
89c0: 27 74 69 6e 67 2e 0a 20 20 20 20 20 2a 2f 0a 0a  'ting..     */..
89d0: 20 20 20 20 72 65 74 56 61 6c 75 65 50 74 72 20      retValuePtr 
89e0: 3d 20 54 63 6c 4c 73 65 74 46 6c 61 74 28 69 6e  = TclLsetFlat(in
89f0: 74 65 72 70 2c 20 6c 69 73 74 50 74 72 2c 20 69  terp, listPtr, i
8a00: 6e 64 65 78 43 6f 75 6e 74 2c 20 69 6e 64 69 63  ndexCount, indic
8a10: 65 73 2c 20 76 61 6c 75 65 50 74 72 29 3b 0a 0a  es, valuePtr);..
8a20: 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43      Tcl_DecrRefC
8a30: 6f 75 6e 74 28 69 6e 64 65 78 4c 69 73 74 43 6f  ount(indexListCo
8a40: 70 79 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  py);.    return 
8a50: 72 65 74 56 61 6c 75 65 50 74 72 3b 0a 7d 0a 0c  retValuePtr;.}..
8a60: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ./*. *----------
8a70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8a80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8a90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8aa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a  ------------. *.
8ab0: 20 2a 20 54 63 6c 4c 73 65 74 46 6c 61 74 20 2d   * TclLsetFlat -
8ac0: 2d 0a 20 2a 0a 20 2a 09 43 6f 72 65 20 65 6e 67  -. *. *.Core eng
8ad0: 69 6e 65 20 6f 66 20 74 68 65 20 27 6c 73 65 74  ine of the 'lset
8ae0: 27 20 63 6f 6d 6d 61 6e 64 2e 0a 20 2a 0a 20 2a  ' command.. *. *
8af0: 20 56 61 6c 75 65 0a 20 2a 0a 20 2a 09 54 68 65   Value. *. *.The
8b00: 20 72 65 73 75 6c 74 69 6e 67 20 6c 69 73 74 0a   resulting list.
8b10: 20 2a 0a 20 2a 09 20 20 20 20 54 68 65 20 27 72   *. *.    The 'r
8b20: 65 66 43 6f 75 6e 74 27 20 6f 66 20 27 76 61 6c  efCount' of 'val
8b30: 75 65 50 74 72 27 20 69 73 20 69 6e 63 72 65 6d  uePtr' is increm
8b40: 65 6e 74 65 64 2e 20 20 49 66 20 27 6c 69 73 74  ented.  If 'list
8b50: 50 74 72 27 20 77 61 73 20 6e 6f 74 0a 20 2a 09  Ptr' was not. *.
8b60: 20 20 20 20 64 75 70 6c 69 63 61 74 65 64 2c 20      duplicated, 
8b70: 69 74 73 20 27 72 65 66 43 6f 75 6e 74 27 20 69  its 'refCount' i
8b80: 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 2e 20 20  s incremented.  
8b90: 54 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f  The reference co
8ba0: 75 6e 74 20 6f 66 0a 20 2a 09 20 20 20 20 61 6e  unt of. *.    an
8bb0: 20 75 6e 64 75 70 6c 69 63 61 74 65 64 20 6f 62   unduplicated ob
8bc0: 6a 65 63 74 20 69 73 20 74 68 65 72 65 66 6f 72  ject is therefor
8bd0: 65 20 32 20 28 6f 6e 65 20 66 6f 72 20 74 68 65  e 2 (one for the
8be0: 20 72 65 74 75 72 6e 65 64 20 70 6f 69 6e 74 65   returned pointe
8bf0: 72 0a 20 2a 09 20 20 20 20 61 6e 64 20 6f 6e 65  r. *.    and one
8c00: 20 66 6f 72 20 74 68 65 20 76 61 72 69 61 62 6c   for the variabl
8c10: 65 20 74 68 61 74 20 68 6f 6c 64 73 20 69 74 29  e that holds it)
8c20: 2e 20 20 54 68 65 20 72 65 66 65 72 65 6e 63 65  .  The reference
8c30: 20 63 6f 75 6e 74 20 6f 66 20 61 0a 20 2a 09 20   count of a. *. 
8c40: 20 20 20 64 75 70 6c 69 63 61 74 65 20 6f 62 6a     duplicate obj
8c50: 65 63 74 20 69 73 20 31 2c 20 72 65 66 6c 65 63  ect is 1, reflec
8c60: 74 69 6e 67 20 74 68 61 74 20 72 65 73 75 6c 74  ting that result
8c70: 20 69 73 20 74 68 65 20 6f 6e 6c 79 20 61 63 74   is the only act
8c80: 69 76 65 0a 20 2a 09 20 20 20 20 72 65 66 65 72  ive. *.    refer
8c90: 65 6e 63 65 2e 20 54 68 65 20 63 61 6c 6c 65 72  ence. The caller
8ca0: 20 69 73 20 65 78 70 65 63 74 65 64 20 74 6f 20   is expected to 
8cb0: 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74  store the result
8cc0: 20 69 6e 20 74 68 65 0a 20 2a 09 20 20 20 20 76   in the. *.    v
8cd0: 61 72 69 61 62 6c 65 20 61 6e 64 20 64 65 63 72  ariable and decr
8ce0: 65 6d 65 6e 74 20 69 74 73 20 72 65 66 65 72 65  ement its refere
8cf0: 6e 63 65 20 63 6f 75 6e 74 2e 20 28 49 4e 53 54  nce count. (INST
8d00: 5f 53 54 4f 52 45 5f 2a 20 64 6f 65 73 0a 20 2a  _STORE_* does. *
8d10: 09 20 20 20 20 65 78 61 63 74 6c 79 20 74 68 69  .    exactly thi
8d20: 73 2e 29 0a 20 2a 20 0a 20 2a 09 4e 55 4c 4c 0a  s.). * . *.NULL.
8d30: 20 2a 09 0a 20 2a 09 20 20 20 20 41 6e 20 65 72   *.. *.    An er
8d40: 72 6f 72 20 6f 63 63 75 72 72 65 64 2e 20 20 49  ror occurred.  I
8d50: 66 20 27 6c 69 73 74 50 74 72 27 20 77 61 73 20  f 'listPtr' was 
8d60: 64 75 70 6c 69 63 61 74 65 64 2c 20 74 68 65 20  duplicated, the 
8d70: 72 65 66 65 72 65 6e 63 65 0a 20 2a 09 20 20 20  reference. *.   
8d80: 20 63 6f 75 6e 74 20 6f 6e 20 74 68 65 20 64 75   count on the du
8d90: 70 6c 69 63 61 74 65 20 69 73 20 64 65 63 72 65  plicate is decre
8da0: 6d 65 6e 74 65 64 20 73 6f 20 74 68 61 74 20 69  mented so that i
8db0: 74 20 69 73 20 30 2c 20 63 61 75 73 69 6e 67 20  t is 0, causing 
8dc0: 61 6e 79 0a 20 2a 09 20 20 20 20 6d 65 6d 6f 72  any. *.    memor
8dd0: 79 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 74  y allocated by t
8de0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 74 6f 20  his function to 
8df0: 62 65 20 66 72 65 65 64 2e 0a 20 2a 0a 20 2a 0a  be freed.. *. *.
8e00: 20 2a 20 45 66 66 65 63 74 0a 20 2a 0a 20 2a 09   * Effect. *. *.
8e10: 4f 6e 20 65 6e 74 72 79 2c 20 74 68 65 20 72 65  On entry, the re
8e20: 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 6f 66  ference count of
8e30: 20 27 6c 69 73 74 50 74 72 27 20 64 6f 65 73 20   'listPtr' does 
8e40: 6e 6f 74 20 72 65 66 6c 65 63 74 20 61 6e 79 0a  not reflect any.
8e50: 20 2a 09 72 65 66 65 72 65 6e 63 65 73 20 68 65   *.references he
8e60: 6c 64 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e  ld on the stack.
8e70: 20 54 68 65 20 66 69 72 73 74 20 61 63 74 69 6f   The first actio
8e80: 6e 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69  n of this functi
8e90: 6f 6e 20 69 73 20 74 6f 0a 20 2a 09 64 65 74 65  on is to. *.dete
8ea0: 72 6d 69 6e 65 20 77 68 65 74 68 65 72 20 27 6c  rmine whether 'l
8eb0: 69 73 74 50 74 72 27 20 69 73 20 73 68 61 72 65  istPtr' is share
8ec0: 64 20 61 6e 64 20 74 6f 20 63 72 65 61 74 65 20  d and to create 
8ed0: 61 20 64 75 70 6c 69 63 61 74 65 0a 20 2a 09 75  a duplicate. *.u
8ee0: 6e 73 68 61 72 65 64 20 63 6f 70 79 20 69 66 20  nshared copy if 
8ef0: 69 74 20 69 73 2e 20 20 54 68 65 20 72 65 66 65  it is.  The refe
8f00: 72 65 6e 63 65 20 63 6f 75 6e 74 20 6f 66 20 74  rence count of t
8f10: 68 65 20 64 75 70 6c 69 63 61 74 65 20 69 73 0a  he duplicate is.
8f20: 20 2a 09 69 6e 63 72 65 6d 65 6e 74 65 64 2e 20   *.incremented. 
8f30: 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 74  At this point, t
8f40: 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75  he reference cou
8f50: 6e 74 20 69 73 20 31 20 69 6e 20 65 69 74 68 65  nt is 1 in eithe
8f60: 72 20 63 61 73 65 20 73 6f 0a 20 2a 09 74 68 61  r case so. *.tha
8f70: 74 20 74 68 65 20 6f 62 6a 65 63 74 20 69 73 20  t the object is 
8f80: 63 6f 6e 73 69 64 65 72 65 64 20 75 6e 73 68 61  considered unsha
8f90: 72 65 64 2e 0a 20 2a 0a 20 2a 09 54 68 65 20 75  red.. *. *.The u
8fa0: 6e 73 68 61 72 65 64 20 6c 69 73 74 20 69 73 20  nshared list is 
8fb0: 61 6c 74 65 72 65 64 20 64 69 72 65 63 74 6c 79  altered directly
8fc0: 20 74 6f 20 70 72 6f 64 75 63 65 20 74 68 65 20   to produce the 
8fd0: 72 65 73 75 6c 74 2e 0a 20 2a 09 27 54 63 6c 4c  result.. *.'TclL
8fe0: 73 65 74 46 6c 61 74 27 20 6d 61 69 6e 74 61 69  setFlat' maintai
8ff0: 6e 73 20 61 20 6c 69 6e 6b 65 64 20 6c 69 73 74  ns a linked list
9000: 20 6f 66 20 27 54 63 6c 5f 4f 62 6a 27 20 76 61   of 'Tcl_Obj' va
9010: 6c 75 65 73 20 77 68 6f 73 65 20 73 74 72 69 6e  lues whose strin
9020: 67 0a 20 2a 09 72 65 70 72 65 73 65 6e 74 61 74  g. *.representat
9030: 69 6f 6e 73 20 6d 75 73 74 20 62 65 20 73 70 6f  ions must be spo
9040: 69 6c 74 20 62 79 20 74 68 72 65 61 64 69 6e 67  ilt by threading
9050: 20 76 69 61 20 27 70 74 72 32 27 20 6f 66 20 74   via 'ptr2' of t
9060: 68 65 0a 20 2a 09 74 77 6f 2d 70 6f 69 6e 74 65  he. *.two-pointe
9070: 72 20 69 6e 74 65 72 6e 61 6c 20 72 65 70 72 65  r internal repre
9080: 73 65 6e 74 61 74 69 6f 6e 2e 20 4f 6e 20 65 6e  sentation. On en
9090: 74 72 79 20 74 6f 20 27 54 63 6c 4c 73 65 74 46  try to 'TclLsetF
90a0: 6c 61 74 27 2c 20 74 68 65 0a 20 2a 09 76 61 6c  lat', the. *.val
90b0: 75 65 73 20 6f 66 20 27 70 74 72 32 27 20 61 72  ues of 'ptr2' ar
90c0: 65 20 69 6d 6d 61 74 65 72 69 61 6c 3b 20 6f 6e  e immaterial; on
90d0: 20 65 78 69 74 2c 20 74 68 65 20 27 70 74 72 32   exit, the 'ptr2
90e0: 27 20 66 69 65 6c 64 20 6f 66 20 61 6e 79 0a 20  ' field of any. 
90f0: 2a 09 54 63 6c 5f 4f 62 6a 20 74 68 61 74 20 68  *.Tcl_Obj that h
9100: 61 73 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64  as been modified
9110: 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e   is set to NULL.
9120: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *. *----------
9130: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9140: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9150: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9160: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f  ------------. */
9170: 0a 0a 54 63 6c 5f 4f 62 6a 20 2a 0a 54 63 6c 4c  ..Tcl_Obj *.TclL
9180: 73 65 74 46 6c 61 74 28 0a 20 20 20 20 54 63 6c  setFlat(.    Tcl
9190: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
91a0: 09 09 2f 2a 20 54 63 6c 20 69 6e 74 65 72 70 72  ../* Tcl interpr
91b0: 65 74 65 72 2e 20 2a 2f 0a 20 20 20 20 54 63 6c  eter. */.    Tcl
91c0: 5f 4f 62 6a 20 2a 6c 69 73 74 50 74 72 2c 09 09  _Obj *listPtr,..
91d0: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 74 68  /* Pointer to th
91e0: 65 20 6c 69 73 74 20 62 65 69 6e 67 20 6d 6f 64  e list being mod
91f0: 69 66 69 65 64 2e 20 2a 2f 0a 20 20 20 20 69 6e  ified. */.    in
9200: 74 20 69 6e 64 65 78 43 6f 75 6e 74 2c 09 09 2f  t indexCount,../
9210: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 69 6e 64 65  * Number of inde
9220: 78 20 61 72 67 73 2e 20 2a 2f 0a 20 20 20 20 54  x args. */.    T
9230: 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 69 6e  cl_Obj *const in
9240: 64 65 78 41 72 72 61 79 5b 5d 2c 0a 09 09 09 09  dexArray[],.....
9250: 2f 2a 20 49 6e 64 65 78 20 61 72 67 73 2e 20 2a  /* Index args. *
9260: 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 76  /.    Tcl_Obj *v
9270: 61 6c 75 65 50 74 72 29 09 09 2f 2a 20 56 61 6c  aluePtr)../* Val
9280: 75 65 20 61 72 67 20 74 6f 20 27 6c 73 65 74 27  ue arg to 'lset'
9290: 2e 20 2a 2f 0a 7b 0a 20 20 20 20 69 6e 74 20 69  . */.{.    int i
92a0: 6e 64 65 78 2c 20 72 65 73 75 6c 74 2c 20 6c 65  ndex, result, le
92b0: 6e 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a  n;.    Tcl_Obj *
92c0: 73 75 62 4c 69 73 74 50 74 72 2c 20 2a 72 65 74  subListPtr, *ret
92d0: 56 61 6c 75 65 50 74 72 2c 20 2a 63 68 61 69 6e  ValuePtr, *chain
92e0: 50 74 72 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20  Ptr;..    /*.   
92f0: 20 20 2a 20 49 66 20 74 68 65 72 65 20 61 72 65    * If there are
9300: 20 6e 6f 20 69 6e 64 69 63 65 73 2c 20 73 69 6d   no indices, sim
9310: 70 6c 79 20 72 65 74 75 72 6e 20 74 68 65 20 6e  ply return the n
9320: 65 77 20 76 61 6c 75 65 2e 20 20 28 57 69 74 68  ew value.  (With
9330: 6f 75 74 0a 20 20 20 20 20 2a 20 69 6e 64 69 63  out.     * indic
9340: 65 73 2c 20 5b 6c 73 65 74 5d 20 69 73 20 61 20  es, [lset] is a 
9350: 73 79 6e 6f 6e 79 6d 20 66 6f 72 20 5b 73 65 74  synonym for [set
9360: 5d 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20  ]..     */..    
9370: 69 66 20 28 69 6e 64 65 78 43 6f 75 6e 74 20 3d  if (indexCount =
9380: 3d 20 30 29 20 7b 0a 09 54 63 6c 5f 49 6e 63 72  = 0) {..Tcl_Incr
9390: 52 65 66 43 6f 75 6e 74 28 76 61 6c 75 65 50 74  RefCount(valuePt
93a0: 72 29 3b 0a 09 72 65 74 75 72 6e 20 76 61 6c 75  r);..return valu
93b0: 65 50 74 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  ePtr;.    }..   
93c0: 20 2f 2a 0a 20 20 20 20 20 2a 20 49 66 20 74 68   /*.     * If th
93d0: 65 20 6c 69 73 74 20 69 73 20 73 68 61 72 65 64  e list is shared
93e0: 2c 20 6d 61 6b 65 20 61 20 63 6f 70 79 20 77 65  , make a copy we
93f0: 20 63 61 6e 20 6d 6f 64 69 66 79 20 28 63 6f 70   can modify (cop
9400: 79 2d 6f 6e 2d 77 72 69 74 65 29 2e 20 20 57 65  y-on-write).  We
9410: 0a 20 20 20 20 20 2a 20 75 73 65 20 54 63 6c 5f  .     * use Tcl_
9420: 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 29 20 69  DuplicateObj() i
9430: 6e 73 74 65 61 64 20 6f 66 20 54 63 6c 4c 69 73  nstead of TclLis
9440: 74 4f 62 6a 43 6f 70 79 28 29 20 66 6f 72 20 61  tObjCopy() for a
9450: 20 66 65 77 20 72 65 61 73 6f 6e 73 3a 0a 20 20   few reasons:.  
9460: 20 20 20 2a 20 31 29 20 77 65 20 68 61 76 65 20     * 1) we have 
9470: 6e 6f 74 20 79 65 74 20 63 6f 6e 66 69 72 6d 65  not yet confirme
9480: 64 20 6c 69 73 74 50 74 72 20 69 73 20 61 63 74  d listPtr is act
9490: 75 61 6c 6c 79 20 61 20 6c 69 73 74 3b 20 32 29  ually a list; 2)
94a0: 20 57 65 20 6d 61 6b 65 20 61 0a 20 20 20 20 20   We make a.     
94b0: 2a 20 76 65 72 62 61 74 69 6d 20 63 6f 70 79 20  * verbatim copy 
94c0: 6f 66 20 61 6e 79 20 65 78 69 73 74 69 6e 67 20  of any existing 
94d0: 73 74 72 69 6e 67 20 72 65 70 2c 20 61 6e 64 20  string rep, and 
94e0: 77 68 65 6e 20 77 65 20 63 6f 6d 62 69 6e 65 20  when we combine 
94f0: 74 68 61 74 20 77 69 74 68 0a 20 20 20 20 20 2a  that with.     *
9500: 20 74 68 65 20 64 65 6c 61 79 65 64 20 69 6e 76   the delayed inv
9510: 61 6c 69 64 61 74 69 6f 6e 20 6f 66 20 73 74 72  alidation of str
9520: 69 6e 67 20 72 65 70 73 20 6f 66 20 6d 6f 64 69  ing reps of modi
9530: 66 69 65 64 20 54 63 6c 5f 4f 62 6a 27 73 0a 20  fied Tcl_Obj's. 
9540: 20 20 20 20 2a 20 69 6d 70 6c 65 6d 65 6e 74 65      * implemente
9550: 64 20 62 65 6c 6f 77 2c 20 74 68 65 20 6f 75 74  d below, the out
9560: 63 6f 6d 65 20 69 73 20 74 68 61 74 20 61 6e 79  come is that any
9570: 20 65 72 72 6f 72 20 63 6f 6e 64 69 74 69 6f 6e   error condition
9580: 20 74 68 61 74 20 63 61 75 73 65 73 0a 20 20 20   that causes.   
9590: 20 20 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65    * this routine
95a0: 20 74 6f 20 72 65 74 75 72 6e 20 4e 55 4c 4c 2c   to return NULL,
95b0: 20 77 69 6c 6c 20 6c 65 61 76 65 20 74 68 65 20   will leave the 
95c0: 73 74 72 69 6e 67 20 72 65 70 20 6f 66 20 6c 69  string rep of li
95d0: 73 74 50 74 72 20 61 6e 64 0a 20 20 20 20 20 2a  stPtr and.     *
95e0: 20 61 6c 6c 20 65 6c 65 6d 65 6e 74 73 20 74 6f   all elements to
95f0: 20 62 65 20 75 6e 63 68 61 6e 67 65 64 2e 0a 20   be unchanged.. 
9600: 20 20 20 20 2a 2f 0a 0a 20 20 20 20 73 75 62 4c      */..    subL
9610: 69 73 74 50 74 72 20 3d 20 54 63 6c 5f 49 73 53  istPtr = Tcl_IsS
9620: 68 61 72 65 64 28 6c 69 73 74 50 74 72 29 20 3f  hared(listPtr) ?
9630: 20 54 63 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62   Tcl_DuplicateOb
9640: 6a 28 6c 69 73 74 50 74 72 29 20 3a 20 6c 69 73  j(listPtr) : lis
9650: 74 50 74 72 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20  tPtr;..    /*.  
9660: 20 20 20 2a 20 41 6e 63 68 6f 72 20 74 68 65 20     * Anchor the 
9670: 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 54  linked list of T
9680: 63 6c 5f 4f 62 6a 27 73 20 77 68 6f 73 65 20 73  cl_Obj's whose s
9690: 74 72 69 6e 67 20 72 65 70 73 20 6d 75 73 74 20  tring reps must 
96a0: 62 65 0a 20 20 20 20 20 2a 20 69 6e 76 61 6c 69  be.     * invali
96b0: 64 61 74 65 64 20 69 66 20 74 68 65 20 6f 70 65  dated if the ope
96c0: 72 61 74 69 6f 6e 20 73 75 63 63 65 65 64 73 2e  ration succeeds.
96d0: 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 72 65  .     */..    re
96e0: 74 56 61 6c 75 65 50 74 72 20 3d 20 73 75 62 4c  tValuePtr = subL
96f0: 69 73 74 50 74 72 3b 0a 20 20 20 20 63 68 61 69  istPtr;.    chai
9700: 6e 50 74 72 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20  nPtr = NULL;.   
9710: 20 72 65 73 75 6c 74 20 3d 20 54 43 4c 5f 4f 4b   result = TCL_OK
9720: 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a  ;..    /*.     *
9730: 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 61 6c   Loop through al
9740: 6c 20 74 68 65 20 69 6e 64 65 78 20 61 72 67 75  l the index argu
9750: 6d 65 6e 74 73 2c 20 61 6e 64 20 66 6f 72 20 65  ments, and for e
9760: 61 63 68 20 6f 6e 65 20 64 69 76 65 20 69 6e 74  ach one dive int
9770: 6f 20 74 68 65 0a 20 20 20 20 20 2a 20 61 70 70  o the.     * app
9780: 72 6f 70 72 69 61 74 65 20 73 75 62 6c 69 73 74  ropriate sublist
9790: 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 64  ..     */..    d
97a0: 6f 20 7b 0a 09 69 6e 74 20 65 6c 65 6d 43 6f 75  o {..int elemCou
97b0: 6e 74 3b 0a 09 54 63 6c 5f 4f 62 6a 20 2a 70 61  nt;..Tcl_Obj *pa
97c0: 72 65 6e 74 4c 69 73 74 2c 20 2a 2a 65 6c 65 6d  rentList, **elem
97d0: 50 74 72 73 3b 0a 0a 09 2f 2a 0a 09 20 2a 20 43  Ptrs;.../*.. * C
97e0: 68 65 63 6b 20 66 6f 72 20 74 68 65 20 70 6f 73  heck for the pos
97f0: 73 69 62 6c 65 20 65 72 72 6f 72 20 63 6f 6e 64  sible error cond
9800: 69 74 69 6f 6e 73 2e 2e 2e 0a 09 20 2a 2f 0a 0a  itions..... */..
9810: 09 69 66 20 28 54 63 6c 4c 69 73 74 4f 62 6a 47  .if (TclListObjG
9820: 65 74 45 6c 65 6d 65 6e 74 73 28 69 6e 74 65 72  etElements(inter
9830: 70 2c 20 73 75 62 4c 69 73 74 50 74 72 2c 20 26  p, subListPtr, &
9840: 65 6c 65 6d 43 6f 75 6e 74 2c 20 26 65 6c 65 6d  elemCount, &elem
9850: 50 74 72 73 29 0a 09 09 21 3d 20 54 43 4c 5f 4f  Ptrs)...!= TCL_O
9860: 4b 29 20 7b 0a 09 20 20 20 20 2f 2a 20 2e 2e 2e  K) {..    /* ...
9870: 74 68 65 20 73 75 62 6c 69 73 74 20 77 65 27 72  the sublist we'r
9880: 65 20 69 6e 64 65 78 69 6e 67 20 69 6e 74 6f 20  e indexing into 
9890: 69 73 6e 27 74 20 61 20 6c 69 73 74 20 61 74 20  isn't a list at 
98a0: 61 6c 6c 2e 20 2a 2f 0a 09 20 20 20 20 72 65 73  all. */..    res
98b0: 75 6c 74 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b  ult = TCL_ERROR;
98c0: 0a 09 20 20 20 20 62 72 65 61 6b 3b 0a 09 7d 0a  ..    break;..}.
98d0: 0a 09 2f 2a 0a 09 20 2a 20 57 41 52 4e 49 4e 47  ../*.. * WARNING
98e0: 3a 20 74 68 65 20 6d 61 63 72 6f 20 54 63 6c 47  : the macro TclG
98f0: 65 74 49 6e 74 46 6f 72 49 6e 64 65 78 4d 20 69  etIntForIndexM i
9900: 73 20 6e 6f 74 20 73 61 66 65 20 66 6f 72 0a 09  s not safe for..
9910: 20 2a 20 70 6f 73 74 2d 69 6e 63 72 65 6d 65 6e   * post-incremen
9920: 74 73 2c 20 61 76 6f 69 64 20 27 2a 69 6e 64 65  ts, avoid '*inde
9930: 78 41 72 72 61 79 2b 2b 27 20 68 65 72 65 2e 0a  xArray++' here..
9940: 09 20 2a 2f 0a 0a 09 69 66 20 28 54 63 6c 47 65  . */...if (TclGe
9950: 74 49 6e 74 46 6f 72 49 6e 64 65 78 4d 28 69 6e  tIntForIndexM(in
9960: 74 65 72 70 2c 20 2a 69 6e 64 65 78 41 72 72 61  terp, *indexArra
9970: 79 2c 20 65 6c 65 6d 43 6f 75 6e 74 20 2d 20 31  y, elemCount - 1
9980: 2c 20 26 69 6e 64 65 78 29 0a 09 09 21 3d 20 54  , &index)...!= T
9990: 43 4c 5f 4f 4b 29 20 20 7b 0a 09 20 20 20 20 2f  CL_OK)  {..    /
99a0: 2a 20 2e 2e 2e 74 68 65 20 69 6e 64 65 78 20 77  * ...the index w
99b0: 65 27 72 65 20 74 72 79 69 6e 67 20 74 6f 20 75  e're trying to u
99c0: 73 65 20 69 73 6e 27 74 20 61 6e 20 69 6e 64 65  se isn't an inde
99d0: 78 20 61 74 20 61 6c 6c 2e 20 2a 2f 0a 09 20 20  x at all. */..  
99e0: 20 20 72 65 73 75 6c 74 20 3d 20 54 43 4c 5f 45    result = TCL_E
99f0: 52 52 4f 52 3b 0a 09 20 20 20 20 69 6e 64 65 78  RROR;..    index
9a00: 41 72 72 61 79 2b 2b 3b 0a 09 20 20 20 20 62 72  Array++;..    br
9a10: 65 61 6b 3b 0a 09 7d 0a 09 69 6e 64 65 78 41 72  eak;..}..indexAr
9a20: 72 61 79 2b 2b 3b 0a 0a 09 69 66 20 28 69 6e 64  ray++;...if (ind
9a30: 65 78 20 3c 20 30 20 7c 7c 20 69 6e 64 65 78 20  ex < 0 || index 
9a40: 3e 20 65 6c 65 6d 43 6f 75 6e 74 29 20 7b 0a 09  > elemCount) {..
9a50: 20 20 20 20 2f 2a 20 2e 2e 2e 74 68 65 20 69 6e      /* ...the in
9a60: 64 65 78 20 70 6f 69 6e 74 73 20 6f 75 74 73 69  dex points outsi
9a70: 64 65 20 74 68 65 20 73 75 62 6c 69 73 74 2e 20  de the sublist. 
9a80: 2a 2f 0a 09 20 20 20 20 69 66 20 28 69 6e 74 65  */..    if (inte
9a90: 72 70 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09  rp != NULL) {...
9aa0: 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
9ab0: 28 69 6e 74 65 72 70 2c 0a 09 09 09 54 63 6c 5f  (interp,....Tcl_
9ac0: 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 22 6c 69  NewStringObj("li
9ad0: 73 74 20 69 6e 64 65 78 20 6f 75 74 20 6f 66 20  st index out of 
9ae0: 72 61 6e 67 65 22 2c 20 2d 31 29 29 3b 0a 09 09  range", -1));...
9af0: 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65  Tcl_SetErrorCode
9b00: 28 69 6e 74 65 72 70 2c 20 22 54 43 4c 22 2c 20  (interp, "TCL", 
9b10: 22 4f 50 45 52 41 54 49 4f 4e 22 2c 20 22 4c 53  "OPERATION", "LS
9b20: 45 54 22 2c 0a 09 09 09 22 42 41 44 49 4e 44 45  ET",...."BADINDE
9b30: 58 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20  X", NULL);..    
9b40: 7d 0a 09 20 20 20 20 72 65 73 75 6c 74 20 3d 20  }..    result = 
9b50: 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 20 20  TCL_ERROR;..    
9b60: 62 72 65 61 6b 3b 0a 09 7d 0a 0a 09 2f 2a 0a 09  break;..}.../*..
9b70: 20 2a 20 4e 6f 20 65 72 72 6f 72 20 63 6f 6e 64   * No error cond
9b80: 69 74 69 6f 6e 73 2e 20 20 41 73 20 6c 6f 6e 67  itions.  As long
9b90: 20 61 73 20 77 65 27 72 65 20 6e 6f 74 20 79 65   as we're not ye
9ba0: 74 20 6f 6e 20 74 68 65 20 6c 61 73 74 20 69 6e  t on the last in
9bb0: 64 65 78 2c 0a 09 20 2a 20 64 65 74 65 72 6d 69  dex,.. * determi
9bc0: 6e 65 20 74 68 65 20 6e 65 78 74 20 73 75 62 6c  ne the next subl
9bd0: 69 73 74 20 66 6f 72 20 74 68 65 20 6e 65 78 74  ist for the next
9be0: 20 70 61 73 73 20 74 68 72 6f 75 67 68 20 74 68   pass through th
9bf0: 65 20 6c 6f 6f 70 2c 20 61 6e 64 0a 09 20 2a 20  e loop, and.. * 
9c00: 74 61 6b 65 20 73 74 65 70 73 20 74 6f 20 6d 61  take steps to ma
9c10: 6b 65 20 73 75 72 65 20 69 74 20 69 73 20 61 6e  ke sure it is an
9c20: 20 75 6e 73 68 61 72 65 64 20 63 6f 70 79 2c 20   unshared copy, 
9c30: 61 73 20 77 65 20 69 6e 74 65 6e 64 20 74 6f 0a  as we intend to.
9c40: 09 20 2a 20 6d 6f 64 69 66 79 20 69 74 2e 0a 09  . * modify it...
9c50: 20 2a 2f 0a 0a 09 69 66 20 28 2d 2d 69 6e 64 65   */...if (--inde
9c60: 78 43 6f 75 6e 74 29 20 7b 0a 09 20 20 20 20 70  xCount) {..    p
9c70: 61 72 65 6e 74 4c 69 73 74 20 3d 20 73 75 62 4c  arentList = subL
9c80: 69 73 74 50 74 72 3b 0a 09 20 20 20 20 69 66 20  istPtr;..    if 
9c90: 28 69 6e 64 65 78 20 3d 3d 20 65 6c 65 6d 43 6f  (index == elemCo
9ca0: 75 6e 74 29 20 7b 0a 09 09 73 75 62 4c 69 73 74  unt) {...subList
9cb0: 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a  Ptr = Tcl_NewObj
9cc0: 28 29 3b 0a 09 20 20 20 20 7d 20 65 6c 73 65 20  ();..    } else 
9cd0: 7b 0a 09 09 73 75 62 4c 69 73 74 50 74 72 20 3d  {...subListPtr =
9ce0: 20 65 6c 65 6d 50 74 72 73 5b 69 6e 64 65 78 5d   elemPtrs[index]
9cf0: 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 69 66  ;..    }..    if
9d00: 20 28 54 63 6c 5f 49 73 53 68 61 72 65 64 28 73   (Tcl_IsShared(s
9d10: 75 62 4c 69 73 74 50 74 72 29 29 20 7b 0a 09 09  ubListPtr)) {...
9d20: 73 75 62 4c 69 73 74 50 74 72 20 3d 20 54 63 6c  subListPtr = Tcl
9d30: 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 28 73 75  _DuplicateObj(su
9d40: 62 4c 69 73 74 50 74 72 29 3b 0a 09 20 20 20 20  bListPtr);..    
9d50: 7d 0a 0a 09 20 20 20 20 2f 2a 0a 09 20 20 20 20  }...    /*..    
9d60: 20 2a 20 52 65 70 6c 61 63 65 20 74 68 65 20 6f   * Replace the o
9d70: 72 69 67 69 6e 61 6c 20 65 6c 65 6d 50 74 72 5b  riginal elemPtr[
9d80: 69 6e 64 65 78 5d 20 69 6e 20 70 61 72 65 6e 74  index] in parent
9d90: 4c 69 73 74 20 77 69 74 68 20 61 20 63 6f 70 79  List with a copy
9da0: 0a 09 20 20 20 20 20 2a 20 77 65 20 6b 6e 6f 77  ..     * we know
9db0: 20 74 6f 20 62 65 20 75 6e 73 68 61 72 65 64 2e   to be unshared.
9dc0: 20 20 54 68 69 73 20 63 61 6c 6c 20 77 69 6c 6c    This call will
9dd0: 20 61 6c 73 6f 20 64 65 61 6c 20 77 69 74 68 20   also deal with 
9de0: 74 68 65 0a 09 20 20 20 20 20 2a 20 73 69 74 75  the..     * situ
9df0: 61 74 69 6f 6e 20 77 68 65 72 65 20 70 61 72 65  ation where pare
9e00: 6e 74 4c 69 73 74 20 73 68 61 72 65 73 20 69 74  ntList shares it
9e10: 73 20 69 6e 74 72 65 70 20 77 69 74 68 20 6f 74  s intrep with ot
9e20: 68 65 72 0a 09 20 20 20 20 20 2a 20 54 63 6c 5f  her..     * Tcl_
9e30: 4f 62 6a 27 73 2e 20 20 44 65 61 6c 69 6e 67 20  Obj's.  Dealing 
9e40: 77 69 74 68 20 74 68 65 20 73 68 61 72 65 64 20  with the shared 
9e50: 69 6e 74 72 65 70 20 63 61 73 65 20 63 61 6e 20  intrep case can 
9e60: 63 61 75 73 65 0a 09 20 20 20 20 20 2a 20 73 75  cause..     * su
9e70: 62 4c 69 73 74 50 74 72 20 74 6f 20 62 65 63 6f  bListPtr to beco
9e80: 6d 65 20 73 68 61 72 65 64 20 61 67 61 69 6e 2c  me shared again,
9e90: 20 73 6f 20 64 65 74 65 63 74 20 74 68 61 74 20   so detect that 
9ea0: 63 61 73 65 20 61 6e 64 20 6d 61 6b 65 0a 09 20  case and make.. 
9eb0: 20 20 20 20 2a 20 61 6e 64 20 73 74 6f 72 65 20      * and store 
9ec0: 61 6e 6f 74 68 65 72 20 63 6f 70 79 2e 0a 09 20  another copy... 
9ed0: 20 20 20 20 2a 2f 0a 0a 09 20 20 20 20 69 66 20      */...    if 
9ee0: 28 69 6e 64 65 78 20 3d 3d 20 65 6c 65 6d 43 6f  (index == elemCo
9ef0: 75 6e 74 29 20 7b 0a 09 09 54 63 6c 5f 4c 69 73  unt) {...Tcl_Lis
9f00: 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e  tObjAppendElemen
9f10: 74 28 4e 55 4c 4c 2c 20 70 61 72 65 6e 74 4c 69  t(NULL, parentLi
9f20: 73 74 2c 20 73 75 62 4c 69 73 74 50 74 72 29 3b  st, subListPtr);
9f30: 0a 09 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09  ..    } else {..
9f40: 09 54 63 6c 4c 69 73 74 4f 62 6a 53 65 74 45 6c  .TclListObjSetEl
9f50: 65 6d 65 6e 74 28 4e 55 4c 4c 2c 20 70 61 72 65  ement(NULL, pare
9f60: 6e 74 4c 69 73 74 2c 20 69 6e 64 65 78 2c 20 73  ntList, index, s
9f70: 75 62 4c 69 73 74 50 74 72 29 3b 0a 09 20 20 20  ubListPtr);..   
9f80: 20 7d 0a 09 20 20 20 20 69 66 20 28 54 63 6c 5f   }..    if (Tcl_
9f90: 49 73 53 68 61 72 65 64 28 73 75 62 4c 69 73 74  IsShared(subList
9fa0: 50 74 72 29 29 20 7b 0a 09 09 73 75 62 4c 69 73  Ptr)) {...subLis
9fb0: 74 50 74 72 20 3d 20 54 63 6c 5f 44 75 70 6c 69  tPtr = Tcl_Dupli
9fc0: 63 61 74 65 4f 62 6a 28 73 75 62 4c 69 73 74 50  cateObj(subListP
9fd0: 74 72 29 3b 0a 09 09 54 63 6c 4c 69 73 74 4f 62  tr);...TclListOb
9fe0: 6a 53 65 74 45 6c 65 6d 65 6e 74 28 4e 55 4c 4c  jSetElement(NULL
9ff0: 2c 20 70 61 72 65 6e 74 4c 69 73 74 2c 20 69 6e  , parentList, in
a000: 64 65 78 2c 20 73 75 62 4c 69 73 74 50 74 72 29  dex, subListPtr)
a010: 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20 20 2f  ;..    }...    /
a020: 2a 0a 09 20 20 20 20 20 2a 20 54 68 65 20 54 63  *..     * The Tc
a030: 6c 4c 69 73 74 4f 62 6a 53 65 74 45 6c 65 6d 65  lListObjSetEleme
a040: 6e 74 28 29 20 63 61 6c 6c 73 20 64 6f 20 6e 6f  nt() calls do no
a050: 74 20 73 70 6f 69 6c 20 74 68 65 20 73 74 72 69  t spoil the stri
a060: 6e 67 20 72 65 70 20 6f 66 0a 09 20 20 20 20 20  ng rep of..     
a070: 2a 20 70 61 72 65 6e 74 4c 69 73 74 2c 20 61 6e  * parentList, an
a080: 64 20 74 68 61 74 27 73 20 66 69 6e 65 20 66 6f  d that's fine fo
a090: 72 20 6e 6f 77 2c 20 73 69 6e 63 65 20 61 6c 6c  r now, since all
a0a0: 20 77 65 27 76 65 20 64 6f 6e 65 20 73 6f 0a 09   we've done so..
a0b0: 20 20 20 20 20 2a 20 66 61 72 20 69 73 20 72 65       * far is re
a0c0: 70 6c 61 63 65 20 61 20 6c 69 73 74 20 65 6c 65  place a list ele
a0d0: 6d 65 6e 74 20 77 69 74 68 20 61 6e 20 75 6e 73  ment with an uns
a0e0: 68 61 72 65 64 20 63 6f 70 79 2e 20 20 54 68 65  hared copy.  The
a0f0: 20 6c 69 73 74 0a 09 20 20 20 20 20 2a 20 76 61   list..     * va
a100: 6c 75 65 20 72 65 6d 61 69 6e 73 20 74 68 65 20  lue remains the 
a110: 73 61 6d 65 2c 20 73 6f 20 74 68 65 20 73 74 72  same, so the str
a120: 69 6e 67 20 72 65 70 2e 20 69 73 20 73 74 69 6c  ing rep. is stil
a130: 6c 20 76 61 6c 69 64 2c 20 61 6e 64 0a 09 20 20  l valid, and..  
a140: 20 20 20 2a 20 75 6e 63 68 61 6e 67 65 64 2c 20     * unchanged, 
a150: 77 68 69 63 68 20 69 73 20 67 6f 6f 64 20 62 65  which is good be
a160: 63 61 75 73 65 20 69 66 20 74 68 69 73 20 77 68  cause if this wh
a170: 6f 6c 65 20 72 6f 75 74 69 6e 65 20 72 65 74 75  ole routine retu
a180: 72 6e 73 0a 09 20 20 20 20 20 2a 20 4e 55 4c 4c  rns..     * NULL
a190: 2c 20 77 65 27 64 20 6c 69 6b 65 20 74 6f 20 6c  , we'd like to l
a1a0: 65 61 76 65 20 6e 6f 20 63 68 61 6e 67 65 20 74  eave no change t
a1b0: 6f 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  o the value of t
a1c0: 68 65 20 6c 73 65 74 0a 09 20 20 20 20 20 2a 20  he lset..     * 
a1d0: 76 61 72 69 61 62 6c 65 2e 20 20 4c 61 74 65 72  variable.  Later
a1e0: 20 6f 6e 2c 20 77 68 65 6e 20 77 65 20 73 65 74   on, when we set
a1f0: 20 76 61 6c 75 65 50 74 72 20 69 6e 20 69 74 73   valuePtr in its
a200: 20 70 72 6f 70 65 72 20 70 6c 61 63 65 2c 0a 09   proper place,..
a210: 20 20 20 20 20 2a 20 74 68 65 6e 20 61 6c 6c 20       * then all 
a220: 63 6f 6e 74 61 69 6e 69 6e 67 20 6c 69 73 74 73  containing lists
a230: 20 77 69 6c 6c 20 68 61 76 65 20 74 68 65 69 72   will have their
a240: 20 76 61 6c 75 65 73 20 63 68 61 6e 67 65 64 2c   values changed,
a250: 20 61 6e 64 0a 09 20 20 20 20 20 2a 20 77 69 6c   and..     * wil
a260: 6c 20 6e 65 65 64 20 74 68 65 69 72 20 73 74 72  l need their str
a270: 69 6e 67 20 72 65 70 73 20 73 70 6f 69 6c 65 64  ing reps spoiled
a280: 2e 20 20 57 65 20 6d 61 69 6e 74 61 69 6e 20 61  .  We maintain a
a290: 20 6c 69 73 74 20 6f 66 20 61 6c 6c 0a 09 20 20   list of all..  
a2a0: 20 20 20 2a 20 74 68 6f 73 65 20 54 63 6c 5f 4f     * those Tcl_O
a2b0: 62 6a 27 73 20 28 76 69 61 20 61 20 6c 69 74 74  bj's (via a litt
a2c0: 6c 65 20 69 6e 74 72 65 70 20 73 75 72 67 65 72  le intrep surger
a2d0: 79 29 20 73 6f 20 77 65 20 63 61 6e 20 73 70 6f  y) so we can spo
a2e0: 69 6c 0a 09 20 20 20 20 20 2a 20 74 68 65 6d 20  il..     * them 
a2f0: 61 74 20 74 68 61 74 20 74 69 6d 65 2e 0a 09 20  at that time... 
a300: 20 20 20 20 2a 2f 0a 0a 09 20 20 20 20 70 61 72      */...    par
a310: 65 6e 74 4c 69 73 74 2d 3e 69 6e 74 65 72 6e 61  entList->interna
a320: 6c 52 65 70 2e 74 77 6f 50 74 72 56 61 6c 75 65  lRep.twoPtrValue
a330: 2e 70 74 72 32 20 3d 20 63 68 61 69 6e 50 74 72  .ptr2 = chainPtr
a340: 3b 0a 09 20 20 20 20 63 68 61 69 6e 50 74 72 20  ;..    chainPtr 
a350: 3d 20 70 61 72 65 6e 74 4c 69 73 74 3b 0a 09 7d  = parentList;..}
a360: 0a 20 20 20 20 7d 20 77 68 69 6c 65 20 28 69 6e  .    } while (in
a370: 64 65 78 43 6f 75 6e 74 20 3e 20 30 29 3b 0a 0a  dexCount > 0);..
a380: 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 45 69      /*.     * Ei
a390: 74 68 65 72 20 77 65 27 76 65 20 64 65 74 65 63  ther we've detec
a3a0: 74 65 64 20 61 6e 64 20 65 72 72 6f 72 20 63 6f  ted and error co
a3b0: 6e 64 69 74 69 6f 6e 2c 20 61 6e 64 20 65 78 69  ndition, and exi
a3c0: 74 65 64 20 74 68 65 20 6c 6f 6f 70 20 77 69 74  ted the loop wit
a3d0: 68 0a 20 20 20 20 20 2a 20 72 65 73 75 6c 74 20  h.     * result 
a3e0: 3d 3d 20 54 43 4c 5f 45 52 52 4f 52 2c 20 6f 72  == TCL_ERROR, or
a3f0: 20 77 65 27 76 65 20 73 75 63 63 65 73 73 66 75   we've successfu
a400: 6c 6c 79 20 72 65 61 63 68 65 64 20 74 68 65 20  lly reached the 
a410: 6c 61 73 74 20 69 6e 64 65 78 2c 20 61 6e 64 0a  last index, and.
a420: 20 20 20 20 20 2a 20 77 65 27 72 65 20 72 65 61       * we're rea
a430: 64 79 20 74 6f 20 73 74 6f 72 65 20 76 61 6c 75  dy to store valu
a440: 65 50 74 72 2e 20 20 49 6e 20 65 69 74 68 65 72  ePtr.  In either
a450: 20 63 61 73 65 2c 20 77 65 20 6e 65 65 64 20 74   case, we need t
a460: 6f 20 63 6c 65 61 6e 20 75 70 20 6f 75 72 0a 20  o clean up our. 
a470: 20 20 20 20 2a 20 73 74 72 69 6e 67 20 73 70 6f      * string spo
a480: 69 6c 69 6e 67 20 6c 69 73 74 20 6f 66 20 54 63  iling list of Tc
a490: 6c 5f 4f 62 6a 27 73 2e 0a 20 20 20 20 20 2a 2f  l_Obj's..     */
a4a0: 0a 0a 20 20 20 20 77 68 69 6c 65 20 28 63 68 61  ..    while (cha
a4b0: 69 6e 50 74 72 29 20 7b 0a 09 54 63 6c 5f 4f 62  inPtr) {..Tcl_Ob
a4c0: 6a 20 2a 6f 62 6a 50 74 72 20 3d 20 63 68 61 69  j *objPtr = chai
a4d0: 6e 50 74 72 3b 0a 0a 09 69 66 20 28 72 65 73 75  nPtr;...if (resu
a4e0: 6c 74 20 3d 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a  lt == TCL_OK) {.
a4f0: 09 20 20 20 20 2f 2a 0a 09 20 20 20 20 20 2a 20  .    /*..     * 
a500: 57 65 27 72 65 20 67 6f 69 6e 67 20 74 6f 20 73  We're going to s
a510: 74 6f 72 65 20 76 61 6c 75 65 50 74 72 2c 20 73  tore valuePtr, s
a520: 6f 20 73 70 6f 69 6c 20 73 74 72 69 6e 67 20 72  o spoil string r
a530: 65 70 73 20 6f 66 20 61 6c 6c 0a 09 20 20 20 20  eps of all..    
a540: 20 2a 20 63 6f 6e 74 61 69 6e 69 6e 67 20 6c 69   * containing li
a550: 73 74 73 2e 0a 09 20 20 20 20 20 2a 2f 0a 0a 09  sts...     */...
a560: 20 20 20 20 54 63 6c 49 6e 76 61 6c 69 64 61 74      TclInvalidat
a570: 65 53 74 72 69 6e 67 52 65 70 28 6f 62 6a 50 74  eStringRep(objPt
a580: 72 29 3b 0a 09 7d 0a 0a 09 2f 2a 0a 09 20 2a 20  r);..}.../*.. * 
a590: 43 6c 65 61 72 20 61 77 61 79 20 6f 75 72 20 69  Clear away our i
a5a0: 6e 74 72 65 70 20 73 75 72 67 65 72 79 20 6d 65  ntrep surgery me
a5b0: 73 73 2e 0a 09 20 2a 2f 0a 0a 09 63 68 61 69 6e  ss... */...chain
a5c0: 50 74 72 20 3d 20 6f 62 6a 50 74 72 2d 3e 69 6e  Ptr = objPtr->in
a5d0: 74 65 72 6e 61 6c 52 65 70 2e 74 77 6f 50 74 72  ternalRep.twoPtr
a5e0: 56 61 6c 75 65 2e 70 74 72 32 3b 0a 09 6f 62 6a  Value.ptr2;..obj
a5f0: 50 74 72 2d 3e 69 6e 74 65 72 6e 61 6c 52 65 70  Ptr->internalRep
a600: 2e 74 77 6f 50 74 72 56 61 6c 75 65 2e 70 74 72  .twoPtrValue.ptr
a610: 32 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a  2 = NULL;.    }.
a620: 0a 20 20 20 20 69 66 20 28 72 65 73 75 6c 74 20  .    if (result 
a630: 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 2f 2a  != TCL_OK) {../*
a640: 0a 09 20 2a 20 45 72 72 6f 72 20 72 65 74 75 72  .. * Error retur
a650: 6e 3b 20 6d 65 73 73 61 67 65 20 69 73 20 61 6c  n; message is al
a660: 72 65 61 64 79 20 69 6e 20 69 6e 74 65 72 70 2e  ready in interp.
a670: 20 43 6c 65 61 6e 20 75 70 20 61 6e 79 20 65 78   Clean up any ex
a680: 63 65 73 73 0a 09 20 2a 20 6d 65 6d 6f 72 79 2e  cess.. * memory.
a690: 0a 09 20 2a 2f 0a 0a 09 69 66 20 28 72 65 74 56  .. */...if (retV
a6a0: 61 6c 75 65 50 74 72 20 21 3d 20 6c 69 73 74 50  aluePtr != listP
a6b0: 74 72 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 44  tr) {..    Tcl_D
a6c0: 65 63 72 52 65 66 43 6f 75 6e 74 28 72 65 74 56  ecrRefCount(retV
a6d0: 61 6c 75 65 50 74 72 29 3b 0a 09 7d 0a 09 72 65  aluePtr);..}..re
a6e0: 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d  turn NULL;.    }
a6f0: 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20  ..    /*.     * 
a700: 53 74 6f 72 65 20 76 61 6c 75 65 50 74 72 20 69  Store valuePtr i
a710: 6e 20 70 72 6f 70 65 72 20 73 75 62 6c 69 73 74  n proper sublist
a720: 20 61 6e 64 20 72 65 74 75 72 6e 2e 20 54 68 65   and return. The
a730: 20 2d 31 20 69 73 20 74 6f 20 61 76 6f 69 64 20   -1 is to avoid 
a740: 61 0a 20 20 20 20 20 2a 20 63 6f 6d 70 69 6c 65  a.     * compile
a750: 72 20 77 61 72 6e 69 6e 67 20 28 6e 6f 74 20 61  r warning (not a
a760: 20 70 72 6f 62 6c 65 6d 20 62 65 63 61 75 73 65   problem because
a770: 20 77 65 20 63 68 65 63 6b 65 64 20 74 68 61 74   we checked that
a780: 20 77 65 20 68 61 76 65 20 61 0a 20 20 20 20 20   we have a.     
a790: 2a 20 70 72 6f 70 65 72 20 6c 69 73 74 20 2d 20  * proper list - 
a7a0: 6f 72 20 73 6f 6d 65 74 68 69 6e 67 20 63 6f 6e  or something con
a7b0: 76 65 72 74 69 62 6c 65 20 74 6f 20 6f 6e 65 20  vertible to one 
a7c0: 2d 20 61 62 6f 76 65 29 2e 0a 20 20 20 20 20 2a  - above)..     *
a7d0: 2f 0a 0a 20 20 20 20 6c 65 6e 20 3d 20 2d 31 3b  /..    len = -1;
a7e0: 0a 20 20 20 20 54 63 6c 4c 69 73 74 4f 62 6a 4c  .    TclListObjL
a7f0: 65 6e 67 74 68 28 4e 55 4c 4c 2c 20 73 75 62 4c  ength(NULL, subL
a800: 69 73 74 50 74 72 2c 20 26 6c 65 6e 29 3b 0a 20  istPtr, &len);. 
a810: 20 20 20 69 66 20 28 69 6e 64 65 78 20 3d 3d 20     if (index == 
a820: 6c 65 6e 29 20 7b 0a 09 54 63 6c 5f 4c 69 73 74  len) {..Tcl_List
a830: 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74  ObjAppendElement
a840: 28 4e 55 4c 4c 2c 20 73 75 62 4c 69 73 74 50 74  (NULL, subListPt
a850: 72 2c 20 76 61 6c 75 65 50 74 72 29 3b 0a 20 20  r, valuePtr);.  
a860: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 54 63 6c 4c    } else {..TclL
a870: 69 73 74 4f 62 6a 53 65 74 45 6c 65 6d 65 6e 74  istObjSetElement
a880: 28 4e 55 4c 4c 2c 20 73 75 62 4c 69 73 74 50 74  (NULL, subListPt
a890: 72 2c 20 69 6e 64 65 78 2c 20 76 61 6c 75 65 50  r, index, valueP
a8a0: 74 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54  tr);.    }.    T
a8b0: 63 6c 49 6e 76 61 6c 69 64 61 74 65 53 74 72 69  clInvalidateStri
a8c0: 6e 67 52 65 70 28 73 75 62 4c 69 73 74 50 74 72  ngRep(subListPtr
a8d0: 29 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52  );.    Tcl_IncrR
a8e0: 65 66 43 6f 75 6e 74 28 72 65 74 56 61 6c 75 65  efCount(retValue
a8f0: 50 74 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  Ptr);.    return
a900: 20 72 65 74 56 61 6c 75 65 50 74 72 3b 0a 7d 0a   retValuePtr;.}.
a910: 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  ../*. *---------
a920: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a930: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a940: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a950: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
a960: 0a 20 2a 20 54 63 6c 4c 69 73 74 4f 62 6a 53 65  . * TclListObjSe
a970: 74 45 6c 65 6d 65 6e 74 20 2d 2d 0a 20 2a 0a 20  tElement --. *. 
a980: 2a 09 53 65 74 20 61 20 73 69 6e 67 6c 65 20 65  *.Set a single e
a990: 6c 65 6d 65 6e 74 20 6f 66 20 61 20 6c 69 73 74  lement of a list
a9a0: 20 74 6f 20 61 20 73 70 65 63 69 66 69 65 64 20   to a specified 
a9b0: 76 61 6c 75 65 2e 0a 20 2a 0a 20 2a 09 49 74 20  value.. *. *.It 
a9c0: 69 73 20 74 68 65 20 63 61 6c 6c 65 72 27 73 20  is the caller's 
a9d0: 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 74  responsibility t
a9e0: 6f 20 69 6e 76 61 6c 69 64 61 74 65 20 74 68 65  o invalidate the
a9f0: 20 73 74 72 69 6e 67 0a 20 2a 09 72 65 70 72 65   string. *.repre
aa00: 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  sentation of the
aa10: 20 27 6c 69 73 74 50 74 72 27 2e 0a 20 2a 0a 20   'listPtr'.. *. 
aa20: 2a 20 56 61 6c 75 65 0a 20 2a 0a 20 2a 20 09 54  * Value. *. * .T
aa30: 43 4c 5f 4f 4b 0a 20 2a 0a 20 2a 09 20 20 20 20  CL_OK. *. *.    
aa40: 53 75 63 63 65 73 73 2e 0a 20 2a 0a 20 2a 09 54  Success.. *. *.T
aa50: 43 4c 5f 45 52 52 4f 52 0a 20 2a 0a 20 2a 09 20  CL_ERROR. *. *. 
aa60: 20 20 20 27 6c 69 73 74 50 74 72 27 20 64 6f 65     'listPtr' doe
aa70: 73 20 6e 6f 74 20 72 65 66 65 72 20 74 6f 20 61  s not refer to a
aa80: 20 6c 69 73 74 20 6f 62 6a 65 63 74 20 61 6e 64   list object and
aa90: 20 63 61 6e 6e 6f 74 20 62 65 20 63 6f 6e 76 65   cannot be conve
aaa0: 72 74 65 64 0a 20 2a 09 20 20 20 20 74 6f 20 6f  rted. *.    to o
aab0: 6e 65 2e 20 20 41 6e 20 65 72 72 6f 72 20 6d 65  ne.  An error me
aac0: 73 73 61 67 65 20 77 69 6c 6c 20 62 65 20 6c 65  ssage will be le
aad0: 66 74 20 69 6e 20 74 68 65 20 69 6e 74 65 72 70  ft in the interp
aae0: 72 65 74 65 72 20 72 65 73 75 6c 74 20 69 66 0a  reter result if.
aaf0: 20 2a 09 20 20 20 20 69 6e 74 65 72 70 20 69 73   *.    interp is
ab00: 20 6e 6f 74 20 4e 55 4c 4c 2e 0a 20 2a 0a 20 2a   not NULL.. *. *
ab10: 09 54 43 4c 5f 45 52 52 4f 52 0a 20 2a 0a 20 2a  .TCL_ERROR. *. *
ab20: 09 20 20 20 20 41 6e 20 69 6e 64 65 78 20 64 65  .    An index de
ab30: 73 69 67 6e 61 74 65 73 20 61 6e 20 65 6c 65 6d  signates an elem
ab40: 65 6e 74 20 6f 75 74 73 69 64 65 20 74 68 65 20  ent outside the 
ab50: 72 61 6e 67 65 20 5b 30 2e 2e 6c 69 73 74 4c 65  range [0..listLe
ab60: 6e 67 74 68 2d 31 5d 2c 0a 20 2a 09 20 20 20 20  ngth-1],. *.    
ab70: 77 68 65 72 65 20 27 6c 69 73 74 4c 65 6e 67 74  where 'listLengt
ab80: 68 27 20 69 73 20 74 68 65 20 63 6f 75 6e 74 20  h' is the count 
ab90: 6f 66 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 74  of elements in t
aba0: 68 65 20 6c 69 73 74 20 6f 62 6a 65 63 74 0a 20  he list object. 
abb0: 2a 09 20 20 20 20 64 65 73 69 67 6e 61 74 65 64  *.    designated
abc0: 20 62 79 20 27 6c 69 73 74 50 74 72 27 2e 20 20   by 'listPtr'.  
abd0: 41 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  An error message
abe0: 20 69 73 20 6c 65 66 74 20 69 6e 20 74 68 65 0a   is left in the.
abf0: 20 2a 09 20 20 20 20 69 6e 74 65 72 70 72 65 74   *.    interpret
ac00: 65 72 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a  er result.. *. *
ac10: 20 45 66 66 65 63 74 0a 20 2a 0a 20 2a 09 49 66   Effect. *. *.If
ac20: 20 27 6c 69 73 74 50 74 72 27 20 64 65 73 69 67   'listPtr' desig
ac30: 6e 61 74 65 73 20 61 20 73 68 61 72 65 64 20 6f  nates a shared o
ac40: 62 6a 65 63 74 2c 20 27 54 63 6c 5f 50 61 6e 69  bject, 'Tcl_Pani
ac50: 63 27 20 69 73 20 63 61 6c 6c 65 64 2e 20 20 49  c' is called.  I
ac60: 66 0a 20 2a 09 27 6c 69 73 74 50 74 72 27 20 69  f. *.'listPtr' i
ac70: 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f 66  s not already of
ac80: 20 74 79 70 65 20 27 74 63 6c 4c 69 73 74 54 79   type 'tclListTy
ac90: 70 65 27 2c 20 69 74 20 69 73 20 63 6f 6e 76 65  pe', it is conve
aca0: 72 74 65 64 20 61 6e 64 20 74 68 65 0a 20 2a 09  rted and the. *.
acb0: 69 6e 74 65 72 6e 61 6c 20 72 65 70 72 65 73 65  internal represe
acc0: 6e 74 61 74 69 6f 6e 20 69 73 20 75 6e 73 68 61  ntation is unsha
acd0: 72 65 64 2e 20 54 68 65 20 27 72 65 66 43 6f 75  red. The 'refCou
ace0: 6e 74 27 20 6f 66 20 74 68 65 20 65 6c 65 6d 65  nt' of the eleme
acf0: 6e 74 20 61 74 0a 20 2a 09 27 69 6e 64 65 78 27  nt at. *.'index'
ad00: 20 69 73 20 64 65 63 72 65 6d 65 6e 74 65 64 20   is decremented 
ad10: 61 6e 64 20 72 65 70 6c 61 63 65 64 20 69 6e 20  and replaced in 
ad20: 74 68 65 20 6c 69 73 74 20 77 69 74 68 20 74 68  the list with th
ad30: 65 20 27 76 61 6c 75 65 50 74 72 27 2c 0a 20 2a  e 'valuePtr',. *
ad40: 09 77 68 6f 73 65 20 27 72 65 66 43 6f 75 6e 74  .whose 'refCount
ad50: 27 20 69 6e 20 74 75 72 6e 20 69 73 20 69 6e 63  ' in turn is inc
ad60: 72 65 6d 65 6e 74 65 64 2e 0a 20 2a 0a 20 2a 0a  remented.. *. *.
ad70: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
ad80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ad90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ada0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
adb0: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 69 6e  --------. */..in
adc0: 74 0a 54 63 6c 4c 69 73 74 4f 62 6a 53 65 74 45  t.TclListObjSetE
add0: 6c 65 6d 65 6e 74 28 0a 20 20 20 20 54 63 6c 5f  lement(.    Tcl_
ade0: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 09  Interp *interp,.
adf0: 09 2f 2a 20 54 63 6c 20 69 6e 74 65 72 70 72 65  ./* Tcl interpre
ae00: 74 65 72 3b 20 75 73 65 64 20 66 6f 72 20 65 72  ter; used for er
ae10: 72 6f 72 20 72 65 70 6f 72 74 69 6e 67 0a 09 09  ror reporting...
ae20: 09 09 20 2a 20 69 66 20 6e 6f 74 20 4e 55 4c 4c  .. * if not NULL
ae30: 2e 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a  . */.    Tcl_Obj
ae40: 20 2a 6c 69 73 74 50 74 72 2c 09 09 2f 2a 20 4c   *listPtr,../* L
ae50: 69 73 74 20 6f 62 6a 65 63 74 20 69 6e 20 77 68  ist object in wh
ae60: 69 63 68 20 65 6c 65 6d 65 6e 74 20 73 68 6f 75  ich element shou
ae70: 6c 64 20 62 65 0a 09 09 09 09 20 2a 20 73 74 6f  ld be..... * sto
ae80: 72 65 64 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20  red. */.    int 
ae90: 69 6e 64 65 78 2c 09 09 09 2f 2a 20 49 6e 64 65  index,.../* Inde
aea0: 78 20 6f 66 20 65 6c 65 6d 65 6e 74 20 74 6f 20  x of element to 
aeb0: 73 74 6f 72 65 2e 20 2a 2f 0a 20 20 20 20 54 63  store. */.    Tc
aec0: 6c 5f 4f 62 6a 20 2a 76 61 6c 75 65 50 74 72 29  l_Obj *valuePtr)
aed0: 09 09 2f 2a 20 54 63 6c 20 6f 62 6a 65 63 74 20  ../* Tcl object 
aee0: 74 6f 20 73 74 6f 72 65 20 69 6e 20 74 68 65 20  to store in the 
aef0: 64 65 73 69 67 6e 61 74 65 64 20 6c 69 73 74 0a  designated list.
af00: 09 09 09 09 20 2a 20 65 6c 65 6d 65 6e 74 2e 20  .... * element. 
af10: 2a 2f 0a 7b 0a 20 20 20 20 4c 69 73 74 20 2a 6c  */.{.    List *l
af20: 69 73 74 52 65 70 50 74 72 3b 09 09 2f 2a 20 49  istRepPtr;../* I
af30: 6e 74 65 72 6e 61 6c 20 72 65 70 72 65 73 65 6e  nternal represen
af40: 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6c 69  tation of the li
af50: 73 74 20 62 65 69 6e 67 0a 09 09 09 09 20 2a 20  st being..... * 
af60: 6d 6f 64 69 66 69 65 64 2e 20 2a 2f 0a 20 20 20  modified. */.   
af70: 20 54 63 6c 5f 4f 62 6a 20 2a 2a 65 6c 65 6d 50   Tcl_Obj **elemP
af80: 74 72 73 3b 09 09 2f 2a 20 50 6f 69 6e 74 65 72  trs;../* Pointer
af90: 73 20 74 6f 20 65 6c 65 6d 65 6e 74 73 20 6f 66  s to elements of
afa0: 20 74 68 65 20 6c 69 73 74 2e 20 2a 2f 0a 20 20   the list. */.  
afb0: 20 20 69 6e 74 20 65 6c 65 6d 43 6f 75 6e 74 3b    int elemCount;
afc0: 09 09 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65  ../* Number of e
afd0: 6c 65 6d 65 6e 74 73 20 69 6e 20 74 68 65 20 6c  lements in the l
afe0: 69 73 74 2e 20 2a 2f 0a 0a 20 20 20 20 2f 2a 0a  ist. */..    /*.
aff0: 20 20 20 20 20 2a 20 45 6e 73 75 72 65 20 74 68       * Ensure th
b000: 61 74 20 74 68 65 20 6c 69 73 74 50 74 72 20 70  at the listPtr p
b010: 61 72 61 6d 65 74 65 72 20 64 65 73 69 67 6e 61  arameter designa
b020: 74 65 73 20 61 6e 20 75 6e 73 68 61 72 65 64 20  tes an unshared 
b030: 6c 69 73 74 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20  list..     */.. 
b040: 20 20 20 69 66 20 28 54 63 6c 5f 49 73 53 68 61     if (Tcl_IsSha
b050: 72 65 64 28 6c 69 73 74 50 74 72 29 29 20 7b 0a  red(listPtr)) {.
b060: 09 54 63 6c 5f 50 61 6e 69 63 28 22 25 73 20 63  .Tcl_Panic("%s c
b070: 61 6c 6c 65 64 20 77 69 74 68 20 73 68 61 72 65  alled with share
b080: 64 20 6f 62 6a 65 63 74 22 2c 20 22 54 63 6c 4c  d object", "TclL
b090: 69 73 74 4f 62 6a 53 65 74 45 6c 65 6d 65 6e 74  istObjSetElement
b0a0: 22 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ");.    }.    if
b0b0: 20 28 6c 69 73 74 50 74 72 2d 3e 74 79 70 65 50   (listPtr->typeP
b0c0: 74 72 20 21 3d 20 26 74 63 6c 4c 69 73 74 54 79  tr != &tclListTy
b0d0: 70 65 29 20 7b 0a 09 69 6e 74 20 72 65 73 75 6c  pe) {..int resul
b0e0: 74 3b 0a 0a 09 69 66 20 28 6c 69 73 74 50 74 72  t;...if (listPtr
b0f0: 2d 3e 62 79 74 65 73 20 3d 3d 20 74 63 6c 45 6d  ->bytes == tclEm
b100: 70 74 79 53 74 72 69 6e 67 52 65 70 29 20 7b 0a  ptyStringRep) {.
b110: 09 20 20 20 20 69 66 20 28 69 6e 74 65 72 70 20  .    if (interp 
b120: 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 54 63 6c  != NULL) {...Tcl
b130: 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e  _SetObjResult(in
b140: 74 65 72 70 2c 0a 09 09 09 54 63 6c 5f 4e 65 77  terp,....Tcl_New
b150: 53 74 72 69 6e 67 4f 62 6a 28 22 6c 69 73 74 20  StringObj("list 
b160: 69 6e 64 65 78 20 6f 75 74 20 6f 66 20 72 61 6e  index out of ran
b170: 67 65 22 2c 20 2d 31 29 29 3b 0a 09 09 54 63 6c  ge", -1));...Tcl
b180: 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e  _SetErrorCode(in
b190: 74 65 72 70 2c 20 22 54 43 4c 22 2c 20 22 4f 50  terp, "TCL", "OP
b1a0: 45 52 41 54 49 4f 4e 22 2c 20 22 4c 53 45 54 22  ERATION", "LSET"
b1b0: 2c 0a 09 09 09 22 42 41 44 49 4e 44 45 58 22 2c  ,...."BADINDEX",
b1c0: 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 7d 0a 09   NULL);..    }..
b1d0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45      return TCL_E
b1e0: 52 52 4f 52 3b 0a 09 7d 0a 09 72 65 73 75 6c 74  RROR;..}..result
b1f0: 20 3d 20 53 65 74 4c 69 73 74 46 72 6f 6d 41 6e   = SetListFromAn
b200: 79 28 69 6e 74 65 72 70 2c 20 6c 69 73 74 50 74  y(interp, listPt
b210: 72 29 3b 0a 09 69 66 20 28 72 65 73 75 6c 74 20  r);..if (result 
b220: 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20  != TCL_OK) {..  
b230: 20 20 72 65 74 75 72 6e 20 72 65 73 75 6c 74 3b    return result;
b240: 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6c  ..}.    }..    l
b250: 69 73 74 52 65 70 50 74 72 20 3d 20 4c 69 73 74  istRepPtr = List
b260: 52 65 70 50 74 72 28 6c 69 73 74 50 74 72 29 3b  RepPtr(listPtr);
b270: 0a 20 20 20 20 65 6c 65 6d 43 6f 75 6e 74 20 3d  .    elemCount =
b280: 20 6c 69 73 74 52 65 70 50 74 72 2d 3e 65 6c 65   listRepPtr->ele
b290: 6d 43 6f 75 6e 74 3b 0a 0a 20 20 20 20 2f 2a 0a  mCount;..    /*.
b2a0: 20 20 20 20 20 2a 20 45 6e 73 75 72 65 20 74 68       * Ensure th
b2b0: 61 74 20 74 68 65 20 69 6e 64 65 78 20 69 73 20  at the index is 
b2c0: 69 6e 20 62 6f 75 6e 64 73 2e 0a 20 20 20 20 20  in bounds..     
b2d0: 2a 2f 0a 0a 20 20 20 20 69 66 20 28 69 6e 64 65  */..    if (inde
b2e0: 78 3c 30 20 7c 7c 20 69 6e 64 65 78 3e 3d 65 6c  x<0 || index>=el
b2f0: 65 6d 43 6f 75 6e 74 29 20 7b 0a 09 69 66 20 28  emCount) {..if (
b300: 69 6e 74 65 72 70 20 21 3d 20 4e 55 4c 4c 29 20  interp != NULL) 
b310: 7b 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 4f 62  {..    Tcl_SetOb
b320: 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 0a  jResult(interp,.
b330: 09 09 20 20 20 20 54 63 6c 5f 4e 65 77 53 74 72  ..    Tcl_NewStr
b340: 69 6e 67 4f 62 6a 28 22 6c 69 73 74 20 69 6e 64  ingObj("list ind
b350: 65 78 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 22  ex out of range"
b360: 2c 20 2d 31 29 29 3b 0a 09 20 20 20 20 54 63 6c  , -1));..    Tcl
b370: 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e  _SetErrorCode(in
b380: 74 65 72 70 2c 20 22 54 43 4c 22 2c 20 22 4f 50  terp, "TCL", "OP
b390: 45 52 41 54 49 4f 4e 22 2c 20 22 4c 53 45 54 22  ERATION", "LSET"
b3a0: 2c 20 22 42 41 44 49 4e 44 45 58 22 2c 0a 09 09  , "BADINDEX",...
b3b0: 20 20 20 20 4e 55 4c 4c 29 3b 0a 09 7d 0a 09 72      NULL);..}..r
b3c0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b  eturn TCL_ERROR;
b3d0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20  .    }..    /*. 
b3e0: 20 20 20 20 2a 20 49 66 20 74 68 65 20 69 6e 74      * If the int
b3f0: 65 72 6e 61 6c 20 72 65 70 20 69 73 20 73 68 61  ernal rep is sha
b400: 72 65 64 2c 20 72 65 70 6c 61 63 65 20 69 74 20  red, replace it 
b410: 77 69 74 68 20 61 6e 20 75 6e 73 68 61 72 65 64  with an unshared
b420: 20 63 6f 70 79 2e 0a 20 20 20 20 20 2a 2f 0a 0a   copy..     */..
b430: 20 20 20 20 69 66 20 28 6c 69 73 74 52 65 70 50      if (listRepP
b440: 74 72 2d 3e 72 65 66 43 6f 75 6e 74 20 3e 20 31  tr->refCount > 1
b450: 29 20 7b 0a 09 54 63 6c 5f 4f 62 6a 20 2a 2a 64  ) {..Tcl_Obj **d
b460: 73 74 2c 20 2a 2a 73 72 63 20 3d 20 26 6c 69 73  st, **src = &lis
b470: 74 52 65 70 50 74 72 2d 3e 65 6c 65 6d 65 6e 74  tRepPtr->element
b480: 73 3b 0a 09 4c 69 73 74 20 2a 6e 65 77 50 74 72  s;..List *newPtr
b490: 20 3d 20 41 74 74 65 6d 70 74 4e 65 77 4c 69 73   = AttemptNewLis
b4a0: 74 28 4e 55 4c 4c 2c 20 6c 69 73 74 52 65 70 50  t(NULL, listRepP
b4b0: 74 72 2d 3e 6d 61 78 45 6c 65 6d 43 6f 75 6e 74  tr->maxElemCount
b4c0: 2c 20 4e 55 4c 4c 29 3b 0a 0a 09 69 66 20 28 6e  , NULL);...if (n
b4d0: 65 77 50 74 72 20 3d 3d 20 4e 55 4c 4c 29 20 7b  ewPtr == NULL) {
b4e0: 0a 09 20 20 20 20 6e 65 77 50 74 72 20 3d 20 41  ..    newPtr = A
b4f0: 74 74 65 6d 70 74 4e 65 77 4c 69 73 74 28 69 6e  ttemptNewList(in
b500: 74 65 72 70 2c 20 65 6c 65 6d 43 6f 75 6e 74 2c  terp, elemCount,
b510: 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 69 66 20   NULL);..    if 
b520: 28 6e 65 77 50 74 72 20 3d 3d 20 4e 55 4c 4c 29  (newPtr == NULL)
b530: 20 7b 0a 09 09 72 65 74 75 72 6e 20 54 43 4c 5f   {...return TCL_
b540: 45 52 52 4f 52 3b 0a 09 20 20 20 20 7d 0a 09 7d  ERROR;..    }..}
b550: 0a 09 6e 65 77 50 74 72 2d 3e 72 65 66 43 6f 75  ..newPtr->refCou
b560: 6e 74 2b 2b 3b 0a 09 6e 65 77 50 74 72 2d 3e 65  nt++;..newPtr->e
b570: 6c 65 6d 43 6f 75 6e 74 20 3d 20 65 6c 65 6d 43  lemCount = elemC
b580: 6f 75 6e 74 3b 0a 09 6e 65 77 50 74 72 2d 3e 63  ount;..newPtr->c
b590: 61 6e 6f 6e 69 63 61 6c 46 6c 61 67 20 3d 20 6c  anonicalFlag = l
b5a0: 69 73 74 52 65 70 50 74 72 2d 3e 63 61 6e 6f 6e  istRepPtr->canon
b5b0: 69 63 61 6c 46 6c 61 67 3b 0a 0a 09 64 73 74 20  icalFlag;...dst 
b5c0: 3d 20 26 6e 65 77 50 74 72 2d 3e 65 6c 65 6d 65  = &newPtr->eleme
b5d0: 6e 74 73 3b 0a 09 77 68 69 6c 65 20 28 65 6c 65  nts;..while (ele
b5e0: 6d 43 6f 75 6e 74 2d 2d 29 20 7b 0a 09 20 20 20  mCount--) {..   
b5f0: 20 2a 64 73 74 20 3d 20 2a 73 72 63 2b 2b 3b 0a   *dst = *src++;.
b600: 09 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66  .    Tcl_IncrRef
b610: 43 6f 75 6e 74 28 2a 64 73 74 2b 2b 29 3b 0a 09  Count(*dst++);..
b620: 7d 0a 0a 09 6c 69 73 74 52 65 70 50 74 72 2d 3e  }...listRepPtr->
b630: 72 65 66 43 6f 75 6e 74 2d 2d 3b 0a 0a 09 6c 69  refCount--;...li
b640: 73 74 50 74 72 2d 3e 69 6e 74 65 72 6e 61 6c 52  stPtr->internalR
b650: 65 70 2e 74 77 6f 50 74 72 56 61 6c 75 65 2e 70  ep.twoPtrValue.p
b660: 74 72 31 20 3d 20 6c 69 73 74 52 65 70 50 74 72  tr1 = listRepPtr
b670: 20 3d 20 6e 65 77 50 74 72 3b 0a 20 20 20 20 7d   = newPtr;.    }
b680: 0a 20 20 20 20 65 6c 65 6d 50 74 72 73 20 3d 20  .    elemPtrs = 
b690: 26 6c 69 73 74 52 65 70 50 74 72 2d 3e 65 6c 65  &listRepPtr->ele
b6a0: 6d 65 6e 74 73 3b 0a 0a 20 20 20 20 2f 2a 0a 20  ments;..    /*. 
b6b0: 20 20 20 20 2a 20 41 64 64 20 61 20 72 65 66 65      * Add a refe
b6c0: 72 65 6e 63 65 20 74 6f 20 74 68 65 20 6e 65 77  rence to the new
b6d0: 20 6c 69 73 74 20 65 6c 65 6d 65 6e 74 2e 0a 20   list element.. 
b6e0: 20 20 20 20 2a 2f 0a 0a 20 20 20 20 54 63 6c 5f      */..    Tcl_
b6f0: 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 76 61 6c  IncrRefCount(val
b700: 75 65 50 74 72 29 3b 0a 0a 20 20 20 20 2f 2a 0a  uePtr);..    /*.
b710: 20 20 20 20 20 2a 20 52 65 6d 6f 76 65 20 61 20       * Remove a 
b720: 72 65 66 65 72 65 6e 63 65 20 66 72 6f 6d 20 74  reference from t
b730: 68 65 20 6f 6c 64 20 6c 69 73 74 20 65 6c 65 6d  he old list elem
b740: 65 6e 74 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20  ent..     */..  
b750: 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75    Tcl_DecrRefCou
b760: 6e 74 28 65 6c 65 6d 50 74 72 73 5b 69 6e 64 65  nt(elemPtrs[inde
b770: 78 5d 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20  x]);..    /*.   
b780: 20 20 2a 20 53 74 61 73 68 20 74 68 65 20 6e 65    * Stash the ne
b790: 77 20 6f 62 6a 65 63 74 20 69 6e 20 74 68 65 20  w object in the 
b7a0: 6c 69 73 74 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20  list..     */.. 
b7b0: 20 20 20 65 6c 65 6d 50 74 72 73 5b 69 6e 64 65     elemPtrs[inde
b7c0: 78 5d 20 3d 20 76 61 6c 75 65 50 74 72 3b 0a 0a  x] = valuePtr;..
b7d0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f      return TCL_O
b7e0: 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d  K;.}.../*. *----
b7f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b800: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b810: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b820: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b830: 2d 2d 0a 20 2a 0a 20 2a 20 46 72 65 65 4c 69 73  --. *. * FreeLis
b840: 74 49 6e 74 65 72 6e 61 6c 52 65 70 20 2d 2d 0a  tInternalRep --.
b850: 20 2a 0a 20 2a 09 44 65 61 6c 6c 6f 63 61 74 65   *. *.Deallocate
b860: 20 74 68 65 20 73 74 6f 72 61 67 65 20 61 73 73   the storage ass
b870: 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
b880: 20 69 6e 74 65 72 6e 61 6c 20 72 65 70 72 65 73   internal repres
b890: 65 6e 74 61 74 69 6f 6e 20 6f 66 20 61 0a 20 2a  entation of a. *
b8a0: 09 61 20 6c 69 73 74 20 6f 62 6a 65 63 74 2e 0a  .a list object..
b8b0: 20 2a 0a 20 2a 20 45 66 66 65 63 74 0a 20 2a 0a   *. * Effect. *.
b8c0: 20 2a 09 54 68 65 20 73 74 6f 72 61 67 65 20 66   *.The storage f
b8d0: 6f 72 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20  or the internal 
b8e0: 27 4c 69 73 74 27 20 70 6f 69 6e 74 65 72 20 6f  'List' pointer o
b8f0: 66 20 27 6c 69 73 74 50 74 72 27 20 69 73 20 66  f 'listPtr' is f
b900: 72 65 65 64 2c 20 74 68 65 0a 20 2a 09 27 69 6e  reed, the. *.'in
b910: 74 65 72 6e 61 6c 52 65 70 2e 74 77 6f 50 74 72  ternalRep.twoPtr
b920: 56 61 6c 75 65 2e 70 74 72 31 27 20 6f 66 20 27  Value.ptr1' of '
b930: 6c 69 73 74 50 74 72 27 20 69 73 20 73 65 74 20  listPtr' is set 
b940: 74 6f 20 4e 55 4c 4c 2c 20 61 6e 64 20 74 68 65  to NULL, and the
b950: 20 27 72 65 66 43 6f 75 6e 74 27 0a 20 2a 09 6f   'refCount'. *.o
b960: 66 20 65 61 63 68 20 65 6c 65 6d 65 6e 74 20 6f  f each element o
b970: 66 20 74 68 65 20 6c 69 73 74 20 69 73 20 64 65  f the list is de
b980: 63 72 65 6d 65 6e 74 65 64 2e 0a 20 2a 0a 20 2a  cremented.. *. *
b990: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b9a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b9b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b9c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b9d0: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74  ------. */..stat
b9e0: 69 63 20 76 6f 69 64 0a 46 72 65 65 4c 69 73 74  ic void.FreeList
b9f0: 49 6e 74 65 72 6e 61 6c 52 65 70 28 0a 20 20 20  InternalRep(.   
ba00: 20 54 63 6c 5f 4f 62 6a 20 2a 6c 69 73 74 50 74   Tcl_Obj *listPt
ba10: 72 29 09 09 2f 2a 20 4c 69 73 74 20 6f 62 6a 65  r)../* List obje
ba20: 63 74 20 77 69 74 68 20 69 6e 74 65 72 6e 61 6c  ct with internal
ba30: 20 72 65 70 20 74 6f 20 66 72 65 65 2e 20 2a 2f   rep to free. */
ba40: 0a 7b 0a 20 20 20 20 4c 69 73 74 20 2a 6c 69 73  .{.    List *lis
ba50: 74 52 65 70 50 74 72 20 3d 20 4c 69 73 74 52 65  tRepPtr = ListRe
ba60: 70 50 74 72 28 6c 69 73 74 50 74 72 29 3b 0a 0a  pPtr(listPtr);..
ba70: 20 20 20 20 69 66 20 28 6c 69 73 74 52 65 70 50      if (listRepP
ba80: 74 72 2d 3e 72 65 66 43 6f 75 6e 74 2d 2d 20 3c  tr->refCount-- <
ba90: 3d 20 31 29 20 7b 0a 09 54 63 6c 5f 4f 62 6a 20  = 1) {..Tcl_Obj 
baa0: 2a 2a 65 6c 65 6d 50 74 72 73 20 3d 20 26 6c 69  **elemPtrs = &li
bab0: 73 74 52 65 70 50 74 72 2d 3e 65 6c 65 6d 65 6e  stRepPtr->elemen
bac0: 74 73 3b 0a 09 69 6e 74 20 69 2c 20 6e 75 6d 45  ts;..int i, numE
bad0: 6c 65 6d 73 20 3d 20 6c 69 73 74 52 65 70 50 74  lems = listRepPt
bae0: 72 2d 3e 65 6c 65 6d 43 6f 75 6e 74 3b 0a 0a 09  r->elemCount;...
baf0: 66 6f 72 20 28 69 20 3d 20 30 3b 20 20 69 20 3c  for (i = 0;  i <
bb00: 20 6e 75 6d 45 6c 65 6d 73 3b 20 20 69 2b 2b 29   numElems;  i++)
bb10: 20 7b 0a 09 20 20 20 20 54 63 6c 5f 44 65 63 72   {..    Tcl_Decr
bb20: 52 65 66 43 6f 75 6e 74 28 65 6c 65 6d 50 74 72  RefCount(elemPtr
bb30: 73 5b 69 5d 29 3b 0a 09 7d 0a 09 63 6b 66 72 65  s[i]);..}..ckfre
bb40: 65 28 6c 69 73 74 52 65 70 50 74 72 29 3b 0a 20  e(listRepPtr);. 
bb50: 20 20 20 7d 0a 0a 20 20 20 20 6c 69 73 74 50 74     }..    listPt
bb60: 72 2d 3e 74 79 70 65 50 74 72 20 3d 20 4e 55 4c  r->typePtr = NUL
bb70: 4c 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d  L;.}.../*. *----
bb80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bb90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bba0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bbb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bbc0: 2d 2d 0a 20 2a 0a 20 2a 20 44 75 70 4c 69 73 74  --. *. * DupList
bbd0: 49 6e 74 65 72 6e 61 6c 52 65 70 20 2d 2d 0a 20  InternalRep --. 
bbe0: 2a 0a 20 2a 09 49 6e 69 74 69 61 6c 69 7a 65 20  *. *.Initialize 
bbf0: 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 72 65 70  the internal rep
bc00: 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20 61  resentation of a
bc10: 20 6c 69 73 74 20 27 54 63 6c 5f 4f 62 6a 27 20   list 'Tcl_Obj' 
bc20: 74 6f 20 73 68 61 72 65 20 74 68 65 0a 20 2a 09  to share the. *.
bc30: 69 6e 74 65 72 6e 61 6c 20 72 65 70 72 65 73 65  internal represe
bc40: 6e 74 61 74 69 6f 6e 20 6f 66 20 61 6e 20 65 78  ntation of an ex
bc50: 69 73 74 69 6e 67 20 6c 69 73 74 20 6f 62 6a 65  isting list obje
bc60: 63 74 2e 0a 20 2a 0a 20 2a 20 45 66 66 65 63 74  ct.. *. * Effect
bc70: 0a 20 2a 0a 20 2a 09 54 68 65 20 27 72 65 66 43  . *. *.The 'refC
bc80: 6f 75 6e 74 27 20 6f 66 20 74 68 65 20 4c 69 73  ount' of the Lis
bc90: 74 20 69 6e 74 65 72 6e 61 6c 20 72 65 70 20 69  t internal rep i
bca0: 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 2e 0a 20  s incremented.. 
bcb0: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
bcc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bcd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bce0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bcf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a  ----------. */..
bd00: 73 74 61 74 69 63 20 76 6f 69 64 0a 44 75 70 4c  static void.DupL
bd10: 69 73 74 49 6e 74 65 72 6e 61 6c 52 65 70 28 0a  istInternalRep(.
bd20: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 73 72 63      Tcl_Obj *src
bd30: 50 74 72 2c 09 09 2f 2a 20 4f 62 6a 65 63 74 20  Ptr,../* Object 
bd40: 77 69 74 68 20 69 6e 74 65 72 6e 61 6c 20 72 65  with internal re
bd50: 70 20 74 6f 20 63 6f 70 79 2e 20 2a 2f 0a 20 20  p to copy. */.  
bd60: 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 70 79 50    Tcl_Obj *copyP
bd70: 74 72 29 09 09 2f 2a 20 4f 62 6a 65 63 74 20 77  tr)../* Object w
bd80: 69 74 68 20 69 6e 74 65 72 6e 61 6c 20 72 65 70  ith internal rep
bd90: 20 74 6f 20 73 65 74 2e 20 2a 2f 0a 7b 0a 20 20   to set. */.{.  
bda0: 20 20 4c 69 73 74 20 2a 6c 69 73 74 52 65 70 50    List *listRepP
bdb0: 74 72 20 3d 20 4c 69 73 74 52 65 70 50 74 72 28  tr = ListRepPtr(
bdc0: 73 72 63 50 74 72 29 3b 0a 0a 20 20 20 20 4c 69  srcPtr);..    Li
bdd0: 73 74 53 65 74 49 6e 74 52 65 70 28 63 6f 70 79  stSetIntRep(copy
bde0: 50 74 72 2c 20 6c 69 73 74 52 65 70 50 74 72 29  Ptr, listRepPtr)
bdf0: 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d  ;.}.../*. *-----
be00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
be10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
be20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
be30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
be40: 2d 0a 20 2a 0a 20 2a 20 53 65 74 4c 69 73 74 46  -. *. * SetListF
be50: 72 6f 6d 41 6e 79 20 2d 2d 0a 20 2a 0a 20 2a 09  romAny --. *. *.
be60: 43 6f 6e 76 65 72 74 20 61 6e 79 20 6f 62 6a 65  Convert any obje
be70: 63 74 20 74 6f 20 61 20 6c 69 73 74 2e 0a 20 2a  ct to a list.. *
be80: 0a 20 2a 20 56 61 6c 75 65 0a 20 2a 0a 20 2a 20  . * Value. *. * 
be90: 20 20 20 54 43 4c 5f 4f 4b 0a 20 2a 0a 20 2a 09     TCL_OK. *. *.
bea0: 53 75 63 63 65 73 73 2e 20 20 54 68 65 20 69 6e  Success.  The in
beb0: 74 65 72 6e 61 6c 20 72 65 70 72 65 73 65 6e 74  ternal represent
bec0: 61 74 69 6f 6e 20 6f 66 20 27 6f 62 6a 50 74 72  ation of 'objPtr
bed0: 27 20 69 73 20 73 65 74 2c 20 61 6e 64 20 74 68  ' is set, and th
bee0: 65 20 74 79 70 65 0a 20 2a 09 6f 66 20 27 6f 62  e type. *.of 'ob
bef0: 6a 50 74 72 27 20 69 73 20 27 74 63 6c 4c 69 73  jPtr' is 'tclLis
bf00: 74 54 79 70 65 27 2e 0a 20 2a 0a 20 2a 20 20 20  tType'.. *. *   
bf10: 20 54 43 4c 5f 45 52 52 4f 52 0a 20 2a 0a 20 2a   TCL_ERROR. *. *
bf20: 09 41 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 65  .An error occure
bf30: 64 20 64 75 72 69 6e 67 20 63 6f 6e 76 65 72 73  d during convers
bf40: 69 6f 6e 2e 20 41 6e 20 65 72 72 6f 72 20 6d 65  ion. An error me
bf50: 73 73 61 67 65 20 69 73 20 6c 65 66 74 20 69 6e  ssage is left in
bf60: 20 74 68 65 0a 20 2a 09 69 6e 74 65 72 70 72 65   the. *.interpre
bf70: 74 65 72 27 73 20 72 65 73 75 6c 74 20 69 66 20  ter's result if 
bf80: 27 69 6e 74 65 72 70 27 20 69 73 20 6e 6f 74 20  'interp' is not 
bf90: 4e 55 4c 4c 2e 0a 20 2a 0a 20 2a 0a 20 2a 2d 2d  NULL.. *. *. *--
bfa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bfb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bfc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bfd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bfe0: 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74 69 63  ----. */..static
bff0: 20 69 6e 74 0a 53 65 74 4c 69 73 74 46 72 6f 6d   int.SetListFrom
c000: 41 6e 79 28 0a 20 20 20 20 54 63 6c 5f 49 6e 74  Any(.    Tcl_Int
c010: 65 72 70 20 2a 69 6e 74 65 72 70 2c 09 09 2f 2a  erp *interp,../*
c020: 20 55 73 65 64 20 66 6f 72 20 65 72 72 6f 72 20   Used for error 
c030: 72 65 70 6f 72 74 69 6e 67 20 69 66 20 6e 6f 74  reporting if not
c040: 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 20 20 54 63   NULL. */.    Tc
c050: 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 29 09 09  l_Obj *objPtr)..
c060: 2f 2a 20 54 68 65 20 6f 62 6a 65 63 74 20 74 6f  /* The object to
c070: 20 63 6f 6e 76 65 72 74 2e 20 2a 2f 0a 7b 0a 20   convert. */.{. 
c080: 20 20 20 4c 69 73 74 20 2a 6c 69 73 74 52 65 70     List *listRep
c090: 50 74 72 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a  Ptr;.    Tcl_Obj
c0a0: 20 2a 2a 65 6c 65 6d 50 74 72 73 3b 0a 0a 20 20   **elemPtrs;..  
c0b0: 20 20 2f 2a 0a 20 20 20 20 20 2a 20 44 69 63 74    /*.     * Dict
c0c0: 69 6f 6e 61 72 69 65 73 20 61 72 65 20 61 20 73  ionaries are a s
c0d0: 70 65 63 69 61 6c 20 63 61 73 65 3b 20 74 68 65  pecial case; the
c0e0: 79 20 68 61 76 65 20 61 20 73 74 72 69 6e 67 20  y have a string 
c0f0: 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 73  representation s
c100: 75 63 68 0a 20 20 20 20 20 2a 20 74 68 61 74 20  uch.     * that 
c110: 2a 61 6c 6c 2a 20 76 61 6c 69 64 20 64 69 63 74  *all* valid dict
c120: 69 6f 6e 61 72 69 65 73 20 61 72 65 20 76 61 6c  ionaries are val
c130: 69 64 20 6c 69 73 74 73 2e 20 48 65 6e 63 65 20  id lists. Hence 
c140: 77 65 20 63 61 6e 20 63 6f 6e 76 65 72 74 0a 20  we can convert. 
c150: 20 20 20 20 2a 20 6d 6f 72 65 20 64 69 72 65 63      * more direc
c160: 74 6c 79 2e 20 4f 6e 6c 79 20 64 6f 20 74 68 69  tly. Only do thi
c170: 73 20 77 68 65 6e 20 74 68 65 72 65 27 73 20 6e  s when there's n
c180: 6f 20 65 78 69 73 74 69 6e 67 20 73 74 72 69 6e  o existing strin
c190: 67 20 72 65 70 3b 20 69 66 0a 20 20 20 20 20 2a  g rep; if.     *
c1a0: 20 74 68 65 72 65 20 69 73 2c 20 69 74 20 69 73   there is, it is
c1b0: 20 74 68 65 20 73 74 72 69 6e 67 20 72 65 70 20   the string rep 
c1c0: 74 68 61 74 27 73 20 61 75 74 68 6f 72 69 74 61  that's authorita
c1d0: 74 69 76 65 20 28 62 65 63 61 75 73 65 20 69 74  tive (because it
c1e0: 20 63 6f 75 6c 64 0a 20 20 20 20 20 2a 20 64 65   could.     * de
c1f0: 73 63 72 69 62 65 20 64 75 70 6c 69 63 61 74 65  scribe duplicate
c200: 20 6b 65 79 73 29 2e 0a 20 20 20 20 20 2a 2f 0a   keys)..     */.
c210: 0a 20 20 20 20 69 66 20 28 6f 62 6a 50 74 72 2d  .    if (objPtr-
c220: 3e 74 79 70 65 50 74 72 20 3d 3d 20 26 74 63 6c  >typePtr == &tcl
c230: 44 69 63 74 54 79 70 65 20 26 26 20 21 6f 62 6a  DictType && !obj
c240: 50 74 72 2d 3e 62 79 74 65 73 29 20 7b 0a 09 54  Ptr->bytes) {..T
c250: 63 6c 5f 4f 62 6a 20 2a 6b 65 79 50 74 72 2c 20  cl_Obj *keyPtr, 
c260: 2a 76 61 6c 75 65 50 74 72 3b 0a 09 54 63 6c 5f  *valuePtr;..Tcl_
c270: 44 69 63 74 53 65 61 72 63 68 20 73 65 61 72 63  DictSearch searc
c280: 68 3b 0a 09 69 6e 74 20 64 6f 6e 65 2c 20 73 69  h;..int done, si
c290: 7a 65 3b 0a 0a 09 2f 2a 0a 09 20 2a 20 43 72 65  ze;.../*.. * Cre
c2a0: 61 74 65 20 74 68 65 20 6e 65 77 20 6c 69 73 74  ate the new list
c2b0: 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 2e   representation.
c2c0: 20 4e 6f 74 65 20 74 68 61 74 20 77 65 20 64 6f   Note that we do
c2d0: 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 64 6f 0a   not need to do.
c2e0: 09 20 2a 20 61 6e 79 74 68 69 6e 67 20 77 69 74  . * anything wit
c2f0: 68 20 74 68 65 20 73 74 72 69 6e 67 20 72 65 70  h the string rep
c300: 72 65 73 65 6e 74 61 74 69 6f 6e 20 61 73 20 74  resentation as t
c310: 68 65 20 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f  he transformatio
c320: 6e 20 28 61 6e 64 0a 09 20 2a 20 74 68 65 20 72  n (and.. * the r
c330: 65 76 65 72 73 65 20 62 61 63 6b 20 74 6f 20 61  everse back to a
c340: 20 64 69 63 74 69 6f 6e 61 72 79 29 20 61 72 65   dictionary) are
c350: 20 62 6f 74 68 20 6f 72 64 65 72 2d 70 72 65 73   both order-pres
c360: 65 72 76 69 6e 67 2e 20 41 6c 73 6f 0a 09 20 2a  erving. Also.. *
c370: 20 6e 6f 74 65 20 74 68 61 74 20 73 69 6e 63 65   note that since
c380: 20 77 65 20 6b 6e 6f 77 20 77 65 27 76 65 20 67   we know we've g
c390: 6f 74 20 61 20 76 61 6c 69 64 20 64 69 63 74 69  ot a valid dicti
c3a0: 6f 6e 61 72 79 20 28 62 79 0a 09 20 2a 20 72 65  onary (by.. * re
c3b0: 70 72 65 73 65 6e 74 61 74 69 6f 6e 29 20 77 65  presentation) we
c3c0: 20 61 6c 73 6f 20 6b 6e 6f 77 20 74 68 61 74 20   also know that 
c3d0: 66 65 74 63 68 69 6e 67 20 74 68 65 20 73 69 7a  fetching the siz
c3e0: 65 20 6f 66 20 74 68 65 0a 09 20 2a 20 64 69 63  e of the.. * dic
c3f0: 74 69 6f 6e 61 72 79 20 6f 72 20 69 74 65 72 61  tionary or itera
c400: 74 69 6e 67 20 6f 76 65 72 20 69 74 20 77 69 6c  ting over it wil
c410: 6c 20 6e 6f 74 20 66 61 69 6c 2e 0a 09 20 2a 2f  l not fail... */
c420: 0a 0a 09 54 63 6c 5f 44 69 63 74 4f 62 6a 53 69  ...Tcl_DictObjSi
c430: 7a 65 28 4e 55 4c 4c 2c 20 6f 62 6a 50 74 72 2c  ze(NULL, objPtr,
c440: 20 26 73 69 7a 65 29 3b 0a 09 6c 69 73 74 52 65   &size);..listRe
c450: 70 50 74 72 20 3d 20 41 74 74 65 6d 70 74 4e 65  pPtr = AttemptNe
c460: 77 4c 69 73 74 28 69 6e 74 65 72 70 2c 20 73 69  wList(interp, si
c470: 7a 65 20 3e 20 30 20 3f 20 32 2a 73 69 7a 65 20  ze > 0 ? 2*size 
c480: 3a 20 31 2c 20 4e 55 4c 4c 29 3b 0a 09 69 66 20  : 1, NULL);..if 
c490: 28 21 6c 69 73 74 52 65 70 50 74 72 29 20 7b 0a  (!listRepPtr) {.
c4a0: 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f  .    return TCL_
c4b0: 45 52 52 4f 52 3b 0a 09 7d 0a 09 6c 69 73 74 52  ERROR;..}..listR
c4c0: 65 70 50 74 72 2d 3e 65 6c 65 6d 43 6f 75 6e 74  epPtr->elemCount
c4d0: 20 3d 20 32 20 2a 20 73 69 7a 65 3b 0a 0a 09 2f   = 2 * size;.../
c4e0: 2a 0a 09 20 2a 20 50 6f 70 75 6c 61 74 65 20 74  *.. * Populate t
c4f0: 68 65 20 6c 69 73 74 20 72 65 70 72 65 73 65 6e  he list represen
c500: 74 61 74 69 6f 6e 2e 0a 09 20 2a 2f 0a 0a 09 65  tation... */...e
c510: 6c 65 6d 50 74 72 73 20 3d 20 26 6c 69 73 74 52  lemPtrs = &listR
c520: 65 70 50 74 72 2d 3e 65 6c 65 6d 65 6e 74 73 3b  epPtr->elements;
c530: 0a 09 54 63 6c 5f 44 69 63 74 4f 62 6a 46 69 72  ..Tcl_DictObjFir
c540: 73 74 28 4e 55 4c 4c 2c 20 6f 62 6a 50 74 72 2c  st(NULL, objPtr,
c550: 20 26 73 65 61 72 63 68 2c 20 26 6b 65 79 50 74   &search, &keyPt
c560: 72 2c 20 26 76 61 6c 75 65 50 74 72 2c 20 26 64  r, &valuePtr, &d
c570: 6f 6e 65 29 3b 0a 09 77 68 69 6c 65 20 28 21 64  one);..while (!d
c580: 6f 6e 65 29 20 7b 0a 09 20 20 20 20 2a 65 6c 65  one) {..    *ele
c590: 6d 50 74 72 73 2b 2b 20 3d 20 6b 65 79 50 74 72  mPtrs++ = keyPtr
c5a0: 3b 0a 09 20 20 20 20 2a 65 6c 65 6d 50 74 72 73  ;..    *elemPtrs
c5b0: 2b 2b 20 3d 20 76 61 6c 75 65 50 74 72 3b 0a 09  ++ = valuePtr;..
c5c0: 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43      Tcl_IncrRefC
c5d0: 6f 75 6e 74 28 6b 65 79 50 74 72 29 3b 0a 09 20  ount(keyPtr);.. 
c5e0: 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f     Tcl_IncrRefCo
c5f0: 75 6e 74 28 76 61 6c 75 65 50 74 72 29 3b 0a 09  unt(valuePtr);..
c600: 20 20 20 20 54 63 6c 5f 44 69 63 74 4f 62 6a 4e      Tcl_DictObjN
c610: 65 78 74 28 26 73 65 61 72 63 68 2c 20 26 6b 65  ext(&search, &ke
c620: 79 50 74 72 2c 20 26 76 61 6c 75 65 50 74 72 2c  yPtr, &valuePtr,
c630: 20 26 64 6f 6e 65 29 3b 0a 09 7d 0a 20 20 20 20   &done);..}.    
c640: 7d 20 65 6c 73 65 20 7b 0a 09 69 6e 74 20 65 73  } else {..int es
c650: 74 43 6f 75 6e 74 2c 20 6c 65 6e 67 74 68 3b 0a  tCount, length;.
c660: 09 63 6f 6e 73 74 20 63 68 61 72 20 2a 6c 69 6d  .const char *lim
c670: 69 74 2c 20 2a 6e 65 78 74 45 6c 65 6d 20 3d 20  it, *nextElem = 
c680: 54 63 6c 47 65 74 53 74 72 69 6e 67 46 72 6f 6d  TclGetStringFrom
c690: 4f 62 6a 28 6f 62 6a 50 74 72 2c 20 26 6c 65 6e  Obj(objPtr, &len
c6a0: 67 74 68 29 3b 0a 0a 09 2f 2a 0a 09 20 2a 20 41  gth);.../*.. * A
c6b0: 6c 6c 6f 63 61 74 65 20 65 6e 6f 75 67 68 20 73  llocate enough s
c6c0: 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 61 20 28  pace to hold a (
c6d0: 54 63 6c 5f 4f 62 6a 20 2a 29 20 66 6f 72 20 65  Tcl_Obj *) for e
c6e0: 61 63 68 0a 09 20 2a 20 28 70 6f 73 73 69 62 6c  ach.. * (possibl
c6f0: 65 29 20 6c 69 73 74 20 65 6c 65 6d 65 6e 74 2e  e) list element.
c700: 0a 09 20 2a 2f 0a 0a 09 65 73 74 43 6f 75 6e 74  .. */...estCount
c710: 20 3d 20 54 63 6c 4d 61 78 4c 69 73 74 4c 65 6e   = TclMaxListLen
c720: 67 74 68 28 6e 65 78 74 45 6c 65 6d 2c 20 6c 65  gth(nextElem, le
c730: 6e 67 74 68 2c 20 26 6c 69 6d 69 74 29 3b 0a 09  ngth, &limit);..
c740: 65 73 74 43 6f 75 6e 74 20 2b 3d 20 28 65 73 74  estCount += (est
c750: 43 6f 75 6e 74 20 3d 3d 20 30 29 3b 09 2f 2a 20  Count == 0);./* 
c760: 53 6d 61 6c 6c 65 73 74 20 6c 69 73 74 20 73 74  Smallest list st
c770: 72 75 63 74 20 68 6f 6c 64 73 20 31 0a 09 09 09  ruct holds 1....
c780: 09 09 20 2a 20 65 6c 65 6d 65 6e 74 2e 20 2a 2f  .. * element. */
c790: 0a 09 6c 69 73 74 52 65 70 50 74 72 20 3d 20 41  ..listRepPtr = A
c7a0: 74 74 65 6d 70 74 4e 65 77 4c 69 73 74 28 69 6e  ttemptNewList(in
c7b0: 74 65 72 70 2c 20 65 73 74 43 6f 75 6e 74 2c 20  terp, estCount, 
c7c0: 4e 55 4c 4c 29 3b 0a 09 69 66 20 28 6c 69 73 74  NULL);..if (list
c7d0: 52 65 70 50 74 72 20 3d 3d 20 4e 55 4c 4c 29 20  RepPtr == NULL) 
c7e0: 7b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 54 43  {..    return TC
c7f0: 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 09 65 6c 65  L_ERROR;..}..ele
c800: 6d 50 74 72 73 20 3d 20 26 6c 69 73 74 52 65 70  mPtrs = &listRep
c810: 50 74 72 2d 3e 65 6c 65 6d 65 6e 74 73 3b 0a 0a  Ptr->elements;..
c820: 09 2f 2a 0a 09 20 2a 20 45 61 63 68 20 69 74 65  ./*.. * Each ite
c830: 72 61 74 69 6f 6e 2c 20 70 61 72 73 65 20 61 6e  ration, parse an
c840: 64 20 73 74 6f 72 65 20 61 20 6c 69 73 74 20 65  d store a list e
c850: 6c 65 6d 65 6e 74 2e 0a 09 20 2a 2f 0a 0a 09 77  lement... */...w
c860: 68 69 6c 65 20 28 6e 65 78 74 45 6c 65 6d 20 3c  hile (nextElem <
c870: 20 6c 69 6d 69 74 29 20 7b 0a 09 20 20 20 20 63   limit) {..    c
c880: 6f 6e 73 74 20 63 68 61 72 20 2a 65 6c 65 6d 53  onst char *elemS
c890: 74 61 72 74 3b 0a 09 20 20 20 20 69 6e 74 20 65  tart;..    int e
c8a0: 6c 65 6d 53 69 7a 65 2c 20 6c 69 74 65 72 61 6c  lemSize, literal
c8b0: 3b 0a 0a 09 20 20 20 20 69 66 20 28 54 43 4c 5f  ;...    if (TCL_
c8c0: 4f 4b 20 21 3d 20 54 63 6c 46 69 6e 64 45 6c 65  OK != TclFindEle
c8d0: 6d 65 6e 74 28 69 6e 74 65 72 70 2c 20 6e 65 78  ment(interp, nex
c8e0: 74 45 6c 65 6d 2c 20 6c 69 6d 69 74 20 2d 20 6e  tElem, limit - n
c8f0: 65 78 74 45 6c 65 6d 2c 0a 09 09 20 20 20 20 26  extElem,...    &
c900: 65 6c 65 6d 53 74 61 72 74 2c 20 26 6e 65 78 74  elemStart, &next
c910: 45 6c 65 6d 2c 20 26 65 6c 65 6d 53 69 7a 65 2c  Elem, &elemSize,
c920: 20 26 6c 69 74 65 72 61 6c 29 29 20 7b 0a 09 09   &literal)) {...
c930: 77 68 69 6c 65 20 28 2d 2d 65 6c 65 6d 50 74 72  while (--elemPtr
c940: 73 20 3e 3d 20 26 6c 69 73 74 52 65 70 50 74 72  s >= &listRepPtr
c950: 2d 3e 65 6c 65 6d 65 6e 74 73 29 20 7b 0a 09 09  ->elements) {...
c960: 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43      Tcl_DecrRefC
c970: 6f 75 6e 74 28 2a 65 6c 65 6d 50 74 72 73 29 3b  ount(*elemPtrs);
c980: 0a 09 09 7d 0a 09 09 63 6b 66 72 65 65 28 28 63  ...}...ckfree((c
c990: 68 61 72 20 2a 29 20 6c 69 73 74 52 65 70 50 74  har *) listRepPt
c9a0: 72 29 3b 0a 09 09 72 65 74 75 72 6e 20 54 43 4c  r);...return TCL
c9b0: 5f 45 52 52 4f 52 3b 0a 09 20 20 20 20 7d 0a 09  _ERROR;..    }..
c9c0: 20 20 20 20 69 66 20 28 65 6c 65 6d 53 74 61 72      if (elemStar
c9d0: 74 20 3d 3d 20 6c 69 6d 69 74 29 20 7b 0a 09 09  t == limit) {...
c9e0: 62 72 65 61 6b 3b 0a 09 20 20 20 20 7d 0a 0a 09  break;..    }...
c9f0: 20 20 20 20 2f 2a 20 54 4f 44 4f 3a 20 72 65 70      /* TODO: rep
ca00: 6c 61 63 65 20 70 61 6e 69 63 20 77 69 74 68 20  lace panic with 
ca10: 65 72 72 6f 72 20 6f 6e 20 61 6c 6c 6f 63 20 66  error on alloc f
ca20: 61 69 6c 75 72 65 3f 20 2a 2f 0a 09 20 20 20 20  ailure? */..    
ca30: 69 66 20 28 6c 69 74 65 72 61 6c 29 20 7b 0a 09  if (literal) {..
ca40: 09 54 63 6c 4e 65 77 53 74 72 69 6e 67 4f 62 6a  .TclNewStringObj
ca50: 28 2a 65 6c 65 6d 50 74 72 73 2c 20 65 6c 65 6d  (*elemPtrs, elem
ca60: 53 74 61 72 74 2c 20 65 6c 65 6d 53 69 7a 65 29  Start, elemSize)
ca70: 3b 0a 09 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  ;..    } else {.
ca80: 09 09 54 63 6c 4e 65 77 4f 62 6a 28 2a 65 6c 65  ..TclNewObj(*ele
ca90: 6d 50 74 72 73 29 3b 0a 09 09 28 2a 65 6c 65 6d  mPtrs);...(*elem
caa0: 50 74 72 73 29 2d 3e 62 79 74 65 73 20 3d 20 63  Ptrs)->bytes = c
cab0: 6b 61 6c 6c 6f 63 28 28 75 6e 73 69 67 6e 65 64  kalloc((unsigned
cac0: 29 20 65 6c 65 6d 53 69 7a 65 20 2b 20 31 29 3b  ) elemSize + 1);
cad0: 0a 09 09 28 2a 65 6c 65 6d 50 74 72 73 29 2d 3e  ...(*elemPtrs)->
cae0: 6c 65 6e 67 74 68 20 3d 20 54 63 6c 43 6f 70 79  length = TclCopy
caf0: 41 6e 64 43 6f 6c 6c 61 70 73 65 28 65 6c 65 6d  AndCollapse(elem
cb00: 53 69 7a 65 2c 20 65 6c 65 6d 53 74 61 72 74 2c  Size, elemStart,
cb10: 0a 09 09 09 28 2a 65 6c 65 6d 50 74 72 73 29 2d  ....(*elemPtrs)-
cb20: 3e 62 79 74 65 73 29 3b 0a 09 20 20 20 20 7d 0a  >bytes);..    }.
cb30: 0a 09 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65  ..    Tcl_IncrRe
cb40: 66 43 6f 75 6e 74 28 2a 65 6c 65 6d 50 74 72 73  fCount(*elemPtrs
cb50: 2b 2b 29 3b 2f 2a 20 53 69 6e 63 65 20 6c 69 73  ++);/* Since lis
cb60: 74 20 6e 6f 77 20 68 6f 6c 64 73 20 72 65 66 20  t now holds ref 
cb70: 74 6f 20 69 74 2e 20 2a 2f 0a 09 7d 0a 0a 20 09  to it. */..}.. .
cb80: 6c 69 73 74 52 65 70 50 74 72 2d 3e 65 6c 65 6d  listRepPtr->elem
cb90: 43 6f 75 6e 74 20 3d 20 65 6c 65 6d 50 74 72 73  Count = elemPtrs
cba0: 20 2d 20 26 6c 69 73 74 52 65 70 50 74 72 2d 3e   - &listRepPtr->
cbb0: 65 6c 65 6d 65 6e 74 73 3b 0a 20 20 20 20 7d 0a  elements;.    }.
cbc0: 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 46  .    /*.     * F
cbd0: 72 65 65 20 74 68 65 20 6f 6c 64 20 69 6e 74 65  ree the old inte
cbe0: 72 6e 61 6c 52 65 70 20 62 65 66 6f 72 65 20 73  rnalRep before s
cbf0: 65 74 74 69 6e 67 20 74 68 65 20 6e 65 77 20 6f  etting the new o
cc00: 6e 65 2e 20 57 65 20 64 6f 20 74 68 69 73 20 61  ne. We do this a
cc10: 73 20 6c 61 74 65 0a 20 20 20 20 20 2a 20 61 73  s late.     * as
cc20: 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 61 6c 6c   possible to all
cc30: 6f 77 20 74 68 65 20 63 6f 6e 76 65 72 73 69 6f  ow the conversio
cc40: 6e 20 63 6f 64 65 2c 20 69 6e 20 70 61 72 74 69  n code, in parti
cc50: 63 75 6c 61 72 0a 20 20 20 20 20 2a 20 54 63 6c  cular.     * Tcl
cc60: 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62  _GetStringFromOb
cc70: 6a 2c 20 74 6f 20 75 73 65 20 74 68 61 74 20 6f  j, to use that o
cc80: 6c 64 20 69 6e 74 65 72 6e 61 6c 52 65 70 2e 0a  ld internalRep..
cc90: 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 54 63 6c       */..    Tcl
cca0: 46 72 65 65 49 6e 74 52 65 70 28 6f 62 6a 50 74  FreeIntRep(objPt
ccb0: 72 29 3b 0a 20 20 20 20 4c 69 73 74 53 65 74 49  r);.    ListSetI
ccc0: 6e 74 52 65 70 28 6f 62 6a 50 74 72 2c 20 6c 69  ntRep(objPtr, li
ccd0: 73 74 52 65 70 50 74 72 29 3b 0a 20 20 20 20 72  stRepPtr);.    r
cce0: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
ccf0: 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  ../*. *---------
cd00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cd10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cd20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cd30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
cd40: 0a 20 2a 20 55 70 64 61 74 65 53 74 72 69 6e 67  . * UpdateString
cd50: 4f 66 4c 69 73 74 20 2d 2d 0a 20 2a 0a 20 2a 09  OfList --. *. *.
cd60: 55 70 64 61 74 65 20 74 68 65 20 73 74 72 69 6e  Update the strin
cd70: 67 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  g representation
cd80: 20 66 6f 72 20 61 20 6c 69 73 74 20 6f 62 6a 65   for a list obje
cd90: 63 74 2e 0a 20 2a 0a 20 2a 09 41 6e 79 20 70 72  ct.. *. *.Any pr
cda0: 65 76 69 6f 75 73 6c 79 2d 65 78 69 73 69 6e 67  eviously-exising
cdb0: 20 73 74 72 69 6e 67 20 72 65 70 72 65 73 65 6e   string represen
cdc0: 74 61 74 69 6f 6e 20 69 73 20 6e 6f 74 20 69 6e  tation is not in
cdd0: 76 61 6c 69 64 61 74 65 64 2c 20 73 6f 0a 20 2a  validated, so. *
cde0: 09 73 74 6f 72 61 67 65 20 69 73 20 6c 6f 73 74  .storage is lost
cdf0: 20 69 66 20 74 68 69 73 20 68 61 73 20 6e 6f 74   if this has not
ce00: 20 62 65 65 6e 20 74 61 6b 65 6e 20 63 61 72 65   been taken care
ce10: 20 6f 66 2e 0a 20 2a 0a 20 2a 20 45 66 66 65 63   of.. *. * Effec
ce20: 74 0a 20 2a 0a 20 2a 09 54 68 65 20 73 74 72 69  t. *. *.The stri
ce30: 6e 67 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  ng representatio
ce40: 6e 20 6f 66 20 27 6c 69 73 74 50 74 72 27 20 69  n of 'listPtr' i
ce50: 73 20 73 65 74 20 74 6f 20 74 68 65 20 72 65 73  s set to the res
ce60: 75 6c 74 69 6e 67 20 73 74 72 69 6e 67 2e 0a 20  ulting string.. 
ce70: 2a 09 54 68 69 73 20 73 74 72 69 6e 67 20 77 69  *.This string wi
ce80: 6c 6c 20 62 65 20 65 6d 70 74 79 20 69 66 20 74  ll be empty if t
ce90: 68 65 20 6c 69 73 74 20 68 61 73 20 6e 6f 20 65  he list has no e
cea0: 6c 65 6d 65 6e 74 73 2e 20 49 74 20 69 73 20 61  lements. It is a
ceb0: 73 73 75 6d 65 64 0a 20 2a 09 74 68 61 74 20 74  ssumed. *.that t
cec0: 68 65 20 6c 69 73 74 20 69 6e 74 65 72 6e 61 6c  he list internal
ced0: 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20   representation 
cee0: 69 73 20 6e 6f 74 20 4e 55 4c 4c 2e 0a 20 2a 0a  is not NULL.. *.
cef0: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
cf00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cf10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cf20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
cf30: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74  --------. */..st
cf40: 61 74 69 63 20 76 6f 69 64 0a 55 70 64 61 74 65  atic void.Update
cf50: 53 74 72 69 6e 67 4f 66 4c 69 73 74 28 0a 20 20  StringOfList(.  
cf60: 20 20 54 63 6c 5f 4f 62 6a 20 2a 6c 69 73 74 50    Tcl_Obj *listP
cf70: 74 72 29 09 09 2f 2a 20 4c 69 73 74 20 6f 62 6a  tr)../* List obj
cf80: 65 63 74 20 77 69 74 68 20 73 74 72 69 6e 67 20  ect with string 
cf90: 72 65 70 20 74 6f 20 75 70 64 61 74 65 2e 20 2a  rep to update. *
cfa0: 2f 0a 7b 0a 23 20 20 20 64 65 66 69 6e 65 20 4c  /.{.#   define L
cfb0: 4f 43 41 4c 5f 53 49 5a 45 20 36 34 0a 20 20 20  OCAL_SIZE 64.   
cfc0: 20 63 68 61 72 20 6c 6f 63 61 6c 46 6c 61 67 73   char localFlags
cfd0: 5b 4c 4f 43 41 4c 5f 53 49 5a 45 5d 2c 20 2a 66  [LOCAL_SIZE], *f
cfe0: 6c 61 67 50 74 72 20 3d 20 4e 55 4c 4c 3b 0a 20  lagPtr = NULL;. 
cff0: 20 20 20 4c 69 73 74 20 2a 6c 69 73 74 52 65 70     List *listRep
d000: 50 74 72 20 3d 20 4c 69 73 74 52 65 70 50 74 72  Ptr = ListRepPtr
d010: 28 6c 69 73 74 50 74 72 29 3b 0a 20 20 20 20 69  (listPtr);.    i
d020: 6e 74 20 6e 75 6d 45 6c 65 6d 73 20 3d 20 6c 69  nt numElems = li
d030: 73 74 52 65 70 50 74 72 2d 3e 65 6c 65 6d 43 6f  stRepPtr->elemCo
d040: 75 6e 74 3b 0a 20 20 20 20 69 6e 74 20 69 2c 20  unt;.    int i, 
d050: 6c 65 6e 67 74 68 2c 20 62 79 74 65 73 4e 65 65  length, bytesNee
d060: 64 65 64 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e  ded = 0;.    con
d070: 73 74 20 63 68 61 72 20 2a 65 6c 65 6d 3b 0a 20  st char *elem;. 
d080: 20 20 20 63 68 61 72 20 2a 64 73 74 3b 0a 20 20     char *dst;.  
d090: 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a 65 6c 65 6d    Tcl_Obj **elem
d0a0: 50 74 72 73 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20  Ptrs;..    /*.  
d0b0: 20 20 20 2a 20 4d 61 72 6b 20 74 68 65 20 6c 69     * Mark the li
d0c0: 73 74 20 61 73 20 62 65 69 6e 67 20 63 61 6e 6f  st as being cano
d0d0: 6e 69 63 61 6c 3b 20 61 6c 74 68 6f 75 67 68 20  nical; although 
d0e0: 69 74 20 77 69 6c 6c 20 6e 6f 77 20 68 61 76 65  it will now have
d0f0: 20 61 20 73 74 72 69 6e 67 0a 20 20 20 20 20 2a   a string.     *
d100: 20 72 65 70 2c 20 69 74 20 69 73 20 6f 6e 65 20   rep, it is one 
d110: 77 65 20 64 65 72 69 76 65 64 20 74 68 72 6f 75  we derived throu
d120: 67 68 20 70 72 6f 70 65 72 20 22 63 61 6e 6f 6e  gh proper "canon
d130: 69 63 61 6c 22 20 71 75 6f 74 69 6e 67 20 61 6e  ical" quoting an
d140: 64 20 73 6f 0a 20 20 20 20 20 2a 20 69 74 27 73  d so.     * it's
d150: 20 6b 6e 6f 77 6e 20 74 6f 20 62 65 20 66 72 65   known to be fre
d160: 65 20 66 72 6f 6d 20 6e 61 73 74 69 65 73 20 72  e from nasties r
d170: 65 6c 61 74 69 6e 67 20 74 6f 20 5b 63 6f 6e 63  elating to [conc
d180: 61 74 5d 20 61 6e 64 20 5b 65 76 61 6c 5d 2e 0a  at] and [eval]..
d190: 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 6c 69 73       */..    lis
d1a0: 74 52 65 70 50 74 72 2d 3e 63 61 6e 6f 6e 69 63  tRepPtr->canonic
d1b0: 61 6c 46 6c 61 67 20 3d 20 31 3b 0a 0a 20 20 20  alFlag = 1;..   
d1c0: 20 2f 2a 0a 20 20 20 20 20 2a 20 48 61 6e 64 6c   /*.     * Handl
d1d0: 65 20 65 6d 70 74 79 20 6c 69 73 74 20 63 61 73  e empty list cas
d1e0: 65 20 66 69 72 73 74 2c 20 73 6f 20 72 65 73 74  e first, so rest
d1f0: 20 6f 66 20 74 68 65 20 72 6f 75 74 69 6e 65 20   of the routine 
d200: 69 73 20 73 69 6d 70 6c 65 72 2e 0a 20 20 20 20  is simpler..    
d210: 20 2a 2f 0a 0a 20 20 20 20 69 66 20 28 6e 75 6d   */..    if (num
d220: 45 6c 65 6d 73 20 3d 3d 20 30 29 20 7b 0a 09 6c  Elems == 0) {..l
d230: 69 73 74 50 74 72 2d 3e 62 79 74 65 73 20 3d 20  istPtr->bytes = 
d240: 74 63 6c 45 6d 70 74 79 53 74 72 69 6e 67 52 65  tclEmptyStringRe
d250: 70 3b 0a 09 6c 69 73 74 50 74 72 2d 3e 6c 65 6e  p;..listPtr->len
d260: 67 74 68 20 3d 20 30 3b 0a 09 72 65 74 75 72 6e  gth = 0;..return
d270: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a  ;.    }..    /*.
d280: 20 20 20 20 20 2a 20 50 61 73 73 20 31 3a 20 65       * Pass 1: e
d290: 73 74 69 6d 61 74 65 20 73 70 61 63 65 2c 20 67  stimate space, g
d2a0: 61 74 68 65 72 20 66 6c 61 67 73 2e 0a 20 20 20  ather flags..   
d2b0: 20 20 2a 2f 0a 0a 20 20 20 20 69 66 20 28 6e 75    */..    if (nu
d2c0: 6d 45 6c 65 6d 73 20 3c 3d 20 4c 4f 43 41 4c 5f  mElems <= LOCAL_
d2d0: 53 49 5a 45 29 20 7b 0a 09 66 6c 61 67 50 74 72  SIZE) {..flagPtr
d2e0: 20 3d 20 6c 6f 63 61 6c 46 6c 61 67 73 3b 0a 20   = localFlags;. 
d2f0: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 2f 2a 0a     } else {../*.
d300: 09 20 2a 20 57 65 20 6b 6e 6f 77 20 6e 75 6d 45  . * We know numE
d310: 6c 65 6d 73 20 3c 3d 20 4c 49 53 54 5f 4d 41 58  lems <= LIST_MAX
d320: 2c 20 73 6f 20 74 68 69 73 20 69 73 20 73 61 66  , so this is saf
d330: 65 2e 0a 09 20 2a 2f 0a 0a 09 66 6c 61 67 50 74  e... */...flagPt
d340: 72 20 3d 20 63 6b 61 6c 6c 6f 63 28 6e 75 6d 45  r = ckalloc(numE
d350: 6c 65 6d 73 29 3b 0a 20 20 20 20 7d 0a 20 20 20  lems);.    }.   
d360: 20 65 6c 65 6d 50 74 72 73 20 3d 20 26 6c 69 73   elemPtrs = &lis
d370: 74 52 65 70 50 74 72 2d 3e 65 6c 65 6d 65 6e 74  tRepPtr->element
d380: 73 3b 0a 20 20 20 20 66 6f 72 20 28 69 20 3d 20  s;.    for (i = 
d390: 30 3b 20 69 20 3c 20 6e 75 6d 45 6c 65 6d 73 3b  0; i < numElems;
d3a0: 20 69 2b 2b 29 20 7b 0a 09 66 6c 61 67 50 74 72   i++) {..flagPtr
d3b0: 5b 69 5d 20 3d 20 28 69 20 3f 20 54 43 4c 5f 44  [i] = (i ? TCL_D
d3c0: 4f 4e 54 5f 51 55 4f 54 45 5f 48 41 53 48 20 3a  ONT_QUOTE_HASH :
d3d0: 20 30 29 3b 0a 09 65 6c 65 6d 20 3d 20 54 63 6c   0);..elem = Tcl
d3e0: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
d3f0: 28 65 6c 65 6d 50 74 72 73 5b 69 5d 2c 20 26 6c  (elemPtrs[i], &l
d400: 65 6e 67 74 68 29 3b 0a 09 62 79 74 65 73 4e 65  ength);..bytesNe
d410: 65 64 65 64 20 2b 3d 20 54 63 6c 53 63 61 6e 45  eded += TclScanE
d420: 6c 65 6d 65 6e 74 28 65 6c 65 6d 2c 20 6c 65 6e  lement(elem, len
d430: 67 74 68 2c 20 66 6c 61 67 50 74 72 2b 69 29 3b  gth, flagPtr+i);
d440: 0a 09 69 66 20 28 62 79 74 65 73 4e 65 65 64 65  ..if (bytesNeede
d450: 64 20 3c 20 30 29 20 7b 0a 09 20 20 20 20 54 63  d < 0) {..    Tc
d460: 6c 5f 50 61 6e 69 63 28 22 6d 61 78 20 73 69 7a  l_Panic("max siz
d470: 65 20 66 6f 72 20 61 20 54 63 6c 20 76 61 6c 75  e for a Tcl valu
d480: 65 20 28 25 64 20 62 79 74 65 73 29 20 65 78 63  e (%d bytes) exc
d490: 65 65 64 65 64 22 2c 20 49 4e 54 5f 4d 41 58 29  eeded", INT_MAX)
d4a0: 3b 0a 09 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69  ;..}.    }.    i
d4b0: 66 20 28 62 79 74 65 73 4e 65 65 64 65 64 20 3e  f (bytesNeeded >
d4c0: 20 49 4e 54 5f 4d 41 58 20 2d 20 6e 75 6d 45 6c   INT_MAX - numEl
d4d0: 65 6d 73 20 2b 20 31 29 20 7b 0a 09 54 63 6c 5f  ems + 1) {..Tcl_
d4e0: 50 61 6e 69 63 28 22 6d 61 78 20 73 69 7a 65 20  Panic("max size 
d4f0: 66 6f 72 20 61 20 54 63 6c 20 76 61 6c 75 65 20  for a Tcl value 
d500: 28 25 64 20 62 79 74 65 73 29 20 65 78 63 65 65  (%d bytes) excee
d510: 64 65 64 22 2c 20 49 4e 54 5f 4d 41 58 29 3b 0a  ded", INT_MAX);.
d520: 20 20 20 20 7d 0a 20 20 20 20 62 79 74 65 73 4e      }.    bytesN
d530: 65 65 64 65 64 20 2b 3d 20 6e 75 6d 45 6c 65 6d  eeded += numElem
d540: 73 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20  s;..    /*.     
d550: 2a 20 50 61 73 73 20 32 3a 20 63 6f 70 79 20 69  * Pass 2: copy i
d560: 6e 74 6f 20 73 74 72 69 6e 67 20 72 65 70 20 62  nto string rep b
d570: 75 66 66 65 72 2e 0a 20 20 20 20 20 2a 2f 0a 0a  uffer..     */..
d580: 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 57 65      /*.     * We
d590: 20 75 73 65 64 20 74 6f 20 73 65 74 20 74 68 65   used to set the
d5a0: 20 73 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 68   string length h
d5b0: 65 72 65 2c 20 72 65 6c 79 69 6e 67 20 6f 6e 20  ere, relying on 
d5c0: 61 20 70 72 65 73 75 6d 65 64 0a 20 20 20 20 20  a presumed.     
d5d0: 2a 20 67 75 61 72 61 6e 74 65 65 20 74 68 61 74  * guarantee that
d5e0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
d5f0: 79 74 65 73 20 54 63 6c 53 63 61 6e 45 6c 65 6d  ytes TclScanElem
d600: 65 6e 74 28 29 20 63 61 6c 6c 73 20 72 65 70 6f  ent() calls repo
d610: 72 74 65 64 0a 20 20 20 20 20 2a 20 74 6f 20 62  rted.     * to b
d620: 65 20 6e 65 65 64 65 64 20 77 61 73 20 61 20 70  e needed was a p
d630: 72 65 63 69 73 65 20 63 6f 75 6e 74 20 61 6e 64  recise count and
d640: 20 6e 6f 74 20 61 6e 20 6f 76 65 72 2d 65 73 74   not an over-est
d650: 69 6d 61 74 65 2c 20 73 6f 20 6c 6f 6e 67 0a 20  imate, so long. 
d660: 20 20 20 20 2a 20 61 73 20 74 68 65 20 73 61 6d      * as the sam
d670: 65 20 66 6c 61 67 20 76 61 6c 75 65 73 20 77 65  e flag values we
d680: 72 65 20 70 61 73 73 65 64 20 74 6f 20 54 63 6c  re passed to Tcl
d690: 43 6f 6e 76 65 72 74 45 6c 65 6d 65 6e 74 28 29  ConvertElement()
d6a0: 2e 0a 20 20 20 20 20 2a 0a 20 20 20 20 20 2a 20  ..     *.     * 
d6b0: 54 68 65 6e 20 77 65 20 73 61 77 20 5b 33 35 61  Then we saw [35a
d6c0: 38 66 31 63 30 34 61 5d 2c 20 77 68 65 72 65 20  8f1c04a], where 
d6d0: 61 20 62 75 67 20 69 6e 20 54 63 6c 53 63 61 6e  a bug in TclScan
d6e0: 45 6c 65 6d 65 6e 74 28 29 20 63 61 75 73 65 64  Element() caused
d6f0: 0a 20 20 20 20 20 2a 20 74 68 61 74 20 67 75 61  .     * that gua
d700: 72 61 6e 74 65 65 20 74 6f 20 66 61 69 6c 2e 20  rantee to fail. 
d710: 52 61 74 68 65 72 20 74 68 61 6e 20 74 72 75 73  Rather than trus
d720: 74 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6d  t there are no m
d730: 6f 72 65 20 62 75 67 73 2c 0a 20 20 20 20 20 2a  ore bugs,.     *
d740: 20 77 65 20 73 65 74 20 74 68 65 20 6c 65 6e 67   we set the leng
d750: 74 68 20 61 66 74 65 72 20 74 68 65 20 6c 6f 6f  th after the loo
d760: 70 20 62 61 73 65 64 20 6f 6e 20 77 68 61 74 20  p based on what 
d770: 77 61 73 20 61 63 74 75 61 6c 6c 79 20 77 72 69  was actually wri
d780: 74 74 65 6e 2c 0a 20 20 20 20 20 2a 20 61 6e 20  tten,.     * an 
d790: 6e 6f 74 20 6f 6e 20 77 68 61 74 20 77 61 73 20  not on what was 
d7a0: 70 72 65 64 69 63 74 65 64 2e 0a 20 20 20 20 20  predicted..     
d7b0: 2a 0a 20 20 20 20 6c 69 73 74 50 74 72 2d 3e 6c  *.    listPtr->l
d7c0: 65 6e 67 74 68 20 3d 20 62 79 74 65 73 4e 65 65  ength = bytesNee
d7d0: 64 65 64 20 2d 20 31 3b 0a 20 20 20 20 20 2a 0a  ded - 1;.     *.
d7e0: 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 6c 69 73       */..    lis
d7f0: 74 50 74 72 2d 3e 62 79 74 65 73 20 3d 20 63 6b  tPtr->bytes = ck
d800: 61 6c 6c 6f 63 28 62 79 74 65 73 4e 65 65 64 65  alloc(bytesNeede
d810: 64 29 3b 0a 20 20 20 20 64 73 74 20 3d 20 6c 69  d);.    dst = li
d820: 73 74 50 74 72 2d 3e 62 79 74 65 73 3b 0a 20 20  stPtr->bytes;.  
d830: 20 20 66 6f 72 20 28 69 20 3d 20 30 3b 20 69 20    for (i = 0; i 
d840: 3c 20 6e 75 6d 45 6c 65 6d 73 3b 20 69 2b 2b 29  < numElems; i++)
d850: 20 7b 0a 09 66 6c 61 67 50 74 72 5b 69 5d 20 7c   {..flagPtr[i] |
d860: 3d 20 28 69 20 3f 20 54 43 4c 5f 44 4f 4e 54 5f  = (i ? TCL_DONT_
d870: 51 55 4f 54 45 5f 48 41 53 48 20 3a 20 30 29 3b  QUOTE_HASH : 0);
d880: 0a 09 65 6c 65 6d 20 3d 20 54 63 6c 47 65 74 53  ..elem = TclGetS
d890: 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 65 6c 65  tringFromObj(ele
d8a0: 6d 50 74 72 73 5b 69 5d 2c 20 26 6c 65 6e 67 74  mPtrs[i], &lengt
d8b0: 68 29 3b 0a 09 64 73 74 20 2b 3d 20 54 63 6c 43  h);..dst += TclC
d8c0: 6f 6e 76 65 72 74 45 6c 65 6d 65 6e 74 28 65 6c  onvertElement(el
d8d0: 65 6d 2c 20 6c 65 6e 67 74 68 2c 20 64 73 74 2c  em, length, dst,
d8e0: 20 66 6c 61 67 50 74 72 5b 69 5d 29 3b 0a 09 2a   flagPtr[i]);..*
d8f0: 64 73 74 2b 2b 20 3d 20 27 20 27 3b 0a 20 20 20  dst++ = ' ';.   
d900: 20 7d 0a 20 20 20 20 64 73 74 5b 2d 31 5d 20 3d   }.    dst[-1] =
d910: 20 27 5c 30 27 3b 0a 0a 20 20 20 20 2f 2a 20 48   '\0';..    /* H
d920: 65 72 65 20 69 73 20 74 68 65 20 73 61 66 65 20  ere is the safe 
d930: 73 65 74 74 69 6e 67 20 6f 66 20 74 68 65 20 73  setting of the s
d940: 74 72 69 6e 67 20 6c 65 6e 67 74 68 2e 20 2a 2f  tring length. */
d950: 0a 20 20 20 20 6c 69 73 74 50 74 72 2d 3e 6c 65  .    listPtr->le
d960: 6e 67 74 68 20 3d 20 64 73 74 20 2d 20 31 20 2d  ngth = dst - 1 -
d970: 20 6c 69 73 74 50 74 72 2d 3e 62 79 74 65 73 3b   listPtr->bytes;
d980: 0a 0a 20 20 20 20 69 66 20 28 66 6c 61 67 50 74  ..    if (flagPt
d990: 72 20 21 3d 20 6c 6f 63 61 6c 46 6c 61 67 73 29  r != localFlags)
d9a0: 20 7b 0a 09 63 6b 66 72 65 65 28 66 6c 61 67 50   {..ckfree(flagP
d9b0: 74 72 29 3b 0a 20 20 20 20 7d 0a 7d 0a 0c 0a 2f  tr);.    }.}.../
d9c0: 2a 0a 20 2a 20 4c 6f 63 61 6c 20 56 61 72 69 61  *. * Local Varia
d9d0: 62 6c 65 73 3a 0a 20 2a 20 6d 6f 64 65 3a 20 63  bles:. * mode: c
d9e0: 0a 20 2a 20 63 2d 62 61 73 69 63 2d 6f 66 66 73  . * c-basic-offs
d9f0: 65 74 3a 20 34 0a 20 2a 20 66 69 6c 6c 2d 63 6f  et: 4. * fill-co
da00: 6c 75 6d 6e 3a 20 37 38 0a 20 2a 20 45 6e 64 3a  lumn: 78. * End:
da10: 0a 20 2a 2f 0a                                   . */.