Tcl Source Code

Hex Artifact Content
Login

Artifact ad20c6ffc03b658a7947a4d90a8ee273372efe8a4b1b5a4ec831fd1f7f51e693:


0000: 2f 2a 0a 20 2a 20 74 63 6c 50 72 6f 63 2e 63 20  /*. * tclProc.c 
0010: 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 66 69  --. *. *.This fi
0020: 6c 65 20 63 6f 6e 74 61 69 6e 73 20 72 6f 75 74  le contains rout
0030: 69 6e 65 73 20 74 68 61 74 20 69 6d 70 6c 65 6d  ines that implem
0040: 65 6e 74 20 54 63 6c 20 70 72 6f 63 65 64 75 72  ent Tcl procedur
0050: 65 73 2c 20 69 6e 63 6c 75 64 69 6e 67 0a 20 2a  es, including. *
0060: 09 74 68 65 20 22 70 72 6f 63 22 20 61 6e 64 20  .the "proc" and 
0070: 22 75 70 6c 65 76 65 6c 22 20 63 6f 6d 6d 61 6e  "uplevel" comman
0080: 64 73 2e 0a 20 2a 0a 20 2a 20 43 6f 70 79 72 69  ds.. *. * Copyri
0090: 67 68 74 20 28 63 29 20 31 39 38 37 2d 31 39 39  ght (c) 1987-199
00a0: 33 20 54 68 65 20 52 65 67 65 6e 74 73 20 6f 66  3 The Regents of
00b0: 20 74 68 65 20 55 6e 69 76 65 72 73 69 74 79 20   the University 
00c0: 6f 66 20 43 61 6c 69 66 6f 72 6e 69 61 2e 0a 20  of California.. 
00d0: 2a 20 43 6f 70 79 72 69 67 68 74 20 28 63 29 20  * Copyright (c) 
00e0: 31 39 39 34 2d 31 39 39 38 20 53 75 6e 20 4d 69  1994-1998 Sun Mi
00f0: 63 72 6f 73 79 73 74 65 6d 73 2c 20 49 6e 63 2e  crosystems, Inc.
0100: 0a 20 2a 20 43 6f 70 79 72 69 67 68 74 20 28 63  . * Copyright (c
0110: 29 20 32 30 30 34 2d 32 30 30 36 20 4d 69 67 75  ) 2004-2006 Migu
0120: 65 6c 20 53 6f 66 65 72 0a 20 2a 20 43 6f 70 79  el Sofer. * Copy
0130: 72 69 67 68 74 20 28 63 29 20 32 30 30 37 20 44  right (c) 2007 D
0140: 61 6e 69 65 6c 20 41 2e 20 53 74 65 66 66 65 6e  aniel A. Steffen
0150: 20 3c 64 61 73 40 75 73 65 72 73 2e 73 6f 75 72   <[email protected]
0160: 63 65 66 6f 72 67 65 2e 6e 65 74 3e 0a 20 2a 0a  ceforge.net>. *.
0170: 20 2a 20 53 65 65 20 74 68 65 20 66 69 6c 65 20   * See the file 
0180: 22 6c 69 63 65 6e 73 65 2e 74 65 72 6d 73 22 20  "license.terms" 
0190: 66 6f 72 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  for information 
01a0: 6f 6e 20 75 73 61 67 65 20 61 6e 64 20 72 65 64  on usage and red
01b0: 69 73 74 72 69 62 75 74 69 6f 6e 20 6f 66 0a 20  istribution of. 
01c0: 2a 20 74 68 69 73 20 66 69 6c 65 2c 20 61 6e 64  * this file, and
01d0: 20 66 6f 72 20 61 20 44 49 53 43 4c 41 49 4d 45   for a DISCLAIME
01e0: 52 20 4f 46 20 41 4c 4c 20 57 41 52 52 41 4e 54  R OF ALL WARRANT
01f0: 49 45 53 2e 0a 20 2a 2f 0a 0a 23 69 6e 63 6c 75  IES.. */..#inclu
0200: 64 65 20 22 74 63 6c 49 6e 74 2e 68 22 0a 23 69  de "tclInt.h".#i
0210: 6e 63 6c 75 64 65 20 22 74 63 6c 43 6f 6d 70 69  nclude "tclCompi
0220: 6c 65 2e 68 22 0a 0a 2f 2a 0a 20 2a 20 56 61 72  le.h"../*. * Var
0230: 69 61 62 6c 65 73 20 74 68 61 74 20 61 72 65 20  iables that are 
0240: 70 61 72 74 20 6f 66 20 74 68 65 20 5b 61 70 70  part of the [app
0250: 6c 79 5d 20 63 6f 6d 6d 61 6e 64 20 69 6d 70 6c  ly] command impl
0260: 65 6d 65 6e 74 61 74 69 6f 6e 20 61 6e 64 20 77  ementation and w
0270: 68 69 63 68 0a 20 2a 20 68 61 76 65 20 74 6f 20  hich. * have to 
0280: 62 65 20 70 61 73 73 65 64 20 74 6f 20 74 68 65  be passed to the
0290: 20 6f 74 68 65 72 20 73 69 64 65 20 6f 66 20 74   other side of t
02a0: 68 65 20 4e 52 45 20 63 61 6c 6c 2e 0a 20 2a 2f  he NRE call.. */
02b0: 0a 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  ..typedef struct
02c0: 20 7b 0a 20 20 20 20 43 6f 6d 6d 61 6e 64 20 63   {.    Command c
02d0: 6d 64 3b 0a 20 20 20 20 45 78 74 72 61 46 72 61  md;.    ExtraFra
02e0: 6d 65 49 6e 66 6f 20 65 66 69 3b 0a 7d 20 41 70  meInfo efi;.} Ap
02f0: 70 6c 79 45 78 74 72 61 44 61 74 61 3b 0a 0a 2f  plyExtraData;../
0300: 2a 0a 20 2a 20 50 72 6f 74 6f 74 79 70 65 73 20  *. * Prototypes 
0310: 66 6f 72 20 73 74 61 74 69 63 20 66 75 6e 63 74  for static funct
0320: 69 6f 6e 73 20 69 6e 20 74 68 69 73 20 66 69 6c  ions in this fil
0330: 65 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20 76 6f  e. */..static vo
0340: 69 64 09 09 44 75 70 4c 61 6d 62 64 61 49 6e 74  id..DupLambdaInt
0350: 65 72 6e 61 6c 52 65 70 28 54 63 6c 5f 4f 62 6a  ernalRep(Tcl_Obj
0360: 20 2a 6f 62 6a 50 74 72 2c 0a 09 09 09 20 20 20   *objPtr,....   
0370: 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 70 79 50 74   Tcl_Obj *copyPt
0380: 72 29 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 09  r);.static void.
0390: 09 46 72 65 65 4c 61 6d 62 64 61 49 6e 74 65 72  .FreeLambdaInter
03a0: 6e 61 6c 52 65 70 28 54 63 6c 5f 4f 62 6a 20 2a  nalRep(Tcl_Obj *
03b0: 6f 62 6a 50 74 72 29 3b 0a 73 74 61 74 69 63 20  objPtr);.static 
03c0: 69 6e 74 09 09 49 6e 69 74 41 72 67 73 41 6e 64  int..InitArgsAnd
03d0: 4c 6f 63 61 6c 73 28 54 63 6c 5f 49 6e 74 65 72  Locals(Tcl_Inter
03e0: 70 20 2a 69 6e 74 65 72 70 2c 0a 09 09 09 20 20  p *interp,....  
03f0: 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 72 6f 63 4e    Tcl_Obj *procN
0400: 61 6d 65 4f 62 6a 2c 20 69 6e 74 20 73 6b 69 70  ameObj, int skip
0410: 29 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 09 09  );.static void..
0420: 49 6e 69 74 52 65 73 6f 6c 76 65 64 4c 6f 63 61  InitResolvedLoca
0430: 6c 73 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  ls(Tcl_Interp *i
0440: 6e 74 65 72 70 2c 0a 09 09 09 20 20 20 20 42 79  nterp,....    By
0450: 74 65 43 6f 64 65 20 2a 63 6f 64 65 50 74 72 2c  teCode *codePtr,
0460: 20 56 61 72 20 2a 64 65 66 50 74 72 2c 0a 09 09   Var *defPtr,...
0470: 09 20 20 20 20 4e 61 6d 65 73 70 61 63 65 20 2a  .    Namespace *
0480: 6e 73 50 74 72 29 3b 0a 73 74 61 74 69 63 20 76  nsPtr);.static v
0490: 6f 69 64 09 09 49 6e 69 74 4c 6f 63 61 6c 43 61  oid..InitLocalCa
04a0: 63 68 65 28 50 72 6f 63 20 2a 70 72 6f 63 50 74  che(Proc *procPt
04b0: 72 29 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 09  r);.static void.
04c0: 09 50 72 6f 63 42 6f 64 79 44 75 70 28 54 63 6c  .ProcBodyDup(Tcl
04d0: 5f 4f 62 6a 20 2a 73 72 63 50 74 72 2c 20 54 63  _Obj *srcPtr, Tc
04e0: 6c 5f 4f 62 6a 20 2a 64 75 70 50 74 72 29 3b 0a  l_Obj *dupPtr);.
04f0: 73 74 61 74 69 63 20 76 6f 69 64 09 09 50 72 6f  static void..Pro
0500: 63 42 6f 64 79 46 72 65 65 28 54 63 6c 5f 4f 62  cBodyFree(Tcl_Ob
0510: 6a 20 2a 6f 62 6a 50 74 72 29 3b 0a 73 74 61 74  j *objPtr);.stat
0520: 69 63 20 69 6e 74 09 09 50 72 6f 63 57 72 6f 6e  ic int..ProcWron
0530: 67 4e 75 6d 41 72 67 73 28 54 63 6c 5f 49 6e 74  gNumArgs(Tcl_Int
0540: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 69 6e 74  erp *interp, int
0550: 20 73 6b 69 70 29 3b 0a 73 74 61 74 69 63 20 76   skip);.static v
0560: 6f 69 64 09 09 4d 61 6b 65 50 72 6f 63 45 72 72  oid..MakeProcErr
0570: 6f 72 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69  or(Tcl_Interp *i
0580: 6e 74 65 72 70 2c 0a 09 09 09 20 20 20 20 54 63  nterp,....    Tc
0590: 6c 5f 4f 62 6a 20 2a 70 72 6f 63 4e 61 6d 65 4f  l_Obj *procNameO
05a0: 62 6a 29 3b 0a 73 74 61 74 69 63 20 76 6f 69 64  bj);.static void
05b0: 09 09 4d 61 6b 65 4c 61 6d 62 64 61 45 72 72 6f  ..MakeLambdaErro
05c0: 72 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e  r(Tcl_Interp *in
05d0: 74 65 72 70 2c 0a 09 09 09 20 20 20 20 54 63 6c  terp,....    Tcl
05e0: 5f 4f 62 6a 20 2a 70 72 6f 63 4e 61 6d 65 4f 62  _Obj *procNameOb
05f0: 6a 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 09 09  j);.static int..
0600: 53 65 74 4c 61 6d 62 64 61 46 72 6f 6d 41 6e 79  SetLambdaFromAny
0610: 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74  (Tcl_Interp *int
0620: 65 72 70 2c 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62  erp, Tcl_Obj *ob
0630: 6a 50 74 72 29 3b 0a 0a 73 74 61 74 69 63 20 54  jPtr);..static T
0640: 63 6c 5f 4e 52 50 6f 73 74 50 72 6f 63 20 41 70  cl_NRPostProc Ap
0650: 70 6c 79 4e 52 32 3b 0a 73 74 61 74 69 63 20 54  plyNR2;.static T
0660: 63 6c 5f 4e 52 50 6f 73 74 50 72 6f 63 20 49 6e  cl_NRPostProc In
0670: 74 65 72 70 50 72 6f 63 4e 52 32 3b 0a 73 74 61  terpProcNR2;.sta
0680: 74 69 63 20 54 63 6c 5f 4e 52 50 6f 73 74 50 72  tic Tcl_NRPostPr
0690: 6f 63 20 55 70 6c 65 76 65 6c 5f 43 61 6c 6c 62  oc Uplevel_Callb
06a0: 61 63 6b 3b 0a 0a 2f 2a 0a 20 2a 20 54 68 65 20  ack;../*. * The 
06b0: 50 72 6f 63 42 6f 64 79 4f 62 6a 54 79 70 65 20  ProcBodyObjType 
06c0: 74 79 70 65 0a 20 2a 2f 0a 0a 63 6f 6e 73 74 20  type. */..const 
06d0: 54 63 6c 5f 4f 62 6a 54 79 70 65 20 74 63 6c 50  Tcl_ObjType tclP
06e0: 72 6f 63 42 6f 64 79 54 79 70 65 20 3d 20 7b 0a  rocBodyType = {.
06f0: 20 20 20 20 22 70 72 6f 63 62 6f 64 79 22 2c 09      "procbody",.
0700: 09 09 2f 2a 20 6e 61 6d 65 20 66 6f 72 20 74 68  ../* name for th
0710: 69 73 20 74 79 70 65 20 2a 2f 0a 20 20 20 20 50  is type */.    P
0720: 72 6f 63 42 6f 64 79 46 72 65 65 2c 09 09 2f 2a  rocBodyFree,../*
0730: 20 46 72 65 65 49 6e 74 65 72 6e 61 6c 52 65 70   FreeInternalRep
0740: 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 20   function */.   
0750: 20 50 72 6f 63 42 6f 64 79 44 75 70 2c 09 09 2f   ProcBodyDup,../
0760: 2a 20 44 75 70 49 6e 74 65 72 6e 61 6c 52 65 70  * DupInternalRep
0770: 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 20   function */.   
0780: 20 4e 55 4c 4c 2c 09 09 09 2f 2a 20 55 70 64 61   NULL,.../* Upda
0790: 74 65 53 74 72 69 6e 67 20 66 75 6e 63 74 69 6f  teString functio
07a0: 6e 3b 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67  n; Tcl_GetString
07b0: 20 61 6e 64 0a 09 09 09 09 20 2a 20 54 63 6c 5f   and..... * Tcl_
07c0: 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a  GetStringFromObj
07d0: 20 73 68 6f 75 6c 64 20 70 61 6e 69 63 0a 09 09   should panic...
07e0: 09 09 20 2a 20 69 6e 73 74 65 61 64 2e 20 2a 2f  .. * instead. */
07f0: 0a 20 20 20 20 4e 55 4c 4c 09 09 09 2f 2a 20 53  .    NULL.../* S
0800: 65 74 46 72 6f 6d 41 6e 79 20 66 75 6e 63 74 69  etFromAny functi
0810: 6f 6e 3b 20 54 63 6c 5f 43 6f 6e 76 65 72 74 54  on; Tcl_ConvertT
0820: 6f 54 79 70 65 0a 09 09 09 09 20 2a 20 73 68 6f  oType..... * sho
0830: 75 6c 64 20 70 61 6e 69 63 20 69 6e 73 74 65 61  uld panic instea
0840: 64 2e 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 20 2a 20  d. */.};../*. * 
0850: 54 68 65 20 5b 75 70 76 61 72 5d 2f 5b 75 70 6c  The [upvar]/[upl
0860: 65 76 65 6c 5d 20 6c 65 76 65 6c 20 72 65 66 65  evel] level refe
0870: 72 65 6e 63 65 20 74 79 70 65 2e 20 55 73 65 73  rence type. Uses
0880: 20 74 68 65 20 6c 6f 6e 67 56 61 6c 75 65 20 66   the longValue f
0890: 69 65 6c 64 0a 20 2a 20 74 6f 20 72 65 6d 65 6d  ield. * to remem
08a0: 62 65 72 20 74 68 65 20 69 6e 74 65 67 65 72 20  ber the integer 
08b0: 76 61 6c 75 65 20 6f 66 20 61 20 70 61 72 73 65  value of a parse
08c0: 64 20 23 3c 69 6e 74 65 67 65 72 3e 20 66 6f 72  d #<integer> for
08d0: 6d 61 74 2e 0a 20 2a 0a 20 2a 20 55 73 65 73 20  mat.. *. * Uses 
08e0: 74 68 65 20 64 65 66 61 75 6c 74 20 62 65 68 61  the default beha
08f0: 76 69 6f 75 72 20 74 68 72 6f 75 67 68 6f 75 74  viour throughout
0900: 2c 20 61 6e 64 20 6e 65 76 65 72 20 64 69 73 70  , and never disp
0910: 6f 73 65 73 20 6f 66 20 74 68 65 20 73 74 72 69  oses of the stri
0920: 6e 67 0a 20 2a 20 72 65 70 3b 20 69 74 27 73 20  ng. * rep; it's 
0930: 6a 75 73 74 20 61 20 63 61 63 68 65 20 74 79 70  just a cache typ
0940: 65 2e 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20 63  e.. */..static c
0950: 6f 6e 73 74 20 54 63 6c 5f 4f 62 6a 54 79 70 65  onst Tcl_ObjType
0960: 20 6c 65 76 65 6c 52 65 66 65 72 65 6e 63 65 54   levelReferenceT
0970: 79 70 65 20 3d 20 7b 0a 20 20 20 20 22 6c 65 76  ype = {.    "lev
0980: 65 6c 52 65 66 65 72 65 6e 63 65 22 2c 0a 20 20  elReference",.  
0990: 20 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 4e 55    NULL, NULL, NU
09a0: 4c 4c 2c 20 4e 55 4c 4c 0a 7d 3b 0a 0a 2f 2a 0a  LL, NULL.};../*.
09b0: 20 2a 20 54 68 65 20 74 79 70 65 20 6f 66 20 6c   * The type of l
09c0: 61 6d 62 64 61 73 2e 20 4e 6f 74 65 20 74 68 61  ambdas. Note tha
09d0: 74 20 65 76 65 72 79 20 6c 61 6d 62 64 61 20 77  t every lambda w
09e0: 69 6c 6c 20 2a 61 6c 77 61 79 73 2a 20 68 61 76  ill *always* hav
09f0: 65 20 61 20 73 74 72 69 6e 67 0a 20 2a 20 72 65  e a string. * re
0a00: 70 72 65 73 65 6e 74 61 74 69 6f 6e 2e 0a 20 2a  presentation.. *
0a10: 0a 20 2a 20 49 6e 74 65 72 6e 61 6c 6c 79 2c 20  . * Internally, 
0a20: 70 74 72 31 20 69 73 20 61 20 70 6f 69 6e 74 65  ptr1 is a pointe
0a30: 72 20 74 6f 20 61 20 50 72 6f 63 20 69 6e 73 74  r to a Proc inst
0a40: 61 6e 63 65 20 74 68 61 74 20 69 73 20 6e 6f 74  ance that is not
0a50: 20 62 6f 75 6e 64 20 74 6f 20 61 0a 20 2a 20 63   bound to a. * c
0a60: 6f 6d 6d 61 6e 64 20 6e 61 6d 65 2c 20 61 6e 64  ommand name, and
0a70: 20 70 74 72 32 20 69 73 20 61 20 70 6f 69 6e 74   ptr2 is a point
0a80: 65 72 20 74 6f 20 74 68 65 20 6e 61 6d 65 73 70  er to the namesp
0a90: 61 63 65 20 74 68 61 74 20 74 68 65 20 50 72 6f  ace that the Pro
0aa0: 63 20 69 6e 73 74 61 6e 63 65 0a 20 2a 20 77 69  c instance. * wi
0ab0: 6c 6c 20 65 78 65 63 75 74 65 20 77 69 74 68 69  ll execute withi
0ac0: 6e 2e 20 49 46 20 59 4f 55 20 43 48 41 4e 47 45  n. IF YOU CHANGE
0ad0: 20 54 48 49 53 2c 20 43 48 45 43 4b 20 49 4e 20   THIS, CHECK IN 
0ae0: 74 63 6c 44 69 73 61 73 73 65 6d 62 6c 65 2e 63  tclDisassemble.c
0af0: 20 54 4f 4f 2e 0a 20 2a 2f 0a 0a 63 6f 6e 73 74   TOO.. */..const
0b00: 20 54 63 6c 5f 4f 62 6a 54 79 70 65 20 74 63 6c   Tcl_ObjType tcl
0b10: 4c 61 6d 62 64 61 54 79 70 65 20 3d 20 7b 0a 20  LambdaType = {. 
0b20: 20 20 20 22 6c 61 6d 62 64 61 45 78 70 72 22 2c     "lambdaExpr",
0b30: 09 09 2f 2a 20 6e 61 6d 65 20 2a 2f 0a 20 20 20  ../* name */.   
0b40: 20 46 72 65 65 4c 61 6d 62 64 61 49 6e 74 65 72   FreeLambdaInter
0b50: 6e 61 6c 52 65 70 2c 09 2f 2a 20 66 72 65 65 49  nalRep,./* freeI
0b60: 6e 74 52 65 70 50 72 6f 63 20 2a 2f 0a 20 20 20  ntRepProc */.   
0b70: 20 44 75 70 4c 61 6d 62 64 61 49 6e 74 65 72 6e   DupLambdaIntern
0b80: 61 6c 52 65 70 2c 09 2f 2a 20 64 75 70 49 6e 74  alRep,./* dupInt
0b90: 52 65 70 50 72 6f 63 20 2a 2f 0a 20 20 20 20 4e  RepProc */.    N
0ba0: 55 4c 4c 2c 09 09 09 2f 2a 20 75 70 64 61 74 65  ULL,.../* update
0bb0: 53 74 72 69 6e 67 50 72 6f 63 20 2a 2f 0a 20 20  StringProc */.  
0bc0: 20 20 53 65 74 4c 61 6d 62 64 61 46 72 6f 6d 41    SetLambdaFromA
0bd0: 6e 79 09 09 2f 2a 20 73 65 74 46 72 6f 6d 41 6e  ny../* setFromAn
0be0: 79 50 72 6f 63 20 2a 2f 0a 7d 3b 0a 0c 0a 2f 2a  yProc */.};.../*
0bf0: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
0c00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0c10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0c20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0c30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20  ---------. *. * 
0c40: 54 63 6c 5f 50 72 6f 63 4f 62 6a 43 6d 64 20 2d  Tcl_ProcObjCmd -
0c50: 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 6f 62 6a  -. *. *.This obj
0c60: 65 63 74 2d 62 61 73 65 64 20 66 75 6e 63 74 69  ect-based functi
0c70: 6f 6e 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f  on is invoked to
0c80: 20 70 72 6f 63 65 73 73 20 74 68 65 20 22 70 72   process the "pr
0c90: 6f 63 22 20 54 63 6c 0a 20 2a 09 63 6f 6d 6d 61  oc" Tcl. *.comma
0ca0: 6e 64 2e 20 53 65 65 20 74 68 65 20 75 73 65 72  nd. See the user
0cb0: 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 20 66   documentation f
0cc0: 6f 72 20 64 65 74 61 69 6c 73 20 6f 6e 20 77 68  or details on wh
0cd0: 61 74 20 69 74 20 64 6f 65 73 2e 0a 20 2a 0a 20  at it does.. *. 
0ce0: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20  * Results:. *.A 
0cf0: 73 74 61 6e 64 61 72 64 20 54 63 6c 20 6f 62 6a  standard Tcl obj
0d00: 65 63 74 20 72 65 73 75 6c 74 20 76 61 6c 75 65  ect result value
0d10: 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66  .. *. * Side eff
0d20: 65 63 74 73 3a 0a 20 2a 09 41 20 6e 65 77 20 70  ects:. *.A new p
0d30: 72 6f 63 65 64 75 72 65 20 67 65 74 73 20 63 72  rocedure gets cr
0d40: 65 61 74 65 64 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d  eated.. *. *----
0d50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0d60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0d70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0d80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0d90: 2d 2d 0a 20 2a 2f 0a 0a 23 75 6e 64 65 66 20 54  --. */..#undef T
0da0: 63 6c 4f 62 6a 49 6e 74 65 72 70 50 72 6f 63 0a  clObjInterpProc.
0db0: 69 6e 74 0a 54 63 6c 5f 50 72 6f 63 4f 62 6a 43  int.Tcl_ProcObjC
0dc0: 6d 64 28 0a 20 20 20 20 43 6c 69 65 6e 74 44 61  md(.    ClientDa
0dd0: 74 61 20 64 75 6d 6d 79 2c 09 09 2f 2a 20 4e 6f  ta dummy,../* No
0de0: 74 20 75 73 65 64 2e 20 2a 2f 0a 20 20 20 20 54  t used. */.    T
0df0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
0e00: 70 2c 09 09 2f 2a 20 43 75 72 72 65 6e 74 20 69  p,../* Current i
0e10: 6e 74 65 72 70 72 65 74 65 72 2e 20 2a 2f 0a 20  nterpreter. */. 
0e20: 20 20 20 69 6e 74 20 6f 62 6a 63 2c 09 09 09 2f     int objc,.../
0e30: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
0e40: 6d 65 6e 74 73 2e 20 2a 2f 0a 20 20 20 20 54 63  ments. */.    Tc
0e50: 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a  l_Obj *const obj
0e60: 76 5b 5d 29 09 2f 2a 20 41 72 67 75 6d 65 6e 74  v[])./* Argument
0e70: 20 6f 62 6a 65 63 74 73 2e 20 2a 2f 0a 7b 0a 20   objects. */.{. 
0e80: 20 20 20 49 6e 74 65 72 70 20 2a 69 50 74 72 20     Interp *iPtr 
0e90: 3d 20 28 49 6e 74 65 72 70 20 2a 29 20 69 6e 74  = (Interp *) int
0ea0: 65 72 70 3b 0a 20 20 20 20 50 72 6f 63 20 2a 70  erp;.    Proc *p
0eb0: 72 6f 63 50 74 72 3b 0a 20 20 20 20 63 6f 6e 73  rocPtr;.    cons
0ec0: 74 20 63 68 61 72 20 2a 70 72 6f 63 4e 61 6d 65  t char *procName
0ed0: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
0ee0: 20 2a 73 69 6d 70 6c 65 4e 61 6d 65 2c 20 2a 70   *simpleName, *p
0ef0: 72 6f 63 41 72 67 73 2c 20 2a 70 72 6f 63 42 6f  rocArgs, *procBo
0f00: 64 79 3b 0a 20 20 20 20 4e 61 6d 65 73 70 61 63  dy;.    Namespac
0f10: 65 20 2a 6e 73 50 74 72 2c 20 2a 61 6c 74 4e 73  e *nsPtr, *altNs
0f20: 50 74 72 2c 20 2a 63 78 74 4e 73 50 74 72 3b 0a  Ptr, *cxtNsPtr;.
0f30: 20 20 20 20 54 63 6c 5f 43 6f 6d 6d 61 6e 64 20      Tcl_Command 
0f40: 63 6d 64 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62  cmd;..    if (ob
0f50: 6a 63 20 21 3d 20 34 29 20 7b 0a 09 54 63 6c 5f  jc != 4) {..Tcl_
0f60: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74  WrongNumArgs(int
0f70: 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 6e  erp, 1, objv, "n
0f80: 61 6d 65 20 61 72 67 73 20 62 6f 64 79 22 29 3b  ame args body");
0f90: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52  ..return TCL_ERR
0fa0: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  OR;.    }..    /
0fb0: 2a 0a 20 20 20 20 20 2a 20 44 65 74 65 72 6d 69  *.     * Determi
0fc0: 6e 65 20 74 68 65 20 6e 61 6d 65 73 70 61 63 65  ne the namespace
0fd0: 20 77 68 65 72 65 20 74 68 65 20 70 72 6f 63 65   where the proce
0fe0: 64 75 72 65 20 73 68 6f 75 6c 64 20 72 65 73 69  dure should resi
0ff0: 64 65 2e 20 55 6e 6c 65 73 73 20 74 68 65 0a 20  de. Unless the. 
1000: 20 20 20 20 2a 20 63 6f 6d 6d 61 6e 64 20 6e 61      * command na
1010: 6d 65 20 69 6e 63 6c 75 64 65 73 20 6e 61 6d 65  me includes name
1020: 73 70 61 63 65 20 71 75 61 6c 69 66 69 65 72 73  space qualifiers
1030: 2c 20 74 68 69 73 20 77 69 6c 6c 20 62 65 20 74  , this will be t
1040: 68 65 20 63 75 72 72 65 6e 74 0a 20 20 20 20 20  he current.     
1050: 2a 20 6e 61 6d 65 73 70 61 63 65 2e 0a 20 20 20  * namespace..   
1060: 20 20 2a 2f 0a 0a 20 20 20 20 70 72 6f 63 4e 61    */..    procNa
1070: 6d 65 20 3d 20 54 63 6c 47 65 74 53 74 72 69 6e  me = TclGetStrin
1080: 67 28 6f 62 6a 76 5b 31 5d 29 3b 0a 20 20 20 20  g(objv[1]);.    
1090: 54 63 6c 47 65 74 4e 61 6d 65 73 70 61 63 65 46  TclGetNamespaceF
10a0: 6f 72 51 75 61 6c 4e 61 6d 65 28 69 6e 74 65 72  orQualName(inter
10b0: 70 2c 20 70 72 6f 63 4e 61 6d 65 2c 20 4e 55 4c  p, procName, NUL
10c0: 4c 2c 20 30 2c 0a 09 20 20 20 20 26 6e 73 50 74  L, 0,..    &nsPt
10d0: 72 2c 20 26 61 6c 74 4e 73 50 74 72 2c 20 26 63  r, &altNsPtr, &c
10e0: 78 74 4e 73 50 74 72 2c 20 26 73 69 6d 70 6c 65  xtNsPtr, &simple
10f0: 4e 61 6d 65 29 3b 0a 0a 20 20 20 20 69 66 20 28  Name);..    if (
1100: 6e 73 50 74 72 20 3d 3d 20 4e 55 4c 4c 29 20 7b  nsPtr == NULL) {
1110: 0a 09 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75  ..Tcl_SetObjResu
1120: 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4f  lt(interp, Tcl_O
1130: 62 6a 50 72 69 6e 74 66 28 0a 09 09 22 63 61 6e  bjPrintf(..."can
1140: 27 74 20 63 72 65 61 74 65 20 70 72 6f 63 65 64  't create proced
1150: 75 72 65 20 5c 22 25 73 5c 22 3a 20 75 6e 6b 6e  ure \"%s\": unkn
1160: 6f 77 6e 20 6e 61 6d 65 73 70 61 63 65 22 2c 0a  own namespace",.
1170: 09 09 70 72 6f 63 4e 61 6d 65 29 29 3b 0a 09 54  ..procName));..T
1180: 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28  cl_SetErrorCode(
1190: 69 6e 74 65 72 70 2c 20 22 54 43 4c 22 2c 20 22  interp, "TCL", "
11a0: 56 41 4c 55 45 22 2c 20 22 43 4f 4d 4d 41 4e 44  VALUE", "COMMAND
11b0: 22 2c 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29  ", (char *)NULL)
11c0: 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  ;..return TCL_ER
11d0: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ROR;.    }.    i
11e0: 66 20 28 73 69 6d 70 6c 65 4e 61 6d 65 20 3d 3d  f (simpleName ==
11f0: 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f 53 65   NULL) {..Tcl_Se
1200: 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
1210: 70 2c 20 54 63 6c 5f 4f 62 6a 50 72 69 6e 74 66  p, Tcl_ObjPrintf
1220: 28 0a 09 09 22 63 61 6e 27 74 20 63 72 65 61 74  (..."can't creat
1230: 65 20 70 72 6f 63 65 64 75 72 65 20 5c 22 25 73  e procedure \"%s
1240: 5c 22 3a 20 62 61 64 20 70 72 6f 63 65 64 75 72  \": bad procedur
1250: 65 20 6e 61 6d 65 22 2c 0a 09 09 70 72 6f 63 4e  e name",...procN
1260: 61 6d 65 29 29 3b 0a 09 54 63 6c 5f 53 65 74 45  ame));..Tcl_SetE
1270: 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c  rrorCode(interp,
1280: 20 22 54 43 4c 22 2c 20 22 56 41 4c 55 45 22 2c   "TCL", "VALUE",
1290: 20 22 43 4f 4d 4d 41 4e 44 22 2c 20 28 63 68 61   "COMMAND", (cha
12a0: 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 72 65 74 75  r *)NULL);..retu
12b0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20  rn TCL_ERROR;.  
12c0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20    }..    /*.    
12d0: 20 2a 20 43 72 65 61 74 65 20 74 68 65 20 64 61   * Create the da
12e0: 74 61 20 73 74 72 75 63 74 75 72 65 20 74 6f 20  ta structure to 
12f0: 72 65 70 72 65 73 65 6e 74 20 74 68 65 20 70 72  represent the pr
1300: 6f 63 65 64 75 72 65 2e 0a 20 20 20 20 20 2a 2f  ocedure..     */
1310: 0a 0a 20 20 20 20 69 66 20 28 54 63 6c 43 72 65  ..    if (TclCre
1320: 61 74 65 50 72 6f 63 28 69 6e 74 65 72 70 2c 20  ateProc(interp, 
1330: 6e 73 50 74 72 2c 20 73 69 6d 70 6c 65 4e 61 6d  nsPtr, simpleNam
1340: 65 2c 20 6f 62 6a 76 5b 32 5d 2c 0a 09 20 20 20  e, objv[2],..   
1350: 20 6f 62 6a 76 5b 33 5d 2c 20 26 70 72 6f 63 50   objv[3], &procP
1360: 74 72 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b  tr) != TCL_OK) {
1370: 0a 09 54 63 6c 5f 41 64 64 45 72 72 6f 72 49 6e  ..Tcl_AddErrorIn
1380: 66 6f 28 69 6e 74 65 72 70 2c 20 22 5c 6e 20 20  fo(interp, "\n  
1390: 20 20 28 63 72 65 61 74 69 6e 67 20 70 72 6f 63    (creating proc
13a0: 20 5c 22 22 29 3b 0a 09 54 63 6c 5f 41 64 64 45   \"");..Tcl_AddE
13b0: 72 72 6f 72 49 6e 66 6f 28 69 6e 74 65 72 70 2c  rrorInfo(interp,
13c0: 20 73 69 6d 70 6c 65 4e 61 6d 65 29 3b 0a 09 54   simpleName);..T
13d0: 63 6c 5f 41 64 64 45 72 72 6f 72 49 6e 66 6f 28  cl_AddErrorInfo(
13e0: 69 6e 74 65 72 70 2c 20 22 5c 22 29 22 29 3b 0a  interp, "\")");.
13f0: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f  .return TCL_ERRO
1400: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 6d  R;.    }..    cm
1410: 64 20 3d 20 54 63 6c 4e 52 43 72 65 61 74 65 43  d = TclNRCreateC
1420: 6f 6d 6d 61 6e 64 49 6e 4e 73 28 69 6e 74 65 72  ommandInNs(inter
1430: 70 2c 20 73 69 6d 70 6c 65 4e 61 6d 65 2c 20 28  p, simpleName, (
1440: 54 63 6c 5f 4e 61 6d 65 73 70 61 63 65 20 2a 29  Tcl_Namespace *)
1450: 20 6e 73 50 74 72 2c 0a 09 54 63 6c 4f 62 6a 49   nsPtr,..TclObjI
1460: 6e 74 65 72 70 50 72 6f 63 2c 20 54 63 6c 4e 52  nterpProc, TclNR
1470: 49 6e 74 65 72 70 50 72 6f 63 2c 20 70 72 6f 63  InterpProc, proc
1480: 50 74 72 2c 20 54 63 6c 50 72 6f 63 44 65 6c 65  Ptr, TclProcDele
1490: 74 65 50 72 6f 63 29 3b 0a 0a 20 20 20 20 2f 2a  teProc);..    /*
14a0: 0a 20 20 20 20 20 2a 20 4e 6f 77 20 69 6e 69 74  .     * Now init
14b0: 69 61 6c 69 7a 65 20 74 68 65 20 6e 65 77 20 70  ialize the new p
14c0: 72 6f 63 65 64 75 72 65 27 73 20 63 6d 64 50 74  rocedure's cmdPt
14d0: 72 20 66 69 65 6c 64 2e 20 54 68 69 73 20 77 69  r field. This wi
14e0: 6c 6c 20 62 65 20 75 73 65 64 0a 20 20 20 20 20  ll be used.     
14f0: 2a 20 6c 61 74 65 72 20 77 68 65 6e 20 74 68 65  * later when the
1500: 20 70 72 6f 63 65 64 75 72 65 20 69 73 20 63 61   procedure is ca
1510: 6c 6c 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e  lled to determin
1520: 65 20 77 68 61 74 20 6e 61 6d 65 73 70 61 63 65  e what namespace
1530: 20 74 68 65 0a 20 20 20 20 20 2a 20 70 72 6f 63   the.     * proc
1540: 65 64 75 72 65 20 77 69 6c 6c 20 72 75 6e 20 69  edure will run i
1550: 6e 2e 20 54 68 69 73 20 77 69 6c 6c 20 62 65 20  n. This will be 
1560: 64 69 66 66 65 72 65 6e 74 20 74 68 61 6e 20 74  different than t
1570: 68 65 20 63 75 72 72 65 6e 74 0a 20 20 20 20 20  he current.     
1580: 2a 20 6e 61 6d 65 73 70 61 63 65 20 69 66 20 74  * namespace if t
1590: 68 65 20 70 72 6f 63 20 77 61 73 20 72 65 6e 61  he proc was rena
15a0: 6d 65 64 20 69 6e 74 6f 20 61 20 64 69 66 66 65  med into a diffe
15b0: 72 65 6e 74 20 6e 61 6d 65 73 70 61 63 65 2e 0a  rent namespace..
15c0: 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 70 72 6f       */..    pro
15d0: 63 50 74 72 2d 3e 63 6d 64 50 74 72 20 3d 20 28  cPtr->cmdPtr = (
15e0: 43 6f 6d 6d 61 6e 64 20 2a 29 20 63 6d 64 3b 0a  Command *) cmd;.
15f0: 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 54  .    /*.     * T
1600: 49 50 20 23 32 38 30 3a 20 52 65 6d 65 6d 62 65  IP #280: Remembe
1610: 72 20 74 68 65 20 6c 69 6e 65 20 74 68 65 20 70  r the line the p
1620: 72 6f 63 65 64 75 72 65 20 62 6f 64 79 20 69 73  rocedure body is
1630: 20 73 74 61 72 74 69 6e 67 20 6f 6e 2e 20 49 6e   starting on. In
1640: 20 61 0a 20 20 20 20 20 2a 20 62 79 74 65 63 6f   a.     * byteco
1650: 64 65 20 63 6f 6e 74 65 78 74 20 77 65 20 61 73  de context we as
1660: 6b 20 74 68 65 20 65 6e 67 69 6e 65 20 74 6f 20  k the engine to 
1670: 70 72 6f 76 69 64 65 20 75 73 20 77 69 74 68 20  provide us with 
1680: 74 68 65 20 6e 65 63 65 73 73 61 72 79 0a 20 20  the necessary.  
1690: 20 20 20 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e     * information
16a0: 2e 20 54 68 69 73 20 69 73 20 66 6f 72 20 74 68  . This is for th
16b0: 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e  e initialization
16c0: 20 6f 66 20 74 68 65 20 62 79 74 65 20 63 6f 64   of the byte cod
16d0: 65 20 63 6f 6d 70 69 6c 65 72 0a 20 20 20 20 20  e compiler.     
16e0: 2a 20 77 68 65 6e 20 74 68 65 20 62 6f 64 79 20  * when the body 
16f0: 69 73 20 75 73 65 64 20 66 6f 72 20 74 68 65 20  is used for the 
1700: 66 69 72 73 74 20 74 69 6d 65 2e 0a 20 20 20 20  first time..    
1710: 20 2a 0a 20 20 20 20 20 2a 20 54 68 69 73 20 63   *.     * This c
1720: 6f 64 65 20 69 73 20 6e 65 61 72 6c 79 20 69 64  ode is nearly id
1730: 65 6e 74 69 63 61 6c 20 74 6f 20 74 68 65 20 23  entical to the #
1740: 32 38 30 20 63 6f 64 65 20 69 6e 20 53 65 74 4c  280 code in SetL
1750: 61 6d 62 64 61 46 72 6f 6d 41 6e 79 2c 20 73 65  ambdaFromAny, se
1760: 65 0a 20 20 20 20 20 2a 20 74 68 69 73 20 66 69  e.     * this fi
1770: 6c 65 2e 20 54 68 65 20 64 69 66 66 65 72 65 6e  le. The differen
1780: 63 65 73 20 61 72 65 20 74 68 65 20 64 69 66 66  ces are the diff
1790: 65 72 65 6e 74 20 69 6e 64 65 78 20 6f 66 20 74  erent index of t
17a0: 68 65 20 62 6f 64 79 20 69 6e 20 74 68 65 0a 20  he body in the. 
17b0: 20 20 20 20 2a 20 6c 69 6e 65 20 61 72 72 61 79      * line array
17c0: 20 6f 66 20 74 68 65 20 63 6f 6e 74 65 78 74 2c   of the context,
17d0: 20 61 6e 64 20 74 68 65 20 6c 61 6d 62 64 61 20   and the lambda 
17e0: 63 6f 64 65 20 72 65 71 75 69 72 65 73 20 73 6f  code requires so
17f0: 6d 65 20 73 70 65 63 69 61 6c 0a 20 20 20 20 20  me special.     
1800: 2a 20 70 72 6f 63 65 73 73 69 6e 67 2e 20 46 69  * processing. Fi
1810: 6e 64 20 61 20 77 61 79 20 74 6f 20 66 61 63 74  nd a way to fact
1820: 6f 72 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 65 6c  or the common el
1830: 65 6d 65 6e 74 73 20 69 6e 74 6f 20 61 20 73 69  ements into a si
1840: 6e 67 6c 65 0a 20 20 20 20 20 2a 20 66 75 6e 63  ngle.     * func
1850: 74 69 6f 6e 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20  tion..     */.. 
1860: 20 20 20 69 66 20 28 69 50 74 72 2d 3e 63 6d 64     if (iPtr->cmd
1870: 46 72 61 6d 65 50 74 72 29 20 7b 0a 09 43 6d 64  FramePtr) {..Cmd
1880: 46 72 61 6d 65 20 2a 63 6f 6e 74 65 78 74 50 74  Frame *contextPt
1890: 72 20 3d 20 28 43 6d 64 46 72 61 6d 65 20 2a 29  r = (CmdFrame *)
18a0: 54 63 6c 53 74 61 63 6b 41 6c 6c 6f 63 28 69 6e  TclStackAlloc(in
18b0: 74 65 72 70 2c 20 73 69 7a 65 6f 66 28 43 6d 64  terp, sizeof(Cmd
18c0: 46 72 61 6d 65 29 29 3b 0a 0a 09 2a 63 6f 6e 74  Frame));...*cont
18d0: 65 78 74 50 74 72 20 3d 20 2a 69 50 74 72 2d 3e  extPtr = *iPtr->
18e0: 63 6d 64 46 72 61 6d 65 50 74 72 3b 0a 09 69 66  cmdFramePtr;..if
18f0: 20 28 63 6f 6e 74 65 78 74 50 74 72 2d 3e 74 79   (contextPtr->ty
1900: 70 65 20 3d 3d 20 54 43 4c 5f 4c 4f 43 41 54 49  pe == TCL_LOCATI
1910: 4f 4e 5f 42 43 29 20 7b 0a 09 20 20 20 20 2f 2a  ON_BC) {..    /*
1920: 0a 09 20 20 20 20 20 2a 20 52 65 74 72 69 65 76  ..     * Retriev
1930: 65 20 73 6f 75 72 63 65 20 69 6e 66 6f 72 6d 61  e source informa
1940: 74 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 62 79  tion from the by
1950: 74 65 63 6f 64 65 2c 20 69 66 20 70 6f 73 73 69  tecode, if possi
1960: 62 6c 65 2e 20 49 66 0a 09 20 20 20 20 20 2a 20  ble. If..     * 
1970: 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  the information 
1980: 69 73 20 72 65 74 72 69 65 76 65 64 20 73 75 63  is retrieved suc
1990: 63 65 73 73 66 75 6c 6c 79 2c 20 63 6f 6e 74 65  cessfully, conte
19a0: 78 74 2e 74 79 70 65 20 77 69 6c 6c 20 62 65 0a  xt.type will be.
19b0: 09 20 20 20 20 20 2a 20 54 43 4c 5f 4c 4f 43 41  .     * TCL_LOCA
19c0: 54 49 4f 4e 5f 53 4f 55 52 43 45 20 61 6e 64 20  TION_SOURCE and 
19d0: 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 68 65  the reference he
19e0: 6c 64 20 62 79 0a 09 20 20 20 20 20 2a 20 63 6f  ld by..     * co
19f0: 6e 74 65 78 74 2e 64 61 74 61 2e 65 76 61 6c 2e  ntext.data.eval.
1a00: 70 61 74 68 20 77 69 6c 6c 20 62 65 20 63 6f 75  path will be cou
1a10: 6e 74 65 64 2e 0a 09 20 20 20 20 20 2a 2f 0a 0a  nted...     */..
1a20: 09 20 20 20 20 54 63 6c 47 65 74 53 72 63 49 6e  .    TclGetSrcIn
1a30: 66 6f 46 6f 72 50 63 28 63 6f 6e 74 65 78 74 50  foForPc(contextP
1a40: 74 72 29 3b 0a 09 7d 20 65 6c 73 65 20 69 66 20  tr);..} else if 
1a50: 28 63 6f 6e 74 65 78 74 50 74 72 2d 3e 74 79 70  (contextPtr->typ
1a60: 65 20 3d 3d 20 54 43 4c 5f 4c 4f 43 41 54 49 4f  e == TCL_LOCATIO
1a70: 4e 5f 53 4f 55 52 43 45 29 20 7b 0a 09 20 20 20  N_SOURCE) {..   
1a80: 20 2f 2a 0a 09 20 20 20 20 20 2a 20 54 68 65 20   /*..     * The 
1a90: 63 6f 70 79 20 69 6e 74 6f 20 27 63 6f 6e 74 65  copy into 'conte
1aa0: 78 74 27 20 75 70 20 61 62 6f 76 65 20 68 61 73  xt' up above has
1ab0: 20 63 72 65 61 74 65 64 20 61 6e 6f 74 68 65 72   created another
1ac0: 20 72 65 66 65 72 65 6e 63 65 0a 09 20 20 20 20   reference..    
1ad0: 20 2a 20 74 6f 20 27 63 6f 6e 74 65 78 74 2e 64   * to 'context.d
1ae0: 61 74 61 2e 65 76 61 6c 2e 70 61 74 68 27 3b 20  ata.eval.path'; 
1af0: 61 63 63 6f 75 6e 74 20 66 6f 72 20 69 74 2e 0a  account for it..
1b00: 09 20 20 20 20 20 2a 2f 0a 0a 09 20 20 20 20 54  .     */...    T
1b10: 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28  cl_IncrRefCount(
1b20: 63 6f 6e 74 65 78 74 50 74 72 2d 3e 64 61 74 61  contextPtr->data
1b30: 2e 65 76 61 6c 2e 70 61 74 68 29 3b 0a 09 7d 0a  .eval.path);..}.
1b40: 0a 09 69 66 20 28 63 6f 6e 74 65 78 74 50 74 72  ..if (contextPtr
1b50: 2d 3e 74 79 70 65 20 3d 3d 20 54 43 4c 5f 4c 4f  ->type == TCL_LO
1b60: 43 41 54 49 4f 4e 5f 53 4f 55 52 43 45 29 20 7b  CATION_SOURCE) {
1b70: 0a 09 20 20 20 20 2f 2a 0a 09 20 20 20 20 20 2a  ..    /*..     *
1b80: 20 57 65 20 63 61 6e 20 61 63 63 6f 75 6e 74 20   We can account 
1b90: 66 6f 72 20 73 6f 75 72 63 65 20 6c 6f 63 61 74  for source locat
1ba0: 69 6f 6e 20 77 69 74 68 69 6e 20 61 20 70 72 6f  ion within a pro
1bb0: 63 20 6f 6e 6c 79 20 69 66 20 74 68 65 0a 09 20  c only if the.. 
1bc0: 20 20 20 20 2a 20 70 72 6f 63 20 62 6f 64 79 20      * proc body 
1bd0: 77 61 73 20 6e 6f 74 20 63 72 65 61 74 65 64 20  was not created 
1be0: 62 79 20 73 75 62 73 74 69 74 75 74 69 6f 6e 2e  by substitution.
1bf0: 0a 09 20 20 20 20 20 2a 2f 0a 0a 09 20 20 20 20  ..     */...    
1c00: 69 66 20 28 63 6f 6e 74 65 78 74 50 74 72 2d 3e  if (contextPtr->
1c10: 6c 69 6e 65 0a 09 09 20 20 20 20 26 26 20 28 63  line...    && (c
1c20: 6f 6e 74 65 78 74 50 74 72 2d 3e 6e 6c 69 6e 65  ontextPtr->nline
1c30: 20 3e 3d 20 34 29 20 26 26 20 28 63 6f 6e 74 65   >= 4) && (conte
1c40: 78 74 50 74 72 2d 3e 6c 69 6e 65 5b 33 5d 20 3e  xtPtr->line[3] >
1c50: 3d 20 30 29 29 20 7b 0a 09 09 69 6e 74 20 69 73  = 0)) {...int is
1c60: 4e 65 77 3b 0a 09 09 54 63 6c 5f 48 61 73 68 45  New;...Tcl_HashE
1c70: 6e 74 72 79 20 2a 68 65 50 74 72 3b 0a 09 09 43  ntry *hePtr;...C
1c80: 6d 64 46 72 61 6d 65 20 2a 63 66 50 74 72 20 3d  mdFrame *cfPtr =
1c90: 20 28 43 6d 64 46 72 61 6d 65 20 2a 29 63 6b 61   (CmdFrame *)cka
1ca0: 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 43 6d 64 46  lloc(sizeof(CmdF
1cb0: 72 61 6d 65 29 29 3b 0a 0a 09 09 63 66 50 74 72  rame));....cfPtr
1cc0: 2d 3e 6c 65 76 65 6c 20 3d 20 2d 31 3b 0a 09 09  ->level = -1;...
1cd0: 63 66 50 74 72 2d 3e 74 79 70 65 20 3d 20 63 6f  cfPtr->type = co
1ce0: 6e 74 65 78 74 50 74 72 2d 3e 74 79 70 65 3b 0a  ntextPtr->type;.
1cf0: 09 09 63 66 50 74 72 2d 3e 6c 69 6e 65 20 3d 20  ..cfPtr->line = 
1d00: 28 69 6e 74 20 2a 29 63 6b 61 6c 6c 6f 63 28 73  (int *)ckalloc(s
1d10: 69 7a 65 6f 66 28 69 6e 74 29 29 3b 0a 09 09 63  izeof(int));...c
1d20: 66 50 74 72 2d 3e 6c 69 6e 65 5b 30 5d 20 3d 20  fPtr->line[0] = 
1d30: 63 6f 6e 74 65 78 74 50 74 72 2d 3e 6c 69 6e 65  contextPtr->line
1d40: 5b 33 5d 3b 0a 09 09 63 66 50 74 72 2d 3e 6e 6c  [3];...cfPtr->nl
1d50: 69 6e 65 20 3d 20 31 3b 0a 09 09 63 66 50 74 72  ine = 1;...cfPtr
1d60: 2d 3e 66 72 61 6d 65 50 74 72 20 3d 20 4e 55 4c  ->framePtr = NUL
1d70: 4c 3b 0a 09 09 63 66 50 74 72 2d 3e 6e 65 78 74  L;...cfPtr->next
1d80: 50 74 72 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 09 63  Ptr = NULL;....c
1d90: 66 50 74 72 2d 3e 64 61 74 61 2e 65 76 61 6c 2e  fPtr->data.eval.
1da0: 70 61 74 68 20 3d 20 63 6f 6e 74 65 78 74 50 74  path = contextPt
1db0: 72 2d 3e 64 61 74 61 2e 65 76 61 6c 2e 70 61 74  r->data.eval.pat
1dc0: 68 3b 0a 09 09 54 63 6c 5f 49 6e 63 72 52 65 66  h;...Tcl_IncrRef
1dd0: 43 6f 75 6e 74 28 63 66 50 74 72 2d 3e 64 61 74  Count(cfPtr->dat
1de0: 61 2e 65 76 61 6c 2e 70 61 74 68 29 3b 0a 0a 09  a.eval.path);...
1df0: 09 63 66 50 74 72 2d 3e 63 6d 64 20 3d 20 4e 55  .cfPtr->cmd = NU
1e00: 4c 4c 3b 0a 09 09 63 66 50 74 72 2d 3e 6c 65 6e  LL;...cfPtr->len
1e10: 20 3d 20 30 3b 0a 0a 09 09 68 65 50 74 72 20 3d   = 0;....hePtr =
1e20: 20 54 63 6c 5f 43 72 65 61 74 65 48 61 73 68 45   Tcl_CreateHashE
1e30: 6e 74 72 79 28 69 50 74 72 2d 3e 6c 69 6e 65 50  ntry(iPtr->lineP
1e40: 42 6f 64 79 50 74 72 2c 0a 09 09 09 28 63 68 61  BodyPtr,....(cha
1e50: 72 20 2a 29 70 72 6f 63 50 74 72 2c 20 26 69 73  r *)procPtr, &is
1e60: 4e 65 77 29 3b 0a 09 09 69 66 20 28 21 69 73 4e  New);...if (!isN
1e70: 65 77 29 20 7b 0a 09 09 20 20 20 20 2f 2a 0a 09  ew) {...    /*..
1e80: 09 20 20 20 20 20 2a 20 47 65 74 20 74 68 65 20  .     * Get the 
1e90: 6f 6c 64 20 63 6f 6d 6d 61 6e 64 20 66 72 61 6d  old command fram
1ea0: 65 20 61 6e 64 20 72 65 6c 65 61 73 65 20 69 74  e and release it
1eb0: 2e 20 53 65 65 20 61 6c 73 6f 0a 09 09 20 20 20  . See also...   
1ec0: 20 20 2a 20 54 63 6c 50 72 6f 63 43 6c 65 61 6e    * TclProcClean
1ed0: 75 70 50 72 6f 63 20 69 6e 20 74 68 69 73 20 66  upProc in this f
1ee0: 69 6c 65 2e 20 43 75 72 72 65 6e 74 6c 79 20 69  ile. Currently i
1ef0: 74 20 73 65 65 6d 73 20 61 73 0a 09 09 20 20 20  t seems as...   
1f00: 20 20 2a 20 69 66 20 6f 6e 6c 79 20 74 68 65 20    * if only the 
1f10: 70 72 6f 63 62 6f 64 79 74 65 73 74 3a 3a 70 72  procbodytest::pr
1f20: 6f 63 20 63 6f 6d 6d 61 6e 64 20 6f 66 20 74 68  oc command of th
1f30: 65 20 74 65 73 74 73 75 69 74 65 0a 09 09 20 20  e testsuite...  
1f40: 20 20 20 2a 20 69 73 20 61 62 6c 65 20 74 6f 20     * is able to 
1f50: 74 72 69 67 67 65 72 20 74 68 69 73 20 73 69 74  trigger this sit
1f60: 75 61 74 69 6f 6e 2e 0a 09 09 20 20 20 20 20 2a  uation....     *
1f70: 2f 0a 0a 09 09 20 20 20 20 43 6d 64 46 72 61 6d  /....    CmdFram
1f80: 65 20 2a 63 66 4f 6c 64 50 74 72 20 3d 20 28 43  e *cfOldPtr = (C
1f90: 6d 64 46 72 61 6d 65 20 2a 29 54 63 6c 5f 47 65  mdFrame *)Tcl_Ge
1fa0: 74 48 61 73 68 56 61 6c 75 65 28 68 65 50 74 72  tHashValue(hePtr
1fb0: 29 3b 0a 0a 09 09 20 20 20 20 69 66 20 28 63 66  );....    if (cf
1fc0: 4f 6c 64 50 74 72 2d 3e 74 79 70 65 20 3d 3d 20  OldPtr->type == 
1fd0: 54 43 4c 5f 4c 4f 43 41 54 49 4f 4e 5f 53 4f 55  TCL_LOCATION_SOU
1fe0: 52 43 45 29 20 7b 0a 09 09 09 54 63 6c 5f 44 65  RCE) {....Tcl_De
1ff0: 63 72 52 65 66 43 6f 75 6e 74 28 63 66 4f 6c 64  crRefCount(cfOld
2000: 50 74 72 2d 3e 64 61 74 61 2e 65 76 61 6c 2e 70  Ptr->data.eval.p
2010: 61 74 68 29 3b 0a 09 09 09 63 66 4f 6c 64 50 74  ath);....cfOldPt
2020: 72 2d 3e 64 61 74 61 2e 65 76 61 6c 2e 70 61 74  r->data.eval.pat
2030: 68 20 3d 20 4e 55 4c 4c 3b 0a 09 09 20 20 20 20  h = NULL;...    
2040: 7d 0a 09 09 20 20 20 20 63 6b 66 72 65 65 28 63  }...    ckfree(c
2050: 66 4f 6c 64 50 74 72 2d 3e 6c 69 6e 65 29 3b 0a  fOldPtr->line);.
2060: 09 09 20 20 20 20 63 66 4f 6c 64 50 74 72 2d 3e  ..    cfOldPtr->
2070: 6c 69 6e 65 20 3d 20 4e 55 4c 4c 3b 0a 09 09 20  line = NULL;... 
2080: 20 20 20 63 6b 66 72 65 65 28 63 66 4f 6c 64 50     ckfree(cfOldP
2090: 74 72 29 3b 0a 09 09 7d 0a 09 09 54 63 6c 5f 53  tr);...}...Tcl_S
20a0: 65 74 48 61 73 68 56 61 6c 75 65 28 68 65 50 74  etHashValue(hePt
20b0: 72 2c 20 63 66 50 74 72 29 3b 0a 09 20 20 20 20  r, cfPtr);..    
20c0: 7d 0a 0a 09 20 20 20 20 2f 2a 0a 09 20 20 20 20  }...    /*..    
20d0: 20 2a 20 27 63 6f 6e 74 65 78 74 50 74 72 27 20   * 'contextPtr' 
20e0: 69 73 20 67 6f 69 6e 67 20 6f 75 74 20 6f 66 20  is going out of 
20f0: 73 63 6f 70 65 3b 20 61 63 63 6f 75 6e 74 20 66  scope; account f
2100: 6f 72 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  or the reference
2110: 0a 09 20 20 20 20 20 2a 20 74 68 61 74 20 69 74  ..     * that it
2120: 27 73 20 68 6f 6c 64 69 6e 67 20 74 6f 20 74 68  's holding to th
2130: 65 20 70 61 74 68 20 6e 61 6d 65 2e 0a 09 20 20  e path name...  
2140: 20 20 20 2a 2f 0a 0a 09 20 20 20 20 54 63 6c 5f     */...    Tcl_
2150: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 63 6f 6e  DecrRefCount(con
2160: 74 65 78 74 50 74 72 2d 3e 64 61 74 61 2e 65 76  textPtr->data.ev
2170: 61 6c 2e 70 61 74 68 29 3b 0a 09 20 20 20 20 63  al.path);..    c
2180: 6f 6e 74 65 78 74 50 74 72 2d 3e 64 61 74 61 2e  ontextPtr->data.
2190: 65 76 61 6c 2e 70 61 74 68 20 3d 20 4e 55 4c 4c  eval.path = NULL
21a0: 3b 0a 09 7d 0a 09 54 63 6c 53 74 61 63 6b 46 72  ;..}..TclStackFr
21b0: 65 65 28 69 6e 74 65 72 70 2c 20 63 6f 6e 74 65  ee(interp, conte
21c0: 78 74 50 74 72 29 3b 0a 20 20 20 20 7d 0a 0a 20  xtPtr);.    }.. 
21d0: 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 4f 70 74     /*.     * Opt
21e0: 69 6d 69 7a 65 20 66 6f 72 20 6e 6f 2d 6f 70 20  imize for no-op 
21f0: 70 72 6f 63 73 3a 20 69 66 20 74 68 65 20 62 6f  procs: if the bo
2200: 64 79 20 69 73 20 6e 6f 74 20 70 72 65 63 6f 6d  dy is not precom
2210: 70 69 6c 65 64 20 28 6c 69 6b 65 20 61 20 54 63  piled (like a Tc
2220: 6c 50 72 6f 0a 20 20 20 20 20 2a 20 70 72 6f 63  lPro.     * proc
2230: 62 6f 64 79 29 2c 20 61 6e 64 20 74 68 65 20 61  body), and the a
2240: 72 67 75 6d 65 6e 74 20 6c 69 73 74 20 69 73 20  rgument list is 
2250: 6a 75 73 74 20 22 61 72 67 73 22 20 61 6e 64 20  just "args" and 
2260: 74 68 65 20 62 6f 64 79 20 69 73 20 65 6d 70 74  the body is empt
2270: 79 2c 0a 20 20 20 20 20 2a 20 64 65 66 69 6e 65  y,.     * define
2280: 20 61 20 63 6f 6d 70 69 6c 65 50 72 6f 63 20 74   a compileProc t
2290: 6f 20 63 6f 6d 70 69 6c 65 20 61 20 6e 6f 2d 6f  o compile a no-o
22a0: 70 2e 0a 20 20 20 20 20 2a 0a 20 20 20 20 20 2a  p..     *.     *
22b0: 20 4e 6f 74 65 73 3a 0a 20 20 20 20 20 2a 09 20   Notes:.     *. 
22c0: 2d 20 63 61 6e 6e 6f 74 20 62 65 20 64 6f 6e 65  - cannot be done
22d0: 20 66 6f 72 20 61 6e 79 20 61 72 67 75 6d 65 6e   for any argumen
22e0: 74 20 6c 69 73 74 20 77 69 74 68 6f 75 74 20 68  t list without h
22f0: 61 76 69 6e 67 20 64 69 66 66 65 72 65 6e 74 0a  aving different.
2300: 20 20 20 20 20 2a 09 20 20 20 63 6f 6d 70 69 6c       *.   compil
2310: 65 64 2f 6e 6f 74 2d 63 6f 6d 70 69 6c 65 64 20  ed/not-compiled 
2320: 62 65 68 61 76 69 6f 75 72 20 69 6e 20 74 68 65  behaviour in the
2330: 20 22 77 72 6f 6e 67 20 61 72 67 75 6d 65 6e 74   "wrong argument
2340: 20 23 22 20 63 61 73 65 2c 20 6f 72 0a 20 20 20   #" case, or.   
2350: 20 20 2a 09 20 20 20 6d 61 6b 69 6e 67 20 74 68    *.   making th
2360: 69 73 20 63 6f 64 65 20 6d 75 63 68 20 6d 6f 72  is code much mor
2370: 65 20 63 6f 6d 70 6c 69 63 61 74 65 64 2e 20 49  e complicated. I
2380: 6e 20 61 6e 79 20 63 61 73 65 2c 20 69 74 20 64  n any case, it d
2390: 6f 65 73 6e 27 74 0a 20 20 20 20 20 2a 09 20 20  oesn't.     *.  
23a0: 20 73 65 65 6d 20 74 6f 20 6d 61 6b 65 20 61 20   seem to make a 
23b0: 6c 6f 74 20 6f 66 20 73 65 6e 73 65 20 74 6f 20  lot of sense to 
23c0: 76 65 72 69 66 79 20 74 68 65 20 6e 75 6d 62 65  verify the numbe
23d0: 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 77  r of arguments w
23e0: 65 0a 20 20 20 20 20 2a 09 20 20 20 61 72 65 20  e.     *.   are 
23f0: 61 62 6f 75 74 20 74 6f 20 69 67 6e 6f 72 65 20  about to ignore 
2400: 2e 2e 2e 0a 20 20 20 20 20 2a 09 20 2d 20 63 6f  ....     *. - co
2410: 75 6c 64 20 62 65 20 65 6e 68 61 6e 63 65 64 20  uld be enhanced 
2420: 74 6f 20 68 61 6e 64 6c 65 20 61 6c 73 6f 20 6e  to handle also n
2430: 6f 6e 2d 65 6d 70 74 79 20 62 6f 64 69 65 73 20  on-empty bodies 
2440: 74 68 61 74 20 63 6f 6e 74 61 69 6e 20 6f 6e 6c  that contain onl
2450: 79 0a 20 20 20 20 20 2a 09 20 20 20 63 6f 6d 6d  y.     *.   comm
2460: 65 6e 74 73 3b 20 68 6f 77 65 76 65 72 2c 20 70  ents; however, p
2470: 61 72 73 69 6e 67 20 74 68 65 20 62 6f 64 79 20  arsing the body 
2480: 77 69 6c 6c 20 73 6c 6f 77 20 64 6f 77 6e 20 74  will slow down t
2490: 68 65 20 63 6f 6d 70 69 6c 61 74 69 6f 6e 0a 20  he compilation. 
24a0: 20 20 20 20 2a 09 20 20 20 6f 66 20 61 6c 6c 20      *.   of all 
24b0: 70 72 6f 63 73 20 77 68 6f 73 65 20 61 72 67 75  procs whose argu
24c0: 6d 65 6e 74 20 6c 69 73 74 20 69 73 20 6a 75 73  ment list is jus
24d0: 74 20 5f 61 72 67 73 5f 0a 20 20 20 20 20 2a 2f  t _args_.     */
24e0: 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 76 5b 33  ..    if (objv[3
24f0: 5d 2d 3e 74 79 70 65 50 74 72 20 3d 3d 20 26 74  ]->typePtr == &t
2500: 63 6c 50 72 6f 63 42 6f 64 79 54 79 70 65 29 20  clProcBodyType) 
2510: 7b 0a 09 67 6f 74 6f 20 64 6f 6e 65 3b 0a 20 20  {..goto done;.  
2520: 20 20 7d 0a 0a 20 20 20 20 70 72 6f 63 41 72 67    }..    procArg
2530: 73 20 3d 20 54 63 6c 47 65 74 53 74 72 69 6e 67  s = TclGetString
2540: 28 6f 62 6a 76 5b 32 5d 29 3b 0a 0a 20 20 20 20  (objv[2]);..    
2550: 77 68 69 6c 65 20 28 2a 70 72 6f 63 41 72 67 73  while (*procArgs
2560: 20 3d 3d 20 27 20 27 29 20 7b 0a 09 70 72 6f 63   == ' ') {..proc
2570: 41 72 67 73 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20  Args++;.    }.. 
2580: 20 20 20 69 66 20 28 28 70 72 6f 63 41 72 67 73     if ((procArgs
2590: 5b 30 5d 20 3d 3d 20 27 61 27 29 20 26 26 20 28  [0] == 'a') && (
25a0: 73 74 72 6e 63 6d 70 28 70 72 6f 63 41 72 67 73  strncmp(procArgs
25b0: 2c 20 22 61 72 67 73 22 2c 20 34 29 20 3d 3d 20  , "args", 4) == 
25c0: 30 29 29 20 7b 0a 09 69 6e 74 20 6e 75 6d 42 79  0)) {..int numBy
25d0: 74 65 73 3b 0a 0a 09 70 72 6f 63 41 72 67 73 20  tes;...procArgs 
25e0: 2b 3d 34 3b 0a 09 77 68 69 6c 65 20 28 2a 70 72  +=4;..while (*pr
25f0: 6f 63 41 72 67 73 20 21 3d 20 27 5c 30 27 29 20  ocArgs != '\0') 
2600: 7b 0a 09 20 20 20 20 69 66 20 28 2a 70 72 6f 63  {..    if (*proc
2610: 41 72 67 73 20 21 3d 20 27 20 27 29 20 7b 0a 09  Args != ' ') {..
2620: 09 67 6f 74 6f 20 64 6f 6e 65 3b 0a 09 20 20 20  .goto done;..   
2630: 20 7d 0a 09 20 20 20 20 70 72 6f 63 41 72 67 73   }..    procArgs
2640: 2b 2b 3b 0a 09 7d 0a 0a 09 2f 2a 0a 09 20 2a 20  ++;..}.../*.. * 
2650: 54 68 65 20 61 72 67 75 6d 65 6e 74 20 6c 69 73  The argument lis
2660: 74 20 69 73 20 6a 75 73 74 20 22 61 72 67 73 22  t is just "args"
2670: 3b 20 63 68 65 63 6b 20 74 68 65 20 62 6f 64 79  ; check the body
2680: 0a 09 20 2a 2f 0a 0a 09 70 72 6f 63 42 6f 64 79  .. */...procBody
2690: 20 3d 20 54 63 6c 47 65 74 53 74 72 69 6e 67 46   = TclGetStringF
26a0: 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 33 5d 2c 20  romObj(objv[3], 
26b0: 26 6e 75 6d 42 79 74 65 73 29 3b 0a 09 69 66 20  &numBytes);..if 
26c0: 28 54 63 6c 50 61 72 73 65 41 6c 6c 57 68 69 74  (TclParseAllWhit
26d0: 65 53 70 61 63 65 28 70 72 6f 63 42 6f 64 79 2c  eSpace(procBody,
26e0: 20 6e 75 6d 42 79 74 65 73 29 20 3c 20 6e 75 6d   numBytes) < num
26f0: 42 79 74 65 73 29 20 7b 0a 09 20 20 20 20 67 6f  Bytes) {..    go
2700: 74 6f 20 64 6f 6e 65 3b 0a 09 7d 0a 0a 09 2f 2a  to done;..}.../*
2710: 0a 09 20 2a 20 54 68 65 20 62 6f 64 79 20 69 73  .. * The body is
2720: 20 6a 75 73 74 20 73 70 61 63 65 73 3a 20 6c 69   just spaces: li
2730: 6e 6b 20 74 68 65 20 63 6f 6d 70 69 6c 65 50 72  nk the compilePr
2740: 6f 63 0a 09 20 2a 2f 0a 0a 09 28 28 43 6f 6d 6d  oc.. */...((Comm
2750: 61 6e 64 20 2a 29 20 63 6d 64 29 2d 3e 63 6f 6d  and *) cmd)->com
2760: 70 69 6c 65 50 72 6f 63 20 3d 20 54 63 6c 43 6f  pileProc = TclCo
2770: 6d 70 69 6c 65 4e 6f 4f 70 3b 0a 20 20 20 20 7d  mpileNoOp;.    }
2780: 0a 0a 20 20 64 6f 6e 65 3a 0a 20 20 20 20 72 65  ..  done:.    re
2790: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c  turn TCL_OK;.}..
27a0: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ./*. *----------
27b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
27c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
27d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
27e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a  ------------. *.
27f0: 20 2a 20 54 63 6c 43 72 65 61 74 65 50 72 6f 63   * TclCreateProc
2800: 20 2d 2d 0a 20 2a 0a 20 2a 09 43 72 65 61 74 65   --. *. *.Create
2810: 73 20 74 68 65 20 64 61 74 61 20 61 73 73 6f 63  s the data assoc
2820: 69 61 74 65 64 20 77 69 74 68 20 61 20 54 63 6c  iated with a Tcl
2830: 20 70 72 6f 63 65 64 75 72 65 20 64 65 66 69 6e   procedure defin
2840: 69 74 69 6f 6e 2e 20 54 68 69 73 0a 20 2a 09 66  ition. This. *.f
2850: 75 6e 63 74 69 6f 6e 20 6b 6e 6f 77 73 20 68 6f  unction knows ho
2860: 77 20 74 6f 20 68 61 6e 64 6c 65 20 74 77 6f 20  w to handle two 
2870: 74 79 70 65 73 20 6f 66 20 62 6f 64 79 20 6f 62  types of body ob
2880: 6a 65 63 74 73 3a 20 73 74 72 69 6e 67 73 20 61  jects: strings a
2890: 6e 64 0a 20 2a 09 70 72 6f 63 62 6f 64 79 2e 20  nd. *.procbody. 
28a0: 53 74 72 69 6e 67 73 20 61 72 65 20 74 68 65 20  Strings are the 
28b0: 74 72 61 64 69 74 69 6f 6e 61 6c 20 28 61 6e 64  traditional (and
28c0: 20 63 6f 6d 6d 6f 6e 29 20 76 61 6c 75 65 20 66   common) value f
28d0: 6f 72 20 62 6f 64 69 65 73 2c 0a 20 2a 09 70 72  or bodies,. *.pr
28e0: 6f 63 62 6f 64 79 20 61 72 65 20 76 61 6c 75 65  ocbody are value
28f0: 73 20 63 72 65 61 74 65 64 20 62 79 20 65 78 74  s created by ext
2900: 65 6e 73 69 6f 6e 73 20 74 68 61 74 20 68 61 76  ensions that hav
2910: 65 20 6c 6f 61 64 65 64 20 61 0a 20 2a 09 70 72  e loaded a. *.pr
2920: 65 76 69 6f 75 73 6c 79 20 63 6f 6d 70 69 6c 65  eviously compile
2930: 64 20 73 63 72 69 70 74 2e 0a 20 2a 0a 20 2a 20  d script.. *. * 
2940: 52 65 73 75 6c 74 73 3a 0a 20 2a 09 52 65 74 75  Results:. *.Retu
2950: 72 6e 73 20 54 43 4c 5f 4f 4b 20 6f 6e 20 73 75  rns TCL_OK on su
2960: 63 63 65 73 73 2c 20 61 6c 6f 6e 67 20 77 69 74  ccess, along wit
2970: 68 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  h a pointer to a
2980: 20 54 63 6c 20 70 72 6f 63 65 64 75 72 65 0a 20   Tcl procedure. 
2990: 2a 09 64 65 66 69 6e 69 74 69 6f 6e 20 69 6e 20  *.definition in 
29a0: 70 72 6f 63 50 74 72 50 74 72 20 77 68 65 72 65  procPtrPtr where
29b0: 20 74 68 65 20 63 6d 64 50 74 72 20 66 69 65 6c   the cmdPtr fiel
29c0: 64 20 69 73 20 6e 6f 74 20 69 6e 69 74 69 61 6c  d is not initial
29d0: 69 73 65 64 2e 0a 20 2a 09 54 68 69 73 20 64 65  ised.. *.This de
29e0: 66 69 6e 69 74 69 6f 6e 20 73 68 6f 75 6c 64 20  finition should 
29f0: 62 65 20 66 72 65 65 64 20 62 79 20 63 61 6c 6c  be freed by call
2a00: 69 6e 67 20 54 63 6c 50 72 6f 63 43 6c 65 61 6e  ing TclProcClean
2a10: 75 70 50 72 6f 63 28 29 20 77 68 65 6e 0a 20 2a  upProc() when. *
2a20: 09 69 74 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72  .it is no longer
2a30: 20 6e 65 65 64 65 64 2e 20 52 65 74 75 72 6e 73   needed. Returns
2a40: 20 54 43 4c 5f 45 52 52 4f 52 20 69 66 20 61 6e   TCL_ERROR if an
2a50: 79 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e  ything goes wron
2a60: 67 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66  g.. *. * Side ef
2a70: 66 65 63 74 73 3a 0a 20 2a 09 49 66 20 61 6e 79  fects:. *.If any
2a80: 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67  thing goes wrong
2a90: 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
2aa0: 72 65 74 75 72 6e 73 20 61 6e 20 65 72 72 6f 72  returns an error
2ab0: 20 6d 65 73 73 61 67 65 20 69 6e 20 74 68 65 0a   message in the.
2ac0: 20 2a 09 69 6e 74 65 72 70 72 65 74 65 72 2e 0a   *.interpreter..
2ad0: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *. *-----------
2ae0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2af0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2b00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2b10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a  -----------. */.
2b20: 0a 69 6e 74 0a 54 63 6c 43 72 65 61 74 65 50 72  .int.TclCreatePr
2b30: 6f 63 28 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65  oc(.    Tcl_Inte
2b40: 72 70 20 2a 69 6e 74 65 72 70 2c 09 09 2f 2a 20  rp *interp,../* 
2b50: 49 6e 74 65 72 70 72 65 74 65 72 20 63 6f 6e 74  Interpreter cont
2b60: 61 69 6e 69 6e 67 20 70 72 6f 63 2e 20 2a 2f 0a  aining proc. */.
2b70: 20 20 20 20 4e 61 6d 65 73 70 61 63 65 20 2a 6e      Namespace *n
2b80: 73 50 74 72 2c 09 09 2f 2a 20 4e 61 6d 65 73 70  sPtr,../* Namesp
2b90: 61 63 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ace containing t
2ba0: 68 69 73 20 70 72 6f 63 2e 20 2a 2f 0a 20 20 20  his proc. */.   
2bb0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 72 6f   const char *pro
2bc0: 63 4e 61 6d 65 2c 09 2f 2a 20 55 6e 71 75 61 6c  cName,./* Unqual
2bd0: 69 66 69 65 64 20 6e 61 6d 65 20 6f 66 20 74 68  ified name of th
2be0: 69 73 20 70 72 6f 63 2e 20 2a 2f 0a 20 20 20 20  is proc. */.    
2bf0: 54 63 6c 5f 4f 62 6a 20 2a 61 72 67 73 50 74 72  Tcl_Obj *argsPtr
2c00: 2c 09 09 2f 2a 20 44 65 73 63 72 69 70 74 69 6f  ,../* Descriptio
2c10: 6e 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 2e 20  n of arguments. 
2c20: 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a  */.    Tcl_Obj *
2c30: 62 6f 64 79 50 74 72 2c 09 09 2f 2a 20 43 6f 6d  bodyPtr,../* Com
2c40: 6d 61 6e 64 20 62 6f 64 79 2e 20 2a 2f 0a 20 20  mand body. */.  
2c50: 20 20 50 72 6f 63 20 2a 2a 70 72 6f 63 50 74 72    Proc **procPtr
2c60: 50 74 72 29 09 09 2f 2a 20 52 65 74 75 72 6e 73  Ptr)../* Returns
2c70: 3a 20 70 6f 69 6e 74 65 72 20 74 6f 20 70 72 6f  : pointer to pro
2c80: 63 20 64 61 74 61 2e 20 2a 2f 0a 7b 0a 20 20 20  c data. */.{.   
2c90: 20 49 6e 74 65 72 70 20 2a 69 50 74 72 20 3d 20   Interp *iPtr = 
2ca0: 28 49 6e 74 65 72 70 20 2a 29 20 69 6e 74 65 72  (Interp *) inter
2cb0: 70 3b 0a 0a 20 20 20 20 50 72 6f 63 20 2a 70 72  p;..    Proc *pr
2cc0: 6f 63 50 74 72 3b 0a 20 20 20 20 69 6e 74 20 69  ocPtr;.    int i
2cd0: 2c 20 72 65 73 75 6c 74 2c 20 6e 75 6d 41 72 67  , result, numArg
2ce0: 73 3b 0a 20 20 20 20 43 6f 6d 70 69 6c 65 64 4c  s;.    CompiledL
2cf0: 6f 63 61 6c 20 2a 6c 6f 63 61 6c 50 74 72 20 3d  ocal *localPtr =
2d00: 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 4f   NULL;.    Tcl_O
2d10: 62 6a 20 2a 2a 61 72 67 41 72 72 61 79 3b 0a 20  bj **argArray;. 
2d20: 20 20 20 69 6e 74 20 70 72 65 63 6f 6d 70 69 6c     int precompil
2d30: 65 64 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66 20  ed = 0;..    if 
2d40: 28 62 6f 64 79 50 74 72 2d 3e 74 79 70 65 50 74  (bodyPtr->typePt
2d50: 72 20 3d 3d 20 26 74 63 6c 50 72 6f 63 42 6f 64  r == &tclProcBod
2d60: 79 54 79 70 65 29 20 7b 0a 09 2f 2a 0a 09 20 2a  yType) {../*.. *
2d70: 20 42 65 63 61 75 73 65 20 74 68 65 20 62 6f 64   Because the bod
2d80: 79 20 69 73 20 61 20 54 63 6c 50 72 6f 50 72 6f  y is a TclProPro
2d90: 63 42 6f 64 79 2c 20 74 68 65 20 61 63 74 75 61  cBody, the actua
2da0: 6c 20 62 6f 64 79 20 69 73 20 61 6c 72 65 61 64  l body is alread
2db0: 79 0a 09 20 2a 20 63 6f 6d 70 69 6c 65 64 2c 20  y.. * compiled, 
2dc0: 61 6e 64 20 69 74 20 69 73 20 6e 6f 74 20 73 68  and it is not sh
2dd0: 61 72 65 64 20 77 69 74 68 20 61 6e 79 6f 6e 65  ared with anyone
2de0: 20 65 6c 73 65 2c 20 73 6f 20 69 74 27 73 20 4f   else, so it's O
2df0: 4b 20 6e 6f 74 20 74 6f 0a 09 20 2a 20 75 6e 73  K not to.. * uns
2e00: 68 61 72 65 20 69 74 20 28 61 73 20 61 20 6d 61  hare it (as a ma
2e10: 74 74 65 72 20 6f 66 20 66 61 63 74 2c 20 69 74  tter of fact, it
2e20: 20 69 73 20 62 61 64 20 74 6f 20 75 6e 73 68 61   is bad to unsha
2e30: 72 65 20 69 74 2c 20 62 65 63 61 75 73 65 0a 09  re it, because..
2e40: 20 2a 20 74 68 65 72 65 20 6d 61 79 20 62 65 20   * there may be 
2e50: 6e 6f 20 73 6f 75 72 63 65 20 63 6f 64 65 29 2e  no source code).
2e60: 0a 09 20 2a 0a 09 20 2a 20 57 65 20 64 6f 6e 27  .. *.. * We don'
2e70: 74 20 63 72 65 61 74 65 20 61 6e 64 20 69 6e 69  t create and ini
2e80: 74 69 61 6c 69 7a 65 20 61 20 50 72 6f 63 20 73  tialize a Proc s
2e90: 74 72 75 63 74 75 72 65 20 66 6f 72 20 74 68 65  tructure for the
2ea0: 20 70 72 6f 63 65 64 75 72 65 3b 0a 09 20 2a 20   procedure;.. * 
2eb0: 72 61 74 68 65 72 2c 20 77 65 20 75 73 65 20 77  rather, we use w
2ec0: 68 61 74 20 69 73 20 69 6e 20 74 68 65 20 62 6f  hat is in the bo
2ed0: 64 79 20 6f 62 6a 65 63 74 2e 20 57 65 20 69 6e  dy object. We in
2ee0: 63 72 65 6d 65 6e 74 20 74 68 65 20 72 65 66 0a  crement the ref.
2ef0: 09 20 2a 20 63 6f 75 6e 74 20 6f 66 20 74 68 65  . * count of the
2f00: 20 50 72 6f 63 20 73 74 72 75 63 74 20 73 69 6e   Proc struct sin
2f10: 63 65 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 28  ce the command (
2f20: 73 6f 6f 6e 20 74 6f 20 62 65 20 63 72 65 61 74  soon to be creat
2f30: 65 64 29 0a 09 20 2a 20 77 69 6c 6c 20 62 65 20  ed).. * will be 
2f40: 68 6f 6c 64 69 6e 67 20 61 20 72 65 66 65 72 65  holding a refere
2f50: 6e 63 65 20 74 6f 20 69 74 2e 0a 09 20 2a 2f 0a  nce to it... */.
2f60: 0a 09 70 72 6f 63 50 74 72 20 3d 20 62 6f 64 79  ..procPtr = body
2f70: 50 74 72 2d 3e 69 6e 74 65 72 6e 61 6c 52 65 70  Ptr->internalRep
2f80: 2e 74 77 6f 50 74 72 56 61 6c 75 65 2e 70 74 72  .twoPtrValue.ptr
2f90: 31 3b 0a 09 70 72 6f 63 50 74 72 2d 3e 69 50 74  1;..procPtr->iPt
2fa0: 72 20 3d 20 69 50 74 72 3b 0a 09 70 72 6f 63 50  r = iPtr;..procP
2fb0: 74 72 2d 3e 72 65 66 43 6f 75 6e 74 2b 2b 3b 0a  tr->refCount++;.
2fc0: 09 70 72 65 63 6f 6d 70 69 6c 65 64 20 3d 20 31  .precompiled = 1
2fd0: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09  ;.    } else {..
2fe0: 2f 2a 0a 09 20 2a 20 49 66 20 74 68 65 20 70 72  /*.. * If the pr
2ff0: 6f 63 65 64 75 72 65 27 73 20 62 6f 64 79 20 6f  ocedure's body o
3000: 62 6a 65 63 74 20 69 73 20 73 68 61 72 65 64 20  bject is shared 
3010: 62 65 63 61 75 73 65 20 69 74 73 20 73 74 72 69  because its stri
3020: 6e 67 20 76 61 6c 75 65 0a 09 20 2a 20 69 73 20  ng value.. * is 
3030: 69 64 65 6e 74 69 63 61 6c 20 74 6f 2c 20 65 2e  identical to, e.
3040: 67 2e 2c 20 74 68 65 20 62 6f 64 79 20 6f 66 20  g., the body of 
3050: 61 6e 6f 74 68 65 72 20 70 72 6f 63 65 64 75 72  another procedur
3060: 65 2c 20 77 65 20 6d 75 73 74 0a 09 20 2a 20 63  e, we must.. * c
3070: 72 65 61 74 65 20 61 20 70 72 69 76 61 74 65 20  reate a private 
3080: 63 6f 70 79 20 66 6f 72 20 74 68 69 73 20 70 72  copy for this pr
3090: 6f 63 65 64 75 72 65 20 74 6f 20 75 73 65 2e 20  ocedure to use. 
30a0: 53 75 63 68 20 73 68 61 72 69 6e 67 20 6f 66 0a  Such sharing of.
30b0: 09 20 2a 20 70 72 6f 63 65 64 75 72 65 20 62 6f  . * procedure bo
30c0: 64 69 65 73 20 69 73 20 72 61 72 65 20 62 75 74  dies is rare but
30d0: 20 63 61 6e 20 63 61 75 73 65 20 70 72 6f 62 6c   can cause probl
30e0: 65 6d 73 2e 20 41 20 70 72 6f 63 65 64 75 72 65  ems. A procedure
30f0: 20 62 6f 64 79 0a 09 20 2a 20 69 73 20 63 6f 6d   body.. * is com
3100: 70 69 6c 65 64 20 69 6e 20 61 20 63 6f 6e 74 65  piled in a conte
3110: 78 74 20 74 68 61 74 20 69 6e 63 6c 75 64 65 73  xt that includes
3120: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 22   the number of "
3130: 73 6c 6f 74 73 22 0a 09 20 2a 20 61 6c 6c 6f 63  slots".. * alloc
3140: 61 74 65 64 20 62 79 20 74 68 65 20 63 6f 6d 70  ated by the comp
3150: 69 6c 65 72 20 66 6f 72 20 6c 6f 63 61 6c 20 76  iler for local v
3160: 61 72 69 61 62 6c 65 73 2e 20 54 68 65 72 65 20  ariables. There 
3170: 69 73 20 61 20 6c 6f 63 61 6c 0a 09 20 2a 20 76  is a local.. * v
3180: 61 72 69 61 62 6c 65 20 73 6c 6f 74 20 66 6f 72  ariable slot for
3190: 20 65 61 63 68 20 66 6f 72 6d 61 6c 20 70 61 72   each formal par
31a0: 61 6d 65 74 65 72 20 28 74 68 65 0a 09 20 2a 20  ameter (the.. * 
31b0: 22 70 72 6f 63 50 74 72 2d 3e 6e 75 6d 43 6f 6d  "procPtr->numCom
31c0: 70 69 6c 65 64 4c 6f 63 61 6c 73 20 3d 20 6e 75  piledLocals = nu
31d0: 6d 41 72 67 73 22 20 61 73 73 69 67 6e 6d 65 6e  mArgs" assignmen
31e0: 74 20 62 65 6c 6f 77 29 2e 20 54 68 69 73 0a 09  t below). This..
31f0: 20 2a 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68   * means that th
3200: 65 20 73 61 6d 65 20 63 6f 64 65 20 63 61 6e 20  e same code can 
3210: 6e 6f 74 20 62 65 20 73 68 61 72 65 64 20 62 79  not be shared by
3220: 20 74 77 6f 20 70 72 6f 63 65 64 75 72 65 73 20   two procedures 
3230: 74 68 61 74 0a 09 20 2a 20 68 61 76 65 20 61 20  that.. * have a 
3240: 64 69 66 66 65 72 65 6e 74 20 6e 75 6d 62 65 72  different number
3250: 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 2c 20 65   of arguments, e
3260: 76 65 6e 20 69 66 20 74 68 65 69 72 20 62 6f 64  ven if their bod
3270: 69 65 73 20 61 72 65 0a 09 20 2a 20 69 64 65 6e  ies are.. * iden
3280: 74 69 63 61 6c 2e 20 4e 6f 74 65 20 74 68 61 74  tical. Note that
3290: 20 77 65 20 64 6f 6e 27 74 20 75 73 65 20 54 63   we don't use Tc
32a0: 6c 5f 44 75 70 6c 69 63 61 74 65 4f 62 6a 20 73  l_DuplicateObj s
32b0: 69 6e 63 65 20 77 65 20 77 6f 75 6c 64 0a 09 20  ince we would.. 
32c0: 2a 20 6e 6f 74 20 77 61 6e 74 20 61 6e 79 20 62  * not want any b
32d0: 79 74 65 63 6f 64 65 20 69 6e 74 65 72 6e 61 6c  ytecode internal
32e0: 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 2e   representation.
32f0: 0a 09 20 2a 2f 0a 0a 09 69 66 20 28 54 63 6c 5f  .. */...if (Tcl_
3300: 49 73 53 68 61 72 65 64 28 62 6f 64 79 50 74 72  IsShared(bodyPtr
3310: 29 29 20 7b 0a 09 20 20 20 20 63 6f 6e 73 74 20  )) {..    const 
3320: 63 68 61 72 20 2a 62 79 74 65 73 3b 0a 09 20 20  char *bytes;..  
3330: 20 20 69 6e 74 20 6c 65 6e 67 74 68 3b 0a 09 20    int length;.. 
3340: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 73 68 61 72     Tcl_Obj *shar
3350: 65 64 42 6f 64 79 50 74 72 20 3d 20 62 6f 64 79  edBodyPtr = body
3360: 50 74 72 3b 0a 0a 09 20 20 20 20 62 79 74 65 73  Ptr;...    bytes
3370: 20 3d 20 54 63 6c 47 65 74 53 74 72 69 6e 67 46   = TclGetStringF
3380: 72 6f 6d 4f 62 6a 28 62 6f 64 79 50 74 72 2c 20  romObj(bodyPtr, 
3390: 26 6c 65 6e 67 74 68 29 3b 0a 09 20 20 20 20 62  &length);..    b
33a0: 6f 64 79 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77  odyPtr = Tcl_New
33b0: 53 74 72 69 6e 67 4f 62 6a 28 62 79 74 65 73 2c  StringObj(bytes,
33c0: 20 6c 65 6e 67 74 68 29 3b 0a 0a 09 20 20 20 20   length);...    
33d0: 2f 2a 0a 09 20 20 20 20 20 2a 20 54 49 50 20 23  /*..     * TIP #
33e0: 32 38 30 2e 0a 09 20 20 20 20 20 2a 20 45 6e 73  280...     * Ens
33f0: 75 72 65 20 74 68 61 74 20 74 68 65 20 63 6f 6e  ure that the con
3400: 74 69 6e 75 61 74 69 6f 6e 20 6c 69 6e 65 20 64  tinuation line d
3410: 61 74 61 20 66 6f 72 20 74 68 65 20 6f 72 69 67  ata for the orig
3420: 69 6e 61 6c 20 62 6f 64 79 20 69 73 0a 09 20 20  inal body is..  
3430: 20 20 20 2a 20 6e 6f 74 20 6c 6f 73 74 20 61 6e     * not lost an
3440: 64 20 61 70 70 6c 69 65 73 20 74 6f 20 74 68 65  d applies to the
3450: 20 6e 65 77 20 62 6f 64 79 20 61 73 20 77 65 6c   new body as wel
3460: 6c 2e 0a 09 20 20 20 20 20 2a 2f 0a 0a 09 20 20  l...     */...  
3470: 20 20 54 63 6c 43 6f 6e 74 69 6e 75 61 74 69 6f    TclContinuatio
3480: 6e 73 43 6f 70 79 28 62 6f 64 79 50 74 72 2c 20  nsCopy(bodyPtr, 
3490: 73 68 61 72 65 64 42 6f 64 79 50 74 72 29 3b 0a  sharedBodyPtr);.
34a0: 09 7d 0a 0a 09 2f 2a 0a 09 20 2a 20 43 72 65 61  .}.../*.. * Crea
34b0: 74 65 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a  te and initializ
34c0: 65 20 61 20 50 72 6f 63 20 73 74 72 75 63 74 75  e a Proc structu
34d0: 72 65 20 66 6f 72 20 74 68 65 20 70 72 6f 63 65  re for the proce
34e0: 64 75 72 65 2e 20 57 65 0a 09 20 2a 20 69 6e 63  dure. We.. * inc
34f0: 72 65 6d 65 6e 74 20 74 68 65 20 72 65 66 20 63  rement the ref c
3500: 6f 75 6e 74 20 6f 66 20 74 68 65 20 70 72 6f 63  ount of the proc
3510: 65 64 75 72 65 27 73 20 62 6f 64 79 20 6f 62 6a  edure's body obj
3520: 65 63 74 20 73 69 6e 63 65 20 74 68 65 72 65 0a  ect since there.
3530: 09 20 2a 20 77 69 6c 6c 20 62 65 20 61 20 72 65  . * will be a re
3540: 66 65 72 65 6e 63 65 20 74 6f 20 69 74 20 69 6e  ference to it in
3550: 20 74 68 65 20 50 72 6f 63 20 73 74 72 75 63 74   the Proc struct
3560: 75 72 65 2e 0a 09 20 2a 2f 0a 0a 09 54 63 6c 5f  ure... */...Tcl_
3570: 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 62 6f 64  IncrRefCount(bod
3580: 79 50 74 72 29 3b 0a 0a 09 70 72 6f 63 50 74 72  yPtr);...procPtr
3590: 20 3d 20 28 50 72 6f 63 20 2a 29 63 6b 61 6c 6c   = (Proc *)ckall
35a0: 6f 63 28 73 69 7a 65 6f 66 28 50 72 6f 63 29 29  oc(sizeof(Proc))
35b0: 3b 0a 09 70 72 6f 63 50 74 72 2d 3e 69 50 74 72  ;..procPtr->iPtr
35c0: 20 3d 20 69 50 74 72 3b 0a 09 70 72 6f 63 50 74   = iPtr;..procPt
35d0: 72 2d 3e 72 65 66 43 6f 75 6e 74 20 3d 20 31 3b  r->refCount = 1;
35e0: 0a 09 70 72 6f 63 50 74 72 2d 3e 62 6f 64 79 50  ..procPtr->bodyP
35f0: 74 72 20 3d 20 62 6f 64 79 50 74 72 3b 0a 09 70  tr = bodyPtr;..p
3600: 72 6f 63 50 74 72 2d 3e 6e 75 6d 41 72 67 73 20  rocPtr->numArgs 
3610: 3d 20 30 3b 09 2f 2a 20 41 63 74 75 61 6c 20 61  = 0;./* Actual a
3620: 72 67 75 6d 65 6e 74 20 63 6f 75 6e 74 20 69 73  rgument count is
3630: 20 73 65 74 20 62 65 6c 6f 77 2e 20 2a 2f 0a 09   set below. */..
3640: 70 72 6f 63 50 74 72 2d 3e 6e 75 6d 43 6f 6d 70  procPtr->numComp
3650: 69 6c 65 64 4c 6f 63 61 6c 73 20 3d 20 30 3b 0a  iledLocals = 0;.
3660: 09 70 72 6f 63 50 74 72 2d 3e 66 69 72 73 74 4c  .procPtr->firstL
3670: 6f 63 61 6c 50 74 72 20 3d 20 4e 55 4c 4c 3b 0a  ocalPtr = NULL;.
3680: 09 70 72 6f 63 50 74 72 2d 3e 6c 61 73 74 4c 6f  .procPtr->lastLo
3690: 63 61 6c 50 74 72 20 3d 20 4e 55 4c 4c 3b 0a 20  calPtr = NULL;. 
36a0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20     }..    /*.   
36b0: 20 20 2a 20 42 72 65 61 6b 20 75 70 20 74 68 65    * Break up the
36c0: 20 61 72 67 75 6d 65 6e 74 20 6c 69 73 74 20 69   argument list i
36d0: 6e 74 6f 20 61 72 67 75 6d 65 6e 74 20 73 70 65  nto argument spe
36e0: 63 69 66 69 65 72 73 2c 20 74 68 65 6e 20 70 72  cifiers, then pr
36f0: 6f 63 65 73 73 20 65 61 63 68 0a 20 20 20 20 20  ocess each.     
3700: 2a 20 61 72 67 75 6d 65 6e 74 20 73 70 65 63 69  * argument speci
3710: 66 69 65 72 2e 20 49 66 20 74 68 65 20 62 6f 64  fier. If the bod
3720: 79 20 69 73 20 70 72 65 63 6f 6d 70 69 6c 65 64  y is precompiled
3730: 2c 20 70 72 6f 63 65 73 73 69 6e 67 20 69 73 20  , processing is 
3740: 6c 69 6d 69 74 65 64 0a 20 20 20 20 20 2a 20 74  limited.     * t
3750: 6f 20 63 68 65 63 6b 69 6e 67 20 74 68 61 74 20  o checking that 
3760: 74 68 65 20 70 61 72 73 65 64 20 61 72 67 75 6d  the parsed argum
3770: 65 6e 74 20 69 73 20 63 6f 6e 73 69 73 74 65 6e  ent is consisten
3780: 74 20 77 69 74 68 20 74 68 65 20 6f 6e 65 20 73  t with the one s
3790: 74 6f 72 65 64 0a 20 20 20 20 20 2a 20 69 6e 20  tored.     * in 
37a0: 74 68 65 20 50 72 6f 63 2e 0a 20 20 20 20 20 2a  the Proc..     *
37b0: 2f 0a 0a 20 20 20 20 72 65 73 75 6c 74 20 3d 20  /..    result = 
37c0: 54 63 6c 4c 69 73 74 4f 62 6a 47 65 74 45 6c 65  TclListObjGetEle
37d0: 6d 65 6e 74 73 28 69 6e 74 65 72 70 2c 20 61 72  ments(interp, ar
37e0: 67 73 50 74 72 2c 20 26 6e 75 6d 41 72 67 73 2c  gsPtr, &numArgs,
37f0: 20 26 61 72 67 41 72 72 61 79 29 3b 0a 20 20 20   &argArray);.   
3800: 20 69 66 20 28 72 65 73 75 6c 74 20 21 3d 20 54   if (result != T
3810: 43 4c 5f 4f 4b 29 20 7b 0a 09 67 6f 74 6f 20 70  CL_OK) {..goto p
3820: 72 6f 63 45 72 72 6f 72 3b 0a 20 20 20 20 7d 0a  rocError;.    }.
3830: 0a 20 20 20 20 69 66 20 28 70 72 65 63 6f 6d 70  .    if (precomp
3840: 69 6c 65 64 29 20 7b 0a 09 69 66 20 28 6e 75 6d  iled) {..if (num
3850: 41 72 67 73 20 3e 20 70 72 6f 63 50 74 72 2d 3e  Args > procPtr->
3860: 6e 75 6d 41 72 67 73 29 20 7b 0a 09 20 20 20 20  numArgs) {..    
3870: 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
3880: 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4f 62 6a  (interp, Tcl_Obj
3890: 50 72 69 6e 74 66 28 0a 09 09 20 20 20 20 22 70  Printf(...    "p
38a0: 72 6f 63 65 64 75 72 65 20 5c 22 25 73 5c 22 3a  rocedure \"%s\":
38b0: 20 61 72 67 20 6c 69 73 74 20 63 6f 6e 74 61 69   arg list contai
38c0: 6e 73 20 25 64 20 65 6e 74 72 69 65 73 2c 20 22  ns %d entries, "
38d0: 0a 09 09 20 20 20 20 22 70 72 65 63 6f 6d 70 69  ...    "precompi
38e0: 6c 65 64 20 68 65 61 64 65 72 20 65 78 70 65 63  led header expec
38f0: 74 73 20 25 64 22 2c 20 70 72 6f 63 4e 61 6d 65  ts %d", procName
3900: 2c 20 6e 75 6d 41 72 67 73 2c 0a 09 09 20 20 20  , numArgs,...   
3910: 20 70 72 6f 63 50 74 72 2d 3e 6e 75 6d 41 72 67   procPtr->numArg
3920: 73 29 29 3b 0a 09 20 20 20 20 54 63 6c 5f 53 65  s));..    Tcl_Se
3930: 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72  tErrorCode(inter
3940: 70 2c 20 22 54 43 4c 22 2c 20 22 4f 50 45 52 41  p, "TCL", "OPERA
3950: 54 49 4f 4e 22 2c 20 22 50 52 4f 43 22 2c 0a 09  TION", "PROC",..
3960: 09 20 20 20 20 22 42 59 54 45 43 4f 44 45 4c 49  .    "BYTECODELI
3970: 45 53 22 2c 20 28 63 68 61 72 20 2a 29 4e 55 4c  ES", (char *)NUL
3980: 4c 29 3b 0a 09 20 20 20 20 67 6f 74 6f 20 70 72  L);..    goto pr
3990: 6f 63 45 72 72 6f 72 3b 0a 09 7d 0a 09 6c 6f 63  ocError;..}..loc
39a0: 61 6c 50 74 72 20 3d 20 70 72 6f 63 50 74 72 2d  alPtr = procPtr-
39b0: 3e 66 69 72 73 74 4c 6f 63 61 6c 50 74 72 3b 0a  >firstLocalPtr;.
39c0: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 70 72      } else {..pr
39d0: 6f 63 50 74 72 2d 3e 6e 75 6d 41 72 67 73 20 3d  ocPtr->numArgs =
39e0: 20 6e 75 6d 41 72 67 73 3b 0a 09 70 72 6f 63 50   numArgs;..procP
39f0: 74 72 2d 3e 6e 75 6d 43 6f 6d 70 69 6c 65 64 4c  tr->numCompiledL
3a00: 6f 63 61 6c 73 20 3d 20 6e 75 6d 41 72 67 73 3b  ocals = numArgs;
3a10: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72 20  .    }..    for 
3a20: 28 69 20 3d 20 30 3b 20 69 20 3c 20 6e 75 6d 41  (i = 0; i < numA
3a30: 72 67 73 3b 20 69 2b 2b 29 20 7b 0a 09 63 6f 6e  rgs; i++) {..con
3a40: 73 74 20 63 68 61 72 20 2a 61 72 67 6e 61 6d 65  st char *argname
3a50: 2c 20 2a 70 2c 20 2a 6c 61 73 74 3b 0a 09 69 6e  , *p, *last;..in
3a60: 74 20 66 69 65 6c 64 43 6f 75 6e 74 2c 20 6e 61  t fieldCount, na
3a70: 6d 65 4c 65 6e 67 74 68 3b 0a 09 54 63 6c 5f 4f  meLength;..Tcl_O
3a80: 62 6a 20 2a 2a 66 69 65 6c 64 56 61 6c 75 65 73  bj **fieldValues
3a90: 3b 0a 0a 09 2f 2a 0a 09 20 2a 20 4e 6f 77 20 64  ;.../*.. * Now d
3aa0: 69 76 69 64 65 20 74 68 65 20 73 70 65 63 69 66  ivide the specif
3ab0: 69 65 72 20 75 70 20 69 6e 74 6f 20 6e 61 6d 65  ier up into name
3ac0: 20 61 6e 64 20 64 65 66 61 75 6c 74 2e 0a 09 20   and default... 
3ad0: 2a 2f 0a 0a 09 72 65 73 75 6c 74 20 3d 20 54 63  */...result = Tc
3ae0: 6c 4c 69 73 74 4f 62 6a 47 65 74 45 6c 65 6d 65  lListObjGetEleme
3af0: 6e 74 73 28 69 6e 74 65 72 70 2c 20 61 72 67 41  nts(interp, argA
3b00: 72 72 61 79 5b 69 5d 2c 20 26 66 69 65 6c 64 43  rray[i], &fieldC
3b10: 6f 75 6e 74 2c 0a 09 09 26 66 69 65 6c 64 56 61  ount,...&fieldVa
3b20: 6c 75 65 73 29 3b 0a 09 69 66 20 28 72 65 73 75  lues);..if (resu
3b30: 6c 74 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a  lt != TCL_OK) {.
3b40: 09 20 20 20 20 67 6f 74 6f 20 70 72 6f 63 45 72  .    goto procEr
3b50: 72 6f 72 3b 0a 09 7d 0a 09 69 66 20 28 66 69 65  ror;..}..if (fie
3b60: 6c 64 43 6f 75 6e 74 20 3e 20 32 29 20 7b 0a 09  ldCount > 2) {..
3b70: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 65 72 72      Tcl_Obj *err
3b80: 6f 72 4f 62 6a 20 3d 20 54 63 6c 5f 4e 65 77 53  orObj = Tcl_NewS
3b90: 74 72 69 6e 67 4f 62 6a 28 0a 09 09 22 74 6f 6f  tringObj(..."too
3ba0: 20 6d 61 6e 79 20 66 69 65 6c 64 73 20 69 6e 20   many fields in 
3bb0: 61 72 67 75 6d 65 6e 74 20 73 70 65 63 69 66 69  argument specifi
3bc0: 65 72 20 5c 22 22 2c 20 2d 31 29 3b 0a 09 20 20  er \"", -1);..  
3bd0: 20 20 54 63 6c 5f 41 70 70 65 6e 64 4f 62 6a 54    Tcl_AppendObjT
3be0: 6f 4f 62 6a 28 65 72 72 6f 72 4f 62 6a 2c 20 61  oObj(errorObj, a
3bf0: 72 67 41 72 72 61 79 5b 69 5d 29 3b 0a 09 20 20  rgArray[i]);..  
3c00: 20 20 54 63 6c 5f 41 70 70 65 6e 64 54 6f 4f 62    Tcl_AppendToOb
3c10: 6a 28 65 72 72 6f 72 4f 62 6a 2c 20 22 5c 22 22  j(errorObj, "\""
3c20: 2c 20 2d 31 29 3b 0a 09 20 20 20 20 54 63 6c 5f  , -1);..    Tcl_
3c30: 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74  SetObjResult(int
3c40: 65 72 70 2c 20 65 72 72 6f 72 4f 62 6a 29 3b 0a  erp, errorObj);.
3c50: 09 20 20 20 20 54 63 6c 5f 53 65 74 45 72 72 6f  .    Tcl_SetErro
3c60: 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54  rCode(interp, "T
3c70: 43 4c 22 2c 20 22 4f 50 45 52 41 54 49 4f 4e 22  CL", "OPERATION"
3c80: 2c 20 22 50 52 4f 43 22 2c 0a 09 09 20 20 20 20  , "PROC",...    
3c90: 22 46 4f 52 4d 41 4c 41 52 47 55 4d 45 4e 54 46  "FORMALARGUMENTF
3ca0: 4f 52 4d 41 54 22 2c 20 28 63 68 61 72 20 2a 29  ORMAT", (char *)
3cb0: 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 67 6f 74 6f  NULL);..    goto
3cc0: 20 70 72 6f 63 45 72 72 6f 72 3b 0a 09 7d 0a 09   procError;..}..
3cd0: 69 66 20 28 28 66 69 65 6c 64 43 6f 75 6e 74 20  if ((fieldCount 
3ce0: 3d 3d 20 30 29 20 7c 7c 20 28 54 63 6c 5f 47 65  == 0) || (Tcl_Ge
3cf0: 74 43 68 61 72 4c 65 6e 67 74 68 28 66 69 65 6c  tCharLength(fiel
3d00: 64 56 61 6c 75 65 73 5b 30 5d 29 20 3d 3d 20 30  dValues[0]) == 0
3d10: 29 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 53 65  )) {..    Tcl_Se
3d20: 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
3d30: 70 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67  p, Tcl_NewString
3d40: 4f 62 6a 28 0a 09 09 20 20 20 20 22 61 72 67 75  Obj(...    "argu
3d50: 6d 65 6e 74 20 77 69 74 68 20 6e 6f 20 6e 61 6d  ment with no nam
3d60: 65 22 2c 20 2d 31 29 29 3b 0a 09 20 20 20 20 54  e", -1));..    T
3d70: 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28  cl_SetErrorCode(
3d80: 69 6e 74 65 72 70 2c 20 22 54 43 4c 22 2c 20 22  interp, "TCL", "
3d90: 4f 50 45 52 41 54 49 4f 4e 22 2c 20 22 50 52 4f  OPERATION", "PRO
3da0: 43 22 2c 0a 09 09 20 20 20 20 22 46 4f 52 4d 41  C",...    "FORMA
3db0: 4c 41 52 47 55 4d 45 4e 54 46 4f 52 4d 41 54 22  LARGUMENTFORMAT"
3dc0: 2c 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b  , (char *)NULL);
3dd0: 0a 09 20 20 20 20 67 6f 74 6f 20 70 72 6f 63 45  ..    goto procE
3de0: 72 72 6f 72 3b 0a 09 7d 0a 0a 09 2f 2a 0a 09 20  rror;..}.../*.. 
3df0: 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65  * Check that the
3e00: 20 66 6f 72 6d 61 6c 20 70 61 72 61 6d 65 74 65   formal paramete
3e10: 72 20 6e 61 6d 65 20 69 73 20 61 20 73 63 61 6c  r name is a scal
3e20: 61 72 2e 0a 09 20 2a 2f 0a 0a 09 70 20 3d 20 61  ar... */...p = a
3e30: 72 67 6e 61 6d 65 20 3d 20 54 63 6c 47 65 74 53  rgname = TclGetS
3e40: 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 66 69 65  tringFromObj(fie
3e50: 6c 64 56 61 6c 75 65 73 5b 30 5d 2c 20 26 6e 61  ldValues[0], &na
3e60: 6d 65 4c 65 6e 67 74 68 29 3b 0a 09 6c 61 73 74  meLength);..last
3e70: 20 3d 20 61 72 67 6e 61 6d 65 20 2b 20 6e 61 6d   = argname + nam
3e80: 65 4c 65 6e 67 74 68 3b 0a 09 77 68 69 6c 65 20  eLength;..while 
3e90: 28 70 20 3c 20 6c 61 73 74 29 20 7b 0a 09 20 20  (p < last) {..  
3ea0: 20 20 69 66 20 28 2a 70 20 3d 3d 20 27 28 27 29    if (*p == '(')
3eb0: 20 7b 0a 09 09 69 66 20 28 6c 61 73 74 5b 2d 31   {...if (last[-1
3ec0: 5d 20 3d 3d 20 27 29 27 29 20 7b 20 2f 2a 20 57  ] == ')') { /* W
3ed0: 65 20 68 61 76 65 20 61 6e 20 61 72 72 61 79 20  e have an array 
3ee0: 65 6c 65 6d 65 6e 74 2e 20 2a 2f 0a 09 09 20 20  element. */...  
3ef0: 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75    Tcl_SetObjResu
3f00: 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4f  lt(interp, Tcl_O
3f10: 62 6a 50 72 69 6e 74 66 28 0a 09 09 09 20 20 20  bjPrintf(....   
3f20: 20 22 66 6f 72 6d 61 6c 20 70 61 72 61 6d 65 74   "formal paramet
3f30: 65 72 20 5c 22 25 73 5c 22 20 69 73 20 61 6e 20  er \"%s\" is an 
3f40: 61 72 72 61 79 20 65 6c 65 6d 65 6e 74 22 2c 0a  array element",.
3f50: 09 09 09 20 20 20 20 54 63 6c 47 65 74 53 74 72  ...    TclGetStr
3f60: 69 6e 67 28 66 69 65 6c 64 56 61 6c 75 65 73 5b  ing(fieldValues[
3f70: 30 5d 29 29 29 3b 0a 09 09 20 20 20 20 54 63 6c  0])));...    Tcl
3f80: 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e  _SetErrorCode(in
3f90: 74 65 72 70 2c 20 22 54 43 4c 22 2c 20 22 4f 50  terp, "TCL", "OP
3fa0: 45 52 41 54 49 4f 4e 22 2c 20 22 50 52 4f 43 22  ERATION", "PROC"
3fb0: 2c 0a 09 09 09 20 20 20 20 22 46 4f 52 4d 41 4c  ,....    "FORMAL
3fc0: 41 52 47 55 4d 45 4e 54 46 4f 52 4d 41 54 22 2c  ARGUMENTFORMAT",
3fd0: 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a   (char *)NULL);.
3fe0: 09 09 20 20 20 20 67 6f 74 6f 20 70 72 6f 63 45  ..    goto procE
3ff0: 72 72 6f 72 3b 0a 09 09 7d 0a 09 20 20 20 20 7d  rror;...}..    }
4000: 20 65 6c 73 65 20 69 66 20 28 70 5b 30 5d 20 3d   else if (p[0] =
4010: 3d 20 27 3a 27 20 26 26 20 70 5b 31 5d 20 3d 3d  = ':' && p[1] ==
4020: 20 27 3a 27 29 20 7b 0a 09 09 54 63 6c 5f 4f 62   ':') {...Tcl_Ob
4030: 6a 20 2a 65 72 72 6f 72 4f 62 6a 20 3d 20 54 63  j *errorObj = Tc
4040: 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 0a  l_NewStringObj(.
4050: 09 09 20 20 20 20 22 66 6f 72 6d 61 6c 20 70 61  ..    "formal pa
4060: 72 61 6d 65 74 65 72 20 5c 22 22 2c 20 2d 31 29  rameter \"", -1)
4070: 3b 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 4f 62  ;...Tcl_AppendOb
4080: 6a 54 6f 4f 62 6a 28 65 72 72 6f 72 4f 62 6a 2c  jToObj(errorObj,
4090: 20 66 69 65 6c 64 56 61 6c 75 65 73 5b 30 5d 29   fieldValues[0])
40a0: 3b 0a 09 09 54 63 6c 5f 41 70 70 65 6e 64 54 6f  ;...Tcl_AppendTo
40b0: 4f 62 6a 28 65 72 72 6f 72 4f 62 6a 2c 20 22 5c  Obj(errorObj, "\
40c0: 22 20 69 73 20 6e 6f 74 20 61 20 73 69 6d 70 6c  " is not a simpl
40d0: 65 20 6e 61 6d 65 22 2c 20 2d 31 29 3b 0a 09 09  e name", -1);...
40e0: 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74  Tcl_SetObjResult
40f0: 28 69 6e 74 65 72 70 2c 20 65 72 72 6f 72 4f 62  (interp, errorOb
4100: 6a 29 3b 0a 09 09 54 63 6c 5f 53 65 74 45 72 72  j);...Tcl_SetErr
4110: 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22  orCode(interp, "
4120: 54 43 4c 22 2c 20 22 4f 50 45 52 41 54 49 4f 4e  TCL", "OPERATION
4130: 22 2c 20 22 50 52 4f 43 22 2c 0a 09 09 09 22 46  ", "PROC",...."F
4140: 4f 52 4d 41 4c 41 52 47 55 4d 45 4e 54 46 4f 52  ORMALARGUMENTFOR
4150: 4d 41 54 22 2c 20 28 63 68 61 72 20 2a 29 4e 55  MAT", (char *)NU
4160: 4c 4c 29 3b 0a 09 09 67 6f 74 6f 20 70 72 6f 63  LL);...goto proc
4170: 45 72 72 6f 72 3b 0a 09 20 20 20 20 7d 0a 09 20  Error;..    }.. 
4180: 20 20 20 70 2b 2b 3b 0a 09 7d 0a 0a 09 69 66 20     p++;..}...if 
4190: 28 70 72 65 63 6f 6d 70 69 6c 65 64 29 20 7b 0a  (precompiled) {.
41a0: 09 20 20 20 20 2f 2a 0a 09 20 20 20 20 20 2a 20  .    /*..     * 
41b0: 43 6f 6d 70 61 72 65 20 74 68 65 20 70 61 72 73  Compare the pars
41c0: 65 64 20 61 72 67 75 6d 65 6e 74 20 77 69 74 68  ed argument with
41d0: 20 74 68 65 20 73 74 6f 72 65 64 20 6f 6e 65 2e   the stored one.
41e0: 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 0a 09   Note that the..
41f0: 20 20 20 20 20 2a 20 6f 6e 6c 79 20 66 6c 61 67       * only flag
4200: 20 76 61 6c 75 65 20 74 68 61 74 20 6d 61 6b 65   value that make
4210: 73 20 73 65 6e 73 65 20 61 74 20 74 68 69 73 20  s sense at this 
4220: 70 6f 69 6e 74 20 69 73 20 56 41 52 5f 41 52 47  point is VAR_ARG
4230: 55 4d 45 4e 54 0a 09 20 20 20 20 20 2a 20 28 69  UMENT..     * (i
4240: 74 73 20 76 61 6c 75 65 20 77 61 73 20 6b 65 70  ts value was kep
4250: 74 20 74 68 65 20 73 61 6d 65 20 61 73 20 70 72  t the same as pr
4260: 65 20 56 61 72 52 65 66 6f 72 6d 20 74 6f 20 73  e VarReform to s
4270: 69 6d 70 6c 69 66 79 0a 09 20 20 20 20 20 2a 20  implify..     * 
4280: 74 62 63 6c 6f 61 64 27 73 20 70 72 6f 63 65 73  tbcload's proces
4290: 73 69 6e 67 20 6f 66 20 6f 6c 64 65 72 20 62 79  sing of older by
42a0: 65 74 63 6f 64 65 73 29 2e 0a 09 20 20 20 20 20  etcodes)...     
42b0: 2a 0a 09 20 20 20 20 20 2a 20 54 68 65 20 6f 6e  *..     * The on
42c0: 6c 79 20 6f 74 68 65 72 20 66 6c 61 67 20 76 61  ly other flag va
42d0: 6c 75 65 20 74 68 61 74 20 69 73 20 69 6d 70 6f  lue that is impo
42e0: 72 74 61 6e 74 20 74 6f 20 72 65 74 72 69 65 76  rtant to retriev
42f0: 65 20 66 72 6f 6d 0a 09 20 20 20 20 20 2a 20 70  e from..     * p
4300: 72 65 63 6f 6d 70 69 6c 65 64 20 70 72 6f 63 73  recompiled procs
4310: 20 69 73 20 56 41 52 5f 54 45 4d 50 4f 52 41 52   is VAR_TEMPORAR
4320: 59 20 28 61 6c 73 6f 20 75 6e 63 68 61 6e 67 65  Y (also unchange
4330: 64 29 2e 20 49 74 20 69 73 0a 09 20 20 20 20 20  d). It is..     
4340: 2a 20 6e 65 65 64 65 64 20 6c 61 74 65 72 20 77  * needed later w
4350: 68 65 6e 20 72 65 74 72 69 65 76 69 6e 67 20 74  hen retrieving t
4360: 68 65 20 76 61 72 69 61 62 6c 65 20 6e 61 6d 65  he variable name
4370: 73 2e 0a 09 20 20 20 20 20 2a 2f 0a 0a 09 20 20  s...     */...  
4380: 20 20 69 66 20 28 28 6c 6f 63 61 6c 50 74 72 2d    if ((localPtr-
4390: 3e 6e 61 6d 65 4c 65 6e 67 74 68 20 21 3d 20 6e  >nameLength != n
43a0: 61 6d 65 4c 65 6e 67 74 68 29 0a 09 09 20 20 20  ameLength)...   
43b0: 20 7c 7c 20 28 6d 65 6d 63 6d 70 28 6c 6f 63 61   || (memcmp(loca
43c0: 6c 50 74 72 2d 3e 6e 61 6d 65 2c 20 61 72 67 6e  lPtr->name, argn
43d0: 61 6d 65 2c 20 6e 61 6d 65 4c 65 6e 67 74 68 29  ame, nameLength)
43e0: 20 21 3d 20 30 29 0a 09 09 20 20 20 20 7c 7c 20   != 0)...    || 
43f0: 28 6c 6f 63 61 6c 50 74 72 2d 3e 66 72 61 6d 65  (localPtr->frame
4400: 49 6e 64 65 78 20 21 3d 20 69 29 0a 09 09 20 20  Index != i)...  
4410: 20 20 7c 7c 20 21 28 6c 6f 63 61 6c 50 74 72 2d    || !(localPtr-
4420: 3e 66 6c 61 67 73 20 26 20 56 41 52 5f 41 52 47  >flags & VAR_ARG
4430: 55 4d 45 4e 54 29 0a 09 09 20 20 20 20 7c 7c 20  UMENT)...    || 
4440: 28 6c 6f 63 61 6c 50 74 72 2d 3e 64 65 66 56 61  (localPtr->defVa
4450: 6c 75 65 50 74 72 20 3d 3d 20 4e 55 4c 4c 20 26  luePtr == NULL &
4460: 26 20 66 69 65 6c 64 43 6f 75 6e 74 20 3d 3d 20  & fieldCount == 
4470: 32 29 0a 09 09 20 20 20 20 7c 7c 20 28 6c 6f 63  2)...    || (loc
4480: 61 6c 50 74 72 2d 3e 64 65 66 56 61 6c 75 65 50  alPtr->defValueP
4490: 74 72 20 21 3d 20 4e 55 4c 4c 20 26 26 20 66 69  tr != NULL && fi
44a0: 65 6c 64 43 6f 75 6e 74 20 21 3d 20 32 29 29 20  eldCount != 2)) 
44b0: 7b 0a 09 09 54 63 6c 5f 53 65 74 4f 62 6a 52 65  {...Tcl_SetObjRe
44c0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c  sult(interp, Tcl
44d0: 5f 4f 62 6a 50 72 69 6e 74 66 28 0a 09 09 09 22  _ObjPrintf(...."
44e0: 70 72 6f 63 65 64 75 72 65 20 5c 22 25 73 5c 22  procedure \"%s\"
44f0: 3a 20 66 6f 72 6d 61 6c 20 70 61 72 61 6d 65 74  : formal paramet
4500: 65 72 20 25 64 20 69 73 20 22 0a 09 09 09 22 69  er %d is "...."i
4510: 6e 63 6f 6e 73 69 73 74 65 6e 74 20 77 69 74 68  nconsistent with
4520: 20 70 72 65 63 6f 6d 70 69 6c 65 64 20 62 6f 64   precompiled bod
4530: 79 22 2c 20 70 72 6f 63 4e 61 6d 65 2c 20 69 29  y", procName, i)
4540: 29 3b 0a 09 09 54 63 6c 5f 53 65 74 45 72 72 6f  );...Tcl_SetErro
4550: 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54  rCode(interp, "T
4560: 43 4c 22 2c 20 22 4f 50 45 52 41 54 49 4f 4e 22  CL", "OPERATION"
4570: 2c 20 22 50 52 4f 43 22 2c 0a 09 09 09 22 42 59  , "PROC",...."BY
4580: 54 45 43 4f 44 45 4c 49 45 53 22 2c 20 28 63 68  TECODELIES", (ch
4590: 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 09 67 6f  ar *)NULL);...go
45a0: 74 6f 20 70 72 6f 63 45 72 72 6f 72 3b 0a 09 20  to procError;.. 
45b0: 20 20 20 7d 0a 0a 09 20 20 20 20 2f 2a 0a 09 20     }...    /*.. 
45c0: 20 20 20 20 2a 20 43 6f 6d 70 61 72 65 20 74 68      * Compare th
45d0: 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20  e default value 
45e0: 69 66 20 61 6e 79 2e 0a 09 20 20 20 20 20 2a 2f  if any...     */
45f0: 0a 0a 09 20 20 20 20 69 66 20 28 6c 6f 63 61 6c  ...    if (local
4600: 50 74 72 2d 3e 64 65 66 56 61 6c 75 65 50 74 72  Ptr->defValuePtr
4610: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 09 69 6e   != NULL) {...in
4620: 74 20 74 6d 70 4c 65 6e 67 74 68 2c 20 76 61 6c  t tmpLength, val
4630: 75 65 4c 65 6e 67 74 68 3b 0a 09 09 63 6f 6e 73  ueLength;...cons
4640: 74 20 63 68 61 72 20 2a 74 6d 70 50 74 72 20 3d  t char *tmpPtr =
4650: 20 54 63 6c 47 65 74 53 74 72 69 6e 67 46 72 6f   TclGetStringFro
4660: 6d 4f 62 6a 28 6c 6f 63 61 6c 50 74 72 2d 3e 64  mObj(localPtr->d
4670: 65 66 56 61 6c 75 65 50 74 72 2c 0a 09 09 09 26  efValuePtr,....&
4680: 74 6d 70 4c 65 6e 67 74 68 29 3b 0a 09 09 63 6f  tmpLength);...co
4690: 6e 73 74 20 63 68 61 72 20 2a 76 61 6c 75 65 20  nst char *value 
46a0: 3d 20 54 63 6c 47 65 74 53 74 72 69 6e 67 46 72  = TclGetStringFr
46b0: 6f 6d 4f 62 6a 28 66 69 65 6c 64 56 61 6c 75 65  omObj(fieldValue
46c0: 73 5b 31 5d 2c 0a 09 09 09 26 76 61 6c 75 65 4c  s[1],....&valueL
46d0: 65 6e 67 74 68 29 3b 0a 0a 09 09 69 66 20 28 28  ength);....if ((
46e0: 76 61 6c 75 65 4c 65 6e 67 74 68 20 21 3d 20 74  valueLength != t
46f0: 6d 70 4c 65 6e 67 74 68 29 0a 09 09 20 20 20 20  mpLength)...    
4700: 20 7c 7c 20 6d 65 6d 63 6d 70 28 76 61 6c 75 65   || memcmp(value
4710: 2c 20 74 6d 70 50 74 72 2c 20 74 6d 70 4c 65 6e  , tmpPtr, tmpLen
4720: 67 74 68 29 20 21 3d 20 30 0a 09 09 29 20 7b 0a  gth) != 0...) {.
4730: 09 09 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 65  ..    Tcl_Obj *e
4740: 72 72 6f 72 4f 62 6a 20 3d 20 54 63 6c 5f 4f 62  rrorObj = Tcl_Ob
4750: 6a 50 72 69 6e 74 66 28 0a 09 09 09 20 20 20 20  jPrintf(....    
4760: 22 70 72 6f 63 65 64 75 72 65 20 5c 22 25 73 5c  "procedure \"%s\
4770: 22 3a 20 66 6f 72 6d 61 6c 20 70 61 72 61 6d 65  ": formal parame
4780: 74 65 72 20 5c 22 22 2c 20 70 72 6f 63 4e 61 6d  ter \"", procNam
4790: 65 29 3b 0a 09 09 20 20 20 20 54 63 6c 5f 41 70  e);...    Tcl_Ap
47a0: 70 65 6e 64 4f 62 6a 54 6f 4f 62 6a 28 65 72 72  pendObjToObj(err
47b0: 6f 72 4f 62 6a 2c 20 66 69 65 6c 64 56 61 6c 75  orObj, fieldValu
47c0: 65 73 5b 30 5d 29 3b 0a 09 09 20 20 20 20 54 63  es[0]);...    Tc
47d0: 6c 5f 41 70 70 65 6e 64 54 6f 4f 62 6a 28 65 72  l_AppendToObj(er
47e0: 72 6f 72 4f 62 6a 2c 20 22 5c 22 20 68 61 73 20  rorObj, "\" has 
47f0: 22 0a 09 09 09 22 64 65 66 61 75 6c 74 20 76 61  "...."default va
4800: 6c 75 65 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74  lue inconsistent
4810: 20 77 69 74 68 20 70 72 65 63 6f 6d 70 69 6c 65   with precompile
4820: 64 20 62 6f 64 79 22 2c 20 2d 31 29 3b 0a 09 09  d body", -1);...
4830: 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65      Tcl_SetObjRe
4840: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 65 72 72  sult(interp, err
4850: 6f 72 4f 62 6a 29 3b 0a 09 09 20 20 20 20 54 63  orObj);...    Tc
4860: 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69  l_SetErrorCode(i
4870: 6e 74 65 72 70 2c 20 22 54 43 4c 22 2c 20 22 4f  nterp, "TCL", "O
4880: 50 45 52 41 54 49 4f 4e 22 2c 20 22 50 52 4f 43  PERATION", "PROC
4890: 22 2c 0a 09 09 09 20 20 20 20 22 42 59 54 45 43  ",....    "BYTEC
48a0: 4f 44 45 4c 49 45 53 22 2c 20 28 63 68 61 72 20  ODELIES", (char 
48b0: 2a 29 4e 55 4c 4c 29 3b 0a 09 09 20 20 20 20 67  *)NULL);...    g
48c0: 6f 74 6f 20 70 72 6f 63 45 72 72 6f 72 3b 0a 09  oto procError;..
48d0: 09 7d 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 69  .}..    }..    i
48e0: 66 20 28 28 69 20 3d 3d 20 6e 75 6d 41 72 67 73  f ((i == numArgs
48f0: 20 2d 20 31 29 0a 09 09 20 20 20 20 26 26 20 28   - 1)...    && (
4900: 6c 6f 63 61 6c 50 74 72 2d 3e 6e 61 6d 65 4c 65  localPtr->nameLe
4910: 6e 67 74 68 20 3d 3d 20 34 29 0a 09 09 20 20 20  ngth == 4)...   
4920: 20 26 26 20 28 6c 6f 63 61 6c 50 74 72 2d 3e 6e   && (localPtr->n
4930: 61 6d 65 5b 30 5d 20 3d 3d 20 27 61 27 29 0a 09  ame[0] == 'a')..
4940: 09 20 20 20 20 26 26 20 28 73 74 72 63 6d 70 28  .    && (strcmp(
4950: 6c 6f 63 61 6c 50 74 72 2d 3e 6e 61 6d 65 2c 20  localPtr->name, 
4960: 22 61 72 67 73 22 29 20 3d 3d 20 30 29 29 20 7b  "args") == 0)) {
4970: 0a 09 09 6c 6f 63 61 6c 50 74 72 2d 3e 66 6c 61  ...localPtr->fla
4980: 67 73 20 7c 3d 20 56 41 52 5f 49 53 5f 41 52 47  gs |= VAR_IS_ARG
4990: 53 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20 20  S;..    }...    
49a0: 6c 6f 63 61 6c 50 74 72 20 3d 20 6c 6f 63 61 6c  localPtr = local
49b0: 50 74 72 2d 3e 6e 65 78 74 50 74 72 3b 0a 09 7d  Ptr->nextPtr;..}
49c0: 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 2f 2a 0a   else {..    /*.
49d0: 09 20 20 20 20 20 2a 20 41 6c 6c 6f 63 61 74 65  .     * Allocate
49e0: 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 74 68 65   an entry in the
49f0: 20 72 75 6e 74 69 6d 65 20 70 72 6f 63 65 64 75   runtime procedu
4a00: 72 65 20 66 72 61 6d 65 27 73 20 61 72 72 61 79  re frame's array
4a10: 20 6f 66 0a 09 20 20 20 20 20 2a 20 6c 6f 63 61   of..     * loca
4a20: 6c 20 76 61 72 69 61 62 6c 65 73 20 66 6f 72 20  l variables for 
4a30: 74 68 65 20 61 72 67 75 6d 65 6e 74 2e 0a 09 20  the argument... 
4a40: 20 20 20 20 2a 2f 0a 0a 09 20 20 20 20 6c 6f 63      */...    loc
4a50: 61 6c 50 74 72 20 3d 20 28 43 6f 6d 70 69 6c 65  alPtr = (Compile
4a60: 64 4c 6f 63 61 6c 20 2a 29 63 6b 61 6c 6c 6f 63  dLocal *)ckalloc
4a70: 28 0a 09 09 20 20 20 20 54 63 6c 4f 66 66 73 65  (...    TclOffse
4a80: 74 28 43 6f 6d 70 69 6c 65 64 4c 6f 63 61 6c 2c  t(CompiledLocal,
4a90: 20 6e 61 6d 65 29 20 2b 20 31 55 20 2b 20 66 69   name) + 1U + fi
4aa0: 65 6c 64 56 61 6c 75 65 73 5b 30 5d 2d 3e 6c 65  eldValues[0]->le
4ab0: 6e 67 74 68 29 3b 0a 09 20 20 20 20 69 66 20 28  ngth);..    if (
4ac0: 70 72 6f 63 50 74 72 2d 3e 66 69 72 73 74 4c 6f  procPtr->firstLo
4ad0: 63 61 6c 50 74 72 20 3d 3d 20 4e 55 4c 4c 29 20  calPtr == NULL) 
4ae0: 7b 0a 09 09 70 72 6f 63 50 74 72 2d 3e 66 69 72  {...procPtr->fir
4af0: 73 74 4c 6f 63 61 6c 50 74 72 20 3d 20 70 72 6f  stLocalPtr = pro
4b00: 63 50 74 72 2d 3e 6c 61 73 74 4c 6f 63 61 6c 50  cPtr->lastLocalP
4b10: 74 72 20 3d 20 6c 6f 63 61 6c 50 74 72 3b 0a 09  tr = localPtr;..
4b20: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 09 70      } else {...p
4b30: 72 6f 63 50 74 72 2d 3e 6c 61 73 74 4c 6f 63 61  rocPtr->lastLoca
4b40: 6c 50 74 72 2d 3e 6e 65 78 74 50 74 72 20 3d 20  lPtr->nextPtr = 
4b50: 6c 6f 63 61 6c 50 74 72 3b 0a 09 09 70 72 6f 63  localPtr;...proc
4b60: 50 74 72 2d 3e 6c 61 73 74 4c 6f 63 61 6c 50 74  Ptr->lastLocalPt
4b70: 72 20 3d 20 6c 6f 63 61 6c 50 74 72 3b 0a 09 20  r = localPtr;.. 
4b80: 20 20 20 7d 0a 09 20 20 20 20 6c 6f 63 61 6c 50     }..    localP
4b90: 74 72 2d 3e 6e 65 78 74 50 74 72 20 3d 20 4e 55  tr->nextPtr = NU
4ba0: 4c 4c 3b 0a 09 20 20 20 20 6c 6f 63 61 6c 50 74  LL;..    localPt
4bb0: 72 2d 3e 6e 61 6d 65 4c 65 6e 67 74 68 20 3d 20  r->nameLength = 
4bc0: 6e 61 6d 65 4c 65 6e 67 74 68 3b 0a 09 20 20 20  nameLength;..   
4bd0: 20 6c 6f 63 61 6c 50 74 72 2d 3e 66 72 61 6d 65   localPtr->frame
4be0: 49 6e 64 65 78 20 3d 20 69 3b 0a 09 20 20 20 20  Index = i;..    
4bf0: 6c 6f 63 61 6c 50 74 72 2d 3e 66 6c 61 67 73 20  localPtr->flags 
4c00: 3d 20 56 41 52 5f 41 52 47 55 4d 45 4e 54 3b 0a  = VAR_ARGUMENT;.
4c10: 09 20 20 20 20 6c 6f 63 61 6c 50 74 72 2d 3e 72  .    localPtr->r
4c20: 65 73 6f 6c 76 65 49 6e 66 6f 20 3d 20 4e 55 4c  esolveInfo = NUL
4c30: 4c 3b 0a 0a 09 20 20 20 20 69 66 20 28 66 69 65  L;...    if (fie
4c40: 6c 64 43 6f 75 6e 74 20 3d 3d 20 32 29 20 7b 0a  ldCount == 2) {.
4c50: 09 09 6c 6f 63 61 6c 50 74 72 2d 3e 64 65 66 56  ..localPtr->defV
4c60: 61 6c 75 65 50 74 72 20 3d 20 66 69 65 6c 64 56  aluePtr = fieldV
4c70: 61 6c 75 65 73 5b 31 5d 3b 0a 09 09 54 63 6c 5f  alues[1];...Tcl_
4c80: 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 6c 6f 63  IncrRefCount(loc
4c90: 61 6c 50 74 72 2d 3e 64 65 66 56 61 6c 75 65 50  alPtr->defValueP
4ca0: 74 72 29 3b 0a 09 20 20 20 20 7d 20 65 6c 73 65  tr);..    } else
4cb0: 20 7b 0a 09 09 6c 6f 63 61 6c 50 74 72 2d 3e 64   {...localPtr->d
4cc0: 65 66 56 61 6c 75 65 50 74 72 20 3d 20 4e 55 4c  efValuePtr = NUL
4cd0: 4c 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 6d  L;..    }..    m
4ce0: 65 6d 63 70 79 28 6c 6f 63 61 6c 50 74 72 2d 3e  emcpy(localPtr->
4cf0: 6e 61 6d 65 2c 20 61 72 67 6e 61 6d 65 2c 20 66  name, argname, f
4d00: 69 65 6c 64 56 61 6c 75 65 73 5b 30 5d 2d 3e 6c  ieldValues[0]->l
4d10: 65 6e 67 74 68 20 2b 20 31 29 3b 0a 09 20 20 20  ength + 1);..   
4d20: 20 69 66 20 28 28 69 20 3d 3d 20 6e 75 6d 41 72   if ((i == numAr
4d30: 67 73 20 2d 20 31 29 0a 09 09 20 20 20 20 26 26  gs - 1)...    &&
4d40: 20 28 6c 6f 63 61 6c 50 74 72 2d 3e 6e 61 6d 65   (localPtr->name
4d50: 4c 65 6e 67 74 68 20 3d 3d 20 34 29 0a 09 09 20  Length == 4)... 
4d60: 20 20 20 26 26 20 28 6c 6f 63 61 6c 50 74 72 2d     && (localPtr-
4d70: 3e 6e 61 6d 65 5b 30 5d 20 3d 3d 20 27 61 27 29  >name[0] == 'a')
4d80: 0a 09 09 20 20 20 20 26 26 20 28 6d 65 6d 63 6d  ...    && (memcm
4d90: 70 28 6c 6f 63 61 6c 50 74 72 2d 3e 6e 61 6d 65  p(localPtr->name
4da0: 2c 20 22 61 72 67 73 22 2c 20 34 29 20 3d 3d 20  , "args", 4) == 
4db0: 30 29 29 20 7b 0a 09 09 6c 6f 63 61 6c 50 74 72  0)) {...localPtr
4dc0: 2d 3e 66 6c 61 67 73 20 7c 3d 20 56 41 52 5f 49  ->flags |= VAR_I
4dd0: 53 5f 41 52 47 53 3b 0a 09 20 20 20 20 7d 0a 09  S_ARGS;..    }..
4de0: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2a 70 72  }.    }..    *pr
4df0: 6f 63 50 74 72 50 74 72 20 3d 20 70 72 6f 63 50  ocPtrPtr = procP
4e00: 74 72 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  tr;.    return T
4e10: 43 4c 5f 4f 4b 3b 0a 0a 20 20 70 72 6f 63 45 72  CL_OK;..  procEr
4e20: 72 6f 72 3a 0a 20 20 20 20 69 66 20 28 70 72 65  ror:.    if (pre
4e30: 63 6f 6d 70 69 6c 65 64 29 20 7b 0a 09 70 72 6f  compiled) {..pro
4e40: 63 50 74 72 2d 3e 72 65 66 43 6f 75 6e 74 2d 2d  cPtr->refCount--
4e50: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09  ;.    } else {..
4e60: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74  Tcl_DecrRefCount
4e70: 28 62 6f 64 79 50 74 72 29 3b 0a 09 77 68 69 6c  (bodyPtr);..whil
4e80: 65 20 28 70 72 6f 63 50 74 72 2d 3e 66 69 72 73  e (procPtr->firs
4e90: 74 4c 6f 63 61 6c 50 74 72 20 21 3d 20 4e 55 4c  tLocalPtr != NUL
4ea0: 4c 29 20 7b 0a 09 20 20 20 20 6c 6f 63 61 6c 50  L) {..    localP
4eb0: 74 72 20 3d 20 70 72 6f 63 50 74 72 2d 3e 66 69  tr = procPtr->fi
4ec0: 72 73 74 4c 6f 63 61 6c 50 74 72 3b 0a 09 20 20  rstLocalPtr;..  
4ed0: 20 20 70 72 6f 63 50 74 72 2d 3e 66 69 72 73 74    procPtr->first
4ee0: 4c 6f 63 61 6c 50 74 72 20 3d 20 6c 6f 63 61 6c  LocalPtr = local
4ef0: 50 74 72 2d 3e 6e 65 78 74 50 74 72 3b 0a 0a 09  Ptr->nextPtr;...
4f00: 20 20 20 20 69 66 20 28 6c 6f 63 61 6c 50 74 72      if (localPtr
4f10: 2d 3e 64 65 66 56 61 6c 75 65 50 74 72 20 21 3d  ->defValuePtr !=
4f20: 20 4e 55 4c 4c 29 20 7b 0a 09 09 54 63 6c 5f 44   NULL) {...Tcl_D
4f30: 65 63 72 52 65 66 43 6f 75 6e 74 28 6c 6f 63 61  ecrRefCount(loca
4f40: 6c 50 74 72 2d 3e 64 65 66 56 61 6c 75 65 50 74  lPtr->defValuePt
4f50: 72 29 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20  r);..    }...   
4f60: 20 63 6b 66 72 65 65 28 6c 6f 63 61 6c 50 74 72   ckfree(localPtr
4f70: 29 3b 0a 09 7d 0a 09 63 6b 66 72 65 65 28 70 72  );..}..ckfree(pr
4f80: 6f 63 50 74 72 29 3b 0a 20 20 20 20 7d 0a 20 20  ocPtr);.    }.  
4f90: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
4fa0: 4f 52 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d  OR;.}.../*. *---
4fb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4fc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4fd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4fe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
4ff0: 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 63 6c 47 65 74  ---. *. * TclGet
5000: 46 72 61 6d 65 20 2d 2d 0a 20 2a 0a 20 2a 09 47  Frame --. *. *.G
5010: 69 76 65 6e 20 61 20 64 65 73 63 72 69 70 74 69  iven a descripti
5020: 6f 6e 20 6f 66 20 61 20 70 72 6f 63 65 64 75 72  on of a procedur
5030: 65 20 66 72 61 6d 65 2c 20 73 75 63 68 20 61 73  e frame, such as
5040: 20 74 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   the first argum
5050: 65 6e 74 0a 20 2a 09 74 6f 20 61 6e 20 22 75 70  ent. *.to an "up
5060: 6c 65 76 65 6c 22 20 6f 72 20 22 75 70 76 61 72  level" or "upvar
5070: 22 20 63 6f 6d 6d 61 6e 64 2c 20 6c 6f 63 61 74  " command, locat
5080: 65 20 74 68 65 20 63 61 6c 6c 20 66 72 61 6d 65  e the call frame
5090: 20 66 6f 72 20 74 68 65 0a 20 2a 09 61 70 70 72   for the. *.appr
50a0: 6f 70 72 69 61 74 65 20 6c 65 76 65 6c 20 6f 66  opriate level of
50b0: 20 70 72 6f 63 65 64 75 72 65 2e 0a 20 2a 0a 20   procedure.. *. 
50c0: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 54 68  * Results:. *.Th
50d0: 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69  e return value i
50e0: 73 20 2d 31 20 69 66 20 61 6e 20 65 72 72 6f 72  s -1 if an error
50f0: 20 6f 63 63 75 72 72 65 64 20 69 6e 20 66 69 6e   occurred in fin
5100: 64 69 6e 67 20 74 68 65 20 66 72 61 6d 65 20 28  ding the frame (
5110: 69 6e 0a 20 2a 09 74 68 69 73 20 63 61 73 65 20  in. *.this case 
5120: 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
5130: 20 69 73 20 6c 65 66 74 20 69 6e 20 74 68 65 20   is left in the 
5140: 69 6e 74 65 72 70 27 73 20 72 65 73 75 6c 74 29  interp's result)
5150: 2e 20 31 20 69 73 0a 20 2a 09 72 65 74 75 72 6e  . 1 is. *.return
5160: 65 64 20 69 66 20 73 74 72 69 6e 67 20 77 61 73  ed if string was
5170: 20 65 69 74 68 65 72 20 61 20 6e 75 6d 62 65 72   either a number
5180: 20 6f 72 20 61 20 6e 75 6d 62 65 72 20 70 72 65   or a number pre
5190: 63 65 64 65 64 20 62 79 20 22 23 22 20 61 6e 64  ceded by "#" and
51a0: 0a 20 2a 09 69 74 20 73 70 65 63 69 66 69 65 64  . *.it specified
51b0: 20 61 20 76 61 6c 69 64 20 66 72 61 6d 65 2e 20   a valid frame. 
51c0: 30 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  0 is returned if
51d0: 20 73 74 72 69 6e 67 20 69 73 6e 27 74 20 6f 6e   string isn't on
51e0: 65 20 6f 66 20 74 68 65 0a 20 2a 09 74 77 6f 20  e of the. *.two 
51f0: 74 68 69 6e 67 73 20 61 62 6f 76 65 20 28 69 6e  things above (in
5200: 20 74 68 69 73 20 63 61 73 65 2c 20 74 68 65 20   this case, the 
5210: 6c 6f 6f 6b 75 70 20 61 63 74 73 20 61 73 20 69  lookup acts as i
5220: 66 20 73 74 72 69 6e 67 20 77 65 72 65 0a 20 2a  f string were. *
5230: 09 22 31 22 29 2e 20 54 68 65 20 76 61 72 69 61  ."1"). The varia
5240: 62 6c 65 20 70 6f 69 6e 74 65 64 20 74 6f 20 62  ble pointed to b
5250: 79 20 66 72 61 6d 65 50 74 72 50 74 72 20 69 73  y framePtrPtr is
5260: 20 66 69 6c 6c 65 64 20 69 6e 20 77 69 74 68 20   filled in with 
5270: 74 68 65 0a 20 2a 09 61 64 64 72 65 73 73 20 6f  the. *.address o
5280: 66 20 74 68 65 20 64 65 73 69 72 65 64 20 66 72  f the desired fr
5290: 61 6d 65 20 28 75 6e 6c 65 73 73 20 61 6e 20 65  ame (unless an e
52a0: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 69 6e 20  rror occurs, in 
52b0: 77 68 69 63 68 20 63 61 73 65 20 69 74 0a 20 2a  which case it. *
52c0: 09 69 73 6e 27 74 20 6d 6f 64 69 66 69 65 64 29  .isn't modified)
52d0: 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66  .. *. * Side eff
52e0: 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20  ects:. *.None.. 
52f0: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
5300: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5310: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5320: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5330: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a  ----------. */..
5340: 69 6e 74 0a 54 63 6c 47 65 74 46 72 61 6d 65 28  int.TclGetFrame(
5350: 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  .    Tcl_Interp 
5360: 2a 69 6e 74 65 72 70 2c 09 09 2f 2a 20 49 6e 74  *interp,../* Int
5370: 65 72 70 72 65 74 65 72 20 69 6e 20 77 68 69 63  erpreter in whic
5380: 68 20 74 6f 20 66 69 6e 64 20 66 72 61 6d 65 2e  h to find frame.
5390: 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   */.    const ch
53a0: 61 72 20 2a 6e 61 6d 65 2c 09 09 2f 2a 20 53 74  ar *name,../* St
53b0: 72 69 6e 67 20 64 65 73 63 72 69 62 69 6e 67 20  ring describing 
53c0: 66 72 61 6d 65 2e 20 2a 2f 0a 20 20 20 20 43 61  frame. */.    Ca
53d0: 6c 6c 46 72 61 6d 65 20 2a 2a 66 72 61 6d 65 50  llFrame **frameP
53e0: 74 72 50 74 72 29 09 2f 2a 20 53 74 6f 72 65 20  trPtr)./* Store 
53f0: 70 6f 69 6e 74 65 72 20 74 6f 20 66 72 61 6d 65  pointer to frame
5400: 20 68 65 72 65 20 28 6f 72 20 4e 55 4c 4c 20 69   here (or NULL i
5410: 66 0a 09 09 09 09 20 2a 20 67 6c 6f 62 61 6c 20  f..... * global 
5420: 66 72 61 6d 65 20 69 6e 64 69 63 61 74 65 64 29  frame indicated)
5430: 2e 20 2a 2f 0a 7b 0a 20 20 20 20 49 6e 74 65 72  . */.{.    Inter
5440: 70 20 2a 69 50 74 72 20 3d 20 28 49 6e 74 65 72  p *iPtr = (Inter
5450: 70 20 2a 29 20 69 6e 74 65 72 70 3b 0a 20 20 20  p *) interp;.   
5460: 20 69 6e 74 20 63 75 72 4c 65 76 65 6c 2c 20 6c   int curLevel, l
5470: 65 76 65 6c 2c 20 72 65 73 75 6c 74 3b 0a 20 20  evel, result;.  
5480: 20 20 43 61 6c 6c 46 72 61 6d 65 20 2a 66 72 61    CallFrame *fra
5490: 6d 65 50 74 72 3b 0a 0a 20 20 20 20 2f 2a 0a 20  mePtr;..    /*. 
54a0: 20 20 20 20 2a 20 50 61 72 73 65 20 73 74 72 69      * Parse stri
54b0: 6e 67 20 74 6f 20 66 69 67 75 72 65 20 6f 75 74  ng to figure out
54c0: 20 77 68 69 63 68 20 6c 65 76 65 6c 20 6e 75 6d   which level num
54d0: 62 65 72 20 74 6f 20 67 6f 20 74 6f 2e 0a 20 20  ber to go to..  
54e0: 20 20 20 2a 2f 0a 0a 20 20 20 20 72 65 73 75 6c     */..    resul
54f0: 74 20 3d 20 31 3b 0a 20 20 20 20 63 75 72 4c 65  t = 1;.    curLe
5500: 76 65 6c 20 3d 20 69 50 74 72 2d 3e 76 61 72 46  vel = iPtr->varF
5510: 72 61 6d 65 50 74 72 2d 3e 6c 65 76 65 6c 3b 0a  ramePtr->level;.
5520: 20 20 20 20 69 66 20 28 2a 6e 61 6d 65 3d 3d 20      if (*name== 
5530: 27 23 27 29 20 7b 0a 09 69 66 20 28 54 63 6c 5f  '#') {..if (Tcl_
5540: 47 65 74 49 6e 74 28 4e 55 4c 4c 2c 20 6e 61 6d  GetInt(NULL, nam
5550: 65 2b 31 2c 20 26 6c 65 76 65 6c 29 20 21 3d 20  e+1, &level) != 
5560: 54 43 4c 5f 4f 4b 20 7c 7c 20 6c 65 76 65 6c 20  TCL_OK || level 
5570: 3c 20 30 29 20 7b 0a 09 20 20 20 20 67 6f 74 6f  < 0) {..    goto
5580: 20 6c 65 76 65 6c 45 72 72 6f 72 3b 0a 09 7d 0a   levelError;..}.
5590: 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 69      } else if (i
55a0: 73 64 69 67 69 74 28 55 43 48 41 52 28 2a 6e 61  sdigit(UCHAR(*na
55b0: 6d 65 29 29 29 20 7b 20 2f 2a 20 49 4e 54 4c 3a  me))) { /* INTL:
55c0: 20 64 69 67 69 74 20 2a 2f 0a 09 69 66 20 28 54   digit */..if (T
55d0: 63 6c 5f 47 65 74 49 6e 74 28 4e 55 4c 4c 2c 20  cl_GetInt(NULL, 
55e0: 6e 61 6d 65 2c 20 26 6c 65 76 65 6c 29 20 21 3d  name, &level) !=
55f0: 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20 20 20   TCL_OK) {..    
5600: 67 6f 74 6f 20 6c 65 76 65 6c 45 72 72 6f 72 3b  goto levelError;
5610: 0a 09 7d 0a 09 6c 65 76 65 6c 20 3d 20 63 75 72  ..}..level = cur
5620: 4c 65 76 65 6c 20 2d 20 6c 65 76 65 6c 3b 0a 20  Level - level;. 
5630: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 2f 2a 0a     } else {../*.
5640: 09 20 2a 20 28 68 69 73 74 6f 72 69 63 61 6c 2c  . * (historical,
5650: 20 54 4f 44 4f 29 20 49 66 20 6e 61 6d 65 20 64   TODO) If name d
5660: 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20  oes not contain 
5670: 61 20 6c 65 76 65 6c 20 28 23 30 20 6f 72 20 31  a level (#0 or 1
5680: 29 2c 0a 09 20 2a 20 54 63 6c 47 65 74 46 72 61  ),.. * TclGetFra
5690: 6d 65 20 61 6e 64 20 54 63 6c 5f 55 70 56 61 72  me and Tcl_UpVar
56a0: 32 20 75 73 65 73 20 63 75 72 72 65 6e 74 20 6c  2 uses current l
56b0: 65 76 65 6c 20 2d 20 31 0a 09 20 2a 2f 0a 09 6c  evel - 1.. */..l
56c0: 65 76 65 6c 20 3d 20 63 75 72 4c 65 76 65 6c 20  evel = curLevel 
56d0: 2d 20 31 3b 0a 09 72 65 73 75 6c 74 20 3d 20 30  - 1;..result = 0
56e0: 3b 0a 09 6e 61 6d 65 20 3d 20 22 31 22 3b 20 2f  ;..name = "1"; /
56f0: 2a 20 62 65 20 6d 6f 72 65 20 63 6f 6e 73 69 73  * be more consis
5700: 74 65 6e 74 20 77 69 74 68 20 54 63 6c 4f 62 6a  tent with TclObj
5710: 47 65 74 46 72 61 6d 65 20 28 65 72 72 6f 72 20  GetFrame (error 
5720: 61 74 20 74 6f 70 20 2d 20 31 29 20 2a 2f 0a 20  at top - 1) */. 
5730: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20     }..    /*.   
5740: 20 20 2a 20 46 69 67 75 72 65 20 6f 75 74 20 77    * Figure out w
5750: 68 69 63 68 20 66 72 61 6d 65 20 74 6f 20 75 73  hich frame to us
5760: 65 2c 20 61 6e 64 20 72 65 74 75 72 6e 20 69 74  e, and return it
5770: 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a   to the caller..
5780: 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 66 6f 72       */..    for
5790: 20 28 66 72 61 6d 65 50 74 72 20 3d 20 69 50 74   (framePtr = iPt
57a0: 72 2d 3e 76 61 72 46 72 61 6d 65 50 74 72 3b 20  r->varFramePtr; 
57b0: 66 72 61 6d 65 50 74 72 20 21 3d 20 4e 55 4c 4c  framePtr != NULL
57c0: 3b 0a 09 20 20 20 20 66 72 61 6d 65 50 74 72 20  ;..    framePtr 
57d0: 3d 20 66 72 61 6d 65 50 74 72 2d 3e 63 61 6c 6c  = framePtr->call
57e0: 65 72 56 61 72 50 74 72 29 20 7b 0a 09 69 66 20  erVarPtr) {..if 
57f0: 28 66 72 61 6d 65 50 74 72 2d 3e 6c 65 76 65 6c  (framePtr->level
5800: 20 3d 3d 20 6c 65 76 65 6c 29 20 7b 0a 09 20 20   == level) {..  
5810: 20 20 62 72 65 61 6b 3b 0a 09 7d 0a 20 20 20 20    break;..}.    
5820: 7d 0a 20 20 20 20 69 66 20 28 66 72 61 6d 65 50  }.    if (frameP
5830: 74 72 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 67  tr == NULL) {..g
5840: 6f 74 6f 20 6c 65 76 65 6c 45 72 72 6f 72 3b 0a  oto levelError;.
5850: 20 20 20 20 7d 0a 0a 20 20 20 20 2a 66 72 61 6d      }..    *fram
5860: 65 50 74 72 50 74 72 20 3d 20 66 72 61 6d 65 50  ePtrPtr = frameP
5870: 74 72 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72  tr;.    return r
5880: 65 73 75 6c 74 3b 0a 0a 20 20 6c 65 76 65 6c 45  esult;..  levelE
5890: 72 72 6f 72 3a 0a 20 20 20 20 54 63 6c 5f 53 65  rror:.    Tcl_Se
58a0: 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72  tObjResult(inter
58b0: 70 2c 20 54 63 6c 5f 4f 62 6a 50 72 69 6e 74 66  p, Tcl_ObjPrintf
58c0: 28 22 62 61 64 20 6c 65 76 65 6c 20 5c 22 25 73  ("bad level \"%s
58d0: 5c 22 22 2c 20 6e 61 6d 65 29 29 3b 0a 20 20 20  \"", name));.   
58e0: 20 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64   Tcl_SetErrorCod
58f0: 65 28 69 6e 74 65 72 70 2c 20 22 54 43 4c 22 2c  e(interp, "TCL",
5900: 20 22 56 41 4c 55 45 22 2c 20 22 53 54 41 43 4b   "VALUE", "STACK
5910: 4c 45 56 45 4c 22 2c 20 28 63 68 61 72 20 2a 29  LEVEL", (char *)
5920: 4e 55 4c 4c 29 3b 0a 20 20 20 20 72 65 74 75 72  NULL);.    retur
5930: 6e 20 2d 31 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d  n -1;.}.../*. *-
5940: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5950: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5960: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5970: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5980: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 63 6c 4f  -----. *. * TclO
5990: 62 6a 47 65 74 46 72 61 6d 65 20 2d 2d 0a 20 2a  bjGetFrame --. *
59a0: 0a 20 2a 09 47 69 76 65 6e 20 61 20 64 65 73 63  . *.Given a desc
59b0: 72 69 70 74 69 6f 6e 20 6f 66 20 61 20 70 72 6f  ription of a pro
59c0: 63 65 64 75 72 65 20 66 72 61 6d 65 2c 20 73 75  cedure frame, su
59d0: 63 68 20 61 73 20 74 68 65 20 66 69 72 73 74 20  ch as the first 
59e0: 61 72 67 75 6d 65 6e 74 0a 20 2a 09 74 6f 20 61  argument. *.to a
59f0: 6e 20 22 75 70 6c 65 76 65 6c 22 20 6f 72 20 22  n "uplevel" or "
5a00: 75 70 76 61 72 22 20 63 6f 6d 6d 61 6e 64 2c 20  upvar" command, 
5a10: 6c 6f 63 61 74 65 20 74 68 65 20 63 61 6c 6c 20  locate the call 
5a20: 66 72 61 6d 65 20 66 6f 72 20 74 68 65 0a 20 2a  frame for the. *
5a30: 09 61 70 70 72 6f 70 72 69 61 74 65 20 6c 65 76  .appropriate lev
5a40: 65 6c 20 6f 66 20 70 72 6f 63 65 64 75 72 65 2e  el of procedure.
5a50: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a  . *. * Results:.
5a60: 20 2a 09 54 68 65 20 72 65 74 75 72 6e 20 76 61   *.The return va
5a70: 6c 75 65 20 69 73 20 2d 31 20 69 66 20 61 6e 20  lue is -1 if an 
5a80: 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 20 69  error occurred i
5a90: 6e 20 66 69 6e 64 69 6e 67 20 74 68 65 20 66 72  n finding the fr
5aa0: 61 6d 65 20 28 69 6e 0a 20 2a 09 74 68 69 73 20  ame (in. *.this 
5ab0: 63 61 73 65 20 61 6e 20 65 72 72 6f 72 20 6d 65  case an error me
5ac0: 73 73 61 67 65 20 69 73 20 6c 65 66 74 20 69 6e  ssage is left in
5ad0: 20 74 68 65 20 69 6e 74 65 72 70 27 73 20 72 65   the interp's re
5ae0: 73 75 6c 74 29 2e 20 31 20 69 73 0a 20 2a 09 72  sult). 1 is. *.r
5af0: 65 74 75 72 6e 65 64 20 69 66 20 6f 62 6a 50 74  eturned if objPt
5b00: 72 20 77 61 73 20 65 69 74 68 65 72 20 61 6e 20  r was either an 
5b10: 69 6e 74 20 6f 72 20 61 6e 20 69 6e 74 20 70 72  int or an int pr
5b20: 65 63 65 64 65 64 20 62 79 20 22 23 22 20 61 6e  eceded by "#" an
5b30: 64 0a 20 2a 09 69 74 20 73 70 65 63 69 66 69 65  d. *.it specifie
5b40: 64 20 61 20 76 61 6c 69 64 20 66 72 61 6d 65 2e  d a valid frame.
5b50: 20 30 20 69 73 20 72 65 74 75 72 6e 65 64 20 69   0 is returned i
5b60: 66 20 6f 62 6a 50 74 72 20 69 73 6e 27 74 20 6f  f objPtr isn't o
5b70: 6e 65 20 6f 66 20 74 68 65 0a 20 2a 09 74 77 6f  ne of the. *.two
5b80: 20 74 68 69 6e 67 73 20 61 62 6f 76 65 20 28 69   things above (i
5b90: 6e 20 74 68 69 73 20 63 61 73 65 2c 20 74 68 65  n this case, the
5ba0: 20 6c 6f 6f 6b 75 70 20 61 63 74 73 20 61 73 20   lookup acts as 
5bb0: 69 66 20 6f 62 6a 50 74 72 20 77 65 72 65 0a 20  if objPtr were. 
5bc0: 2a 09 22 31 22 29 2e 20 54 68 65 20 76 61 72 69  *."1"). The vari
5bd0: 61 62 6c 65 20 70 6f 69 6e 74 65 64 20 74 6f 20  able pointed to 
5be0: 62 79 20 66 72 61 6d 65 50 74 72 50 74 72 20 69  by framePtrPtr i
5bf0: 73 20 66 69 6c 6c 65 64 20 69 6e 20 77 69 74 68  s filled in with
5c00: 20 74 68 65 0a 20 2a 09 61 64 64 72 65 73 73 20   the. *.address 
5c10: 6f 66 20 74 68 65 20 64 65 73 69 72 65 64 20 66  of the desired f
5c20: 72 61 6d 65 20 28 75 6e 6c 65 73 73 20 61 6e 20  rame (unless an 
5c30: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 69 6e  error occurs, in
5c40: 20 77 68 69 63 68 20 63 61 73 65 20 69 74 0a 20   which case it. 
5c50: 2a 09 69 73 6e 27 74 20 6d 6f 64 69 66 69 65 64  *.isn't modified
5c60: 29 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66  ).. *. * Side ef
5c70: 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a  fects:. *.None..
5c80: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *. *-----------
5c90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5ca0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5cb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5cc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a  -----------. */.
5cd0: 0a 69 6e 74 0a 54 63 6c 4f 62 6a 47 65 74 46 72  .int.TclObjGetFr
5ce0: 61 6d 65 28 0a 20 20 20 20 54 63 6c 5f 49 6e 74  ame(.    Tcl_Int
5cf0: 65 72 70 20 2a 69 6e 74 65 72 70 2c 09 09 2f 2a  erp *interp,../*
5d00: 20 49 6e 74 65 72 70 72 65 74 65 72 20 69 6e 20   Interpreter in 
5d10: 77 68 69 63 68 20 74 6f 20 66 69 6e 64 20 66 72  which to find fr
5d20: 61 6d 65 2e 20 2a 2f 0a 20 20 20 20 54 63 6c 5f  ame. */.    Tcl_
5d30: 4f 62 6a 20 2a 6f 62 6a 50 74 72 2c 09 09 2f 2a  Obj *objPtr,../*
5d40: 20 4f 62 6a 65 63 74 20 64 65 73 63 72 69 62 69   Object describi
5d50: 6e 67 20 66 72 61 6d 65 2e 20 2a 2f 0a 20 20 20  ng frame. */.   
5d60: 20 43 61 6c 6c 46 72 61 6d 65 20 2a 2a 66 72 61   CallFrame **fra
5d70: 6d 65 50 74 72 50 74 72 29 09 2f 2a 20 53 74 6f  mePtrPtr)./* Sto
5d80: 72 65 20 70 6f 69 6e 74 65 72 20 74 6f 20 66 72  re pointer to fr
5d90: 61 6d 65 20 68 65 72 65 20 28 6f 72 20 4e 55 4c  ame here (or NUL
5da0: 4c 20 69 66 0a 09 09 09 09 20 2a 20 67 6c 6f 62  L if..... * glob
5db0: 61 6c 20 66 72 61 6d 65 20 69 6e 64 69 63 61 74  al frame indicat
5dc0: 65 64 29 2e 20 2a 2f 0a 7b 0a 20 20 20 20 49 6e  ed). */.{.    In
5dd0: 74 65 72 70 20 2a 69 50 74 72 20 3d 20 28 49 6e  terp *iPtr = (In
5de0: 74 65 72 70 20 2a 29 20 69 6e 74 65 72 70 3b 0a  terp *) interp;.
5df0: 20 20 20 20 69 6e 74 20 63 75 72 4c 65 76 65 6c      int curLevel
5e00: 2c 20 6c 65 76 65 6c 2c 20 72 65 73 75 6c 74 3b  , level, result;
5e10: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
5e20: 2a 6e 61 6d 65 20 3d 20 4e 55 4c 4c 3b 0a 0a 20  *name = NULL;.. 
5e30: 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 50 61 72     /*.     * Par
5e40: 73 65 20 6f 62 6a 65 63 74 20 74 6f 20 66 69 67  se object to fig
5e50: 75 72 65 20 6f 75 74 20 77 68 69 63 68 20 6c 65  ure out which le
5e60: 76 65 6c 20 6e 75 6d 62 65 72 20 74 6f 20 67 6f  vel number to go
5e70: 20 74 6f 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20   to..     */..  
5e80: 20 20 72 65 73 75 6c 74 20 3d 20 30 3b 0a 20 20    result = 0;.  
5e90: 20 20 63 75 72 4c 65 76 65 6c 20 3d 20 69 50 74    curLevel = iPt
5ea0: 72 2d 3e 76 61 72 46 72 61 6d 65 50 74 72 2d 3e  r->varFramePtr->
5eb0: 6c 65 76 65 6c 3b 0a 0a 20 20 20 20 2f 2a 0a 20  level;..    /*. 
5ec0: 20 20 20 20 2a 20 43 68 65 63 6b 20 66 6f 72 20      * Check for 
5ed0: 69 6e 74 65 67 65 72 20 66 69 72 73 74 2c 20 73  integer first, s
5ee0: 69 6e 63 65 20 74 68 61 74 20 68 61 73 20 70 6f  ince that has po
5ef0: 74 65 6e 74 69 61 6c 20 74 6f 20 73 70 61 72 65  tential to spare
5f00: 20 75 73 0a 20 20 20 20 20 2a 20 61 20 67 65 6e   us.     * a gen
5f10: 65 72 61 74 69 6f 6e 20 6f 66 20 61 20 73 74 72  eration of a str
5f20: 69 6e 67 72 65 70 2e 0a 20 20 20 20 20 2a 2f 0a  ingrep..     */.
5f30: 0a 20 20 20 20 69 66 20 28 6f 62 6a 50 74 72 20  .    if (objPtr 
5f40: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 2f 2a 20 44  == NULL) {../* D
5f50: 6f 20 6e 6f 74 68 69 6e 67 20 2a 2f 0a 20 20 20  o nothing */.   
5f60: 20 7d 20 65 6c 73 65 20 69 66 20 28 54 43 4c 5f   } else if (TCL_
5f70: 4f 4b 20 3d 3d 20 54 63 6c 5f 47 65 74 49 6e 74  OK == Tcl_GetInt
5f80: 46 72 6f 6d 4f 62 6a 28 4e 55 4c 4c 2c 20 6f 62  FromObj(NULL, ob
5f90: 6a 50 74 72 2c 20 26 6c 65 76 65 6c 29 0a 09 20  jPtr, &level).. 
5fa0: 20 20 20 26 26 20 28 6c 65 76 65 6c 20 3e 3d 20     && (level >= 
5fb0: 30 29 29 20 7b 0a 09 6c 65 76 65 6c 20 3d 20 63  0)) {..level = c
5fc0: 75 72 4c 65 76 65 6c 20 2d 20 6c 65 76 65 6c 3b  urLevel - level;
5fd0: 0a 09 72 65 73 75 6c 74 20 3d 20 31 3b 0a 20 20  ..result = 1;.  
5fe0: 20 20 7d 20 65 6c 73 65 20 69 66 20 28 6f 62 6a    } else if (obj
5ff0: 50 74 72 2d 3e 74 79 70 65 50 74 72 20 3d 3d 20  Ptr->typePtr == 
6000: 26 6c 65 76 65 6c 52 65 66 65 72 65 6e 63 65 54  &levelReferenceT
6010: 79 70 65 29 20 7b 0a 09 6c 65 76 65 6c 20 3d 20  ype) {..level = 
6020: 28 69 6e 74 29 20 6f 62 6a 50 74 72 2d 3e 69 6e  (int) objPtr->in
6030: 74 65 72 6e 61 6c 52 65 70 2e 6c 6f 6e 67 56 61  ternalRep.longVa
6040: 6c 75 65 3b 0a 09 72 65 73 75 6c 74 20 3d 20 31  lue;..result = 1
6050: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09  ;.    } else {..
6060: 6e 61 6d 65 20 3d 20 54 63 6c 47 65 74 53 74 72  name = TclGetStr
6070: 69 6e 67 28 6f 62 6a 50 74 72 29 3b 0a 09 69 66  ing(objPtr);..if
6080: 20 28 6e 61 6d 65 5b 30 5d 20 3d 3d 20 27 23 27   (name[0] == '#'
6090: 29 20 7b 0a 09 20 20 20 20 69 66 20 28 54 43 4c  ) {..    if (TCL
60a0: 5f 4f 4b 20 3d 3d 20 54 63 6c 5f 47 65 74 49 6e  _OK == Tcl_GetIn
60b0: 74 28 4e 55 4c 4c 2c 20 6e 61 6d 65 2b 31 2c 20  t(NULL, name+1, 
60c0: 26 6c 65 76 65 6c 29 20 26 26 20 6c 65 76 65 6c  &level) && level
60d0: 20 3e 3d 20 30 29 20 7b 0a 09 09 54 63 6c 46 72   >= 0) {...TclFr
60e0: 65 65 49 6e 74 52 65 70 28 6f 62 6a 50 74 72 29  eeIntRep(objPtr)
60f0: 3b 0a 09 09 6f 62 6a 50 74 72 2d 3e 74 79 70 65  ;...objPtr->type
6100: 50 74 72 20 3d 20 26 6c 65 76 65 6c 52 65 66 65  Ptr = &levelRefe
6110: 72 65 6e 63 65 54 79 70 65 3b 0a 09 09 6f 62 6a  renceType;...obj
6120: 50 74 72 2d 3e 69 6e 74 65 72 6e 61 6c 52 65 70  Ptr->internalRep
6130: 2e 6c 6f 6e 67 56 61 6c 75 65 20 3d 20 6c 65 76  .longValue = lev
6140: 65 6c 3b 0a 09 09 72 65 73 75 6c 74 20 3d 20 31  el;...result = 1
6150: 3b 0a 09 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  ;..    } else {.
6160: 09 09 72 65 73 75 6c 74 20 3d 20 2d 31 3b 0a 09  ..result = -1;..
6170: 20 20 20 20 7d 0a 09 7d 20 65 6c 73 65 20 69 66      }..} else if
6180: 20 28 69 73 64 69 67 69 74 28 55 43 48 41 52 28   (isdigit(UCHAR(
6190: 6e 61 6d 65 5b 30 5d 29 29 29 20 7b 20 2f 2a 20  name[0]))) { /* 
61a0: 49 4e 54 4c 3a 20 64 69 67 69 74 20 2a 2f 0a 09  INTL: digit */..
61b0: 20 20 20 20 2f 2a 0a 09 20 20 20 20 20 2a 20 49      /*..     * I
61c0: 66 20 74 68 69 73 20 77 65 72 65 20 61 6e 20 69  f this were an i
61d0: 6e 74 65 67 65 72 2c 20 77 65 27 64 20 68 61 76  nteger, we'd hav
61e0: 65 20 73 75 63 63 65 65 64 65 64 20 61 6c 72 65  e succeeded alre
61f0: 61 64 79 2e 0a 09 20 20 20 20 20 2a 20 44 6f 63  ady...     * Doc
6200: 73 20 73 61 79 20 77 65 20 68 61 76 65 20 74 6f  s say we have to
6210: 20 74 72 65 61 74 20 74 68 69 73 20 61 73 20 61   treat this as a
6220: 20 27 62 61 64 20 6c 65 76 65 6c 27 20 20 65 72   'bad level'  er
6230: 72 6f 72 2e 0a 09 20 20 20 20 20 2a 2f 0a 09 20  ror...     */.. 
6240: 20 20 20 72 65 73 75 6c 74 20 3d 20 2d 31 3b 0a     result = -1;.
6250: 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  .}.    }..    if
6260: 20 28 72 65 73 75 6c 74 20 3d 3d 20 30 29 20 7b   (result == 0) {
6270: 0a 09 6c 65 76 65 6c 20 3d 20 63 75 72 4c 65 76  ..level = curLev
6280: 65 6c 20 2d 20 31 3b 0a 09 6e 61 6d 65 20 3d 20  el - 1;..name = 
6290: 22 31 22 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  "1";.    }.    i
62a0: 66 20 28 72 65 73 75 6c 74 20 21 3d 20 2d 31 29  f (result != -1)
62b0: 20 7b 0a 09 69 66 20 28 6c 65 76 65 6c 20 3e 3d   {..if (level >=
62c0: 20 30 29 20 7b 0a 09 20 20 20 20 43 61 6c 6c 46   0) {..    CallF
62d0: 72 61 6d 65 20 2a 66 72 61 6d 65 50 74 72 3b 0a  rame *framePtr;.
62e0: 09 20 20 20 20 66 6f 72 20 28 66 72 61 6d 65 50  .    for (frameP
62f0: 74 72 20 3d 20 69 50 74 72 2d 3e 76 61 72 46 72  tr = iPtr->varFr
6300: 61 6d 65 50 74 72 3b 20 66 72 61 6d 65 50 74 72  amePtr; framePtr
6310: 20 21 3d 20 4e 55 4c 4c 3b 0a 09 09 20 20 20 20   != NULL;...    
6320: 66 72 61 6d 65 50 74 72 20 3d 20 66 72 61 6d 65  framePtr = frame
6330: 50 74 72 2d 3e 63 61 6c 6c 65 72 56 61 72 50 74  Ptr->callerVarPt
6340: 72 29 20 7b 0a 09 09 69 66 20 28 66 72 61 6d 65  r) {...if (frame
6350: 50 74 72 2d 3e 6c 65 76 65 6c 20 3d 3d 20 6c 65  Ptr->level == le
6360: 76 65 6c 29 20 7b 0a 09 09 20 20 20 20 2a 66 72  vel) {...    *fr
6370: 61 6d 65 50 74 72 50 74 72 20 3d 20 66 72 61 6d  amePtrPtr = fram
6380: 65 50 74 72 3b 0a 09 09 20 20 20 20 72 65 74 75  ePtr;...    retu
6390: 72 6e 20 72 65 73 75 6c 74 3b 0a 09 09 7d 0a 09  rn result;...}..
63a0: 20 20 20 20 7d 0a 09 7d 0a 09 69 66 20 28 6e 61      }..}..if (na
63b0: 6d 65 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20  me == NULL) {.. 
63c0: 20 20 20 6e 61 6d 65 20 3d 20 54 63 6c 47 65 74     name = TclGet
63d0: 53 74 72 69 6e 67 28 6f 62 6a 50 74 72 29 3b 0a  String(objPtr);.
63e0: 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 54 63  .}.    }..    Tc
63f0: 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69  l_SetObjResult(i
6400: 6e 74 65 72 70 2c 20 54 63 6c 5f 4f 62 6a 50 72  nterp, Tcl_ObjPr
6410: 69 6e 74 66 28 22 62 61 64 20 6c 65 76 65 6c 20  intf("bad level 
6420: 5c 22 25 73 5c 22 22 2c 20 6e 61 6d 65 29 29 3b  \"%s\"", name));
6430: 0a 20 20 20 20 54 63 6c 5f 53 65 74 45 72 72 6f  .    Tcl_SetErro
6440: 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54  rCode(interp, "T
6450: 43 4c 22 2c 20 22 4c 4f 4f 4b 55 50 22 2c 20 22  CL", "LOOKUP", "
6460: 4c 45 56 45 4c 22 2c 20 6e 61 6d 65 2c 20 28 63  LEVEL", name, (c
6470: 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 20 20 20  har *)NULL);.   
6480: 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0c 0a   return -1;.}...
6490: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  /*. *-----------
64a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
64b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
64c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
64d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20  -----------. *. 
64e0: 2a 20 54 63 6c 5f 55 70 6c 65 76 65 6c 4f 62 6a  * Tcl_UplevelObj
64f0: 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69  Cmd --. *. *.Thi
6500: 73 20 6f 62 6a 65 63 74 20 66 75 6e 63 74 69 6f  s object functio
6510: 6e 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f 20  n is invoked to 
6520: 70 72 6f 63 65 73 73 20 74 68 65 20 22 75 70 6c  process the "upl
6530: 65 76 65 6c 22 20 54 63 6c 20 63 6f 6d 6d 61 6e  evel" Tcl comman
6540: 64 2e 0a 20 2a 09 53 65 65 20 74 68 65 20 75 73  d.. *.See the us
6550: 65 72 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f 6e  er documentation
6560: 20 66 6f 72 20 64 65 74 61 69 6c 73 20 6f 6e 20   for details on 
6570: 77 68 61 74 20 69 74 20 64 6f 65 73 2e 0a 20 2a  what it does.. *
6580: 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09  . * Results:. *.
6590: 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 6f  A standard Tcl o
65a0: 62 6a 65 63 74 20 72 65 73 75 6c 74 20 76 61 6c  bject result val
65b0: 75 65 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65  ue.. *. * Side e
65c0: 66 66 65 63 74 73 3a 0a 20 2a 09 53 65 65 20 74  ffects:. *.See t
65d0: 68 65 20 75 73 65 72 20 64 6f 63 75 6d 65 6e 74  he user document
65e0: 61 74 69 6f 6e 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d  ation.. *. *----
65f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6600: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6610: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6620: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6630: 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20 69  --. */..static i
6640: 6e 74 0a 55 70 6c 65 76 65 6c 5f 43 61 6c 6c 62  nt.Uplevel_Callb
6650: 61 63 6b 28 0a 20 20 20 20 43 6c 69 65 6e 74 44  ack(.    ClientD
6660: 61 74 61 20 64 61 74 61 5b 5d 2c 0a 20 20 20 20  ata data[],.    
6670: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65  Tcl_Interp *inte
6680: 72 70 2c 0a 20 20 20 20 69 6e 74 20 72 65 73 75  rp,.    int resu
6690: 6c 74 29 0a 7b 0a 20 20 20 20 43 61 6c 6c 46 72  lt).{.    CallFr
66a0: 61 6d 65 20 2a 73 61 76 65 64 56 61 72 46 72 61  ame *savedVarFra
66b0: 6d 65 50 74 72 20 3d 20 28 43 61 6c 6c 46 72 61  mePtr = (CallFra
66c0: 6d 65 20 2a 29 64 61 74 61 5b 30 5d 3b 0a 0a 20  me *)data[0];.. 
66d0: 20 20 20 69 66 20 28 72 65 73 75 6c 74 20 3d 3d     if (result ==
66e0: 20 54 43 4c 5f 45 52 52 4f 52 29 20 7b 0a 09 54   TCL_ERROR) {..T
66f0: 63 6c 5f 41 70 70 65 6e 64 4f 62 6a 54 6f 45 72  cl_AppendObjToEr
6700: 72 6f 72 49 6e 66 6f 28 69 6e 74 65 72 70 2c 20  rorInfo(interp, 
6710: 54 63 6c 5f 4f 62 6a 50 72 69 6e 74 66 28 0a 09  Tcl_ObjPrintf(..
6720: 09 22 5c 6e 20 20 20 20 28 5c 22 75 70 6c 65 76  ."\n    (\"uplev
6730: 65 6c 5c 22 20 62 6f 64 79 20 6c 69 6e 65 20 25  el\" body line %
6740: 64 29 22 2c 20 54 63 6c 5f 47 65 74 45 72 72 6f  d)", Tcl_GetErro
6750: 72 4c 69 6e 65 28 69 6e 74 65 72 70 29 29 29 3b  rLine(interp)));
6760: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20  .    }..    /*. 
6770: 20 20 20 20 2a 20 52 65 73 74 6f 72 65 20 74 68      * Restore th
6780: 65 20 76 61 72 69 61 62 6c 65 20 66 72 61 6d 65  e variable frame
6790: 2c 20 61 6e 64 20 72 65 74 75 72 6e 2e 0a 20 20  , and return..  
67a0: 20 20 20 2a 2f 0a 0a 20 20 20 20 28 28 49 6e 74     */..    ((Int
67b0: 65 72 70 20 2a 29 69 6e 74 65 72 70 29 2d 3e 76  erp *)interp)->v
67c0: 61 72 46 72 61 6d 65 50 74 72 20 3d 20 73 61 76  arFramePtr = sav
67d0: 65 64 56 61 72 46 72 61 6d 65 50 74 72 3b 0a 20  edVarFramePtr;. 
67e0: 20 20 20 72 65 74 75 72 6e 20 72 65 73 75 6c 74     return result
67f0: 3b 0a 7d 0a 0a 69 6e 74 0a 54 63 6c 5f 55 70 6c  ;.}..int.Tcl_Upl
6800: 65 76 65 6c 4f 62 6a 43 6d 64 28 0a 20 20 20 20  evelObjCmd(.    
6810: 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e  ClientData clien
6820: 74 44 61 74 61 2c 0a 20 20 20 20 54 63 6c 5f 49  tData,.    Tcl_I
6830: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 09 09  nterp *interp,..
6840: 2f 2a 20 43 75 72 72 65 6e 74 20 69 6e 74 65 72  /* Current inter
6850: 70 72 65 74 65 72 2e 20 2a 2f 0a 20 20 20 20 69  preter. */.    i
6860: 6e 74 20 6f 62 6a 63 2c 09 09 09 2f 2a 20 4e 75  nt objc,.../* Nu
6870: 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
6880: 73 2e 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62  s. */.    Tcl_Ob
6890: 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29  j *const objv[])
68a0: 09 2f 2a 20 41 72 67 75 6d 65 6e 74 20 6f 62 6a  ./* Argument obj
68b0: 65 63 74 73 2e 20 2a 2f 0a 7b 0a 20 20 20 20 72  ects. */.{.    r
68c0: 65 74 75 72 6e 20 54 63 6c 5f 4e 52 43 61 6c 6c  eturn Tcl_NRCall
68d0: 4f 62 6a 50 72 6f 63 28 69 6e 74 65 72 70 2c 20  ObjProc(interp, 
68e0: 54 63 6c 4e 52 55 70 6c 65 76 65 6c 4f 62 6a 43  TclNRUplevelObjC
68f0: 6d 64 2c 20 63 6c 69 65 6e 74 44 61 74 61 2c 20  md, clientData, 
6900: 6f 62 6a 63 2c 20 6f 62 6a 76 29 3b 0a 7d 0a 0a  objc, objv);.}..
6910: 69 6e 74 0a 54 63 6c 4e 52 55 70 6c 65 76 65 6c  int.TclNRUplevel
6920: 4f 62 6a 43 6d 64 28 0a 20 20 20 20 43 6c 69 65  ObjCmd(.    Clie
6930: 6e 74 44 61 74 61 20 64 75 6d 6d 79 2c 09 09 2f  ntData dummy,../
6940: 2a 20 4e 6f 74 20 75 73 65 64 2e 20 2a 2f 0a 20  * Not used. */. 
6950: 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69     Tcl_Interp *i
6960: 6e 74 65 72 70 2c 09 09 2f 2a 20 43 75 72 72 65  nterp,../* Curre
6970: 6e 74 20 69 6e 74 65 72 70 72 65 74 65 72 2e 20  nt interpreter. 
6980: 2a 2f 0a 20 20 20 20 69 6e 74 20 6f 62 6a 63 2c  */.    int objc,
6990: 09 09 09 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20  .../* Number of 
69a0: 61 72 67 75 6d 65 6e 74 73 2e 20 2a 2f 0a 20 20  arguments. */.  
69b0: 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74    Tcl_Obj *const
69c0: 20 6f 62 6a 76 5b 5d 29 09 2f 2a 20 41 72 67 75   objv[])./* Argu
69d0: 6d 65 6e 74 20 6f 62 6a 65 63 74 73 2e 20 2a 2f  ment objects. */
69e0: 0a 7b 0a 0a 20 20 20 20 49 6e 74 65 72 70 20 2a  .{..    Interp *
69f0: 69 50 74 72 20 3d 20 28 49 6e 74 65 72 70 20 2a  iPtr = (Interp *
6a00: 29 20 69 6e 74 65 72 70 3b 0a 20 20 20 20 43 6d  ) interp;.    Cm
6a10: 64 46 72 61 6d 65 20 2a 69 6e 76 6f 6b 65 72 20  dFrame *invoker 
6a20: 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 69 6e 74 20  = NULL;.    int 
6a30: 77 6f 72 64 20 3d 20 30 3b 0a 20 20 20 20 69 6e  word = 0;.    in
6a40: 74 20 72 65 73 75 6c 74 3b 0a 20 20 20 20 43 61  t result;.    Ca
6a50: 6c 6c 46 72 61 6d 65 20 2a 73 61 76 65 64 56 61  llFrame *savedVa
6a60: 72 46 72 61 6d 65 50 74 72 2c 20 2a 66 72 61 6d  rFramePtr, *fram
6a70: 65 50 74 72 3b 0a 20 20 20 20 54 63 6c 5f 4f 62  ePtr;.    Tcl_Ob
6a80: 6a 20 2a 6f 62 6a 50 74 72 3b 0a 0a 20 20 20 20  j *objPtr;..    
6a90: 69 66 20 28 6f 62 6a 63 20 3c 20 32 29 20 7b 0a  if (objc < 2) {.
6aa0: 20 20 20 20 2f 2a 20 74 6f 20 64 6f 0a 20 20 20      /* to do.   
6ab0: 20 2a 20 20 20 20 73 69 6d 70 6c 69 66 79 20 74   *    simplify t
6ac0: 68 69 6e 67 73 20 62 79 20 69 6e 74 65 72 70 72  hings by interpr
6ad0: 65 74 69 6e 67 20 74 68 65 20 61 72 67 75 6d 65  eting the argume
6ae0: 6e 74 20 61 73 20 61 20 63 6f 6d 6d 61 6e 64 20  nt as a command 
6af0: 77 68 65 6e 20 74 68 65 72 65 0a 20 20 20 20 2a  when there.    *
6b00: 20 20 20 20 69 73 20 6f 6e 6c 79 20 6f 6e 65 20      is only one 
6b10: 61 72 67 75 6d 65 6e 74 2e 20 20 54 68 69 73 20  argument.  This 
6b20: 72 65 71 75 69 72 65 73 20 61 20 54 49 50 20 73  requires a TIP s
6b30: 69 6e 63 65 20 63 75 72 72 65 6e 74 6c 79 20 61  ince currently a
6b40: 20 73 69 6e 67 6c 65 0a 20 20 20 20 2a 20 20 20   single.    *   
6b50: 20 61 72 67 75 6d 65 6e 74 20 69 73 20 69 6e 74   argument is int
6b60: 65 72 70 72 65 74 65 64 20 61 73 20 61 20 6c 65  erpreted as a le
6b70: 76 65 6c 20 69 6e 64 69 63 61 74 6f 72 20 69 66  vel indicator if
6b80: 20 70 6f 73 73 69 62 6c 65 2e 0a 20 20 20 20 2a   possible..    *
6b90: 2f 0a 20 20 20 20 75 70 6c 65 76 65 6c 53 79 6e  /.    uplevelSyn
6ba0: 74 61 78 3a 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e  tax:..Tcl_WrongN
6bb0: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31  umArgs(interp, 1
6bc0: 2c 20 6f 62 6a 76 2c 20 22 3f 6c 65 76 65 6c 3f  , objv, "?level?
6bd0: 20 63 6f 6d 6d 61 6e 64 20 3f 61 72 67 20 2e 2e   command ?arg ..
6be0: 2e 3f 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43  .?");..return TC
6bf0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 20 65  L_ERROR;.    } e
6c00: 6c 73 65 20 69 66 20 28 21 54 63 6c 48 61 73 53  lse if (!TclHasS
6c10: 74 72 69 6e 67 52 65 70 28 6f 62 6a 76 5b 31 5d  tringRep(objv[1]
6c20: 29 20 26 26 20 6f 62 6a 63 20 3d 3d 20 32 29 20  ) && objc == 2) 
6c30: 7b 0a 09 69 6e 74 20 73 74 61 74 75 73 20 2c 6c  {..int status ,l
6c40: 6c 65 6e 67 74 68 3b 0a 09 73 74 61 74 75 73 20  length;..status 
6c50: 3d 20 54 63 6c 4c 69 73 74 4f 62 6a 4c 65 6e 67  = TclListObjLeng
6c60: 74 68 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b  th(interp, objv[
6c70: 31 5d 2c 20 26 6c 6c 65 6e 67 74 68 29 3b 0a 09  1], &llength);..
6c80: 69 66 20 28 73 74 61 74 75 73 20 3d 3d 20 54 43  if (status == TC
6c90: 4c 5f 4f 4b 20 26 26 20 6c 6c 65 6e 67 74 68 20  L_OK && llength 
6ca0: 3e 20 31 29 20 7b 0a 09 20 20 20 20 2f 2a 20 74  > 1) {..    /* t
6cb0: 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  he first argumen
6cc0: 74 20 63 61 6e 27 74 20 69 6e 74 65 72 70 72 65  t can't interpre
6cd0: 74 65 64 20 61 73 20 61 20 6c 65 76 65 6c 2e 20  ted as a level. 
6ce0: 41 76 6f 69 64 0a 09 20 20 20 20 20 2a 20 67 65  Avoid..     * ge
6cf0: 6e 65 72 61 74 69 6e 67 20 61 20 73 74 72 69 6e  nerating a strin
6d00: 67 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e  g representation
6d10: 20 6f 66 20 74 68 65 20 73 63 72 69 70 74 2e 20   of the script. 
6d20: 2a 2f 0a 09 20 20 20 20 72 65 73 75 6c 74 20 3d  */..    result =
6d30: 20 54 63 6c 47 65 74 46 72 61 6d 65 28 69 6e 74   TclGetFrame(int
6d40: 65 72 70 2c 20 22 31 22 2c 20 26 66 72 61 6d 65  erp, "1", &frame
6d50: 50 74 72 29 3b 0a 09 20 20 20 20 69 66 20 28 72  Ptr);..    if (r
6d60: 65 73 75 6c 74 20 3d 3d 20 2d 31 29 20 7b 0a 09  esult == -1) {..
6d70: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f  .return TCL_ERRO
6d80: 52 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 6f  R;..    }..    o
6d90: 62 6a 63 20 2d 3d 20 31 3b 0a 09 20 20 20 20 6f  bjc -= 1;..    o
6da0: 62 6a 76 20 2b 3d 20 31 3b 0a 09 20 20 20 20 67  bjv += 1;..    g
6db0: 6f 74 6f 20 68 61 76 65 6c 65 76 65 6c 3b 0a 09  oto havelevel;..
6dc0: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a  }.    }..    /*.
6dd0: 20 20 20 20 20 2a 20 46 69 6e 64 20 74 68 65 20       * Find the 
6de0: 6c 65 76 65 6c 20 74 6f 20 75 73 65 20 66 6f 72  level to use for
6df0: 20 65 78 65 63 75 74 69 6e 67 20 74 68 65 20 63   executing the c
6e00: 6f 6d 6d 61 6e 64 2e 0a 20 20 20 20 20 2a 2f 0a  ommand..     */.
6e10: 0a 20 20 20 20 72 65 73 75 6c 74 20 3d 20 54 63  .    result = Tc
6e20: 6c 4f 62 6a 47 65 74 46 72 61 6d 65 28 69 6e 74  lObjGetFrame(int
6e30: 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 26 66  erp, objv[1], &f
6e40: 72 61 6d 65 50 74 72 29 3b 0a 20 20 20 20 69 66  ramePtr);.    if
6e50: 20 28 72 65 73 75 6c 74 20 3d 3d 20 2d 31 29 20   (result == -1) 
6e60: 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  {..return TCL_ER
6e70: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6f  ROR;.    }.    o
6e80: 62 6a 63 20 2d 3d 20 72 65 73 75 6c 74 20 2b 20  bjc -= result + 
6e90: 31 3b 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20  1;.    if (objc 
6ea0: 3d 3d 20 30 29 20 7b 0a 09 67 6f 74 6f 20 75 70  == 0) {..goto up
6eb0: 6c 65 76 65 6c 53 79 6e 74 61 78 3b 0a 20 20 20  levelSyntax;.   
6ec0: 20 7d 0a 20 20 20 20 6f 62 6a 76 20 2b 3d 20 72   }.    objv += r
6ed0: 65 73 75 6c 74 20 2b 20 31 3b 0a 0a 20 20 20 20  esult + 1;..    
6ee0: 68 61 76 65 6c 65 76 65 6c 3a 0a 0a 20 20 20 20  havelevel:..    
6ef0: 2f 2a 0a 20 20 20 20 20 2a 20 4d 6f 64 69 66 79  /*.     * Modify
6f00: 20 74 68 65 20 69 6e 74 65 72 70 72 65 74 65 72   the interpreter
6f10: 20 73 74 61 74 65 20 74 6f 20 65 78 65 63 75 74   state to execut
6f20: 65 20 69 6e 20 74 68 65 20 67 69 76 65 6e 20 66  e in the given f
6f30: 72 61 6d 65 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20  rame..     */.. 
6f40: 20 20 20 73 61 76 65 64 56 61 72 46 72 61 6d 65     savedVarFrame
6f50: 50 74 72 20 3d 20 69 50 74 72 2d 3e 76 61 72 46  Ptr = iPtr->varF
6f60: 72 61 6d 65 50 74 72 3b 0a 20 20 20 20 69 50 74  ramePtr;.    iPt
6f70: 72 2d 3e 76 61 72 46 72 61 6d 65 50 74 72 20 3d  r->varFramePtr =
6f80: 20 66 72 61 6d 65 50 74 72 3b 0a 0a 20 20 20 20   framePtr;..    
6f90: 2f 2a 0a 20 20 20 20 20 2a 20 45 78 65 63 75 74  /*.     * Execut
6fa0: 65 20 74 68 65 20 72 65 73 69 64 75 61 6c 20 61  e the residual a
6fb0: 72 67 75 6d 65 6e 74 73 20 61 73 20 61 20 63 6f  rguments as a co
6fc0: 6d 6d 61 6e 64 2e 0a 20 20 20 20 20 2a 2f 0a 0a  mmand..     */..
6fd0: 20 20 20 20 69 66 20 28 6f 62 6a 63 20 3d 3d 20      if (objc == 
6fe0: 31 29 20 7b 0a 09 2f 2a 0a 09 20 2a 20 54 49 50  1) {../*.. * TIP
6ff0: 20 23 32 38 30 2e 20 4d 61 6b 65 20 61 63 74 75   #280. Make actu
7000: 61 6c 20 61 72 67 75 6d 65 6e 74 20 6c 6f 63 61  al argument loca
7010: 74 69 6f 6e 20 61 76 61 69 6c 61 62 6c 65 20 74  tion available t
7020: 6f 20 65 76 61 6c 27 64 20 73 63 72 69 70 74 0a  o eval'd script.
7030: 09 20 2a 2f 0a 0a 09 54 63 6c 41 72 67 75 6d 65  . */...TclArgume
7040: 6e 74 47 65 74 28 69 6e 74 65 72 70 2c 20 6f 62  ntGet(interp, ob
7050: 6a 76 5b 30 5d 2c 20 26 69 6e 76 6f 6b 65 72 2c  jv[0], &invoker,
7060: 20 26 77 6f 72 64 29 3b 0a 09 6f 62 6a 50 74 72   &word);..objPtr
7070: 20 3d 20 6f 62 6a 76 5b 30 5d 3b 0a 0a 20 20 20   = objv[0];..   
7080: 20 7d 20 65 6c 73 65 20 7b 0a 09 2f 2a 0a 09 20   } else {../*.. 
7090: 2a 20 4d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20  * More than one 
70a0: 61 72 67 75 6d 65 6e 74 3a 20 63 6f 6e 63 61 74  argument: concat
70b0: 65 6e 61 74 65 20 74 68 65 6d 20 74 6f 67 65 74  enate them toget
70c0: 68 65 72 20 77 69 74 68 20 73 70 61 63 65 73 0a  her with spaces.
70d0: 09 20 2a 20 62 65 74 77 65 65 6e 2c 20 74 68 65  . * between, the
70e0: 6e 20 65 76 61 6c 75 61 74 65 20 74 68 65 20 72  n evaluate the r
70f0: 65 73 75 6c 74 2e 20 54 63 6c 5f 45 76 61 6c 4f  esult. Tcl_EvalO
7100: 62 6a 45 78 20 77 69 6c 6c 20 64 65 6c 65 74 65  bjEx will delete
7110: 20 74 68 65 0a 09 20 2a 20 6f 62 6a 65 63 74 20   the.. * object 
7120: 77 68 65 6e 20 69 74 20 64 65 63 72 65 6d 65 6e  when it decremen
7130: 74 73 20 69 74 73 20 72 65 66 63 6f 75 6e 74 20  ts its refcount 
7140: 61 66 74 65 72 20 65 76 61 6c 27 69 6e 67 20 69  after eval'ing i
7150: 74 2e 0a 09 20 2a 2f 0a 0a 09 6f 62 6a 50 74 72  t... */...objPtr
7160: 20 3d 20 54 63 6c 5f 43 6f 6e 63 61 74 4f 62 6a   = Tcl_ConcatObj
7170: 28 6f 62 6a 63 2c 20 6f 62 6a 76 29 3b 0a 20 20  (objc, objv);.  
7180: 20 20 7d 0a 0a 20 20 20 20 54 63 6c 4e 52 41 64    }..    TclNRAd
7190: 64 43 61 6c 6c 62 61 63 6b 28 69 6e 74 65 72 70  dCallback(interp
71a0: 2c 20 55 70 6c 65 76 65 6c 5f 43 61 6c 6c 62 61  , Uplevel_Callba
71b0: 63 6b 2c 20 73 61 76 65 64 56 61 72 46 72 61 6d  ck, savedVarFram
71c0: 65 50 74 72 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c  ePtr, NULL, NULL
71d0: 2c 0a 09 20 20 20 20 4e 55 4c 4c 29 3b 0a 20 20  ,..    NULL);.  
71e0: 20 20 72 65 74 75 72 6e 20 54 63 6c 4e 52 45 76    return TclNREv
71f0: 61 6c 4f 62 6a 45 78 28 69 6e 74 65 72 70 2c 20  alObjEx(interp, 
7200: 6f 62 6a 50 74 72 2c 20 30 2c 20 69 6e 76 6f 6b  objPtr, 0, invok
7210: 65 72 2c 20 77 6f 72 64 29 3b 0a 7d 0a 0c 0a 2f  er, word);.}.../
7220: 2a 0a 20 2a 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 2d 2d 2d  ----------------
7250: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7260: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a  ----------. *. *
7270: 20 54 63 6c 46 69 6e 64 50 72 6f 63 20 2d 2d 0a   TclFindProc --.
7280: 20 2a 0a 20 2a 09 47 69 76 65 6e 20 74 68 65 20   *. *.Given the 
7290: 6e 61 6d 65 20 6f 66 20 61 20 70 72 6f 63 65 64  name of a proced
72a0: 75 72 65 2c 20 72 65 74 75 72 6e 20 61 20 70 6f  ure, return a po
72b0: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 72 65 63  inter to the rec
72c0: 6f 72 64 0a 20 2a 09 64 65 73 63 72 69 62 69 6e  ord. *.describin
72d0: 67 20 74 68 65 20 70 72 6f 63 65 64 75 72 65 2e  g the procedure.
72e0: 20 54 68 65 20 70 72 6f 63 65 64 75 72 65 20 77   The procedure w
72f0: 69 6c 6c 20 62 65 20 6c 6f 6f 6b 65 64 20 75 70  ill be looked up
7300: 20 75 73 69 6e 67 20 74 68 65 0a 20 2a 09 75 73   using the. *.us
7310: 75 61 6c 20 72 75 6c 65 73 3a 20 66 69 72 73 74  ual rules: first
7320: 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   in the current 
7330: 6e 61 6d 65 73 70 61 63 65 20 61 6e 64 20 74 68  namespace and th
7340: 65 6e 20 69 6e 20 74 68 65 20 67 6c 6f 62 61 6c  en in the global
7350: 0a 20 2a 09 6e 61 6d 65 73 70 61 63 65 2e 0a 20  . *.namespace.. 
7360: 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a  *. * Results:. *
7370: 09 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65  .NULL is returne
7380: 64 20 69 66 20 74 68 65 20 6e 61 6d 65 20 64 6f  d if the name do
7390: 65 73 6e 27 74 20 63 6f 72 72 65 73 70 6f 6e 64  esn't correspond
73a0: 20 74 6f 20 61 6e 79 20 70 72 6f 63 65 64 75 72   to any procedur
73b0: 65 2e 0a 20 2a 09 4f 74 68 65 72 77 69 73 65 2c  e.. *.Otherwise,
73c0: 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   the return valu
73d0: 65 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  e is a pointer t
73e0: 6f 20 74 68 65 20 70 72 6f 63 65 64 75 72 65 27  o the procedure'
73f0: 73 20 72 65 63 6f 72 64 2e 20 49 66 0a 20 2a 09  s record. If. *.
7400: 74 68 65 20 6e 61 6d 65 20 69 73 20 66 6f 75 6e  the name is foun
7410: 64 20 62 75 74 20 72 65 66 65 72 73 20 74 6f 20  d but refers to 
7420: 61 6e 20 69 6d 70 6f 72 74 65 64 20 63 6f 6d 6d  an imported comm
7430: 61 6e 64 20 74 68 61 74 20 70 6f 69 6e 74 73 20  and that points 
7440: 74 6f 20 61 0a 20 2a 09 22 72 65 61 6c 22 20 70  to a. *."real" p
7450: 72 6f 63 65 64 75 72 65 20 64 65 66 69 6e 65 64  rocedure defined
7460: 20 69 6e 20 61 6e 6f 74 68 65 72 20 6e 61 6d 65   in another name
7470: 73 70 61 63 65 2c 20 61 20 70 6f 69 6e 74 65 72  space, a pointer
7480: 20 74 6f 20 74 68 61 74 0a 20 2a 09 22 72 65 61   to that. *."rea
7490: 6c 22 20 70 72 6f 63 65 64 75 72 65 27 73 20 73  l" procedure's s
74a0: 74 72 75 63 74 75 72 65 20 69 73 20 72 65 74 75  tructure is retu
74b0: 72 6e 65 64 2e 0a 20 2a 0a 20 2a 20 53 69 64 65  rned.. *. * Side
74c0: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e   effects:. *.Non
74d0: 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  e.. *. *--------
74e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
74f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7500: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7510: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
7520: 2a 2f 0a 0a 50 72 6f 63 20 2a 0a 54 63 6c 46 69  */..Proc *.TclFi
7530: 6e 64 50 72 6f 63 28 0a 20 20 20 20 49 6e 74 65  ndProc(.    Inte
7540: 72 70 20 2a 69 50 74 72 2c 09 09 2f 2a 20 49 6e  rp *iPtr,../* In
7550: 74 65 72 70 72 65 74 65 72 20 69 6e 20 77 68 69  terpreter in whi
7560: 63 68 20 74 6f 20 6c 6f 6f 6b 2e 20 2a 2f 0a 20  ch to look. */. 
7570: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70     const char *p
7580: 72 6f 63 4e 61 6d 65 29 09 2f 2a 20 4e 61 6d 65  rocName)./* Name
7590: 20 6f 66 20 64 65 73 69 72 65 64 20 70 72 6f 63   of desired proc
75a0: 65 64 75 72 65 2e 20 2a 2f 0a 7b 0a 20 20 20 20  edure. */.{.    
75b0: 54 63 6c 5f 43 6f 6d 6d 61 6e 64 20 63 6d 64 3b  Tcl_Command cmd;
75c0: 0a 20 20 20 20 43 6f 6d 6d 61 6e 64 20 2a 63 6d  .    Command *cm
75d0: 64 50 74 72 3b 0a 0a 20 20 20 20 63 6d 64 20 3d  dPtr;..    cmd =
75e0: 20 54 63 6c 5f 46 69 6e 64 43 6f 6d 6d 61 6e 64   Tcl_FindCommand
75f0: 28 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 29 20  ((Tcl_Interp *) 
7600: 69 50 74 72 2c 20 70 72 6f 63 4e 61 6d 65 2c 20  iPtr, procName, 
7610: 4e 55 4c 4c 2c 20 2f 2a 66 6c 61 67 73 2a 2f 20  NULL, /*flags*/ 
7620: 30 29 3b 0a 20 20 20 20 69 66 20 28 63 6d 64 20  0);.    if (cmd 
7630: 3d 3d 20 28 54 63 6c 5f 43 6f 6d 6d 61 6e 64 29  == (Tcl_Command)
7640: 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e   NULL) {..return
7650: 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20   NULL;.    }.   
7660: 20 63 6d 64 50 74 72 20 3d 20 28 43 6f 6d 6d 61   cmdPtr = (Comma
7670: 6e 64 20 2a 29 20 63 6d 64 3b 0a 0a 20 20 20 20  nd *) cmd;..    
7680: 72 65 74 75 72 6e 20 54 63 6c 49 73 50 72 6f 63  return TclIsProc
7690: 28 63 6d 64 50 74 72 29 3b 0a 7d 0a 0c 0a 2f 2a  (cmdPtr);.}.../*
76a0: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
76b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
76c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
76d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
76e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20  ---------. *. * 
76f0: 54 63 6c 49 73 50 72 6f 63 20 2d 2d 0a 20 2a 0a  TclIsProc --. *.
7700: 20 2a 09 54 65 6c 6c 73 20 77 68 65 74 68 65 72   *.Tells whether
7710: 20 61 20 63 6f 6d 6d 61 6e 64 20 69 73 20 61 20   a command is a 
7720: 54 63 6c 20 70 72 6f 63 65 64 75 72 65 20 6f 72  Tcl procedure or
7730: 20 6e 6f 74 2e 0a 20 2a 0a 20 2a 20 52 65 73 75   not.. *. * Resu
7740: 6c 74 73 3a 0a 20 2a 09 49 66 20 74 68 65 20 67  lts:. *.If the g
7750: 69 76 65 6e 20 63 6f 6d 6d 61 6e 64 20 69 73 20  iven command is 
7760: 61 63 74 75 61 6c 6c 79 20 61 20 54 63 6c 20 70  actually a Tcl p
7770: 72 6f 63 65 64 75 72 65 2c 20 74 68 65 20 72 65  rocedure, the re
7780: 74 75 72 6e 20 76 61 6c 75 65 20 69 73 0a 20 2a  turn value is. *
7790: 09 74 68 65 20 61 64 64 72 65 73 73 20 6f 66 20  .the address of 
77a0: 74 68 65 20 72 65 63 6f 72 64 20 64 65 73 63 72  the record descr
77b0: 69 62 69 6e 67 20 74 68 65 20 70 72 6f 63 65 64  ibing the proced
77c0: 75 72 65 2e 20 4f 74 68 65 72 77 69 73 65 20 74  ure. Otherwise t
77d0: 68 65 0a 20 2a 09 72 65 74 75 72 6e 20 76 61 6c  he. *.return val
77e0: 75 65 20 69 73 20 30 2e 0a 20 2a 0a 20 2a 20 53  ue is 0.. *. * S
77f0: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09  ide effects:. *.
7800: 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d  None.. *. *-----
7810: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7820: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7830: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7840: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
7850: 2d 0a 20 2a 2f 0a 0a 50 72 6f 63 20 2a 0a 54 63  -. */..Proc *.Tc
7860: 6c 49 73 50 72 6f 63 28 0a 20 20 20 20 43 6f 6d  lIsProc(.    Com
7870: 6d 61 6e 64 20 2a 63 6d 64 50 74 72 29 09 09 2f  mand *cmdPtr)../
7880: 2a 20 43 6f 6d 6d 61 6e 64 20 74 6f 20 74 65 73  * Command to tes
7890: 74 2e 20 2a 2f 0a 7b 0a 20 20 20 20 54 63 6c 5f  t. */.{.    Tcl_
78a0: 43 6f 6d 6d 61 6e 64 20 6f 72 69 67 43 6d 64 20  Command origCmd 
78b0: 3d 20 54 63 6c 47 65 74 4f 72 69 67 69 6e 61 6c  = TclGetOriginal
78c0: 43 6f 6d 6d 61 6e 64 28 28 54 63 6c 5f 43 6f 6d  Command((Tcl_Com
78d0: 6d 61 6e 64 29 20 63 6d 64 50 74 72 29 3b 0a 0a  mand) cmdPtr);..
78e0: 20 20 20 20 69 66 20 28 6f 72 69 67 43 6d 64 20      if (origCmd 
78f0: 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 63 6d 64 50  != NULL) {..cmdP
7900: 74 72 20 3d 20 28 43 6f 6d 6d 61 6e 64 20 2a 29  tr = (Command *)
7910: 20 6f 72 69 67 43 6d 64 3b 0a 20 20 20 20 7d 0a   origCmd;.    }.
7920: 20 20 20 20 69 66 20 28 63 6d 64 50 74 72 2d 3e      if (cmdPtr->
7930: 64 65 6c 65 74 65 50 72 6f 63 20 3d 3d 20 54 63  deleteProc == Tc
7940: 6c 50 72 6f 63 44 65 6c 65 74 65 50 72 6f 63 29  lProcDeleteProc)
7950: 20 7b 0a 09 72 65 74 75 72 6e 20 28 50 72 6f 63   {..return (Proc
7960: 20 2a 29 63 6d 64 50 74 72 2d 3e 6f 62 6a 43 6c   *)cmdPtr->objCl
7970: 69 65 6e 74 44 61 74 61 3b 0a 20 20 20 20 7d 0a  ientData;.    }.
7980: 20 20 20 20 72 65 74 75 72 6e 20 4e 55 4c 4c 3b      return NULL;
7990: 0a 7d 0a 0c 0a 73 74 61 74 69 63 20 69 6e 74 0a  .}...static int.
79a0: 50 72 6f 63 57 72 6f 6e 67 4e 75 6d 41 72 67 73  ProcWrongNumArgs
79b0: 28 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70  (.    Tcl_Interp
79c0: 20 2a 69 6e 74 65 72 70 2c 0a 20 20 20 20 69 6e   *interp,.    in
79d0: 74 20 73 6b 69 70 29 0a 7b 0a 20 20 20 20 43 61  t skip).{.    Ca
79e0: 6c 6c 46 72 61 6d 65 20 2a 66 72 61 6d 65 50 74  llFrame *framePt
79f0: 72 20 3d 20 28 28 49 6e 74 65 72 70 20 2a 29 69  r = ((Interp *)i
7a00: 6e 74 65 72 70 29 2d 3e 76 61 72 46 72 61 6d 65  nterp)->varFrame
7a10: 50 74 72 3b 0a 20 20 20 20 50 72 6f 63 20 2a 70  Ptr;.    Proc *p
7a20: 72 6f 63 50 74 72 20 3d 20 66 72 61 6d 65 50 74  rocPtr = framePt
7a30: 72 2d 3e 70 72 6f 63 50 74 72 3b 0a 20 20 20 20  r->procPtr;.    
7a40: 69 6e 74 20 6c 6f 63 61 6c 43 74 20 3d 20 70 72  int localCt = pr
7a50: 6f 63 50 74 72 2d 3e 6e 75 6d 43 6f 6d 70 69 6c  ocPtr->numCompil
7a60: 65 64 4c 6f 63 61 6c 73 2c 20 6e 75 6d 41 72 67  edLocals, numArg
7a70: 73 2c 20 69 3b 0a 20 20 20 20 54 63 6c 5f 4f 62  s, i;.    Tcl_Ob
7a80: 6a 20 2a 2a 64 65 73 69 72 65 64 4f 62 6a 73 3b  j **desiredObjs;
7a90: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
7aa0: 2a 66 69 6e 61 6c 20 3d 20 4e 55 4c 4c 3b 0a 0a  *final = NULL;..
7ab0: 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 42 75      /*.     * Bu
7ac0: 69 6c 64 20 75 70 20 64 65 73 69 72 65 64 20 61  ild up desired a
7ad0: 72 67 75 6d 65 6e 74 20 6c 69 73 74 20 66 6f 72  rgument list for
7ae0: 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
7af0: 73 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 6e  s.     */..    n
7b00: 75 6d 41 72 67 73 20 3d 20 66 72 61 6d 65 50 74  umArgs = framePt
7b10: 72 2d 3e 70 72 6f 63 50 74 72 2d 3e 6e 75 6d 41  r->procPtr->numA
7b20: 72 67 73 3b 0a 20 20 20 20 64 65 73 69 72 65 64  rgs;.    desired
7b30: 4f 62 6a 73 20 3d 20 28 54 63 6c 5f 4f 62 6a 20  Objs = (Tcl_Obj 
7b40: 2a 2a 29 54 63 6c 53 74 61 63 6b 41 6c 6c 6f 63  **)TclStackAlloc
7b50: 28 69 6e 74 65 72 70 2c 0a 09 20 20 20 20 73 69  (interp,..    si
7b60: 7a 65 6f 66 28 54 63 6c 5f 4f 62 6a 20 2a 29 20  zeof(Tcl_Obj *) 
7b70: 2a 20 28 6e 75 6d 41 72 67 73 2b 31 29 29 3b 0a  * (numArgs+1));.
7b80: 0a 20 20 20 20 69 66 20 28 66 72 61 6d 65 50 74  .    if (framePt
7b90: 72 2d 3e 69 73 50 72 6f 63 43 61 6c 6c 46 72 61  r->isProcCallFra
7ba0: 6d 65 20 26 20 46 52 41 4d 45 5f 49 53 5f 4c 41  me & FRAME_IS_LA
7bb0: 4d 42 44 41 29 20 7b 0a 09 64 65 73 69 72 65 64  MBDA) {..desired
7bc0: 4f 62 6a 73 5b 30 5d 20 3d 20 54 63 6c 5f 4e 65  Objs[0] = Tcl_Ne
7bd0: 77 53 74 72 69 6e 67 4f 62 6a 28 22 6c 61 6d 62  wStringObj("lamb
7be0: 64 61 45 78 70 72 22 2c 20 2d 31 29 3b 0a 20 20  daExpr", -1);.  
7bf0: 20 20 7d 20 65 6c 73 65 20 7b 0a 23 69 66 64 65    } else {.#ifde
7c00: 66 20 41 56 4f 49 44 5f 48 41 43 4b 53 5f 46 4f  f AVOID_HACKS_FO
7c10: 52 5f 49 54 43 4c 0a 09 64 65 73 69 72 65 64 4f  R_ITCL..desiredO
7c20: 62 6a 73 5b 30 5d 20 3d 20 66 72 61 6d 65 50 74  bjs[0] = framePt
7c30: 72 2d 3e 6f 62 6a 76 5b 73 6b 69 70 2d 31 5d 3b  r->objv[skip-1];
7c40: 0a 23 65 6c 73 65 0a 09 64 65 73 69 72 65 64 4f  .#else..desiredO
7c50: 62 6a 73 5b 30 5d 20 3d 20 54 63 6c 5f 4e 65 77  bjs[0] = Tcl_New
7c60: 4c 69 73 74 4f 62 6a 28 31 2c 20 66 72 61 6d 65  ListObj(1, frame
7c70: 50 74 72 2d 3e 6f 62 6a 76 20 2b 20 73 6b 69 70  Ptr->objv + skip
7c80: 20 2d 20 31 29 3b 0a 23 65 6e 64 69 66 20 2f 2a   - 1);.#endif /*
7c90: 20 41 56 4f 49 44 5f 48 41 43 4b 53 5f 46 4f 52   AVOID_HACKS_FOR
7ca0: 5f 49 54 43 4c 20 2a 2f 0a 20 20 20 20 7d 0a 20  _ITCL */.    }. 
7cb0: 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f     Tcl_IncrRefCo
7cc0: 75 6e 74 28 64 65 73 69 72 65 64 4f 62 6a 73 5b  unt(desiredObjs[
7cd0: 30 5d 29 3b 0a 0a 20 20 20 20 69 66 20 28 6c 6f  0]);..    if (lo
7ce0: 63 61 6c 43 74 20 3e 20 30 29 20 7b 0a 09 56 61  calCt > 0) {..Va
7cf0: 72 20 2a 64 65 66 50 74 72 20 3d 20 28 56 61 72  r *defPtr = (Var
7d00: 20 2a 29 28 26 66 72 61 6d 65 50 74 72 2d 3e 6c   *)(&framePtr->l
7d10: 6f 63 61 6c 43 61 63 68 65 50 74 72 2d 3e 76 61  ocalCachePtr->va
7d20: 72 4e 61 6d 65 30 20 2b 20 6c 6f 63 61 6c 43 74  rName0 + localCt
7d30: 29 3b 0a 0a 09 66 6f 72 20 28 69 3d 31 20 3b 20  );...for (i=1 ; 
7d40: 69 3c 3d 6e 75 6d 41 72 67 73 20 3b 20 69 2b 2b  i<=numArgs ; i++
7d50: 2c 20 64 65 66 50 74 72 2b 2b 29 20 7b 0a 09 20  , defPtr++) {.. 
7d60: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 61 72 67 4f     Tcl_Obj *argO
7d70: 62 6a 3b 0a 09 20 20 20 20 54 63 6c 5f 4f 62 6a  bj;..    Tcl_Obj
7d80: 20 2a 6e 61 6d 65 50 74 72 20 3d 20 6c 6f 63 61   *namePtr = loca
7d90: 6c 4e 61 6d 65 28 66 72 61 6d 65 50 74 72 2c 20  lName(framePtr, 
7da0: 69 2d 31 29 3b 0a 0a 09 20 20 20 20 69 66 20 28  i-1);...    if (
7db0: 64 65 66 50 74 72 2d 3e 76 61 6c 75 65 2e 6f 62  defPtr->value.ob
7dc0: 6a 50 74 72 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a  jPtr != NULL) {.
7dd0: 09 09 54 63 6c 4e 65 77 4f 62 6a 28 61 72 67 4f  ..TclNewObj(argO
7de0: 62 6a 29 3b 0a 09 09 54 63 6c 5f 41 70 70 65 6e  bj);...Tcl_Appen
7df0: 64 53 74 72 69 6e 67 73 54 6f 4f 62 6a 28 61 72  dStringsToObj(ar
7e00: 67 4f 62 6a 2c 20 22 3f 22 2c 20 54 63 6c 47 65  gObj, "?", TclGe
7e10: 74 53 74 72 69 6e 67 28 6e 61 6d 65 50 74 72 29  tString(namePtr)
7e20: 2c 20 22 3f 22 2c 20 28 63 68 61 72 20 2a 29 4e  , "?", (char *)N
7e30: 55 4c 4c 29 3b 0a 09 20 20 20 20 7d 20 65 6c 73  ULL);..    } els
7e40: 65 20 69 66 20 28 64 65 66 50 74 72 2d 3e 66 6c  e if (defPtr->fl
7e50: 61 67 73 20 26 20 56 41 52 5f 49 53 5f 41 52 47  ags & VAR_IS_ARG
7e60: 53 29 20 7b 0a 09 09 6e 75 6d 41 72 67 73 2d 2d  S) {...numArgs--
7e70: 3b 0a 09 09 66 69 6e 61 6c 20 3d 20 22 3f 61 72  ;...final = "?ar
7e80: 67 20 2e 2e 2e 3f 22 3b 0a 09 09 62 72 65 61 6b  g ...?";...break
7e90: 3b 0a 09 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  ;..    } else {.
7ea0: 09 09 61 72 67 4f 62 6a 20 3d 20 6e 61 6d 65 50  ..argObj = nameP
7eb0: 74 72 3b 0a 09 09 54 63 6c 5f 49 6e 63 72 52 65  tr;...Tcl_IncrRe
7ec0: 66 43 6f 75 6e 74 28 6e 61 6d 65 50 74 72 29 3b  fCount(namePtr);
7ed0: 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 64 65 73  ..    }..    des
7ee0: 69 72 65 64 4f 62 6a 73 5b 69 5d 20 3d 20 61 72  iredObjs[i] = ar
7ef0: 67 4f 62 6a 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a  gObj;..}.    }..
7f00: 20 20 20 20 54 63 6c 5f 52 65 73 65 74 52 65 73      Tcl_ResetRes
7f10: 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20  ult(interp);.   
7f20: 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67   Tcl_WrongNumArg
7f30: 73 28 69 6e 74 65 72 70 2c 20 6e 75 6d 41 72 67  s(interp, numArg
7f40: 73 2b 31 2c 20 64 65 73 69 72 65 64 4f 62 6a 73  s+1, desiredObjs
7f50: 2c 20 66 69 6e 61 6c 29 3b 0a 0a 20 20 20 20 66  , final);..    f
7f60: 6f 72 20 28 69 3d 30 20 3b 20 69 3c 3d 6e 75 6d  or (i=0 ; i<=num
7f70: 41 72 67 73 20 3b 20 69 2b 2b 29 20 7b 0a 09 54  Args ; i++) {..T
7f80: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
7f90: 64 65 73 69 72 65 64 4f 62 6a 73 5b 69 5d 29 3b  desiredObjs[i]);
7fa0: 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 53 74  .    }.    TclSt
7fb0: 61 63 6b 46 72 65 65 28 69 6e 74 65 72 70 2c 20  ackFree(interp, 
7fc0: 64 65 73 69 72 65 64 4f 62 6a 73 29 3b 0a 20 20  desiredObjs);.  
7fd0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52    return TCL_ERR
7fe0: 4f 52 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d  OR;.}.../*. *---
7ff0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8000: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8010: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8030: 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 63 6c 49 6e 69  ---. *. * TclIni
8040: 74 43 6f 6d 70 69 6c 65 64 4c 6f 63 61 6c 73 20  tCompiledLocals 
8050: 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 72 6f  --. *. *.This ro
8060: 75 74 69 6e 65 20 69 73 20 69 6e 76 6f 6b 65 64  utine is invoked
8070: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 69 6e 69   in order to ini
8080: 74 69 61 6c 69 7a 65 20 74 68 65 20 63 6f 6d 70  tialize the comp
8090: 69 6c 65 64 20 6c 6f 63 61 6c 73 0a 20 2a 09 74  iled locals. *.t
80a0: 61 62 6c 65 20 66 6f 72 20 61 20 6e 65 77 20 63  able for a new c
80b0: 61 6c 6c 20 66 72 61 6d 65 2e 0a 20 2a 0a 20 2a  all frame.. *. *
80c0: 09 44 45 50 52 45 43 41 54 45 44 3a 20 66 75 6e  .DEPRECATED: fun
80d0: 63 74 69 6f 6e 61 6c 69 74 79 20 68 61 73 20 62  ctionality has b
80e0: 65 65 6e 20 69 6e 6c 69 6e 65 64 20 65 6c 73 65  een inlined else
80f0: 77 68 65 72 65 3b 20 74 68 69 73 20 66 75 6e 63  where; this func
8100: 74 69 6f 6e 0a 20 2a 09 72 65 6d 61 69 6e 73 20  tion. *.remains 
8110: 74 6f 20 69 6e 73 75 72 65 20 62 69 6e 61 72 79  to insure binary
8120: 20 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 20 77   compatibility w
8130: 69 74 68 20 49 74 63 6c 2e 0a 20 2a 0a 20 2a 20  ith Itcl.. *. * 
8140: 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65  Results:. *.None
8150: 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66  .. *. * Side eff
8160: 65 63 74 73 3a 0a 20 2a 09 4d 61 79 20 69 6e 76  ects:. *.May inv
8170: 6f 6b 65 20 76 61 72 69 6f 75 73 20 6e 61 6d 65  oke various name
8180: 20 72 65 73 6f 6c 76 65 72 73 20 69 6e 20 6f 72   resolvers in or
8190: 64 65 72 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  der to determine
81a0: 20 77 68 69 63 68 0a 20 2a 09 76 61 72 69 61 62   which. *.variab
81b0: 6c 65 73 20 61 72 65 20 62 65 69 6e 67 20 72 65  les are being re
81c0: 66 65 72 65 6e 63 65 64 20 61 74 20 72 75 6e 74  ferenced at runt
81d0: 69 6d 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  ime.. *. *------
81e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
81f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8200: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8210: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8220: 0a 20 2a 2f 0a 0a 76 6f 69 64 0a 54 63 6c 49 6e  . */..void.TclIn
8230: 69 74 43 6f 6d 70 69 6c 65 64 4c 6f 63 61 6c 73  itCompiledLocals
8240: 28 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70  (.    Tcl_Interp
8250: 20 2a 69 6e 74 65 72 70 2c 09 09 2f 2a 20 43 75   *interp,../* Cu
8260: 72 72 65 6e 74 20 69 6e 74 65 72 70 72 65 74 65  rrent interprete
8270: 72 2e 20 2a 2f 0a 20 20 20 20 43 61 6c 6c 46 72  r. */.    CallFr
8280: 61 6d 65 20 2a 66 72 61 6d 65 50 74 72 2c 09 2f  ame *framePtr,./
8290: 2a 20 43 61 6c 6c 20 66 72 61 6d 65 20 74 6f 20  * Call frame to 
82a0: 69 6e 69 74 69 61 6c 69 7a 65 2e 20 2a 2f 0a 20  initialize. */. 
82b0: 20 20 20 4e 61 6d 65 73 70 61 63 65 20 2a 6e 73     Namespace *ns
82c0: 50 74 72 29 09 09 2f 2a 20 50 6f 69 6e 74 65 72  Ptr)../* Pointer
82d0: 20 74 6f 20 63 75 72 72 65 6e 74 20 6e 61 6d 65   to current name
82e0: 73 70 61 63 65 2e 20 2a 2f 0a 7b 0a 20 20 20 20  space. */.{.    
82f0: 56 61 72 20 2a 76 61 72 50 74 72 20 3d 20 66 72  Var *varPtr = fr
8300: 61 6d 65 50 74 72 2d 3e 63 6f 6d 70 69 6c 65 64  amePtr->compiled
8310: 4c 6f 63 61 6c 73 3b 0a 20 20 20 20 54 63 6c 5f  Locals;.    Tcl_
8320: 4f 62 6a 20 2a 62 6f 64 79 50 74 72 3b 0a 20 20  Obj *bodyPtr;.  
8330: 20 20 42 79 74 65 43 6f 64 65 20 2a 63 6f 64 65    ByteCode *code
8340: 50 74 72 3b 0a 0a 20 20 20 20 62 6f 64 79 50 74  Ptr;..    bodyPt
8350: 72 20 3d 20 66 72 61 6d 65 50 74 72 2d 3e 70 72  r = framePtr->pr
8360: 6f 63 50 74 72 2d 3e 62 6f 64 79 50 74 72 3b 0a  ocPtr->bodyPtr;.
8370: 20 20 20 20 69 66 20 28 62 6f 64 79 50 74 72 2d      if (bodyPtr-
8380: 3e 74 79 70 65 50 74 72 20 21 3d 20 26 74 63 6c  >typePtr != &tcl
8390: 42 79 74 65 43 6f 64 65 54 79 70 65 29 20 7b 0a  ByteCodeType) {.
83a0: 09 54 63 6c 5f 50 61 6e 69 63 28 22 62 6f 64 79  .Tcl_Panic("body
83b0: 20 6f 62 6a 65 63 74 20 66 6f 72 20 70 72 6f 63   object for proc
83c0: 20 61 74 74 61 63 68 65 64 20 74 6f 20 66 72 61   attached to fra
83d0: 6d 65 20 69 73 20 6e 6f 74 20 61 20 62 79 74 65  me is not a byte
83e0: 20 63 6f 64 65 20 74 79 70 65 22 29 3b 0a 20 20   code type");.  
83f0: 20 20 7d 0a 20 20 20 20 63 6f 64 65 50 74 72 20    }.    codePtr 
8400: 3d 20 62 6f 64 79 50 74 72 2d 3e 69 6e 74 65 72  = bodyPtr->inter
8410: 6e 61 6c 52 65 70 2e 74 77 6f 50 74 72 56 61 6c  nalRep.twoPtrVal
8420: 75 65 2e 70 74 72 31 3b 0a 0a 20 20 20 20 69 66  ue.ptr1;..    if
8430: 20 28 66 72 61 6d 65 50 74 72 2d 3e 6e 75 6d 43   (framePtr->numC
8440: 6f 6d 70 69 6c 65 64 4c 6f 63 61 6c 73 29 20 7b  ompiledLocals) {
8450: 0a 09 69 66 20 28 21 63 6f 64 65 50 74 72 2d 3e  ..if (!codePtr->
8460: 6c 6f 63 61 6c 43 61 63 68 65 50 74 72 29 20 7b  localCachePtr) {
8470: 0a 09 20 20 20 20 49 6e 69 74 4c 6f 63 61 6c 43  ..    InitLocalC
8480: 61 63 68 65 28 66 72 61 6d 65 50 74 72 2d 3e 70  ache(framePtr->p
8490: 72 6f 63 50 74 72 29 20 3b 0a 09 7d 0a 09 66 72  rocPtr) ;..}..fr
84a0: 61 6d 65 50 74 72 2d 3e 6c 6f 63 61 6c 43 61 63  amePtr->localCac
84b0: 68 65 50 74 72 20 3d 20 63 6f 64 65 50 74 72 2d  hePtr = codePtr-
84c0: 3e 6c 6f 63 61 6c 43 61 63 68 65 50 74 72 3b 0a  >localCachePtr;.
84d0: 09 66 72 61 6d 65 50 74 72 2d 3e 6c 6f 63 61 6c  .framePtr->local
84e0: 43 61 63 68 65 50 74 72 2d 3e 72 65 66 43 6f 75  CachePtr->refCou
84f0: 6e 74 2b 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  nt++;.    }..   
8500: 20 49 6e 69 74 52 65 73 6f 6c 76 65 64 4c 6f 63   InitResolvedLoc
8510: 61 6c 73 28 69 6e 74 65 72 70 2c 20 63 6f 64 65  als(interp, code
8520: 50 74 72 2c 20 76 61 72 50 74 72 2c 20 6e 73 50  Ptr, varPtr, nsP
8530: 74 72 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d  tr);.}.../*. *--
8540: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8550: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8560: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8570: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
8580: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 49 6e 69 74 52  ----. *. * InitR
8590: 65 73 6f 6c 76 65 64 4c 6f 63 61 6c 73 20 2d 2d  esolvedLocals --
85a0: 0a 20 2a 0a 20 2a 09 54 68 69 73 20 72 6f 75 74  . *. *.This rout
85b0: 69 6e 65 20 69 73 20 69 6e 76 6f 6b 65 64 20 69  ine is invoked i
85c0: 6e 20 6f 72 64 65 72 20 74 6f 20 69 6e 69 74 69  n order to initi
85d0: 61 6c 69 7a 65 20 74 68 65 20 63 6f 6d 70 69 6c  alize the compil
85e0: 65 64 20 6c 6f 63 61 6c 73 0a 20 2a 09 74 61 62  ed locals. *.tab
85f0: 6c 65 20 66 6f 72 20 61 20 6e 65 77 20 63 61 6c  le for a new cal
8600: 6c 20 66 72 61 6d 65 2e 0a 20 2a 0a 20 2a 20 52  l frame.. *. * R
8610: 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e  esults:. *.None.
8620: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65  . *. * Side effe
8630: 63 74 73 3a 0a 20 2a 09 4d 61 79 20 69 6e 76 6f  cts:. *.May invo
8640: 6b 65 20 76 61 72 69 6f 75 73 20 6e 61 6d 65 20  ke various name 
8650: 72 65 73 6f 6c 76 65 72 73 20 69 6e 20 6f 72 64  resolvers in ord
8660: 65 72 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  er to determine 
8670: 77 68 69 63 68 0a 20 2a 09 76 61 72 69 61 62 6c  which. *.variabl
8680: 65 73 20 61 72 65 20 62 65 69 6e 67 20 72 65 66  es are being ref
8690: 65 72 65 6e 63 65 64 20 61 74 20 72 75 6e 74 69  erenced at runti
86a0: 6d 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  me.. *. *-------
86b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
86c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
86d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
86e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
86f0: 20 2a 2f 0a 0a 73 74 61 74 69 63 20 76 6f 69 64   */..static void
8700: 0a 49 6e 69 74 52 65 73 6f 6c 76 65 64 4c 6f 63  .InitResolvedLoc
8710: 61 6c 73 28 0a 20 20 20 20 54 63 6c 5f 49 6e 74  als(.    Tcl_Int
8720: 65 72 70 20 2a 69 6e 74 65 72 70 2c 09 09 2f 2a  erp *interp,../*
8730: 20 43 75 72 72 65 6e 74 20 69 6e 74 65 72 70 72   Current interpr
8740: 65 74 65 72 2e 20 2a 2f 0a 20 20 20 20 42 79 74  eter. */.    Byt
8750: 65 43 6f 64 65 20 2a 63 6f 64 65 50 74 72 2c 0a  eCode *codePtr,.
8760: 20 20 20 20 56 61 72 20 2a 76 61 72 50 74 72 2c      Var *varPtr,
8770: 0a 20 20 20 20 4e 61 6d 65 73 70 61 63 65 20 2a  .    Namespace *
8780: 6e 73 50 74 72 29 09 09 2f 2a 20 50 6f 69 6e 74  nsPtr)../* Point
8790: 65 72 20 74 6f 20 63 75 72 72 65 6e 74 20 6e 61  er to current na
87a0: 6d 65 73 70 61 63 65 2e 20 2a 2f 0a 7b 0a 20 20  mespace. */.{.  
87b0: 20 20 49 6e 74 65 72 70 20 2a 69 50 74 72 20 3d    Interp *iPtr =
87c0: 20 28 49 6e 74 65 72 70 20 2a 29 20 69 6e 74 65   (Interp *) inte
87d0: 72 70 3b 0a 20 20 20 20 69 6e 74 20 68 61 76 65  rp;.    int have
87e0: 52 65 73 6f 6c 76 65 72 73 20 3d 20 28 6e 73 50  Resolvers = (nsP
87f0: 74 72 2d 3e 63 6f 6d 70 69 6c 65 64 56 61 72 52  tr->compiledVarR
8800: 65 73 50 72 6f 63 20 7c 7c 20 69 50 74 72 2d 3e  esProc || iPtr->
8810: 72 65 73 6f 6c 76 65 72 50 74 72 29 3b 0a 20 20  resolverPtr);.  
8820: 20 20 43 6f 6d 70 69 6c 65 64 4c 6f 63 61 6c 20    CompiledLocal 
8830: 2a 66 69 72 73 74 4c 6f 63 61 6c 50 74 72 2c 20  *firstLocalPtr, 
8840: 2a 6c 6f 63 61 6c 50 74 72 3b 0a 20 20 20 20 69  *localPtr;.    i
8850: 6e 74 20 76 61 72 4e 75 6d 3b 0a 20 20 20 20 54  nt varNum;.    T
8860: 63 6c 5f 52 65 73 6f 6c 76 65 64 56 61 72 49 6e  cl_ResolvedVarIn
8870: 66 6f 20 2a 72 65 73 56 61 72 49 6e 66 6f 3b 0a  fo *resVarInfo;.
8880: 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 46  .    /*.     * F
8890: 69 6e 64 20 74 68 65 20 6c 6f 63 61 6c 50 74 72  ind the localPtr
88a0: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
88b0: 6f 20 76 61 72 50 74 72 0a 20 20 20 20 20 2a 2f  o varPtr.     */
88c0: 0a 0a 20 20 20 20 76 61 72 4e 75 6d 20 3d 20 76  ..    varNum = v
88d0: 61 72 50 74 72 20 2d 20 69 50 74 72 2d 3e 66 72  arPtr - iPtr->fr
88e0: 61 6d 65 50 74 72 2d 3e 63 6f 6d 70 69 6c 65 64  amePtr->compiled
88f0: 4c 6f 63 61 6c 73 3b 0a 20 20 20 20 6c 6f 63 61  Locals;.    loca
8900: 6c 50 74 72 20 3d 20 69 50 74 72 2d 3e 66 72 61  lPtr = iPtr->fra
8910: 6d 65 50 74 72 2d 3e 70 72 6f 63 50 74 72 2d 3e  mePtr->procPtr->
8920: 66 69 72 73 74 4c 6f 63 61 6c 50 74 72 3b 0a 20  firstLocalPtr;. 
8930: 20 20 20 77 68 69 6c 65 20 28 76 61 72 4e 75 6d     while (varNum
8940: 2d 2d 29 20 7b 0a 09 6c 6f 63 61 6c 50 74 72 20  --) {..localPtr 
8950: 3d 20 6c 6f 63 61 6c 50 74 72 2d 3e 6e 65 78 74  = localPtr->next
8960: 50 74 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  Ptr;.    }..    
8970: 69 66 20 28 21 28 68 61 76 65 52 65 73 6f 6c 76  if (!(haveResolv
8980: 65 72 73 20 26 26 20 28 63 6f 64 65 50 74 72 2d  ers && (codePtr-
8990: 3e 66 6c 61 67 73 20 26 20 54 43 4c 5f 42 59 54  >flags & TCL_BYT
89a0: 45 43 4f 44 45 5f 52 45 53 4f 4c 56 45 5f 56 41  ECODE_RESOLVE_VA
89b0: 52 53 29 29 29 20 7b 0a 09 67 6f 74 6f 20 64 6f  RS))) {..goto do
89c0: 49 6e 69 74 52 65 73 6f 6c 76 65 64 4c 6f 63 61  InitResolvedLoca
89d0: 6c 73 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ls;.    }..    /
89e0: 2a 0a 20 20 20 20 20 2a 20 54 68 69 73 20 69 73  *.     * This is
89f0: 20 74 68 65 20 66 69 72 73 74 20 72 75 6e 20 61   the first run a
8a00: 66 74 65 72 20 61 20 72 65 63 6f 6d 70 69 6c 65  fter a recompile
8a10: 2c 20 6f 72 20 65 6c 73 65 20 74 68 65 20 72 65  , or else the re
8a20: 73 6f 6c 76 65 72 20 65 70 6f 63 68 0a 20 20 20  solver epoch.   
8a30: 20 20 2a 20 68 61 73 20 63 68 61 6e 67 65 64 3a    * has changed:
8a40: 20 75 70 64 61 74 65 20 74 68 65 20 72 65 73 6f   update the reso
8a50: 6c 76 65 72 20 63 61 63 68 65 2e 0a 20 20 20 20  lver cache..    
8a60: 20 2a 2f 0a 0a 20 20 20 20 66 69 72 73 74 4c 6f   */..    firstLo
8a70: 63 61 6c 50 74 72 20 3d 20 6c 6f 63 61 6c 50 74  calPtr = localPt
8a80: 72 3b 0a 20 20 20 20 66 6f 72 20 28 3b 20 6c 6f  r;.    for (; lo
8a90: 63 61 6c 50 74 72 20 21 3d 20 4e 55 4c 4c 3b 20  calPtr != NULL; 
8aa0: 6c 6f 63 61 6c 50 74 72 20 3d 20 6c 6f 63 61 6c  localPtr = local
8ab0: 50 74 72 2d 3e 6e 65 78 74 50 74 72 29 20 7b 0a  Ptr->nextPtr) {.
8ac0: 09 69 66 20 28 6c 6f 63 61 6c 50 74 72 2d 3e 72  .if (localPtr->r
8ad0: 65 73 6f 6c 76 65 49 6e 66 6f 29 20 7b 0a 09 20  esolveInfo) {.. 
8ae0: 20 20 20 69 66 20 28 6c 6f 63 61 6c 50 74 72 2d     if (localPtr-
8af0: 3e 72 65 73 6f 6c 76 65 49 6e 66 6f 2d 3e 64 65  >resolveInfo->de
8b00: 6c 65 74 65 50 72 6f 63 29 20 7b 0a 09 09 6c 6f  leteProc) {...lo
8b10: 63 61 6c 50 74 72 2d 3e 72 65 73 6f 6c 76 65 49  calPtr->resolveI
8b20: 6e 66 6f 2d 3e 64 65 6c 65 74 65 50 72 6f 63 28  nfo->deleteProc(
8b30: 6c 6f 63 61 6c 50 74 72 2d 3e 72 65 73 6f 6c 76  localPtr->resolv
8b40: 65 49 6e 66 6f 29 3b 0a 09 20 20 20 20 7d 20 65  eInfo);..    } e
8b50: 6c 73 65 20 7b 0a 09 09 63 6b 66 72 65 65 28 6c  lse {...ckfree(l
8b60: 6f 63 61 6c 50 74 72 2d 3e 72 65 73 6f 6c 76 65  ocalPtr->resolve
8b70: 49 6e 66 6f 29 3b 0a 09 20 20 20 20 7d 0a 09 20  Info);..    }.. 
8b80: 20 20 20 6c 6f 63 61 6c 50 74 72 2d 3e 72 65 73     localPtr->res
8b90: 6f 6c 76 65 49 6e 66 6f 20 3d 20 4e 55 4c 4c 3b  olveInfo = NULL;
8ba0: 0a 09 7d 0a 09 6c 6f 63 61 6c 50 74 72 2d 3e 66  ..}..localPtr->f
8bb0: 6c 61 67 73 20 26 3d 20 7e 56 41 52 5f 52 45 53  lags &= ~VAR_RES
8bc0: 4f 4c 56 45 44 3b 0a 0a 09 69 66 20 28 68 61 76  OLVED;...if (hav
8bd0: 65 52 65 73 6f 6c 76 65 72 73 20 26 26 0a 09 09  eResolvers &&...
8be0: 21 28 6c 6f 63 61 6c 50 74 72 2d 3e 66 6c 61 67  !(localPtr->flag
8bf0: 73 20 26 20 28 56 41 52 5f 41 52 47 55 4d 45 4e  s & (VAR_ARGUMEN
8c00: 54 7c 56 41 52 5f 54 45 4d 50 4f 52 41 52 59 29  T|VAR_TEMPORARY)
8c10: 29 29 20 7b 0a 09 20 20 20 20 52 65 73 6f 6c 76  )) {..    Resolv
8c20: 65 72 53 63 68 65 6d 65 20 2a 72 65 73 50 74 72  erScheme *resPtr
8c30: 20 3d 20 69 50 74 72 2d 3e 72 65 73 6f 6c 76 65   = iPtr->resolve
8c40: 72 50 74 72 3b 0a 09 20 20 20 20 54 63 6c 5f 52  rPtr;..    Tcl_R
8c50: 65 73 6f 6c 76 65 64 56 61 72 49 6e 66 6f 20 2a  esolvedVarInfo *
8c60: 76 69 6e 66 6f 3b 0a 09 20 20 20 20 69 6e 74 20  vinfo;..    int 
8c70: 72 65 73 75 6c 74 3b 0a 0a 09 20 20 20 20 69 66  result;...    if
8c80: 20 28 6e 73 50 74 72 2d 3e 63 6f 6d 70 69 6c 65   (nsPtr->compile
8c90: 64 56 61 72 52 65 73 50 72 6f 63 29 20 7b 0a 09  dVarResProc) {..
8ca0: 09 72 65 73 75 6c 74 20 3d 20 6e 73 50 74 72 2d  .result = nsPtr-
8cb0: 3e 63 6f 6d 70 69 6c 65 64 56 61 72 52 65 73 50  >compiledVarResP
8cc0: 72 6f 63 28 6e 73 50 74 72 2d 3e 69 6e 74 65 72  roc(nsPtr->inter
8cd0: 70 2c 0a 09 09 09 6c 6f 63 61 6c 50 74 72 2d 3e  p,....localPtr->
8ce0: 6e 61 6d 65 2c 20 6c 6f 63 61 6c 50 74 72 2d 3e  name, localPtr->
8cf0: 6e 61 6d 65 4c 65 6e 67 74 68 2c 0a 09 09 09 28  nameLength,....(
8d00: 54 63 6c 5f 4e 61 6d 65 73 70 61 63 65 20 2a 29  Tcl_Namespace *)
8d10: 20 6e 73 50 74 72 2c 20 26 76 69 6e 66 6f 29 3b   nsPtr, &vinfo);
8d20: 0a 09 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09  ..    } else {..
8d30: 09 72 65 73 75 6c 74 20 3d 20 54 43 4c 5f 43 4f  .result = TCL_CO
8d40: 4e 54 49 4e 55 45 3b 0a 09 20 20 20 20 7d 0a 0a  NTINUE;..    }..
8d50: 09 20 20 20 20 77 68 69 6c 65 20 28 28 72 65 73  .    while ((res
8d60: 75 6c 74 20 3d 3d 20 54 43 4c 5f 43 4f 4e 54 49  ult == TCL_CONTI
8d70: 4e 55 45 29 20 26 26 20 72 65 73 50 74 72 29 20  NUE) && resPtr) 
8d80: 7b 0a 09 09 69 66 20 28 72 65 73 50 74 72 2d 3e  {...if (resPtr->
8d90: 63 6f 6d 70 69 6c 65 64 56 61 72 52 65 73 50 72  compiledVarResPr
8da0: 6f 63 29 20 7b 0a 09 09 20 20 20 20 72 65 73 75  oc) {...    resu
8db0: 6c 74 20 3d 20 72 65 73 50 74 72 2d 3e 63 6f 6d  lt = resPtr->com
8dc0: 70 69 6c 65 64 56 61 72 52 65 73 50 72 6f 63 28  piledVarResProc(
8dd0: 6e 73 50 74 72 2d 3e 69 6e 74 65 72 70 2c 0a 09  nsPtr->interp,..
8de0: 09 09 20 20 20 20 6c 6f 63 61 6c 50 74 72 2d 3e  ..    localPtr->
8df0: 6e 61 6d 65 2c 20 6c 6f 63 61 6c 50 74 72 2d 3e  name, localPtr->
8e00: 6e 61 6d 65 4c 65 6e 67 74 68 2c 0a 09 09 09 20  nameLength,.... 
8e10: 20 20 20 28 54 63 6c 5f 4e 61 6d 65 73 70 61 63     (Tcl_Namespac
8e20: 65 20 2a 29 20 6e 73 50 74 72 2c 20 26 76 69 6e  e *) nsPtr, &vin
8e30: 66 6f 29 3b 0a 09 09 7d 0a 09 09 72 65 73 50 74  fo);...}...resPt
8e40: 72 20 3d 20 72 65 73 50 74 72 2d 3e 6e 65 78 74  r = resPtr->next
8e50: 50 74 72 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20  Ptr;..    }..   
8e60: 20 69 66 20 28 72 65 73 75 6c 74 20 3d 3d 20 54   if (result == T
8e70: 43 4c 5f 4f 4b 29 20 7b 0a 09 09 6c 6f 63 61 6c  CL_OK) {...local
8e80: 50 74 72 2d 3e 72 65 73 6f 6c 76 65 49 6e 66 6f  Ptr->resolveInfo
8e90: 20 3d 20 76 69 6e 66 6f 3b 0a 09 09 6c 6f 63 61   = vinfo;...loca
8ea0: 6c 50 74 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 56  lPtr->flags |= V
8eb0: 41 52 5f 52 45 53 4f 4c 56 45 44 3b 0a 09 20 20  AR_RESOLVED;..  
8ec0: 20 20 7d 0a 09 7d 0a 20 20 20 20 7d 0a 20 20 20    }..}.    }.   
8ed0: 20 6c 6f 63 61 6c 50 74 72 20 3d 20 66 69 72 73   localPtr = firs
8ee0: 74 4c 6f 63 61 6c 50 74 72 3b 0a 20 20 20 20 63  tLocalPtr;.    c
8ef0: 6f 64 65 50 74 72 2d 3e 66 6c 61 67 73 20 26 3d  odePtr->flags &=
8f00: 20 7e 54 43 4c 5f 42 59 54 45 43 4f 44 45 5f 52   ~TCL_BYTECODE_R
8f10: 45 53 4f 4c 56 45 5f 56 41 52 53 3b 0a 0a 20 20  ESOLVE_VARS;..  
8f20: 20 20 2f 2a 0a 20 20 20 20 20 2a 20 49 6e 69 74    /*.     * Init
8f30: 69 61 6c 69 7a 65 20 74 68 65 20 61 72 72 61 79  ialize the array
8f40: 20 6f 66 20 6c 6f 63 61 6c 20 76 61 72 69 61 62   of local variab
8f50: 6c 65 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68  les stored in th
8f60: 65 20 63 61 6c 6c 20 66 72 61 6d 65 2e 20 53 6f  e call frame. So
8f70: 6d 65 0a 20 20 20 20 20 2a 20 76 61 72 69 61 62  me.     * variab
8f80: 6c 65 73 20 6d 61 79 20 68 61 76 65 20 73 70 65  les may have spe
8f90: 63 69 61 6c 20 72 65 73 6f 6c 75 74 69 6f 6e 20  cial resolution 
8fa0: 72 75 6c 65 73 2e 20 49 6e 20 74 68 61 74 20 63  rules. In that c
8fb0: 61 73 65 2c 20 77 65 20 63 61 6c 6c 0a 20 20 20  ase, we call.   
8fc0: 20 20 2a 20 74 68 65 69 72 20 22 72 65 73 6f 6c    * their "resol
8fd0: 76 65 72 22 20 70 72 6f 63 73 20 74 6f 20 67 65  ver" procs to ge
8fe0: 74 20 6f 75 72 20 68 61 6e 64 73 20 6f 6e 20 74  t our hands on t
8ff0: 68 65 20 76 61 72 69 61 62 6c 65 2c 20 61 6e 64  he variable, and
9000: 20 77 65 20 6d 61 6b 65 0a 20 20 20 20 20 2a 20   we make.     * 
9010: 74 68 65 20 63 6f 6d 70 69 6c 65 64 20 6c 6f 63  the compiled loc
9020: 61 6c 20 61 20 6c 69 6e 6b 20 74 6f 20 74 68 65  al a link to the
9030: 20 72 65 61 6c 20 76 61 72 69 61 62 6c 65 2e 0a   real variable..
9040: 20 20 20 20 20 2a 2f 0a 0a 20 20 64 6f 49 6e 69       */..  doIni
9050: 74 52 65 73 6f 6c 76 65 64 4c 6f 63 61 6c 73 3a  tResolvedLocals:
9060: 0a 20 20 20 20 66 6f 72 20 28 3b 20 6c 6f 63 61  .    for (; loca
9070: 6c 50 74 72 20 21 3d 20 4e 55 4c 4c 3b 20 76 61  lPtr != NULL; va
9080: 72 50 74 72 2b 2b 2c 20 6c 6f 63 61 6c 50 74 72  rPtr++, localPtr
9090: 20 3d 20 6c 6f 63 61 6c 50 74 72 2d 3e 6e 65 78   = localPtr->nex
90a0: 74 50 74 72 29 20 7b 0a 09 76 61 72 50 74 72 2d  tPtr) {..varPtr-
90b0: 3e 66 6c 61 67 73 20 3d 20 30 3b 0a 09 76 61 72  >flags = 0;..var
90c0: 50 74 72 2d 3e 76 61 6c 75 65 2e 6f 62 6a 50 74  Ptr->value.objPt
90d0: 72 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 2f 2a 0a 09  r = NULL;.../*..
90e0: 20 2a 20 4e 6f 77 20 69 6e 76 6f 6b 65 20 74 68   * Now invoke th
90f0: 65 20 72 65 73 6f 6c 76 65 72 73 20 74 6f 20 64  e resolvers to d
9100: 65 74 65 72 6d 69 6e 65 20 74 68 65 20 65 78 61  etermine the exa
9110: 63 74 20 76 61 72 69 61 62 6c 65 73 20 74 68 61  ct variables tha
9120: 74 0a 09 20 2a 20 73 68 6f 75 6c 64 20 62 65 20  t.. * should be 
9130: 75 73 65 64 2e 0a 09 20 2a 2f 0a 0a 09 72 65 73  used... */...res
9140: 56 61 72 49 6e 66 6f 20 3d 20 6c 6f 63 61 6c 50  VarInfo = localP
9150: 74 72 2d 3e 72 65 73 6f 6c 76 65 49 6e 66 6f 3b  tr->resolveInfo;
9160: 0a 09 69 66 20 28 72 65 73 56 61 72 49 6e 66 6f  ..if (resVarInfo
9170: 20 26 26 20 72 65 73 56 61 72 49 6e 66 6f 2d 3e   && resVarInfo->
9180: 66 65 74 63 68 50 72 6f 63 29 20 7b 0a 09 20 20  fetchProc) {..  
9190: 20 20 56 61 72 20 2a 72 65 73 6f 6c 76 65 64 56    Var *resolvedV
91a0: 61 72 50 74 72 20 3d 20 28 56 61 72 20 2a 29 0a  arPtr = (Var *).
91b0: 09 09 20 20 20 20 72 65 73 56 61 72 49 6e 66 6f  ..    resVarInfo
91c0: 2d 3e 66 65 74 63 68 50 72 6f 63 28 69 6e 74 65  ->fetchProc(inte
91d0: 72 70 2c 20 72 65 73 56 61 72 49 6e 66 6f 29 3b  rp, resVarInfo);
91e0: 0a 0a 09 20 20 20 20 69 66 20 28 72 65 73 6f 6c  ...    if (resol
91f0: 76 65 64 56 61 72 50 74 72 29 20 7b 0a 09 09 69  vedVarPtr) {...i
9200: 66 20 28 54 63 6c 49 73 56 61 72 49 6e 48 61 73  f (TclIsVarInHas
9210: 68 28 72 65 73 6f 6c 76 65 64 56 61 72 50 74 72  h(resolvedVarPtr
9220: 29 29 20 7b 0a 09 09 20 20 20 20 56 61 72 48 61  )) {...    VarHa
9230: 73 68 52 65 66 43 6f 75 6e 74 28 72 65 73 6f 6c  shRefCount(resol
9240: 76 65 64 56 61 72 50 74 72 29 2b 2b 3b 0a 09 09  vedVarPtr)++;...
9250: 7d 0a 09 09 76 61 72 50 74 72 2d 3e 66 6c 61 67  }...varPtr->flag
9260: 73 20 3d 20 56 41 52 5f 4c 49 4e 4b 3b 0a 09 09  s = VAR_LINK;...
9270: 76 61 72 50 74 72 2d 3e 76 61 6c 75 65 2e 6c 69  varPtr->value.li
9280: 6e 6b 50 74 72 20 3d 20 72 65 73 6f 6c 76 65 64  nkPtr = resolved
9290: 56 61 72 50 74 72 3b 0a 09 20 20 20 20 7d 0a 09  VarPtr;..    }..
92a0: 7d 0a 20 20 20 20 7d 0a 7d 0a 0c 0a 76 6f 69 64  }.    }.}...void
92b0: 0a 54 63 6c 46 72 65 65 4c 6f 63 61 6c 43 61 63  .TclFreeLocalCac
92c0: 68 65 28 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65  he(.    Tcl_Inte
92d0: 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 20 20  rp *interp,.    
92e0: 4c 6f 63 61 6c 43 61 63 68 65 20 2a 6c 6f 63 61  LocalCache *loca
92f0: 6c 43 61 63 68 65 50 74 72 29 0a 7b 0a 20 20 20  lCachePtr).{.   
9300: 20 69 6e 74 20 69 3b 0a 20 20 20 20 54 63 6c 5f   int i;.    Tcl_
9310: 4f 62 6a 20 2a 2a 6e 61 6d 65 50 74 72 50 74 72  Obj **namePtrPtr
9320: 20 3d 20 26 6c 6f 63 61 6c 43 61 63 68 65 50 74   = &localCachePt
9330: 72 2d 3e 76 61 72 4e 61 6d 65 30 3b 0a 0a 20 20  r->varName0;..  
9340: 20 20 66 6f 72 20 28 69 20 3d 20 30 3b 20 69 20    for (i = 0; i 
9350: 3c 20 6c 6f 63 61 6c 43 61 63 68 65 50 74 72 2d  < localCachePtr-
9360: 3e 6e 75 6d 56 61 72 73 3b 20 69 2b 2b 2c 20 6e  >numVars; i++, n
9370: 61 6d 65 50 74 72 50 74 72 2b 2b 29 20 7b 0a 09  amePtrPtr++) {..
9380: 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 20  Tcl_Obj *objPtr 
9390: 3d 20 2a 6e 61 6d 65 50 74 72 50 74 72 3b 0a 0a  = *namePtrPtr;..
93a0: 09 69 66 20 28 6f 62 6a 50 74 72 29 20 7b 0a 09  .if (objPtr) {..
93b0: 20 20 20 20 2f 2a 20 54 63 6c 52 65 6c 65 61 73      /* TclReleas
93c0: 65 4c 69 74 65 72 61 6c 20 63 61 6c 6c 73 20 54  eLiteral calls T
93d0: 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 20  cl_DecrRefCount 
93e0: 66 6f 72 20 75 73 20 2a 2f 0a 09 20 20 20 20 54  for us */..    T
93f0: 63 6c 52 65 6c 65 61 73 65 4c 69 74 65 72 61 6c  clReleaseLiteral
9400: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 74 72 29  (interp, objPtr)
9410: 3b 0a 09 7d 0a 20 20 20 20 7d 0a 20 20 20 20 63  ;..}.    }.    c
9420: 6b 66 72 65 65 28 6c 6f 63 61 6c 43 61 63 68 65  kfree(localCache
9430: 50 74 72 29 3b 0a 7d 0a 0c 0a 73 74 61 74 69 63  Ptr);.}...static
9440: 20 76 6f 69 64 0a 49 6e 69 74 4c 6f 63 61 6c 43   void.InitLocalC
9450: 61 63 68 65 28 0a 20 20 20 20 50 72 6f 63 20 2a  ache(.    Proc *
9460: 70 72 6f 63 50 74 72 29 0a 7b 0a 20 20 20 20 49  procPtr).{.    I
9470: 6e 74 65 72 70 20 2a 69 50 74 72 20 3d 20 70 72  nterp *iPtr = pr
9480: 6f 63 50 74 72 2d 3e 69 50 74 72 3b 0a 20 20 20  ocPtr->iPtr;.   
9490: 20 42 79 74 65 43 6f 64 65 20 2a 63 6f 64 65 50   ByteCode *codeP
94a0: 74 72 20 3d 20 70 72 6f 63 50 74 72 2d 3e 62 6f  tr = procPtr->bo
94b0: 64 79 50 74 72 2d 3e 69 6e 74 65 72 6e 61 6c 52  dyPtr->internalR
94c0: 65 70 2e 74 77 6f 50 74 72 56 61 6c 75 65 2e 70  ep.twoPtrValue.p
94d0: 74 72 31 3b 0a 20 20 20 20 69 6e 74 20 6c 6f 63  tr1;.    int loc
94e0: 61 6c 43 74 20 3d 20 70 72 6f 63 50 74 72 2d 3e  alCt = procPtr->
94f0: 6e 75 6d 43 6f 6d 70 69 6c 65 64 4c 6f 63 61 6c  numCompiledLocal
9500: 73 3b 0a 20 20 20 20 69 6e 74 20 6e 75 6d 41 72  s;.    int numAr
9510: 67 73 20 3d 20 70 72 6f 63 50 74 72 2d 3e 6e 75  gs = procPtr->nu
9520: 6d 41 72 67 73 2c 20 69 20 3d 20 30 3b 0a 0a 20  mArgs, i = 0;.. 
9530: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a 6e 61 6d     Tcl_Obj **nam
9540: 65 50 74 72 3b 0a 20 20 20 20 56 61 72 20 2a 76  ePtr;.    Var *v
9550: 61 72 50 74 72 3b 0a 20 20 20 20 4c 6f 63 61 6c  arPtr;.    Local
9560: 43 61 63 68 65 20 2a 6c 6f 63 61 6c 43 61 63 68  Cache *localCach
9570: 65 50 74 72 3b 0a 20 20 20 20 43 6f 6d 70 69 6c  ePtr;.    Compil
9580: 65 64 4c 6f 63 61 6c 20 2a 6c 6f 63 61 6c 50 74  edLocal *localPt
9590: 72 3b 0a 20 20 20 20 69 6e 74 20 69 73 4e 65 77  r;.    int isNew
95a0: 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a  ;..    /*.     *
95b0: 20 43 61 63 68 65 20 74 68 65 20 6e 61 6d 65 73   Cache the names
95c0: 20 61 6e 64 20 69 6e 69 74 69 61 6c 20 76 61 6c   and initial val
95d0: 75 65 73 20 6f 66 20 6c 6f 63 61 6c 20 76 61 72  ues of local var
95e0: 69 61 62 6c 65 73 3b 20 73 74 6f 72 65 20 74 68  iables; store th
95f0: 65 0a 20 20 20 20 20 2a 20 63 61 63 68 65 20 69  e.     * cache i
9600: 6e 20 62 6f 74 68 20 74 68 65 20 66 72 61 6d 65  n both the frame
9610: 50 74 72 20 66 6f 72 20 74 68 69 73 20 65 78 65  Ptr for this exe
9620: 63 75 74 69 6f 6e 20 61 6e 64 20 69 6e 20 74 68  cution and in th
9630: 65 20 63 6f 64 65 50 74 72 0a 20 20 20 20 20 2a  e codePtr.     *
9640: 20 66 6f 72 20 66 75 74 75 72 65 20 63 61 6c 6c   for future call
9650: 73 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20  s..     */..    
9660: 6c 6f 63 61 6c 43 61 63 68 65 50 74 72 20 3d 20  localCachePtr = 
9670: 28 4c 6f 63 61 6c 43 61 63 68 65 20 2a 29 63 6b  (LocalCache *)ck
9680: 61 6c 6c 6f 63 28 54 63 6c 4f 66 66 73 65 74 28  alloc(TclOffset(
9690: 4c 6f 63 61 6c 43 61 63 68 65 2c 20 76 61 72 4e  LocalCache, varN
96a0: 61 6d 65 30 29 0a 09 20 20 20 20 2b 20 6c 6f 63  ame0)..    + loc
96b0: 61 6c 43 74 20 2a 20 73 69 7a 65 6f 66 28 54 63  alCt * sizeof(Tc
96c0: 6c 5f 4f 62 6a 20 2a 29 0a 09 20 20 20 20 2b 20  l_Obj *)..    + 
96d0: 6e 75 6d 41 72 67 73 20 2a 20 73 69 7a 65 6f 66  numArgs * sizeof
96e0: 28 56 61 72 29 29 3b 0a 0a 20 20 20 20 6e 61 6d  (Var));..    nam
96f0: 65 50 74 72 20 3d 20 26 6c 6f 63 61 6c 43 61 63  ePtr = &localCac
9700: 68 65 50 74 72 2d 3e 76 61 72 4e 61 6d 65 30 3b  hePtr->varName0;
9710: 0a 20 20 20 20 76 61 72 50 74 72 20 3d 20 28 56  .    varPtr = (V
9720: 61 72 20 2a 29 20 28 6e 61 6d 65 50 74 72 20 2b  ar *) (namePtr +
9730: 20 6c 6f 63 61 6c 43 74 29 3b 0a 20 20 20 20 6c   localCt);.    l
9740: 6f 63 61 6c 50 74 72 20 3d 20 70 72 6f 63 50 74  ocalPtr = procPt
9750: 72 2d 3e 66 69 72 73 74 4c 6f 63 61 6c 50 74 72  r->firstLocalPtr
9760: 3b 0a 20 20 20 20 77 68 69 6c 65 20 28 6c 6f 63  ;.    while (loc
9770: 61 6c 50 74 72 29 20 7b 0a 09 69 66 20 28 54 63  alPtr) {..if (Tc
9780: 6c 49 73 56 61 72 54 65 6d 70 6f 72 61 72 79 28  lIsVarTemporary(
9790: 6c 6f 63 61 6c 50 74 72 29 29 20 7b 0a 09 20 20  localPtr)) {..  
97a0: 20 20 2a 6e 61 6d 65 50 74 72 20 3d 20 4e 55 4c    *namePtr = NUL
97b0: 4c 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20  L;..} else {..  
97c0: 20 20 2a 6e 61 6d 65 50 74 72 20 3d 20 54 63 6c    *namePtr = Tcl
97d0: 43 72 65 61 74 65 4c 69 74 65 72 61 6c 28 69 50  CreateLiteral(iP
97e0: 74 72 2c 20 6c 6f 63 61 6c 50 74 72 2d 3e 6e 61  tr, localPtr->na
97f0: 6d 65 2c 0a 09 09 20 20 20 20 6c 6f 63 61 6c 50  me,...    localP
9800: 74 72 2d 3e 6e 61 6d 65 4c 65 6e 67 74 68 2c 20  tr->nameLength, 
9810: 2f 2a 20 68 61 73 68 20 2a 2f 20 28 75 6e 73 69  /* hash */ (unsi
9820: 67 6e 65 64 20 69 6e 74 29 20 2d 31 2c 0a 09 09  gned int) -1,...
9830: 20 20 20 20 26 69 73 4e 65 77 2c 20 2f 2a 20 6e      &isNew, /* n
9840: 73 50 74 72 20 2a 2f 20 4e 55 4c 4c 2c 20 30 2c  sPtr */ NULL, 0,
9850: 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 54 63 6c   NULL);..    Tcl
9860: 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 2a 6e  _IncrRefCount(*n
9870: 61 6d 65 50 74 72 29 3b 0a 09 7d 0a 0a 09 69 66  amePtr);..}...if
9880: 20 28 69 20 3c 20 6e 75 6d 41 72 67 73 29 20 7b   (i < numArgs) {
9890: 0a 09 20 20 20 20 76 61 72 50 74 72 2d 3e 66 6c  ..    varPtr->fl
98a0: 61 67 73 20 3d 20 28 6c 6f 63 61 6c 50 74 72 2d  ags = (localPtr-
98b0: 3e 66 6c 61 67 73 20 26 20 56 41 52 5f 49 53 5f  >flags & VAR_IS_
98c0: 41 52 47 53 29 3b 0a 09 20 20 20 20 76 61 72 50  ARGS);..    varP
98d0: 74 72 2d 3e 76 61 6c 75 65 2e 6f 62 6a 50 74 72  tr->value.objPtr
98e0: 20 3d 20 6c 6f 63 61 6c 50 74 72 2d 3e 64 65 66   = localPtr->def
98f0: 56 61 6c 75 65 50 74 72 3b 0a 09 20 20 20 20 76  ValuePtr;..    v
9900: 61 72 50 74 72 2b 2b 3b 0a 09 20 20 20 20 69 2b  arPtr++;..    i+
9910: 2b 3b 0a 09 7d 0a 09 6e 61 6d 65 50 74 72 2b 2b  +;..}..namePtr++
9920: 3b 0a 09 6c 6f 63 61 6c 50 74 72 20 3d 20 6c 6f  ;..localPtr = lo
9930: 63 61 6c 50 74 72 2d 3e 6e 65 78 74 50 74 72 3b  calPtr->nextPtr;
9940: 0a 20 20 20 20 7d 0a 20 20 20 20 63 6f 64 65 50  .    }.    codeP
9950: 74 72 2d 3e 6c 6f 63 61 6c 43 61 63 68 65 50 74  tr->localCachePt
9960: 72 20 3d 20 6c 6f 63 61 6c 43 61 63 68 65 50 74  r = localCachePt
9970: 72 3b 0a 20 20 20 20 6c 6f 63 61 6c 43 61 63 68  r;.    localCach
9980: 65 50 74 72 2d 3e 72 65 66 43 6f 75 6e 74 20 3d  ePtr->refCount =
9990: 20 31 3b 0a 20 20 20 20 6c 6f 63 61 6c 43 61 63   1;.    localCac
99a0: 68 65 50 74 72 2d 3e 6e 75 6d 56 61 72 73 20 3d  hePtr->numVars =
99b0: 20 6c 6f 63 61 6c 43 74 3b 0a 7d 0a 0c 0a 2f 2a   localCt;.}.../*
99c0: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
99d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
99e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
99f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9a00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20  ---------. *. * 
9a10: 49 6e 69 74 41 72 67 73 41 6e 64 4c 6f 63 61 6c  InitArgsAndLocal
9a20: 73 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20  s --. *. *.This 
9a30: 72 6f 75 74 69 6e 65 20 69 73 20 69 6e 76 6f 6b  routine is invok
9a40: 65 64 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 69  ed in order to i
9a50: 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 61 72  nitialize the ar
9a60: 67 75 6d 65 6e 74 73 20 61 6e 64 20 6f 74 68 65  guments and othe
9a70: 72 0a 20 2a 09 63 6f 6d 70 69 6c 65 64 20 6c 6f  r. *.compiled lo
9a80: 63 61 6c 73 20 74 61 62 6c 65 20 66 6f 72 20 61  cals table for a
9a90: 20 6e 65 77 20 63 61 6c 6c 20 66 72 61 6d 65 2e   new call frame.
9aa0: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a  . *. * Results:.
9ab0: 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54 63   *.A standard Tc
9ac0: 6c 20 72 65 73 75 6c 74 2e 0a 20 2a 0a 20 2a 20  l result.. *. * 
9ad0: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a  Side effects:. *
9ae0: 09 41 6c 6c 6f 63 61 74 65 73 20 6d 65 6d 6f 72  .Allocates memor
9af0: 79 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 20 66  y on the stack f
9b00: 6f 72 20 74 68 65 20 63 6f 6d 70 69 6c 65 64 20  or the compiled 
9b10: 6c 6f 63 61 6c 20 76 61 72 69 61 62 6c 65 73 2c  local variables,
9b20: 20 74 68 65 0a 20 2a 09 63 61 6c 6c 65 72 20 69   the. *.caller i
9b30: 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f  s responsible fo
9b40: 72 20 66 72 65 65 69 6e 67 20 74 68 65 6d 2e 20  r freeing them. 
9b50: 49 6e 69 74 69 61 6c 69 73 65 73 20 61 6c 6c 20  Initialises all 
9b60: 76 61 72 69 61 62 6c 65 73 2e 20 4d 61 79 0a 20  variables. May. 
9b70: 2a 09 69 6e 76 6f 6b 65 20 76 61 72 69 6f 75 73  *.invoke various
9b80: 20 6e 61 6d 65 20 72 65 73 6f 6c 76 65 72 73 20   name resolvers 
9b90: 69 6e 20 6f 72 64 65 72 20 74 6f 20 64 65 74 65  in order to dete
9ba0: 72 6d 69 6e 65 20 77 68 69 63 68 20 76 61 72 69  rmine which vari
9bb0: 61 62 6c 65 73 0a 20 2a 09 61 72 65 20 62 65 69  ables. *.are bei
9bc0: 6e 67 20 72 65 66 65 72 65 6e 63 65 64 20 61 74  ng referenced at
9bd0: 20 72 75 6e 74 69 6d 65 2e 0a 20 2a 0a 20 2a 2d   runtime.. *. *-
9be0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9bf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9c00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9c10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9c20: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74 69  -----. */..stati
9c30: 63 20 69 6e 74 0a 49 6e 69 74 41 72 67 73 41 6e  c int.InitArgsAn
9c40: 64 4c 6f 63 61 6c 73 28 0a 20 20 20 20 54 63 6c  dLocals(.    Tcl
9c50: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c  _Interp *interp,
9c60: 2f 2a 20 49 6e 74 65 72 70 72 65 74 65 72 20 69  /* Interpreter i
9c70: 6e 20 77 68 69 63 68 20 70 72 6f 63 65 64 75 72  n which procedur
9c80: 65 20 77 61 73 0a 09 09 09 09 20 2a 20 69 6e 76  e was..... * inv
9c90: 6f 6b 65 64 2e 20 2a 2f 0a 20 20 20 20 54 63 6c  oked. */.    Tcl
9ca0: 5f 4f 62 6a 20 2a 70 72 6f 63 4e 61 6d 65 4f 62  _Obj *procNameOb
9cb0: 6a 2c 09 2f 2a 20 50 72 6f 63 65 64 75 72 65 20  j,./* Procedure 
9cc0: 6e 61 6d 65 20 66 6f 72 20 65 72 72 6f 72 20 72  name for error r
9cd0: 65 70 6f 72 74 69 6e 67 2e 20 2a 2f 0a 20 20 20  eporting. */.   
9ce0: 20 69 6e 74 20 73 6b 69 70 29 09 09 09 2f 2a 20   int skip).../* 
9cf0: 4e 75 6d 62 65 72 20 6f 66 20 69 6e 69 74 69 61  Number of initia
9d00: 6c 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 62  l arguments to b
9d10: 65 20 73 6b 69 70 70 65 64 2c 0a 09 09 09 09 20  e skipped,..... 
9d20: 2a 20 69 2e 65 2e 2c 20 77 6f 72 64 73 20 69 6e  * i.e., words in
9d30: 20 74 68 65 20 22 63 6f 6d 6d 61 6e 64 20 6e 61   the "command na
9d40: 6d 65 22 2e 20 2a 2f 0a 7b 0a 20 20 20 20 43 61  me". */.{.    Ca
9d50: 6c 6c 46 72 61 6d 65 20 2a 66 72 61 6d 65 50 74  llFrame *framePt
9d60: 72 20 3d 20 28 28 49 6e 74 65 72 70 20 2a 29 69  r = ((Interp *)i
9d70: 6e 74 65 72 70 29 2d 3e 76 61 72 46 72 61 6d 65  nterp)->varFrame
9d80: 50 74 72 3b 0a 20 20 20 20 50 72 6f 63 20 2a 70  Ptr;.    Proc *p
9d90: 72 6f 63 50 74 72 20 3d 20 66 72 61 6d 65 50 74  rocPtr = framePt
9da0: 72 2d 3e 70 72 6f 63 50 74 72 3b 0a 20 20 20 20  r->procPtr;.    
9db0: 42 79 74 65 43 6f 64 65 20 2a 63 6f 64 65 50 74  ByteCode *codePt
9dc0: 72 20 3d 20 70 72 6f 63 50 74 72 2d 3e 62 6f 64  r = procPtr->bod
9dd0: 79 50 74 72 2d 3e 69 6e 74 65 72 6e 61 6c 52 65  yPtr->internalRe
9de0: 70 2e 74 77 6f 50 74 72 56 61 6c 75 65 2e 70 74  p.twoPtrValue.pt
9df0: 72 31 3b 0a 20 20 20 20 56 61 72 20 2a 76 61 72  r1;.    Var *var
9e00: 50 74 72 2c 20 2a 64 65 66 50 74 72 3b 0a 20 20  Ptr, *defPtr;.  
9e10: 20 20 69 6e 74 20 6c 6f 63 61 6c 43 74 20 3d 20    int localCt = 
9e20: 70 72 6f 63 50 74 72 2d 3e 6e 75 6d 43 6f 6d 70  procPtr->numComp
9e30: 69 6c 65 64 4c 6f 63 61 6c 73 2c 20 6e 75 6d 41  iledLocals, numA
9e40: 72 67 73 2c 20 61 72 67 43 74 2c 20 69 2c 20 69  rgs, argCt, i, i
9e50: 6d 61 78 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a  max;.    Tcl_Obj
9e60: 20 2a 63 6f 6e 73 74 20 2a 61 72 67 4f 62 6a 73   *const *argObjs
9e70: 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a  ;..    /*.     *
9e80: 20 4d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20   Make sure that 
9e90: 74 68 65 20 6c 6f 63 61 6c 20 63 61 63 68 65 20  the local cache 
9ea0: 6f 66 20 76 61 72 69 61 62 6c 65 20 6e 61 6d 65  of variable name
9eb0: 73 20 61 6e 64 20 69 6e 69 74 69 61 6c 20 76 61  s and initial va
9ec0: 6c 75 65 73 20 68 61 73 0a 20 20 20 20 20 2a 20  lues has.     * 
9ed0: 62 65 65 6e 20 69 6e 69 74 69 61 6c 69 73 65 64  been initialised
9ee0: 20 70 72 6f 70 65 72 6c 79 20 2e 0a 20 20 20 20   properly ..    
9ef0: 20 2a 2f 0a 0a 20 20 20 20 69 66 20 28 6c 6f 63   */..    if (loc
9f00: 61 6c 43 74 29 20 7b 0a 09 69 66 20 28 21 63 6f  alCt) {..if (!co
9f10: 64 65 50 74 72 2d 3e 6c 6f 63 61 6c 43 61 63 68  dePtr->localCach
9f20: 65 50 74 72 29 20 7b 0a 09 20 20 20 20 49 6e 69  ePtr) {..    Ini
9f30: 74 4c 6f 63 61 6c 43 61 63 68 65 28 70 72 6f 63  tLocalCache(proc
9f40: 50 74 72 29 20 3b 0a 09 7d 0a 09 66 72 61 6d 65  Ptr) ;..}..frame
9f50: 50 74 72 2d 3e 6c 6f 63 61 6c 43 61 63 68 65 50  Ptr->localCacheP
9f60: 74 72 20 3d 20 63 6f 64 65 50 74 72 2d 3e 6c 6f  tr = codePtr->lo
9f70: 63 61 6c 43 61 63 68 65 50 74 72 3b 0a 09 66 72  calCachePtr;..fr
9f80: 61 6d 65 50 74 72 2d 3e 6c 6f 63 61 6c 43 61 63  amePtr->localCac
9f90: 68 65 50 74 72 2d 3e 72 65 66 43 6f 75 6e 74 2b  hePtr->refCount+
9fa0: 2b 3b 0a 09 64 65 66 50 74 72 20 3d 20 28 56 61  +;..defPtr = (Va
9fb0: 72 20 2a 29 20 28 26 66 72 61 6d 65 50 74 72 2d  r *) (&framePtr-
9fc0: 3e 6c 6f 63 61 6c 43 61 63 68 65 50 74 72 2d 3e  >localCachePtr->
9fd0: 76 61 72 4e 61 6d 65 30 20 2b 20 6c 6f 63 61 6c  varName0 + local
9fe0: 43 74 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20  Ct);.    } else 
9ff0: 7b 0a 09 64 65 66 50 74 72 20 3d 20 4e 55 4c 4c  {..defPtr = NULL
a000: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a  ;.    }..    /*.
a010: 20 20 20 20 20 2a 20 43 72 65 61 74 65 20 74 68       * Create th
a020: 65 20 22 63 6f 6d 70 69 6c 65 64 4c 6f 63 61 6c  e "compiledLocal
a030: 73 22 20 61 72 72 61 79 2e 20 4d 61 6b 65 20 73  s" array. Make s
a040: 75 72 65 20 69 74 20 69 73 20 6c 61 72 67 65 20  ure it is large 
a050: 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64 0a 20  enough to hold. 
a060: 20 20 20 20 2a 20 61 6c 6c 20 74 68 65 20 70 72      * all the pr
a070: 6f 63 65 64 75 72 65 27 73 20 63 6f 6d 70 69 6c  ocedure's compil
a080: 65 64 20 6c 6f 63 61 6c 20 76 61 72 69 61 62 6c  ed local variabl
a090: 65 73 2c 20 69 6e 63 6c 75 64 69 6e 67 20 69 74  es, including it
a0a0: 73 20 66 6f 72 6d 61 6c 0a 20 20 20 20 20 2a 20  s formal.     * 
a0b0: 70 61 72 61 6d 65 74 65 72 73 2e 0a 20 20 20 20  parameters..    
a0c0: 20 2a 2f 0a 0a 20 20 20 20 76 61 72 50 74 72 20   */..    varPtr 
a0d0: 3d 20 28 56 61 72 20 2a 29 54 63 6c 53 74 61 63  = (Var *)TclStac
a0e0: 6b 41 6c 6c 6f 63 28 69 6e 74 65 72 70 2c 20 6c  kAlloc(interp, l
a0f0: 6f 63 61 6c 43 74 20 2a 20 73 69 7a 65 6f 66 28  ocalCt * sizeof(
a100: 56 61 72 29 29 3b 0a 20 20 20 20 66 72 61 6d 65  Var));.    frame
a110: 50 74 72 2d 3e 63 6f 6d 70 69 6c 65 64 4c 6f 63  Ptr->compiledLoc
a120: 61 6c 73 20 3d 20 76 61 72 50 74 72 3b 0a 20 20  als = varPtr;.  
a130: 20 20 66 72 61 6d 65 50 74 72 2d 3e 6e 75 6d 43    framePtr->numC
a140: 6f 6d 70 69 6c 65 64 4c 6f 63 61 6c 73 20 3d 20  ompiledLocals = 
a150: 6c 6f 63 61 6c 43 74 3b 0a 0a 20 20 20 20 2f 2a  localCt;..    /*
a160: 0a 20 20 20 20 20 2a 20 4d 61 74 63 68 20 61 6e  .     * Match an
a170: 64 20 61 73 73 69 67 6e 20 74 68 65 20 63 61 6c  d assign the cal
a180: 6c 27 73 20 61 63 74 75 61 6c 20 70 61 72 61 6d  l's actual param
a190: 65 74 65 72 73 20 74 6f 20 74 68 65 20 70 72 6f  eters to the pro
a1a0: 63 65 64 75 72 65 27 73 20 66 6f 72 6d 61 6c 0a  cedure's formal.
a1b0: 20 20 20 20 20 2a 20 61 72 67 75 6d 65 6e 74 73       * arguments
a1c0: 2e 20 54 68 65 20 66 6f 72 6d 61 6c 20 61 72 67  . The formal arg
a1d0: 75 6d 65 6e 74 73 20 61 72 65 20 64 65 73 63 72  uments are descr
a1e0: 69 62 65 64 20 62 79 20 74 68 65 20 66 69 72 73  ibed by the firs
a1f0: 74 20 6e 75 6d 41 72 67 73 0a 20 20 20 20 20 2a  t numArgs.     *
a200: 20 65 6e 74 72 69 65 73 20 69 6e 20 62 6f 74 68   entries in both
a210: 20 74 68 65 20 50 72 6f 63 20 73 74 72 75 63 74   the Proc struct
a220: 75 72 65 27 73 20 6c 6f 63 61 6c 20 76 61 72 69  ure's local vari
a230: 61 62 6c 65 20 6c 69 73 74 20 61 6e 64 20 74 68  able list and th
a240: 65 20 63 61 6c 6c 0a 20 20 20 20 20 2a 20 66 72  e call.     * fr
a250: 61 6d 65 27 73 20 6c 6f 63 61 6c 20 76 61 72 69  ame's local vari
a260: 61 62 6c 65 20 61 72 72 61 79 2e 0a 20 20 20 20  able array..    
a270: 20 2a 2f 0a 0a 20 20 20 20 6e 75 6d 41 72 67 73   */..    numArgs
a280: 20 3d 20 70 72 6f 63 50 74 72 2d 3e 6e 75 6d 41   = procPtr->numA
a290: 72 67 73 3b 0a 20 20 20 20 61 72 67 43 74 20 3d  rgs;.    argCt =
a2a0: 20 66 72 61 6d 65 50 74 72 2d 3e 6f 62 6a 63 20   framePtr->objc 
a2b0: 2d 20 73 6b 69 70 3b 09 2f 2a 20 53 65 74 20 69  - skip;./* Set i
a2c0: 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20  t to the number 
a2d0: 6f 66 20 61 72 67 73 20 74 6f 20 74 68 65 0a 09  of args to the..
a2e0: 09 09 09 09 20 2a 20 70 72 6f 63 65 64 75 72 65  .... * procedure
a2f0: 2e 20 2a 2f 0a 20 20 20 20 69 66 20 28 6e 75 6d  . */.    if (num
a300: 41 72 67 73 20 3d 3d 20 30 29 20 7b 0a 09 69 66  Args == 0) {..if
a310: 20 28 61 72 67 43 74 29 20 7b 0a 09 20 20 20 20   (argCt) {..    
a320: 67 6f 74 6f 20 69 6e 63 6f 72 72 65 63 74 41 72  goto incorrectAr
a330: 67 73 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20  gs;..} else {.. 
a340: 20 20 20 67 6f 74 6f 20 63 6f 72 72 65 63 74 41     goto correctA
a350: 72 67 73 3b 0a 09 7d 0a 20 20 20 20 7d 0a 20 20  rgs;..}.    }.  
a360: 20 20 61 72 67 4f 62 6a 73 20 3d 20 66 72 61 6d    argObjs = fram
a370: 65 50 74 72 2d 3e 6f 62 6a 76 20 2b 20 73 6b 69  ePtr->objv + ski
a380: 70 3b 0a 20 20 20 20 69 6d 61 78 20 3d 20 28 28  p;.    imax = ((
a390: 61 72 67 43 74 20 3c 20 6e 75 6d 41 72 67 73 2d  argCt < numArgs-
a3a0: 31 29 20 3f 20 61 72 67 43 74 20 3a 20 6e 75 6d  1) ? argCt : num
a3b0: 41 72 67 73 2d 31 29 3b 0a 20 20 20 20 66 6f 72  Args-1);.    for
a3c0: 20 28 69 20 3d 20 30 3b 20 69 20 3c 20 69 6d 61   (i = 0; i < ima
a3d0: 78 3b 20 69 2b 2b 2c 20 76 61 72 50 74 72 2b 2b  x; i++, varPtr++
a3e0: 2c 20 64 65 66 50 74 72 20 3f 20 64 65 66 50 74  , defPtr ? defPt
a3f0: 72 2b 2b 20 3a 20 64 65 66 50 74 72 29 20 7b 0a  r++ : defPtr) {.
a400: 09 2f 2a 0a 09 20 2a 20 22 4e 6f 72 6d 61 6c 22  ./*.. * "Normal"
a410: 20 61 72 67 75 6d 65 6e 74 73 3b 20 6c 61 73 74   arguments; last
a420: 20 66 6f 72 6d 61 6c 20 69 73 20 73 70 65 63 69   formal is speci
a430: 61 6c 2c 20 64 65 70 65 6e 64 73 20 6f 6e 20 69  al, depends on i
a440: 74 20 62 65 69 6e 67 0a 09 20 2a 20 27 61 72 67  t being.. * 'arg
a450: 73 27 2e 0a 09 20 2a 2f 0a 0a 09 54 63 6c 5f 4f  s'... */...Tcl_O
a460: 62 6a 20 2a 6f 62 6a 50 74 72 20 3d 20 61 72 67  bj *objPtr = arg
a470: 4f 62 6a 73 5b 69 5d 3b 0a 0a 09 76 61 72 50 74  Objs[i];...varPt
a480: 72 2d 3e 66 6c 61 67 73 20 3d 20 30 3b 0a 09 76  r->flags = 0;..v
a490: 61 72 50 74 72 2d 3e 76 61 6c 75 65 2e 6f 62 6a  arPtr->value.obj
a4a0: 50 74 72 20 3d 20 6f 62 6a 50 74 72 3b 0a 09 54  Ptr = objPtr;..T
a4b0: 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28  cl_IncrRefCount(
a4c0: 6f 62 6a 50 74 72 29 3b 09 2f 2a 20 4c 6f 63 61  objPtr);./* Loca
a4d0: 6c 20 76 61 72 20 69 73 20 61 20 72 65 66 65 72  l var is a refer
a4e0: 65 6e 63 65 2e 20 2a 2f 0a 20 20 20 20 7d 0a 20  ence. */.    }. 
a4f0: 20 20 20 66 6f 72 20 28 3b 20 69 20 3c 20 6e 75     for (; i < nu
a500: 6d 41 72 67 73 2d 31 3b 20 69 2b 2b 2c 20 76 61  mArgs-1; i++, va
a510: 72 50 74 72 2b 2b 2c 20 64 65 66 50 74 72 20 3f  rPtr++, defPtr ?
a520: 20 64 65 66 50 74 72 2b 2b 20 3a 20 64 65 66 50   defPtr++ : defP
a530: 74 72 29 20 7b 0a 09 2f 2a 0a 09 20 2a 20 54 68  tr) {../*.. * Th
a540: 69 73 20 6c 6f 6f 70 20 69 73 20 65 6e 74 65 72  is loop is enter
a550: 65 64 20 69 66 20 61 72 67 43 74 20 3c 20 28 6e  ed if argCt < (n
a560: 75 6d 41 72 67 73 2d 31 29 2e 20 53 65 74 20 64  umArgs-1). Set d
a570: 65 66 61 75 6c 74 20 76 61 6c 75 65 73 3b 0a 09  efault values;..
a580: 20 2a 20 6c 61 73 74 20 66 6f 72 6d 61 6c 20 69   * last formal i
a590: 73 20 73 70 65 63 69 61 6c 2e 0a 09 20 2a 2f 0a  s special... */.
a5a0: 0a 09 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74  ..Tcl_Obj *objPt
a5b0: 72 20 3d 20 64 65 66 50 74 72 20 3f 20 64 65 66  r = defPtr ? def
a5c0: 50 74 72 2d 3e 76 61 6c 75 65 2e 6f 62 6a 50 74  Ptr->value.objPt
a5d0: 72 20 3a 20 4e 55 4c 4c 3b 0a 0a 09 69 66 20 28  r : NULL;...if (
a5e0: 21 6f 62 6a 50 74 72 29 20 7b 0a 09 20 20 20 20  !objPtr) {..    
a5f0: 67 6f 74 6f 20 69 6e 63 6f 72 72 65 63 74 41 72  goto incorrectAr
a600: 67 73 3b 0a 09 7d 0a 09 76 61 72 50 74 72 2d 3e  gs;..}..varPtr->
a610: 66 6c 61 67 73 20 3d 20 30 3b 0a 09 76 61 72 50  flags = 0;..varP
a620: 74 72 2d 3e 76 61 6c 75 65 2e 6f 62 6a 50 74 72  tr->value.objPtr
a630: 20 3d 20 6f 62 6a 50 74 72 3b 0a 09 54 63 6c 5f   = objPtr;..Tcl_
a640: 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 6f 62 6a  IncrRefCount(obj
a650: 50 74 72 29 3b 09 2f 2a 20 4c 6f 63 61 6c 20 76  Ptr);./* Local v
a660: 61 72 20 72 65 66 65 72 65 6e 63 65 2e 20 2a 2f  ar reference. */
a670: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20  .    }..    /*. 
a680: 20 20 20 20 2a 20 57 68 65 6e 20 77 65 20 67 65      * When we ge
a690: 74 20 68 65 72 65 2c 20 74 68 65 20 6c 61 73 74  t here, the last
a6a0: 20 66 6f 72 6d 61 6c 20 61 72 67 75 6d 65 6e 74   formal argument
a6b0: 20 72 65 6d 61 69 6e 73 20 74 6f 20 62 65 20 64   remains to be d
a6c0: 65 66 69 6e 65 64 3a 0a 20 20 20 20 20 2a 20 64  efined:.     * d
a6d0: 65 66 50 74 72 20 61 6e 64 20 76 61 72 50 74 72  efPtr and varPtr
a6e0: 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6c 61   point to the la
a6f0: 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 62  st argument to b
a700: 65 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 0a 20  e initialized.. 
a710: 20 20 20 20 2a 2f 0a 0a 20 20 20 20 76 61 72 50      */..    varP
a720: 74 72 2d 3e 66 6c 61 67 73 20 3d 20 30 3b 0a 20  tr->flags = 0;. 
a730: 20 20 20 69 66 20 28 64 65 66 50 74 72 20 26 26     if (defPtr &&
a740: 20 64 65 66 50 74 72 2d 3e 66 6c 61 67 73 20 26   defPtr->flags &
a750: 20 56 41 52 5f 49 53 5f 41 52 47 53 29 20 7b 0a   VAR_IS_ARGS) {.
a760: 09 54 63 6c 5f 4f 62 6a 20 2a 6c 69 73 74 50 74  .Tcl_Obj *listPt
a770: 72 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 73 74 4f  r = Tcl_NewListO
a780: 62 6a 28 61 72 67 43 74 2d 69 2c 20 61 72 67 4f  bj(argCt-i, argO
a790: 62 6a 73 2b 69 29 3b 0a 0a 09 76 61 72 50 74 72  bjs+i);...varPtr
a7a0: 2d 3e 76 61 6c 75 65 2e 6f 62 6a 50 74 72 20 3d  ->value.objPtr =
a7b0: 20 6c 69 73 74 50 74 72 3b 0a 09 54 63 6c 5f 49   listPtr;..Tcl_I
a7c0: 6e 63 72 52 65 66 43 6f 75 6e 74 28 6c 69 73 74  ncrRefCount(list
a7d0: 50 74 72 29 3b 09 2f 2a 20 4c 6f 63 61 6c 20 76  Ptr);./* Local v
a7e0: 61 72 20 69 73 20 61 20 72 65 66 65 72 65 6e 63  ar is a referenc
a7f0: 65 2e 20 2a 2f 0a 20 20 20 20 7d 20 65 6c 73 65  e. */.    } else
a800: 20 69 66 20 28 61 72 67 43 74 20 3d 3d 20 6e 75   if (argCt == nu
a810: 6d 41 72 67 73 29 20 7b 0a 09 54 63 6c 5f 4f 62  mArgs) {..Tcl_Ob
a820: 6a 20 2a 6f 62 6a 50 74 72 20 3d 20 61 72 67 4f  j *objPtr = argO
a830: 62 6a 73 5b 69 5d 3b 0a 0a 09 76 61 72 50 74 72  bjs[i];...varPtr
a840: 2d 3e 76 61 6c 75 65 2e 6f 62 6a 50 74 72 20 3d  ->value.objPtr =
a850: 20 6f 62 6a 50 74 72 3b 0a 09 54 63 6c 5f 49 6e   objPtr;..Tcl_In
a860: 63 72 52 65 66 43 6f 75 6e 74 28 6f 62 6a 50 74  crRefCount(objPt
a870: 72 29 3b 09 2f 2a 20 4c 6f 63 61 6c 20 76 61 72  r);./* Local var
a880: 20 69 73 20 61 20 72 65 66 65 72 65 6e 63 65 2e   is a reference.
a890: 20 2a 2f 0a 20 20 20 20 7d 20 65 6c 73 65 20 69   */.    } else i
a8a0: 66 20 28 28 61 72 67 43 74 20 3c 20 6e 75 6d 41  f ((argCt < numA
a8b0: 72 67 73 29 20 26 26 20 64 65 66 50 74 72 20 26  rgs) && defPtr &
a8c0: 26 20 64 65 66 50 74 72 2d 3e 76 61 6c 75 65 2e  & defPtr->value.
a8d0: 6f 62 6a 50 74 72 29 20 7b 0a 09 54 63 6c 5f 4f  objPtr) {..Tcl_O
a8e0: 62 6a 20 2a 6f 62 6a 50 74 72 20 3d 20 64 65 66  bj *objPtr = def
a8f0: 50 74 72 2d 3e 76 61 6c 75 65 2e 6f 62 6a 50 74  Ptr->value.objPt
a900: 72 3b 0a 0a 09 76 61 72 50 74 72 2d 3e 76 61 6c  r;...varPtr->val
a910: 75 65 2e 6f 62 6a 50 74 72 20 3d 20 6f 62 6a 50  ue.objPtr = objP
a920: 74 72 3b 0a 09 54 63 6c 5f 49 6e 63 72 52 65 66  tr;..Tcl_IncrRef
a930: 43 6f 75 6e 74 28 6f 62 6a 50 74 72 29 3b 09 2f  Count(objPtr);./
a940: 2a 20 4c 6f 63 61 6c 20 76 61 72 20 69 73 20 61  * Local var is a
a950: 20 72 65 66 65 72 65 6e 63 65 2e 20 2a 2f 0a 20   reference. */. 
a960: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 67 6f 74     } else {..got
a970: 6f 20 69 6e 63 6f 72 72 65 63 74 41 72 67 73 3b  o incorrectArgs;
a980: 0a 20 20 20 20 7d 0a 20 20 20 20 76 61 72 50 74  .    }.    varPt
a990: 72 2b 2b 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20  r++;..    /*.   
a9a0: 20 20 2a 20 49 6e 69 74 69 61 6c 69 73 65 20 61    * Initialise a
a9b0: 6e 64 20 72 65 73 6f 6c 76 65 20 74 68 65 20 72  nd resolve the r
a9c0: 65 6d 61 69 6e 69 6e 67 20 63 6f 6d 70 69 6c 65  emaining compile
a9d0: 64 4c 6f 63 61 6c 73 2e 20 49 6e 20 74 68 65 20  dLocals. In the 
a9e0: 61 62 73 65 6e 63 65 20 6f 66 0a 20 20 20 20 20  absence of.     
a9f0: 2a 20 72 65 73 6f 6c 76 65 72 73 2c 20 74 68 65  * resolvers, the
aa00: 79 20 61 72 65 20 75 6e 64 65 66 69 6e 65 64 20  y are undefined 
aa10: 6c 6f 63 61 6c 20 76 61 72 73 3a 20 28 66 6c 61  local vars: (fla
aa20: 67 73 3d 30 2c 20 76 61 6c 75 65 3d 4e 55 4c 4c  gs=0, value=NULL
aa30: 29 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 63 6f  )..     */..  co
aa40: 72 72 65 63 74 41 72 67 73 3a 0a 20 20 20 20 69  rrectArgs:.    i
aa50: 66 20 28 6e 75 6d 41 72 67 73 20 3c 20 6c 6f 63  f (numArgs < loc
aa60: 61 6c 43 74 29 20 7b 0a 09 69 66 20 28 21 66 72  alCt) {..if (!fr
aa70: 61 6d 65 50 74 72 2d 3e 6e 73 50 74 72 2d 3e 63  amePtr->nsPtr->c
aa80: 6f 6d 70 69 6c 65 64 56 61 72 52 65 73 50 72 6f  ompiledVarResPro
aa90: 63 0a 09 09 26 26 20 21 28 28 49 6e 74 65 72 70  c...&& !((Interp
aaa0: 20 2a 29 69 6e 74 65 72 70 29 2d 3e 72 65 73 6f   *)interp)->reso
aab0: 6c 76 65 72 50 74 72 29 20 7b 0a 09 20 20 20 20  lverPtr) {..    
aac0: 6d 65 6d 73 65 74 28 76 61 72 50 74 72 2c 20 30  memset(varPtr, 0
aad0: 2c 20 28 6c 6f 63 61 6c 43 74 20 2d 20 6e 75 6d  , (localCt - num
aae0: 41 72 67 73 29 2a 73 69 7a 65 6f 66 28 56 61 72  Args)*sizeof(Var
aaf0: 29 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20  ));..} else {.. 
ab00: 20 20 20 49 6e 69 74 52 65 73 6f 6c 76 65 64 4c     InitResolvedL
ab10: 6f 63 61 6c 73 28 69 6e 74 65 72 70 2c 20 63 6f  ocals(interp, co
ab20: 64 65 50 74 72 2c 20 76 61 72 50 74 72 2c 20 66  dePtr, varPtr, f
ab30: 72 61 6d 65 50 74 72 2d 3e 6e 73 50 74 72 29 3b  ramePtr->nsPtr);
ab40: 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72  ..}.    }..    r
ab50: 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 0a 20  eturn TCL_OK;.. 
ab60: 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 49 6e 69     /*.     * Ini
ab70: 74 69 61 6c 69 73 65 20 61 6c 6c 20 63 6f 6d 70  tialise all comp
ab80: 69 6c 65 64 20 6c 6f 63 61 6c 73 20 74 6f 20 61  iled locals to a
ab90: 76 6f 69 64 20 70 72 6f 62 6c 65 6d 73 20 61 74  void problems at
aba0: 20 44 65 6c 65 74 65 4c 6f 63 61 6c 56 61 72 73   DeleteLocalVars
abb0: 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 69 6e 63  ..     */..  inc
abc0: 6f 72 72 65 63 74 41 72 67 73 3a 0a 20 20 20 20  orrectArgs:.    
abd0: 69 66 20 28 28 73 6b 69 70 20 21 3d 20 31 29 20  if ((skip != 1) 
abe0: 26 26 0a 09 20 20 20 20 54 63 6c 49 6e 69 74 52  &&..    TclInitR
abf0: 65 77 72 69 74 65 45 6e 73 65 6d 62 6c 65 28 69  ewriteEnsemble(i
ac00: 6e 74 65 72 70 2c 20 73 6b 69 70 2d 31 2c 20 30  nterp, skip-1, 0
ac10: 2c 20 66 72 61 6d 65 50 74 72 2d 3e 6f 62 6a 76  , framePtr->objv
ac20: 29 29 20 7b 0a 09 54 63 6c 4e 52 41 64 64 43 61  )) {..TclNRAddCa
ac30: 6c 6c 62 61 63 6b 28 69 6e 74 65 72 70 2c 20 54  llback(interp, T
ac40: 63 6c 43 6c 65 61 72 52 6f 6f 74 45 6e 73 65 6d  clClearRootEnsem
ac50: 62 6c 65 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c  ble, NULL, NULL,
ac60: 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a 20 20   NULL, NULL);.  
ac70: 20 20 7d 0a 20 20 20 20 6d 65 6d 73 65 74 28 76    }.    memset(v
ac80: 61 72 50 74 72 2c 20 30 2c 0a 09 20 20 20 20 28  arPtr, 0,..    (
ac90: 28 66 72 61 6d 65 50 74 72 2d 3e 63 6f 6d 70 69  (framePtr->compi
aca0: 6c 65 64 4c 6f 63 61 6c 73 20 2b 20 6c 6f 63 61  ledLocals + loca
acb0: 6c 43 74 29 2d 76 61 72 50 74 72 29 20 2a 20 73  lCt)-varPtr) * s
acc0: 69 7a 65 6f 66 28 56 61 72 29 29 3b 0a 20 20 20  izeof(Var));.   
acd0: 20 72 65 74 75 72 6e 20 50 72 6f 63 57 72 6f 6e   return ProcWron
ace0: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c  gNumArgs(interp,
acf0: 20 73 6b 69 70 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20   skip);.}.../*. 
ad00: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *---------------
ad10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ad20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ad30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ad40: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 63  -------. *. * Tc
ad50: 6c 50 75 73 68 50 72 6f 63 43 61 6c 6c 46 72 61  lPushProcCallFra
ad60: 6d 65 20 2d 2d 0a 20 2a 0a 20 2a 09 43 6f 6d 70  me --. *. *.Comp
ad70: 69 6c 65 73 20 61 20 70 72 6f 63 20 62 6f 64 79  iles a proc body
ad80: 20 69 66 20 6e 65 63 65 73 73 61 72 79 2c 20 74   if necessary, t
ad90: 68 65 6e 20 70 75 73 68 65 73 20 61 20 43 61 6c  hen pushes a Cal
ada0: 6c 46 72 61 6d 65 20 73 75 69 74 61 62 6c 65 0a  lFrame suitable.
adb0: 20 2a 09 66 6f 72 20 65 78 65 63 75 74 69 6e 67   *.for executing
adc0: 20 69 74 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c   it.. *. * Resul
add0: 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72  ts:. *.A standar
ade0: 64 20 54 63 6c 20 6f 62 6a 65 63 74 20 72 65 73  d Tcl object res
adf0: 75 6c 74 20 76 61 6c 75 65 2e 0a 20 2a 0a 20 2a  ult value.. *. *
ae00: 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20   Side effects:. 
ae10: 2a 09 54 68 65 20 70 72 6f 63 27 73 20 62 6f 64  *.The proc's bod
ae20: 79 20 6d 61 79 20 62 65 20 72 65 63 6f 6d 70 69  y may be recompi
ae30: 6c 65 64 2e 20 41 20 43 61 6c 6c 46 72 61 6d 65  led. A CallFrame
ae40: 20 69 73 20 70 75 73 68 65 64 2c 20 69 74 20 77   is pushed, it w
ae50: 69 6c 6c 20 68 61 76 65 0a 20 2a 09 74 6f 20 62  ill have. *.to b
ae60: 65 20 70 6f 70 70 65 64 20 62 79 20 74 68 65 20  e popped by the 
ae70: 63 61 6c 6c 65 72 2e 0a 20 2a 0a 20 2a 2d 2d 2d  caller.. *. *---
ae80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ae90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
aea0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
aeb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
aec0: 2d 2d 2d 0a 20 2a 2f 0a 0a 69 6e 74 0a 54 63 6c  ---. */..int.Tcl
aed0: 50 75 73 68 50 72 6f 63 43 61 6c 6c 46 72 61 6d  PushProcCallFram
aee0: 65 28 0a 20 20 20 20 43 6c 69 65 6e 74 44 61 74  e(.    ClientDat
aef0: 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 09 2f 2a  a clientData,./*
af00: 20 52 65 63 6f 72 64 20 64 65 73 63 72 69 62 69   Record describi
af10: 6e 67 20 70 72 6f 63 65 64 75 72 65 20 74 6f 20  ng procedure to 
af20: 62 65 0a 09 09 09 09 20 2a 20 69 6e 74 65 72 70  be..... * interp
af30: 72 65 74 65 64 2e 20 2a 2f 0a 20 20 20 20 54 63  reted. */.    Tc
af40: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70  l_Interp *interp
af50: 2c 2f 2a 20 49 6e 74 65 72 70 72 65 74 65 72 20  ,/* Interpreter 
af60: 69 6e 20 77 68 69 63 68 20 70 72 6f 63 65 64 75  in which procedu
af70: 72 65 20 77 61 73 0a 09 09 09 09 20 2a 20 69 6e  re was..... * in
af80: 76 6f 6b 65 64 2e 20 2a 2f 0a 20 20 20 20 69 6e  voked. */.    in
af90: 74 20 6f 62 6a 63 2c 09 09 09 2f 2a 20 43 6f 75  t objc,.../* Cou
afa0: 6e 74 20 6f 66 20 6e 75 6d 62 65 72 20 6f 66 20  nt of number of 
afb0: 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 74 68 69  arguments to thi
afc0: 73 0a 09 09 09 09 20 2a 20 70 72 6f 63 65 64 75  s..... * procedu
afd0: 72 65 2e 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f  re. */.    Tcl_O
afe0: 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d  bj *const objv[]
aff0: 2c 09 2f 2a 20 41 72 67 75 6d 65 6e 74 20 76 61  ,./* Argument va
b000: 6c 75 65 20 6f 62 6a 65 63 74 73 2e 20 2a 2f 0a  lue objects. */.
b010: 20 20 20 20 69 6e 74 20 69 73 4c 61 6d 62 64 61      int isLambda
b020: 29 09 09 2f 2a 20 31 20 69 66 20 74 68 69 73 20  )../* 1 if this 
b030: 69 73 20 61 20 63 61 6c 6c 20 62 79 20 41 70 70  is a call by App
b040: 6c 79 4f 62 6a 43 6d 64 3a 20 69 74 0a 09 09 09  lyObjCmd: it....
b050: 09 20 2a 20 6e 65 65 64 73 20 73 70 65 63 69 61  . * needs specia
b060: 6c 20 72 75 6c 65 73 20 66 6f 72 20 65 72 72 6f  l rules for erro
b070: 72 20 6d 73 67 20 2a 2f 0a 7b 0a 20 20 20 20 50  r msg */.{.    P
b080: 72 6f 63 20 2a 70 72 6f 63 50 74 72 20 3d 20 28  roc *procPtr = (
b090: 50 72 6f 63 20 2a 29 63 6c 69 65 6e 74 44 61 74  Proc *)clientDat
b0a0: 61 3b 0a 20 20 20 20 4e 61 6d 65 73 70 61 63 65  a;.    Namespace
b0b0: 20 2a 6e 73 50 74 72 20 3d 20 70 72 6f 63 50 74   *nsPtr = procPt
b0c0: 72 2d 3e 63 6d 64 50 74 72 2d 3e 6e 73 50 74 72  r->cmdPtr->nsPtr
b0d0: 3b 0a 20 20 20 20 43 61 6c 6c 46 72 61 6d 65 20  ;.    CallFrame 
b0e0: 2a 66 72 61 6d 65 50 74 72 2c 20 2a 2a 66 72 61  *framePtr, **fra
b0f0: 6d 65 50 74 72 50 74 72 3b 0a 20 20 20 20 69 6e  mePtrPtr;.    in
b100: 74 20 72 65 73 75 6c 74 3b 0a 20 20 20 20 42 79  t result;.    By
b110: 74 65 43 6f 64 65 20 2a 63 6f 64 65 50 74 72 3b  teCode *codePtr;
b120: 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20  ..    /*.     * 
b130: 49 66 20 6e 65 63 65 73 73 61 72 79 20 28 69 2e  If necessary (i.
b140: 65 2e 20 69 66 20 77 65 20 68 61 76 65 6e 27 74  e. if we haven't
b150: 20 67 6f 74 20 61 20 73 75 69 74 61 62 6c 65 20   got a suitable 
b160: 63 6f 6d 70 69 6c 61 74 69 6f 6e 20 61 6c 72 65  compilation alre
b170: 61 64 79 0a 20 20 20 20 20 2a 20 63 61 63 68 65  ady.     * cache
b180: 64 29 20 63 6f 6d 70 69 6c 65 20 74 68 65 20 70  d) compile the p
b190: 72 6f 63 65 64 75 72 65 27 73 20 62 6f 64 79 2e  rocedure's body.
b1a0: 20 54 68 65 20 63 6f 6d 70 69 6c 65 72 20 77 69   The compiler wi
b1b0: 6c 6c 20 61 6c 6c 6f 63 61 74 65 20 66 72 61 6d  ll allocate fram
b1c0: 65 0a 20 20 20 20 20 2a 20 73 6c 6f 74 73 20 66  e.     * slots f
b1d0: 6f 72 20 74 68 65 20 70 72 6f 63 65 64 75 72 65  or the procedure
b1e0: 27 73 20 6e 6f 6e 2d 61 72 67 75 6d 65 6e 74 20  's non-argument 
b1f0: 6c 6f 63 61 6c 20 76 61 72 69 61 62 6c 65 73 2e  local variables.
b200: 20 4e 6f 74 65 20 74 68 61 74 0a 20 20 20 20 20   Note that.     
b210: 2a 20 63 6f 6d 70 69 6c 69 6e 67 20 74 68 65 20  * compiling the 
b220: 62 6f 64 79 20 6d 69 67 68 74 20 69 6e 63 72 65  body might incre
b230: 61 73 65 20 70 72 6f 63 50 74 72 2d 3e 6e 75 6d  ase procPtr->num
b240: 43 6f 6d 70 69 6c 65 64 4c 6f 63 61 6c 73 20 69  CompiledLocals i
b250: 66 20 6e 65 77 0a 20 20 20 20 20 2a 20 6c 6f 63  f new.     * loc
b260: 61 6c 20 76 61 72 69 61 62 6c 65 73 20 61 72 65  al variables are
b270: 20 66 6f 75 6e 64 20 77 68 69 6c 65 20 63 6f 6d   found while com
b280: 70 69 6c 69 6e 67 2e 0a 20 20 20 20 20 2a 2f 0a  piling..     */.
b290: 0a 20 20 20 20 69 66 20 28 70 72 6f 63 50 74 72  .    if (procPtr
b2a0: 2d 3e 62 6f 64 79 50 74 72 2d 3e 74 79 70 65 50  ->bodyPtr->typeP
b2b0: 74 72 20 3d 3d 20 26 74 63 6c 42 79 74 65 43 6f  tr == &tclByteCo
b2c0: 64 65 54 79 70 65 29 20 7b 0a 09 49 6e 74 65 72  deType) {..Inter
b2d0: 70 20 2a 69 50 74 72 20 3d 20 28 49 6e 74 65 72  p *iPtr = (Inter
b2e0: 70 20 2a 29 20 69 6e 74 65 72 70 3b 0a 0a 09 2f  p *) interp;.../
b2f0: 2a 0a 09 20 2a 20 57 68 65 6e 20 77 65 27 76 65  *.. * When we've
b300: 20 67 6f 74 20 62 79 74 65 63 6f 64 65 2c 20 74   got bytecode, t
b310: 68 69 73 20 69 73 20 74 68 65 20 63 68 65 63 6b  his is the check
b320: 20 66 6f 72 20 76 61 6c 69 64 69 74 79 2e 20 54   for validity. T
b330: 68 61 74 20 69 73 2c 0a 09 20 2a 20 74 68 65 20  hat is,.. * the 
b340: 62 79 74 65 63 6f 64 65 20 6d 75 73 74 20 62 65  bytecode must be
b350: 20 66 6f 72 20 74 68 65 20 72 69 67 68 74 20 69   for the right i
b360: 6e 74 65 72 70 72 65 74 65 72 20 28 6e 6f 20 63  nterpreter (no c
b370: 72 6f 73 73 2d 6c 65 61 6b 73 21 29 2c 0a 09 20  ross-leaks!),.. 
b380: 2a 20 74 68 65 20 63 6f 64 65 20 6d 75 73 74 20  * the code must 
b390: 62 65 20 66 72 6f 6d 20 74 68 65 20 63 75 72 72  be from the curr
b3a0: 65 6e 74 20 65 70 6f 63 68 20 28 73 6f 20 73 75  ent epoch (so su
b3b0: 62 63 6f 6d 6d 61 6e 64 20 63 6f 6d 70 69 6c 61  bcommand compila
b3c0: 74 69 6f 6e 0a 09 20 2a 20 69 73 20 75 70 2d 74  tion.. * is up-t
b3d0: 6f 2d 64 61 74 65 29 2c 20 74 68 65 20 6e 61 6d  o-date), the nam
b3e0: 65 73 70 61 63 65 20 6d 75 73 74 20 6d 61 74 63  espace must matc
b3f0: 68 20 28 73 6f 20 76 61 72 69 61 62 6c 65 20 68  h (so variable h
b400: 61 6e 64 6c 69 6e 67 0a 09 20 2a 20 69 73 20 72  andling.. * is r
b410: 69 67 68 74 29 20 61 6e 64 20 74 68 65 20 72 65  ight) and the re
b420: 73 6f 6c 76 65 72 45 70 6f 63 68 20 6d 75 73 74  solverEpoch must
b430: 20 6d 61 74 63 68 20 28 73 6f 20 74 68 61 74 20   match (so that 
b440: 6e 65 77 20 73 68 61 64 6f 77 65 64 0a 09 20 2a  new shadowed.. *
b450: 20 63 6f 6d 6d 61 6e 64 73 20 61 6e 64 2f 6f 72   commands and/or
b460: 20 72 65 73 6f 6c 76 65 72 20 63 68 61 6e 67 65   resolver change
b470: 73 20 61 72 65 20 63 6f 6e 73 69 64 65 72 65 64  s are considered
b480: 29 2e 0a 09 20 2a 20 45 6e 73 75 72 65 20 74 68  )... * Ensure th
b490: 65 20 42 79 74 65 43 6f 64 65 27 73 20 70 72 6f  e ByteCode's pro
b4a0: 63 50 74 72 20 69 73 20 74 68 65 20 73 61 6d 65  cPtr is the same
b4b0: 20 28 6f 72 20 69 74 27 73 20 70 72 65 63 6f 6d   (or it's precom
b4c0: 70 69 6c 65 64 29 2e 0a 09 20 2a 2f 0a 0a 09 63  piled)... */...c
b4d0: 6f 64 65 50 74 72 20 3d 20 70 72 6f 63 50 74 72  odePtr = procPtr
b4e0: 2d 3e 62 6f 64 79 50 74 72 2d 3e 69 6e 74 65 72  ->bodyPtr->inter
b4f0: 6e 61 6c 52 65 70 2e 74 77 6f 50 74 72 56 61 6c  nalRep.twoPtrVal
b500: 75 65 2e 70 74 72 31 3b 0a 09 69 66 20 28 28 28  ue.ptr1;..if (((
b510: 49 6e 74 65 72 70 20 2a 29 20 2a 63 6f 64 65 50  Interp *) *codeP
b520: 74 72 2d 3e 69 6e 74 65 72 70 48 61 6e 64 6c 65  tr->interpHandle
b530: 20 21 3d 20 69 50 74 72 29 0a 09 09 7c 7c 20 28   != iPtr)...|| (
b540: 63 6f 64 65 50 74 72 2d 3e 63 6f 6d 70 69 6c 65  codePtr->compile
b550: 45 70 6f 63 68 20 21 3d 20 69 50 74 72 2d 3e 63  Epoch != iPtr->c
b560: 6f 6d 70 69 6c 65 45 70 6f 63 68 29 0a 09 09 7c  ompileEpoch)...|
b570: 7c 20 28 63 6f 64 65 50 74 72 2d 3e 6e 73 50 74  | (codePtr->nsPt
b580: 72 20 21 3d 20 6e 73 50 74 72 29 0a 09 09 7c 7c  r != nsPtr)...||
b590: 20 28 63 6f 64 65 50 74 72 2d 3e 6e 73 45 70 6f   (codePtr->nsEpo
b5a0: 63 68 20 21 3d 20 6e 73 50 74 72 2d 3e 72 65 73  ch != nsPtr->res
b5b0: 6f 6c 76 65 72 45 70 6f 63 68 29 0a 09 09 7c 7c  olverEpoch)...||
b5c0: 20 28 28 63 6f 64 65 50 74 72 2d 3e 70 72 6f 63   ((codePtr->proc
b5d0: 50 74 72 20 21 3d 20 70 72 6f 63 50 74 72 29 20  Ptr != procPtr) 
b5e0: 26 26 20 70 72 6f 63 50 74 72 2d 3e 62 6f 64 79  && procPtr->body
b5f0: 50 74 72 2d 3e 62 79 74 65 73 29 0a 09 29 20 7b  Ptr->bytes)..) {
b600: 0a 09 20 20 20 20 67 6f 74 6f 20 64 6f 43 6f 6d  ..    goto doCom
b610: 70 69 6c 61 74 69 6f 6e 3b 0a 09 7d 0a 20 20 20  pilation;..}.   
b620: 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 64 6f   } else {.    do
b630: 43 6f 6d 70 69 6c 61 74 69 6f 6e 3a 0a 09 72 65  Compilation:..re
b640: 73 75 6c 74 20 3d 20 54 63 6c 50 72 6f 63 43 6f  sult = TclProcCo
b650: 6d 70 69 6c 65 50 72 6f 63 28 69 6e 74 65 72 70  mpileProc(interp
b660: 2c 20 70 72 6f 63 50 74 72 2c 20 70 72 6f 63 50  , procPtr, procP
b670: 74 72 2d 3e 62 6f 64 79 50 74 72 2c 20 6e 73 50  tr->bodyPtr, nsP
b680: 74 72 2c 0a 09 09 28 69 73 4c 61 6d 62 64 61 20  tr,...(isLambda 
b690: 3f 20 22 62 6f 64 79 20 6f 66 20 6c 61 6d 62 64  ? "body of lambd
b6a0: 61 20 74 65 72 6d 22 20 3a 20 22 62 6f 64 79 20  a term" : "body 
b6b0: 6f 66 20 70 72 6f 63 22 29 2c 0a 09 09 54 63 6c  of proc"),...Tcl
b6c0: 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 5b 69  GetString(objv[i
b6d0: 73 4c 61 6d 62 64 61 5d 29 29 3b 0a 09 69 66 20  sLambda]));..if 
b6e0: 28 72 65 73 75 6c 74 20 21 3d 20 54 43 4c 5f 4f  (result != TCL_O
b6f0: 4b 29 20 7b 0a 09 20 20 20 20 72 65 74 75 72 6e  K) {..    return
b700: 20 72 65 73 75 6c 74 3b 0a 09 7d 0a 20 20 20 20   result;..}.    
b710: 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a  }..    /*.     *
b720: 20 53 65 74 20 75 70 20 61 6e 64 20 70 75 73 68   Set up and push
b730: 20 61 20 6e 65 77 20 63 61 6c 6c 20 66 72 61 6d   a new call fram
b740: 65 20 66 6f 72 20 74 68 65 20 6e 65 77 20 70 72  e for the new pr
b750: 6f 63 65 64 75 72 65 20 69 6e 76 6f 63 61 74 69  ocedure invocati
b760: 6f 6e 2e 0a 20 20 20 20 20 2a 20 54 68 69 73 20  on..     * This 
b770: 63 61 6c 6c 20 66 72 61 6d 65 20 77 69 6c 6c 20  call frame will 
b780: 65 78 65 63 75 74 65 20 69 6e 20 74 68 65 20 70  execute in the p
b790: 72 6f 63 27 73 20 6e 61 6d 65 73 70 61 63 65 2c  roc's namespace,
b7a0: 20 77 68 69 63 68 20 6d 69 67 68 74 20 62 65 0a   which might be.
b7b0: 20 20 20 20 20 2a 20 64 69 66 66 65 72 65 6e 74       * different
b7c0: 20 74 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e   than the curren
b7d0: 74 20 6e 61 6d 65 73 70 61 63 65 2e 20 54 68 65  t namespace. The
b7e0: 20 70 72 6f 63 27 73 20 6e 61 6d 65 73 70 61 63   proc's namespac
b7f0: 65 20 69 73 20 74 68 61 74 20 6f 66 0a 20 20 20  e is that of.   
b800: 20 20 2a 20 69 74 73 20 63 6f 6d 6d 61 6e 64 2c    * its command,
b810: 20 77 68 69 63 68 20 63 61 6e 20 63 68 61 6e 67   which can chang
b820: 65 20 69 66 20 74 68 65 20 63 6f 6d 6d 61 6e 64  e if the command
b830: 20 69 73 20 72 65 6e 61 6d 65 64 20 66 72 6f 6d   is renamed from
b840: 20 6f 6e 65 0a 20 20 20 20 20 2a 20 6e 61 6d 65   one.     * name
b850: 73 70 61 63 65 20 74 6f 20 61 6e 6f 74 68 65 72  space to another
b860: 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 66  ..     */..    f
b870: 72 61 6d 65 50 74 72 50 74 72 20 3d 20 26 66 72  ramePtrPtr = &fr
b880: 61 6d 65 50 74 72 3b 0a 20 20 20 20 28 76 6f 69  amePtr;.    (voi
b890: 64 29 20 54 63 6c 50 75 73 68 53 74 61 63 6b 46  d) TclPushStackF
b8a0: 72 61 6d 65 28 69 6e 74 65 72 70 2c 20 28 54 63  rame(interp, (Tc
b8b0: 6c 5f 43 61 6c 6c 46 72 61 6d 65 20 2a 2a 29 20  l_CallFrame **) 
b8c0: 66 72 61 6d 65 50 74 72 50 74 72 2c 0a 09 20 20  framePtrPtr,..  
b8d0: 20 20 28 54 63 6c 5f 4e 61 6d 65 73 70 61 63 65    (Tcl_Namespace
b8e0: 20 2a 29 20 6e 73 50 74 72 2c 0a 09 20 20 20 20   *) nsPtr,..    
b8f0: 28 69 73 4c 61 6d 62 64 61 3f 20 28 46 52 41 4d  (isLambda? (FRAM
b900: 45 5f 49 53 5f 50 52 4f 43 7c 46 52 41 4d 45 5f  E_IS_PROC|FRAME_
b910: 49 53 5f 4c 41 4d 42 44 41 29 20 3a 20 46 52 41  IS_LAMBDA) : FRA
b920: 4d 45 5f 49 53 5f 50 52 4f 43 29 29 3b 0a 0a 20  ME_IS_PROC));.. 
b930: 20 20 20 66 72 61 6d 65 50 74 72 2d 3e 6f 62 6a     framePtr->obj
b940: 63 20 3d 20 6f 62 6a 63 3b 0a 20 20 20 20 66 72  c = objc;.    fr
b950: 61 6d 65 50 74 72 2d 3e 6f 62 6a 76 20 3d 20 6f  amePtr->objv = o
b960: 62 6a 76 3b 0a 20 20 20 20 66 72 61 6d 65 50 74  bjv;.    framePt
b970: 72 2d 3e 70 72 6f 63 50 74 72 20 3d 20 70 72 6f  r->procPtr = pro
b980: 63 50 74 72 3b 0a 0a 20 20 20 20 72 65 74 75 72  cPtr;..    retur
b990: 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a  n TCL_OK;.}.../*
b9a0: 0a 20 2a 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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
b9e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20  ---------. *. * 
b9f0: 54 63 6c 4f 62 6a 49 6e 74 65 72 70 50 72 6f 63  TclObjInterpProc
ba00: 20 2d 2d 0a 20 2a 0a 20 2a 09 57 68 65 6e 20 61   --. *. *.When a
ba10: 20 54 63 6c 20 70 72 6f 63 65 64 75 72 65 20 67   Tcl procedure g
ba20: 65 74 73 20 69 6e 76 6f 6b 65 64 20 64 75 72 69  ets invoked duri
ba30: 6e 67 20 62 79 74 65 63 6f 64 65 20 65 76 61 6c  ng bytecode eval
ba40: 75 61 74 69 6f 6e 2c 20 74 68 69 73 0a 20 2a 09  uation, this. *.
ba50: 6f 62 6a 65 63 74 2d 62 61 73 65 64 20 72 6f 75  object-based rou
ba60: 74 69 6e 65 20 67 65 74 73 20 69 6e 76 6f 6b 65  tine gets invoke
ba70: 64 20 74 6f 20 69 6e 74 65 72 70 72 65 74 20 74  d to interpret t
ba80: 68 65 20 70 72 6f 63 65 64 75 72 65 2e 0a 20 2a  he procedure.. *
ba90: 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09  . * Results:. *.
baa0: 41 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 6f  A standard Tcl o
bab0: 62 6a 65 63 74 20 72 65 73 75 6c 74 20 76 61 6c  bject result val
bac0: 75 65 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65  ue.. *. * Side e
bad0: 66 66 65 63 74 73 3a 0a 20 2a 09 44 65 70 65 6e  ffects:. *.Depen
bae0: 64 73 20 6f 6e 20 74 68 65 20 63 6f 6d 6d 61 6e  ds on the comman
baf0: 64 73 20 69 6e 20 74 68 65 20 70 72 6f 63 65 64  ds in the proced
bb00: 75 72 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  ure.. *. *------
bb10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bb20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bb30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bb40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bb50: 0a 20 2a 2f 0a 0a 69 6e 74 0a 54 63 6c 4f 62 6a  . */..int.TclObj
bb60: 49 6e 74 65 72 70 50 72 6f 63 28 0a 20 20 20 20  InterpProc(.    
bb70: 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e  ClientData clien
bb80: 74 44 61 74 61 2c 09 2f 2a 20 52 65 63 6f 72 64  tData,./* Record
bb90: 20 64 65 73 63 72 69 62 69 6e 67 20 70 72 6f 63   describing proc
bba0: 65 64 75 72 65 20 74 6f 20 62 65 0a 09 09 09 09  edure to be.....
bbb0: 20 2a 20 69 6e 74 65 72 70 72 65 74 65 64 2e 20   * interpreted. 
bbc0: 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72  */.    Tcl_Inter
bbd0: 70 20 2a 69 6e 74 65 72 70 2c 2f 2a 20 49 6e 74  p *interp,/* Int
bbe0: 65 72 70 72 65 74 65 72 20 69 6e 20 77 68 69 63  erpreter in whic
bbf0: 68 20 70 72 6f 63 65 64 75 72 65 20 77 61 73 0a  h procedure was.
bc00: 09 09 09 09 20 2a 20 69 6e 76 6f 6b 65 64 2e 20  .... * invoked. 
bc10: 2a 2f 0a 20 20 20 20 69 6e 74 20 6f 62 6a 63 2c  */.    int objc,
bc20: 09 09 09 2f 2a 20 43 6f 75 6e 74 20 6f 66 20 6e  .../* Count of n
bc30: 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
bc40: 74 73 20 74 6f 20 74 68 69 73 0a 09 09 09 09 20  ts to this..... 
bc50: 2a 20 70 72 6f 63 65 64 75 72 65 2e 20 2a 2f 0a  * procedure. */.
bc60: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e      Tcl_Obj *con
bc70: 73 74 20 6f 62 6a 76 5b 5d 29 09 2f 2a 20 41 72  st objv[])./* Ar
bc80: 67 75 6d 65 6e 74 20 76 61 6c 75 65 20 6f 62 6a  gument value obj
bc90: 65 63 74 73 2e 20 2a 2f 0a 7b 0a 20 20 20 20 2f  ects. */.{.    /
bca0: 2a 0a 20 20 20 20 20 2a 20 4e 6f 74 20 75 73 65  *.     * Not use
bcb0: 64 20 6d 75 63 68 20 69 6e 20 74 68 65 20 63 6f  d much in the co
bcc0: 72 65 3b 20 65 78 74 65 72 6e 61 6c 20 69 6e 74  re; external int
bcd0: 65 72 66 61 63 65 20 66 6f 72 20 69 54 63 6c 0a  erface for iTcl.
bce0: 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 72 65 74       */..    ret
bcf0: 75 72 6e 20 54 63 6c 5f 4e 52 43 61 6c 6c 4f 62  urn Tcl_NRCallOb
bd00: 6a 50 72 6f 63 28 69 6e 74 65 72 70 2c 20 54 63  jProc(interp, Tc
bd10: 6c 4e 52 49 6e 74 65 72 70 50 72 6f 63 2c 20 63  lNRInterpProc, c
bd20: 6c 69 65 6e 74 44 61 74 61 2c 20 6f 62 6a 63 2c  lientData, objc,
bd30: 20 6f 62 6a 76 29 3b 0a 7d 0a 0a 69 6e 74 0a 54   objv);.}..int.T
bd40: 63 6c 4e 52 49 6e 74 65 72 70 50 72 6f 63 28 0a  clNRInterpProc(.
bd50: 20 20 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63      ClientData c
bd60: 6c 69 65 6e 74 44 61 74 61 2c 09 2f 2a 20 52 65  lientData,./* Re
bd70: 63 6f 72 64 20 64 65 73 63 72 69 62 69 6e 67 20  cord describing 
bd80: 70 72 6f 63 65 64 75 72 65 20 74 6f 20 62 65 0a  procedure to be.
bd90: 09 09 09 09 20 2a 20 69 6e 74 65 72 70 72 65 74  .... * interpret
bda0: 65 64 2e 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49  ed. */.    Tcl_I
bdb0: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 2f 2a  nterp *interp,/*
bdc0: 20 49 6e 74 65 72 70 72 65 74 65 72 20 69 6e 20   Interpreter in 
bdd0: 77 68 69 63 68 20 70 72 6f 63 65 64 75 72 65 20  which procedure 
bde0: 77 61 73 0a 09 09 09 09 20 2a 20 69 6e 76 6f 6b  was..... * invok
bdf0: 65 64 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6f  ed. */.    int o
be00: 62 6a 63 2c 09 09 09 2f 2a 20 43 6f 75 6e 74 20  bjc,.../* Count 
be10: 6f 66 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67  of number of arg
be20: 75 6d 65 6e 74 73 20 74 6f 20 74 68 69 73 0a 09  uments to this..
be30: 09 09 09 20 2a 20 70 72 6f 63 65 64 75 72 65 2e  ... * procedure.
be40: 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20   */.    Tcl_Obj 
be50: 2a 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 09 2f  *const objv[])./
be60: 2a 20 41 72 67 75 6d 65 6e 74 20 76 61 6c 75 65  * Argument value
be70: 20 6f 62 6a 65 63 74 73 2e 20 2a 2f 0a 7b 0a 20   objects. */.{. 
be80: 20 20 20 69 6e 74 20 72 65 73 75 6c 74 20 3d 20     int result = 
be90: 54 63 6c 50 75 73 68 50 72 6f 63 43 61 6c 6c 46  TclPushProcCallF
bea0: 72 61 6d 65 28 63 6c 69 65 6e 74 44 61 74 61 2c  rame(clientData,
beb0: 20 69 6e 74 65 72 70 2c 20 6f 62 6a 63 2c 20 6f   interp, objc, o
bec0: 62 6a 76 2c 0a 09 20 20 20 20 2f 2a 69 73 4c 61  bjv,..    /*isLa
bed0: 6d 62 64 61 2a 2f 20 30 29 3b 0a 0a 20 20 20 20  mbda*/ 0);..    
bee0: 69 66 20 28 72 65 73 75 6c 74 20 21 3d 20 54 43  if (result != TC
bef0: 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20  L_OK) {..return 
bf00: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
bf10: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 63 6c 4e  .    return TclN
bf20: 52 49 6e 74 65 72 70 50 72 6f 63 43 6f 72 65 28  RInterpProcCore(
bf30: 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 30 5d 2c  interp, objv[0],
bf40: 20 31 2c 20 26 4d 61 6b 65 50 72 6f 63 45 72 72   1, &MakeProcErr
bf50: 6f 72 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d  or);.}.../*. *--
bf60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bf70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bf80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bf90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
bfa0: 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 63 6c 4e 52  ----. *. * TclNR
bfb0: 49 6e 74 65 72 70 50 72 6f 63 43 6f 72 65 20 2d  InterpProcCore -
bfc0: 2d 0a 20 2a 0a 20 2a 09 57 68 65 6e 20 61 20 54  -. *. *.When a T
bfd0: 63 6c 20 70 72 6f 63 65 64 75 72 65 2c 20 6c 61  cl procedure, la
bfe0: 6d 62 64 61 20 74 65 72 6d 20 6f 72 20 61 6e 79  mbda term or any
bff0: 74 68 69 6e 67 20 65 6c 73 65 20 74 68 61 74 20  thing else that 
c000: 77 6f 72 6b 73 20 6c 69 6b 65 20 61 0a 20 2a 09  works like a. *.
c010: 70 72 6f 63 65 64 75 72 65 20 67 65 74 73 20 69  procedure gets i
c020: 6e 76 6f 6b 65 64 20 64 75 72 69 6e 67 20 62 79  nvoked during by
c030: 74 65 63 6f 64 65 20 65 76 61 6c 75 61 74 69 6f  tecode evaluatio
c040: 6e 2c 20 74 68 69 73 20 6f 62 6a 65 63 74 2d 62  n, this object-b
c050: 61 73 65 64 0a 20 2a 09 72 6f 75 74 69 6e 65 20  ased. *.routine 
c060: 67 65 74 73 20 69 6e 76 6f 6b 65 64 20 74 6f 20  gets invoked to 
c070: 69 6e 74 65 72 70 72 65 74 20 74 68 65 20 62 6f  interpret the bo
c080: 64 79 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74  dy.. *. * Result
c090: 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64  s:. *.A standard
c0a0: 20 54 63 6c 20 6f 62 6a 65 63 74 20 72 65 73 75   Tcl object resu
c0b0: 6c 74 20 76 61 6c 75 65 2e 0a 20 2a 0a 20 2a 20  lt value.. *. * 
c0c0: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a  Side effects:. *
c0d0: 09 4e 65 61 72 6c 79 20 61 6e 79 74 68 69 6e 67  .Nearly anything
c0e0: 3b 20 64 65 70 65 6e 64 73 20 6f 6e 20 74 68 65  ; depends on the
c0f0: 20 63 6f 6d 6d 61 6e 64 73 20 69 6e 20 74 68 65   commands in the
c100: 20 70 72 6f 63 65 64 75 72 65 20 62 6f 64 79 2e   procedure body.
c110: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *. *----------
c120: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c130: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c140: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c150: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f  ------------. */
c160: 0a 0a 69 6e 74 0a 54 63 6c 4e 52 49 6e 74 65 72  ..int.TclNRInter
c170: 70 50 72 6f 63 43 6f 72 65 28 0a 20 20 20 20 54  pProcCore(.    T
c180: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
c190: 70 2c 2f 2a 20 49 6e 74 65 72 70 72 65 74 65 72  p,/* Interpreter
c1a0: 20 69 6e 20 77 68 69 63 68 20 70 72 6f 63 65 64   in which proced
c1b0: 75 72 65 20 77 61 73 0a 09 09 09 09 20 2a 20 69  ure was..... * i
c1c0: 6e 76 6f 6b 65 64 2e 20 2a 2f 0a 20 20 20 20 54  nvoked. */.    T
c1d0: 63 6c 5f 4f 62 6a 20 2a 70 72 6f 63 4e 61 6d 65  cl_Obj *procName
c1e0: 4f 62 6a 2c 09 2f 2a 20 50 72 6f 63 65 64 75 72  Obj,./* Procedur
c1f0: 65 20 6e 61 6d 65 20 66 6f 72 20 65 72 72 6f 72  e name for error
c200: 20 72 65 70 6f 72 74 69 6e 67 2e 20 2a 2f 0a 20   reporting. */. 
c210: 20 20 20 69 6e 74 20 73 6b 69 70 2c 09 09 09 2f     int skip,.../
c220: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 69 6e 69 74  * Number of init
c230: 69 61 6c 20 61 72 67 75 6d 65 6e 74 73 20 74 6f  ial arguments to
c240: 20 62 65 20 73 6b 69 70 70 65 64 2c 0a 09 09 09   be skipped,....
c250: 09 20 2a 20 69 2e 65 2e 2c 20 77 6f 72 64 73 20  . * i.e., words 
c260: 69 6e 20 74 68 65 20 22 63 6f 6d 6d 61 6e 64 20  in the "command 
c270: 6e 61 6d 65 22 2e 20 2a 2f 0a 20 20 20 20 50 72  name". */.    Pr
c280: 6f 63 45 72 72 6f 72 50 72 6f 63 20 2a 65 72 72  ocErrorProc *err
c290: 6f 72 50 72 6f 63 29 09 2f 2a 20 48 6f 77 20 74  orProc)./* How t
c2a0: 6f 20 63 6f 6e 76 65 72 74 20 72 65 73 75 6c 74  o convert result
c2b0: 73 20 66 72 6f 6d 20 74 68 65 20 73 63 72 69 70  s from the scrip
c2c0: 74 20 69 6e 74 6f 0a 09 09 09 09 20 2a 20 72 65  t into..... * re
c2d0: 73 75 6c 74 73 20 6f 66 20 74 68 65 20 6f 76 65  sults of the ove
c2e0: 72 61 6c 6c 20 70 72 6f 63 65 64 75 72 65 2e 20  rall procedure. 
c2f0: 2a 2f 0a 7b 0a 20 20 20 20 49 6e 74 65 72 70 20  */.{.    Interp 
c300: 2a 69 50 74 72 20 3d 20 28 49 6e 74 65 72 70 20  *iPtr = (Interp 
c310: 2a 29 20 69 6e 74 65 72 70 3b 0a 20 20 20 20 50  *) interp;.    P
c320: 72 6f 63 20 2a 70 72 6f 63 50 74 72 20 3d 20 69  roc *procPtr = i
c330: 50 74 72 2d 3e 76 61 72 46 72 61 6d 65 50 74 72  Ptr->varFramePtr
c340: 2d 3e 70 72 6f 63 50 74 72 3b 0a 20 20 20 20 69  ->procPtr;.    i
c350: 6e 74 20 72 65 73 75 6c 74 3b 0a 20 20 20 20 43  nt result;.    C
c360: 61 6c 6c 46 72 61 6d 65 20 2a 66 72 65 65 50 74  allFrame *freePt
c370: 72 3b 0a 20 20 20 20 42 79 74 65 43 6f 64 65 20  r;.    ByteCode 
c380: 2a 63 6f 64 65 50 74 72 3b 0a 0a 20 20 20 20 72  *codePtr;..    r
c390: 65 73 75 6c 74 20 3d 20 49 6e 69 74 41 72 67 73  esult = InitArgs
c3a0: 41 6e 64 4c 6f 63 61 6c 73 28 69 6e 74 65 72 70  AndLocals(interp
c3b0: 2c 20 70 72 6f 63 4e 61 6d 65 4f 62 6a 2c 20 73  , procNameObj, s
c3c0: 6b 69 70 29 3b 0a 20 20 20 20 69 66 20 28 72 65  kip);.    if (re
c3d0: 73 75 6c 74 20 21 3d 20 54 43 4c 5f 4f 4b 29 20  sult != TCL_OK) 
c3e0: 7b 0a 09 66 72 65 65 50 74 72 20 3d 20 69 50 74  {..freePtr = iPt
c3f0: 72 2d 3e 66 72 61 6d 65 50 74 72 3b 0a 09 54 63  r->framePtr;..Tc
c400: 6c 5f 50 6f 70 43 61 6c 6c 46 72 61 6d 65 28 69  l_PopCallFrame(i
c410: 6e 74 65 72 70 29 3b 09 2f 2a 20 50 6f 70 20 62  nterp);./* Pop b
c420: 75 74 20 64 6f 20 6e 6f 74 20 66 72 65 65 2e 20  ut do not free. 
c430: 2a 2f 0a 09 54 63 6c 53 74 61 63 6b 46 72 65 65  */..TclStackFree
c440: 28 69 6e 74 65 72 70 2c 20 66 72 65 65 50 74 72  (interp, freePtr
c450: 2d 3e 63 6f 6d 70 69 6c 65 64 4c 6f 63 61 6c 73  ->compiledLocals
c460: 29 3b 0a 09 09 09 09 09 2f 2a 20 46 72 65 65 20  );....../* Free 
c470: 63 6f 6d 70 69 6c 65 64 4c 6f 63 61 6c 73 2e 20  compiledLocals. 
c480: 2a 2f 0a 09 54 63 6c 53 74 61 63 6b 46 72 65 65  */..TclStackFree
c490: 28 69 6e 74 65 72 70 2c 20 66 72 65 65 50 74 72  (interp, freePtr
c4a0: 29 3b 09 2f 2a 20 46 72 65 65 20 43 61 6c 6c 46  );./* Free CallF
c4b0: 72 61 6d 65 2e 20 2a 2f 0a 09 72 65 74 75 72 6e  rame. */..return
c4c0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
c4d0: 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 54  }..#if defined(T
c4e0: 43 4c 5f 43 4f 4d 50 49 4c 45 5f 44 45 42 55 47  CL_COMPILE_DEBUG
c4f0: 29 0a 20 20 20 20 69 66 20 28 74 63 6c 54 72 61  ).    if (tclTra
c500: 63 65 45 78 65 63 20 3e 3d 20 31 29 20 7b 0a 09  ceExec >= 1) {..
c510: 43 61 6c 6c 46 72 61 6d 65 20 2a 66 72 61 6d 65  CallFrame *frame
c520: 50 74 72 20 3d 20 69 50 74 72 2d 3e 76 61 72 46  Ptr = iPtr->varF
c530: 72 61 6d 65 50 74 72 3b 0a 09 69 6e 74 20 69 3b  ramePtr;..int i;
c540: 0a 0a 09 69 66 20 28 66 72 61 6d 65 50 74 72 2d  ...if (framePtr-
c550: 3e 69 73 50 72 6f 63 43 61 6c 6c 46 72 61 6d 65  >isProcCallFrame
c560: 20 26 20 46 52 41 4d 45 5f 49 53 5f 4c 41 4d 42   & FRAME_IS_LAMB
c570: 44 41 29 20 7b 0a 09 20 20 20 20 66 70 72 69 6e  DA) {..    fprin
c580: 74 66 28 73 74 64 6f 75 74 2c 20 22 43 61 6c 6c  tf(stdout, "Call
c590: 69 6e 67 20 6c 61 6d 62 64 61 20 22 29 3b 0a 09  ing lambda ");..
c5a0: 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 66 70  } else {..    fp
c5b0: 72 69 6e 74 66 28 73 74 64 6f 75 74 2c 20 22 43  rintf(stdout, "C
c5c0: 61 6c 6c 69 6e 67 20 70 72 6f 63 20 22 29 3b 0a  alling proc ");.
c5d0: 09 7d 0a 09 66 6f 72 20 28 69 20 3d 20 30 3b 20  .}..for (i = 0; 
c5e0: 69 20 3c 20 66 72 61 6d 65 50 74 72 2d 3e 6f 62  i < framePtr->ob
c5f0: 6a 63 3b 20 69 2b 2b 29 20 7b 0a 09 20 20 20 20  jc; i++) {..    
c600: 54 63 6c 50 72 69 6e 74 4f 62 6a 65 63 74 28 73  TclPrintObject(s
c610: 74 64 6f 75 74 2c 20 66 72 61 6d 65 50 74 72 2d  tdout, framePtr-
c620: 3e 6f 62 6a 76 5b 69 5d 2c 20 31 35 29 3b 0a 09  >objv[i], 15);..
c630: 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 6f      fprintf(stdo
c640: 75 74 2c 20 22 20 22 29 3b 0a 09 7d 0a 09 66 70  ut, " ");..}..fp
c650: 72 69 6e 74 66 28 73 74 64 6f 75 74 2c 20 22 5c  rintf(stdout, "\
c660: 6e 22 29 3b 0a 09 66 66 6c 75 73 68 28 73 74 64  n");..fflush(std
c670: 6f 75 74 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  out);.    }.#end
c680: 69 66 20 2f 2a 54 43 4c 5f 43 4f 4d 50 49 4c 45  if /*TCL_COMPILE
c690: 5f 44 45 42 55 47 2a 2f 0a 0a 23 69 66 64 65 66  _DEBUG*/..#ifdef
c6a0: 20 55 53 45 5f 44 54 52 41 43 45 0a 20 20 20 20   USE_DTRACE.    
c6b0: 69 66 20 28 54 43 4c 5f 44 54 52 41 43 45 5f 50  if (TCL_DTRACE_P
c6c0: 52 4f 43 5f 41 52 47 53 5f 45 4e 41 42 4c 45 44  ROC_ARGS_ENABLED
c6d0: 28 29 29 20 7b 0a 09 69 6e 74 20 6c 20 3d 20 69  ()) {..int l = i
c6e0: 50 74 72 2d 3e 76 61 72 46 72 61 6d 65 50 74 72  Ptr->varFramePtr
c6f0: 2d 3e 69 73 50 72 6f 63 43 61 6c 6c 46 72 61 6d  ->isProcCallFram
c700: 65 20 26 20 46 52 41 4d 45 5f 49 53 5f 4c 41 4d  e & FRAME_IS_LAM
c710: 42 44 41 20 3f 20 31 20 3a 20 30 3b 0a 09 63 6f  BDA ? 1 : 0;..co
c720: 6e 73 74 20 63 68 61 72 20 2a 61 5b 31 30 5d 3b  nst char *a[10];
c730: 0a 09 69 6e 74 20 69 3b 0a 0a 09 66 6f 72 20 28  ..int i;...for (
c740: 69 20 3d 20 30 20 3b 20 69 20 3c 20 31 30 20 3b  i = 0 ; i < 10 ;
c750: 20 69 2b 2b 29 20 7b 0a 09 20 20 20 20 61 5b 69   i++) {..    a[i
c760: 5d 20 3d 20 28 6c 20 3c 20 69 50 74 72 2d 3e 76  ] = (l < iPtr->v
c770: 61 72 46 72 61 6d 65 50 74 72 2d 3e 6f 62 6a 63  arFramePtr->objc
c780: 20 3f 0a 09 09 20 20 20 20 54 63 6c 47 65 74 53   ?...    TclGetS
c790: 74 72 69 6e 67 28 69 50 74 72 2d 3e 76 61 72 46  tring(iPtr->varF
c7a0: 72 61 6d 65 50 74 72 2d 3e 6f 62 6a 76 5b 6c 5d  ramePtr->objv[l]
c7b0: 29 20 3a 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20  ) : NULL);..    
c7c0: 6c 2b 2b 3b 0a 09 7d 0a 09 54 43 4c 5f 44 54 52  l++;..}..TCL_DTR
c7d0: 41 43 45 5f 50 52 4f 43 5f 41 52 47 53 28 61 5b  ACE_PROC_ARGS(a[
c7e0: 30 5d 2c 20 61 5b 31 5d 2c 20 61 5b 32 5d 2c 20  0], a[1], a[2], 
c7f0: 61 5b 33 5d 2c 20 61 5b 34 5d 2c 20 61 5b 35 5d  a[3], a[4], a[5]
c800: 2c 20 61 5b 36 5d 2c 20 61 5b 37 5d 2c 0a 09 09  , a[6], a[7],...
c810: 61 5b 38 5d 2c 20 61 5b 39 5d 29 3b 0a 20 20 20  a[8], a[9]);.   
c820: 20 7d 0a 20 20 20 20 69 66 20 28 54 43 4c 5f 44   }.    if (TCL_D
c830: 54 52 41 43 45 5f 50 52 4f 43 5f 49 4e 46 4f 5f  TRACE_PROC_INFO_
c840: 45 4e 41 42 4c 45 44 28 29 20 26 26 20 69 50 74  ENABLED() && iPt
c850: 72 2d 3e 63 6d 64 46 72 61 6d 65 50 74 72 29 20  r->cmdFramePtr) 
c860: 7b 0a 09 54 63 6c 5f 4f 62 6a 20 2a 69 6e 66 6f  {..Tcl_Obj *info
c870: 20 3d 20 54 63 6c 49 6e 66 6f 46 72 61 6d 65 28   = TclInfoFrame(
c880: 69 6e 74 65 72 70 2c 20 69 50 74 72 2d 3e 63 6d  interp, iPtr->cm
c890: 64 46 72 61 6d 65 50 74 72 29 3b 0a 09 63 6f 6e  dFramePtr);..con
c8a0: 73 74 20 63 68 61 72 20 2a 61 5b 36 5d 3b 20 69  st char *a[6]; i
c8b0: 6e 74 20 69 5b 32 5d 3b 0a 0a 09 54 63 6c 44 54  nt i[2];...TclDT
c8c0: 72 61 63 65 49 6e 66 6f 28 69 6e 66 6f 2c 20 61  raceInfo(info, a
c8d0: 2c 20 69 29 3b 0a 09 54 43 4c 5f 44 54 52 41 43  , i);..TCL_DTRAC
c8e0: 45 5f 50 52 4f 43 5f 49 4e 46 4f 28 61 5b 30 5d  E_PROC_INFO(a[0]
c8f0: 2c 20 61 5b 31 5d 2c 20 61 5b 32 5d 2c 20 61 5b  , a[1], a[2], a[
c900: 33 5d 2c 20 69 5b 30 5d 2c 20 69 5b 31 5d 2c 20  3], i[0], i[1], 
c910: 61 5b 34 5d 2c 20 61 5b 35 5d 29 3b 0a 09 54 63  a[4], a[5]);..Tc
c920: 6c 44 65 63 72 52 65 66 43 6f 75 6e 74 28 69 6e  lDecrRefCount(in
c930: 66 6f 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  fo);.    }.    i
c940: 66 20 28 54 43 4c 5f 44 54 52 41 43 45 5f 50 52  f (TCL_DTRACE_PR
c950: 4f 43 5f 45 4e 54 52 59 5f 45 4e 41 42 4c 45 44  OC_ENTRY_ENABLED
c960: 28 29 29 20 7b 0a 09 69 6e 74 20 6c 20 3d 20 69  ()) {..int l = i
c970: 50 74 72 2d 3e 76 61 72 46 72 61 6d 65 50 74 72  Ptr->varFramePtr
c980: 2d 3e 69 73 50 72 6f 63 43 61 6c 6c 46 72 61 6d  ->isProcCallFram
c990: 65 20 26 20 46 52 41 4d 45 5f 49 53 5f 4c 41 4d  e & FRAME_IS_LAM
c9a0: 42 44 41 20 3f 20 31 20 3a 20 30 3b 0a 0a 09 54  BDA ? 1 : 0;...T
c9b0: 43 4c 5f 44 54 52 41 43 45 5f 50 52 4f 43 5f 45  CL_DTRACE_PROC_E
c9c0: 4e 54 52 59 28 6c 20 3c 20 69 50 74 72 2d 3e 76  NTRY(l < iPtr->v
c9d0: 61 72 46 72 61 6d 65 50 74 72 2d 3e 6f 62 6a 63  arFramePtr->objc
c9e0: 20 3f 0a 09 09 54 63 6c 47 65 74 53 74 72 69 6e   ?...TclGetStrin
c9f0: 67 28 69 50 74 72 2d 3e 76 61 72 46 72 61 6d 65  g(iPtr->varFrame
ca00: 50 74 72 2d 3e 6f 62 6a 76 5b 6c 5d 29 20 3a 20  Ptr->objv[l]) : 
ca10: 4e 55 4c 4c 2c 0a 09 09 69 50 74 72 2d 3e 76 61  NULL,...iPtr->va
ca20: 72 46 72 61 6d 65 50 74 72 2d 3e 6f 62 6a 63 20  rFramePtr->objc 
ca30: 2d 20 6c 20 2d 20 31 2c 0a 09 09 28 54 63 6c 5f  - l - 1,...(Tcl_
ca40: 4f 62 6a 20 2a 2a 29 28 69 50 74 72 2d 3e 76 61  Obj **)(iPtr->va
ca50: 72 46 72 61 6d 65 50 74 72 2d 3e 6f 62 6a 76 20  rFramePtr->objv 
ca60: 2b 20 6c 20 2b 20 31 29 29 3b 0a 20 20 20 20 7d  + l + 1));.    }
ca70: 0a 20 20 20 20 69 66 20 28 54 43 4c 5f 44 54 52  .    if (TCL_DTR
ca80: 41 43 45 5f 50 52 4f 43 5f 45 4e 54 52 59 5f 45  ACE_PROC_ENTRY_E
ca90: 4e 41 42 4c 45 44 28 29 29 20 7b 0a 09 69 6e 74  NABLED()) {..int
caa0: 20 6c 20 3d 20 69 50 74 72 2d 3e 76 61 72 46 72   l = iPtr->varFr
cab0: 61 6d 65 50 74 72 2d 3e 69 73 50 72 6f 63 43 61  amePtr->isProcCa
cac0: 6c 6c 46 72 61 6d 65 20 26 20 46 52 41 4d 45 5f  llFrame & FRAME_
cad0: 49 53 5f 4c 41 4d 42 44 41 20 3f 20 31 20 3a 20  IS_LAMBDA ? 1 : 
cae0: 30 3b 0a 0a 09 54 43 4c 5f 44 54 52 41 43 45 5f  0;...TCL_DTRACE_
caf0: 50 52 4f 43 5f 45 4e 54 52 59 28 6c 20 3c 20 69  PROC_ENTRY(l < i
cb00: 50 74 72 2d 3e 76 61 72 46 72 61 6d 65 50 74 72  Ptr->varFramePtr
cb10: 2d 3e 6f 62 6a 63 20 3f 0a 09 09 54 63 6c 47 65  ->objc ?...TclGe
cb20: 74 53 74 72 69 6e 67 28 69 50 74 72 2d 3e 76 61  tString(iPtr->va
cb30: 72 46 72 61 6d 65 50 74 72 2d 3e 6f 62 6a 76 5b  rFramePtr->objv[
cb40: 6c 5d 29 20 3a 20 4e 55 4c 4c 2c 0a 09 09 69 50  l]) : NULL,...iP
cb50: 74 72 2d 3e 76 61 72 46 72 61 6d 65 50 74 72 2d  tr->varFramePtr-
cb60: 3e 6f 62 6a 63 20 2d 20 6c 20 2d 20 31 2c 0a 09  >objc - l - 1,..
cb70: 09 28 54 63 6c 5f 4f 62 6a 20 2a 2a 29 28 69 50  .(Tcl_Obj **)(iP
cb80: 74 72 2d 3e 76 61 72 46 72 61 6d 65 50 74 72 2d  tr->varFramePtr-
cb90: 3e 6f 62 6a 76 20 2b 20 6c 20 2b 20 31 29 29 3b  >objv + l + 1));
cba0: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  .    }.#endif /*
cbb0: 20 55 53 45 5f 44 54 52 41 43 45 20 2a 2f 0a 0a   USE_DTRACE */..
cbc0: 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 49 6e      /*.     * In
cbd0: 76 6f 6b 65 20 74 68 65 20 63 6f 6d 6d 61 6e 64  voke the command
cbe0: 73 20 69 6e 20 74 68 65 20 70 72 6f 63 65 64 75  s in the procedu
cbf0: 72 65 27 73 20 62 6f 64 79 2e 0a 20 20 20 20 20  re's body..     
cc00: 2a 2f 0a 0a 20 20 20 20 70 72 6f 63 50 74 72 2d  */..    procPtr-
cc10: 3e 72 65 66 43 6f 75 6e 74 2b 2b 3b 0a 20 20 20  >refCount++;.   
cc20: 20 63 6f 64 65 50 74 72 20 3d 20 70 72 6f 63 50   codePtr = procP
cc30: 74 72 2d 3e 62 6f 64 79 50 74 72 2d 3e 69 6e 74  tr->bodyPtr->int
cc40: 65 72 6e 61 6c 52 65 70 2e 74 77 6f 50 74 72 56  ernalRep.twoPtrV
cc50: 61 6c 75 65 2e 70 74 72 31 3b 0a 0a 20 20 20 20  alue.ptr1;..    
cc60: 54 63 6c 4e 52 41 64 64 43 61 6c 6c 62 61 63 6b  TclNRAddCallback
cc70: 28 69 6e 74 65 72 70 2c 20 49 6e 74 65 72 70 50  (interp, InterpP
cc80: 72 6f 63 4e 52 32 2c 20 70 72 6f 63 4e 61 6d 65  rocNR2, procName
cc90: 4f 62 6a 2c 20 65 72 72 6f 72 50 72 6f 63 2c 0a  Obj, errorProc,.
cca0: 09 20 20 20 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29  .    NULL, NULL)
ccb0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 63 6c  ;.    return Tcl
ccc0: 4e 52 45 78 65 63 75 74 65 42 79 74 65 43 6f 64  NRExecuteByteCod
ccd0: 65 28 69 6e 74 65 72 70 2c 20 63 6f 64 65 50 74  e(interp, codePt
cce0: 72 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e  r);.}..static in
ccf0: 74 0a 49 6e 74 65 72 70 50 72 6f 63 4e 52 32 28  t.InterpProcNR2(
cd00: 0a 20 20 20 20 43 6c 69 65 6e 74 44 61 74 61 20  .    ClientData 
cd10: 64 61 74 61 5b 5d 2c 0a 20 20 20 20 54 63 6c 5f  data[],.    Tcl_
cd20: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a  Interp *interp,.
cd30: 20 20 20 20 69 6e 74 20 72 65 73 75 6c 74 29 0a      int result).
cd40: 7b 0a 20 20 20 20 49 6e 74 65 72 70 20 2a 69 50  {.    Interp *iP
cd50: 74 72 20 3d 20 28 49 6e 74 65 72 70 20 2a 29 20  tr = (Interp *) 
cd60: 69 6e 74 65 72 70 3b 0a 20 20 20 20 50 72 6f 63  interp;.    Proc
cd70: 20 2a 70 72 6f 63 50 74 72 20 3d 20 69 50 74 72   *procPtr = iPtr
cd80: 2d 3e 76 61 72 46 72 61 6d 65 50 74 72 2d 3e 70  ->varFramePtr->p
cd90: 72 6f 63 50 74 72 3b 0a 20 20 20 20 43 61 6c 6c  rocPtr;.    Call
cda0: 46 72 61 6d 65 20 2a 66 72 65 65 50 74 72 3b 0a  Frame *freePtr;.
cdb0: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 72 6f      Tcl_Obj *pro
cdc0: 63 4e 61 6d 65 4f 62 6a 20 3d 20 28 54 63 6c 5f  cNameObj = (Tcl_
cdd0: 4f 62 6a 20 2a 29 64 61 74 61 5b 30 5d 3b 0a 20  Obj *)data[0];. 
cde0: 20 20 20 50 72 6f 63 45 72 72 6f 72 50 72 6f 63     ProcErrorProc
cdf0: 20 2a 65 72 72 6f 72 50 72 6f 63 20 3d 20 28 50   *errorProc = (P
ce00: 72 6f 63 45 72 72 6f 72 50 72 6f 63 20 2a 29 64  rocErrorProc *)d
ce10: 61 74 61 5b 31 5d 3b 0a 0a 20 20 20 20 69 66 20  ata[1];..    if 
ce20: 28 54 43 4c 5f 44 54 52 41 43 45 5f 50 52 4f 43  (TCL_DTRACE_PROC
ce30: 5f 52 45 54 55 52 4e 5f 45 4e 41 42 4c 45 44 28  _RETURN_ENABLED(
ce40: 29 29 20 7b 0a 09 69 6e 74 20 6c 20 3d 20 69 50  )) {..int l = iP
ce50: 74 72 2d 3e 76 61 72 46 72 61 6d 65 50 74 72 2d  tr->varFramePtr-
ce60: 3e 69 73 50 72 6f 63 43 61 6c 6c 46 72 61 6d 65  >isProcCallFrame
ce70: 20 26 20 46 52 41 4d 45 5f 49 53 5f 4c 41 4d 42   & FRAME_IS_LAMB
ce80: 44 41 20 3f 20 31 20 3a 20 30 3b 0a 0a 09 54 43  DA ? 1 : 0;...TC
ce90: 4c 5f 44 54 52 41 43 45 5f 50 52 4f 43 5f 52 45  L_DTRACE_PROC_RE
cea0: 54 55 52 4e 28 6c 20 3c 20 69 50 74 72 2d 3e 76  TURN(l < iPtr->v
ceb0: 61 72 46 72 61 6d 65 50 74 72 2d 3e 6f 62 6a 63  arFramePtr->objc
cec0: 20 3f 0a 09 09 54 63 6c 47 65 74 53 74 72 69 6e   ?...TclGetStrin
ced0: 67 28 69 50 74 72 2d 3e 76 61 72 46 72 61 6d 65  g(iPtr->varFrame
cee0: 50 74 72 2d 3e 6f 62 6a 76 5b 6c 5d 29 20 3a 20  Ptr->objv[l]) : 
cef0: 4e 55 4c 4c 2c 20 72 65 73 75 6c 74 29 3b 0a 20  NULL, result);. 
cf00: 20 20 20 7d 0a 20 20 20 20 69 66 20 28 70 72 6f     }.    if (pro
cf10: 63 50 74 72 2d 3e 72 65 66 43 6f 75 6e 74 2d 2d  cPtr->refCount--
cf20: 20 3c 3d 20 31 29 20 7b 0a 09 54 63 6c 50 72 6f   <= 1) {..TclPro
cf30: 63 43 6c 65 61 6e 75 70 50 72 6f 63 28 70 72 6f  cCleanupProc(pro
cf40: 63 50 74 72 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  cPtr);.    }..  
cf50: 20 20 2f 2a 0a 20 20 20 20 20 2a 20 46 72 65 65    /*.     * Free
cf60: 20 74 68 65 20 73 74 61 63 6b 2d 61 6c 6c 6f 63   the stack-alloc
cf70: 61 74 65 64 20 63 6f 6d 70 69 6c 65 64 20 6c 6f  ated compiled lo
cf80: 63 61 6c 73 20 61 6e 64 20 43 61 6c 6c 46 72 61  cals and CallFra
cf90: 6d 65 2e 20 49 74 20 69 73 20 69 6d 70 6f 72 74  me. It is import
cfa0: 61 6e 74 0a 20 20 20 20 20 2a 20 74 6f 20 70 6f  ant.     * to po
cfb0: 70 20 74 68 65 20 63 61 6c 6c 20 66 72 61 6d 65  p the call frame
cfc0: 20 77 69 74 68 6f 75 74 20 66 72 65 65 69 6e 67   without freeing
cfd0: 20 69 74 20 66 69 72 73 74 3a 20 74 68 65 20 63   it first: the c
cfe0: 6f 6d 70 69 6c 65 64 4c 6f 63 61 6c 73 0a 20 20  ompiledLocals.  
cff0: 20 20 20 2a 20 63 61 6e 6e 6f 74 20 62 65 20 66     * cannot be f
d000: 72 65 65 64 20 62 65 66 6f 72 65 20 74 68 65 20  reed before the 
d010: 66 72 61 6d 65 20 69 73 20 70 6f 70 70 65 64 2c  frame is popped,
d020: 20 61 73 20 74 68 65 20 6c 6f 63 61 6c 20 76 61   as the local va
d030: 72 69 61 62 6c 65 73 20 6d 75 73 74 0a 20 20 20  riables must.   
d040: 20 20 2a 20 62 65 20 64 65 6c 65 74 65 64 2e 20    * be deleted. 
d050: 42 75 74 20 74 68 65 20 63 6f 6d 70 69 6c 65 64  But the compiled
d060: 4c 6f 63 61 6c 73 20 6d 75 73 74 20 62 65 20 66  Locals must be f
d070: 72 65 65 64 20 66 69 72 73 74 2c 20 61 73 20 74  reed first, as t
d080: 68 65 79 20 77 65 72 65 0a 20 20 20 20 20 2a 20  hey were.     * 
d090: 61 6c 6c 6f 63 61 74 65 64 20 6c 61 74 65 72 20  allocated later 
d0a0: 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 0a 20 20  on the stack..  
d0b0: 20 20 20 2a 2f 0a 0a 20 20 20 20 69 66 20 28 72     */..    if (r
d0c0: 65 73 75 6c 74 20 21 3d 20 54 43 4c 5f 4f 4b 29  esult != TCL_OK)
d0d0: 20 7b 0a 09 67 6f 74 6f 20 70 72 6f 63 65 73 73   {..goto process
d0e0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 64 6f 6e  ;.    }..    don
d0f0: 65 3a 0a 20 20 20 20 69 66 20 28 54 43 4c 5f 44  e:.    if (TCL_D
d100: 54 52 41 43 45 5f 50 52 4f 43 5f 52 45 53 55 4c  TRACE_PROC_RESUL
d110: 54 5f 45 4e 41 42 4c 45 44 28 29 29 20 7b 0a 09  T_ENABLED()) {..
d120: 69 6e 74 20 6c 20 3d 20 69 50 74 72 2d 3e 76 61  int l = iPtr->va
d130: 72 46 72 61 6d 65 50 74 72 2d 3e 69 73 50 72 6f  rFramePtr->isPro
d140: 63 43 61 6c 6c 46 72 61 6d 65 20 26 20 46 52 41  cCallFrame & FRA
d150: 4d 45 5f 49 53 5f 4c 41 4d 42 44 41 20 3f 20 31  ME_IS_LAMBDA ? 1
d160: 20 3a 20 30 3b 0a 09 54 63 6c 5f 4f 62 6a 20 2a   : 0;..Tcl_Obj *
d170: 72 20 3d 20 54 63 6c 5f 47 65 74 4f 62 6a 52 65  r = Tcl_GetObjRe
d180: 73 75 6c 74 28 69 6e 74 65 72 70 29 3b 0a 0a 09  sult(interp);...
d190: 54 43 4c 5f 44 54 52 41 43 45 5f 50 52 4f 43 5f  TCL_DTRACE_PROC_
d1a0: 52 45 53 55 4c 54 28 6c 20 3c 20 69 50 74 72 2d  RESULT(l < iPtr-
d1b0: 3e 76 61 72 46 72 61 6d 65 50 74 72 2d 3e 6f 62  >varFramePtr->ob
d1c0: 6a 63 20 3f 0a 09 09 54 63 6c 47 65 74 53 74 72  jc ?...TclGetStr
d1d0: 69 6e 67 28 69 50 74 72 2d 3e 76 61 72 46 72 61  ing(iPtr->varFra
d1e0: 6d 65 50 74 72 2d 3e 6f 62 6a 76 5b 6c 5d 29 20  mePtr->objv[l]) 
d1f0: 3a 20 4e 55 4c 4c 2c 20 72 65 73 75 6c 74 2c 0a  : NULL, result,.
d200: 09 09 54 63 6c 47 65 74 53 74 72 69 6e 67 28 72  ..TclGetString(r
d210: 29 2c 20 72 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  ), r);.    }..  
d220: 20 20 66 72 65 65 50 74 72 20 3d 20 69 50 74 72    freePtr = iPtr
d230: 2d 3e 66 72 61 6d 65 50 74 72 3b 0a 20 20 20 20  ->framePtr;.    
d240: 54 63 6c 5f 50 6f 70 43 61 6c 6c 46 72 61 6d 65  Tcl_PopCallFrame
d250: 28 69 6e 74 65 72 70 29 3b 09 09 2f 2a 20 50 6f  (interp);../* Po
d260: 70 20 62 75 74 20 64 6f 20 6e 6f 74 20 66 72 65  p but do not fre
d270: 65 2e 20 2a 2f 0a 20 20 20 20 54 63 6c 53 74 61  e. */.    TclSta
d280: 63 6b 46 72 65 65 28 69 6e 74 65 72 70 2c 20 66  ckFree(interp, f
d290: 72 65 65 50 74 72 2d 3e 63 6f 6d 70 69 6c 65 64  reePtr->compiled
d2a0: 4c 6f 63 61 6c 73 29 3b 0a 09 09 09 09 09 2f 2a  Locals);....../*
d2b0: 20 46 72 65 65 20 63 6f 6d 70 69 6c 65 64 4c 6f   Free compiledLo
d2c0: 63 61 6c 73 2e 20 2a 2f 0a 20 20 20 20 54 63 6c  cals. */.    Tcl
d2d0: 53 74 61 63 6b 46 72 65 65 28 69 6e 74 65 72 70  StackFree(interp
d2e0: 2c 20 66 72 65 65 50 74 72 29 3b 09 2f 2a 20 46  , freePtr);./* F
d2f0: 72 65 65 20 43 61 6c 6c 46 72 61 6d 65 2e 20 2a  ree CallFrame. *
d300: 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 72 65 73  /.    return res
d310: 75 6c 74 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20  ult;..    /*.   
d320: 20 20 2a 20 50 72 6f 63 65 73 73 20 61 6e 79 20    * Process any 
d330: 6e 6f 6e 2d 54 43 4c 5f 4f 4b 20 72 65 73 75 6c  non-TCL_OK resul
d340: 74 20 63 6f 64 65 2e 0a 20 20 20 20 20 2a 2f 0a  t code..     */.
d350: 0a 20 20 20 20 70 72 6f 63 65 73 73 3a 0a 20 20  .    process:.  
d360: 20 20 73 77 69 74 63 68 20 28 72 65 73 75 6c 74    switch (result
d370: 29 20 7b 0a 20 20 20 20 63 61 73 65 20 54 43 4c  ) {.    case TCL
d380: 5f 52 45 54 55 52 4e 3a 0a 09 2f 2a 0a 09 20 2a  _RETURN:../*.. *
d390: 20 49 66 20 69 74 20 69 73 20 61 20 27 72 65 74   If it is a 'ret
d3a0: 75 72 6e 27 2c 20 64 6f 20 74 68 65 20 54 49 50  urn', do the TIP
d3b0: 23 39 30 20 70 72 6f 63 65 73 73 69 6e 67 20 6e  #90 processing n
d3c0: 6f 77 2e 0a 09 20 2a 2f 0a 0a 09 72 65 73 75 6c  ow... */...resul
d3d0: 74 20 3d 20 54 63 6c 55 70 64 61 74 65 52 65 74  t = TclUpdateRet
d3e0: 75 72 6e 49 6e 66 6f 28 28 49 6e 74 65 72 70 20  urnInfo((Interp 
d3f0: 2a 29 20 69 6e 74 65 72 70 29 3b 0a 09 62 72 65  *) interp);..bre
d400: 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 54 43  ak;..    case TC
d410: 4c 5f 43 4f 4e 54 49 4e 55 45 3a 0a 20 20 20 20  L_CONTINUE:.    
d420: 63 61 73 65 20 54 43 4c 5f 42 52 45 41 4b 3a 0a  case TCL_BREAK:.
d430: 09 2f 2a 0a 09 20 2a 20 49 74 27 73 20 61 6e 20  ./*.. * It's an 
d440: 65 72 72 6f 72 20 74 6f 20 67 65 74 20 74 6f 20  error to get to 
d450: 74 68 69 73 20 70 6f 69 6e 74 20 66 72 6f 6d 20  this point from 
d460: 61 20 27 62 72 65 61 6b 27 20 6f 72 20 27 63 6f  a 'break' or 'co
d470: 6e 74 69 6e 75 65 27 2c 20 73 6f 0a 09 20 2a 20  ntinue', so.. * 
d480: 74 72 61 6e 73 66 6f 72 6d 20 74 6f 20 61 6e 20  transform to an 
d490: 65 72 72 6f 72 20 6e 6f 77 2e 0a 09 20 2a 2f 0a  error now... */.
d4a0: 0a 09 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75  ..Tcl_SetObjResu
d4b0: 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4f  lt(interp, Tcl_O
d4c0: 62 6a 50 72 69 6e 74 66 28 0a 09 09 22 69 6e 76  bjPrintf(..."inv
d4d0: 6f 6b 65 64 20 5c 22 25 73 5c 22 20 6f 75 74 73  oked \"%s\" outs
d4e0: 69 64 65 20 6f 66 20 61 20 6c 6f 6f 70 22 2c 0a  ide of a loop",.
d4f0: 09 09 28 28 72 65 73 75 6c 74 20 3d 3d 20 54 43  ..((result == TC
d500: 4c 5f 42 52 45 41 4b 29 20 3f 20 22 62 72 65 61  L_BREAK) ? "brea
d510: 6b 22 20 3a 20 22 63 6f 6e 74 69 6e 75 65 22 29  k" : "continue")
d520: 29 29 3b 0a 09 54 63 6c 5f 53 65 74 45 72 72 6f  ));..Tcl_SetErro
d530: 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54  rCode(interp, "T
d540: 43 4c 22 2c 20 22 52 45 53 55 4c 54 22 2c 20 22  CL", "RESULT", "
d550: 55 4e 45 58 50 45 43 54 45 44 22 2c 20 28 63 68  UNEXPECTED", (ch
d560: 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 72 65 73  ar *)NULL);..res
d570: 75 6c 74 20 3d 20 54 43 4c 5f 45 52 52 4f 52 3b  ult = TCL_ERROR;
d580: 0a 0a 09 2f 2a 20 46 41 4c 4c 54 48 52 55 20 2a  .../* FALLTHRU *
d590: 2f 0a 0a 20 20 20 20 63 61 73 65 20 54 43 4c 5f  /..    case TCL_
d5a0: 45 52 52 4f 52 3a 0a 09 2f 2a 0a 09 20 2a 20 4e  ERROR:../*.. * N
d5b0: 6f 77 20 69 74 20 5f 6d 75 73 74 5f 20 62 65 20  ow it _must_ be 
d5c0: 61 6e 20 65 72 72 6f 72 2c 20 73 6f 20 77 65 20  an error, so we 
d5d0: 6e 65 65 64 20 74 6f 20 6c 6f 67 20 69 74 20 61  need to log it a
d5e0: 73 20 73 75 63 68 2e 20 54 68 69 73 20 6d 65 61  s such. This mea
d5f0: 6e 73 0a 09 20 2a 20 66 69 6c 6c 69 6e 67 20 6f  ns.. * filling o
d600: 75 74 20 74 68 65 20 65 72 72 6f 72 20 74 72 61  ut the error tra
d610: 63 65 2e 20 4c 75 63 6b 69 6c 79 2c 20 77 65 20  ce. Luckily, we 
d620: 6a 75 73 74 20 68 61 6e 64 20 74 68 69 73 20 6f  just hand this o
d630: 66 66 20 74 6f 20 74 68 65 0a 09 20 2a 20 66 75  ff to the.. * fu
d640: 6e 63 74 69 6f 6e 20 68 61 6e 64 65 64 20 74 6f  nction handed to
d650: 20 75 73 20 61 73 20 61 6e 20 61 72 67 75 6d 65   us as an argume
d660: 6e 74 2e 0a 09 20 2a 2f 0a 0a 09 65 72 72 6f 72  nt... */...error
d670: 50 72 6f 63 28 69 6e 74 65 72 70 2c 20 70 72 6f  Proc(interp, pro
d680: 63 4e 61 6d 65 4f 62 6a 29 3b 0a 20 20 20 20 7d  cNameObj);.    }
d690: 0a 20 20 20 20 67 6f 74 6f 20 64 6f 6e 65 3b 0a  .    goto done;.
d6a0: 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  }.../*. *-------
d6b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d6c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d6d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d6e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
d6f0: 20 2a 0a 20 2a 20 54 63 6c 50 72 6f 63 43 6f 6d   *. * TclProcCom
d700: 70 69 6c 65 50 72 6f 63 20 2d 2d 0a 20 2a 0a 20  pileProc --. *. 
d710: 2a 09 43 61 6c 6c 65 64 20 6a 75 73 74 20 62 65  *.Called just be
d720: 66 6f 72 65 20 61 20 70 72 6f 63 65 64 75 72 65  fore a procedure
d730: 20 69 73 20 65 78 65 63 75 74 65 64 20 74 6f 20   is executed to 
d740: 63 6f 6d 70 69 6c 65 20 74 68 65 20 62 6f 64 79  compile the body
d750: 20 74 6f 20 62 79 74 65 0a 20 2a 09 63 6f 64 65   to byte. *.code
d760: 73 2e 20 49 66 20 74 68 65 20 74 79 70 65 20 6f  s. If the type o
d770: 66 20 74 68 65 20 62 6f 64 79 20 69 73 20 6e 6f  f the body is no
d780: 74 20 22 62 79 74 65 20 63 6f 64 65 22 20 6f 72  t "byte code" or
d790: 20 69 66 20 74 68 65 20 63 6f 6d 70 69 6c 65 0a   if the compile.
d7a0: 20 2a 09 63 6f 6e 64 69 74 69 6f 6e 73 20 68 61   *.conditions ha
d7b0: 76 65 20 63 68 61 6e 67 65 64 20 28 6e 61 6d 65  ve changed (name
d7c0: 73 70 61 63 65 20 63 6f 6e 74 65 78 74 2c 20 65  space context, e
d7d0: 70 6f 63 68 20 63 6f 75 6e 74 65 72 73 2c 20 65  poch counters, e
d7e0: 74 63 2e 29 20 74 68 65 6e 0a 20 2a 09 74 68 65  tc.) then. *.the
d7f0: 20 62 6f 64 79 20 69 73 20 72 65 63 6f 6d 70 69   body is recompi
d800: 6c 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  led. Otherwise, 
d810: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f  this function do
d820: 65 73 20 6e 6f 74 68 69 6e 67 2e 0a 20 2a 0a 20  es nothing.. *. 
d830: 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f  * Results:. *.No
d840: 6e 65 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65  ne.. *. * Side e
d850: 66 66 65 63 74 73 3a 0a 20 2a 09 4d 61 79 20 63  ffects:. *.May c
d860: 68 61 6e 67 65 20 74 68 65 20 69 6e 74 65 72 6e  hange the intern
d870: 61 6c 20 72 65 70 72 65 73 65 6e 74 61 74 69 6f  al representatio
d880: 6e 20 6f 66 20 74 68 65 20 62 6f 64 79 20 6f 62  n of the body ob
d890: 6a 65 63 74 20 74 6f 20 63 6f 6d 70 69 6c 65 64  ject to compiled
d8a0: 0a 20 2a 09 63 6f 64 65 2e 0a 20 2a 0a 20 2a 2d  . *.code.. *. *-
d8b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d8c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d8d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d8e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d8f0: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 69 6e 74 0a 54  -----. */..int.T
d900: 63 6c 50 72 6f 63 43 6f 6d 70 69 6c 65 50 72 6f  clProcCompilePro
d910: 63 28 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72  c(.    Tcl_Inter
d920: 70 20 2a 69 6e 74 65 72 70 2c 09 09 2f 2a 20 49  p *interp,../* I
d930: 6e 74 65 72 70 72 65 74 65 72 20 63 6f 6e 74 61  nterpreter conta
d940: 69 6e 69 6e 67 20 70 72 6f 63 65 64 75 72 65 2e  ining procedure.
d950: 20 2a 2f 0a 20 20 20 20 50 72 6f 63 20 2a 70 72   */.    Proc *pr
d960: 6f 63 50 74 72 2c 09 09 2f 2a 20 44 61 74 61 20  ocPtr,../* Data 
d970: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
d980: 70 72 6f 63 65 64 75 72 65 2e 20 2a 2f 0a 20 20  procedure. */.  
d990: 20 20 54 63 6c 5f 4f 62 6a 20 2a 62 6f 64 79 50    Tcl_Obj *bodyP
d9a0: 74 72 2c 09 09 2f 2a 20 42 6f 64 79 20 6f 66 20  tr,../* Body of 
d9b0: 70 72 6f 63 2e 20 28 55 73 75 61 6c 6c 79 20 70  proc. (Usually p
d9c0: 72 6f 63 50 74 72 2d 3e 62 6f 64 79 50 74 72 2c  rocPtr->bodyPtr,
d9d0: 0a 09 09 09 09 20 2a 20 62 75 74 20 63 6f 75 6c  ..... * but coul
d9e0: 64 20 62 65 20 61 6e 79 20 63 6f 64 65 20 66 72  d be any code fr
d9f0: 61 67 6d 65 6e 74 20 63 6f 6d 70 69 6c 65 64 20  agment compiled 
da00: 69 6e 0a 09 09 09 09 20 2a 20 74 68 65 20 63 6f  in..... * the co
da10: 6e 74 65 78 74 20 6f 66 20 74 68 69 73 20 70 72  ntext of this pr
da20: 6f 63 65 64 75 72 65 2e 29 20 2a 2f 0a 20 20 20  ocedure.) */.   
da30: 20 4e 61 6d 65 73 70 61 63 65 20 2a 6e 73 50 74   Namespace *nsPt
da40: 72 2c 09 09 2f 2a 20 4e 61 6d 65 73 70 61 63 65  r,../* Namespace
da50: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 70 72 6f 63   containing proc
da60: 65 64 75 72 65 2e 20 2a 2f 0a 20 20 20 20 63 6f  edure. */.    co
da70: 6e 73 74 20 63 68 61 72 20 2a 64 65 73 63 72 69  nst char *descri
da80: 70 74 69 6f 6e 2c 09 2f 2a 20 73 74 72 69 6e 67  ption,./* string
da90: 20 64 65 73 63 72 69 62 69 6e 67 20 74 68 69 73   describing this
daa0: 20 62 6f 64 79 20 6f 66 20 63 6f 64 65 2e 20 2a   body of code. *
dab0: 2f 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  /.    const char
dac0: 20 2a 70 72 6f 63 4e 61 6d 65 29 09 2f 2a 20 4e   *procName)./* N
dad0: 61 6d 65 20 6f 66 20 74 68 69 73 20 70 72 6f 63  ame of this proc
dae0: 65 64 75 72 65 2e 20 2a 2f 0a 7b 0a 20 20 20 20  edure. */.{.    
daf0: 49 6e 74 65 72 70 20 2a 69 50 74 72 20 3d 20 28  Interp *iPtr = (
db00: 49 6e 74 65 72 70 20 2a 29 20 69 6e 74 65 72 70  Interp *) interp
db10: 3b 0a 20 20 20 20 54 63 6c 5f 43 61 6c 6c 46 72  ;.    Tcl_CallFr
db20: 61 6d 65 20 2a 66 72 61 6d 65 50 74 72 3b 0a 20  ame *framePtr;. 
db30: 20 20 20 42 79 74 65 43 6f 64 65 20 2a 63 6f 64     ByteCode *cod
db40: 65 50 74 72 20 3d 20 62 6f 64 79 50 74 72 2d 3e  ePtr = bodyPtr->
db50: 69 6e 74 65 72 6e 61 6c 52 65 70 2e 74 77 6f 50  internalRep.twoP
db60: 74 72 56 61 6c 75 65 2e 70 74 72 31 3b 0a 0a 20  trValue.ptr1;.. 
db70: 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 49 66 20     /*.     * If 
db80: 6e 65 63 65 73 73 61 72 79 2c 20 63 6f 6d 70 69  necessary, compi
db90: 6c 65 20 74 68 65 20 70 72 6f 63 65 64 75 72 65  le the procedure
dba0: 27 73 20 62 6f 64 79 2e 20 54 68 65 20 63 6f 6d  's body. The com
dbb0: 70 69 6c 65 72 20 77 69 6c 6c 20 61 6c 6c 6f 63  piler will alloc
dbc0: 61 74 65 0a 20 20 20 20 20 2a 20 66 72 61 6d 65  ate.     * frame
dbd0: 20 73 6c 6f 74 73 20 66 6f 72 20 74 68 65 20 70   slots for the p
dbe0: 72 6f 63 65 64 75 72 65 27 73 20 6e 6f 6e 2d 61  rocedure's non-a
dbf0: 72 67 75 6d 65 6e 74 20 6c 6f 63 61 6c 20 76 61  rgument local va
dc00: 72 69 61 62 6c 65 73 2e 20 49 66 20 74 68 65 0a  riables. If the.
dc10: 20 20 20 20 20 2a 20 42 79 74 65 43 6f 64 65 20       * ByteCode 
dc20: 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 2c 20  already exists, 
dc30: 6d 61 6b 65 20 73 75 72 65 20 69 74 20 68 61 73  make sure it has
dc40: 6e 27 74 20 62 65 65 6e 20 69 6e 76 61 6c 69 64  n't been invalid
dc50: 61 74 65 64 20 62 79 0a 20 20 20 20 20 2a 20 73  ated by.     * s
dc60: 6f 6d 65 6f 6e 65 20 72 65 64 65 66 69 6e 69 6e  omeone redefinin
dc70: 67 20 61 20 63 6f 72 65 20 63 6f 6d 6d 61 6e 64  g a core command
dc80: 20 28 74 68 69 73 20 6d 69 67 68 74 20 6d 61 6b   (this might mak
dc90: 65 20 74 68 65 20 63 6f 6d 70 69 6c 65 64 20 63  e the compiled c
dca0: 6f 64 65 0a 20 20 20 20 20 2a 20 77 72 6f 6e 67  ode.     * wrong
dcb0: 29 2e 20 41 6c 73 6f 2c 20 69 66 20 74 68 65 20  ). Also, if the 
dcc0: 63 6f 64 65 20 77 61 73 20 63 6f 6d 70 69 6c 65  code was compile
dcd0: 64 20 69 6e 2f 66 6f 72 20 61 20 64 69 66 66 65  d in/for a diffe
dce0: 72 65 6e 74 20 69 6e 74 65 72 70 72 65 74 65 72  rent interpreter
dcf0: 2c 0a 20 20 20 20 20 2a 20 77 65 20 72 65 63 6f  ,.     * we reco
dd00: 6d 70 69 6c 65 20 69 74 2e 20 4e 6f 74 65 20 74  mpile it. Note t
dd10: 68 61 74 20 63 6f 6d 70 69 6c 69 6e 67 20 74 68  hat compiling th
dd20: 65 20 62 6f 64 79 20 6d 69 67 68 74 20 69 6e 63  e body might inc
dd30: 72 65 61 73 65 0a 20 20 20 20 20 2a 20 70 72 6f  rease.     * pro
dd40: 63 50 74 72 2d 3e 6e 75 6d 43 6f 6d 70 69 6c 65  cPtr->numCompile
dd50: 64 4c 6f 63 61 6c 73 20 69 66 20 6e 65 77 20 6c  dLocals if new l
dd60: 6f 63 61 6c 20 76 61 72 69 61 62 6c 65 73 20 61  ocal variables a
dd70: 72 65 20 66 6f 75 6e 64 20 77 68 69 6c 65 0a 20  re found while. 
dd80: 20 20 20 20 2a 20 63 6f 6d 70 69 6c 69 6e 67 2e      * compiling.
dd90: 0a 20 20 20 20 20 2a 0a 20 20 20 20 20 2a 20 45  .     *.     * E
dda0: 6e 73 75 72 65 20 74 68 65 20 42 79 74 65 43 6f  nsure the ByteCo
ddb0: 64 65 27 73 20 70 72 6f 63 50 74 72 20 69 73 20  de's procPtr is 
ddc0: 74 68 65 20 73 61 6d 65 20 28 6f 72 20 69 74 20  the same (or it 
ddd0: 69 73 20 70 75 72 65 20 70 72 65 63 6f 6d 70 69  is pure precompi
dde0: 6c 65 64 29 2e 0a 20 20 20 20 20 2a 20 50 72 65  led)..     * Pre
ddf0: 63 6f 6d 70 69 6c 65 64 20 70 72 6f 63 65 64 75  compiled procedu
de00: 72 65 20 62 6f 64 69 65 73 2c 20 68 6f 77 65 76  re bodies, howev
de10: 65 72 2c 20 61 72 65 20 69 6d 6d 75 74 61 62 6c  er, are immutabl
de20: 65 20 61 6e 64 20 74 68 65 72 65 66 6f 72 65 20  e and therefore 
de30: 74 68 65 79 0a 20 20 20 20 20 2a 20 61 72 65 20  they.     * are 
de40: 6e 6f 74 20 72 65 63 6f 6d 70 69 6c 65 64 2c 20  not recompiled, 
de50: 65 76 65 6e 20 69 66 20 74 68 69 6e 67 73 20 68  even if things h
de60: 61 76 65 20 63 68 61 6e 67 65 64 2e 0a 20 20 20  ave changed..   
de70: 20 20 2a 2f 0a 0a 20 20 20 20 69 66 20 28 62 6f    */..    if (bo
de80: 64 79 50 74 72 2d 3e 74 79 70 65 50 74 72 20 3d  dyPtr->typePtr =
de90: 3d 20 26 74 63 6c 42 79 74 65 43 6f 64 65 54 79  = &tclByteCodeTy
dea0: 70 65 29 20 7b 0a 09 69 66 20 28 28 28 49 6e 74  pe) {..if (((Int
deb0: 65 72 70 20 2a 29 20 2a 63 6f 64 65 50 74 72 2d  erp *) *codePtr-
dec0: 3e 69 6e 74 65 72 70 48 61 6e 64 6c 65 20 3d 3d  >interpHandle ==
ded0: 20 69 50 74 72 29 0a 09 09 26 26 20 28 63 6f 64   iPtr)...&& (cod
dee0: 65 50 74 72 2d 3e 63 6f 6d 70 69 6c 65 45 70 6f  ePtr->compileEpo
def0: 63 68 20 3d 3d 20 69 50 74 72 2d 3e 63 6f 6d 70  ch == iPtr->comp
df00: 69 6c 65 45 70 6f 63 68 29 0a 09 09 26 26 20 28  ileEpoch)...&& (
df10: 63 6f 64 65 50 74 72 2d 3e 6e 73 50 74 72 20 3d  codePtr->nsPtr =
df20: 3d 20 6e 73 50 74 72 29 0a 09 09 26 26 20 28 63  = nsPtr)...&& (c
df30: 6f 64 65 50 74 72 2d 3e 6e 73 45 70 6f 63 68 20  odePtr->nsEpoch 
df40: 3d 3d 20 6e 73 50 74 72 2d 3e 72 65 73 6f 6c 76  == nsPtr->resolv
df50: 65 72 45 70 6f 63 68 29 0a 09 09 26 26 20 28 28  erEpoch)...&& ((
df60: 63 6f 64 65 50 74 72 2d 3e 70 72 6f 63 50 74 72  codePtr->procPtr
df70: 20 3d 3d 20 70 72 6f 63 50 74 72 29 20 7c 7c 20   == procPtr) || 
df80: 21 62 6f 64 79 50 74 72 2d 3e 62 79 74 65 73 29  !bodyPtr->bytes)
df90: 0a 09 29 20 7b 0a 09 20 20 20 20 72 65 74 75 72  ..) {..    retur
dfa0: 6e 20 54 43 4c 5f 4f 4b 3b 0a 09 7d 0a 0a 09 69  n TCL_OK;..}...i
dfb0: 66 20 28 63 6f 64 65 50 74 72 2d 3e 66 6c 61 67  f (codePtr->flag
dfc0: 73 20 26 20 54 43 4c 5f 42 59 54 45 43 4f 44 45  s & TCL_BYTECODE
dfd0: 5f 50 52 45 43 4f 4d 50 49 4c 45 44 29 20 7b 0a  _PRECOMPILED) {.
dfe0: 09 20 20 20 20 69 66 20 28 28 49 6e 74 65 72 70  .    if ((Interp
dff0: 20 2a 29 20 2a 63 6f 64 65 50 74 72 2d 3e 69 6e   *) *codePtr->in
e000: 74 65 72 70 48 61 6e 64 6c 65 20 21 3d 20 69 50  terpHandle != iP
e010: 74 72 29 20 7b 0a 09 09 54 63 6c 5f 53 65 74 4f  tr) {...Tcl_SetO
e020: 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c  bjResult(interp,
e030: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62   Tcl_NewStringOb
e040: 6a 28 0a 09 09 09 22 61 20 70 72 65 63 6f 6d 70  j(...."a precomp
e050: 69 6c 65 64 20 73 63 72 69 70 74 20 6a 75 6d 70  iled script jump
e060: 65 64 20 69 6e 74 65 72 70 73 22 2c 20 2d 31 29  ed interps", -1)
e070: 29 3b 0a 09 09 54 63 6c 5f 53 65 74 45 72 72 6f  );...Tcl_SetErro
e080: 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54  rCode(interp, "T
e090: 43 4c 22 2c 20 22 4f 50 45 52 41 54 49 4f 4e 22  CL", "OPERATION"
e0a0: 2c 20 22 50 52 4f 43 22 2c 0a 09 09 09 22 43 52  , "PROC",...."CR
e0b0: 4f 53 53 49 4e 54 45 52 50 42 59 54 45 43 4f 44  OSSINTERPBYTECOD
e0c0: 45 22 2c 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c  E", (char *)NULL
e0d0: 29 3b 0a 09 09 72 65 74 75 72 6e 20 54 43 4c 5f  );...return TCL_
e0e0: 45 52 52 4f 52 3b 0a 09 20 20 20 20 7d 0a 09 20  ERROR;..    }.. 
e0f0: 20 20 20 63 6f 64 65 50 74 72 2d 3e 63 6f 6d 70     codePtr->comp
e100: 69 6c 65 45 70 6f 63 68 20 3d 20 69 50 74 72 2d  ileEpoch = iPtr-
e110: 3e 63 6f 6d 70 69 6c 65 45 70 6f 63 68 3b 0a 09  >compileEpoch;..
e120: 20 20 20 20 63 6f 64 65 50 74 72 2d 3e 6e 73 50      codePtr->nsP
e130: 74 72 20 3d 20 6e 73 50 74 72 3b 0a 09 7d 20 65  tr = nsPtr;..} e
e140: 6c 73 65 20 7b 0a 09 20 20 20 20 54 63 6c 46 72  lse {..    TclFr
e150: 65 65 49 6e 74 52 65 70 28 62 6f 64 79 50 74 72  eeIntRep(bodyPtr
e160: 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20  );..}.    }..   
e170: 20 69 66 20 28 62 6f 64 79 50 74 72 2d 3e 74 79   if (bodyPtr->ty
e180: 70 65 50 74 72 20 21 3d 20 26 74 63 6c 42 79 74  pePtr != &tclByt
e190: 65 43 6f 64 65 54 79 70 65 29 20 7b 0a 09 54 63  eCodeType) {..Tc
e1a0: 6c 5f 48 61 73 68 45 6e 74 72 79 20 2a 68 65 50  l_HashEntry *heP
e1b0: 74 72 3b 0a 0a 23 69 66 64 65 66 20 54 43 4c 5f  tr;..#ifdef TCL_
e1c0: 43 4f 4d 50 49 4c 45 5f 44 45 42 55 47 0a 09 69  COMPILE_DEBUG..i
e1d0: 66 20 28 74 63 6c 54 72 61 63 65 43 6f 6d 70 69  f (tclTraceCompi
e1e0: 6c 65 20 3e 3d 20 31 29 20 7b 0a 09 20 20 20 20  le >= 1) {..    
e1f0: 2f 2a 0a 09 20 20 20 20 20 2a 20 44 69 73 70 6c  /*..     * Displ
e200: 61 79 20 61 20 6c 69 6e 65 20 73 75 6d 6d 61 72  ay a line summar
e210: 69 7a 69 6e 67 20 74 68 65 20 74 6f 70 20 6c 65  izing the top le
e220: 76 65 6c 20 63 6f 6d 6d 61 6e 64 20 77 65 20 61  vel command we a
e230: 72 65 20 61 62 6f 75 74 0a 09 20 20 20 20 20 2a  re about..     *
e240: 20 74 6f 20 63 6f 6d 70 69 6c 65 2e 0a 09 20 20   to compile...  
e250: 20 20 20 2a 2f 0a 0a 09 20 20 20 20 54 63 6c 5f     */...    Tcl_
e260: 4f 62 6a 20 2a 6d 65 73 73 61 67 65 3b 0a 0a 09  Obj *message;...
e270: 20 20 20 20 54 63 6c 4e 65 77 4c 69 74 65 72 61      TclNewLitera
e280: 6c 53 74 72 69 6e 67 4f 62 6a 28 6d 65 73 73 61  lStringObj(messa
e290: 67 65 2c 20 22 43 6f 6d 70 69 6c 69 6e 67 20 22  ge, "Compiling "
e2a0: 29 3b 0a 09 20 20 20 20 54 63 6c 5f 49 6e 63 72  );..    Tcl_Incr
e2b0: 52 65 66 43 6f 75 6e 74 28 6d 65 73 73 61 67 65  RefCount(message
e2c0: 29 3b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65  );..    Tcl_Appe
e2d0: 6e 64 53 74 72 69 6e 67 73 54 6f 4f 62 6a 28 6d  ndStringsToObj(m
e2e0: 65 73 73 61 67 65 2c 20 64 65 73 63 72 69 70 74  essage, descript
e2f0: 69 6f 6e 2c 20 22 20 5c 22 22 2c 20 4e 55 4c 4c  ion, " \"", NULL
e300: 29 3b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65  );..    Tcl_Appe
e310: 6e 64 4c 69 6d 69 74 65 64 54 6f 4f 62 6a 28 6d  ndLimitedToObj(m
e320: 65 73 73 61 67 65 2c 20 70 72 6f 63 4e 61 6d 65  essage, procName
e330: 2c 20 2d 31 2c 20 35 30 2c 20 4e 55 4c 4c 29 3b  , -1, 50, NULL);
e340: 0a 09 20 20 20 20 66 70 72 69 6e 74 66 28 73 74  ..    fprintf(st
e350: 64 6f 75 74 2c 20 22 25 73 5c 22 5c 6e 22 2c 20  dout, "%s\"\n", 
e360: 54 63 6c 47 65 74 53 74 72 69 6e 67 28 6d 65 73  TclGetString(mes
e370: 73 61 67 65 29 29 3b 0a 09 20 20 20 20 54 63 6c  sage));..    Tcl
e380: 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 6d 65  _DecrRefCount(me
e390: 73 73 61 67 65 29 3b 0a 09 7d 0a 23 65 6e 64 69  ssage);..}.#endi
e3a0: 66 0a 0a 09 2f 2a 0a 09 20 2a 20 50 6c 75 67 20  f.../*.. * Plug 
e3b0: 74 68 65 20 63 75 72 72 65 6e 74 20 70 72 6f 63  the current proc
e3c0: 50 74 72 20 69 6e 74 6f 20 74 68 65 20 69 6e 74  Ptr into the int
e3d0: 65 72 70 72 65 74 65 72 20 61 6e 64 20 63 6f 65  erpreter and coe
e3e0: 72 63 65 20 74 68 65 20 63 6f 64 65 0a 09 20 2a  rce the code.. *
e3f0: 20 62 6f 64 79 20 74 6f 20 62 79 74 65 20 63 6f   body to byte co
e400: 64 65 73 2e 20 54 68 65 20 69 6e 74 65 72 70 72  des. The interpr
e410: 65 74 65 72 20 6e 65 65 64 73 20 74 6f 20 6b 6e  eter needs to kn
e420: 6f 77 20 77 68 69 63 68 20 70 72 6f 63 20 69 74  ow which proc it
e430: 27 73 0a 09 20 2a 20 63 6f 6d 70 69 6c 69 6e 67  's.. * compiling
e440: 20 73 6f 20 74 68 61 74 20 69 74 20 63 61 6e 20   so that it can 
e450: 61 63 63 65 73 73 20 69 74 73 20 6c 69 73 74 20  access its list 
e460: 6f 66 20 63 6f 6d 70 69 6c 65 64 20 6c 6f 63 61  of compiled loca
e470: 6c 73 2e 0a 09 20 2a 0a 09 20 2a 20 54 52 49 43  ls... *.. * TRIC
e480: 4b 59 20 4e 4f 54 45 3a 20 42 65 20 63 61 72 65  KY NOTE: Be care
e490: 66 75 6c 20 74 6f 20 70 75 73 68 20 61 20 63 61  ful to push a ca
e4a0: 6c 6c 20 66 72 61 6d 65 20 77 69 74 68 20 74 68  ll frame with th
e4b0: 65 20 70 72 6f 70 65 72 0a 09 20 2a 20 20 20 6e  e proper.. *   n
e4c0: 61 6d 65 73 70 61 63 65 20 63 6f 6e 74 65 78 74  amespace context
e4d0: 2c 20 73 6f 20 74 68 61 74 20 74 68 65 20 62 79  , so that the by
e4e0: 74 65 20 63 6f 64 65 73 20 61 72 65 20 63 6f 6d  te codes are com
e4f0: 70 69 6c 65 64 20 69 6e 20 74 68 65 0a 09 20 2a  piled in the.. *
e500: 20 20 20 61 70 70 72 6f 70 72 69 61 74 65 20 63     appropriate c
e510: 6c 61 73 73 20 63 6f 6e 74 65 78 74 2e 0a 09 20  lass context... 
e520: 2a 2f 0a 0a 09 69 50 74 72 2d 3e 63 6f 6d 70 69  */...iPtr->compi
e530: 6c 65 64 50 72 6f 63 50 74 72 20 3d 20 70 72 6f  ledProcPtr = pro
e540: 63 50 74 72 3b 0a 0a 09 69 66 20 28 70 72 6f 63  cPtr;...if (proc
e550: 50 74 72 2d 3e 6e 75 6d 43 6f 6d 70 69 6c 65 64  Ptr->numCompiled
e560: 4c 6f 63 61 6c 73 20 3e 20 70 72 6f 63 50 74 72  Locals > procPtr
e570: 2d 3e 6e 75 6d 41 72 67 73 29 20 7b 0a 09 20 20  ->numArgs) {..  
e580: 20 20 43 6f 6d 70 69 6c 65 64 4c 6f 63 61 6c 20    CompiledLocal 
e590: 2a 63 6c 50 74 72 20 3d 20 70 72 6f 63 50 74 72  *clPtr = procPtr
e5a0: 2d 3e 66 69 72 73 74 4c 6f 63 61 6c 50 74 72 3b  ->firstLocalPtr;
e5b0: 0a 09 20 20 20 20 43 6f 6d 70 69 6c 65 64 4c 6f  ..    CompiledLo
e5c0: 63 61 6c 20 2a 6c 61 73 74 50 74 72 20 3d 20 4e  cal *lastPtr = N
e5d0: 55 4c 4c 3b 0a 09 20 20 20 20 69 6e 74 20 69 2c  ULL;..    int i,
e5e0: 20 6e 75 6d 41 72 67 73 20 3d 20 70 72 6f 63 50   numArgs = procP
e5f0: 74 72 2d 3e 6e 75 6d 41 72 67 73 3b 0a 0a 09 20  tr->numArgs;... 
e600: 20 20 20 66 6f 72 20 28 69 20 3d 20 30 3b 20 69     for (i = 0; i
e610: 20 3c 20 6e 75 6d 41 72 67 73 3b 20 69 2b 2b 29   < numArgs; i++)
e620: 20 7b 0a 09 09 6c 61 73 74 50 74 72 20 3d 20 63   {...lastPtr = c
e630: 6c 50 74 72 3b 0a 09 09 63 6c 50 74 72 20 3d 20  lPtr;...clPtr = 
e640: 63 6c 50 74 72 2d 3e 6e 65 78 74 50 74 72 3b 0a  clPtr->nextPtr;.
e650: 09 20 20 20 20 7d 0a 0a 09 20 20 20 20 69 66 20  .    }...    if 
e660: 28 6c 61 73 74 50 74 72 29 20 7b 0a 09 09 6c 61  (lastPtr) {...la
e670: 73 74 50 74 72 2d 3e 6e 65 78 74 50 74 72 20 3d  stPtr->nextPtr =
e680: 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 7d 20 65 6c   NULL;..    } el
e690: 73 65 20 7b 0a 09 09 70 72 6f 63 50 74 72 2d 3e  se {...procPtr->
e6a0: 66 69 72 73 74 4c 6f 63 61 6c 50 74 72 20 3d 20  firstLocalPtr = 
e6b0: 4e 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a 09 20 20  NULL;..    }..  
e6c0: 20 20 70 72 6f 63 50 74 72 2d 3e 6c 61 73 74 4c    procPtr->lastL
e6d0: 6f 63 61 6c 50 74 72 20 3d 20 6c 61 73 74 50 74  ocalPtr = lastPt
e6e0: 72 3b 0a 09 20 20 20 20 77 68 69 6c 65 20 28 63  r;..    while (c
e6f0: 6c 50 74 72 29 20 7b 0a 09 09 43 6f 6d 70 69 6c  lPtr) {...Compil
e700: 65 64 4c 6f 63 61 6c 20 2a 74 6f 46 72 65 65 20  edLocal *toFree 
e710: 3d 20 63 6c 50 74 72 3b 0a 0a 09 09 63 6c 50 74  = clPtr;....clPt
e720: 72 20 3d 20 63 6c 50 74 72 2d 3e 6e 65 78 74 50  r = clPtr->nextP
e730: 74 72 3b 0a 09 09 69 66 20 28 74 6f 46 72 65 65  tr;...if (toFree
e740: 2d 3e 72 65 73 6f 6c 76 65 49 6e 66 6f 29 20 7b  ->resolveInfo) {
e750: 0a 09 09 20 20 20 20 69 66 20 28 74 6f 46 72 65  ...    if (toFre
e760: 65 2d 3e 72 65 73 6f 6c 76 65 49 6e 66 6f 2d 3e  e->resolveInfo->
e770: 64 65 6c 65 74 65 50 72 6f 63 29 20 7b 0a 09 09  deleteProc) {...
e780: 09 74 6f 46 72 65 65 2d 3e 72 65 73 6f 6c 76 65  .toFree->resolve
e790: 49 6e 66 6f 2d 3e 64 65 6c 65 74 65 50 72 6f 63  Info->deleteProc
e7a0: 28 74 6f 46 72 65 65 2d 3e 72 65 73 6f 6c 76 65  (toFree->resolve
e7b0: 49 6e 66 6f 29 3b 0a 09 09 20 20 20 20 7d 20 65  Info);...    } e
e7c0: 6c 73 65 20 7b 0a 09 09 09 63 6b 66 72 65 65 28  lse {....ckfree(
e7d0: 74 6f 46 72 65 65 2d 3e 72 65 73 6f 6c 76 65 49  toFree->resolveI
e7e0: 6e 66 6f 29 3b 0a 09 09 20 20 20 20 7d 0a 09 09  nfo);...    }...
e7f0: 7d 0a 09 09 63 6b 66 72 65 65 28 74 6f 46 72 65  }...ckfree(toFre
e800: 65 29 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20  e);..    }..    
e810: 70 72 6f 63 50 74 72 2d 3e 6e 75 6d 43 6f 6d 70  procPtr->numComp
e820: 69 6c 65 64 4c 6f 63 61 6c 73 20 3d 20 70 72 6f  iledLocals = pro
e830: 63 50 74 72 2d 3e 6e 75 6d 41 72 67 73 3b 0a 09  cPtr->numArgs;..
e840: 7d 0a 0a 09 28 76 6f 69 64 29 20 54 63 6c 50 75  }...(void) TclPu
e850: 73 68 53 74 61 63 6b 46 72 61 6d 65 28 69 6e 74  shStackFrame(int
e860: 65 72 70 2c 20 26 66 72 61 6d 65 50 74 72 2c 20  erp, &framePtr, 
e870: 28 54 63 6c 5f 4e 61 6d 65 73 70 61 63 65 20 2a  (Tcl_Namespace *
e880: 29 20 6e 73 50 74 72 2c 0a 09 09 2f 2a 20 69 73  ) nsPtr,.../* is
e890: 50 72 6f 63 43 61 6c 6c 46 72 61 6d 65 20 2a 2f  ProcCallFrame */
e8a0: 20 30 29 3b 0a 0a 09 2f 2a 0a 09 20 2a 20 54 49   0);.../*.. * TI
e8b0: 50 20 23 32 38 30 3a 20 57 65 20 67 65 74 20 74  P #280: We get t
e8c0: 68 65 20 69 6e 76 6f 6b 69 6e 67 20 63 6f 6e 74  he invoking cont
e8d0: 65 78 74 20 66 72 6f 6d 20 74 68 65 20 63 6d 64  ext from the cmd
e8e0: 46 72 61 6d 65 20 77 68 69 63 68 0a 09 20 2a 20  Frame which.. * 
e8f0: 77 61 73 20 73 61 76 65 64 20 62 79 20 27 54 63  was saved by 'Tc
e900: 6c 5f 50 72 6f 63 4f 62 6a 43 6d 64 27 20 28 75  l_ProcObjCmd' (u
e910: 73 69 6e 67 20 6c 69 6e 65 50 42 6f 64 79 50 74  sing linePBodyPt
e920: 72 29 2e 0a 09 20 2a 2f 0a 0a 09 68 65 50 74 72  r)... */...hePtr
e930: 20 3d 20 54 63 6c 5f 46 69 6e 64 48 61 73 68 45   = Tcl_FindHashE
e940: 6e 74 72 79 28 69 50 74 72 2d 3e 6c 69 6e 65 50  ntry(iPtr->lineP
e950: 42 6f 64 79 50 74 72 2c 20 28 63 68 61 72 20 2a  BodyPtr, (char *
e960: 29 20 70 72 6f 63 50 74 72 29 3b 0a 0a 09 2f 2a  ) procPtr);.../*
e970: 0a 09 20 2a 20 43 6f 6e 73 74 72 75 63 74 65 64  .. * Constructed
e980: 20 73 61 76 65 64 20 66 72 61 6d 65 20 68 61 73   saved frame has
e990: 20 62 6f 64 79 20 61 73 20 77 6f 72 64 20 30 2e   body as word 0.
e9a0: 20 53 65 65 20 54 63 6c 5f 50 72 6f 63 4f 62 6a   See Tcl_ProcObj
e9b0: 43 6d 64 2e 0a 09 20 2a 2f 0a 0a 09 69 50 74 72  Cmd... */...iPtr
e9c0: 2d 3e 69 6e 76 6f 6b 65 57 6f 72 64 20 3d 20 30  ->invokeWord = 0
e9d0: 3b 0a 09 69 50 74 72 2d 3e 69 6e 76 6f 6b 65 43  ;..iPtr->invokeC
e9e0: 6d 64 46 72 61 6d 65 50 74 72 20 3d 20 68 65 50  mdFramePtr = heP
e9f0: 74 72 20 3f 20 28 43 6d 64 46 72 61 6d 65 20 2a  tr ? (CmdFrame *
ea00: 29 54 63 6c 5f 47 65 74 48 61 73 68 56 61 6c 75  )Tcl_GetHashValu
ea10: 65 28 68 65 50 74 72 29 20 3a 20 4e 55 4c 4c 3b  e(hePtr) : NULL;
ea20: 0a 09 54 63 6c 53 65 74 42 79 74 65 43 6f 64 65  ..TclSetByteCode
ea30: 46 72 6f 6d 41 6e 79 28 69 6e 74 65 72 70 2c 20  FromAny(interp, 
ea40: 62 6f 64 79 50 74 72 2c 20 4e 55 4c 4c 2c 20 4e  bodyPtr, NULL, N
ea50: 55 4c 4c 29 3b 0a 09 69 50 74 72 2d 3e 69 6e 76  ULL);..iPtr->inv
ea60: 6f 6b 65 43 6d 64 46 72 61 6d 65 50 74 72 20 3d  okeCmdFramePtr =
ea70: 20 4e 55 4c 4c 3b 0a 09 54 63 6c 50 6f 70 53 74   NULL;..TclPopSt
ea80: 61 63 6b 46 72 61 6d 65 28 69 6e 74 65 72 70 29  ackFrame(interp)
ea90: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20  ;.    } else if 
eaa0: 28 63 6f 64 65 50 74 72 2d 3e 6e 73 45 70 6f 63  (codePtr->nsEpoc
eab0: 68 20 21 3d 20 6e 73 50 74 72 2d 3e 72 65 73 6f  h != nsPtr->reso
eac0: 6c 76 65 72 45 70 6f 63 68 29 20 7b 0a 09 2f 2a  lverEpoch) {../*
ead0: 0a 09 20 2a 20 54 68 65 20 72 65 73 6f 6c 76 65  .. * The resolve
eae0: 72 20 65 70 6f 63 68 20 68 61 73 20 63 68 61 6e  r epoch has chan
eaf0: 67 65 64 2c 20 62 75 74 20 77 65 20 6f 6e 6c 79  ged, but we only
eb00: 20 6e 65 65 64 20 74 6f 20 69 6e 76 61 6c 69 64   need to invalid
eb10: 61 74 65 20 74 68 65 0a 09 20 2a 20 72 65 73 6f  ate the.. * reso
eb20: 6c 76 65 72 20 63 61 63 68 65 2e 0a 09 20 2a 2f  lver cache... */
eb30: 0a 0a 09 63 6f 64 65 50 74 72 2d 3e 6e 73 45 70  ...codePtr->nsEp
eb40: 6f 63 68 20 3d 20 6e 73 50 74 72 2d 3e 72 65 73  och = nsPtr->res
eb50: 6f 6c 76 65 72 45 70 6f 63 68 3b 0a 09 63 6f 64  olverEpoch;..cod
eb60: 65 50 74 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 54  ePtr->flags |= T
eb70: 43 4c 5f 42 59 54 45 43 4f 44 45 5f 52 45 53 4f  CL_BYTECODE_RESO
eb80: 4c 56 45 5f 56 41 52 53 3b 0a 20 20 20 20 7d 0a  LVE_VARS;.    }.
eb90: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f      return TCL_O
eba0: 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d  K;.}.../*. *----
ebb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ebc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ebd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ebe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ebf0: 2d 2d 0a 20 2a 0a 20 2a 20 4d 61 6b 65 50 72 6f  --. *. * MakePro
ec00: 63 45 72 72 6f 72 20 2d 2d 0a 20 2a 0a 20 2a 09  cError --. *. *.
ec10: 46 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 65 64 20  Function called 
ec20: 62 79 20 54 63 6c 4f 62 6a 49 6e 74 65 72 70 50  by TclObjInterpP
ec30: 72 6f 63 20 74 6f 20 63 72 65 61 74 65 20 74 68  roc to create th
ec40: 65 20 73 74 61 63 6b 20 69 6e 66 6f 72 6d 61 74  e stack informat
ec50: 69 6f 6e 0a 20 2a 09 75 70 6f 6e 20 61 6e 20 65  ion. *.upon an e
ec60: 72 72 6f 72 20 66 72 6f 6d 20 61 20 70 72 6f 63  rror from a proc
ec70: 65 64 75 72 65 2e 0a 20 2a 0a 20 2a 20 52 65 73  edure.. *. * Res
ec80: 75 6c 74 73 3a 0a 20 2a 09 54 68 65 20 69 6e 74  ults:. *.The int
ec90: 65 72 70 72 65 74 65 72 27 73 20 65 72 72 6f 72  erpreter's error
eca0: 20 69 6e 66 6f 20 74 72 61 63 65 20 69 73 20 73   info trace is s
ecb0: 65 74 20 74 6f 20 61 20 76 61 6c 75 65 20 74 68  et to a value th
ecc0: 61 74 20 73 75 70 70 6c 65 6d 65 6e 74 73 0a 20  at supplements. 
ecd0: 2a 09 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65  *.the error code
ece0: 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66  .. *. * Side eff
ecf0: 65 63 74 73 3a 0a 20 2a 09 6e 6f 6e 65 2e 0a 20  ects:. *.none.. 
ed00: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
ed10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ed20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ed30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ed40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a  ----------. */..
ed50: 73 74 61 74 69 63 20 76 6f 69 64 0a 4d 61 6b 65  static void.Make
ed60: 50 72 6f 63 45 72 72 6f 72 28 0a 20 20 20 20 54  ProcError(.    T
ed70: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
ed80: 70 2c 09 09 2f 2a 20 54 68 65 20 69 6e 74 65 72  p,../* The inter
ed90: 70 72 65 74 65 72 20 69 6e 20 77 68 69 63 68 20  preter in which 
eda0: 74 68 65 20 70 72 6f 63 65 64 75 72 65 20 77 61  the procedure wa
edb0: 73 0a 09 09 09 09 20 2a 20 63 61 6c 6c 65 64 2e  s..... * called.
edc0: 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20   */.    Tcl_Obj 
edd0: 2a 70 72 6f 63 4e 61 6d 65 4f 62 6a 29 09 2f 2a  *procNameObj)./*
ede0: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 70 72 6f   Name of the pro
edf0: 63 65 64 75 72 65 2e 20 55 73 65 64 20 66 6f 72  cedure. Used for
ee00: 20 65 72 72 6f 72 0a 09 09 09 09 20 2a 20 6d 65   error..... * me
ee10: 73 73 61 67 65 73 20 61 6e 64 20 74 72 61 63 65  ssages and trace
ee20: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20 2a 2f   information. */
ee30: 0a 7b 0a 20 20 20 20 69 6e 74 20 6f 76 65 72 66  .{.    int overf
ee40: 6c 6f 77 2c 20 6c 69 6d 69 74 20 3d 20 36 30 2c  low, limit = 60,
ee50: 20 6e 61 6d 65 4c 65 6e 3b 0a 20 20 20 20 63 6f   nameLen;.    co
ee60: 6e 73 74 20 63 68 61 72 20 2a 70 72 6f 63 4e 61  nst char *procNa
ee70: 6d 65 20 3d 20 54 63 6c 47 65 74 53 74 72 69 6e  me = TclGetStrin
ee80: 67 46 72 6f 6d 4f 62 6a 28 70 72 6f 63 4e 61 6d  gFromObj(procNam
ee90: 65 4f 62 6a 2c 20 26 6e 61 6d 65 4c 65 6e 29 3b  eObj, &nameLen);
eea0: 0a 0a 20 20 20 20 6f 76 65 72 66 6c 6f 77 20 3d  ..    overflow =
eeb0: 20 28 6e 61 6d 65 4c 65 6e 20 3e 20 6c 69 6d 69   (nameLen > limi
eec0: 74 29 3b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65  t);.    Tcl_Appe
eed0: 6e 64 4f 62 6a 54 6f 45 72 72 6f 72 49 6e 66 6f  ndObjToErrorInfo
eee0: 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4f 62 6a  (interp, Tcl_Obj
eef0: 50 72 69 6e 74 66 28 0a 09 20 20 20 20 22 5c 6e  Printf(..    "\n
ef00: 20 20 20 20 28 70 72 6f 63 65 64 75 72 65 20 5c      (procedure \
ef10: 22 25 2e 2a 73 25 73 5c 22 20 6c 69 6e 65 20 25  "%.*s%s\" line %
ef20: 64 29 22 2c 0a 09 20 20 20 20 28 6f 76 65 72 66  d)",..    (overf
ef30: 6c 6f 77 20 3f 20 6c 69 6d 69 74 20 3a 20 6e 61  low ? limit : na
ef40: 6d 65 4c 65 6e 29 2c 20 70 72 6f 63 4e 61 6d 65  meLen), procName
ef50: 2c 0a 09 20 20 20 20 28 6f 76 65 72 66 6c 6f 77  ,..    (overflow
ef60: 20 3f 20 22 2e 2e 2e 22 20 3a 20 22 22 29 2c 20   ? "..." : ""), 
ef70: 54 63 6c 5f 47 65 74 45 72 72 6f 72 4c 69 6e 65  Tcl_GetErrorLine
ef80: 28 69 6e 74 65 72 70 29 29 29 3b 0a 7d 0a 0c 0a  (interp)));.}...
ef90: 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  /*. *-----------
efa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
efb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
efc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
efd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20  -----------. *. 
efe0: 2a 20 54 63 6c 50 72 6f 63 44 65 6c 65 74 65 50  * TclProcDeleteP
eff0: 72 6f 63 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69  roc --. *. *.Thi
f000: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e  s function is in
f010: 76 6f 6b 65 64 20 6a 75 73 74 20 62 65 66 6f 72  voked just befor
f020: 65 20 61 20 63 6f 6d 6d 61 6e 64 20 70 72 6f 63  e a command proc
f030: 65 64 75 72 65 20 69 73 20 72 65 6d 6f 76 65 64  edure is removed
f040: 0a 20 2a 09 66 72 6f 6d 20 61 6e 20 69 6e 74 65  . *.from an inte
f050: 72 70 72 65 74 65 72 2e 20 49 74 73 20 6a 6f 62  rpreter. Its job
f060: 20 69 73 20 74 6f 20 72 65 6c 65 61 73 65 20 61   is to release a
f070: 6c 6c 20 74 68 65 20 72 65 73 6f 75 72 63 65 73  ll the resources
f080: 20 61 6c 6c 6f 63 61 74 65 64 0a 20 2a 09 74 6f   allocated. *.to
f090: 20 74 68 65 20 70 72 6f 63 65 64 75 72 65 2e 0a   the procedure..
f0a0: 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20   *. * Results:. 
f0b0: 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 20 53 69  *.None.. *. * Si
f0c0: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4d  de effects:. *.M
f0d0: 65 6d 6f 72 79 20 67 65 74 73 20 66 72 65 65 64  emory gets freed
f0e0: 2c 20 75 6e 6c 65 73 73 20 74 68 65 20 70 72 6f  , unless the pro
f0f0: 63 65 64 75 72 65 20 69 73 20 61 63 74 69 76 65  cedure is active
f100: 6c 79 20 62 65 69 6e 67 20 65 78 65 63 75 74 65  ly being execute
f110: 64 2e 0a 20 2a 09 49 6e 20 74 68 69 73 20 63 61  d.. *.In this ca
f120: 73 65 20 74 68 65 20 63 6c 65 61 6e 75 70 20 69  se the cleanup i
f130: 73 20 64 65 6c 61 79 65 64 20 75 6e 74 69 6c 20  s delayed until 
f140: 74 68 65 20 6c 61 73 74 20 63 61 6c 6c 20 74 6f  the last call to
f150: 20 74 68 65 20 63 75 72 72 65 6e 74 0a 20 2a 09   the current. *.
f160: 70 72 6f 63 65 64 75 72 65 20 63 6f 6d 70 6c 65  procedure comple
f170: 74 65 73 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  tes.. *. *------
f180: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f190: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f1a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f1b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f1c0: 0a 20 2a 2f 0a 0a 76 6f 69 64 0a 54 63 6c 50 72  . */..void.TclPr
f1d0: 6f 63 44 65 6c 65 74 65 50 72 6f 63 28 0a 20 20  ocDeleteProc(.  
f1e0: 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69    ClientData cli
f1f0: 65 6e 74 44 61 74 61 29 09 2f 2a 20 50 72 6f 63  entData)./* Proc
f200: 65 64 75 72 65 20 74 6f 20 62 65 20 64 65 6c 65  edure to be dele
f210: 74 65 64 2e 20 2a 2f 0a 7b 0a 20 20 20 20 50 72  ted. */.{.    Pr
f220: 6f 63 20 2a 70 72 6f 63 50 74 72 20 3d 20 28 50  oc *procPtr = (P
f230: 72 6f 63 20 2a 29 63 6c 69 65 6e 74 44 61 74 61  roc *)clientData
f240: 3b 0a 0a 20 20 20 20 69 66 20 28 70 72 6f 63 50  ;..    if (procP
f250: 74 72 2d 3e 72 65 66 43 6f 75 6e 74 2d 2d 20 3c  tr->refCount-- <
f260: 3d 20 31 29 20 7b 0a 09 54 63 6c 50 72 6f 63 43  = 1) {..TclProcC
f270: 6c 65 61 6e 75 70 50 72 6f 63 28 70 72 6f 63 50  leanupProc(procP
f280: 74 72 29 3b 0a 20 20 20 20 7d 0a 7d 0a 0c 0a 2f  tr);.    }.}.../
f290: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  *. *------------
f2a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f2b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f2c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f2d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a  ----------. *. *
f2e0: 20 54 63 6c 50 72 6f 63 43 6c 65 61 6e 75 70 50   TclProcCleanupP
f2f0: 72 6f 63 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69  roc --. *. *.Thi
f300: 73 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20  s function does 
f310: 61 6c 6c 20 74 68 65 20 72 65 61 6c 20 77 6f 72  all the real wor
f320: 6b 20 6f 66 20 66 72 65 65 69 6e 67 20 75 70 20  k of freeing up 
f330: 61 20 50 72 6f 63 20 73 74 72 75 63 74 75 72 65  a Proc structure
f340: 2e 0a 20 2a 09 49 74 27 73 20 63 61 6c 6c 65 64  .. *.It's called
f350: 20 6f 6e 6c 79 20 77 68 65 6e 20 74 68 65 20 73   only when the s
f360: 74 72 75 63 74 75 72 65 27 73 20 72 65 66 65 72  tructure's refer
f370: 65 6e 63 65 20 63 6f 75 6e 74 20 62 65 63 6f 6d  ence count becom
f380: 65 73 20 7a 65 72 6f 2e 0a 20 2a 0a 20 2a 20 52  es zero.. *. * R
f390: 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e  esults:. *.None.
f3a0: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65  . *. * Side effe
f3b0: 63 74 73 3a 0a 20 2a 09 4d 65 6d 6f 72 79 20 67  cts:. *.Memory g
f3c0: 65 74 73 20 66 72 65 65 64 2e 0a 20 2a 0a 20 2a  ets freed.. *. *
f3d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f3e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f3f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f400: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
f410: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 76 6f 69 64  ------. */..void
f420: 0a 54 63 6c 50 72 6f 63 43 6c 65 61 6e 75 70 50  .TclProcCleanupP
f430: 72 6f 63 28 0a 20 20 20 20 50 72 6f 63 20 2a 70  roc(.    Proc *p
f440: 72 6f 63 50 74 72 29 09 2f 2a 20 50 72 6f 63 65  rocPtr)./* Proce
f450: 64 75 72 65 20 74 6f 20 62 65 20 64 65 6c 65 74  dure to be delet
f460: 65 64 2e 20 2a 2f 0a 7b 0a 20 20 20 20 43 6f 6d  ed. */.{.    Com
f470: 70 69 6c 65 64 4c 6f 63 61 6c 20 2a 6c 6f 63 61  piledLocal *loca
f480: 6c 50 74 72 3b 0a 20 20 20 20 54 63 6c 5f 4f 62  lPtr;.    Tcl_Ob
f490: 6a 20 2a 62 6f 64 79 50 74 72 20 3d 20 70 72 6f  j *bodyPtr = pro
f4a0: 63 50 74 72 2d 3e 62 6f 64 79 50 74 72 3b 0a 20  cPtr->bodyPtr;. 
f4b0: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 64 65 66 50     Tcl_Obj *defP
f4c0: 74 72 3b 0a 20 20 20 20 54 63 6c 5f 52 65 73 6f  tr;.    Tcl_Reso
f4d0: 6c 76 65 64 56 61 72 49 6e 66 6f 20 2a 72 65 73  lvedVarInfo *res
f4e0: 56 61 72 49 6e 66 6f 3b 0a 20 20 20 20 54 63 6c  VarInfo;.    Tcl
f4f0: 5f 48 61 73 68 45 6e 74 72 79 20 2a 68 65 50 74  _HashEntry *hePt
f500: 72 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 43 6d  r = NULL;.    Cm
f510: 64 46 72 61 6d 65 20 2a 63 66 50 74 72 20 3d 20  dFrame *cfPtr = 
f520: 4e 55 4c 4c 3b 0a 20 20 20 20 49 6e 74 65 72 70  NULL;.    Interp
f530: 20 2a 69 50 74 72 20 3d 20 70 72 6f 63 50 74 72   *iPtr = procPtr
f540: 2d 3e 69 50 74 72 3b 0a 0a 20 20 20 20 69 66 20  ->iPtr;..    if 
f550: 28 62 6f 64 79 50 74 72 20 21 3d 20 4e 55 4c 4c  (bodyPtr != NULL
f560: 29 20 7b 0a 09 2f 2a 20 70 72 6f 63 50 74 72 20  ) {../* procPtr 
f570: 69 73 20 73 74 6f 72 65 64 20 69 6e 20 62 6f 64  is stored in bod
f580: 79 27 73 20 42 79 74 65 43 6f 64 65 2c 20 73 6f  y's ByteCode, so
f590: 20 65 6e 73 75 72 65 20 74 6f 20 72 65 73 65 74   ensure to reset
f5a0: 20 69 74 2e 20 2a 2f 0a 09 69 66 20 28 62 6f 64   it. */..if (bod
f5b0: 79 50 74 72 2d 3e 74 79 70 65 50 74 72 20 3d 3d  yPtr->typePtr ==
f5c0: 20 26 74 63 6c 42 79 74 65 43 6f 64 65 54 79 70   &tclByteCodeTyp
f5d0: 65 29 20 7b 0a 09 20 20 20 20 42 79 74 65 43 6f  e) {..    ByteCo
f5e0: 64 65 20 2a 63 6f 64 65 50 74 72 20 3d 20 62 6f  de *codePtr = bo
f5f0: 64 79 50 74 72 2d 3e 69 6e 74 65 72 6e 61 6c 52  dyPtr->internalR
f600: 65 70 2e 74 77 6f 50 74 72 56 61 6c 75 65 2e 70  ep.twoPtrValue.p
f610: 74 72 31 3b 0a 09 20 20 20 20 69 66 20 28 63 6f  tr1;..    if (co
f620: 64 65 50 74 72 2d 3e 70 72 6f 63 50 74 72 20 3d  dePtr->procPtr =
f630: 3d 20 70 72 6f 63 50 74 72 29 20 7b 0a 09 09 63  = procPtr) {...c
f640: 6f 64 65 50 74 72 2d 3e 70 72 6f 63 50 74 72 20  odePtr->procPtr 
f650: 3d 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a 09  = NULL;..    }..
f660: 7d 0a 09 54 63 6c 5f 44 65 63 72 52 65 66 43 6f  }..Tcl_DecrRefCo
f670: 75 6e 74 28 62 6f 64 79 50 74 72 29 3b 0a 20 20  unt(bodyPtr);.  
f680: 20 20 7d 0a 20 20 20 20 66 6f 72 20 28 6c 6f 63    }.    for (loc
f690: 61 6c 50 74 72 20 3d 20 70 72 6f 63 50 74 72 2d  alPtr = procPtr-
f6a0: 3e 66 69 72 73 74 4c 6f 63 61 6c 50 74 72 3b 20  >firstLocalPtr; 
f6b0: 6c 6f 63 61 6c 50 74 72 20 21 3d 20 4e 55 4c 4c  localPtr != NULL
f6c0: 3b 20 29 20 7b 0a 09 43 6f 6d 70 69 6c 65 64 4c  ; ) {..CompiledL
f6d0: 6f 63 61 6c 20 2a 6e 65 78 74 50 74 72 20 3d 20  ocal *nextPtr = 
f6e0: 6c 6f 63 61 6c 50 74 72 2d 3e 6e 65 78 74 50 74  localPtr->nextPt
f6f0: 72 3b 0a 0a 09 72 65 73 56 61 72 49 6e 66 6f 20  r;...resVarInfo 
f700: 3d 20 6c 6f 63 61 6c 50 74 72 2d 3e 72 65 73 6f  = localPtr->reso
f710: 6c 76 65 49 6e 66 6f 3b 0a 09 69 66 20 28 72 65  lveInfo;..if (re
f720: 73 56 61 72 49 6e 66 6f 29 20 7b 0a 09 20 20 20  sVarInfo) {..   
f730: 20 69 66 20 28 72 65 73 56 61 72 49 6e 66 6f 2d   if (resVarInfo-
f740: 3e 64 65 6c 65 74 65 50 72 6f 63 29 20 7b 0a 09  >deleteProc) {..
f750: 09 72 65 73 56 61 72 49 6e 66 6f 2d 3e 64 65 6c  .resVarInfo->del
f760: 65 74 65 50 72 6f 63 28 72 65 73 56 61 72 49 6e  eteProc(resVarIn
f770: 66 6f 29 3b 0a 09 20 20 20 20 7d 20 65 6c 73 65  fo);..    } else
f780: 20 7b 0a 09 09 63 6b 66 72 65 65 28 72 65 73 56   {...ckfree(resV
f790: 61 72 49 6e 66 6f 29 3b 0a 09 20 20 20 20 7d 0a  arInfo);..    }.
f7a0: 09 7d 0a 0a 09 69 66 20 28 6c 6f 63 61 6c 50 74  .}...if (localPt
f7b0: 72 2d 3e 64 65 66 56 61 6c 75 65 50 74 72 20 21  r->defValuePtr !
f7c0: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 64  = NULL) {..    d
f7d0: 65 66 50 74 72 20 3d 20 6c 6f 63 61 6c 50 74 72  efPtr = localPtr
f7e0: 2d 3e 64 65 66 56 61 6c 75 65 50 74 72 3b 0a 09  ->defValuePtr;..
f7f0: 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43      Tcl_DecrRefC
f800: 6f 75 6e 74 28 64 65 66 50 74 72 29 3b 0a 09 7d  ount(defPtr);..}
f810: 0a 09 63 6b 66 72 65 65 28 6c 6f 63 61 6c 50 74  ..ckfree(localPt
f820: 72 29 3b 0a 09 6c 6f 63 61 6c 50 74 72 20 3d 20  r);..localPtr = 
f830: 6e 65 78 74 50 74 72 3b 0a 20 20 20 20 7d 0a 20  nextPtr;.    }. 
f840: 20 20 20 63 6b 66 72 65 65 28 70 72 6f 63 50 74     ckfree(procPt
f850: 72 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20  r);..    /*.    
f860: 20 2a 20 54 49 50 20 23 32 38 30 3a 20 52 65 6c   * TIP #280: Rel
f870: 65 61 73 65 20 74 68 65 20 6c 6f 63 61 74 69 6f  ease the locatio
f880: 6e 20 64 61 74 61 20 61 73 73 6f 63 69 61 74 65  n data associate
f890: 64 20 77 69 74 68 20 74 68 69 73 20 50 72 6f 63  d with this Proc
f8a0: 0a 20 20 20 20 20 2a 20 73 74 72 75 63 74 75 72  .     * structur
f8b0: 65 2c 20 69 66 20 61 6e 79 2e 20 54 68 65 20 69  e, if any. The i
f8c0: 6e 74 65 72 70 72 65 74 65 72 20 6d 61 79 20 6e  nterpreter may n
f8d0: 6f 74 20 65 78 69 73 74 20 28 46 6f 72 20 65 78  ot exist (For ex
f8e0: 61 6d 70 6c 65 20 66 6f 72 0a 20 20 20 20 20 2a  ample for.     *
f8f0: 20 70 72 6f 63 62 6f 64 79 20 73 74 72 75 63 74   procbody struct
f900: 75 72 65 73 20 63 72 65 61 74 65 64 20 62 79 20  ures created by 
f910: 74 62 63 6c 6f 61 64 2e 0a 20 20 20 20 20 2a 2f  tbcload..     */
f920: 0a 0a 20 20 20 20 69 66 20 28 69 50 74 72 20 3d  ..    if (iPtr =
f930: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72  = NULL) {..retur
f940: 6e 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 68 65  n;.    }..    he
f950: 50 74 72 20 3d 20 54 63 6c 5f 46 69 6e 64 48 61  Ptr = Tcl_FindHa
f960: 73 68 45 6e 74 72 79 28 69 50 74 72 2d 3e 6c 69  shEntry(iPtr->li
f970: 6e 65 50 42 6f 64 79 50 74 72 2c 20 28 63 68 61  nePBodyPtr, (cha
f980: 72 20 2a 29 20 70 72 6f 63 50 74 72 29 3b 0a 20  r *) procPtr);. 
f990: 20 20 20 69 66 20 28 21 68 65 50 74 72 29 20 7b     if (!hePtr) {
f9a0: 0a 09 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a  ..return;.    }.
f9b0: 0a 20 20 20 20 63 66 50 74 72 20 3d 20 28 43 6d  .    cfPtr = (Cm
f9c0: 64 46 72 61 6d 65 20 2a 29 54 63 6c 5f 47 65 74  dFrame *)Tcl_Get
f9d0: 48 61 73 68 56 61 6c 75 65 28 68 65 50 74 72 29  HashValue(hePtr)
f9e0: 3b 0a 0a 20 20 20 20 69 66 20 28 63 66 50 74 72  ;..    if (cfPtr
f9f0: 29 20 7b 0a 09 69 66 20 28 63 66 50 74 72 2d 3e  ) {..if (cfPtr->
fa00: 74 79 70 65 20 3d 3d 20 54 43 4c 5f 4c 4f 43 41  type == TCL_LOCA
fa10: 54 49 4f 4e 5f 53 4f 55 52 43 45 29 20 7b 0a 09  TION_SOURCE) {..
fa20: 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43      Tcl_DecrRefC
fa30: 6f 75 6e 74 28 63 66 50 74 72 2d 3e 64 61 74 61  ount(cfPtr->data
fa40: 2e 65 76 61 6c 2e 70 61 74 68 29 3b 0a 09 20 20  .eval.path);..  
fa50: 20 20 63 66 50 74 72 2d 3e 64 61 74 61 2e 65 76    cfPtr->data.ev
fa60: 61 6c 2e 70 61 74 68 20 3d 20 4e 55 4c 4c 3b 0a  al.path = NULL;.
fa70: 09 7d 0a 09 63 6b 66 72 65 65 28 63 66 50 74 72  .}..ckfree(cfPtr
fa80: 2d 3e 6c 69 6e 65 29 3b 0a 09 63 66 50 74 72 2d  ->line);..cfPtr-
fa90: 3e 6c 69 6e 65 20 3d 20 4e 55 4c 4c 3b 0a 09 63  >line = NULL;..c
faa0: 6b 66 72 65 65 28 63 66 50 74 72 29 3b 0a 20 20  kfree(cfPtr);.  
fab0: 20 20 7d 0a 20 20 20 20 54 63 6c 5f 44 65 6c 65    }.    Tcl_Dele
fac0: 74 65 48 61 73 68 45 6e 74 72 79 28 68 65 50 74  teHashEntry(hePt
fad0: 72 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d  r);.}.../*. *---
fae0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
faf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fb00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fb10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fb20: 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 63 6c 55 70 64  ---. *. * TclUpd
fb30: 61 74 65 52 65 74 75 72 6e 49 6e 66 6f 20 2d 2d  ateReturnInfo --
fb40: 0a 20 2a 0a 20 2a 09 54 68 69 73 20 66 75 6e 63  . *. *.This func
fb50: 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77  tion is called w
fb60: 68 65 6e 20 70 72 6f 63 65 64 75 72 65 73 20 72  hen procedures r
fb70: 65 74 75 72 6e 2c 20 61 6e 64 20 61 74 20 6f 74  eturn, and at ot
fb80: 68 65 72 20 70 6f 69 6e 74 73 0a 20 2a 09 77 68  her points. *.wh
fb90: 65 72 65 20 74 68 65 20 54 43 4c 5f 52 45 54 55  ere the TCL_RETU
fba0: 52 4e 20 63 6f 64 65 20 69 73 20 75 73 65 64 2e  RN code is used.
fbb0: 20 49 74 20 65 78 61 6d 69 6e 65 73 20 74 68 65   It examines the
fbc0: 20 72 65 74 75 72 6e 4c 65 76 65 6c 20 61 6e 64   returnLevel and
fbd0: 0a 20 2a 09 72 65 74 75 72 6e 43 6f 64 65 20 74  . *.returnCode t
fbe0: 6f 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20  o determine the 
fbf0: 72 65 61 6c 20 72 65 74 75 72 6e 20 73 74 61 74  real return stat
fc00: 75 73 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74  us.. *. * Result
fc10: 73 3a 0a 20 2a 09 54 68 65 20 72 65 74 75 72 6e  s:. *.The return
fc20: 20 76 61 6c 75 65 20 69 73 20 74 68 65 20 74 72   value is the tr
fc30: 75 65 20 63 6f 6d 70 6c 65 74 69 6f 6e 20 63 6f  ue completion co
fc40: 64 65 20 74 6f 20 75 73 65 20 66 6f 72 20 74 68  de to use for th
fc50: 65 20 70 72 6f 63 65 64 75 72 65 0a 20 2a 09 6f  e procedure. *.o
fc60: 72 20 73 63 72 69 70 74 2c 20 69 6e 73 74 65 61  r script, instea
fc70: 64 20 6f 66 20 54 43 4c 5f 52 45 54 55 52 4e 2e  d of TCL_RETURN.
fc80: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65  . *. * Side effe
fc90: 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a  cts:. *.None.. *
fca0: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *-------------
fcb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fcc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fcd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fce0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 69  ---------. */..i
fcf0: 6e 74 0a 54 63 6c 55 70 64 61 74 65 52 65 74 75  nt.TclUpdateRetu
fd00: 72 6e 49 6e 66 6f 28 0a 20 20 20 20 49 6e 74 65  rnInfo(.    Inte
fd10: 72 70 20 2a 69 50 74 72 29 09 09 2f 2a 20 49 6e  rp *iPtr)../* In
fd20: 74 65 72 70 72 65 74 65 72 20 66 6f 72 20 77 68  terpreter for wh
fd30: 69 63 68 20 54 43 4c 5f 52 45 54 55 52 4e 20 65  ich TCL_RETURN e
fd40: 78 63 65 70 74 69 6f 6e 0a 09 09 09 09 20 2a 20  xception..... * 
fd50: 69 73 20 62 65 69 6e 67 20 70 72 6f 63 65 73 73  is being process
fd60: 65 64 2e 20 2a 2f 0a 7b 0a 20 20 20 20 69 6e 74  ed. */.{.    int
fd70: 20 63 6f 64 65 20 3d 20 54 43 4c 5f 52 45 54 55   code = TCL_RETU
fd80: 52 4e 3b 0a 0a 20 20 20 20 69 50 74 72 2d 3e 72  RN;..    iPtr->r
fd90: 65 74 75 72 6e 4c 65 76 65 6c 2d 2d 3b 0a 20 20  eturnLevel--;.  
fda0: 20 20 69 66 20 28 69 50 74 72 2d 3e 72 65 74 75    if (iPtr->retu
fdb0: 72 6e 4c 65 76 65 6c 20 3c 20 30 29 20 7b 0a 09  rnLevel < 0) {..
fdc0: 54 63 6c 5f 50 61 6e 69 63 28 22 54 63 6c 55 70  Tcl_Panic("TclUp
fdd0: 64 61 74 65 52 65 74 75 72 6e 49 6e 66 6f 3a 20  dateReturnInfo: 
fde0: 6e 65 67 61 74 69 76 65 20 72 65 74 75 72 6e 20  negative return 
fdf0: 6c 65 76 65 6c 22 29 3b 0a 20 20 20 20 7d 0a 20  level");.    }. 
fe00: 20 20 20 69 66 20 28 69 50 74 72 2d 3e 72 65 74     if (iPtr->ret
fe10: 75 72 6e 4c 65 76 65 6c 20 3d 3d 20 30 29 20 7b  urnLevel == 0) {
fe20: 0a 09 2f 2a 0a 09 20 2a 20 4e 6f 77 20 77 65 27  ../*.. * Now we'
fe30: 76 65 20 72 65 61 63 68 65 64 20 74 68 65 20 6c  ve reached the l
fe40: 65 76 65 6c 20 74 6f 20 72 65 74 75 72 6e 20 74  evel to return t
fe50: 68 65 20 72 65 71 75 65 73 74 65 64 20 2d 63 6f  he requested -co
fe60: 64 65 2e 0a 09 20 2a 20 53 69 6e 63 65 20 69 50  de... * Since iP
fe70: 74 72 2d 3e 72 65 74 75 72 6e 4c 65 76 65 6c 20  tr->returnLevel 
fe80: 61 6e 64 20 69 50 74 72 2d 3e 72 65 74 75 72 6e  and iPtr->return
fe90: 43 6f 64 65 20 68 61 76 65 20 63 6f 6d 70 6c 65  Code have comple
fea0: 74 65 64 0a 09 20 2a 20 74 68 65 69 72 20 74 61  ted.. * their ta
feb0: 73 6b 2c 20 77 65 20 6e 6f 77 20 72 65 73 65 74  sk, we now reset
fec0: 20 74 68 65 6d 20 74 6f 20 64 65 66 61 75 6c 74   them to default
fed0: 20 76 61 6c 75 65 73 20 73 6f 20 74 68 61 74 20   values so that 
fee0: 61 6e 79 0a 09 20 2a 20 62 61 72 65 20 22 72 65  any.. * bare "re
fef0: 74 75 72 6e 20 54 43 4c 5f 52 45 54 55 52 4e 22  turn TCL_RETURN"
ff00: 20 74 68 61 74 20 6d 61 79 20 66 6f 6c 6c 6f 77   that may follow
ff10: 20 77 69 6c 6c 20 77 6f 72 6b 20 5b 42 75 67 20   will work [Bug 
ff20: 32 31 35 32 32 38 36 5d 2e 0a 09 20 2a 2f 0a 0a  2152286]... */..
ff30: 09 63 6f 64 65 20 3d 20 69 50 74 72 2d 3e 72 65  .code = iPtr->re
ff40: 74 75 72 6e 43 6f 64 65 3b 0a 09 69 50 74 72 2d  turnCode;..iPtr-
ff50: 3e 72 65 74 75 72 6e 4c 65 76 65 6c 20 3d 20 31  >returnLevel = 1
ff60: 3b 0a 09 69 50 74 72 2d 3e 72 65 74 75 72 6e 43  ;..iPtr->returnC
ff70: 6f 64 65 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 09 69  ode = TCL_OK;..i
ff80: 66 20 28 63 6f 64 65 20 3d 3d 20 54 43 4c 5f 45  f (code == TCL_E
ff90: 52 52 4f 52 29 20 7b 0a 09 20 20 20 20 69 50 74  RROR) {..    iPt
ffa0: 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 52 52 5f  r->flags |= ERR_
ffb0: 4c 45 47 41 43 59 5f 43 4f 50 59 3b 0a 09 7d 0a  LEGACY_COPY;..}.
ffc0: 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
ffd0: 20 63 6f 64 65 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a   code;.}.../*. *
ffe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fff0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10000 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10010 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10020 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 63 6c  ------. *. * Tcl
10030 47 65 74 4f 62 6a 49 6e 74 65 72 70 50 72 6f 63  GetObjInterpProc
10040 20 2d 2d 0a 20 2a 0a 20 2a 09 52 65 74 75 72 6e   --. *. *.Return
10050 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  s a pointer to t
10060 68 65 20 54 63 6c 4f 62 6a 49 6e 74 65 72 70 50  he TclObjInterpP
10070 72 6f 63 20 66 75 6e 63 74 69 6f 6e 3b 20 74 68  roc function; th
10080 69 73 20 69 73 20 64 69 66 66 65 72 65 6e 74 0a  is is different.
10090 20 2a 09 66 72 6f 6d 20 74 68 65 20 76 61 6c 75   *.from the valu
100a0 65 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  e obtained from 
100b0 74 68 65 20 54 63 6c 4f 62 6a 49 6e 74 65 72 70  the TclObjInterp
100c0 50 72 6f 63 20 72 65 66 65 72 65 6e 63 65 20 6f  Proc reference o
100d0 6e 20 73 79 73 74 65 6d 73 0a 20 2a 09 6c 69 6b  n systems. *.lik
100e0 65 20 57 69 6e 64 6f 77 73 20 77 68 65 72 65 20  e Windows where 
100f0 69 6d 70 6f 72 74 20 61 6e 64 20 65 78 70 6f 72  import and expor
10100 74 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 61 20  t versions of a 
10110 66 75 6e 63 74 69 6f 6e 20 65 78 70 6f 72 74 65  function exporte
10120 64 0a 20 2a 09 62 79 20 61 20 44 4c 4c 20 65 78  d. *.by a DLL ex
10130 69 73 74 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c  ist.. *. * Resul
10140 74 73 3a 0a 20 2a 09 52 65 74 75 72 6e 73 20 74  ts:. *.Returns t
10150 68 65 20 69 6e 74 65 72 6e 61 6c 20 61 64 64 72  he internal addr
10160 65 73 73 20 6f 66 20 74 68 65 20 54 63 6c 4f 62  ess of the TclOb
10170 6a 49 6e 74 65 72 70 50 72 6f 63 20 66 75 6e 63  jInterpProc func
10180 74 69 6f 6e 2e 0a 20 2a 0a 20 2a 20 53 69 64 65  tion.. *. * Side
10190 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e   effects:. *.Non
101a0 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d  e.. *. *--------
101b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
101c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
101d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
101e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20  --------------. 
101f0 2a 2f 0a 0a 54 63 6c 5f 4f 62 6a 43 6d 64 50 72  */..Tcl_ObjCmdPr
10200 6f 63 20 2a 0a 54 63 6c 47 65 74 4f 62 6a 49 6e  oc *.TclGetObjIn
10210 74 65 72 70 50 72 6f 63 28 76 6f 69 64 29 0a 7b  terpProc(void).{
10220 0a 20 20 20 20 72 65 74 75 72 6e 20 54 63 6c 4f  .    return TclO
10230 62 6a 49 6e 74 65 72 70 50 72 6f 63 3b 0a 7d 0a  bjInterpProc;.}.
10240 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  ../*. *---------
10250 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10260 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10270 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10280 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
10290 0a 20 2a 20 54 63 6c 4e 65 77 50 72 6f 63 42 6f  . * TclNewProcBo
102a0 64 79 4f 62 6a 20 2d 2d 0a 20 2a 0a 20 2a 09 43  dyObj --. *. *.C
102b0 72 65 61 74 65 73 20 61 20 6e 65 77 20 6f 62 6a  reates a new obj
102c0 65 63 74 2c 20 6f 66 20 74 79 70 65 20 22 70 72  ect, of type "pr
102d0 6f 63 62 6f 64 79 22 2c 20 77 68 6f 73 65 20 69  ocbody", whose i
102e0 6e 74 65 72 6e 61 6c 0a 20 2a 09 72 65 70 72 65  nternal. *.repre
102f0 73 65 6e 74 61 74 69 6f 6e 20 69 73 20 74 68 65  sentation is the
10300 20 67 69 76 65 6e 20 50 72 6f 63 20 73 74 72 75   given Proc stru
10310 63 74 2e 20 54 68 65 20 6e 65 77 6c 79 20 63 72  ct. The newly cr
10320 65 61 74 65 64 20 6f 62 6a 65 63 74 27 73 0a 20  eated object's. 
10330 2a 09 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  *.reference coun
10340 74 20 69 73 20 30 2e 0a 20 2a 0a 20 2a 20 52 65  t is 0.. *. * Re
10350 73 75 6c 74 73 3a 0a 20 2a 09 52 65 74 75 72 6e  sults:. *.Return
10360 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  s a pointer to a
10370 20 6e 65 77 6c 79 20 61 6c 6c 6f 63 61 74 65 64   newly allocated
10380 20 54 63 6c 5f 4f 62 6a 2c 20 4e 55 4c 4c 20 6f   Tcl_Obj, NULL o
10390 6e 20 65 72 72 6f 72 2e 0a 20 2a 0a 20 2a 20 53  n error.. *. * S
103a0 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09  ide effects:. *.
103b0 54 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f  The reference co
103c0 75 6e 74 20 69 6e 20 74 68 65 20 42 79 74 65 43  unt in the ByteC
103d0 6f 64 65 20 61 74 74 61 63 68 65 64 20 74 6f 20  ode attached to 
103e0 74 68 65 20 50 72 6f 63 20 69 73 20 62 75 6d 70  the Proc is bump
103f0 65 64 20 75 70 0a 20 2a 09 62 79 20 6f 6e 65 2c  ed up. *.by one,
10400 20 73 69 6e 63 65 20 74 68 65 20 69 6e 74 65 72   since the inter
10410 6e 61 6c 20 72 65 70 20 73 74 6f 72 65 73 20 61  nal rep stores a
10420 20 70 6f 69 6e 74 65 72 20 74 6f 20 69 74 2e 0a   pointer to it..
10430 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *. *-----------
10440 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10450 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10460 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10470 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a  -----------. */.
10480 0a 54 63 6c 5f 4f 62 6a 20 2a 0a 54 63 6c 4e 65  .Tcl_Obj *.TclNe
10490 77 50 72 6f 63 42 6f 64 79 4f 62 6a 28 0a 20 20  wProcBodyObj(.  
104a0 20 20 50 72 6f 63 20 2a 70 72 6f 63 50 74 72 29    Proc *procPtr)
104b0 09 09 2f 2a 20 74 68 65 20 50 72 6f 63 20 73 74  ../* the Proc st
104c0 72 75 63 74 20 74 6f 20 73 74 6f 72 65 20 61 73  ruct to store as
104d0 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 0a 09 09   the internal...
104e0 09 09 20 2a 20 72 65 70 72 65 73 65 6e 74 61 74  .. * representat
104f0 69 6f 6e 2e 20 2a 2f 0a 7b 0a 20 20 20 20 54 63  ion. */.{.    Tc
10500 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 3b 0a 0a  l_Obj *objPtr;..
10510 20 20 20 20 69 66 20 28 21 70 72 6f 63 50 74 72      if (!procPtr
10520 29 20 7b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c  ) {..return NULL
10530 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 54 63 6c  ;.    }..    Tcl
10540 4e 65 77 4f 62 6a 28 6f 62 6a 50 74 72 29 3b 0a  NewObj(objPtr);.
10550 20 20 20 20 69 66 20 28 6f 62 6a 50 74 72 29 20      if (objPtr) 
10560 7b 0a 09 6f 62 6a 50 74 72 2d 3e 74 79 70 65 50  {..objPtr->typeP
10570 74 72 20 3d 20 26 74 63 6c 50 72 6f 63 42 6f 64  tr = &tclProcBod
10580 79 54 79 70 65 3b 0a 09 6f 62 6a 50 74 72 2d 3e  yType;..objPtr->
10590 69 6e 74 65 72 6e 61 6c 52 65 70 2e 74 77 6f 50  internalRep.twoP
105a0 74 72 56 61 6c 75 65 2e 70 74 72 31 20 3d 20 70  trValue.ptr1 = p
105b0 72 6f 63 50 74 72 3b 0a 0a 09 70 72 6f 63 50 74  rocPtr;...procPt
105c0 72 2d 3e 72 65 66 43 6f 75 6e 74 2b 2b 3b 0a 20  r->refCount++;. 
105d0 20 20 20 7d 0a 0a 20 20 20 20 72 65 74 75 72 6e     }..    return
105e0 20 6f 62 6a 50 74 72 3b 0a 7d 0a 0c 0a 2f 2a 0a   objPtr;.}.../*.
105f0 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
10600 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10610 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10620 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10630 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 50  --------. *. * P
10640 72 6f 63 42 6f 64 79 44 75 70 20 2d 2d 0a 20 2a  rocBodyDup --. *
10650 0a 20 2a 09 54 63 6c 5f 4f 62 6a 54 79 70 65 27  . *.Tcl_ObjType'
10660 73 20 44 75 70 20 66 75 6e 63 74 69 6f 6e 20 66  s Dup function f
10670 6f 72 20 74 68 65 20 70 72 6f 63 20 62 6f 64 79  or the proc body
10680 20 6f 62 6a 65 63 74 2e 20 42 75 6d 70 73 20 74   object. Bumps t
10690 68 65 0a 20 2a 09 72 65 66 65 72 65 6e 63 65 20  he. *.reference 
106a0 63 6f 75 6e 74 20 6f 6e 20 74 68 65 20 50 72 6f  count on the Pro
106b0 63 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  c stored in the 
106c0 69 6e 74 65 72 6e 61 6c 20 72 65 70 72 65 73 65  internal represe
106d0 6e 74 61 74 69 6f 6e 2e 0a 20 2a 0a 20 2a 20 52  ntation.. *. * R
106e0 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 2e  esults:. *.None.
106f0 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65  . *. * Side effe
10700 63 74 73 3a 0a 20 2a 09 53 65 74 73 20 75 70 20  cts:. *.Sets up 
10710 74 68 65 20 6f 62 6a 65 63 74 20 69 6e 20 64 75  the object in du
10720 70 50 74 72 20 74 6f 20 62 65 20 61 20 64 75 70  pPtr to be a dup
10730 6c 69 63 61 74 65 20 6f 66 20 74 68 65 20 6f 6e  licate of the on
10740 65 20 69 6e 20 73 72 63 50 74 72 2e 0a 20 2a 0a  e in srcPtr.. *.
10750 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
10760 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10770 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10780 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10790 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74  --------. */..st
107a0 61 74 69 63 20 76 6f 69 64 0a 50 72 6f 63 42 6f  atic void.ProcBo
107b0 64 79 44 75 70 28 0a 20 20 20 20 54 63 6c 5f 4f  dyDup(.    Tcl_O
107c0 62 6a 20 2a 73 72 63 50 74 72 2c 09 09 2f 2a 20  bj *srcPtr,../* 
107d0 4f 62 6a 65 63 74 20 74 6f 20 63 6f 70 79 2e 20  Object to copy. 
107e0 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a  */.    Tcl_Obj *
107f0 64 75 70 50 74 72 29 09 09 2f 2a 20 54 61 72 67  dupPtr)../* Targ
10800 65 74 20 6f 62 6a 65 63 74 20 66 6f 72 20 74 68  et object for th
10810 65 20 64 75 70 6c 69 63 61 74 69 6f 6e 2e 20 2a  e duplication. *
10820 2f 0a 7b 0a 20 20 20 20 50 72 6f 63 20 2a 70 72  /.{.    Proc *pr
10830 6f 63 50 74 72 20 3d 20 73 72 63 50 74 72 2d 3e  ocPtr = srcPtr->
10840 69 6e 74 65 72 6e 61 6c 52 65 70 2e 74 77 6f 50  internalRep.twoP
10850 74 72 56 61 6c 75 65 2e 70 74 72 31 3b 0a 0a 20  trValue.ptr1;.. 
10860 20 20 20 64 75 70 50 74 72 2d 3e 74 79 70 65 50     dupPtr->typeP
10870 74 72 20 3d 20 26 74 63 6c 50 72 6f 63 42 6f 64  tr = &tclProcBod
10880 79 54 79 70 65 3b 0a 20 20 20 20 64 75 70 50 74  yType;.    dupPt
10890 72 2d 3e 69 6e 74 65 72 6e 61 6c 52 65 70 2e 74  r->internalRep.t
108a0 77 6f 50 74 72 56 61 6c 75 65 2e 70 74 72 31 20  woPtrValue.ptr1 
108b0 3d 20 70 72 6f 63 50 74 72 3b 0a 20 20 20 20 70  = procPtr;.    p
108c0 72 6f 63 50 74 72 2d 3e 72 65 66 43 6f 75 6e 74  rocPtr->refCount
108d0 2b 2b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d  ++;.}.../*. *---
108e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
108f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10900 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10910 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10920 2d 2d 2d 0a 20 2a 0a 20 2a 20 50 72 6f 63 42 6f  ---. *. * ProcBo
10930 64 79 46 72 65 65 20 2d 2d 0a 20 2a 0a 20 2a 09  dyFree --. *. *.
10940 54 63 6c 5f 4f 62 6a 54 79 70 65 27 73 20 46 72  Tcl_ObjType's Fr
10950 65 65 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20  ee function for 
10960 74 68 65 20 70 72 6f 63 20 62 6f 64 79 20 6f 62  the proc body ob
10970 6a 65 63 74 2e 20 54 68 65 20 72 65 66 65 72 65  ject. The refere
10980 6e 63 65 0a 20 2a 09 63 6f 75 6e 74 20 6f 6e 20  nce. *.count on 
10990 69 74 73 20 50 72 6f 63 20 73 74 72 75 63 74 20  its Proc struct 
109a0 69 73 20 64 65 63 72 65 61 73 65 64 20 62 79 20  is decreased by 
109b0 31 3b 20 69 66 20 74 68 65 20 63 6f 75 6e 74 20  1; if the count 
109c0 72 65 61 63 68 65 73 20 30 2c 0a 20 2a 09 74 68  reaches 0,. *.th
109d0 65 20 70 72 6f 63 20 69 73 20 66 72 65 65 64 2e  e proc is freed.
109e0 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a  . *. * Results:.
109f0 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 20 53   *.None.. *. * S
10a00 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09  ide effects:. *.
10a10 49 66 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  If the reference
10a20 20 63 6f 75 6e 74 20 6f 6e 20 74 68 65 20 50 72   count on the Pr
10a30 6f 63 20 73 74 72 75 63 74 20 72 65 61 63 68 65  oc struct reache
10a40 73 20 30 2c 20 74 68 65 20 73 74 72 75 63 74 20  s 0, the struct 
10a50 69 73 0a 20 2a 09 66 72 65 65 64 2e 0a 20 2a 0a  is. *.freed.. *.
10a60 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
10a70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10a80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10a90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10aa0 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74  --------. */..st
10ab0 61 74 69 63 20 76 6f 69 64 0a 50 72 6f 63 42 6f  atic void.ProcBo
10ac0 64 79 46 72 65 65 28 0a 20 20 20 20 54 63 6c 5f  dyFree(.    Tcl_
10ad0 4f 62 6a 20 2a 6f 62 6a 50 74 72 29 09 09 2f 2a  Obj *objPtr)../*
10ae0 20 54 68 65 20 6f 62 6a 65 63 74 20 74 6f 20 63   The object to c
10af0 6c 65 61 6e 20 75 70 2e 20 2a 2f 0a 7b 0a 20 20  lean up. */.{.  
10b00 20 20 50 72 6f 63 20 2a 70 72 6f 63 50 74 72 20    Proc *procPtr 
10b10 3d 20 6f 62 6a 50 74 72 2d 3e 69 6e 74 65 72 6e  = objPtr->intern
10b20 61 6c 52 65 70 2e 74 77 6f 50 74 72 56 61 6c 75  alRep.twoPtrValu
10b30 65 2e 70 74 72 31 3b 0a 0a 20 20 20 20 69 66 20  e.ptr1;..    if 
10b40 28 70 72 6f 63 50 74 72 2d 3e 72 65 66 43 6f 75  (procPtr->refCou
10b50 6e 74 2d 2d 20 3c 3d 20 31 29 20 7b 0a 09 54 63  nt-- <= 1) {..Tc
10b60 6c 50 72 6f 63 43 6c 65 61 6e 75 70 50 72 6f 63  lProcCleanupProc
10b70 28 70 72 6f 63 50 74 72 29 3b 0a 20 20 20 20 7d  (procPtr);.    }
10b80 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d  .}.../*. *------
10b90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10ba0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10bb0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10bc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10bd0 0a 20 2a 0a 20 2a 20 44 75 70 4c 61 6d 62 64 61  . *. * DupLambda
10be0 49 6e 74 65 72 6e 61 6c 52 65 70 2c 20 46 72 65  InternalRep, Fre
10bf0 65 4c 61 6d 62 64 61 49 6e 74 65 72 6e 61 6c 52  eLambdaInternalR
10c00 65 70 2c 20 53 65 74 4c 61 6d 62 64 61 46 72 6f  ep, SetLambdaFro
10c10 6d 41 6e 79 20 2d 2d 0a 20 2a 0a 20 2a 09 48 6f  mAny --. *. *.Ho
10c20 77 20 74 6f 20 6d 61 6e 61 67 65 20 74 68 65 20  w to manage the 
10c30 69 6e 74 65 72 6e 61 6c 20 72 65 70 72 65 73 65  internal represe
10c40 6e 74 61 74 69 6f 6e 73 20 6f 66 20 6c 61 6d 62  ntations of lamb
10c50 64 61 20 74 65 72 6d 20 6f 62 6a 65 63 74 73 2e  da term objects.
10c60 0a 20 2a 09 53 79 6e 74 61 63 74 69 63 61 6c 6c  . *.Syntacticall
10c70 79 20 74 68 65 79 20 6c 6f 6f 6b 20 6c 69 6b 65  y they look like
10c80 20 61 20 74 77 6f 2d 20 6f 72 20 74 68 72 65 65   a two- or three
10c90 2d 65 6c 65 6d 65 6e 74 20 6c 69 73 74 2c 20 77  -element list, w
10ca0 68 65 72 65 20 74 68 65 0a 20 2a 09 66 69 72 73  here the. *.firs
10cb0 74 20 65 6c 65 6d 65 6e 74 20 69 73 20 74 68 65  t element is the
10cc0 20 66 6f 72 6d 61 6c 20 61 72 67 75 6d 65 6e 74   formal argument
10cd0 73 2c 20 74 68 65 20 73 65 63 6f 6e 64 20 69 73  s, the second is
10ce0 20 74 68 65 20 74 68 65 20 62 6f 64 79 2c 20 61   the the body, a
10cf0 6e 64 0a 20 2a 09 74 68 65 20 28 6f 70 74 69 6f  nd. *.the (optio
10d00 6e 61 6c 29 20 74 68 69 72 64 20 69 73 20 74 68  nal) third is th
10d10 65 20 6e 61 6d 65 73 70 61 63 65 20 74 6f 20 65  e namespace to e
10d20 78 65 63 75 74 65 20 74 68 65 20 6c 61 6d 62 64  xecute the lambd
10d30 61 20 74 65 72 6d 0a 20 2a 09 77 69 74 68 69 6e  a term. *.within
10d40 20 28 74 68 65 20 67 6c 6f 62 61 6c 20 6e 61 6d   (the global nam
10d50 65 73 70 61 63 65 20 69 73 20 61 73 73 75 6d 65  espace is assume
10d60 64 20 69 66 20 69 74 20 69 73 20 61 62 73 65 6e  d if it is absen
10d70 74 29 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d  t).. *. *-------
10d80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10d90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10da0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10db0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
10dc0 20 2a 2f 0a 0a 73 74 61 74 69 63 20 76 6f 69 64   */..static void
10dd0 0a 44 75 70 4c 61 6d 62 64 61 49 6e 74 65 72 6e  .DupLambdaIntern
10de0 61 6c 52 65 70 28 0a 20 20 20 20 54 63 6c 5f 4f  alRep(.    Tcl_O
10df0 62 6a 20 2a 73 72 63 50 74 72 2c 09 09 2f 2a 20  bj *srcPtr,../* 
10e00 4f 62 6a 65 63 74 20 77 69 74 68 20 69 6e 74 65  Object with inte
10e10 72 6e 61 6c 20 72 65 70 20 74 6f 20 63 6f 70 79  rnal rep to copy
10e20 2e 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a  . */.    Tcl_Obj
10e30 20 2a 63 6f 70 79 50 74 72 29 09 2f 2a 20 4f 62   *copyPtr)./* Ob
10e40 6a 65 63 74 20 77 69 74 68 20 69 6e 74 65 72 6e  ject with intern
10e50 61 6c 20 72 65 70 20 74 6f 20 73 65 74 2e 20 2a  al rep to set. *
10e60 2f 0a 7b 0a 20 20 20 20 50 72 6f 63 20 2a 70 72  /.{.    Proc *pr
10e70 6f 63 50 74 72 20 3d 20 73 72 63 50 74 72 2d 3e  ocPtr = srcPtr->
10e80 69 6e 74 65 72 6e 61 6c 52 65 70 2e 74 77 6f 50  internalRep.twoP
10e90 74 72 56 61 6c 75 65 2e 70 74 72 31 3b 0a 20 20  trValue.ptr1;.  
10ea0 20 20 54 63 6c 5f 4f 62 6a 20 2a 6e 73 4f 62 6a    Tcl_Obj *nsObj
10eb0 50 74 72 20 3d 20 73 72 63 50 74 72 2d 3e 69 6e  Ptr = srcPtr->in
10ec0 74 65 72 6e 61 6c 52 65 70 2e 74 77 6f 50 74 72  ternalRep.twoPtr
10ed0 56 61 6c 75 65 2e 70 74 72 32 3b 0a 0a 20 20 20  Value.ptr2;..   
10ee0 20 63 6f 70 79 50 74 72 2d 3e 69 6e 74 65 72 6e   copyPtr->intern
10ef0 61 6c 52 65 70 2e 74 77 6f 50 74 72 56 61 6c 75  alRep.twoPtrValu
10f00 65 2e 70 74 72 31 20 3d 20 70 72 6f 63 50 74 72  e.ptr1 = procPtr
10f10 3b 0a 20 20 20 20 63 6f 70 79 50 74 72 2d 3e 69  ;.    copyPtr->i
10f20 6e 74 65 72 6e 61 6c 52 65 70 2e 74 77 6f 50 74  nternalRep.twoPt
10f30 72 56 61 6c 75 65 2e 70 74 72 32 20 3d 20 6e 73  rValue.ptr2 = ns
10f40 4f 62 6a 50 74 72 3b 0a 0a 20 20 20 20 70 72 6f  ObjPtr;..    pro
10f50 63 50 74 72 2d 3e 72 65 66 43 6f 75 6e 74 2b 2b  cPtr->refCount++
10f60 3b 0a 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65  ;.    Tcl_IncrRe
10f70 66 43 6f 75 6e 74 28 6e 73 4f 62 6a 50 74 72 29  fCount(nsObjPtr)
10f80 3b 0a 20 20 20 20 63 6f 70 79 50 74 72 2d 3e 74  ;.    copyPtr->t
10f90 79 70 65 50 74 72 20 3d 20 26 74 63 6c 4c 61 6d  ypePtr = &tclLam
10fa0 62 64 61 54 79 70 65 3b 0a 7d 0a 0a 73 74 61 74  bdaType;.}..stat
10fb0 69 63 20 76 6f 69 64 0a 46 72 65 65 4c 61 6d 62  ic void.FreeLamb
10fc0 64 61 49 6e 74 65 72 6e 61 6c 52 65 70 28 0a 20  daInternalRep(. 
10fd0 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50     Tcl_Obj *objP
10fe0 74 72 29 09 2f 2a 20 43 6d 64 4e 61 6d 65 20 6f  tr)./* CmdName o
10ff0 62 6a 65 63 74 20 77 69 74 68 20 69 6e 74 65 72  bject with inter
11000 6e 61 6c 20 72 65 70 72 65 73 65 6e 74 61 74 69  nal representati
11010 6f 6e 0a 09 09 09 09 20 2a 20 74 6f 20 66 72 65  on..... * to fre
11020 65 2e 20 2a 2f 0a 7b 0a 20 20 20 20 50 72 6f 63  e. */.{.    Proc
11030 20 2a 70 72 6f 63 50 74 72 20 3d 20 6f 62 6a 50   *procPtr = objP
11040 74 72 2d 3e 69 6e 74 65 72 6e 61 6c 52 65 70 2e  tr->internalRep.
11050 74 77 6f 50 74 72 56 61 6c 75 65 2e 70 74 72 31  twoPtrValue.ptr1
11060 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6e  ;.    Tcl_Obj *n
11070 73 4f 62 6a 50 74 72 20 3d 20 6f 62 6a 50 74 72  sObjPtr = objPtr
11080 2d 3e 69 6e 74 65 72 6e 61 6c 52 65 70 2e 74 77  ->internalRep.tw
11090 6f 50 74 72 56 61 6c 75 65 2e 70 74 72 32 3b 0a  oPtrValue.ptr2;.
110a0 0a 20 20 20 20 69 66 20 28 70 72 6f 63 50 74 72  .    if (procPtr
110b0 2d 3e 72 65 66 43 6f 75 6e 74 2d 2d 20 3d 3d 20  ->refCount-- == 
110c0 31 29 20 7b 0a 09 54 63 6c 50 72 6f 63 43 6c 65  1) {..TclProcCle
110d0 61 6e 75 70 50 72 6f 63 28 70 72 6f 63 50 74 72  anupProc(procPtr
110e0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c  );.    }.    Tcl
110f0 44 65 63 72 52 65 66 43 6f 75 6e 74 28 6e 73 4f  DecrRefCount(nsO
11100 62 6a 50 74 72 29 3b 0a 20 20 20 20 6f 62 6a 50  bjPtr);.    objP
11110 74 72 2d 3e 74 79 70 65 50 74 72 20 3d 20 4e 55  tr->typePtr = NU
11120 4c 4c 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e  LL;.}..static in
11130 74 0a 53 65 74 4c 61 6d 62 64 61 46 72 6f 6d 41  t.SetLambdaFromA
11140 6e 79 28 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65  ny(.    Tcl_Inte
11150 72 70 20 2a 69 6e 74 65 72 70 2c 09 09 2f 2a 20  rp *interp,../* 
11160 55 73 65 64 20 66 6f 72 20 65 72 72 6f 72 20 72  Used for error r
11170 65 70 6f 72 74 69 6e 67 20 69 66 20 6e 6f 74 20  eporting if not 
11180 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 20 20 54 63 6c  NULL. */.    Tcl
11190 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 29 09 2f 2a  _Obj *objPtr)./*
111a0 20 54 68 65 20 6f 62 6a 65 63 74 20 74 6f 20 63   The object to c
111b0 6f 6e 76 65 72 74 2e 20 2a 2f 0a 7b 0a 20 20 20  onvert. */.{.   
111c0 20 49 6e 74 65 72 70 20 2a 69 50 74 72 20 3d 20   Interp *iPtr = 
111d0 28 49 6e 74 65 72 70 20 2a 29 20 69 6e 74 65 72  (Interp *) inter
111e0 70 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  p;.    const cha
111f0 72 20 2a 6e 61 6d 65 3b 0a 20 20 20 20 54 63 6c  r *name;.    Tcl
11200 5f 4f 62 6a 20 2a 61 72 67 73 50 74 72 2c 20 2a  _Obj *argsPtr, *
11210 62 6f 64 79 50 74 72 2c 20 2a 6e 73 4f 62 6a 50  bodyPtr, *nsObjP
11220 74 72 2c 20 2a 2a 6f 62 6a 76 3b 0a 20 20 20 20  tr, **objv;.    
11230 69 6e 74 20 69 73 4e 65 77 2c 20 6f 62 6a 63 2c  int isNew, objc,
11240 20 72 65 73 75 6c 74 3b 0a 20 20 20 20 43 6d 64   result;.    Cmd
11250 46 72 61 6d 65 20 2a 63 66 50 74 72 20 3d 20 4e  Frame *cfPtr = N
11260 55 4c 4c 3b 0a 20 20 20 20 50 72 6f 63 20 2a 70  ULL;.    Proc *p
11270 72 6f 63 50 74 72 3b 0a 0a 20 20 20 20 69 66 20  rocPtr;..    if 
11280 28 69 6e 74 65 72 70 20 3d 3d 20 4e 55 4c 4c 29  (interp == NULL)
11290 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45   {..return TCL_E
112a0 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  RROR;.    }..   
112b0 20 2f 2a 0a 20 20 20 20 20 2a 20 43 6f 6e 76 65   /*.     * Conve
112c0 72 74 20 6f 62 6a 50 74 72 20 74 6f 20 6c 69 73  rt objPtr to lis
112d0 74 20 74 79 70 65 20 66 69 72 73 74 3b 20 69 66  t type first; if
112e0 20 69 74 20 63 61 6e 6e 6f 74 20 62 65 20 63 6f   it cannot be co
112f0 6e 76 65 72 74 65 64 2c 20 6f 72 20 69 66 20 69  nverted, or if i
11300 74 73 0a 20 20 20 20 20 2a 20 6c 65 6e 67 74 68  ts.     * length
11310 20 69 73 20 6e 6f 74 20 32 2c 20 74 68 65 6e 20   is not 2, then 
11320 69 74 20 63 61 6e 6e 6f 74 20 62 65 20 63 6f 6e  it cannot be con
11330 76 65 72 74 65 64 20 74 6f 20 74 63 6c 4c 61 6d  verted to tclLam
11340 62 64 61 54 79 70 65 2e 0a 20 20 20 20 20 2a 2f  bdaType..     */
11350 0a 0a 20 20 20 20 72 65 73 75 6c 74 20 3d 20 54  ..    result = T
11360 63 6c 4c 69 73 74 4f 62 6a 47 65 74 45 6c 65 6d  clListObjGetElem
11370 65 6e 74 73 28 4e 55 4c 4c 2c 20 6f 62 6a 50 74  ents(NULL, objPt
11380 72 2c 20 26 6f 62 6a 63 2c 20 26 6f 62 6a 76 29  r, &objc, &objv)
11390 3b 0a 20 20 20 20 69 66 20 28 28 72 65 73 75 6c  ;.    if ((resul
113a0 74 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7c 7c 20  t != TCL_OK) || 
113b0 28 28 6f 62 6a 63 20 21 3d 20 32 29 20 26 26 20  ((objc != 2) && 
113c0 28 6f 62 6a 63 20 21 3d 20 33 29 29 29 20 7b 0a  (objc != 3))) {.
113d0 09 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c  .Tcl_SetObjResul
113e0 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4f 62  t(interp, Tcl_Ob
113f0 6a 50 72 69 6e 74 66 28 0a 09 09 22 63 61 6e 27  jPrintf(..."can'
11400 74 20 69 6e 74 65 72 70 72 65 74 20 5c 22 25 73  t interpret \"%s
11410 5c 22 20 61 73 20 61 20 6c 61 6d 62 64 61 20 65  \" as a lambda e
11420 78 70 72 65 73 73 69 6f 6e 22 2c 0a 09 09 54 63  xpression",...Tc
11430 6c 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 50 74  lGetString(objPt
11440 72 29 29 29 3b 0a 09 54 63 6c 5f 53 65 74 45 72  r)));..Tcl_SetEr
11450 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20  rorCode(interp, 
11460 22 54 43 4c 22 2c 20 22 56 41 4c 55 45 22 2c 20  "TCL", "VALUE", 
11470 22 4c 41 4d 42 44 41 22 2c 20 28 63 68 61 72 20  "LAMBDA", (char 
11480 2a 29 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e  *)NULL);..return
11490 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20   TCL_ERROR;.    
114a0 7d 0a 0a 20 20 20 20 61 72 67 73 50 74 72 20 3d  }..    argsPtr =
114b0 20 6f 62 6a 76 5b 30 5d 3b 0a 20 20 20 20 62 6f   objv[0];.    bo
114c0 64 79 50 74 72 20 3d 20 6f 62 6a 76 5b 31 5d 3b  dyPtr = objv[1];
114d0 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20  ..    /*.     * 
114e0 43 72 65 61 74 65 20 61 6e 64 20 69 6e 69 74 69  Create and initi
114f0 61 6c 69 7a 65 20 74 68 65 20 50 72 6f 63 20 73  alize the Proc s
11500 74 72 75 63 74 2e 20 54 68 65 20 63 6d 64 50 74  truct. The cmdPt
11510 72 20 66 69 65 6c 64 20 69 73 20 73 65 74 20 74  r field is set t
11520 6f 20 4e 55 4c 4c 0a 20 20 20 20 20 2a 20 74 6f  o NULL.     * to
11530 20 73 69 67 6e 61 6c 20 74 68 61 74 20 74 68 69   signal that thi
11540 73 20 69 73 20 61 6e 20 61 6e 6f 6e 79 6d 6f 75  s is an anonymou
11550 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 20 20  s function..    
11560 20 2a 2f 0a 0a 20 20 20 20 6e 61 6d 65 20 3d 20   */..    name = 
11570 54 63 6c 47 65 74 53 74 72 69 6e 67 28 6f 62 6a  TclGetString(obj
11580 50 74 72 29 3b 0a 0a 20 20 20 20 69 66 20 28 54  Ptr);..    if (T
11590 63 6c 43 72 65 61 74 65 50 72 6f 63 28 69 6e 74  clCreateProc(int
115a0 65 72 70 2c 20 2f 2a 69 67 6e 6f 72 65 64 20 6e  erp, /*ignored n
115b0 73 50 74 72 2a 2f 20 4e 55 4c 4c 2c 20 6e 61 6d  sPtr*/ NULL, nam
115c0 65 2c 20 61 72 67 73 50 74 72 2c 20 62 6f 64 79  e, argsPtr, body
115d0 50 74 72 2c 0a 09 20 20 20 20 26 70 72 6f 63 50  Ptr,..    &procP
115e0 74 72 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b  tr) != TCL_OK) {
115f0 0a 09 54 63 6c 5f 41 70 70 65 6e 64 4f 62 6a 54  ..Tcl_AppendObjT
11600 6f 45 72 72 6f 72 49 6e 66 6f 28 69 6e 74 65 72  oErrorInfo(inter
11610 70 2c 20 54 63 6c 5f 4f 62 6a 50 72 69 6e 74 66  p, Tcl_ObjPrintf
11620 28 0a 09 09 22 5c 6e 20 20 20 20 28 70 61 72 73  (..."\n    (pars
11630 69 6e 67 20 6c 61 6d 62 64 61 20 65 78 70 72 65  ing lambda expre
11640 73 73 69 6f 6e 20 5c 22 25 73 5c 22 29 22 2c 20  ssion \"%s\")", 
11650 6e 61 6d 65 29 29 3b 0a 09 72 65 74 75 72 6e 20  name));..return 
11660 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  TCL_ERROR;.    }
11670 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20  ..    /*.     * 
11680 43 41 52 45 46 55 4c 3a 20 54 63 6c 43 72 65 61  CAREFUL: TclCrea
11690 74 65 50 72 6f 63 20 72 65 74 75 72 6e 73 20 72  teProc returns r
116a0 65 66 43 6f 75 6e 74 3d 3d 31 21 20 5b 42 75 67  efCount==1! [Bug
116b0 20 31 35 37 38 34 35 34 5d 0a 20 20 20 20 20 2a   1578454].     *
116c0 20 70 72 6f 63 50 74 72 2d 3e 72 65 66 43 6f 75   procPtr->refCou
116d0 6e 74 20 3d 20 31 3b 0a 20 20 20 20 20 2a 2f 0a  nt = 1;.     */.
116e0 0a 20 20 20 20 70 72 6f 63 50 74 72 2d 3e 63 6d  .    procPtr->cm
116f0 64 50 74 72 20 3d 20 4e 55 4c 4c 3b 0a 0a 20 20  dPtr = NULL;..  
11700 20 20 2f 2a 0a 20 20 20 20 20 2a 20 54 49 50 20    /*.     * TIP 
11710 23 32 38 30 3a 20 52 65 6d 65 6d 62 65 72 20 74  #280: Remember t
11720 68 65 20 6c 69 6e 65 20 74 68 65 20 61 70 70 6c  he line the appl
11730 79 20 62 6f 64 79 20 69 73 20 73 74 61 72 74 69  y body is starti
11740 6e 67 20 6f 6e 2e 20 49 6e 20 61 20 42 79 74 65  ng on. In a Byte
11750 0a 20 20 20 20 20 2a 20 63 6f 64 65 20 63 6f 6e  .     * code con
11760 74 65 78 74 20 77 65 20 61 73 6b 20 74 68 65 20  text we ask the 
11770 65 6e 67 69 6e 65 20 74 6f 20 70 72 6f 76 69 64  engine to provid
11780 65 20 75 73 20 77 69 74 68 20 74 68 65 20 6e 65  e us with the ne
11790 63 65 73 73 61 72 79 0a 20 20 20 20 20 2a 20 69  cessary.     * i
117a0 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20 54 68 69 73  nformation. This
117b0 20 69 73 20 66 6f 72 20 74 68 65 20 69 6e 69 74   is for the init
117c0 69 61 6c 69 7a 61 74 69 6f 6e 20 6f 66 20 74 68  ialization of th
117d0 65 20 62 79 74 65 20 63 6f 64 65 20 63 6f 6d 70  e byte code comp
117e0 69 6c 65 72 0a 20 20 20 20 20 2a 20 77 68 65 6e  iler.     * when
117f0 20 74 68 65 20 62 6f 64 79 20 69 73 20 75 73 65   the body is use
11800 64 20 66 6f 72 20 74 68 65 20 66 69 72 73 74 20  d for the first 
11810 74 69 6d 65 2e 0a 20 20 20 20 20 2a 0a 20 20 20  time..     *.   
11820 20 20 2a 20 4e 4f 54 45 3a 20 54 68 65 20 62 6f    * NOTE: The bo
11830 64 79 20 69 73 20 74 68 65 20 73 65 63 6f 6e 64  dy is the second
11840 20 77 6f 72 64 20 69 6e 20 74 68 65 20 27 6f 62   word in the 'ob
11850 6a 50 74 72 27 2e 20 49 74 73 20 6c 6f 63 61 74  jPtr'. Its locat
11860 69 6f 6e 2c 0a 20 20 20 20 20 2a 20 61 63 63 65  ion,.     * acce
11870 73 73 69 62 6c 65 20 74 68 72 6f 75 67 68 20 27  ssible through '
11880 63 6f 6e 74 65 78 74 2e 6c 69 6e 65 5b 31 5d 27  context.line[1]'
11890 20 28 73 65 65 20 62 65 6c 6f 77 29 20 69 73 20   (see below) is 
118a0 74 68 65 72 65 66 6f 72 65 20 6f 6e 6c 79 20 74  therefore only t
118b0 68 65 0a 20 20 20 20 20 2a 20 66 69 72 73 74 20  he.     * first 
118c0 61 70 70 72 6f 78 69 6d 61 74 69 6f 6e 20 6f 66  approximation of
118d0 20 74 68 65 20 61 63 74 75 61 6c 20 6c 69 6e 65   the actual line
118e0 20 74 68 65 20 62 6f 64 79 20 69 73 20 6f 6e 2e   the body is on.
118f0 20 57 65 20 68 61 76 65 20 74 6f 20 75 73 65 0a   We have to use.
11900 20 20 20 20 20 2a 20 74 68 65 20 73 74 72 69 6e       * the strin
11910 67 20 72 65 70 20 6f 66 20 74 68 65 20 27 6f 62  g rep of the 'ob
11920 6a 50 74 72 27 20 74 6f 20 64 65 74 65 72 6d 69  jPtr' to determi
11930 6e 65 20 74 68 65 20 65 78 61 63 74 20 6c 69 6e  ne the exact lin
11940 65 2e 20 54 68 69 73 20 69 73 0a 20 20 20 20 20  e. This is.     
11950 2a 20 61 76 61 69 6c 61 62 6c 65 20 61 6c 72 65  * available alre
11960 61 64 79 20 74 68 72 6f 75 67 68 20 27 6e 61 6d  ady through 'nam
11970 65 27 2e 20 55 73 65 20 27 54 63 6c 4c 69 73 74  e'. Use 'TclList
11980 4c 69 6e 65 73 27 2c 20 73 65 65 20 27 73 77 69  Lines', see 'swi
11990 74 63 68 27 0a 20 20 20 20 20 2a 20 28 74 63 6c  tch'.     * (tcl
119a0 43 6d 64 4d 5a 2e 63 29 2e 0a 20 20 20 20 20 2a  CmdMZ.c)..     *
119b0 0a 20 20 20 20 20 2a 20 54 68 69 73 20 63 6f 64  .     * This cod
119c0 65 20 69 73 20 6e 65 61 72 6c 79 20 69 64 65 6e  e is nearly iden
119d0 74 69 63 61 6c 20 74 6f 20 74 68 65 20 23 32 38  tical to the #28
119e0 30 20 63 6f 64 65 20 69 6e 20 54 63 6c 5f 50 72  0 code in Tcl_Pr
119f0 6f 63 4f 62 6a 43 6d 64 2c 20 73 65 65 0a 20 20  ocObjCmd, see.  
11a00 20 20 20 2a 20 74 68 69 73 20 66 69 6c 65 2e 20     * this file. 
11a10 54 68 65 20 64 69 66 66 65 72 65 6e 63 65 73 20  The differences 
11a20 61 72 65 20 74 68 65 20 64 69 66 66 65 72 65 6e  are the differen
11a30 74 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 62  t index of the b
11a40 6f 64 79 20 69 6e 20 74 68 65 0a 20 20 20 20 20  ody in the.     
11a50 2a 20 6c 69 6e 65 20 61 72 72 61 79 20 6f 66 20  * line array of 
11a60 74 68 65 20 63 6f 6e 74 65 78 74 2c 20 61 6e 64  the context, and
11a70 20 74 68 65 20 73 70 65 63 69 61 6c 20 70 72 6f   the special pro
11a80 63 65 73 73 69 6e 67 20 6d 65 6e 74 69 6f 6e 65  cessing mentione
11a90 64 20 69 6e 20 74 68 65 0a 20 20 20 20 20 2a 20  d in the.     * 
11aa0 70 72 65 76 69 6f 75 73 20 70 61 72 61 67 72 61  previous paragra
11ab0 70 68 20 74 6f 20 74 72 61 63 6b 20 69 6e 74 6f  ph to track into
11ac0 20 74 68 65 20 6c 69 73 74 2e 20 46 69 6e 64 20   the list. Find 
11ad0 61 20 77 61 79 20 74 6f 20 66 61 63 74 6f 72 20  a way to factor 
11ae0 74 68 65 0a 20 20 20 20 20 2a 20 63 6f 6d 6d 6f  the.     * commo
11af0 6e 20 65 6c 65 6d 65 6e 74 73 20 69 6e 74 6f 20  n elements into 
11b00 61 20 73 69 6e 67 6c 65 20 66 75 6e 63 74 69 6f  a single functio
11b10 6e 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20  n..     */..    
11b20 69 66 20 28 69 50 74 72 2d 3e 63 6d 64 46 72 61  if (iPtr->cmdFra
11b30 6d 65 50 74 72 29 20 7b 0a 09 43 6d 64 46 72 61  mePtr) {..CmdFra
11b40 6d 65 20 2a 63 6f 6e 74 65 78 74 50 74 72 20 3d  me *contextPtr =
11b50 20 28 43 6d 64 46 72 61 6d 65 20 2a 29 54 63 6c   (CmdFrame *)Tcl
11b60 53 74 61 63 6b 41 6c 6c 6f 63 28 69 6e 74 65 72  StackAlloc(inter
11b70 70 2c 20 73 69 7a 65 6f 66 28 43 6d 64 46 72 61  p, sizeof(CmdFra
11b80 6d 65 29 29 3b 0a 0a 09 2a 63 6f 6e 74 65 78 74  me));...*context
11b90 50 74 72 20 3d 20 2a 69 50 74 72 2d 3e 63 6d 64  Ptr = *iPtr->cmd
11ba0 46 72 61 6d 65 50 74 72 3b 0a 09 69 66 20 28 63  FramePtr;..if (c
11bb0 6f 6e 74 65 78 74 50 74 72 2d 3e 74 79 70 65 20  ontextPtr->type 
11bc0 3d 3d 20 54 43 4c 5f 4c 4f 43 41 54 49 4f 4e 5f  == TCL_LOCATION_
11bd0 42 43 29 20 7b 0a 09 20 20 20 20 2f 2a 0a 09 20  BC) {..    /*.. 
11be0 20 20 20 20 2a 20 52 65 74 72 69 65 76 65 20 74      * Retrieve t
11bf0 68 65 20 73 6f 75 72 63 65 20 63 6f 6e 74 65 78  he source contex
11c00 74 20 66 72 6f 6d 20 74 68 65 20 62 79 74 65 63  t from the bytec
11c10 6f 64 65 2e 20 54 68 69 73 20 63 61 6c 6c 0a 09  ode. This call..
11c20 20 20 20 20 20 2a 20 61 63 63 6f 75 6e 74 73 20       * accounts 
11c30 66 6f 72 20 74 68 65 20 72 65 66 65 72 65 6e 63  for the referenc
11c40 65 20 74 6f 20 74 68 65 20 73 6f 75 72 63 65 20  e to the source 
11c50 66 69 6c 65 2c 20 69 66 20 61 6e 79 2c 20 68 65  file, if any, he
11c60 6c 64 20 69 6e 0a 09 20 20 20 20 20 2a 20 27 63  ld in..     * 'c
11c70 6f 6e 74 65 78 74 2e 64 61 74 61 2e 65 76 61 6c  ontext.data.eval
11c80 2e 70 61 74 68 27 2e 0a 09 20 20 20 20 20 2a 2f  .path'...     */
11c90 0a 0a 09 20 20 20 20 54 63 6c 47 65 74 53 72 63  ...    TclGetSrc
11ca0 49 6e 66 6f 46 6f 72 50 63 28 63 6f 6e 74 65 78  InfoForPc(contex
11cb0 74 50 74 72 29 3b 0a 09 7d 20 65 6c 73 65 20 69  tPtr);..} else i
11cc0 66 20 28 63 6f 6e 74 65 78 74 50 74 72 2d 3e 74  f (contextPtr->t
11cd0 79 70 65 20 3d 3d 20 54 43 4c 5f 4c 4f 43 41 54  ype == TCL_LOCAT
11ce0 49 4f 4e 5f 53 4f 55 52 43 45 29 20 7b 0a 09 20  ION_SOURCE) {.. 
11cf0 20 20 20 2f 2a 0a 09 20 20 20 20 20 2a 20 57 65     /*..     * We
11d00 20 63 72 65 61 74 65 64 20 61 20 6e 65 77 20 72   created a new r
11d10 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20  eference to the 
11d20 73 6f 75 72 63 65 20 66 69 6c 65 20 70 61 74 68  source file path
11d30 20 6e 61 6d 65 20 77 68 65 6e 20 77 65 0a 09 20   name when we.. 
11d40 20 20 20 20 2a 20 63 72 65 61 74 65 64 20 27 63      * created 'c
11d50 6f 6e 74 65 78 74 27 20 61 62 6f 76 65 2e 20 41  ontext' above. A
11d60 63 63 6f 75 6e 74 20 66 6f 72 20 74 68 65 20 72  ccount for the r
11d70 65 66 65 72 65 6e 63 65 2e 0a 09 20 20 20 20 20  eference...     
11d80 2a 2f 0a 0a 09 20 20 20 20 54 63 6c 5f 49 6e 63  */...    Tcl_Inc
11d90 72 52 65 66 43 6f 75 6e 74 28 63 6f 6e 74 65 78  rRefCount(contex
11da0 74 50 74 72 2d 3e 64 61 74 61 2e 65 76 61 6c 2e  tPtr->data.eval.
11db0 70 61 74 68 29 3b 0a 0a 09 7d 0a 0a 09 69 66 20  path);...}...if 
11dc0 28 63 6f 6e 74 65 78 74 50 74 72 2d 3e 74 79 70  (contextPtr->typ
11dd0 65 20 3d 3d 20 54 43 4c 5f 4c 4f 43 41 54 49 4f  e == TCL_LOCATIO
11de0 4e 5f 53 4f 55 52 43 45 29 20 7b 0a 09 20 20 20  N_SOURCE) {..   
11df0 20 2f 2a 0a 09 20 20 20 20 20 2a 20 57 65 20 63   /*..     * We c
11e00 61 6e 20 72 65 63 6f 72 64 20 73 6f 75 72 63 65  an record source
11e10 20 6c 6f 63 61 74 69 6f 6e 20 77 69 74 68 69 6e   location within
11e20 20 61 20 6c 61 6d 62 64 61 20 6f 6e 6c 79 20 69   a lambda only i
11e30 66 20 74 68 65 20 62 6f 64 79 0a 09 20 20 20 20  f the body..    
11e40 20 2a 20 77 61 73 20 6e 6f 74 20 63 72 65 61 74   * was not creat
11e50 65 64 20 62 79 20 73 75 62 73 74 69 74 75 74 69  ed by substituti
11e60 6f 6e 2e 0a 09 20 20 20 20 20 2a 2f 0a 0a 09 20  on...     */... 
11e70 20 20 20 69 66 20 28 63 6f 6e 74 65 78 74 50 74     if (contextPt
11e80 72 2d 3e 6c 69 6e 65 0a 09 09 20 20 20 20 26 26  r->line...    &&
11e90 20 28 63 6f 6e 74 65 78 74 50 74 72 2d 3e 6e 6c   (contextPtr->nl
11ea0 69 6e 65 20 3e 3d 20 32 29 20 26 26 20 28 63 6f  ine >= 2) && (co
11eb0 6e 74 65 78 74 50 74 72 2d 3e 6c 69 6e 65 5b 31  ntextPtr->line[1
11ec0 5d 20 3e 3d 20 30 29 29 20 7b 0a 09 09 69 6e 74  ] >= 0)) {...int
11ed0 20 62 75 66 5b 32 5d 3b 0a 0a 09 09 2f 2a 0a 09   buf[2];..../*..
11ee0 09 20 2a 20 4d 6f 76 65 20 66 72 6f 6d 20 61 70  . * Move from ap
11ef0 70 72 6f 78 69 6d 61 74 69 6f 6e 20 28 6c 69 6e  proximation (lin
11f00 65 20 6f 66 20 6c 69 73 74 20 63 6d 64 20 77 6f  e of list cmd wo
11f10 72 64 29 20 74 6f 20 61 63 74 75 61 6c 0a 09 09  rd) to actual...
11f20 20 2a 20 6c 6f 63 61 74 69 6f 6e 20 28 6c 69 6e   * location (lin
11f30 65 20 6f 66 20 32 6e 64 20 6c 69 73 74 20 65 6c  e of 2nd list el
11f40 65 6d 65 6e 74 29 2e 0a 09 09 20 2a 2f 0a 0a 09  ement).... */...
11f50 09 63 66 50 74 72 20 3d 20 28 43 6d 64 46 72 61  .cfPtr = (CmdFra
11f60 6d 65 20 2a 29 63 6b 61 6c 6c 6f 63 28 73 69 7a  me *)ckalloc(siz
11f70 65 6f 66 28 43 6d 64 46 72 61 6d 65 29 29 3b 0a  eof(CmdFrame));.
11f80 09 09 54 63 6c 4c 69 73 74 4c 69 6e 65 73 28 6f  ..TclListLines(o
11f90 62 6a 50 74 72 2c 20 63 6f 6e 74 65 78 74 50 74  bjPtr, contextPt
11fa0 72 2d 3e 6c 69 6e 65 5b 31 5d 2c 20 32 2c 20 62  r->line[1], 2, b
11fb0 75 66 2c 20 4e 55 4c 4c 29 3b 0a 0a 09 09 63 66  uf, NULL);....cf
11fc0 50 74 72 2d 3e 6c 65 76 65 6c 20 3d 20 2d 31 3b  Ptr->level = -1;
11fd0 0a 09 09 63 66 50 74 72 2d 3e 74 79 70 65 20 3d  ...cfPtr->type =
11fe0 20 63 6f 6e 74 65 78 74 50 74 72 2d 3e 74 79 70   contextPtr->typ
11ff0 65 3b 0a 09 09 63 66 50 74 72 2d 3e 6c 69 6e 65  e;...cfPtr->line
12000 20 3d 20 28 69 6e 74 20 2a 29 63 6b 61 6c 6c 6f   = (int *)ckallo
12010 63 28 73 69 7a 65 6f 66 28 69 6e 74 29 29 3b 0a  c(sizeof(int));.
12020 09 09 63 66 50 74 72 2d 3e 6c 69 6e 65 5b 30 5d  ..cfPtr->line[0]
12030 20 3d 20 62 75 66 5b 31 5d 3b 0a 09 09 63 66 50   = buf[1];...cfP
12040 74 72 2d 3e 6e 6c 69 6e 65 20 3d 20 31 3b 0a 09  tr->nline = 1;..
12050 09 63 66 50 74 72 2d 3e 66 72 61 6d 65 50 74 72  .cfPtr->framePtr
12060 20 3d 20 4e 55 4c 4c 3b 0a 09 09 63 66 50 74 72   = NULL;...cfPtr
12070 2d 3e 6e 65 78 74 50 74 72 20 3d 20 4e 55 4c 4c  ->nextPtr = NULL
12080 3b 0a 0a 09 09 63 66 50 74 72 2d 3e 64 61 74 61  ;....cfPtr->data
12090 2e 65 76 61 6c 2e 70 61 74 68 20 3d 20 63 6f 6e  .eval.path = con
120a0 74 65 78 74 50 74 72 2d 3e 64 61 74 61 2e 65 76  textPtr->data.ev
120b0 61 6c 2e 70 61 74 68 3b 0a 09 09 54 63 6c 5f 49  al.path;...Tcl_I
120c0 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 66 50 74  ncrRefCount(cfPt
120d0 72 2d 3e 64 61 74 61 2e 65 76 61 6c 2e 70 61 74  r->data.eval.pat
120e0 68 29 3b 0a 0a 09 09 63 66 50 74 72 2d 3e 63 6d  h);....cfPtr->cm
120f0 64 20 3d 20 4e 55 4c 4c 3b 0a 09 09 63 66 50 74  d = NULL;...cfPt
12100 72 2d 3e 6c 65 6e 20 3d 20 30 3b 0a 09 20 20 20  r->len = 0;..   
12110 20 7d 0a 0a 09 20 20 20 20 2f 2a 0a 09 20 20 20   }...    /*..   
12120 20 20 2a 20 27 63 6f 6e 74 65 78 74 50 74 72 27    * 'contextPtr'
12130 20 69 73 20 67 6f 69 6e 67 20 6f 75 74 20 6f 66   is going out of
12140 20 73 63 6f 70 65 2e 20 52 65 6c 65 61 73 65 20   scope. Release 
12150 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 74 68  the reference th
12160 61 74 0a 09 20 20 20 20 20 2a 20 69 74 27 73 20  at..     * it's 
12170 68 6f 6c 64 69 6e 67 20 74 6f 20 74 68 65 20 73  holding to the s
12180 6f 75 72 63 65 20 66 69 6c 65 20 70 61 74 68 0a  ource file path.
12190 09 20 20 20 20 20 2a 2f 0a 0a 09 20 20 20 20 54  .     */...    T
121a0 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28  cl_DecrRefCount(
121b0 63 6f 6e 74 65 78 74 50 74 72 2d 3e 64 61 74 61  contextPtr->data
121c0 2e 65 76 61 6c 2e 70 61 74 68 29 3b 0a 09 7d 0a  .eval.path);..}.
121d0 09 54 63 6c 53 74 61 63 6b 46 72 65 65 28 69 6e  .TclStackFree(in
121e0 74 65 72 70 2c 20 63 6f 6e 74 65 78 74 50 74 72  terp, contextPtr
121f0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c  );.    }.    Tcl
12200 5f 53 65 74 48 61 73 68 56 61 6c 75 65 28 54 63  _SetHashValue(Tc
12210 6c 5f 43 72 65 61 74 65 48 61 73 68 45 6e 74 72  l_CreateHashEntr
12220 79 28 69 50 74 72 2d 3e 6c 69 6e 65 50 42 6f 64  y(iPtr->linePBod
12230 79 50 74 72 2c 20 70 72 6f 63 50 74 72 2c 0a 09  yPtr, procPtr,..
12240 20 20 20 20 26 69 73 4e 65 77 29 2c 20 63 66 50      &isNew), cfP
12250 74 72 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20  tr);..    /*.   
12260 20 20 2a 20 53 65 74 20 74 68 65 20 6e 61 6d 65    * Set the name
12270 73 70 61 63 65 20 66 6f 72 20 74 68 69 73 20 6c  space for this l
12280 61 6d 62 64 61 3a 20 67 69 76 65 6e 20 62 79 20  ambda: given by 
12290 6f 62 6a 76 5b 32 5d 20 75 6e 64 65 72 73 74 6f  objv[2] understo
122a0 6f 64 20 61 73 20 61 0a 20 20 20 20 20 2a 20 67  od as a.     * g
122b0 6c 6f 62 61 6c 20 72 65 66 65 72 65 6e 63 65 2c  lobal reference,
122c0 20 6f 72 20 65 6c 73 65 20 67 6c 6f 62 61 6c 20   or else global 
122d0 70 65 72 20 64 65 66 61 75 6c 74 2e 0a 20 20 20  per default..   
122e0 20 20 2a 2f 0a 0a 20 20 20 20 69 66 20 28 6f 62    */..    if (ob
122f0 6a 63 20 3d 3d 20 32 29 20 7b 0a 09 54 63 6c 4e  jc == 2) {..TclN
12300 65 77 4c 69 74 65 72 61 6c 53 74 72 69 6e 67 4f  ewLiteralStringO
12310 62 6a 28 6e 73 4f 62 6a 50 74 72 2c 20 22 3a 3a  bj(nsObjPtr, "::
12320 22 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b  ");.    } else {
12330 0a 09 63 6f 6e 73 74 20 63 68 61 72 20 2a 6e 73  ..const char *ns
12340 4e 61 6d 65 20 3d 20 54 63 6c 47 65 74 53 74 72  Name = TclGetStr
12350 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a 0a 09  ing(objv[2]);...
12360 69 66 20 28 28 2a 6e 73 4e 61 6d 65 20 21 3d 20  if ((*nsName != 
12370 27 3a 27 29 20 7c 7c 20 28 2a 28 6e 73 4e 61 6d  ':') || (*(nsNam
12380 65 2b 31 29 20 21 3d 20 27 3a 27 29 29 20 7b 0a  e+1) != ':')) {.
12390 09 20 20 20 20 54 63 6c 4e 65 77 4c 69 74 65 72  .    TclNewLiter
123a0 61 6c 53 74 72 69 6e 67 4f 62 6a 28 6e 73 4f 62  alStringObj(nsOb
123b0 6a 50 74 72 2c 20 22 3a 3a 22 29 3b 0a 09 20 20  jPtr, "::");..  
123c0 20 20 54 63 6c 5f 41 70 70 65 6e 64 4f 62 6a 54    Tcl_AppendObjT
123d0 6f 4f 62 6a 28 6e 73 4f 62 6a 50 74 72 2c 20 6f  oObj(nsObjPtr, o
123e0 62 6a 76 5b 32 5d 29 3b 0a 09 7d 20 65 6c 73 65  bjv[2]);..} else
123f0 20 7b 0a 09 20 20 20 20 6e 73 4f 62 6a 50 74 72   {..    nsObjPtr
12400 20 3d 20 6f 62 6a 76 5b 32 5d 3b 0a 09 7d 0a 20   = objv[2];..}. 
12410 20 20 20 7d 0a 0a 20 20 20 20 54 63 6c 5f 49 6e     }..    Tcl_In
12420 63 72 52 65 66 43 6f 75 6e 74 28 6e 73 4f 62 6a  crRefCount(nsObj
12430 50 74 72 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20  Ptr);..    /*.  
12440 20 20 20 2a 20 46 72 65 65 20 74 68 65 20 6c 69     * Free the li
12450 73 74 20 69 6e 74 65 72 6e 61 6c 72 65 70 20 6f  st internalrep o
12460 66 20 6f 62 6a 50 74 72 20 2d 20 74 68 69 73 20  f objPtr - this 
12470 77 69 6c 6c 20 66 72 65 65 20 61 72 67 73 50 74  will free argsPt
12480 72 2c 20 62 75 74 0a 20 20 20 20 20 2a 20 62 6f  r, but.     * bo
12490 64 79 50 74 72 20 72 65 74 61 69 6e 73 20 61 20  dyPtr retains a 
124a0 72 65 66 65 72 65 6e 63 65 20 66 72 6f 6d 20 74  reference from t
124b0 68 65 20 50 72 6f 63 20 73 74 72 75 63 74 75 72  he Proc structur
124c0 65 2e 20 54 68 65 6e 20 66 69 6e 69 73 68 20 74  e. Then finish t
124d0 68 65 0a 20 20 20 20 20 2a 20 63 6f 6e 76 65 72  he.     * conver
124e0 73 69 6f 6e 20 74 6f 20 74 63 6c 4c 61 6d 62 64  sion to tclLambd
124f0 61 54 79 70 65 2e 0a 20 20 20 20 20 2a 2f 0a 0a  aType..     */..
12500 20 20 20 20 54 63 6c 46 72 65 65 49 6e 74 52 65      TclFreeIntRe
12510 70 28 6f 62 6a 50 74 72 29 3b 0a 0a 20 20 20 20  p(objPtr);..    
12520 6f 62 6a 50 74 72 2d 3e 69 6e 74 65 72 6e 61 6c  objPtr->internal
12530 52 65 70 2e 74 77 6f 50 74 72 56 61 6c 75 65 2e  Rep.twoPtrValue.
12540 70 74 72 31 20 3d 20 70 72 6f 63 50 74 72 3b 0a  ptr1 = procPtr;.
12550 20 20 20 20 6f 62 6a 50 74 72 2d 3e 69 6e 74 65      objPtr->inte
12560 72 6e 61 6c 52 65 70 2e 74 77 6f 50 74 72 56 61  rnalRep.twoPtrVa
12570 6c 75 65 2e 70 74 72 32 20 3d 20 6e 73 4f 62 6a  lue.ptr2 = nsObj
12580 50 74 72 3b 0a 20 20 20 20 6f 62 6a 50 74 72 2d  Ptr;.    objPtr-
12590 3e 74 79 70 65 50 74 72 20 3d 20 26 74 63 6c 4c  >typePtr = &tclL
125a0 61 6d 62 64 61 54 79 70 65 3b 0a 20 20 20 20 72  ambdaType;.    r
125b0 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a  eturn TCL_OK;.}.
125c0 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  ../*. *---------
125d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
125e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
125f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12600 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
12610 0a 20 2a 20 54 63 6c 5f 41 70 70 6c 79 4f 62 6a  . * Tcl_ApplyObj
12620 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69  Cmd --. *. *.Thi
12630 73 20 6f 62 6a 65 63 74 2d 62 61 73 65 64 20 66  s object-based f
12640 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e 76 6f 6b  unction is invok
12650 65 64 20 74 6f 20 70 72 6f 63 65 73 73 20 74 68  ed to process th
12660 65 20 22 61 70 70 6c 79 22 20 54 63 6c 0a 20 2a  e "apply" Tcl. *
12670 09 63 6f 6d 6d 61 6e 64 2e 20 53 65 65 20 74 68  .command. See th
12680 65 20 75 73 65 72 20 64 6f 63 75 6d 65 6e 74 61  e user documenta
12690 74 69 6f 6e 20 66 6f 72 20 64 65 74 61 69 6c 73  tion for details
126a0 20 6f 6e 20 77 68 61 74 20 69 74 20 64 6f 65 73   on what it does
126b0 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a  .. *. * Results:
126c0 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 54  . *.A standard T
126d0 63 6c 20 6f 62 6a 65 63 74 20 72 65 73 75 6c 74  cl object result
126e0 20 76 61 6c 75 65 2e 0a 20 2a 0a 20 2a 20 53 69   value.. *. * Si
126f0 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 44  de effects:. *.D
12700 65 70 65 6e 64 73 20 6f 6e 20 74 68 65 20 63 6f  epends on the co
12710 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 6c 61 6d  ntent of the lam
12720 62 64 61 20 74 65 72 6d 20 28 69 2e 65 2e 2c 20  bda term (i.e., 
12730 6f 62 6a 76 5b 31 5d 29 2e 0a 20 2a 0a 20 2a 2d  objv[1]).. *. *-
12740 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12750 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12760 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12770 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12780 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 69 6e 74 0a 54  -----. */..int.T
12790 63 6c 5f 41 70 70 6c 79 4f 62 6a 43 6d 64 28 0a  cl_ApplyObjCmd(.
127a0 20 20 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63      ClientData c
127b0 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 20 20 54  lientData,.    T
127c0 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
127d0 70 2c 09 09 2f 2a 20 43 75 72 72 65 6e 74 20 69  p,../* Current i
127e0 6e 74 65 72 70 72 65 74 65 72 2e 20 2a 2f 0a 20  nterpreter. */. 
127f0 20 20 20 69 6e 74 20 6f 62 6a 63 2c 09 09 09 2f     int objc,.../
12800 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
12810 6d 65 6e 74 73 2e 20 2a 2f 0a 20 20 20 20 54 63  ments. */.    Tc
12820 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 6a  l_Obj *const obj
12830 76 5b 5d 29 09 2f 2a 20 41 72 67 75 6d 65 6e 74  v[])./* Argument
12840 20 6f 62 6a 65 63 74 73 2e 20 2a 2f 0a 7b 0a 20   objects. */.{. 
12850 20 20 20 72 65 74 75 72 6e 20 54 63 6c 5f 4e 52     return Tcl_NR
12860 43 61 6c 6c 4f 62 6a 50 72 6f 63 28 69 6e 74 65  CallObjProc(inte
12870 72 70 2c 20 54 63 6c 4e 52 41 70 70 6c 79 4f 62  rp, TclNRApplyOb
12880 6a 43 6d 64 2c 20 63 6c 69 65 6e 74 44 61 74 61  jCmd, clientData
12890 2c 20 6f 62 6a 63 2c 20 6f 62 6a 76 29 3b 0a 7d  , objc, objv);.}
128a0 0a 0a 69 6e 74 0a 54 63 6c 4e 52 41 70 70 6c 79  ..int.TclNRApply
128b0 4f 62 6a 43 6d 64 28 0a 20 20 20 20 43 6c 69 65  ObjCmd(.    Clie
128c0 6e 74 44 61 74 61 20 64 75 6d 6d 79 2c 09 09 2f  ntData dummy,../
128d0 2a 20 4e 6f 74 20 75 73 65 64 2e 20 2a 2f 0a 20  * Not used. */. 
128e0 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69     Tcl_Interp *i
128f0 6e 74 65 72 70 2c 09 09 2f 2a 20 43 75 72 72 65  nterp,../* Curre
12900 6e 74 20 69 6e 74 65 72 70 72 65 74 65 72 2e 20  nt interpreter. 
12910 2a 2f 0a 20 20 20 20 69 6e 74 20 6f 62 6a 63 2c  */.    int objc,
12920 09 09 09 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20  .../* Number of 
12930 61 72 67 75 6d 65 6e 74 73 2e 20 2a 2f 0a 20 20  arguments. */.  
12940 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74    Tcl_Obj *const
12950 20 6f 62 6a 76 5b 5d 29 09 2f 2a 20 41 72 67 75   objv[])./* Argu
12960 6d 65 6e 74 20 6f 62 6a 65 63 74 73 2e 20 2a 2f  ment objects. */
12970 0a 7b 0a 20 20 20 20 49 6e 74 65 72 70 20 2a 69  .{.    Interp *i
12980 50 74 72 20 3d 20 28 49 6e 74 65 72 70 20 2a 29  Ptr = (Interp *)
12990 20 69 6e 74 65 72 70 3b 0a 20 20 20 20 50 72 6f   interp;.    Pro
129a0 63 20 2a 70 72 6f 63 50 74 72 20 3d 20 4e 55 4c  c *procPtr = NUL
129b0 4c 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a  L;.    Tcl_Obj *
129c0 6c 61 6d 62 64 61 50 74 72 2c 20 2a 6e 73 4f 62  lambdaPtr, *nsOb
129d0 6a 50 74 72 3b 0a 20 20 20 20 69 6e 74 20 72 65  jPtr;.    int re
129e0 73 75 6c 74 3b 0a 20 20 20 20 54 63 6c 5f 4e 61  sult;.    Tcl_Na
129f0 6d 65 73 70 61 63 65 20 2a 6e 73 50 74 72 3b 0a  mespace *nsPtr;.
12a00 20 20 20 20 41 70 70 6c 79 45 78 74 72 61 44 61      ApplyExtraDa
12a10 74 61 20 2a 65 78 74 72 61 50 74 72 3b 0a 0a 20  ta *extraPtr;.. 
12a20 20 20 20 69 66 20 28 6f 62 6a 63 20 3c 20 32 29     if (objc < 2)
12a30 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d   {..Tcl_WrongNum
12a40 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20  Args(interp, 1, 
12a50 6f 62 6a 76 2c 20 22 6c 61 6d 62 64 61 45 78 70  objv, "lambdaExp
12a60 72 20 3f 61 72 67 20 2e 2e 2e 3f 22 29 3b 0a 09  r ?arg ...?");..
12a70 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52  return TCL_ERROR
12a80 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a  ;.    }..    /*.
12a90 20 20 20 20 20 2a 20 53 65 74 20 6c 61 6d 62 64       * Set lambd
12aa0 61 50 74 72 2c 20 63 6f 6e 76 65 72 74 20 69 74  aPtr, convert it
12ab0 20 74 6f 20 74 63 6c 4c 61 6d 62 64 61 54 79 70   to tclLambdaTyp
12ac0 65 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74  e in the current
12ad0 20 69 6e 74 65 72 70 20 69 66 0a 20 20 20 20 20   interp if.     
12ae0 2a 20 6e 65 63 65 73 73 61 72 79 2e 0a 20 20 20  * necessary..   
12af0 20 20 2a 2f 0a 0a 20 20 20 20 6c 61 6d 62 64 61    */..    lambda
12b00 50 74 72 20 3d 20 6f 62 6a 76 5b 31 5d 3b 0a 20  Ptr = objv[1];. 
12b10 20 20 20 69 66 20 28 6c 61 6d 62 64 61 50 74 72     if (lambdaPtr
12b20 2d 3e 74 79 70 65 50 74 72 20 3d 3d 20 26 74 63  ->typePtr == &tc
12b30 6c 4c 61 6d 62 64 61 54 79 70 65 29 20 7b 0a 09  lLambdaType) {..
12b40 70 72 6f 63 50 74 72 20 3d 20 6c 61 6d 62 64 61  procPtr = lambda
12b50 50 74 72 2d 3e 69 6e 74 65 72 6e 61 6c 52 65 70  Ptr->internalRep
12b60 2e 74 77 6f 50 74 72 56 61 6c 75 65 2e 70 74 72  .twoPtrValue.ptr
12b70 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  1;.    }..    if
12b80 20 28 28 70 72 6f 63 50 74 72 20 3d 3d 20 4e 55   ((procPtr == NU
12b90 4c 4c 29 20 7c 7c 20 28 70 72 6f 63 50 74 72 2d  LL) || (procPtr-
12ba0 3e 69 50 74 72 20 21 3d 20 69 50 74 72 29 29 20  >iPtr != iPtr)) 
12bb0 7b 0a 09 72 65 73 75 6c 74 20 3d 20 53 65 74 4c  {..result = SetL
12bc0 61 6d 62 64 61 46 72 6f 6d 41 6e 79 28 69 6e 74  ambdaFromAny(int
12bd0 65 72 70 2c 20 6c 61 6d 62 64 61 50 74 72 29 3b  erp, lambdaPtr);
12be0 0a 09 69 66 20 28 72 65 73 75 6c 74 20 21 3d 20  ..if (result != 
12bf0 54 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20 20 20 72  TCL_OK) {..    r
12c00 65 74 75 72 6e 20 72 65 73 75 6c 74 3b 0a 09 7d  eturn result;..}
12c10 0a 09 70 72 6f 63 50 74 72 20 3d 20 6c 61 6d 62  ..procPtr = lamb
12c20 64 61 50 74 72 2d 3e 69 6e 74 65 72 6e 61 6c 52  daPtr->internalR
12c30 65 70 2e 74 77 6f 50 74 72 56 61 6c 75 65 2e 70  ep.twoPtrValue.p
12c40 74 72 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  tr1;.    }..    
12c50 2f 2a 0a 20 20 20 20 20 2a 20 46 69 6e 64 20 74  /*.     * Find t
12c60 68 65 20 6e 61 6d 65 73 70 61 63 65 20 77 68 65  he namespace whe
12c70 72 65 20 74 68 69 73 20 6c 61 6d 62 64 61 20 73  re this lambda s
12c80 68 6f 75 6c 64 20 72 75 6e 2c 20 61 6e 64 20 70  hould run, and p
12c90 75 73 68 20 61 20 63 61 6c 6c 20 66 72 61 6d 65  ush a call frame
12ca0 0a 20 20 20 20 20 2a 20 66 6f 72 20 74 68 61 74  .     * for that
12cb0 20 6e 61 6d 65 73 70 61 63 65 2e 20 4e 6f 74 65   namespace. Note
12cc0 20 74 68 61 74 20 54 63 6c 4f 62 6a 49 6e 74 65   that TclObjInte
12cd0 72 70 50 72 6f 63 28 29 20 77 69 6c 6c 20 70 6f  rpProc() will po
12ce0 70 20 69 74 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20  p it..     */.. 
12cf0 20 20 20 6e 73 4f 62 6a 50 74 72 20 3d 20 6c 61     nsObjPtr = la
12d00 6d 62 64 61 50 74 72 2d 3e 69 6e 74 65 72 6e 61  mbdaPtr->interna
12d10 6c 52 65 70 2e 74 77 6f 50 74 72 56 61 6c 75 65  lRep.twoPtrValue
12d20 2e 70 74 72 32 3b 0a 20 20 20 20 72 65 73 75 6c  .ptr2;.    resul
12d30 74 20 3d 20 54 63 6c 47 65 74 4e 61 6d 65 73 70  t = TclGetNamesp
12d40 61 63 65 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 72  aceFromObj(inter
12d50 70 2c 20 6e 73 4f 62 6a 50 74 72 2c 20 26 6e 73  p, nsObjPtr, &ns
12d60 50 74 72 29 3b 0a 20 20 20 20 69 66 20 28 72 65  Ptr);.    if (re
12d70 73 75 6c 74 20 21 3d 20 54 43 4c 5f 4f 4b 29 20  sult != TCL_OK) 
12d80 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52  {..return TCL_ER
12d90 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ROR;.    }..    
12da0 65 78 74 72 61 50 74 72 20 3d 20 28 41 70 70 6c  extraPtr = (Appl
12db0 79 45 78 74 72 61 44 61 74 61 20 2a 29 54 63 6c  yExtraData *)Tcl
12dc0 53 74 61 63 6b 41 6c 6c 6f 63 28 69 6e 74 65 72  StackAlloc(inter
12dd0 70 2c 20 73 69 7a 65 6f 66 28 41 70 70 6c 79 45  p, sizeof(ApplyE
12de0 78 74 72 61 44 61 74 61 29 29 3b 0a 20 20 20 20  xtraData));.    
12df0 6d 65 6d 73 65 74 28 26 65 78 74 72 61 50 74 72  memset(&extraPtr
12e00 2d 3e 63 6d 64 2c 20 30 2c 20 73 69 7a 65 6f 66  ->cmd, 0, sizeof
12e10 28 43 6f 6d 6d 61 6e 64 29 29 3b 0a 20 20 20 20  (Command));.    
12e20 70 72 6f 63 50 74 72 2d 3e 63 6d 64 50 74 72 20  procPtr->cmdPtr 
12e30 3d 20 26 65 78 74 72 61 50 74 72 2d 3e 63 6d 64  = &extraPtr->cmd
12e40 3b 0a 20 20 20 20 65 78 74 72 61 50 74 72 2d 3e  ;.    extraPtr->
12e50 63 6d 64 2e 6e 73 50 74 72 20 3d 20 28 4e 61 6d  cmd.nsPtr = (Nam
12e60 65 73 70 61 63 65 20 2a 29 20 6e 73 50 74 72 3b  espace *) nsPtr;
12e70 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20  ..    /*.     * 
12e80 54 49 50 23 32 38 30 20 28 73 65 6d 69 2d 29 48  TIP#280 (semi-)H
12e90 41 43 4b 21 0a 20 20 20 20 20 2a 0a 20 20 20 20  ACK!.     *.    
12ea0 20 2a 20 55 73 69 6e 67 20 63 6d 64 2e 63 6c 69   * Using cmd.cli
12eb0 65 6e 74 44 61 74 61 20 74 6f 20 74 65 6c 6c 20  entData to tell 
12ec0 5b 69 6e 66 6f 20 66 72 61 6d 65 5d 20 68 6f 77  [info frame] how
12ed0 20 74 6f 20 72 65 6e 64 65 72 20 74 68 65 20 6c   to render the l
12ee0 61 6d 62 64 61 50 74 72 2e 0a 20 20 20 20 20 2a  ambdaPtr..     *
12ef0 20 54 68 65 20 49 6e 66 6f 46 72 61 6d 65 43 6d   The InfoFrameCm
12f00 64 20 77 69 6c 6c 20 64 65 74 65 63 74 20 74 68  d will detect th
12f10 69 73 20 63 61 73 65 20 62 79 20 74 65 73 74 69  is case by testi
12f20 6e 67 20 63 6d 64 2e 68 50 74 72 20 66 6f 72 20  ng cmd.hPtr for 
12f30 4e 55 4c 4c 2e 0a 20 20 20 20 20 2a 20 54 68 69  NULL..     * Thi
12f40 73 20 63 6f 6e 64 69 74 69 6f 6e 20 68 6f 6c 64  s condition hold
12f50 73 20 68 65 72 65 20 62 65 63 61 75 73 65 20 6f  s here because o
12f60 66 20 74 68 65 20 6d 65 6d 73 65 74 28 29 20 61  f the memset() a
12f70 62 6f 76 65 2c 20 61 6e 64 20 6e 6f 77 68 65 72  bove, and nowher
12f80 65 0a 20 20 20 20 20 2a 20 65 6c 73 65 20 28 69  e.     * else (i
12f90 6e 20 74 68 65 20 63 6f 72 65 29 2e 20 52 65 67  n the core). Reg
12fa0 75 6c 61 72 20 63 6f 6d 6d 61 6e 64 73 20 61 6c  ular commands al
12fb0 77 61 79 73 20 68 61 76 65 20 61 20 76 61 6c 69  ways have a vali
12fc0 64 20 68 50 74 72 2c 20 61 6e 64 0a 20 20 20 20  d hPtr, and.    
12fd0 20 2a 20 6c 61 6d 62 64 61 27 73 20 6e 65 76 65   * lambda's neve
12fe0 72 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20  r..     */..    
12ff0 65 78 74 72 61 50 74 72 2d 3e 65 66 69 2e 6c 65  extraPtr->efi.le
13000 6e 67 74 68 20 3d 20 31 3b 0a 20 20 20 20 65 78  ngth = 1;.    ex
13010 74 72 61 50 74 72 2d 3e 65 66 69 2e 66 69 65 6c  traPtr->efi.fiel
13020 64 73 5b 30 5d 2e 6e 61 6d 65 20 3d 20 22 6c 61  ds[0].name = "la
13030 6d 62 64 61 22 3b 0a 20 20 20 20 65 78 74 72 61  mbda";.    extra
13040 50 74 72 2d 3e 65 66 69 2e 66 69 65 6c 64 73 5b  Ptr->efi.fields[
13050 30 5d 2e 70 72 6f 63 20 3d 20 4e 55 4c 4c 3b 0a  0].proc = NULL;.
13060 20 20 20 20 65 78 74 72 61 50 74 72 2d 3e 65 66      extraPtr->ef
13070 69 2e 66 69 65 6c 64 73 5b 30 5d 2e 63 6c 69 65  i.fields[0].clie
13080 6e 74 44 61 74 61 20 3d 20 6c 61 6d 62 64 61 50  ntData = lambdaP
13090 74 72 3b 0a 20 20 20 20 65 78 74 72 61 50 74 72  tr;.    extraPtr
130a0 2d 3e 63 6d 64 2e 63 6c 69 65 6e 74 44 61 74 61  ->cmd.clientData
130b0 20 3d 20 26 65 78 74 72 61 50 74 72 2d 3e 65 66   = &extraPtr->ef
130c0 69 3b 0a 0a 20 20 20 20 72 65 73 75 6c 74 20 3d  i;..    result =
130d0 20 54 63 6c 50 75 73 68 50 72 6f 63 43 61 6c 6c   TclPushProcCall
130e0 46 72 61 6d 65 28 70 72 6f 63 50 74 72 2c 20 69  Frame(procPtr, i
130f0 6e 74 65 72 70 2c 20 6f 62 6a 63 2c 20 6f 62 6a  nterp, objc, obj
13100 76 2c 20 31 29 3b 0a 20 20 20 20 69 66 20 28 72  v, 1);.    if (r
13110 65 73 75 6c 74 20 3d 3d 20 54 43 4c 5f 4f 4b 29  esult == TCL_OK)
13120 20 7b 0a 09 54 63 6c 4e 52 41 64 64 43 61 6c 6c   {..TclNRAddCall
13130 62 61 63 6b 28 69 6e 74 65 72 70 2c 20 41 70 70  back(interp, App
13140 6c 79 4e 52 32 2c 20 65 78 74 72 61 50 74 72 2c  lyNR2, extraPtr,
13150 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 4e 55 4c   NULL, NULL, NUL
13160 4c 29 3b 0a 09 72 65 73 75 6c 74 20 3d 20 54 63  L);..result = Tc
13170 6c 4e 52 49 6e 74 65 72 70 50 72 6f 63 43 6f 72  lNRInterpProcCor
13180 65 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31  e(interp, objv[1
13190 5d 2c 20 32 2c 20 26 4d 61 6b 65 4c 61 6d 62 64  ], 2, &MakeLambd
131a0 61 45 72 72 6f 72 29 3b 0a 20 20 20 20 7d 0a 20  aError);.    }. 
131b0 20 20 20 72 65 74 75 72 6e 20 72 65 73 75 6c 74     return result
131c0 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 0a  ;.}..static int.
131d0 41 70 70 6c 79 4e 52 32 28 0a 20 20 20 20 43 6c  ApplyNR2(.    Cl
131e0 69 65 6e 74 44 61 74 61 20 64 61 74 61 5b 5d 2c  ientData data[],
131f0 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20  .    Tcl_Interp 
13200 2a 69 6e 74 65 72 70 2c 0a 20 20 20 20 69 6e 74  *interp,.    int
13210 20 72 65 73 75 6c 74 29 0a 7b 0a 20 20 20 20 41   result).{.    A
13220 70 70 6c 79 45 78 74 72 61 44 61 74 61 20 2a 65  pplyExtraData *e
13230 78 74 72 61 50 74 72 20 3d 20 28 41 70 70 6c 79  xtraPtr = (Apply
13240 45 78 74 72 61 44 61 74 61 20 2a 29 64 61 74 61  ExtraData *)data
13250 5b 30 5d 3b 0a 0a 20 20 20 20 54 63 6c 53 74 61  [0];..    TclSta
13260 63 6b 46 72 65 65 28 69 6e 74 65 72 70 2c 20 65  ckFree(interp, e
13270 78 74 72 61 50 74 72 29 3b 0a 20 20 20 20 72 65  xtraPtr);.    re
13280 74 75 72 6e 20 72 65 73 75 6c 74 3b 0a 7d 0a 0c  turn result;.}..
13290 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ./*. *----------
132a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
132b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
132c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
132d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a  ------------. *.
132e0 20 2a 20 4d 61 6b 65 4c 61 6d 62 64 61 45 72 72   * MakeLambdaErr
132f0 6f 72 20 2d 2d 0a 20 2a 0a 20 2a 09 46 75 6e 63  or --. *. *.Func
13300 74 69 6f 6e 20 63 61 6c 6c 65 64 20 62 79 20 54  tion called by T
13310 63 6c 4f 62 6a 49 6e 74 65 72 70 50 72 6f 63 20  clObjInterpProc 
13320 74 6f 20 63 72 65 61 74 65 20 74 68 65 20 73 74  to create the st
13330 61 63 6b 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a  ack information.
13340 20 2a 09 75 70 6f 6e 20 61 6e 20 65 72 72 6f 72   *.upon an error
13350 20 66 72 6f 6d 20 61 20 6c 61 6d 62 64 61 20 74   from a lambda t
13360 65 72 6d 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c  erm.. *. * Resul
13370 74 73 3a 0a 20 2a 09 54 68 65 20 69 6e 74 65 72  ts:. *.The inter
13380 70 72 65 74 65 72 27 73 20 65 72 72 6f 72 20 69  preter's error i
13390 6e 66 6f 20 74 72 61 63 65 20 69 73 20 73 65 74  nfo trace is set
133a0 20 74 6f 20 61 20 76 61 6c 75 65 20 74 68 61 74   to a value that
133b0 20 73 75 70 70 6c 65 6d 65 6e 74 73 0a 20 2a 09   supplements. *.
133c0 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a  the error code..
133d0 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63   *. * Side effec
133e0 74 73 3a 0a 20 2a 09 6e 6f 6e 65 2e 0a 20 2a 0a  ts:. *.none.. *.
133f0 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   *--------------
13400 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13410 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13420 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13430 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74  --------. */..st
13440 61 74 69 63 20 76 6f 69 64 0a 4d 61 6b 65 4c 61  atic void.MakeLa
13450 6d 62 64 61 45 72 72 6f 72 28 0a 20 20 20 20 54  mbdaError(.    T
13460 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72  cl_Interp *inter
13470 70 2c 09 09 2f 2a 20 54 68 65 20 69 6e 74 65 72  p,../* The inter
13480 70 72 65 74 65 72 20 69 6e 20 77 68 69 63 68 20  preter in which 
13490 74 68 65 20 70 72 6f 63 65 64 75 72 65 20 77 61  the procedure wa
134a0 73 0a 09 09 09 09 20 2a 20 63 61 6c 6c 65 64 2e  s..... * called.
134b0 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20   */.    Tcl_Obj 
134c0 2a 70 72 6f 63 4e 61 6d 65 4f 62 6a 29 09 2f 2a  *procNameObj)./*
134d0 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 70 72 6f   Name of the pro
134e0 63 65 64 75 72 65 2e 20 55 73 65 64 20 66 6f 72  cedure. Used for
134f0 20 65 72 72 6f 72 0a 09 09 09 09 20 2a 20 6d 65   error..... * me
13500 73 73 61 67 65 73 20 61 6e 64 20 74 72 61 63 65  ssages and trace
13510 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20 2a 2f   information. */
13520 0a 7b 0a 20 20 20 20 69 6e 74 20 6f 76 65 72 66  .{.    int overf
13530 6c 6f 77 2c 20 6c 69 6d 69 74 20 3d 20 36 30 2c  low, limit = 60,
13540 20 6e 61 6d 65 4c 65 6e 3b 0a 20 20 20 20 63 6f   nameLen;.    co
13550 6e 73 74 20 63 68 61 72 20 2a 70 72 6f 63 4e 61  nst char *procNa
13560 6d 65 20 3d 20 54 63 6c 47 65 74 53 74 72 69 6e  me = TclGetStrin
13570 67 46 72 6f 6d 4f 62 6a 28 70 72 6f 63 4e 61 6d  gFromObj(procNam
13580 65 4f 62 6a 2c 20 26 6e 61 6d 65 4c 65 6e 29 3b  eObj, &nameLen);
13590 0a 0a 20 20 20 20 6f 76 65 72 66 6c 6f 77 20 3d  ..    overflow =
135a0 20 28 6e 61 6d 65 4c 65 6e 20 3e 20 6c 69 6d 69   (nameLen > limi
135b0 74 29 3b 0a 20 20 20 20 54 63 6c 5f 41 70 70 65  t);.    Tcl_Appe
135c0 6e 64 4f 62 6a 54 6f 45 72 72 6f 72 49 6e 66 6f  ndObjToErrorInfo
135d0 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4f 62 6a  (interp, Tcl_Obj
135e0 50 72 69 6e 74 66 28 0a 09 20 20 20 20 22 5c 6e  Printf(..    "\n
135f0 20 20 20 20 28 6c 61 6d 62 64 61 20 74 65 72 6d      (lambda term
13600 20 5c 22 25 2e 2a 73 25 73 5c 22 20 6c 69 6e 65   \"%.*s%s\" line
13610 20 25 64 29 22 2c 0a 09 20 20 20 20 28 6f 76 65   %d)",..    (ove
13620 72 66 6c 6f 77 20 3f 20 6c 69 6d 69 74 20 3a 20  rflow ? limit : 
13630 6e 61 6d 65 4c 65 6e 29 2c 20 70 72 6f 63 4e 61  nameLen), procNa
13640 6d 65 2c 0a 09 20 20 20 20 28 6f 76 65 72 66 6c  me,..    (overfl
13650 6f 77 20 3f 20 22 2e 2e 2e 22 20 3a 20 22 22 29  ow ? "..." : "")
13660 2c 20 54 63 6c 5f 47 65 74 45 72 72 6f 72 4c 69  , Tcl_GetErrorLi
13670 6e 65 28 69 6e 74 65 72 70 29 29 29 3b 0a 7d 0a  ne(interp)));.}.
13680 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  ../*. *---------
13690 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
136a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
136b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
136c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
136d0 0a 20 2a 20 54 63 6c 47 65 74 43 6d 64 46 72 61  . * TclGetCmdFra
136e0 6d 65 46 6f 72 50 72 6f 63 65 64 75 72 65 20 2d  meForProcedure -
136f0 2d 0a 20 2a 0a 20 2a 09 48 6f 77 20 74 6f 20 67  -. *. *.How to g
13700 65 74 20 74 68 65 20 43 6d 64 46 72 61 6d 65 20  et the CmdFrame 
13710 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20  information for 
13720 61 20 70 72 6f 63 65 64 75 72 65 2e 0a 20 2a 0a  a procedure.. *.
13730 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41   * Results:. *.A
13740 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
13750 43 6d 64 46 72 61 6d 65 20 28 6f 6e 6c 79 20 67  CmdFrame (only g
13760 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20  uaranteed to be 
13770 76 61 6c 69 64 20 75 6e 74 69 6c 20 74 68 65 20  valid until the 
13780 6e 65 78 74 0a 20 2a 09 54 63 6c 20 63 6f 6d 6d  next. *.Tcl comm
13790 61 6e 64 20 69 73 20 70 72 6f 63 65 73 73 65 64  and is processed
137a0 20 6f 72 20 74 68 65 20 69 6e 74 65 72 70 72 65   or the interpre
137b0 74 65 72 27 73 20 73 74 61 74 65 20 69 73 20 6f  ter's state is o
137c0 74 68 65 72 77 69 73 65 0a 20 2a 09 6d 6f 64 69  therwise. *.modi
137d0 66 69 65 64 29 20 6f 72 20 61 20 4e 55 4c 4c 20  fied) or a NULL 
137e0 69 66 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69  if the informati
137f0 6f 6e 20 69 73 20 6e 6f 74 20 61 76 61 69 6c 61  on is not availa
13800 62 6c 65 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20  ble.. *. * Side 
13810 65 66 66 65 63 74 73 3a 0a 20 2a 09 6e 6f 6e 65  effects:. *.none
13820 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d  .. *. *---------
13830 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13840 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13850 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13860 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a  -------------. *
13870 2f 0a 0a 43 6d 64 46 72 61 6d 65 20 2a 0a 54 63  /..CmdFrame *.Tc
13880 6c 47 65 74 43 6d 64 46 72 61 6d 65 46 6f 72 50  lGetCmdFrameForP
13890 72 6f 63 65 64 75 72 65 28 0a 20 20 20 20 50 72  rocedure(.    Pr
138a0 6f 63 20 2a 70 72 6f 63 50 74 72 29 09 09 2f 2a  oc *procPtr)../*
138b0 20 54 68 65 20 70 72 6f 63 65 64 75 72 65 20 77   The procedure w
138c0 68 6f 73 65 20 63 6d 64 2d 66 72 61 6d 65 20 69  hose cmd-frame i
138d0 73 20 74 6f 20 62 65 0a 09 09 09 09 20 2a 20 6c  s to be..... * l
138e0 6f 6f 6b 65 64 20 75 70 2e 20 2a 2f 0a 7b 0a 20  ooked up. */.{. 
138f0 20 20 20 54 63 6c 5f 48 61 73 68 45 6e 74 72 79     Tcl_HashEntry
13900 20 2a 68 65 50 74 72 3b 0a 0a 20 20 20 20 69 66   *hePtr;..    if
13910 20 28 70 72 6f 63 50 74 72 20 3d 3d 20 4e 55 4c   (procPtr == NUL
13920 4c 20 7c 7c 20 70 72 6f 63 50 74 72 2d 3e 69 50  L || procPtr->iP
13930 74 72 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72  tr == NULL) {..r
13940 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20  eturn NULL;.    
13950 7d 0a 20 20 20 20 68 65 50 74 72 20 3d 20 54 63  }.    hePtr = Tc
13960 6c 5f 46 69 6e 64 48 61 73 68 45 6e 74 72 79 28  l_FindHashEntry(
13970 70 72 6f 63 50 74 72 2d 3e 69 50 74 72 2d 3e 6c  procPtr->iPtr->l
13980 69 6e 65 50 42 6f 64 79 50 74 72 2c 20 70 72 6f  inePBodyPtr, pro
13990 63 50 74 72 29 3b 0a 20 20 20 20 69 66 20 28 68  cPtr);.    if (h
139a0 65 50 74 72 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a  ePtr == NULL) {.
139b0 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20  .return NULL;.  
139c0 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 28    }.    return (
139d0 43 6d 64 46 72 61 6d 65 20 2a 29 20 54 63 6c 5f  CmdFrame *) Tcl_
139e0 47 65 74 48 61 73 68 56 61 6c 75 65 28 68 65 50  GetHashValue(heP
139f0 74 72 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 20 4c  tr);.}.../*. * L
13a00 6f 63 61 6c 20 56 61 72 69 61 62 6c 65 73 3a 0a  ocal Variables:.
13a10 20 2a 20 6d 6f 64 65 3a 20 63 0a 20 2a 20 63 2d   * mode: c. * c-
13a20 62 61 73 69 63 2d 6f 66 66 73 65 74 3a 20 34 0a  basic-offset: 4.
13a30 20 2a 20 66 69 6c 6c 2d 63 6f 6c 75 6d 6e 3a 20   * fill-column: 
13a40 37 38 0a 20 2a 20 45 6e 64 3a 0a 20 2a 2f 0a     78. * End:. */.