Tcl Source Code

Hex Artifact Content
Login

Artifact a0194db1e3073dc3a44451c10ffe5303b81fc19830d942a93ce765e38d5272db:

Attachment "patch-a09031e288-quickfix.diff.1" to ticket [a09031e288] added by leon 2018-12-02 19:30:09. (unpublished)
0000: 49 6e 64 65 78 3a 20 67 65 6e 65 72 69 63 2f 74  Index: generic/t
0010: 63 6c 4f 62 6a 2e 63 0a 3d 3d 3d 3d 3d 3d 3d 3d  clObj.c.========
0020: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0030: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0040: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d  ================
0050: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 2d 2d 2d 20 67  ==========.--- g
0060: 65 6e 65 72 69 63 2f 74 63 6c 4f 62 6a 2e 63 0a  eneric/tclObj.c.
0070: 2b 2b 2b 20 67 65 6e 65 72 69 63 2f 74 63 6c 4f  +++ generic/tclO
0080: 62 6a 2e 63 0a 40 40 20 2d 39 36 2c 31 31 20 2b  bj.c.@@ -96,11 +
0090: 39 36 2c 31 31 20 40 40 0a 20 7d 20 54 68 72 65  96,11 @@. } Thre
00a0: 61 64 53 70 65 63 69 66 69 63 44 61 74 61 3b 0a  adSpecificData;.
00b0: 20 0a 20 73 74 61 74 69 63 20 54 63 6c 5f 54 68   . static Tcl_Th
00c0: 72 65 61 64 44 61 74 61 4b 65 79 20 64 61 74 61  readDataKey data
00d0: 4b 65 79 3b 0a 20 0a 20 73 74 61 74 69 63 20 76  Key;. . static v
00e0: 6f 69 64 20 20 20 20 20 20 20 20 20 20 20 20 20  oid             
00f0: 54 63 6c 54 68 72 65 61 64 46 69 6e 61 6c 69 7a  TclThreadFinaliz
0100: 65 43 6f 6e 74 4c 69 6e 65 73 28 43 6c 69 65 6e  eContLines(Clien
0110: 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61  tData clientData
0120: 29 3b 0a 2d 73 74 61 74 69 63 20 54 68 72 65 61  );.-static Threa
0130: 64 53 70 65 63 69 66 69 63 44 61 74 61 20 2a 54  dSpecificData *T
0140: 63 6c 47 65 74 43 6f 6e 74 4c 69 6e 65 54 61 62  clGetContLineTab
0150: 6c 65 28 76 6f 69 64 29 3b 0a 2b 73 74 61 74 69  le(void);.+stati
0160: 63 20 54 63 6c 5f 48 61 73 68 54 61 62 6c 65 20  c Tcl_HashTable 
0170: 20 20 20 2a 54 63 6c 47 65 74 43 6f 6e 74 4c 69     *TclGetContLi
0180: 6e 65 54 61 62 6c 65 28 76 6f 69 64 29 3b 0a 20  neTable(void);. 
0190: 0a 20 2f 2a 0a 20 20 2a 20 4e 65 73 74 65 64 20  . /*.  * Nested 
01a0: 54 63 6c 5f 4f 62 6a 20 64 65 6c 65 74 69 6f 6e  Tcl_Obj deletion
01b0: 20 6d 61 6e 61 67 65 6d 65 6e 74 20 73 75 70 70   management supp
01c0: 6f 72 74 0a 20 20 2a 0a 20 20 2a 20 41 6c 6c 20  ort.  *.  * All 
01d0: 63 6f 6e 74 65 78 74 20 72 65 66 65 72 65 6e 63  context referenc
01e0: 65 73 20 75 73 65 64 20 69 6e 20 74 68 65 20 6f  es used in the o
01f0: 62 6a 65 63 74 20 66 72 65 65 69 6e 67 20 63 6f  bject freeing co
0200: 64 65 20 61 72 65 20 70 6f 69 6e 74 65 72 73 20  de are pointers 
0210: 74 6f 20 74 68 69 73 0a 40 40 20 2d 34 39 36 2c  to this.@@ -496,
0220: 31 33 20 2b 34 39 36 2c 31 34 20 40 40 0a 20 20  13 +496,14 @@.  
0230: 2a 0a 20 20 2a 20 54 49 50 20 23 32 38 30 0a 20  *.  * TIP #280. 
0240: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
0250: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0260: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0270: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0280: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 20 2a 2f 0a 20 0a  --------.  */. .
0290: 2d 73 74 61 74 69 63 20 54 68 72 65 61 64 53 70  -static ThreadSp
02a0: 65 63 69 66 69 63 44 61 74 61 20 2a 0a 2b 73 74  ecificData *.+st
02b0: 61 74 69 63 20 54 63 6c 5f 48 61 73 68 54 61 62  atic Tcl_HashTab
02c0: 6c 65 20 2a 0a 20 54 63 6c 47 65 74 43 6f 6e 74  le *. TclGetCont
02d0: 4c 69 6e 65 54 61 62 6c 65 28 76 6f 69 64 29 0a  LineTable(void).
02e0: 20 7b 0a 2b 20 20 20 20 72 65 74 75 72 6e 20 4e   {.+    return N
02f0: 55 4c 4c 3b 0a 20 20 20 20 20 2f 2a 0a 20 20 20  ULL;.     /*.   
0300: 20 20 20 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20     * Initialize 
0310: 74 68 65 20 68 61 73 68 74 61 62 6c 65 20 74 72  the hashtable tr
0320: 61 63 6b 69 6e 67 20 69 6e 76 69 73 69 62 6c 65  acking invisible
0330: 20 63 6f 6e 74 69 6e 75 61 74 69 6f 6e 20 6c 69   continuation li
0340: 6e 65 73 2e 20 20 46 6f 72 0a 20 20 20 20 20 20  nes.  For.      
0350: 2a 20 74 68 65 20 72 65 6c 65 61 73 65 20 77 65  * the release we
0360: 20 75 73 65 20 61 20 74 68 72 65 61 64 20 65 78   use a thread ex
0370: 69 74 20 68 61 6e 64 6c 65 72 20 74 6f 20 65 6e  it handler to en
0380: 73 75 72 65 20 74 68 61 74 20 74 68 69 73 20 69  sure that this i
0390: 73 20 64 6f 6e 65 0a 20 20 20 20 20 20 2a 20 62  s done.      * b
03a0: 65 66 6f 72 65 20 54 53 44 20 62 6c 6f 63 6b 73  efore TSD blocks
03b0: 20 61 72 65 20 6d 61 64 65 20 69 6e 76 61 6c 69   are made invali
03c0: 64 2e 20 54 68 65 20 54 63 6c 46 69 6e 61 6c 69  d. The TclFinali
03d0: 7a 65 4f 62 6a 65 63 74 73 28 29 20 77 68 69 63  zeObjects() whic
03e0: 68 0a 20 20 20 20 20 20 2a 20 77 6f 75 6c 64 20  h.      * would 
03f0: 62 65 20 74 68 65 20 6e 61 74 75 72 61 6c 20 70  be the natural p
0400: 6c 61 63 65 20 66 6f 72 20 74 68 69 73 20 69 73  lace for this is
0410: 20 69 6e 76 6f 6b 65 64 20 61 66 74 65 72 77 61   invoked afterwa
0420: 72 64 73 2c 20 6d 65 61 6e 69 6e 67 20 74 68 61  rds, meaning tha
0430: 74 0a 40 40 20 2d 35 31 34 2c 31 31 20 2b 35 31  t.@@ -514,11 +51
0440: 35 2c 31 31 20 40 40 0a 20 20 20 20 20 69 66 20  5,11 @@.     if 
0450: 28 21 74 73 64 50 74 72 2d 3e 6c 69 6e 65 43 4c  (!tsdPtr->lineCL
0460: 50 74 72 29 20 7b 0a 20 09 74 73 64 50 74 72 2d  Ptr) {. .tsdPtr-
0470: 3e 6c 69 6e 65 43 4c 50 74 72 20 3d 20 54 63 6c  >lineCLPtr = Tcl
0480: 5f 41 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 54 63  _Alloc(sizeof(Tc
0490: 6c 5f 48 61 73 68 54 61 62 6c 65 29 29 3b 0a 20  l_HashTable));. 
04a0: 09 54 63 6c 5f 49 6e 69 74 48 61 73 68 54 61 62  .Tcl_InitHashTab
04b0: 6c 65 28 74 73 64 50 74 72 2d 3e 6c 69 6e 65 43  le(tsdPtr->lineC
04c0: 4c 50 74 72 2c 20 54 43 4c 5f 4f 4e 45 5f 57 4f  LPtr, TCL_ONE_WO
04d0: 52 44 5f 4b 45 59 53 29 3b 0a 20 09 54 63 6c 5f  RD_KEYS);. .Tcl_
04e0: 43 72 65 61 74 65 54 68 72 65 61 64 45 78 69 74  CreateThreadExit
04f0: 48 61 6e 64 6c 65 72 28 54 63 6c 54 68 72 65 61  Handler(TclThrea
0500: 64 46 69 6e 61 6c 69 7a 65 43 6f 6e 74 4c 69 6e  dFinalizeContLin
0510: 65 73 2c 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 7d  es,NULL);.     }
0520: 0a 2d 20 20 20 20 72 65 74 75 72 6e 20 74 73 64  .-    return tsd
0530: 50 74 72 3b 0a 2b 20 20 20 20 72 65 74 75 72 6e  Ptr;.+    return
0540: 20 74 73 64 50 74 72 2d 3e 6c 69 6e 65 43 4c 50   tsdPtr->lineCLP
0550: 74 72 3b 0a 20 7d 0a 20 0c 0a 20 2f 2a 0a 20 20  tr;. }. .. /*.  
0560: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
0570: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0580: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0590: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
05a0: 2d 2d 2d 2d 2d 2d 2d 0a 20 20 2a 0a 40 40 20 2d  -------.  *.@@ -
05b0: 35 34 32 2c 31 33 20 2b 35 34 33 2c 31 36 20 40  542,13 +543,16 @
05c0: 40 0a 20 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a  @.     Tcl_Obj *
05d0: 6f 62 6a 50 74 72 2c 0a 20 20 20 20 20 69 6e 74  objPtr,.     int
05e0: 20 6e 75 6d 2c 0a 20 20 20 20 20 69 6e 74 20 2a   num,.     int *
05f0: 6c 6f 63 29 0a 20 7b 0a 20 20 20 20 20 69 6e 74  loc). {.     int
0600: 20 6e 65 77 45 6e 74 72 79 3b 0a 2d 20 20 20 20   newEntry;.-    
0610: 54 68 72 65 61 64 53 70 65 63 69 66 69 63 44 61  ThreadSpecificDa
0620: 74 61 20 2a 74 73 64 50 74 72 20 3d 20 54 63 6c  ta *tsdPtr = Tcl
0630: 47 65 74 43 6f 6e 74 4c 69 6e 65 54 61 62 6c 65  GetContLineTable
0640: 28 29 3b 0a 2b 20 20 20 20 54 63 6c 5f 48 61 73  ();.+    Tcl_Has
0650: 68 54 61 62 6c 65 20 2a 63 6f 6e 74 4c 69 6e 65  hTable *contLine
0660: 54 61 62 6c 65 20 3d 20 54 63 6c 47 65 74 43 6f  Table = TclGetCo
0670: 6e 74 4c 69 6e 65 54 61 62 6c 65 28 29 3b 0a 2b  ntLineTable();.+
0680: 20 20 20 20 69 66 20 28 20 21 20 63 6f 6e 74 4c      if ( ! contL
0690: 69 6e 65 54 61 62 6c 65 20 29 0a 2b 20 20 20 20  ineTable ).+    
06a0: 20 20 20 20 72 65 74 75 72 6e 20 4e 55 4c 4c 3b      return NULL;
06b0: 0a 2b 0a 20 20 20 20 20 54 63 6c 5f 48 61 73 68  .+.     Tcl_Hash
06c0: 45 6e 74 72 79 20 2a 68 50 74 72 20 3d 0a 2d 09  Entry *hPtr =.-.
06d0: 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 48 61      Tcl_CreateHa
06e0: 73 68 45 6e 74 72 79 28 74 73 64 50 74 72 2d 3e  shEntry(tsdPtr->
06f0: 6c 69 6e 65 43 4c 50 74 72 2c 20 6f 62 6a 50 74  lineCLPtr, objPt
0700: 72 2c 20 26 6e 65 77 45 6e 74 72 79 29 3b 0a 2b  r, &newEntry);.+
0710: 09 20 20 20 20 54 63 6c 5f 43 72 65 61 74 65 48  .    Tcl_CreateH
0720: 61 73 68 45 6e 74 72 79 28 63 6f 6e 74 4c 69 6e  ashEntry(contLin
0730: 65 54 61 62 6c 65 2c 20 6f 62 6a 50 74 72 2c 20  eTable, objPtr, 
0740: 26 6e 65 77 45 6e 74 72 79 29 3b 0a 20 20 20 20  &newEntry);.    
0750: 20 43 6f 6e 74 4c 69 6e 65 4c 6f 63 20 2a 63 6c   ContLineLoc *cl
0760: 4c 6f 63 50 74 72 20 3d 20 54 63 6c 5f 41 6c 6c  LocPtr = Tcl_All
0770: 6f 63 28 73 69 7a 65 6f 66 28 43 6f 6e 74 4c 69  oc(sizeof(ContLi
0780: 6e 65 4c 6f 63 29 20 2b 20 6e 75 6d 2a 73 69 7a  neLoc) + num*siz
0790: 65 6f 66 28 69 6e 74 29 29 3b 0a 20 0a 20 20 20  eof(int));. .   
07a0: 20 20 69 66 20 28 21 6e 65 77 45 6e 74 72 79 29    if (!newEntry)
07b0: 20 7b 0a 20 09 2f 2a 0a 20 09 20 2a 20 57 65 27   {. ./*. . * We'
07c0: 72 65 20 65 6e 74 65 72 69 6e 67 20 43 6f 6e 74  re entering Cont
07d0: 4c 69 6e 65 4c 6f 63 20 64 61 74 61 20 66 6f 72  LineLoc data for
07e0: 20 74 68 65 20 73 61 6d 65 20 76 61 6c 75 65 20   the same value 
07f0: 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 0a 40 40  more than one.@@
0800: 20 2d 36 39 38 2c 31 33 20 2b 37 30 32 2c 31 36   -698,13 +702,16
0810: 20 40 40 0a 20 76 6f 69 64 0a 20 54 63 6c 43 6f   @@. void. TclCo
0820: 6e 74 69 6e 75 61 74 69 6f 6e 73 43 6f 70 79 28  ntinuationsCopy(
0830: 0a 20 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f  .     Tcl_Obj *o
0840: 62 6a 50 74 72 2c 0a 20 20 20 20 20 54 63 6c 5f  bjPtr,.     Tcl_
0850: 4f 62 6a 20 2a 6f 72 69 67 69 6e 4f 62 6a 50 74  Obj *originObjPt
0860: 72 29 0a 20 7b 0a 2d 20 20 20 20 54 68 72 65 61  r). {.-    Threa
0870: 64 53 70 65 63 69 66 69 63 44 61 74 61 20 2a 74  dSpecificData *t
0880: 73 64 50 74 72 20 3d 20 54 63 6c 47 65 74 43 6f  sdPtr = TclGetCo
0890: 6e 74 4c 69 6e 65 54 61 62 6c 65 28 29 3b 0a 2b  ntLineTable();.+
08a0: 20 20 20 20 54 63 6c 5f 48 61 73 68 54 61 62 6c      Tcl_HashTabl
08b0: 65 20 2a 63 6f 6e 74 4c 69 6e 65 54 61 62 6c 65  e *contLineTable
08c0: 20 3d 20 54 63 6c 47 65 74 43 6f 6e 74 4c 69 6e   = TclGetContLin
08d0: 65 54 61 62 6c 65 28 29 3b 0a 2b 20 20 20 20 69  eTable();.+    i
08e0: 66 20 28 20 21 20 63 6f 6e 74 4c 69 6e 65 54 61  f ( ! contLineTa
08f0: 62 6c 65 20 29 0a 2b 20 20 20 20 20 20 20 20 72  ble ).+        r
0900: 65 74 75 72 6e 3b 0a 2b 0a 20 20 20 20 20 54 63  eturn;.+.     Tc
0910: 6c 5f 48 61 73 68 45 6e 74 72 79 20 2a 68 50 74  l_HashEntry *hPt
0920: 72 20 3d 0a 2d 20 20 20 20 20 20 20 20 20 20 20  r =.-           
0930: 20 54 63 6c 5f 46 69 6e 64 48 61 73 68 45 6e 74   Tcl_FindHashEnt
0940: 72 79 28 74 73 64 50 74 72 2d 3e 6c 69 6e 65 43  ry(tsdPtr->lineC
0950: 4c 50 74 72 2c 20 6f 72 69 67 69 6e 4f 62 6a 50  LPtr, originObjP
0960: 74 72 29 3b 0a 2b 20 20 20 20 20 20 20 20 20 20  tr);.+          
0970: 20 20 54 63 6c 5f 46 69 6e 64 48 61 73 68 45 6e    Tcl_FindHashEn
0980: 74 72 79 28 63 6f 6e 74 4c 69 6e 65 54 61 62 6c  try(contLineTabl
0990: 65 2c 20 6f 72 69 67 69 6e 4f 62 6a 50 74 72 29  e, originObjPtr)
09a0: 3b 0a 20 0a 20 20 20 20 20 69 66 20 28 68 50 74  ;. .     if (hPt
09b0: 72 29 20 7b 0a 20 09 43 6f 6e 74 4c 69 6e 65 4c  r) {. .ContLineL
09c0: 6f 63 20 2a 63 6c 4c 6f 63 50 74 72 20 3d 20 54  oc *clLocPtr = T
09d0: 63 6c 5f 47 65 74 48 61 73 68 56 61 6c 75 65 28  cl_GetHashValue(
09e0: 68 50 74 72 29 3b 0a 20 0a 20 09 54 63 6c 43 6f  hPtr);. . .TclCo
09f0: 6e 74 69 6e 75 61 74 69 6f 6e 73 45 6e 74 65 72  ntinuationsEnter
0a00: 28 6f 62 6a 50 74 72 2c 20 63 6c 4c 6f 63 50 74  (objPtr, clLocPt
0a10: 72 2d 3e 6e 75 6d 2c 20 63 6c 4c 6f 63 50 74 72  r->num, clLocPtr
0a20: 2d 3e 6c 6f 63 29 3b 0a 40 40 20 2d 37 33 32 2c  ->loc);.@@ -732,
0a30: 31 33 20 2b 37 33 39 2c 31 36 20 40 40 0a 20 0a  13 +739,16 @@. .
0a40: 20 43 6f 6e 74 4c 69 6e 65 4c 6f 63 20 2a 0a 20   ContLineLoc *. 
0a50: 54 63 6c 43 6f 6e 74 69 6e 75 61 74 69 6f 6e 73  TclContinuations
0a60: 47 65 74 28 0a 20 20 20 20 20 54 63 6c 5f 4f 62  Get(.     Tcl_Ob
0a70: 6a 20 2a 6f 62 6a 50 74 72 29 0a 20 7b 0a 2d 20  j *objPtr). {.- 
0a80: 20 20 20 54 68 72 65 61 64 53 70 65 63 69 66 69     ThreadSpecifi
0a90: 63 44 61 74 61 20 2a 74 73 64 50 74 72 20 3d 20  cData *tsdPtr = 
0aa0: 54 63 6c 47 65 74 43 6f 6e 74 4c 69 6e 65 54 61  TclGetContLineTa
0ab0: 62 6c 65 28 29 3b 0a 2b 20 20 20 20 54 63 6c 5f  ble();.+    Tcl_
0ac0: 48 61 73 68 54 61 62 6c 65 20 2a 63 6f 6e 74 4c  HashTable *contL
0ad0: 69 6e 65 54 61 62 6c 65 20 3d 20 54 63 6c 47 65  ineTable = TclGe
0ae0: 74 43 6f 6e 74 4c 69 6e 65 54 61 62 6c 65 28 29  tContLineTable()
0af0: 3b 0a 2b 20 20 20 20 69 66 20 28 20 21 20 63 6f  ;.+    if ( ! co
0b00: 6e 74 4c 69 6e 65 54 61 62 6c 65 20 29 0a 2b 20  ntLineTable ).+ 
0b10: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 4e 55         return NU
0b20: 4c 4c 3b 0a 2b 0a 20 20 20 20 20 54 63 6c 5f 48  LL;.+.     Tcl_H
0b30: 61 73 68 45 6e 74 72 79 20 2a 68 50 74 72 20 3d  ashEntry *hPtr =
0b40: 0a 2d 20 20 20 20 20 20 20 20 20 20 20 20 54 63  .-            Tc
0b50: 6c 5f 46 69 6e 64 48 61 73 68 45 6e 74 72 79 28  l_FindHashEntry(
0b60: 74 73 64 50 74 72 2d 3e 6c 69 6e 65 43 4c 50 74  tsdPtr->lineCLPt
0b70: 72 2c 20 6f 62 6a 50 74 72 29 3b 0a 2b 20 20 20  r, objPtr);.+   
0b80: 20 20 20 20 20 20 20 20 20 54 63 6c 5f 46 69 6e           Tcl_Fin
0b90: 64 48 61 73 68 45 6e 74 72 79 28 63 6f 6e 74 4c  dHashEntry(contL
0ba0: 69 6e 65 54 61 62 6c 65 2c 20 6f 62 6a 50 74 72  ineTable, objPtr
0bb0: 29 3b 0a 20 0a 20 20 20 20 20 69 66 20 28 21 68  );. .     if (!h
0bc0: 50 74 72 29 20 7b 0a 20 20 20 20 20 20 20 20 20  Ptr) {.         
0bd0: 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20  return NULL;.   
0be0: 20 20 7d 0a 20 20 20 20 20 72 65 74 75 72 6e 20    }.     return 
0bf0: 54 63 6c 5f 47 65 74 48 61 73 68 56 61 6c 75 65  Tcl_GetHashValue
0c00: 28 68 50 74 72 29 3b 0a 40 40 20 2d 37 36 38 2c  (hPtr);.@@ -768,
0c10: 32 32 20 2b 37 37 38 2c 32 38 20 40 40 0a 20 7b  22 +778,28 @@. {
0c20: 0a 20 20 20 20 20 2f 2a 0a 20 20 20 20 20 20 2a  .     /*.      *
0c30: 20 52 65 6c 65 61 73 65 20 74 68 65 20 68 61 73   Release the has
0c40: 68 74 61 62 6c 65 20 74 72 61 63 6b 69 6e 67 20  htable tracking 
0c50: 69 6e 76 69 73 69 62 6c 65 20 63 6f 6e 74 69 6e  invisible contin
0c60: 75 61 74 69 6f 6e 20 6c 69 6e 65 73 2e 0a 20 20  uation lines..  
0c70: 20 20 20 20 2a 2f 0a 20 0a 2d 20 20 20 20 54 68      */. .-    Th
0c80: 72 65 61 64 53 70 65 63 69 66 69 63 44 61 74 61  readSpecificData
0c90: 20 2a 74 73 64 50 74 72 20 3d 20 54 63 6c 47 65   *tsdPtr = TclGe
0ca0: 74 43 6f 6e 74 4c 69 6e 65 54 61 62 6c 65 28 29  tContLineTable()
0cb0: 3b 0a 2b 20 20 20 20 54 63 6c 5f 48 61 73 68 54  ;.+    Tcl_HashT
0cc0: 61 62 6c 65 20 2a 63 6f 6e 74 4c 69 6e 65 54 61  able *contLineTa
0cd0: 62 6c 65 20 3d 20 54 63 6c 47 65 74 43 6f 6e 74  ble = TclGetCont
0ce0: 4c 69 6e 65 54 61 62 6c 65 28 29 3b 0a 2b 20 20  LineTable();.+  
0cf0: 20 20 69 66 20 28 20 21 20 63 6f 6e 74 4c 69 6e    if ( ! contLin
0d00: 65 54 61 62 6c 65 20 29 0a 2b 20 20 20 20 20 20  eTable ).+      
0d10: 20 20 72 65 74 75 72 6e 3b 0a 2b 0a 20 20 20 20    return;.+.    
0d20: 20 54 63 6c 5f 48 61 73 68 45 6e 74 72 79 20 2a   Tcl_HashEntry *
0d30: 68 50 74 72 3b 0a 20 20 20 20 20 54 63 6c 5f 48  hPtr;.     Tcl_H
0d40: 61 73 68 53 65 61 72 63 68 20 68 53 65 61 72 63  ashSearch hSearc
0d50: 68 3b 0a 20 0a 2d 20 20 20 20 66 6f 72 20 28 68  h;. .-    for (h
0d60: 50 74 72 20 3d 20 54 63 6c 5f 46 69 72 73 74 48  Ptr = Tcl_FirstH
0d70: 61 73 68 45 6e 74 72 79 28 74 73 64 50 74 72 2d  ashEntry(tsdPtr-
0d80: 3e 6c 69 6e 65 43 4c 50 74 72 2c 20 26 68 53 65  >lineCLPtr, &hSe
0d90: 61 72 63 68 29 3b 0a 2b 20 20 20 20 66 6f 72 20  arch);.+    for 
0da0: 28 68 50 74 72 20 3d 20 54 63 6c 5f 46 69 72 73  (hPtr = Tcl_Firs
0db0: 74 48 61 73 68 45 6e 74 72 79 28 63 6f 6e 74 4c  tHashEntry(contL
0dc0: 69 6e 65 54 61 62 6c 65 2c 20 26 68 53 65 61 72  ineTable, &hSear
0dd0: 63 68 29 3b 0a 20 09 20 20 20 20 68 50 74 72 20  ch);. .    hPtr 
0de0: 21 3d 20 4e 55 4c 4c 3b 20 68 50 74 72 20 3d 20  != NULL; hPtr = 
0df0: 54 63 6c 5f 4e 65 78 74 48 61 73 68 45 6e 74 72  Tcl_NextHashEntr
0e00: 79 28 26 68 53 65 61 72 63 68 29 29 20 7b 0a 20  y(&hSearch)) {. 
0e10: 09 54 63 6c 5f 46 72 65 65 28 54 63 6c 5f 47 65  .Tcl_Free(Tcl_Ge
0e20: 74 48 61 73 68 56 61 6c 75 65 28 68 50 74 72 29  tHashValue(hPtr)
0e30: 29 3b 0a 20 09 54 63 6c 5f 44 65 6c 65 74 65 48  );. .Tcl_DeleteH
0e40: 61 73 68 45 6e 74 72 79 28 68 50 74 72 29 3b 0a  ashEntry(hPtr);.
0e50: 20 20 20 20 20 7d 0a 2d 20 20 20 20 54 63 6c 5f       }.-    Tcl_
0e60: 44 65 6c 65 74 65 48 61 73 68 54 61 62 6c 65 28  DeleteHashTable(
0e70: 74 73 64 50 74 72 2d 3e 6c 69 6e 65 43 4c 50 74  tsdPtr->lineCLPt
0e80: 72 29 3b 0a 2d 20 20 20 20 54 63 6c 5f 46 72 65  r);.-    Tcl_Fre
0e90: 65 28 74 73 64 50 74 72 2d 3e 6c 69 6e 65 43 4c  e(tsdPtr->lineCL
0ea0: 50 74 72 29 3b 0a 2b 20 20 20 20 54 63 6c 5f 44  Ptr);.+    Tcl_D
0eb0: 65 6c 65 74 65 48 61 73 68 54 61 62 6c 65 28 63  eleteHashTable(c
0ec0: 6f 6e 74 4c 69 6e 65 54 61 62 6c 65 29 3b 0a 2b  ontLineTable);.+
0ed0: 20 20 20 20 54 63 6c 5f 46 72 65 65 28 63 6f 6e      Tcl_Free(con
0ee0: 74 4c 69 6e 65 54 61 62 6c 65 29 3b 0a 2b 20 20  tLineTable);.+  
0ef0: 20 20 7b 0a 2b 20 20 20 20 54 68 72 65 61 64 53    {.+    ThreadS
0f00: 70 65 63 69 66 69 63 44 61 74 61 20 2a 74 73 64  pecificData *tsd
0f10: 50 74 72 20 3d 20 54 43 4c 5f 54 53 44 5f 49 4e  Ptr = TCL_TSD_IN
0f20: 49 54 28 26 64 61 74 61 4b 65 79 29 3b 0a 20 20  IT(&dataKey);.  
0f30: 20 20 20 74 73 64 50 74 72 2d 3e 6c 69 6e 65 43     tsdPtr->lineC
0f40: 4c 50 74 72 20 3d 20 4e 55 4c 4c 3b 0a 2b 20 20  LPtr = NULL;.+  
0f50: 20 20 7d 0a 20 7d 0a 20 0c 0a 20 2f 2a 0a 20 20    }. }. .. /*.  
0f60: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
0f70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0f80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0f90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
0fa0: 20 20 2a 0a 40 40 20 2d 31 36 39 35 2c 31 39 20    *.@@ -1695,19 
0fb0: 2b 31 37 31 31 2c 31 39 20 40 40 0a 20 20 2a 20  +1711,19 @@.  * 
0fc0: 54 63 6c 5f 49 6e 69 74 53 74 72 69 6e 67 52 65  Tcl_InitStringRe
0fd0: 70 20 2d 2d 0a 20 20 2a 0a 20 20 2a 09 54 68 69  p --.  *.  *.Thi
0fe0: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
0ff0: 6c 6c 65 64 20 69 6e 20 73 65 76 65 72 61 6c 20  lled in several 
1000: 63 6f 6e 66 69 67 75 72 61 74 69 6f 6e 73 20 74  configurations t
1010: 6f 20 70 72 6f 76 69 64 65 20 61 6c 6c 0a 20 20  o provide all.  
1020: 2a 09 74 68 65 20 74 6f 6f 6c 73 20 6e 65 65 64  *.the tools need
1030: 65 64 20 74 6f 20 73 65 74 20 61 6e 20 6f 62 6a  ed to set an obj
1040: 65 63 74 27 73 20 73 74 72 69 6e 67 20 72 65 70  ect's string rep
1050: 72 65 73 65 6e 74 61 74 69 6f 6e 2e 20 54 68 65  resentation. The
1060: 0a 20 20 2a 09 66 75 6e 63 74 69 6f 6e 20 69 73  .  *.function is
1070: 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74   determined by t
1080: 68 65 20 61 72 67 75 6d 65 6e 74 73 2e 0a 2d 20  he arguments..- 
1090: 2a 09 0a 2b 20 2a 0a 20 20 2a 09 28 6f 62 6a 50  *..+ *.  *.(objP
10a0: 74 72 2d 3e 62 79 74 65 73 20 21 3d 20 4e 55 4c  tr->bytes != NUL
10b0: 4c 20 26 26 20 62 79 74 65 73 20 21 3d 20 4e 55  L && bytes != NU
10c0: 4c 4c 29 20 7c 7c 20 28 6e 75 6d 42 79 74 65 73  LL) || (numBytes
10d0: 20 3d 3d 20 2d 31 29 0a 20 20 2a 09 20 20 20 20   == -1).  *.    
10e0: 49 6e 76 61 6c 69 64 20 63 61 6c 6c 20 2d 2d 20  Invalid call -- 
10f0: 70 61 6e 69 63 21 0a 2d 20 2a 09 0a 2b 20 2a 0a  panic!.- *..+ *.
1100: 20 20 2a 09 6f 62 6a 50 74 72 2d 3e 62 79 74 65    *.objPtr->byte
1110: 73 20 3d 3d 20 4e 55 4c 4c 20 26 26 20 62 79 74  s == NULL && byt
1120: 65 73 20 3d 3d 20 4e 55 4c 4c 20 26 26 20 6e 75  es == NULL && nu
1130: 6d 42 79 74 65 73 20 3e 3d 20 30 0a 20 20 2a 09  mBytes >= 0.  *.
1140: 20 20 20 20 41 6c 6c 6f 63 61 74 69 6f 6e 20 6f      Allocation o
1150: 6e 6c 79 20 2d 20 61 6c 6c 6f 63 61 74 65 20 73  nly - allocate s
1160: 70 61 63 65 20 66 6f 72 20 28 6e 75 6d 42 79 74  pace for (numByt
1170: 65 73 2b 31 29 20 63 68 61 72 73 2e 0a 20 20 2a  es+1) chars..  *
1180: 09 20 20 20 20 73 74 6f 72 65 20 69 6e 20 6f 62  .    store in ob
1190: 6a 50 74 72 2d 3e 62 79 74 65 73 20 61 6e 64 20  jPtr->bytes and 
11a0: 72 65 74 75 72 6e 2e 20 41 6c 73 6f 20 73 65 74  return. Also set
11b0: 73 0a 20 20 2a 09 20 20 20 20 6f 62 6a 50 74 72  s.  *.    objPtr
11c0: 2d 3e 6c 65 6e 67 74 68 20 74 6f 20 30 20 61 6e  ->length to 0 an
11d0: 64 20 6f 62 6a 50 74 72 2d 3e 62 79 74 65 73 5b  d objPtr->bytes[
11e0: 30 5d 20 74 6f 20 4e 55 4c 2e 0a 2d 20 2a 09 0a  0] to NUL..- *..
11f0: 2b 20 2a 0a 20 20 2a 09 6f 62 6a 50 74 72 2d 3e  + *.  *.objPtr->
1200: 62 79 74 65 73 20 3d 3d 20 4e 55 4c 4c 20 26 26  bytes == NULL &&
1210: 20 62 79 74 65 73 20 21 3d 20 4e 55 4c 4c 20 26   bytes != NULL &
1220: 26 20 6e 75 6d 42 79 74 65 73 20 3e 3d 20 30 0a  & numBytes >= 0.
1230: 20 20 2a 09 20 20 20 20 41 6c 6c 6f 63 61 74 65    *.    Allocate
1240: 20 61 6e 64 20 63 6f 70 79 2e 20 62 79 74 65 73   and copy. bytes
1250: 20 69 73 20 61 73 73 75 6d 65 64 20 74 6f 20 70   is assumed to p
1260: 6f 69 6e 74 20 74 6f 20 63 68 61 72 73 20 74 6f  oint to chars to
1270: 0a 20 20 2a 09 20 20 20 20 63 6f 70 79 20 69 6e  .  *.    copy in
1280: 74 6f 20 74 68 65 20 73 74 72 69 6e 67 20 72 65  to the string re
1290: 70 2e 20 6f 62 6a 50 74 72 2d 3e 6c 65 6e 67 74  p. objPtr->lengt
12a0: 68 20 3d 20 6e 75 6d 42 79 74 65 73 2e 20 41 6c  h = numBytes. Al
12b0: 6c 6f 63 61 74 65 0a 20 20 2a 09 20 20 20 20 61  locate.  *.    a
12c0: 72 72 61 79 20 6f 66 20 28 6e 75 6d 42 79 74 65  rray of (numByte
12d0: 73 20 2b 20 31 29 20 63 68 61 72 73 2e 20 73 74  s + 1) chars. st
12e0: 6f 72 65 20 69 6e 20 6f 62 6a 50 74 72 2d 3e 62  ore in objPtr->b
12f0: 79 74 65 73 2e 20 43 6f 70 79 0a 20 20 2a 09 20  ytes. Copy.  *. 
1300: 20 20 20 6e 75 6d 42 79 74 65 73 20 63 68 61 72     numBytes char
1310: 73 20 66 72 6f 6d 20 62 79 74 65 73 20 74 6f 20  s from bytes to 
1320: 6f 62 6a 50 74 72 2d 3e 62 79 74 65 73 3b 20 53  objPtr->bytes; S
1330: 65 74 0a 0a                                      et..