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 c2 a9 20 31 39 38 37 2d 31 39 39 33 ght © 1987-1993
00a0: 20 54 68 65 20 52 65 67 65 6e 74 73 20 6f 66 20 The Regents of
00b0: 74 68 65 20 55 6e 69 76 65 72 73 69 74 79 20 6f the University o
00c0: 66 20 43 61 6c 69 66 6f 72 6e 69 61 2e 0a 20 2a f California.. *
00d0: 20 43 6f 70 79 72 69 67 68 74 20 c2 a9 20 31 39 Copyright © 19
00e0: 39 34 2d 31 39 39 38 20 53 75 6e 20 4d 69 63 72 94-1998 Sun Micr
00f0: 6f 73 79 73 74 65 6d 73 2c 20 49 6e 63 2e 0a 20 osystems, Inc..
0100: 2a 20 43 6f 70 79 72 69 67 68 74 20 c2 a9 20 32 * Copyright © 2
0110: 30 30 34 2d 32 30 30 36 20 4d 69 67 75 65 6c 20 004-2006 Miguel
0120: 53 6f 66 65 72 0a 20 2a 20 43 6f 70 79 72 69 67 Sofer. * Copyrig
0130: 68 74 20 c2 a9 20 32 30 30 37 20 44 61 6e 69 65 ht © 2007 Danie
0140: 6c 20 41 2e 20 53 74 65 66 66 65 6e 20 3c 64 61 l A. Steffen <da
0150: 73 40 75 73 65 72 73 2e 73 6f 75 72 63 65 66 6f [email protected]
0160: 72 67 65 2e 6e 65 74 3e 0a 20 2a 0a 20 2a 20 53 rge.net>. *. * S
0170: 65 65 20 74 68 65 20 66 69 6c 65 20 22 6c 69 63 ee the file "lic
0180: 65 6e 73 65 2e 74 65 72 6d 73 22 20 66 6f 72 20 ense.terms" for
0190: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20 75 information on u
01a0: 73 61 67 65 20 61 6e 64 20 72 65 64 69 73 74 72 sage and redistr
01b0: 69 62 75 74 69 6f 6e 20 6f 66 0a 20 2a 20 74 68 ibution of. * th
01c0: 69 73 20 66 69 6c 65 2c 20 61 6e 64 20 66 6f 72 is file, and for
01d0: 20 61 20 44 49 53 43 4c 41 49 4d 45 52 20 4f 46 a DISCLAIMER OF
01e0: 20 41 4c 4c 20 57 41 52 52 41 4e 54 49 45 53 2e ALL WARRANTIES.
01f0: 0a 20 2a 2f 0a 0a 23 69 6e 63 6c 75 64 65 20 22 . */..#include "
0200: 74 63 6c 49 6e 74 2e 68 22 0a 23 69 6e 63 6c 75 tclInt.h".#inclu
0210: 64 65 20 22 74 63 6c 43 6f 6d 70 69 6c 65 2e 68 de "tclCompile.h
0220: 22 0a 23 69 6e 63 6c 75 64 65 20 3c 61 73 73 65 ".#include <asse
0230: 72 74 2e 68 3e 0a 0a 2f 2a 0a 20 2a 20 50 72 6f rt.h>../*. * Pro
0240: 74 6f 74 79 70 65 73 20 66 6f 72 20 73 74 61 74 totypes for stat
0250: 69 63 20 66 75 6e 63 74 69 6f 6e 73 20 69 6e 20 ic functions in
0260: 74 68 69 73 20 66 69 6c 65 0a 20 2a 2f 0a 0a 73 this file. */..s
0270: 74 61 74 69 63 20 76 6f 69 64 09 09 44 75 70 4c tatic void..DupL
0280: 61 6d 62 64 61 49 6e 74 65 72 6e 61 6c 52 65 70 ambdaInternalRep
0290: 28 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 (Tcl_Obj *objPtr
02a0: 2c 0a 09 09 09 20 20 20 20 54 63 6c 5f 4f 62 6a ,.... Tcl_Obj
02b0: 20 2a 63 6f 70 79 50 74 72 29 3b 0a 73 74 61 74 *copyPtr);.stat
02c0: 69 63 20 76 6f 69 64 09 09 46 72 65 65 4c 61 6d ic void..FreeLam
02d0: 62 64 61 49 6e 74 65 72 6e 61 6c 52 65 70 28 54 bdaInternalRep(T
02e0: 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 29 3b cl_Obj *objPtr);
02f0: 0a 73 74 61 74 69 63 20 69 6e 74 09 09 49 6e 69 .static int..Ini
0300: 74 41 72 67 73 41 6e 64 4c 6f 63 61 6c 73 28 54 tArgsAndLocals(T
0310: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 cl_Interp *inter
0320: 70 2c 20 54 63 6c 5f 53 69 7a 65 20 73 6b 69 70 p, Tcl_Size skip
0330: 29 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 09 09 );.static void..
0340: 49 6e 69 74 52 65 73 6f 6c 76 65 64 4c 6f 63 61 InitResolvedLoca
0350: 6c 73 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 ls(Tcl_Interp *i
0360: 6e 74 65 72 70 2c 0a 09 09 09 20 20 20 20 42 79 nterp,.... By
0370: 74 65 43 6f 64 65 20 2a 63 6f 64 65 50 74 72 2c teCode *codePtr,
0380: 20 56 61 72 20 2a 64 65 66 50 74 72 2c 0a 09 09 Var *defPtr,...
0390: 09 20 20 20 20 4e 61 6d 65 73 70 61 63 65 20 2a . Namespace *
03a0: 6e 73 50 74 72 29 3b 0a 73 74 61 74 69 63 20 76 nsPtr);.static v
03b0: 6f 69 64 09 09 49 6e 69 74 4c 6f 63 61 6c 43 61 oid..InitLocalCa
03c0: 63 68 65 28 50 72 6f 63 20 2a 70 72 6f 63 50 74 che(Proc *procPt
03d0: 72 29 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 09 r);.static void.
03e0: 09 50 72 6f 63 42 6f 64 79 44 75 70 28 54 63 6c .ProcBodyDup(Tcl
03f0: 5f 4f 62 6a 20 2a 73 72 63 50 74 72 2c 20 54 63 _Obj *srcPtr, Tc
0400: 6c 5f 4f 62 6a 20 2a 64 75 70 50 74 72 29 3b 0a l_Obj *dupPtr);.
0410: 73 74 61 74 69 63 20 76 6f 69 64 09 09 50 72 6f static void..Pro
0420: 63 42 6f 64 79 46 72 65 65 28 54 63 6c 5f 4f 62 cBodyFree(Tcl_Ob
0430: 6a 20 2a 6f 62 6a 50 74 72 29 3b 0a 73 74 61 74 j *objPtr);.stat
0440: 69 63 20 69 6e 74 09 09 50 72 6f 63 57 72 6f 6e ic int..ProcWron
0450: 67 4e 75 6d 41 72 67 73 28 54 63 6c 5f 49 6e 74 gNumArgs(Tcl_Int
0460: 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 54 63 6c erp *interp, Tcl
0470: 5f 53 69 7a 65 20 73 6b 69 70 29 3b 0a 73 74 61 _Size skip);.sta
0480: 74 69 63 20 76 6f 69 64 09 09 4d 61 6b 65 50 72 tic void..MakePr
0490: 6f 63 45 72 72 6f 72 28 54 63 6c 5f 49 6e 74 65 ocError(Tcl_Inte
04a0: 72 70 20 2a 69 6e 74 65 72 70 2c 0a 09 09 09 20 rp *interp,....
04b0: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 72 6f 63 Tcl_Obj *proc
04c0: 4e 61 6d 65 4f 62 6a 29 3b 0a 73 74 61 74 69 63 NameObj);.static
04d0: 20 76 6f 69 64 09 09 4d 61 6b 65 4c 61 6d 62 64 void..MakeLambd
04e0: 61 45 72 72 6f 72 28 54 63 6c 5f 49 6e 74 65 72 aError(Tcl_Inter
04f0: 70 20 2a 69 6e 74 65 72 70 2c 0a 09 09 09 20 20 p *interp,....
0500: 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 72 6f 63 4e Tcl_Obj *procN
0510: 61 6d 65 4f 62 6a 29 3b 0a 73 74 61 74 69 63 20 ameObj);.static
0520: 69 6e 74 09 09 53 65 74 4c 61 6d 62 64 61 46 72 int..SetLambdaFr
0530: 6f 6d 41 6e 79 28 54 63 6c 5f 49 6e 74 65 72 70 omAny(Tcl_Interp
0540: 20 2a 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4f 62 *interp, Tcl_Ob
0550: 6a 20 2a 6f 62 6a 50 74 72 29 3b 0a 0a 73 74 61 j *objPtr);..sta
0560: 74 69 63 20 54 63 6c 5f 4e 52 50 6f 73 74 50 72 tic Tcl_NRPostPr
0570: 6f 63 20 49 6e 74 65 72 70 50 72 6f 63 4e 52 32 oc InterpProcNR2
0580: 3b 0a 0a 2f 2a 0a 20 2a 20 54 68 65 20 50 72 6f ;../*. * The Pro
0590: 63 42 6f 64 79 4f 62 6a 54 79 70 65 20 74 79 70 cBodyObjType typ
05a0: 65 0a 20 2a 2f 0a 0a 63 6f 6e 73 74 20 54 63 6c e. */..const Tcl
05b0: 5f 4f 62 6a 54 79 70 65 20 74 63 6c 50 72 6f 63 _ObjType tclProc
05c0: 42 6f 64 79 54 79 70 65 20 3d 20 7b 0a 20 20 20 BodyType = {.
05d0: 20 22 70 72 6f 63 62 6f 64 79 22 2c 0a 20 20 20 "procbody",.
05e0: 20 50 72 6f 63 42 6f 64 79 46 72 65 65 2c 0a 20 ProcBodyFree,.
05f0: 20 20 20 50 72 6f 63 42 6f 64 79 44 75 70 2c 0a ProcBodyDup,.
0600: 20 20 20 20 4e 55 4c 4c 2c 09 09 09 2f 2a 20 55 NULL,.../* U
0610: 70 64 61 74 65 53 74 72 69 6e 67 20 66 75 6e 63 pdateString func
0620: 74 69 6f 6e 3b 20 54 63 6c 5f 47 65 74 53 74 72 tion; Tcl_GetStr
0630: 69 6e 67 20 61 6e 64 0a 09 09 09 09 20 2a 20 54 ing and..... * T
0640: 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d cl_GetStringFrom
0650: 4f 62 6a 20 73 68 6f 75 6c 64 20 70 61 6e 69 63 Obj should panic
0660: 0a 09 09 09 09 20 2a 20 69 6e 73 74 65 61 64 2e ..... * instead.
0670: 20 2a 2f 0a 20 20 20 20 4e 55 4c 4c 2c 09 09 09 */. NULL,...
0680: 2f 2a 20 53 65 74 46 72 6f 6d 41 6e 79 20 66 75 /* SetFromAny fu
0690: 6e 63 74 69 6f 6e 3b 20 54 63 6c 5f 43 6f 6e 76 nction; Tcl_Conv
06a0: 65 72 74 54 6f 54 79 70 65 0a 09 09 09 09 20 2a ertToType..... *
06b0: 20 73 68 6f 75 6c 64 20 70 61 6e 69 63 20 69 6e should panic in
06c0: 73 74 65 61 64 2e 20 2a 2f 0a 20 20 20 20 54 43 stead. */. TC
06d0: 4c 5f 4f 42 4a 54 59 50 45 5f 56 30 0a 7d 3b 0a L_OBJTYPE_V0.};.
06e0: 0a 23 64 65 66 69 6e 65 20 50 72 6f 63 53 65 74 .#define ProcSet
06f0: 49 6e 74 65 72 6e 61 6c 52 65 70 28 6f 62 6a 50 InternalRep(objP
0700: 74 72 2c 20 70 72 6f 63 50 74 72 29 20 5c 0a 20 tr, procPtr) \.
0710: 20 20 20 64 6f 20 7b 09 09 09 09 09 09 09 09 5c do {........\
0720: 0a 09 54 63 6c 5f 4f 62 6a 49 6e 74 65 72 6e 61 ..Tcl_ObjInterna
0730: 6c 52 65 70 20 69 72 3b 09 09 09 09 09 09 5c 0a lRep ir;......\.
0740: 09 28 70 72 6f 63 50 74 72 29 2d 3e 72 65 66 43 .(procPtr)->refC
0750: 6f 75 6e 74 2b 2b 3b 09 09 09 09 09 09 5c 0a 09 ount++;......\..
0760: 69 72 2e 74 77 6f 50 74 72 56 61 6c 75 65 2e 70 ir.twoPtrValue.p
0770: 74 72 31 20 3d 20 28 70 72 6f 63 50 74 72 29 3b tr1 = (procPtr);
0780: 09 09 09 09 5c 0a 09 69 72 2e 74 77 6f 50 74 72 ....\..ir.twoPtr
0790: 56 61 6c 75 65 2e 70 74 72 32 20 3d 20 4e 55 4c Value.ptr2 = NUL
07a0: 4c 3b 09 09 09 09 09 5c 0a 09 54 63 6c 5f 53 74 L;.....\..Tcl_St
07b0: 6f 72 65 49 6e 74 65 72 6e 61 6c 52 65 70 28 28 oreInternalRep((
07c0: 6f 62 6a 50 74 72 29 2c 20 26 74 63 6c 50 72 6f objPtr), &tclPro
07d0: 63 42 6f 64 79 54 79 70 65 2c 20 26 69 72 29 3b cBodyType, &ir);
07e0: 09 09 5c 0a 20 20 20 20 7d 20 77 68 69 6c 65 20 ..\. } while
07f0: 28 30 29 0a 0a 23 64 65 66 69 6e 65 20 50 72 6f (0)..#define Pro
0800: 63 47 65 74 49 6e 74 65 72 6e 61 6c 52 65 70 28 cGetInternalRep(
0810: 6f 62 6a 50 74 72 2c 20 70 72 6f 63 50 74 72 29 objPtr, procPtr)
0820: 20 5c 0a 20 20 20 20 64 6f 20 7b 09 09 09 09 09 \. do {.....
0830: 09 09 09 5c 0a 09 63 6f 6e 73 74 20 54 63 6c 5f ...\..const Tcl_
0840: 4f 62 6a 49 6e 74 65 72 6e 61 6c 52 65 70 20 2a ObjInternalRep *
0850: 69 72 50 74 72 3b 09 09 09 09 5c 0a 09 69 72 50 irPtr;....\..irP
0860: 74 72 20 3d 20 54 63 6c 46 65 74 63 68 49 6e 74 tr = TclFetchInt
0870: 65 72 6e 61 6c 52 65 70 28 28 6f 62 6a 50 74 72 ernalRep((objPtr
0880: 29 2c 20 26 74 63 6c 50 72 6f 63 42 6f 64 79 54 ), &tclProcBodyT
0890: 79 70 65 29 3b 09 5c 0a 09 28 70 72 6f 63 50 74 ype);.\..(procPt
08a0: 72 29 20 3d 20 69 72 50 74 72 20 3f 20 28 50 72 r) = irPtr ? (Pr
08b0: 6f 63 20 2a 29 69 72 50 74 72 2d 3e 74 77 6f 50 oc *)irPtr->twoP
08c0: 74 72 56 61 6c 75 65 2e 70 74 72 31 20 3a 20 4e trValue.ptr1 : N
08d0: 55 4c 4c 3b 09 5c 0a 20 20 20 20 7d 20 77 68 69 ULL;.\. } whi
08e0: 6c 65 20 28 30 29 0a 0a 2f 2a 0a 20 2a 20 54 68 le (0)../*. * Th
08f0: 65 20 5b 75 70 76 61 72 5d 2f 5b 75 70 6c 65 76 e [upvar]/[uplev
0900: 65 6c 5d 20 6c 65 76 65 6c 20 72 65 66 65 72 65 el] level refere
0910: 6e 63 65 20 74 79 70 65 2e 20 55 73 65 73 20 74 nce type. Uses t
0920: 68 65 20 77 69 64 65 56 61 6c 75 65 20 66 69 65 he wideValue fie
0930: 6c 64 0a 20 2a 20 74 6f 20 72 65 6d 65 6d 62 65 ld. * to remembe
0940: 72 20 74 68 65 20 69 6e 74 65 67 65 72 20 76 61 r the integer va
0950: 6c 75 65 20 6f 66 20 61 20 70 61 72 73 65 64 20 lue of a parsed
0960: 23 3c 69 6e 74 65 67 65 72 3e 20 66 6f 72 6d 61 #<integer> forma
0970: 74 2e 0a 20 2a 0a 20 2a 20 55 73 65 73 20 74 68 t.. *. * Uses th
0980: 65 20 64 65 66 61 75 6c 74 20 62 65 68 61 76 69 e default behavi
0990: 6f 75 72 20 74 68 72 6f 75 67 68 6f 75 74 2c 20 our throughout,
09a0: 61 6e 64 20 6e 65 76 65 72 20 64 69 73 70 6f 73 and never dispos
09b0: 65 73 20 6f 66 20 74 68 65 20 73 74 72 69 6e 67 es of the string
09c0: 0a 20 2a 20 72 65 70 3b 20 69 74 27 73 20 6a 75 . * rep; it's ju
09d0: 73 74 20 61 20 63 61 63 68 65 20 74 79 70 65 2e st a cache type.
09e0: 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20 63 6f 6e . */..static con
09f0: 73 74 20 54 63 6c 5f 4f 62 6a 54 79 70 65 20 6c st Tcl_ObjType l
0a00: 65 76 65 6c 52 65 66 65 72 65 6e 63 65 54 79 70 evelReferenceTyp
0a10: 65 20 3d 20 7b 0a 20 20 20 20 22 6c 65 76 65 6c e = {. "level
0a20: 52 65 66 65 72 65 6e 63 65 22 2c 0a 20 20 20 20 Reference",.
0a30: 4e 55 4c 4c 2c 09 09 09 2f 2f 20 46 72 65 65 49 NULL,...// FreeI
0a40: 6e 74 52 65 70 0a 20 20 20 20 4e 55 4c 4c 2c 09 ntRep. NULL,.
0a50: 09 09 2f 2f 20 44 75 70 49 6e 74 52 65 70 0a 20 ..// DupIntRep.
0a60: 20 20 20 4e 55 4c 4c 2c 09 09 09 2f 2f 20 55 70 NULL,...// Up
0a70: 64 61 74 65 53 74 72 69 6e 67 0a 20 20 20 20 4e dateString. N
0a80: 55 4c 4c 2c 09 09 09 2f 2f 20 53 65 74 46 72 6f ULL,...// SetFro
0a90: 6d 41 6e 79 0a 20 20 20 20 54 43 4c 5f 4f 42 4a mAny. TCL_OBJ
0aa0: 54 59 50 45 5f 56 31 28 54 63 6c 4c 65 6e 67 74 TYPE_V1(TclLengt
0ab0: 68 4f 6e 65 29 0a 7d 3b 0a 0a 2f 2a 0a 20 2a 20 hOne).};../*. *
0ac0: 54 68 65 20 74 79 70 65 20 6f 66 20 6c 61 6d 62 The type of lamb
0ad0: 64 61 73 2e 20 4e 6f 74 65 20 74 68 61 74 20 65 das. Note that e
0ae0: 76 65 72 79 20 6c 61 6d 62 64 61 20 77 69 6c 6c very lambda will
0af0: 20 2a 61 6c 77 61 79 73 2a 20 68 61 76 65 20 61 *always* have a
0b00: 20 73 74 72 69 6e 67 0a 20 2a 20 72 65 70 72 65 string. * repre
0b10: 73 65 6e 74 61 74 69 6f 6e 2e 0a 20 2a 0a 20 2a sentation.. *. *
0b20: 20 49 6e 74 65 72 6e 61 6c 6c 79 2c 20 70 74 72 Internally, ptr
0b30: 31 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 1 is a pointer t
0b40: 6f 20 61 20 50 72 6f 63 20 69 6e 73 74 61 6e 63 o a Proc instanc
0b50: 65 20 74 68 61 74 20 69 73 20 6e 6f 74 20 62 6f e that is not bo
0b60: 75 6e 64 20 74 6f 20 61 0a 20 2a 20 63 6f 6d 6d und to a. * comm
0b70: 61 6e 64 20 6e 61 6d 65 2c 20 61 6e 64 20 70 74 and name, and pt
0b80: 72 32 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 r2 is a pointer
0b90: 74 6f 20 74 68 65 20 6e 61 6d 65 73 70 61 63 65 to the namespace
0ba0: 20 74 68 61 74 20 74 68 65 20 50 72 6f 63 20 69 that the Proc i
0bb0: 6e 73 74 61 6e 63 65 0a 20 2a 20 77 69 6c 6c 20 nstance. * will
0bc0: 65 78 65 63 75 74 65 20 77 69 74 68 69 6e 2e 20 execute within.
0bd0: 49 46 20 59 4f 55 20 43 48 41 4e 47 45 20 54 48 IF YOU CHANGE TH
0be0: 49 53 2c 20 43 48 45 43 4b 20 49 4e 20 74 63 6c IS, CHECK IN tcl
0bf0: 44 69 73 61 73 73 65 6d 62 6c 65 2e 63 20 54 4f Disassemble.c TO
0c00: 4f 2e 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20 63 O.. */..static c
0c10: 6f 6e 73 74 20 54 63 6c 5f 4f 62 6a 54 79 70 65 onst Tcl_ObjType
0c20: 20 6c 61 6d 62 64 61 54 79 70 65 20 3d 20 7b 0a lambdaType = {.
0c30: 20 20 20 20 22 6c 61 6d 62 64 61 45 78 70 72 22 "lambdaExpr"
0c40: 2c 0a 20 20 20 20 46 72 65 65 4c 61 6d 62 64 61 ,. FreeLambda
0c50: 49 6e 74 65 72 6e 61 6c 52 65 70 2c 0a 20 20 20 InternalRep,.
0c60: 20 44 75 70 4c 61 6d 62 64 61 49 6e 74 65 72 6e DupLambdaIntern
0c70: 61 6c 52 65 70 2c 0a 20 20 20 20 4e 55 4c 4c 2c alRep,. NULL,
0c80: 09 09 09 2f 2f 20 55 70 64 61 74 65 53 74 72 69 ...// UpdateStri
0c90: 6e 67 0a 20 20 20 20 53 65 74 4c 61 6d 62 64 61 ng. SetLambda
0ca0: 46 72 6f 6d 41 6e 79 2c 0a 20 20 20 20 54 43 4c FromAny,. TCL
0cb0: 5f 4f 42 4a 54 59 50 45 5f 56 30 0a 7d 3b 0a 0a _OBJTYPE_V0.};..
0cc0: 23 64 65 66 69 6e 65 20 4c 61 6d 62 64 61 53 65 #define LambdaSe
0cd0: 74 49 6e 74 65 72 6e 61 6c 52 65 70 28 6f 62 6a tInternalRep(obj
0ce0: 50 74 72 2c 20 70 72 6f 63 50 74 72 2c 20 6e 73 Ptr, procPtr, ns
0cf0: 4f 62 6a 50 74 72 29 20 5c 0a 20 20 20 20 64 6f ObjPtr) \. do
0d00: 20 7b 09 09 09 09 09 09 09 09 5c 0a 09 54 63 6c {........\..Tcl
0d10: 5f 4f 62 6a 49 6e 74 65 72 6e 61 6c 52 65 70 20 _ObjInternalRep
0d20: 69 72 3b 09 09 09 09 09 09 5c 0a 09 69 72 2e 74 ir;......\..ir.t
0d30: 77 6f 50 74 72 56 61 6c 75 65 2e 70 74 72 31 20 woPtrValue.ptr1
0d40: 3d 20 28 70 72 6f 63 50 74 72 29 3b 09 09 09 09 = (procPtr);....
0d50: 5c 0a 09 69 72 2e 74 77 6f 50 74 72 56 61 6c 75 \..ir.twoPtrValu
0d60: 65 2e 70 74 72 32 20 3d 20 28 6e 73 4f 62 6a 50 e.ptr2 = (nsObjP
0d70: 74 72 29 3b 09 09 09 09 5c 0a 09 54 63 6c 5f 49 tr);....\..Tcl_I
0d80: 6e 63 72 52 65 66 43 6f 75 6e 74 28 28 6e 73 4f ncrRefCount((nsO
0d90: 62 6a 50 74 72 29 29 3b 09 09 09 09 09 5c 0a 09 bjPtr));.....\..
0da0: 54 63 6c 5f 53 74 6f 72 65 49 6e 74 65 72 6e 61 Tcl_StoreInterna
0db0: 6c 52 65 70 28 28 6f 62 6a 50 74 72 29 2c 20 26 lRep((objPtr), &
0dc0: 6c 61 6d 62 64 61 54 79 70 65 2c 20 26 69 72 29 lambdaType, &ir)
0dd0: 3b 09 09 5c 0a 20 20 20 20 7d 20 77 68 69 6c 65 ;..\. } while
0de0: 20 28 30 29 0a 0a 23 64 65 66 69 6e 65 20 4c 61 (0)..#define La
0df0: 6d 62 64 61 47 65 74 49 6e 74 65 72 6e 61 6c 52 mbdaGetInternalR
0e00: 65 70 28 6f 62 6a 50 74 72 2c 20 70 72 6f 63 50 ep(objPtr, procP
0e10: 74 72 2c 20 6e 73 4f 62 6a 50 74 72 29 20 5c 0a tr, nsObjPtr) \.
0e20: 20 20 20 20 64 6f 20 7b 09 09 09 09 09 09 09 09 do {........
0e30: 5c 0a 09 63 6f 6e 73 74 20 54 63 6c 5f 4f 62 6a \..const Tcl_Obj
0e40: 49 6e 74 65 72 6e 61 6c 52 65 70 20 2a 69 72 50 InternalRep *irP
0e50: 74 72 3b 09 09 09 09 5c 0a 09 69 72 50 74 72 20 tr;....\..irPtr
0e60: 3d 20 54 63 6c 46 65 74 63 68 49 6e 74 65 72 6e = TclFetchIntern
0e70: 61 6c 52 65 70 28 28 6f 62 6a 50 74 72 29 2c 20 alRep((objPtr),
0e80: 26 6c 61 6d 62 64 61 54 79 70 65 29 3b 09 09 5c &lambdaType);..\
0e90: 0a 09 28 70 72 6f 63 50 74 72 29 20 3d 20 69 72 ..(procPtr) = ir
0ea0: 50 74 72 20 3f 20 28 50 72 6f 63 20 2a 29 69 72 Ptr ? (Proc *)ir
0eb0: 50 74 72 2d 3e 74 77 6f 50 74 72 56 61 6c 75 65 Ptr->twoPtrValue
0ec0: 2e 70 74 72 31 20 3a 20 4e 55 4c 4c 3b 09 5c 0a .ptr1 : NULL;.\.
0ed0: 09 28 6e 73 4f 62 6a 50 74 72 29 20 3d 20 69 72 .(nsObjPtr) = ir
0ee0: 50 74 72 20 3f 20 28 54 63 6c 5f 4f 62 6a 20 2a Ptr ? (Tcl_Obj *
0ef0: 29 69 72 50 74 72 2d 3e 74 77 6f 50 74 72 56 61 )irPtr->twoPtrVa
0f00: 6c 75 65 2e 70 74 72 32 20 3a 20 4e 55 4c 4c 3b lue.ptr2 : NULL;
0f10: 09 5c 0a 20 20 20 20 7d 20 77 68 69 6c 65 20 28 .\. } while (
0f20: 30 29 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 0).../*. *------
0f30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0f40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0f50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0f60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0f70: 0a 20 2a 0a 20 2a 20 54 63 6c 5f 50 72 6f 63 4f . *. * Tcl_ProcO
0f80: 62 6a 43 6d 64 20 2d 2d 0a 20 2a 0a 20 2a 09 54 bjCmd --. *. *.T
0f90: 68 69 73 20 6f 62 6a 65 63 74 2d 62 61 73 65 64 his object-based
0fa0: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e 76 function is inv
0fb0: 6f 6b 65 64 20 74 6f 20 70 72 6f 63 65 73 73 20 oked to process
0fc0: 74 68 65 20 22 70 72 6f 63 22 20 54 63 6c 0a 20 the "proc" Tcl.
0fd0: 2a 09 63 6f 6d 6d 61 6e 64 2e 20 53 65 65 20 74 *.command. See t
0fe0: 68 65 20 75 73 65 72 20 64 6f 63 75 6d 65 6e 74 he user document
0ff0: 61 74 69 6f 6e 20 66 6f 72 20 64 65 74 61 69 6c ation for detail
1000: 73 20 6f 6e 20 77 68 61 74 20 69 74 20 64 6f 65 s on what it doe
1010: 73 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 s.. *. * Results
1020: 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 20 :. *.A standard
1030: 54 63 6c 20 6f 62 6a 65 63 74 20 72 65 73 75 6c Tcl object resul
1040: 74 20 76 61 6c 75 65 2e 0a 20 2a 0a 20 2a 20 53 t value.. *. * S
1050: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 ide effects:. *.
1060: 41 20 6e 65 77 20 70 72 6f 63 65 64 75 72 65 20 A new procedure
1070: 67 65 74 73 20 63 72 65 61 74 65 64 2e 0a 20 2a gets created.. *
1080: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
1090: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 23 ---------. */..#
10d0: 75 6e 64 65 66 20 54 63 6c 4f 62 6a 49 6e 74 65 undef TclObjInte
10e0: 72 70 50 72 6f 63 32 0a 69 6e 74 0a 54 63 6c 5f rpProc2.int.Tcl_
10f0: 50 72 6f 63 4f 62 6a 43 6d 64 28 0a 20 20 20 20 ProcObjCmd(.
1100: 54 43 4c 5f 55 4e 55 53 45 44 28 76 6f 69 64 20 TCL_UNUSED(void
1110: 2a 29 2c 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 *),. Tcl_Inte
1120: 72 70 20 2a 69 6e 74 65 72 70 2c 09 09 2f 2a 20 rp *interp,../*
1130: 43 75 72 72 65 6e 74 20 69 6e 74 65 72 70 72 65 Current interpre
1140: 74 65 72 2e 20 2a 2f 0a 20 20 20 20 54 63 6c 5f ter. */. Tcl_
1150: 53 69 7a 65 20 6f 62 6a 63 2c 09 09 2f 2a 20 4e Size objc,../* N
1160: 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e umber of argumen
1170: 74 73 2e 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f ts. */. Tcl_O
1180: 62 6a 20 2a 63 6f 6e 73 74 20 2a 6f 62 6a 76 29 bj *const *objv)
1190: 09 2f 2a 20 41 72 67 75 6d 65 6e 74 20 6f 62 6a ./* Argument obj
11a0: 65 63 74 73 2e 20 2a 2f 0a 7b 0a 20 20 20 20 49 ects. */.{. I
11b0: 6e 74 65 72 70 20 2a 69 50 74 72 20 3d 20 28 49 nterp *iPtr = (I
11c0: 6e 74 65 72 70 20 2a 29 20 69 6e 74 65 72 70 3b nterp *) interp;
11d0: 0a 20 20 20 20 50 72 6f 63 20 2a 70 72 6f 63 50 . Proc *procP
11e0: 74 72 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 tr;. const ch
11f0: 61 72 20 2a 70 72 6f 63 4e 61 6d 65 3b 0a 20 20 ar *procName;.
1200: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 69 const char *si
1210: 6d 70 6c 65 4e 61 6d 65 2c 20 2a 70 72 6f 63 41 mpleName, *procA
1220: 72 67 73 2c 20 2a 70 72 6f 63 42 6f 64 79 3b 0a rgs, *procBody;.
1230: 20 20 20 20 4e 61 6d 65 73 70 61 63 65 20 2a 6e Namespace *n
1240: 73 50 74 72 2c 20 2a 61 6c 74 4e 73 50 74 72 2c sPtr, *altNsPtr,
1250: 20 2a 63 78 74 4e 73 50 74 72 3b 0a 20 20 20 20 *cxtNsPtr;.
1260: 54 63 6c 5f 43 6f 6d 6d 61 6e 64 20 63 6d 64 3b Tcl_Command cmd;
1270: 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 21 .. if (objc !
1280: 3d 20 34 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e = 4) {..Tcl_Wron
1290: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c gNumArgs(interp,
12a0: 20 31 2c 20 6f 62 6a 76 2c 20 22 6e 61 6d 65 20 1, objv, "name
12b0: 61 72 67 73 20 62 6f 64 79 22 29 3b 0a 09 72 65 args body");..re
12c0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
12d0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 }.. /*.
12e0: 20 20 20 2a 20 44 65 74 65 72 6d 69 6e 65 20 74 * Determine t
12f0: 68 65 20 6e 61 6d 65 73 70 61 63 65 20 77 68 65 he namespace whe
1300: 72 65 20 74 68 65 20 70 72 6f 63 65 64 75 72 65 re the procedure
1310: 20 73 68 6f 75 6c 64 20 72 65 73 69 64 65 2e 20 should reside.
1320: 55 6e 6c 65 73 73 20 74 68 65 0a 20 20 20 20 20 Unless the.
1330: 2a 20 63 6f 6d 6d 61 6e 64 20 6e 61 6d 65 20 69 * command name i
1340: 6e 63 6c 75 64 65 73 20 6e 61 6d 65 73 70 61 63 ncludes namespac
1350: 65 20 71 75 61 6c 69 66 69 65 72 73 2c 20 74 68 e qualifiers, th
1360: 69 73 20 77 69 6c 6c 20 62 65 20 74 68 65 20 63 is will be the c
1370: 75 72 72 65 6e 74 0a 20 20 20 20 20 2a 20 6e 61 urrent. * na
1380: 6d 65 73 70 61 63 65 2e 0a 20 20 20 20 20 2a 2f mespace.. */
1390: 0a 0a 20 20 20 20 70 72 6f 63 4e 61 6d 65 20 3d .. procName =
13a0: 20 54 63 6c 47 65 74 53 74 72 69 6e 67 28 6f 62 TclGetString(ob
13b0: 6a 76 5b 31 5d 29 3b 0a 20 20 20 20 54 63 6c 47 jv[1]);. TclG
13c0: 65 74 4e 61 6d 65 73 70 61 63 65 46 6f 72 51 75 etNamespaceForQu
13d0: 61 6c 4e 61 6d 65 28 69 6e 74 65 72 70 2c 20 70 alName(interp, p
13e0: 72 6f 63 4e 61 6d 65 2c 20 4e 55 4c 4c 2c 20 30 rocName, NULL, 0
13f0: 2c 0a 09 20 20 20 20 26 6e 73 50 74 72 2c 20 26 ,.. &nsPtr, &
1400: 61 6c 74 4e 73 50 74 72 2c 20 26 63 78 74 4e 73 altNsPtr, &cxtNs
1410: 50 74 72 2c 20 26 73 69 6d 70 6c 65 4e 61 6d 65 Ptr, &simpleName
1420: 29 3b 0a 0a 20 20 20 20 69 66 20 28 6e 73 50 74 );.. if (nsPt
1430: 72 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 r == NULL) {..Tc
1440: 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 l_SetObjResult(i
1450: 6e 74 65 72 70 2c 20 54 63 6c 5f 4f 62 6a 50 72 nterp, Tcl_ObjPr
1460: 69 6e 74 66 28 0a 09 09 22 63 61 6e 27 74 20 63 intf(..."can't c
1470: 72 65 61 74 65 20 70 72 6f 63 65 64 75 72 65 20 reate procedure
1480: 5c 22 25 73 5c 22 3a 20 75 6e 6b 6e 6f 77 6e 20 \"%s\": unknown
1490: 6e 61 6d 65 73 70 61 63 65 22 2c 0a 09 09 70 72 namespace",...pr
14a0: 6f 63 4e 61 6d 65 29 29 3b 0a 09 54 63 6c 5f 53 ocName));..Tcl_S
14b0: 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 etErrorCode(inte
14c0: 72 70 2c 20 22 54 43 4c 22 2c 20 22 56 41 4c 55 rp, "TCL", "VALU
14d0: 45 22 2c 20 22 43 4f 4d 4d 41 4e 44 22 2c 20 28 E", "COMMAND", (
14e0: 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 72 char *)NULL);..r
14f0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
1500: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 73 . }. if (s
1510: 69 6d 70 6c 65 4e 61 6d 65 20 3d 3d 20 4e 55 4c impleName == NUL
1520: 4c 29 20 7b 0a 09 54 63 6c 5f 53 65 74 4f 62 6a L) {..Tcl_SetObj
1530: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 Result(interp, T
1540: 63 6c 5f 4f 62 6a 50 72 69 6e 74 66 28 0a 09 09 cl_ObjPrintf(...
1550: 22 63 61 6e 27 74 20 63 72 65 61 74 65 20 70 72 "can't create pr
1560: 6f 63 65 64 75 72 65 20 5c 22 25 73 5c 22 3a 20 ocedure \"%s\":
1570: 62 61 64 20 70 72 6f 63 65 64 75 72 65 20 6e 61 bad procedure na
1580: 6d 65 22 2c 0a 09 09 70 72 6f 63 4e 61 6d 65 29 me",...procName)
1590: 29 3b 0a 09 54 63 6c 5f 53 65 74 45 72 72 6f 72 );..Tcl_SetError
15a0: 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54 43 Code(interp, "TC
15b0: 4c 22 2c 20 22 56 41 4c 55 45 22 2c 20 22 43 4f L", "VALUE", "CO
15c0: 4d 4d 41 4e 44 22 2c 20 28 63 68 61 72 20 2a 29 MMAND", (char *)
15d0: 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 NULL);..return T
15e0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a CL_ERROR;. }.
15f0: 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 43 . /*. * C
1600: 72 65 61 74 65 20 74 68 65 20 64 61 74 61 20 73 reate the data s
1610: 74 72 75 63 74 75 72 65 20 74 6f 20 72 65 70 72 tructure to repr
1620: 65 73 65 6e 74 20 74 68 65 20 70 72 6f 63 65 64 esent the proced
1630: 75 72 65 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 ure.. */..
1640: 20 20 69 66 20 28 54 63 6c 43 72 65 61 74 65 50 if (TclCreateP
1650: 72 6f 63 28 69 6e 74 65 72 70 2c 20 2f 2a 69 67 roc(interp, /*ig
1660: 6e 6f 72 65 64 20 6e 73 50 74 72 2a 2f 20 4e 55 nored nsPtr*/ NU
1670: 4c 4c 2c 20 73 69 6d 70 6c 65 4e 61 6d 65 2c 20 LL, simpleName,
1680: 6f 62 6a 76 5b 32 5d 2c 0a 09 20 20 20 20 6f 62 objv[2],.. ob
1690: 6a 76 5b 33 5d 2c 20 26 70 72 6f 63 50 74 72 29 jv[3], &procPtr)
16a0: 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 54 != TCL_OK) {..T
16b0: 63 6c 5f 41 64 64 45 72 72 6f 72 49 6e 66 6f 28 cl_AddErrorInfo(
16c0: 69 6e 74 65 72 70 2c 20 22 5c 6e 20 20 20 20 28 interp, "\n (
16d0: 63 72 65 61 74 69 6e 67 20 70 72 6f 63 20 5c 22 creating proc \"
16e0: 22 29 3b 0a 09 54 63 6c 5f 41 64 64 45 72 72 6f ");..Tcl_AddErro
16f0: 72 49 6e 66 6f 28 69 6e 74 65 72 70 2c 20 73 69 rInfo(interp, si
1700: 6d 70 6c 65 4e 61 6d 65 29 3b 0a 09 54 63 6c 5f mpleName);..Tcl_
1710: 41 64 64 45 72 72 6f 72 49 6e 66 6f 28 69 6e 74 AddErrorInfo(int
1720: 65 72 70 2c 20 22 5c 22 29 22 29 3b 0a 09 72 65 erp, "\")");..re
1730: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
1740: 20 20 20 20 7d 0a 0a 20 20 20 20 63 6d 64 20 3d }.. cmd =
1750: 20 54 63 6c 4e 52 43 72 65 61 74 65 43 6f 6d 6d TclNRCreateComm
1760: 61 6e 64 49 6e 4e 73 28 69 6e 74 65 72 70 2c 20 andInNs(interp,
1770: 73 69 6d 70 6c 65 4e 61 6d 65 2c 20 28 54 63 6c simpleName, (Tcl
1780: 5f 4e 61 6d 65 73 70 61 63 65 20 2a 29 20 6e 73 _Namespace *) ns
1790: 50 74 72 2c 0a 09 54 63 6c 4f 62 6a 49 6e 74 65 Ptr,..TclObjInte
17a0: 72 70 50 72 6f 63 32 2c 20 54 63 6c 4e 52 49 6e rpProc2, TclNRIn
17b0: 74 65 72 70 50 72 6f 63 2c 20 70 72 6f 63 50 74 terpProc, procPt
17c0: 72 2c 20 54 63 6c 50 72 6f 63 44 65 6c 65 74 65 r, TclProcDelete
17d0: 50 72 6f 63 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 Proc);.. /*.
17e0: 20 20 20 20 2a 20 4e 6f 77 20 69 6e 69 74 69 61 * Now initia
17f0: 6c 69 7a 65 20 74 68 65 20 6e 65 77 20 70 72 6f lize the new pro
1800: 63 65 64 75 72 65 27 73 20 63 6d 64 50 74 72 20 cedure's cmdPtr
1810: 66 69 65 6c 64 2e 20 54 68 69 73 20 77 69 6c 6c field. This will
1820: 20 62 65 20 75 73 65 64 0a 20 20 20 20 20 2a 20 be used. *
1830: 6c 61 74 65 72 20 77 68 65 6e 20 74 68 65 20 70 later when the p
1840: 72 6f 63 65 64 75 72 65 20 69 73 20 63 61 6c 6c rocedure is call
1850: 65 64 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 ed to determine
1860: 77 68 61 74 20 6e 61 6d 65 73 70 61 63 65 20 74 what namespace t
1870: 68 65 0a 20 20 20 20 20 2a 20 70 72 6f 63 65 64 he. * proced
1880: 75 72 65 20 77 69 6c 6c 20 72 75 6e 20 69 6e 2e ure will run in.
1890: 20 54 68 69 73 20 77 69 6c 6c 20 62 65 20 64 69 This will be di
18a0: 66 66 65 72 65 6e 74 20 74 68 61 6e 20 74 68 65 fferent than the
18b0: 20 63 75 72 72 65 6e 74 0a 20 20 20 20 20 2a 20 current. *
18c0: 6e 61 6d 65 73 70 61 63 65 20 69 66 20 74 68 65 namespace if the
18d0: 20 70 72 6f 63 20 77 61 73 20 72 65 6e 61 6d 65 proc was rename
18e0: 64 20 69 6e 74 6f 20 61 20 64 69 66 66 65 72 65 d into a differe
18f0: 6e 74 20 6e 61 6d 65 73 70 61 63 65 2e 0a 20 20 nt namespace..
1900: 20 20 20 2a 2f 0a 0a 20 20 20 20 70 72 6f 63 50 */.. procP
1910: 74 72 2d 3e 63 6d 64 50 74 72 20 3d 20 28 43 6f tr->cmdPtr = (Co
1920: 6d 6d 61 6e 64 20 2a 29 20 63 6d 64 3b 0a 0a 20 mmand *) cmd;..
1930: 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 54 49 50 /*. * TIP
1940: 20 23 32 38 30 3a 20 52 65 6d 65 6d 62 65 72 20 #280: Remember
1950: 74 68 65 20 6c 69 6e 65 20 74 68 65 20 70 72 6f the line the pro
1960: 63 65 64 75 72 65 20 62 6f 64 79 20 69 73 20 73 cedure body is s
1970: 74 61 72 74 69 6e 67 20 6f 6e 2e 20 49 6e 20 61 tarting on. In a
1980: 0a 20 20 20 20 20 2a 20 62 79 74 65 63 6f 64 65 . * bytecode
1990: 20 63 6f 6e 74 65 78 74 20 77 65 20 61 73 6b 20 context we ask
19a0: 74 68 65 20 65 6e 67 69 6e 65 20 74 6f 20 70 72 the engine to pr
19b0: 6f 76 69 64 65 20 75 73 20 77 69 74 68 20 74 68 ovide us with th
19c0: 65 20 6e 65 63 65 73 73 61 72 79 0a 20 20 20 20 e necessary.
19d0: 20 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20 * information.
19e0: 54 68 69 73 20 69 73 20 66 6f 72 20 74 68 65 20 This is for the
19f0: 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 6f initialization o
1a00: 66 20 74 68 65 20 62 79 74 65 20 63 6f 64 65 20 f the byte code
1a10: 63 6f 6d 70 69 6c 65 72 0a 20 20 20 20 20 2a 20 compiler. *
1a20: 77 68 65 6e 20 74 68 65 20 62 6f 64 79 20 69 73 when the body is
1a30: 20 75 73 65 64 20 66 6f 72 20 74 68 65 20 66 69 used for the fi
1a40: 72 73 74 20 74 69 6d 65 2e 0a 20 20 20 20 20 2a rst time.. *
1a50: 0a 20 20 20 20 20 2a 20 54 68 69 73 20 63 6f 64 . * This cod
1a60: 65 20 69 73 20 6e 65 61 72 6c 79 20 69 64 65 6e e is nearly iden
1a70: 74 69 63 61 6c 20 74 6f 20 74 68 65 20 23 32 38 tical to the #28
1a80: 30 20 63 6f 64 65 20 69 6e 20 53 65 74 4c 61 6d 0 code in SetLam
1a90: 62 64 61 46 72 6f 6d 41 6e 79 2c 20 73 65 65 0a bdaFromAny, see.
1aa0: 20 20 20 20 20 2a 20 74 68 69 73 20 66 69 6c 65 * this file
1ab0: 2e 20 54 68 65 20 64 69 66 66 65 72 65 6e 63 65 . The difference
1ac0: 73 20 61 72 65 20 74 68 65 20 64 69 66 66 65 72 s are the differ
1ad0: 65 6e 74 20 69 6e 64 65 78 20 6f 66 20 74 68 65 ent index of the
1ae0: 20 62 6f 64 79 20 69 6e 20 74 68 65 0a 20 20 20 body in the.
1af0: 20 20 2a 20 6c 69 6e 65 20 61 72 72 61 79 20 6f * line array o
1b00: 66 20 74 68 65 20 63 6f 6e 74 65 78 74 2c 20 61 f the context, a
1b10: 6e 64 20 74 68 65 20 6c 61 6d 62 64 61 20 63 6f nd the lambda co
1b20: 64 65 20 72 65 71 75 69 72 65 73 20 73 6f 6d 65 de requires some
1b30: 20 73 70 65 63 69 61 6c 0a 20 20 20 20 20 2a 20 special. *
1b40: 70 72 6f 63 65 73 73 69 6e 67 2e 20 46 69 6e 64 processing. Find
1b50: 20 61 20 77 61 79 20 74 6f 20 66 61 63 74 6f 72 a way to factor
1b60: 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 65 6c 65 6d the common elem
1b70: 65 6e 74 73 20 69 6e 74 6f 20 61 20 73 69 6e 67 ents into a sing
1b80: 6c 65 0a 20 20 20 20 20 2a 20 66 75 6e 63 74 69 le. * functi
1b90: 6f 6e 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 on.. */..
1ba0: 20 69 66 20 28 69 50 74 72 2d 3e 63 6d 64 46 72 if (iPtr->cmdFr
1bb0: 61 6d 65 50 74 72 29 20 7b 0a 09 43 6d 64 46 72 amePtr) {..CmdFr
1bc0: 61 6d 65 20 2a 63 6f 6e 74 65 78 74 50 74 72 20 ame *contextPtr
1bd0: 3d 20 28 43 6d 64 46 72 61 6d 65 20 2a 29 54 63 = (CmdFrame *)Tc
1be0: 6c 53 74 61 63 6b 41 6c 6c 6f 63 28 69 6e 74 65 lStackAlloc(inte
1bf0: 72 70 2c 20 73 69 7a 65 6f 66 28 43 6d 64 46 72 rp, sizeof(CmdFr
1c00: 61 6d 65 29 29 3b 0a 0a 09 2a 63 6f 6e 74 65 78 ame));...*contex
1c10: 74 50 74 72 20 3d 20 2a 69 50 74 72 2d 3e 63 6d tPtr = *iPtr->cm
1c20: 64 46 72 61 6d 65 50 74 72 3b 0a 09 69 66 20 28 dFramePtr;..if (
1c30: 63 6f 6e 74 65 78 74 50 74 72 2d 3e 74 79 70 65 contextPtr->type
1c40: 20 3d 3d 20 54 43 4c 5f 4c 4f 43 41 54 49 4f 4e == TCL_LOCATION
1c50: 5f 42 43 29 20 7b 0a 09 20 20 20 20 2f 2a 0a 09 _BC) {.. /*..
1c60: 20 20 20 20 20 2a 20 52 65 74 72 69 65 76 65 20 * Retrieve
1c70: 73 6f 75 72 63 65 20 69 6e 66 6f 72 6d 61 74 69 source informati
1c80: 6f 6e 20 66 72 6f 6d 20 74 68 65 20 62 79 74 65 on from the byte
1c90: 63 6f 64 65 2c 20 69 66 20 70 6f 73 73 69 62 6c code, if possibl
1ca0: 65 2e 20 49 66 0a 09 20 20 20 20 20 2a 20 74 68 e. If.. * th
1cb0: 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 e information is
1cc0: 20 72 65 74 72 69 65 76 65 64 20 73 75 63 63 65 retrieved succe
1cd0: 73 73 66 75 6c 6c 79 2c 20 63 6f 6e 74 65 78 74 ssfully, context
1ce0: 2e 74 79 70 65 20 77 69 6c 6c 20 62 65 0a 09 20 .type will be..
1cf0: 20 20 20 20 2a 20 54 43 4c 5f 4c 4f 43 41 54 49 * TCL_LOCATI
1d00: 4f 4e 5f 53 4f 55 52 43 45 20 61 6e 64 20 74 68 ON_SOURCE and th
1d10: 65 20 72 65 66 65 72 65 6e 63 65 20 68 65 6c 64 e reference held
1d20: 20 62 79 0a 09 20 20 20 20 20 2a 20 63 6f 6e 74 by.. * cont
1d30: 65 78 74 2e 64 61 74 61 2e 65 76 61 6c 2e 70 61 ext.data.eval.pa
1d40: 74 68 20 77 69 6c 6c 20 62 65 20 63 6f 75 6e 74 th will be count
1d50: 65 64 2e 0a 09 20 20 20 20 20 2a 2f 0a 0a 09 20 ed... */...
1d60: 20 20 20 54 63 6c 47 65 74 53 72 63 49 6e 66 6f TclGetSrcInfo
1d70: 46 6f 72 50 63 28 63 6f 6e 74 65 78 74 50 74 72 ForPc(contextPtr
1d80: 29 3b 0a 09 7d 20 65 6c 73 65 20 69 66 20 28 63 );..} else if (c
1d90: 6f 6e 74 65 78 74 50 74 72 2d 3e 74 79 70 65 20 ontextPtr->type
1da0: 3d 3d 20 54 43 4c 5f 4c 4f 43 41 54 49 4f 4e 5f == TCL_LOCATION_
1db0: 53 4f 55 52 43 45 29 20 7b 0a 09 20 20 20 20 2f SOURCE) {.. /
1dc0: 2a 0a 09 20 20 20 20 20 2a 20 54 68 65 20 63 6f *.. * The co
1dd0: 70 79 20 69 6e 74 6f 20 27 63 6f 6e 74 65 78 74 py into 'context
1de0: 27 20 75 70 20 61 62 6f 76 65 20 68 61 73 20 63 ' up above has c
1df0: 72 65 61 74 65 64 20 61 6e 6f 74 68 65 72 20 72 reated another r
1e00: 65 66 65 72 65 6e 63 65 0a 09 20 20 20 20 20 2a eference.. *
1e10: 20 74 6f 20 27 63 6f 6e 74 65 78 74 2e 64 61 74 to 'context.dat
1e20: 61 2e 65 76 61 6c 2e 70 61 74 68 27 3b 20 61 63 a.eval.path'; ac
1e30: 63 6f 75 6e 74 20 66 6f 72 20 69 74 2e 0a 09 20 count for it...
1e40: 20 20 20 20 2a 2f 0a 0a 09 20 20 20 20 54 63 6c */... Tcl
1e50: 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 6f _IncrRefCount(co
1e60: 6e 74 65 78 74 50 74 72 2d 3e 64 61 74 61 2e 65 ntextPtr->data.e
1e70: 76 61 6c 2e 70 61 74 68 29 3b 0a 09 7d 0a 0a 09 val.path);..}...
1e80: 69 66 20 28 63 6f 6e 74 65 78 74 50 74 72 2d 3e if (contextPtr->
1e90: 74 79 70 65 20 3d 3d 20 54 43 4c 5f 4c 4f 43 41 type == TCL_LOCA
1ea0: 54 49 4f 4e 5f 53 4f 55 52 43 45 29 20 7b 0a 09 TION_SOURCE) {..
1eb0: 20 20 20 20 2f 2a 0a 09 20 20 20 20 20 2a 20 57 /*.. * W
1ec0: 65 20 63 61 6e 20 61 63 63 6f 75 6e 74 20 66 6f e can account fo
1ed0: 72 20 73 6f 75 72 63 65 20 6c 6f 63 61 74 69 6f r source locatio
1ee0: 6e 20 77 69 74 68 69 6e 20 61 20 70 72 6f 63 20 n within a proc
1ef0: 6f 6e 6c 79 20 69 66 20 74 68 65 0a 09 20 20 20 only if the..
1f00: 20 20 2a 20 70 72 6f 63 20 62 6f 64 79 20 77 61 * proc body wa
1f10: 73 20 6e 6f 74 20 63 72 65 61 74 65 64 20 62 79 s not created by
1f20: 20 73 75 62 73 74 69 74 75 74 69 6f 6e 2e 0a 09 substitution...
1f30: 20 20 20 20 20 2a 2f 0a 0a 09 20 20 20 20 69 66 */... if
1f40: 20 28 63 6f 6e 74 65 78 74 50 74 72 2d 3e 6c 69 (contextPtr->li
1f50: 6e 65 0a 09 09 20 20 20 20 26 26 20 28 63 6f 6e ne... && (con
1f60: 74 65 78 74 50 74 72 2d 3e 6e 6c 69 6e 65 20 3e textPtr->nline >
1f70: 3d 20 34 29 20 26 26 20 28 63 6f 6e 74 65 78 74 = 4) && (context
1f80: 50 74 72 2d 3e 6c 69 6e 65 5b 33 5d 20 3e 3d 20 Ptr->line[3] >=
1f90: 30 29 29 20 7b 0a 09 09 69 6e 74 20 69 73 4e 65 0)) {...int isNe
1fa0: 77 3b 0a 09 09 54 63 6c 5f 48 61 73 68 45 6e 74 w;...Tcl_HashEnt
1fb0: 72 79 20 2a 68 65 50 74 72 3b 0a 09 09 43 6d 64 ry *hePtr;...Cmd
1fc0: 46 72 61 6d 65 20 2a 63 66 50 74 72 20 3d 20 28 Frame *cfPtr = (
1fd0: 43 6d 64 46 72 61 6d 65 20 2a 29 54 63 6c 5f 41 CmdFrame *)Tcl_A
1fe0: 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 43 6d 64 46 lloc(sizeof(CmdF
1ff0: 72 61 6d 65 29 29 3b 0a 0a 09 09 63 66 50 74 72 rame));....cfPtr
2000: 2d 3e 6c 65 76 65 6c 20 3d 20 2d 31 3b 0a 09 09 ->level = -1;...
2010: 63 66 50 74 72 2d 3e 74 79 70 65 20 3d 20 63 6f cfPtr->type = co
2020: 6e 74 65 78 74 50 74 72 2d 3e 74 79 70 65 3b 0a ntextPtr->type;.
2030: 09 09 63 66 50 74 72 2d 3e 6c 69 6e 65 20 3d 20 ..cfPtr->line =
2040: 28 69 6e 74 20 2a 29 54 63 6c 5f 41 6c 6c 6f 63 (int *)Tcl_Alloc
2050: 28 73 69 7a 65 6f 66 28 69 6e 74 29 29 3b 0a 09 (sizeof(int));..
2060: 09 63 66 50 74 72 2d 3e 6c 69 6e 65 5b 30 5d 20 .cfPtr->line[0]
2070: 3d 20 63 6f 6e 74 65 78 74 50 74 72 2d 3e 6c 69 = contextPtr->li
2080: 6e 65 5b 33 5d 3b 0a 09 09 63 66 50 74 72 2d 3e ne[3];...cfPtr->
2090: 6e 6c 69 6e 65 20 3d 20 31 3b 0a 09 09 63 66 50 nline = 1;...cfP
20a0: 74 72 2d 3e 66 72 61 6d 65 50 74 72 20 3d 20 4e tr->framePtr = N
20b0: 55 4c 4c 3b 0a 09 09 63 66 50 74 72 2d 3e 6e 65 ULL;...cfPtr->ne
20c0: 78 74 50 74 72 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 xtPtr = NULL;...
20d0: 09 63 66 50 74 72 2d 3e 64 61 74 61 2e 65 76 61 .cfPtr->data.eva
20e0: 6c 2e 70 61 74 68 20 3d 20 63 6f 6e 74 65 78 74 l.path = context
20f0: 50 74 72 2d 3e 64 61 74 61 2e 65 76 61 6c 2e 70 Ptr->data.eval.p
2100: 61 74 68 3b 0a 09 09 54 63 6c 5f 49 6e 63 72 52 ath;...Tcl_IncrR
2110: 65 66 43 6f 75 6e 74 28 63 66 50 74 72 2d 3e 64 efCount(cfPtr->d
2120: 61 74 61 2e 65 76 61 6c 2e 70 61 74 68 29 3b 0a ata.eval.path);.
2130: 0a 09 09 63 66 50 74 72 2d 3e 63 6d 64 20 3d 20 ...cfPtr->cmd =
2140: 4e 55 4c 4c 3b 0a 09 09 63 66 50 74 72 2d 3e 6c NULL;...cfPtr->l
2150: 65 6e 20 3d 20 30 3b 0a 0a 09 09 68 65 50 74 72 en = 0;....hePtr
2160: 20 3d 20 54 63 6c 5f 43 72 65 61 74 65 48 61 73 = Tcl_CreateHas
2170: 68 45 6e 74 72 79 28 69 50 74 72 2d 3e 6c 69 6e hEntry(iPtr->lin
2180: 65 50 42 6f 64 79 50 74 72 2c 0a 09 09 09 70 72 ePBodyPtr,....pr
2190: 6f 63 50 74 72 2c 20 26 69 73 4e 65 77 29 3b 0a ocPtr, &isNew);.
21a0: 09 09 69 66 20 28 21 69 73 4e 65 77 29 20 7b 0a ..if (!isNew) {.
21b0: 09 09 20 20 20 20 2f 2a 0a 09 09 20 20 20 20 20 .. /*...
21c0: 2a 20 47 65 74 20 74 68 65 20 6f 6c 64 20 63 6f * Get the old co
21d0: 6d 6d 61 6e 64 20 66 72 61 6d 65 20 61 6e 64 20 mmand frame and
21e0: 72 65 6c 65 61 73 65 20 69 74 2e 20 53 65 65 20 release it. See
21f0: 61 6c 73 6f 0a 09 09 20 20 20 20 20 2a 20 54 63 also... * Tc
2200: 6c 50 72 6f 63 43 6c 65 61 6e 75 70 50 72 6f 63 lProcCleanupProc
2210: 20 69 6e 20 74 68 69 73 20 66 69 6c 65 2e 20 43 in this file. C
2220: 75 72 72 65 6e 74 6c 79 20 69 74 20 73 65 65 6d urrently it seem
2230: 73 20 61 73 0a 09 09 20 20 20 20 20 2a 20 69 66 s as... * if
2240: 20 6f 6e 6c 79 20 74 68 65 20 70 72 6f 63 62 6f only the procbo
2250: 64 79 74 65 73 74 3a 3a 70 72 6f 63 20 63 6f 6d dytest::proc com
2260: 6d 61 6e 64 20 6f 66 20 74 68 65 20 74 65 73 74 mand of the test
2270: 73 75 69 74 65 0a 09 09 20 20 20 20 20 2a 20 69 suite... * i
2280: 73 20 61 62 6c 65 20 74 6f 20 74 72 69 67 67 65 s able to trigge
2290: 72 20 74 68 69 73 20 73 69 74 75 61 74 69 6f 6e r this situation
22a0: 2e 0a 09 09 20 20 20 20 20 2a 2f 0a 0a 09 09 20 .... */....
22b0: 20 20 20 43 6d 64 46 72 61 6d 65 20 2a 63 66 4f CmdFrame *cfO
22c0: 6c 64 50 74 72 20 3d 20 28 43 6d 64 46 72 61 6d ldPtr = (CmdFram
22d0: 65 20 2a 29 54 63 6c 5f 47 65 74 48 61 73 68 56 e *)Tcl_GetHashV
22e0: 61 6c 75 65 28 68 65 50 74 72 29 3b 0a 0a 09 09 alue(hePtr);....
22f0: 20 20 20 20 69 66 20 28 63 66 4f 6c 64 50 74 72 if (cfOldPtr
2300: 2d 3e 74 79 70 65 20 3d 3d 20 54 43 4c 5f 4c 4f ->type == TCL_LO
2310: 43 41 54 49 4f 4e 5f 53 4f 55 52 43 45 29 20 7b CATION_SOURCE) {
2320: 0a 09 09 09 54 63 6c 5f 44 65 63 72 52 65 66 43 ....Tcl_DecrRefC
2330: 6f 75 6e 74 28 63 66 4f 6c 64 50 74 72 2d 3e 64 ount(cfOldPtr->d
2340: 61 74 61 2e 65 76 61 6c 2e 70 61 74 68 29 3b 0a ata.eval.path);.
2350: 09 09 09 63 66 4f 6c 64 50 74 72 2d 3e 64 61 74 ...cfOldPtr->dat
2360: 61 2e 65 76 61 6c 2e 70 61 74 68 20 3d 20 4e 55 a.eval.path = NU
2370: 4c 4c 3b 0a 09 09 20 20 20 20 7d 0a 09 09 20 20 LL;... }...
2380: 20 20 54 63 6c 5f 46 72 65 65 28 63 66 4f 6c 64 Tcl_Free(cfOld
2390: 50 74 72 2d 3e 6c 69 6e 65 29 3b 0a 09 09 20 20 Ptr->line);...
23a0: 20 20 63 66 4f 6c 64 50 74 72 2d 3e 6c 69 6e 65 cfOldPtr->line
23b0: 20 3d 20 4e 55 4c 4c 3b 0a 09 09 20 20 20 20 54 = NULL;... T
23c0: 63 6c 5f 46 72 65 65 28 63 66 4f 6c 64 50 74 72 cl_Free(cfOldPtr
23d0: 29 3b 0a 09 09 7d 0a 09 09 54 63 6c 5f 53 65 74 );...}...Tcl_Set
23e0: 48 61 73 68 56 61 6c 75 65 28 68 65 50 74 72 2c HashValue(hePtr,
23f0: 20 63 66 50 74 72 29 3b 0a 09 20 20 20 20 7d 0a cfPtr);.. }.
2400: 0a 09 20 20 20 20 2f 2a 0a 09 20 20 20 20 20 2a .. /*.. *
2410: 20 27 63 6f 6e 74 65 78 74 50 74 72 27 20 69 73 'contextPtr' is
2420: 20 67 6f 69 6e 67 20 6f 75 74 20 6f 66 20 73 63 going out of sc
2430: 6f 70 65 3b 20 61 63 63 6f 75 6e 74 20 66 6f 72 ope; account for
2440: 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 0a 09 the reference..
2450: 20 20 20 20 20 2a 20 74 68 61 74 20 69 74 27 73 * that it's
2460: 20 68 6f 6c 64 69 6e 67 20 74 6f 20 74 68 65 20 holding to the
2470: 70 61 74 68 20 6e 61 6d 65 2e 0a 09 20 20 20 20 path name...
2480: 20 2a 2f 0a 0a 09 20 20 20 20 54 63 6c 5f 44 65 */... Tcl_De
2490: 63 72 52 65 66 43 6f 75 6e 74 28 63 6f 6e 74 65 crRefCount(conte
24a0: 78 74 50 74 72 2d 3e 64 61 74 61 2e 65 76 61 6c xtPtr->data.eval
24b0: 2e 70 61 74 68 29 3b 0a 09 20 20 20 20 63 6f 6e .path);.. con
24c0: 74 65 78 74 50 74 72 2d 3e 64 61 74 61 2e 65 76 textPtr->data.ev
24d0: 61 6c 2e 70 61 74 68 20 3d 20 4e 55 4c 4c 3b 0a al.path = NULL;.
24e0: 09 7d 0a 09 54 63 6c 53 74 61 63 6b 46 72 65 65 .}..TclStackFree
24f0: 28 69 6e 74 65 72 70 2c 20 63 6f 6e 74 65 78 74 (interp, context
2500: 50 74 72 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 Ptr);. }..
2510: 20 2f 2a 0a 20 20 20 20 20 2a 20 4f 70 74 69 6d /*. * Optim
2520: 69 7a 65 20 66 6f 72 20 6e 6f 2d 6f 70 20 70 72 ize for no-op pr
2530: 6f 63 73 3a 20 69 66 20 74 68 65 20 62 6f 64 79 ocs: if the body
2540: 20 69 73 20 6e 6f 74 20 70 72 65 63 6f 6d 70 69 is not precompi
2550: 6c 65 64 20 28 6c 69 6b 65 20 61 20 54 63 6c 50 led (like a TclP
2560: 72 6f 0a 20 20 20 20 20 2a 20 70 72 6f 63 62 6f ro. * procbo
2570: 64 79 29 2c 20 61 6e 64 20 74 68 65 20 61 72 67 dy), and the arg
2580: 75 6d 65 6e 74 20 6c 69 73 74 20 69 73 20 6a 75 ument list is ju
2590: 73 74 20 22 61 72 67 73 22 20 61 6e 64 20 74 68 st "args" and th
25a0: 65 20 62 6f 64 79 20 69 73 20 65 6d 70 74 79 2c e body is empty,
25b0: 0a 20 20 20 20 20 2a 20 64 65 66 69 6e 65 20 61 . * define a
25c0: 20 63 6f 6d 70 69 6c 65 50 72 6f 63 20 74 6f 20 compileProc to
25d0: 63 6f 6d 70 69 6c 65 20 61 20 6e 6f 2d 6f 70 2e compile a no-op.
25e0: 0a 20 20 20 20 20 2a 0a 20 20 20 20 20 2a 20 4e . *. * N
25f0: 6f 74 65 73 3a 0a 20 20 20 20 20 2a 09 20 2d 20 otes:. *. -
2600: 63 61 6e 6e 6f 74 20 62 65 20 64 6f 6e 65 20 66 cannot be done f
2610: 6f 72 20 61 6e 79 20 61 72 67 75 6d 65 6e 74 20 or any argument
2620: 6c 69 73 74 20 77 69 74 68 6f 75 74 20 68 61 76 list without hav
2630: 69 6e 67 20 64 69 66 66 65 72 65 6e 74 0a 20 20 ing different.
2640: 20 20 20 2a 09 20 20 20 63 6f 6d 70 69 6c 65 64 *. compiled
2650: 2f 6e 6f 74 2d 63 6f 6d 70 69 6c 65 64 20 62 65 /not-compiled be
2660: 68 61 76 69 6f 75 72 20 69 6e 20 74 68 65 20 22 haviour in the "
2670: 77 72 6f 6e 67 20 61 72 67 75 6d 65 6e 74 20 23 wrong argument #
2680: 22 20 63 61 73 65 2c 20 6f 72 0a 20 20 20 20 20 " case, or.
2690: 2a 09 20 20 20 6d 61 6b 69 6e 67 20 74 68 69 73 *. making this
26a0: 20 63 6f 64 65 20 6d 75 63 68 20 6d 6f 72 65 20 code much more
26b0: 63 6f 6d 70 6c 69 63 61 74 65 64 2e 20 49 6e 20 complicated. In
26c0: 61 6e 79 20 63 61 73 65 2c 20 69 74 20 64 6f 65 any case, it doe
26d0: 73 6e 27 74 0a 20 20 20 20 20 2a 09 20 20 20 73 sn't. *. s
26e0: 65 65 6d 20 74 6f 20 6d 61 6b 65 20 61 20 6c 6f eem to make a lo
26f0: 74 20 6f 66 20 73 65 6e 73 65 20 74 6f 20 76 65 t of sense to ve
2700: 72 69 66 79 20 74 68 65 20 6e 75 6d 62 65 72 20 rify the number
2710: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 77 65 0a of arguments we.
2720: 20 20 20 20 20 2a 09 20 20 20 61 72 65 20 61 62 *. are ab
2730: 6f 75 74 20 74 6f 20 69 67 6e 6f 72 65 20 2e 2e out to ignore ..
2740: 2e 0a 20 20 20 20 20 2a 09 20 2d 20 63 6f 75 6c .. *. - coul
2750: 64 20 62 65 20 65 6e 68 61 6e 63 65 64 20 74 6f d be enhanced to
2760: 20 68 61 6e 64 6c 65 20 61 6c 73 6f 20 6e 6f 6e handle also non
2770: 2d 65 6d 70 74 79 20 62 6f 64 69 65 73 20 74 68 -empty bodies th
2780: 61 74 20 63 6f 6e 74 61 69 6e 20 6f 6e 6c 79 0a at contain only.
2790: 20 20 20 20 20 2a 09 20 20 20 63 6f 6d 6d 65 6e *. commen
27a0: 74 73 3b 20 68 6f 77 65 76 65 72 2c 20 70 61 72 ts; however, par
27b0: 73 69 6e 67 20 74 68 65 20 62 6f 64 79 20 77 69 sing the body wi
27c0: 6c 6c 20 73 6c 6f 77 20 64 6f 77 6e 20 74 68 65 ll slow down the
27d0: 20 63 6f 6d 70 69 6c 61 74 69 6f 6e 0a 20 20 20 compilation.
27e0: 20 20 2a 09 20 20 20 6f 66 20 61 6c 6c 20 70 72 *. of all pr
27f0: 6f 63 73 20 77 68 6f 73 65 20 61 72 67 75 6d 65 ocs whose argume
2800: 6e 74 20 6c 69 73 74 20 69 73 20 6a 75 73 74 20 nt list is just
2810: 5f 61 72 67 73 5f 0a 20 20 20 20 20 2a 2f 0a 0a _args_. */..
2820: 20 20 20 20 69 66 20 28 54 63 6c 48 61 73 49 6e if (TclHasIn
2830: 74 65 72 6e 61 6c 52 65 70 28 6f 62 6a 76 5b 33 ternalRep(objv[3
2840: 5d 2c 20 26 74 63 6c 50 72 6f 63 42 6f 64 79 54 ], &tclProcBodyT
2850: 79 70 65 29 29 20 7b 0a 09 67 6f 74 6f 20 64 6f ype)) {..goto do
2860: 6e 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 ne;. }.. p
2870: 72 6f 63 41 72 67 73 20 3d 20 54 63 6c 47 65 74 rocArgs = TclGet
2880: 53 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b String(objv[2]);
2890: 0a 0a 20 20 20 20 77 68 69 6c 65 20 28 2a 70 72 .. while (*pr
28a0: 6f 63 41 72 67 73 20 3d 3d 20 27 20 27 29 20 7b ocArgs == ' ') {
28b0: 0a 09 70 72 6f 63 41 72 67 73 2b 2b 3b 0a 20 20 ..procArgs++;.
28c0: 20 20 7d 0a 0a 20 20 20 20 69 66 20 28 28 70 72 }.. if ((pr
28d0: 6f 63 41 72 67 73 5b 30 5d 20 3d 3d 20 27 61 27 ocArgs[0] == 'a'
28e0: 29 20 26 26 20 28 73 74 72 6e 63 6d 70 28 70 72 ) && (strncmp(pr
28f0: 6f 63 41 72 67 73 2c 20 22 61 72 67 73 22 2c 20 ocArgs, "args",
2900: 34 29 20 3d 3d 20 30 29 29 20 7b 0a 09 54 63 6c 4) == 0)) {..Tcl
2910: 5f 53 69 7a 65 20 6e 75 6d 42 79 74 65 73 3b 0a _Size numBytes;.
2920: 0a 09 70 72 6f 63 41 72 67 73 20 2b 3d 34 3b 0a ..procArgs +=4;.
2930: 09 77 68 69 6c 65 20 28 2a 70 72 6f 63 41 72 67 .while (*procArg
2940: 73 20 21 3d 20 27 5c 30 27 29 20 7b 0a 09 20 20 s != '\0') {..
2950: 20 20 69 66 20 28 2a 70 72 6f 63 41 72 67 73 20 if (*procArgs
2960: 21 3d 20 27 20 27 29 20 7b 0a 09 09 67 6f 74 6f != ' ') {...goto
2970: 20 64 6f 6e 65 3b 0a 09 20 20 20 20 7d 0a 09 20 done;.. }..
2980: 20 20 20 70 72 6f 63 41 72 67 73 2b 2b 3b 0a 09 procArgs++;..
2990: 7d 0a 0a 09 2f 2a 0a 09 20 2a 20 54 68 65 20 61 }.../*.. * The a
29a0: 72 67 75 6d 65 6e 74 20 6c 69 73 74 20 69 73 20 rgument list is
29b0: 6a 75 73 74 20 22 61 72 67 73 22 3b 20 63 68 65 just "args"; che
29c0: 63 6b 20 74 68 65 20 62 6f 64 79 0a 09 20 2a 2f ck the body.. */
29d0: 0a 0a 09 70 72 6f 63 42 6f 64 79 20 3d 20 54 63 ...procBody = Tc
29e0: 6c 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 lGetStringFromOb
29f0: 6a 28 6f 62 6a 76 5b 33 5d 2c 20 26 6e 75 6d 42 j(objv[3], &numB
2a00: 79 74 65 73 29 3b 0a 09 69 66 20 28 54 63 6c 50 ytes);..if (TclP
2a10: 61 72 73 65 41 6c 6c 57 68 69 74 65 53 70 61 63 arseAllWhiteSpac
2a20: 65 28 70 72 6f 63 42 6f 64 79 2c 20 6e 75 6d 42 e(procBody, numB
2a30: 79 74 65 73 29 20 3c 20 6e 75 6d 42 79 74 65 73 ytes) < numBytes
2a40: 29 20 7b 0a 09 20 20 20 20 67 6f 74 6f 20 64 6f ) {.. goto do
2a50: 6e 65 3b 0a 09 7d 0a 0a 09 2f 2a 0a 09 20 2a 20 ne;..}.../*.. *
2a60: 54 68 65 20 62 6f 64 79 20 69 73 20 6a 75 73 74 The body is just
2a70: 20 73 70 61 63 65 73 3a 20 6c 69 6e 6b 20 74 68 spaces: link th
2a80: 65 20 63 6f 6d 70 69 6c 65 50 72 6f 63 0a 09 20 e compileProc..
2a90: 2a 2f 0a 0a 09 28 28 43 6f 6d 6d 61 6e 64 20 2a */...((Command *
2aa0: 29 20 63 6d 64 29 2d 3e 63 6f 6d 70 69 6c 65 50 ) cmd)->compileP
2ab0: 72 6f 63 20 3d 20 54 63 6c 43 6f 6d 70 69 6c 65 roc = TclCompile
2ac0: 4e 6f 4f 70 3b 0a 20 20 20 20 7d 0a 0a 20 20 64 NoOp;. }.. d
2ad0: 6f 6e 65 3a 0a 20 20 20 20 72 65 74 75 72 6e 20 one:. return
2ae0: 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 TCL_OK;.}.../*.
2af0: 2a 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 2d 2d 2d 2d 2d ----------------
2b20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2b30: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 63 -------. *. * Tc
2b40: 6c 43 72 65 61 74 65 50 72 6f 63 20 2d 2d 0a 20 lCreateProc --.
2b50: 2a 0a 20 2a 09 43 72 65 61 74 65 73 20 74 68 65 *. *.Creates the
2b60: 20 64 61 74 61 20 61 73 73 6f 63 69 61 74 65 64 data associated
2b70: 20 77 69 74 68 20 61 20 54 63 6c 20 70 72 6f 63 with a Tcl proc
2b80: 65 64 75 72 65 20 64 65 66 69 6e 69 74 69 6f 6e edure definition
2b90: 2e 20 54 68 69 73 0a 20 2a 09 66 75 6e 63 74 69 . This. *.functi
2ba0: 6f 6e 20 6b 6e 6f 77 73 20 68 6f 77 20 74 6f 20 on knows how to
2bb0: 68 61 6e 64 6c 65 20 74 77 6f 20 74 79 70 65 73 handle two types
2bc0: 20 6f 66 20 62 6f 64 79 20 6f 62 6a 65 63 74 73 of body objects
2bd0: 3a 20 73 74 72 69 6e 67 73 20 61 6e 64 0a 20 2a : strings and. *
2be0: 09 70 72 6f 63 62 6f 64 79 2e 20 53 74 72 69 6e .procbody. Strin
2bf0: 67 73 20 61 72 65 20 74 68 65 20 74 72 61 64 69 gs are the tradi
2c00: 74 69 6f 6e 61 6c 20 28 61 6e 64 20 63 6f 6d 6d tional (and comm
2c10: 6f 6e 29 20 76 61 6c 75 65 20 66 6f 72 20 62 6f on) value for bo
2c20: 64 69 65 73 2c 0a 20 2a 09 70 72 6f 63 62 6f 64 dies,. *.procbod
2c30: 79 20 61 72 65 20 76 61 6c 75 65 73 20 63 72 65 y are values cre
2c40: 61 74 65 64 20 62 79 20 65 78 74 65 6e 73 69 6f ated by extensio
2c50: 6e 73 20 74 68 61 74 20 68 61 76 65 20 6c 6f 61 ns that have loa
2c60: 64 65 64 20 61 0a 20 2a 09 70 72 65 76 69 6f 75 ded a. *.previou
2c70: 73 6c 79 20 63 6f 6d 70 69 6c 65 64 20 73 63 72 sly compiled scr
2c80: 69 70 74 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c ipt.. *. * Resul
2c90: 74 73 3a 0a 20 2a 09 52 65 74 75 72 6e 73 20 54 ts:. *.Returns T
2ca0: 43 4c 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 CL_OK on success
2cb0: 2c 20 61 6c 6f 6e 67 20 77 69 74 68 20 61 20 70 , along with a p
2cc0: 6f 69 6e 74 65 72 20 74 6f 20 61 20 54 63 6c 20 ointer to a Tcl
2cd0: 70 72 6f 63 65 64 75 72 65 0a 20 2a 09 64 65 66 procedure. *.def
2ce0: 69 6e 69 74 69 6f 6e 20 69 6e 20 70 72 6f 63 50 inition in procP
2cf0: 74 72 50 74 72 20 77 68 65 72 65 20 74 68 65 20 trPtr where the
2d00: 63 6d 64 50 74 72 20 66 69 65 6c 64 20 69 73 20 cmdPtr field is
2d10: 6e 6f 74 20 69 6e 69 74 69 61 6c 69 73 65 64 2e not initialised.
2d20: 0a 20 2a 09 54 68 69 73 20 64 65 66 69 6e 69 74 . *.This definit
2d30: 69 6f 6e 20 73 68 6f 75 6c 64 20 62 65 20 66 72 ion should be fr
2d40: 65 65 64 20 62 79 20 63 61 6c 6c 69 6e 67 20 54 eed by calling T
2d50: 63 6c 50 72 6f 63 43 6c 65 61 6e 75 70 50 72 6f clProcCleanupPro
2d60: 63 28 29 20 77 68 65 6e 0a 20 2a 09 69 74 20 69 c() when. *.it i
2d70: 73 20 6e 6f 20 6c 6f 6e 67 65 72 20 6e 65 65 64 s no longer need
2d80: 65 64 2e 20 52 65 74 75 72 6e 73 20 54 43 4c 5f ed. Returns TCL_
2d90: 45 52 52 4f 52 20 69 66 20 61 6e 79 74 68 69 6e ERROR if anythin
2da0: 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 20 2a g goes wrong.. *
2db0: 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 73 . * Side effects
2dc0: 3a 0a 20 2a 09 49 66 20 61 6e 79 74 68 69 6e 67 :. *.If anything
2dd0: 20 67 6f 65 73 20 77 72 6f 6e 67 2c 20 74 68 69 goes wrong, thi
2de0: 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 s function retur
2df0: 6e 73 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 ns an error mess
2e00: 61 67 65 20 69 6e 20 74 68 65 0a 20 2a 09 69 6e age in the. *.in
2e10: 74 65 72 70 72 65 74 65 72 2e 0a 20 2a 0a 20 2a terpreter.. *. *
2e20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2e30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2e40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2e50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2e60: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74 ------. */..stat
2e70: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 54 4f ic const char TO
2e80: 4f 4d 41 4e 59 41 52 47 53 5b 5d 20 3d 20 22 54 OMANYARGS[] = "T
2e90: 4f 4f 4d 41 4e 59 41 52 47 53 22 3b 0a 0a 69 6e OOMANYARGS";..in
2ea0: 74 0a 54 63 6c 43 72 65 61 74 65 50 72 6f 63 28 t.TclCreateProc(
2eb0: 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 . Tcl_Interp
2ec0: 2a 69 6e 74 65 72 70 2c 09 09 2f 2a 20 49 6e 74 *interp,../* Int
2ed0: 65 72 70 72 65 74 65 72 20 63 6f 6e 74 61 69 6e erpreter contain
2ee0: 69 6e 67 20 70 72 6f 63 2e 20 2a 2f 0a 20 20 20 ing proc. */.
2ef0: 20 54 43 4c 5f 55 4e 55 53 45 44 28 4e 61 6d 65 TCL_UNUSED(Name
2f00: 73 70 61 63 65 20 2a 29 20 2f 2a 6e 73 50 74 72 space *) /*nsPtr
2f10: 2a 2f 2c 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 */,. const ch
2f20: 61 72 20 2a 70 72 6f 63 4e 61 6d 65 2c 09 2f 2a ar *procName,./*
2f30: 20 55 6e 71 75 61 6c 69 66 69 65 64 20 6e 61 6d Unqualified nam
2f40: 65 20 6f 66 20 74 68 69 73 20 70 72 6f 63 2e 20 e of this proc.
2f50: 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a */. Tcl_Obj *
2f60: 61 72 67 73 50 74 72 2c 09 09 2f 2a 20 44 65 73 argsPtr,../* Des
2f70: 63 72 69 70 74 69 6f 6e 20 6f 66 20 61 72 67 75 cription of argu
2f80: 6d 65 6e 74 73 2e 20 2a 2f 0a 20 20 20 20 54 63 ments. */. Tc
2f90: 6c 5f 4f 62 6a 20 2a 62 6f 64 79 50 74 72 2c 09 l_Obj *bodyPtr,.
2fa0: 09 2f 2a 20 43 6f 6d 6d 61 6e 64 20 62 6f 64 79 ./* Command body
2fb0: 2e 20 2a 2f 0a 20 20 20 20 50 72 6f 63 20 2a 2a . */. Proc **
2fc0: 70 72 6f 63 50 74 72 50 74 72 29 09 09 2f 2a 20 procPtrPtr)../*
2fd0: 52 65 74 75 72 6e 73 3a 20 70 6f 69 6e 74 65 72 Returns: pointer
2fe0: 20 74 6f 20 70 72 6f 63 20 64 61 74 61 2e 20 2a to proc data. *
2ff0: 2f 0a 7b 0a 20 20 20 20 49 6e 74 65 72 70 20 2a /.{. Interp *
3000: 69 50 74 72 20 3d 20 28 49 6e 74 65 72 70 20 2a iPtr = (Interp *
3010: 29 20 69 6e 74 65 72 70 3b 0a 0a 20 20 20 20 50 ) interp;.. P
3020: 72 6f 63 20 2a 70 72 6f 63 50 74 72 20 3d 20 4e roc *procPtr = N
3030: 55 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 53 69 7a ULL;. Tcl_Siz
3040: 65 20 69 2c 20 6e 75 6d 41 72 67 73 3b 0a 20 20 e i, numArgs;.
3050: 20 20 43 6f 6d 70 69 6c 65 64 4c 6f 63 61 6c 20 CompiledLocal
3060: 2a 6c 6f 63 61 6c 50 74 72 20 3d 20 4e 55 4c 4c *localPtr = NULL
3070: 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a ;. Tcl_Obj **
3080: 61 72 67 41 72 72 61 79 3b 0a 20 20 20 20 69 6e argArray;. in
3090: 74 20 70 72 65 63 6f 6d 70 69 6c 65 64 20 3d 20 t precompiled =
30a0: 30 2c 20 72 65 73 75 6c 74 3b 0a 20 20 20 20 63 0, result;. c
30b0: 6f 6e 73 74 20 63 68 61 72 20 2a 65 72 72 6f 72 onst char *error
30c0: 43 6f 64 65 20 3d 20 4e 55 4c 4c 3b 0a 0a 20 20 Code = NULL;..
30d0: 20 20 50 72 6f 63 47 65 74 49 6e 74 65 72 6e 61 ProcGetInterna
30e0: 6c 52 65 70 28 62 6f 64 79 50 74 72 2c 20 70 72 lRep(bodyPtr, pr
30f0: 6f 63 50 74 72 29 3b 0a 20 20 20 20 69 66 20 28 ocPtr);. if (
3100: 70 72 6f 63 50 74 72 20 21 3d 20 4e 55 4c 4c 29 procPtr != NULL)
3110: 20 7b 0a 09 2f 2a 0a 09 20 2a 20 42 65 63 61 75 {../*.. * Becau
3120: 73 65 20 74 68 65 20 62 6f 64 79 20 69 73 20 61 se the body is a
3130: 20 54 63 6c 50 72 6f 50 72 6f 63 42 6f 64 79 2c TclProProcBody,
3140: 20 74 68 65 20 61 63 74 75 61 6c 20 62 6f 64 79 the actual body
3150: 20 69 73 20 61 6c 72 65 61 64 79 0a 09 20 2a 20 is already.. *
3160: 63 6f 6d 70 69 6c 65 64 2c 20 61 6e 64 20 69 74 compiled, and it
3170: 20 69 73 20 6e 6f 74 20 73 68 61 72 65 64 20 77 is not shared w
3180: 69 74 68 20 61 6e 79 6f 6e 65 20 65 6c 73 65 2c ith anyone else,
3190: 20 73 6f 20 69 74 27 73 20 4f 4b 20 6e 6f 74 20 so it's OK not
31a0: 74 6f 0a 09 20 2a 20 75 6e 73 68 61 72 65 20 69 to.. * unshare i
31b0: 74 20 28 61 73 20 61 20 6d 61 74 74 65 72 20 6f t (as a matter o
31c0: 66 20 66 61 63 74 2c 20 69 74 20 69 73 20 62 61 f fact, it is ba
31d0: 64 20 74 6f 20 75 6e 73 68 61 72 65 20 69 74 2c d to unshare it,
31e0: 20 62 65 63 61 75 73 65 0a 09 20 2a 20 74 68 65 because.. * the
31f0: 72 65 20 6d 61 79 20 62 65 20 6e 6f 20 73 6f 75 re may be no sou
3200: 72 63 65 20 63 6f 64 65 29 2e 0a 09 20 2a 0a 09 rce code)... *..
3210: 20 2a 20 57 65 20 64 6f 6e 27 74 20 63 72 65 61 * We don't crea
3220: 74 65 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a te and initializ
3230: 65 20 61 20 50 72 6f 63 20 73 74 72 75 63 74 75 e a Proc structu
3240: 72 65 20 66 6f 72 20 74 68 65 20 70 72 6f 63 65 re for the proce
3250: 64 75 72 65 3b 0a 09 20 2a 20 72 61 74 68 65 72 dure;.. * rather
3260: 2c 20 77 65 20 75 73 65 20 77 68 61 74 20 69 73 , we use what is
3270: 20 69 6e 20 74 68 65 20 62 6f 64 79 20 6f 62 6a in the body obj
3280: 65 63 74 2e 20 57 65 20 69 6e 63 72 65 6d 65 6e ect. We incremen
3290: 74 20 74 68 65 20 72 65 66 0a 09 20 2a 20 63 6f t the ref.. * co
32a0: 75 6e 74 20 6f 66 20 74 68 65 20 50 72 6f 63 20 unt of the Proc
32b0: 73 74 72 75 63 74 20 73 69 6e 63 65 20 74 68 65 struct since the
32c0: 20 63 6f 6d 6d 61 6e 64 20 28 73 6f 6f 6e 20 74 command (soon t
32d0: 6f 20 62 65 20 63 72 65 61 74 65 64 29 0a 09 20 o be created)..
32e0: 2a 20 77 69 6c 6c 20 62 65 20 68 6f 6c 64 69 6e * will be holdin
32f0: 67 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f g a reference to
3300: 20 69 74 2e 0a 09 20 2a 2f 0a 0a 09 70 72 6f 63 it... */...proc
3310: 50 74 72 2d 3e 69 50 74 72 20 3d 20 69 50 74 72 Ptr->iPtr = iPtr
3320: 3b 0a 09 70 72 6f 63 50 74 72 2d 3e 72 65 66 43 ;..procPtr->refC
3330: 6f 75 6e 74 2b 2b 3b 0a 09 70 72 65 63 6f 6d 70 ount++;..precomp
3340: 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 20 iled = 1;. }
3350: 65 6c 73 65 20 7b 0a 09 2f 2a 0a 09 20 2a 20 49 else {../*.. * I
3360: 66 20 74 68 65 20 70 72 6f 63 65 64 75 72 65 27 f the procedure'
3370: 73 20 62 6f 64 79 20 6f 62 6a 65 63 74 20 69 73 s body object is
3380: 20 73 68 61 72 65 64 20 62 65 63 61 75 73 65 20 shared because
3390: 69 74 73 20 73 74 72 69 6e 67 20 76 61 6c 75 65 its string value
33a0: 0a 09 20 2a 20 69 73 20 69 64 65 6e 74 69 63 61 .. * is identica
33b0: 6c 20 74 6f 2c 20 65 2e 67 2e 2c 20 74 68 65 20 l to, e.g., the
33c0: 62 6f 64 79 20 6f 66 20 61 6e 6f 74 68 65 72 20 body of another
33d0: 70 72 6f 63 65 64 75 72 65 2c 20 77 65 20 6d 75 procedure, we mu
33e0: 73 74 0a 09 20 2a 20 63 72 65 61 74 65 20 61 20 st.. * create a
33f0: 70 72 69 76 61 74 65 20 63 6f 70 79 20 66 6f 72 private copy for
3400: 20 74 68 69 73 20 70 72 6f 63 65 64 75 72 65 20 this procedure
3410: 74 6f 20 75 73 65 2e 20 53 75 63 68 20 73 68 61 to use. Such sha
3420: 72 69 6e 67 20 6f 66 0a 09 20 2a 20 70 72 6f 63 ring of.. * proc
3430: 65 64 75 72 65 20 62 6f 64 69 65 73 20 69 73 20 edure bodies is
3440: 72 61 72 65 20 62 75 74 20 63 61 6e 20 63 61 75 rare but can cau
3450: 73 65 20 70 72 6f 62 6c 65 6d 73 2e 20 41 20 70 se problems. A p
3460: 72 6f 63 65 64 75 72 65 20 62 6f 64 79 0a 09 20 rocedure body..
3470: 2a 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 69 6e * is compiled in
3480: 20 61 20 63 6f 6e 74 65 78 74 20 74 68 61 74 20 a context that
3490: 69 6e 63 6c 75 64 65 73 20 74 68 65 20 6e 75 6d includes the num
34a0: 62 65 72 20 6f 66 20 22 73 6c 6f 74 73 22 0a 09 ber of "slots"..
34b0: 20 2a 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 * allocated by
34c0: 74 68 65 20 63 6f 6d 70 69 6c 65 72 20 66 6f 72 the compiler for
34d0: 20 6c 6f 63 61 6c 20 76 61 72 69 61 62 6c 65 73 local variables
34e0: 2e 20 54 68 65 72 65 20 69 73 20 61 20 6c 6f 63 . There is a loc
34f0: 61 6c 0a 09 20 2a 20 76 61 72 69 61 62 6c 65 20 al.. * variable
3500: 73 6c 6f 74 20 66 6f 72 20 65 61 63 68 20 66 6f slot for each fo
3510: 72 6d 61 6c 20 70 61 72 61 6d 65 74 65 72 20 28 rmal parameter (
3520: 74 68 65 0a 09 20 2a 20 22 70 72 6f 63 50 74 72 the.. * "procPtr
3530: 2d 3e 6e 75 6d 43 6f 6d 70 69 6c 65 64 4c 6f 63 ->numCompiledLoc
3540: 61 6c 73 20 3d 20 6e 75 6d 41 72 67 73 22 20 61 als = numArgs" a
3550: 73 73 69 67 6e 6d 65 6e 74 20 62 65 6c 6f 77 29 ssignment below)
3560: 2e 20 54 68 69 73 0a 09 20 2a 20 6d 65 61 6e 73 . This.. * means
3570: 20 74 68 61 74 20 74 68 65 20 73 61 6d 65 20 63 that the same c
3580: 6f 64 65 20 63 61 6e 20 6e 6f 74 20 62 65 20 73 ode can not be s
3590: 68 61 72 65 64 20 62 79 20 74 77 6f 20 70 72 6f hared by two pro
35a0: 63 65 64 75 72 65 73 20 74 68 61 74 0a 09 20 2a cedures that.. *
35b0: 20 68 61 76 65 20 61 20 64 69 66 66 65 72 65 6e have a differen
35c0: 74 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 t number of argu
35d0: 6d 65 6e 74 73 2c 20 65 76 65 6e 20 69 66 20 74 ments, even if t
35e0: 68 65 69 72 20 62 6f 64 69 65 73 20 61 72 65 0a heir bodies are.
35f0: 09 20 2a 20 69 64 65 6e 74 69 63 61 6c 2e 20 4e . * identical. N
3600: 6f 74 65 20 74 68 61 74 20 77 65 20 64 6f 6e 27 ote that we don'
3610: 74 20 75 73 65 20 54 63 6c 5f 44 75 70 6c 69 63 t use Tcl_Duplic
3620: 61 74 65 4f 62 6a 20 73 69 6e 63 65 20 77 65 20 ateObj since we
3630: 77 6f 75 6c 64 0a 09 20 2a 20 6e 6f 74 20 77 61 would.. * not wa
3640: 6e 74 20 61 6e 79 20 62 79 74 65 63 6f 64 65 20 nt any bytecode
3650: 69 6e 74 65 72 6e 61 6c 20 72 65 70 72 65 73 65 internal represe
3660: 6e 74 61 74 69 6f 6e 2e 0a 09 20 2a 2f 0a 0a 09 ntation... */...
3670: 69 66 20 28 54 63 6c 5f 49 73 53 68 61 72 65 64 if (Tcl_IsShared
3680: 28 62 6f 64 79 50 74 72 29 29 20 7b 0a 09 20 20 (bodyPtr)) {..
3690: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 62 79 const char *by
36a0: 74 65 73 3b 0a 09 20 20 20 20 54 63 6c 5f 53 69 tes;.. Tcl_Si
36b0: 7a 65 20 6c 65 6e 67 74 68 3b 0a 09 20 20 20 20 ze length;..
36c0: 54 63 6c 5f 4f 62 6a 20 2a 73 68 61 72 65 64 42 Tcl_Obj *sharedB
36d0: 6f 64 79 50 74 72 20 3d 20 62 6f 64 79 50 74 72 odyPtr = bodyPtr
36e0: 3b 0a 0a 09 20 20 20 20 62 79 74 65 73 20 3d 20 ;... bytes =
36f0: 54 63 6c 47 65 74 53 74 72 69 6e 67 46 72 6f 6d TclGetStringFrom
3700: 4f 62 6a 28 62 6f 64 79 50 74 72 2c 20 26 6c 65 Obj(bodyPtr, &le
3710: 6e 67 74 68 29 3b 0a 09 20 20 20 20 62 6f 64 79 ngth);.. body
3720: 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 Ptr = Tcl_NewStr
3730: 69 6e 67 4f 62 6a 28 62 79 74 65 73 2c 20 6c 65 ingObj(bytes, le
3740: 6e 67 74 68 29 3b 0a 0a 09 20 20 20 20 2f 2a 0a ngth);... /*.
3750: 09 20 20 20 20 20 2a 20 54 49 50 20 23 32 38 30 . * TIP #280
3760: 2e 0a 09 20 20 20 20 20 2a 20 45 6e 73 75 72 65 ... * Ensure
3770: 20 74 68 61 74 20 74 68 65 20 63 6f 6e 74 69 6e that the contin
3780: 75 61 74 69 6f 6e 20 6c 69 6e 65 20 64 61 74 61 uation line data
3790: 20 66 6f 72 20 74 68 65 20 6f 72 69 67 69 6e 61 for the origina
37a0: 6c 20 62 6f 64 79 20 69 73 0a 09 20 20 20 20 20 l body is..
37b0: 2a 20 6e 6f 74 20 6c 6f 73 74 20 61 6e 64 20 61 * not lost and a
37c0: 70 70 6c 69 65 73 20 74 6f 20 74 68 65 20 6e 65 pplies to the ne
37d0: 77 20 62 6f 64 79 20 61 73 20 77 65 6c 6c 2e 0a w body as well..
37e0: 09 20 20 20 20 20 2a 2f 0a 0a 09 20 20 20 20 54 . */... T
37f0: 63 6c 43 6f 6e 74 69 6e 75 61 74 69 6f 6e 73 43 clContinuationsC
3800: 6f 70 79 28 62 6f 64 79 50 74 72 2c 20 73 68 61 opy(bodyPtr, sha
3810: 72 65 64 42 6f 64 79 50 74 72 29 3b 0a 09 7d 0a redBodyPtr);..}.
3820: 0a 09 2f 2a 0a 09 20 2a 20 43 72 65 61 74 65 20 ../*.. * Create
3830: 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20 61 and initialize a
3840: 20 50 72 6f 63 20 73 74 72 75 63 74 75 72 65 20 Proc structure
3850: 66 6f 72 20 74 68 65 20 70 72 6f 63 65 64 75 72 for the procedur
3860: 65 2e 20 57 65 0a 09 20 2a 20 69 6e 63 72 65 6d e. We.. * increm
3870: 65 6e 74 20 74 68 65 20 72 65 66 20 63 6f 75 6e ent the ref coun
3880: 74 20 6f 66 20 74 68 65 20 70 72 6f 63 65 64 75 t of the procedu
3890: 72 65 27 73 20 62 6f 64 79 20 6f 62 6a 65 63 74 re's body object
38a0: 20 73 69 6e 63 65 20 74 68 65 72 65 0a 09 20 2a since there.. *
38b0: 20 77 69 6c 6c 20 62 65 20 61 20 72 65 66 65 72 will be a refer
38c0: 65 6e 63 65 20 74 6f 20 69 74 20 69 6e 20 74 68 ence to it in th
38d0: 65 20 50 72 6f 63 20 73 74 72 75 63 74 75 72 65 e Proc structure
38e0: 2e 0a 09 20 2a 2f 0a 0a 09 54 63 6c 5f 49 6e 63 ... */...Tcl_Inc
38f0: 72 52 65 66 43 6f 75 6e 74 28 62 6f 64 79 50 74 rRefCount(bodyPt
3900: 72 29 3b 0a 0a 09 70 72 6f 63 50 74 72 20 3d 20 r);...procPtr =
3910: 28 50 72 6f 63 20 2a 29 54 63 6c 5f 41 6c 6c 6f (Proc *)Tcl_Allo
3920: 63 28 73 69 7a 65 6f 66 28 50 72 6f 63 29 29 3b c(sizeof(Proc));
3930: 0a 09 70 72 6f 63 50 74 72 2d 3e 69 50 74 72 20 ..procPtr->iPtr
3940: 3d 20 69 50 74 72 3b 0a 09 70 72 6f 63 50 74 72 = iPtr;..procPtr
3950: 2d 3e 72 65 66 43 6f 75 6e 74 20 3d 20 31 3b 0a ->refCount = 1;.
3960: 09 70 72 6f 63 50 74 72 2d 3e 63 6d 64 50 74 72 .procPtr->cmdPtr
3970: 20 3d 20 4e 55 4c 4c 3b 0a 09 70 72 6f 63 50 74 = NULL;..procPt
3980: 72 2d 3e 62 6f 64 79 50 74 72 20 3d 20 62 6f 64 r->bodyPtr = bod
3990: 79 50 74 72 3b 0a 09 70 72 6f 63 50 74 72 2d 3e yPtr;..procPtr->
39a0: 6e 75 6d 41 72 67 73 20 3d 20 30 3b 09 2f 2a 20 numArgs = 0;./*
39b0: 41 63 74 75 61 6c 20 61 72 67 75 6d 65 6e 74 20 Actual argument
39c0: 63 6f 75 6e 74 20 69 73 20 73 65 74 20 62 65 6c count is set bel
39d0: 6f 77 2e 20 2a 2f 0a 09 70 72 6f 63 50 74 72 2d ow. */..procPtr-
39e0: 3e 6e 75 6d 43 6f 6d 70 69 6c 65 64 4c 6f 63 61 >numCompiledLoca
39f0: 6c 73 20 3d 20 30 3b 0a 09 70 72 6f 63 50 74 72 ls = 0;..procPtr
3a00: 2d 3e 66 69 72 73 74 4c 6f 63 61 6c 50 74 72 20 ->firstLocalPtr
3a10: 3d 20 4e 55 4c 4c 3b 0a 09 70 72 6f 63 50 74 72 = NULL;..procPtr
3a20: 2d 3e 6c 61 73 74 4c 6f 63 61 6c 50 74 72 20 3d ->lastLocalPtr =
3a30: 20 4e 55 4c 4c 3b 0a 09 70 72 6f 63 50 74 72 2d NULL;..procPtr-
3a40: 3e 66 6c 61 67 73 20 3d 20 30 3b 0a 20 20 20 20 >flags = 0;.
3a50: 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a }.. /*. *
3a60: 20 42 72 65 61 6b 20 75 70 20 74 68 65 20 61 72 Break up the ar
3a70: 67 75 6d 65 6e 74 20 6c 69 73 74 20 69 6e 74 6f gument list into
3a80: 20 61 72 67 75 6d 65 6e 74 20 73 70 65 63 69 66 argument specif
3a90: 69 65 72 73 2c 20 74 68 65 6e 20 70 72 6f 63 65 iers, then proce
3aa0: 73 73 20 65 61 63 68 0a 20 20 20 20 20 2a 20 61 ss each. * a
3ab0: 72 67 75 6d 65 6e 74 20 73 70 65 63 69 66 69 65 rgument specifie
3ac0: 72 2e 20 49 66 20 74 68 65 20 62 6f 64 79 20 69 r. If the body i
3ad0: 73 20 70 72 65 63 6f 6d 70 69 6c 65 64 2c 20 70 s precompiled, p
3ae0: 72 6f 63 65 73 73 69 6e 67 20 69 73 20 6c 69 6d rocessing is lim
3af0: 69 74 65 64 0a 20 20 20 20 20 2a 20 74 6f 20 63 ited. * to c
3b00: 68 65 63 6b 69 6e 67 20 74 68 61 74 20 74 68 65 hecking that the
3b10: 20 70 61 72 73 65 64 20 61 72 67 75 6d 65 6e 74 parsed argument
3b20: 20 69 73 20 63 6f 6e 73 69 73 74 65 6e 74 20 77 is consistent w
3b30: 69 74 68 20 74 68 65 20 6f 6e 65 20 73 74 6f 72 ith the one stor
3b40: 65 64 0a 20 20 20 20 20 2a 20 69 6e 20 74 68 65 ed. * in the
3b50: 20 50 72 6f 63 2e 0a 20 20 20 20 20 2a 2f 0a 0a Proc.. */..
3b60: 20 20 20 20 72 65 73 75 6c 74 20 3d 20 54 63 6c result = Tcl
3b70: 4c 69 73 74 4f 62 6a 47 65 74 45 6c 65 6d 65 6e ListObjGetElemen
3b80: 74 73 28 69 6e 74 65 72 70 2c 20 61 72 67 73 50 ts(interp, argsP
3b90: 74 72 2c 20 26 6e 75 6d 41 72 67 73 2c 20 26 61 tr, &numArgs, &a
3ba0: 72 67 41 72 72 61 79 29 3b 0a 20 20 20 20 69 66 rgArray);. if
3bb0: 20 28 72 65 73 75 6c 74 20 21 3d 20 54 43 4c 5f (result != TCL_
3bc0: 4f 4b 29 20 7b 0a 09 67 6f 74 6f 20 70 72 6f 63 OK) {..goto proc
3bd0: 45 72 72 6f 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 Error;. }..
3be0: 20 20 69 66 20 28 70 72 65 63 6f 6d 70 69 6c 65 if (precompile
3bf0: 64 29 20 7b 0a 09 69 66 20 28 6e 75 6d 41 72 67 d) {..if (numArg
3c00: 73 20 3e 20 70 72 6f 63 50 74 72 2d 3e 6e 75 6d s > procPtr->num
3c10: 41 72 67 73 29 20 7b 0a 09 20 20 20 20 54 63 6c Args) {.. Tcl
3c20: 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e _SetObjResult(in
3c30: 74 65 72 70 2c 20 54 63 6c 5f 4f 62 6a 50 72 69 terp, Tcl_ObjPri
3c40: 6e 74 66 28 0a 09 09 20 20 20 20 22 70 72 6f 63 ntf(... "proc
3c50: 65 64 75 72 65 20 5c 22 25 73 5c 22 3a 20 61 72 edure \"%s\": ar
3c60: 67 20 6c 69 73 74 20 63 6f 6e 74 61 69 6e 73 20 g list contains
3c70: 25 22 20 54 43 4c 5f 53 49 5a 45 5f 4d 4f 44 49 %" TCL_SIZE_MODI
3c80: 46 49 45 52 20 22 64 20 65 6e 74 72 69 65 73 2c FIER "d entries,
3c90: 20 22 0a 09 09 20 20 20 20 22 70 72 65 63 6f 6d "... "precom
3ca0: 70 69 6c 65 64 20 68 65 61 64 65 72 20 65 78 70 piled header exp
3cb0: 65 63 74 73 20 25 22 20 54 43 4c 5f 53 49 5a 45 ects %" TCL_SIZE
3cc0: 5f 4d 4f 44 49 46 49 45 52 20 22 64 22 2c 20 70 _MODIFIER "d", p
3cd0: 72 6f 63 4e 61 6d 65 2c 20 6e 75 6d 41 72 67 73 rocName, numArgs
3ce0: 2c 0a 09 09 20 20 20 20 70 72 6f 63 50 74 72 2d ,... procPtr-
3cf0: 3e 6e 75 6d 41 72 67 73 29 29 3b 0a 09 20 20 20 >numArgs));..
3d00: 20 65 72 72 6f 72 43 6f 64 65 20 3d 20 22 42 59 errorCode = "BY
3d10: 54 45 43 4f 44 45 4c 49 45 53 22 3b 0a 09 20 20 TECODELIES";..
3d20: 20 20 67 6f 74 6f 20 70 72 6f 63 45 72 72 6f 72 goto procError
3d30: 3b 0a 09 7d 0a 09 6c 6f 63 61 6c 50 74 72 20 3d ;..}..localPtr =
3d40: 20 70 72 6f 63 50 74 72 2d 3e 66 69 72 73 74 4c procPtr->firstL
3d50: 6f 63 61 6c 50 74 72 3b 0a 20 20 20 20 7d 20 65 ocalPtr;. } e
3d60: 6c 73 65 20 7b 0a 09 70 72 6f 63 50 74 72 2d 3e lse {..procPtr->
3d70: 6e 75 6d 41 72 67 73 20 3d 20 6e 75 6d 41 72 67 numArgs = numArg
3d80: 73 3b 0a 09 70 72 6f 63 50 74 72 2d 3e 6e 75 6d s;..procPtr->num
3d90: 43 6f 6d 70 69 6c 65 64 4c 6f 63 61 6c 73 20 3d CompiledLocals =
3da0: 20 6e 75 6d 41 72 67 73 3b 0a 20 20 20 20 7d 0a numArgs;. }.
3db0: 0a 20 20 20 20 66 6f 72 20 28 69 20 3d 20 30 3b . for (i = 0;
3dc0: 20 69 20 3c 20 6e 75 6d 41 72 67 73 3b 20 69 2b i < numArgs; i+
3dd0: 2b 29 20 7b 0a 09 63 6f 6e 73 74 20 63 68 61 72 +) {..const char
3de0: 20 2a 61 72 67 6e 61 6d 65 2c 20 2a 61 72 67 6e *argname, *argn
3df0: 61 6d 65 69 2c 20 2a 61 72 67 6e 61 6d 65 6c 61 amei, *argnamela
3e00: 73 74 3b 0a 09 54 63 6c 5f 53 69 7a 65 20 66 69 st;..Tcl_Size fi
3e10: 65 6c 64 43 6f 75 6e 74 2c 20 6e 61 6d 65 4c 65 eldCount, nameLe
3e20: 6e 67 74 68 3b 0a 09 54 63 6c 5f 4f 62 6a 20 2a ngth;..Tcl_Obj *
3e30: 2a 66 69 65 6c 64 56 61 6c 75 65 73 3b 0a 0a 09 *fieldValues;...
3e40: 2f 2a 0a 09 20 2a 20 4e 6f 77 20 64 69 76 69 64 /*.. * Now divid
3e50: 65 20 74 68 65 20 73 70 65 63 69 66 69 65 72 20 e the specifier
3e60: 75 70 20 69 6e 74 6f 20 6e 61 6d 65 20 61 6e 64 up into name and
3e70: 20 64 65 66 61 75 6c 74 2e 0a 09 20 2a 2f 0a 0a default... */..
3e80: 09 72 65 73 75 6c 74 20 3d 20 54 63 6c 4c 69 73 .result = TclLis
3e90: 74 4f 62 6a 47 65 74 45 6c 65 6d 65 6e 74 73 28 tObjGetElements(
3ea0: 69 6e 74 65 72 70 2c 20 61 72 67 41 72 72 61 79 interp, argArray
3eb0: 5b 69 5d 2c 20 26 66 69 65 6c 64 43 6f 75 6e 74 [i], &fieldCount
3ec0: 2c 0a 09 09 26 66 69 65 6c 64 56 61 6c 75 65 73 ,...&fieldValues
3ed0: 29 3b 0a 09 69 66 20 28 72 65 73 75 6c 74 20 21 );..if (result !
3ee0: 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20 20 = TCL_OK) {..
3ef0: 20 67 6f 74 6f 20 70 72 6f 63 45 72 72 6f 72 3b goto procError;
3f00: 0a 09 7d 0a 09 69 66 20 28 66 69 65 6c 64 43 6f ..}..if (fieldCo
3f10: 75 6e 74 20 3e 20 32 29 20 7b 0a 09 20 20 20 20 unt > 2) {..
3f20: 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 Tcl_SetObjResult
3f30: 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4f 62 6a (interp, Tcl_Obj
3f40: 50 72 69 6e 74 66 28 0a 09 09 20 20 20 20 22 74 Printf(... "t
3f50: 6f 6f 20 6d 61 6e 79 20 66 69 65 6c 64 73 20 69 oo many fields i
3f60: 6e 20 61 72 67 75 6d 65 6e 74 20 73 70 65 63 69 n argument speci
3f70: 66 69 65 72 20 5c 22 25 73 5c 22 22 2c 0a 09 09 fier \"%s\"",...
3f80: 20 20 20 20 54 63 6c 47 65 74 53 74 72 69 6e 67 TclGetString
3f90: 28 61 72 67 41 72 72 61 79 5b 69 5d 29 29 29 3b (argArray[i])));
3fa0: 0a 09 20 20 20 20 65 72 72 6f 72 43 6f 64 65 20 .. errorCode
3fb0: 3d 20 22 46 4f 52 4d 41 4c 41 52 47 55 4d 45 4e = "FORMALARGUMEN
3fc0: 54 46 4f 52 4d 41 54 22 3b 0a 09 20 20 20 20 67 TFORMAT";.. g
3fd0: 6f 74 6f 20 70 72 6f 63 45 72 72 6f 72 3b 0a 09 oto procError;..
3fe0: 7d 0a 09 69 66 20 28 28 66 69 65 6c 64 43 6f 75 }..if ((fieldCou
3ff0: 6e 74 20 3d 3d 20 30 29 20 7c 7c 20 28 54 63 6c nt == 0) || (Tcl
4000: 5f 47 65 74 43 68 61 72 4c 65 6e 67 74 68 28 66 _GetCharLength(f
4010: 69 65 6c 64 56 61 6c 75 65 73 5b 30 5d 29 20 3d ieldValues[0]) =
4020: 3d 20 30 29 29 20 7b 0a 09 20 20 20 20 54 63 6c = 0)) {.. Tcl
4030: 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e _SetObjResult(in
4040: 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 53 74 72 terp, Tcl_NewStr
4050: 69 6e 67 4f 62 6a 28 0a 09 09 20 20 20 20 22 61 ingObj(... "a
4060: 72 67 75 6d 65 6e 74 20 77 69 74 68 20 6e 6f 20 rgument with no
4070: 6e 61 6d 65 22 2c 20 2d 31 29 29 3b 0a 09 20 20 name", -1));..
4080: 20 20 65 72 72 6f 72 43 6f 64 65 20 3d 20 22 46 errorCode = "F
4090: 4f 52 4d 41 4c 41 52 47 55 4d 45 4e 54 46 4f 52 ORMALARGUMENTFOR
40a0: 4d 41 54 22 3b 0a 09 20 20 20 20 67 6f 74 6f 20 MAT";.. goto
40b0: 70 72 6f 63 45 72 72 6f 72 3b 0a 09 7d 0a 0a 09 procError;..}...
40c0: 61 72 67 6e 61 6d 65 20 3d 20 54 63 6c 47 65 74 argname = TclGet
40d0: 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 66 69 StringFromObj(fi
40e0: 65 6c 64 56 61 6c 75 65 73 5b 30 5d 2c 20 26 6e eldValues[0], &n
40f0: 61 6d 65 4c 65 6e 67 74 68 29 3b 0a 0a 09 2f 2a ameLength);.../*
4100: 0a 09 20 2a 20 43 68 65 63 6b 20 74 68 61 74 20 .. * Check that
4110: 74 68 65 20 66 6f 72 6d 61 6c 20 70 61 72 61 6d the formal param
4120: 65 74 65 72 20 6e 61 6d 65 20 69 73 20 61 20 73 eter name is a s
4130: 63 61 6c 61 72 2e 0a 09 20 2a 2f 0a 0a 09 61 72 calar... */...ar
4140: 67 6e 61 6d 65 69 20 3d 20 61 72 67 6e 61 6d 65 gnamei = argname
4150: 3b 0a 09 61 72 67 6e 61 6d 65 6c 61 73 74 20 3d ;..argnamelast =
4160: 20 28 6e 61 6d 65 4c 65 6e 67 74 68 20 3e 20 30 (nameLength > 0
4170: 29 20 3f 20 28 61 72 67 6e 61 6d 65 20 2b 20 6e ) ? (argname + n
4180: 61 6d 65 4c 65 6e 67 74 68 20 2d 20 31 29 20 3a ameLength - 1) :
4190: 20 61 72 67 6e 61 6d 65 3b 0a 09 77 68 69 6c 65 argname;..while
41a0: 20 28 61 72 67 6e 61 6d 65 69 20 3c 20 61 72 67 (argnamei < arg
41b0: 6e 61 6d 65 6c 61 73 74 29 20 7b 0a 09 20 20 20 namelast) {..
41c0: 20 69 66 20 28 2a 61 72 67 6e 61 6d 65 69 20 3d if (*argnamei =
41d0: 3d 20 27 28 27 29 20 7b 0a 09 09 69 66 20 28 2a = '(') {...if (*
41e0: 61 72 67 6e 61 6d 65 6c 61 73 74 20 3d 3d 20 27 argnamelast == '
41f0: 29 27 29 20 7b 20 2f 2a 20 57 65 20 68 61 76 65 )') { /* We have
4200: 20 61 6e 20 61 72 72 61 79 20 65 6c 65 6d 65 6e an array elemen
4210: 74 2e 20 2a 2f 0a 09 09 20 20 20 20 54 63 6c 5f t. */... Tcl_
4220: 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 SetObjResult(int
4230: 65 72 70 2c 20 54 63 6c 5f 4f 62 6a 50 72 69 6e erp, Tcl_ObjPrin
4240: 74 66 28 0a 09 09 09 20 20 20 20 22 66 6f 72 6d tf(.... "form
4250: 61 6c 20 70 61 72 61 6d 65 74 65 72 20 5c 22 25 al parameter \"%
4260: 73 5c 22 20 69 73 20 61 6e 20 61 72 72 61 79 20 s\" is an array
4270: 65 6c 65 6d 65 6e 74 22 2c 0a 09 09 09 20 20 20 element",....
4280: 20 54 63 6c 47 65 74 53 74 72 69 6e 67 28 66 69 TclGetString(fi
4290: 65 6c 64 56 61 6c 75 65 73 5b 30 5d 29 29 29 3b eldValues[0])));
42a0: 0a 09 09 20 20 20 20 65 72 72 6f 72 43 6f 64 65 ... errorCode
42b0: 20 3d 20 22 46 4f 52 4d 41 4c 41 52 47 55 4d 45 = "FORMALARGUME
42c0: 4e 54 46 4f 52 4d 41 54 22 3b 0a 09 09 20 20 20 NTFORMAT";...
42d0: 20 67 6f 74 6f 20 70 72 6f 63 45 72 72 6f 72 3b goto procError;
42e0: 0a 09 09 7d 0a 09 20 20 20 20 7d 20 65 6c 73 65 ...}.. } else
42f0: 20 69 66 20 28 61 72 67 6e 61 6d 65 69 5b 30 5d if (argnamei[0]
4300: 20 3d 3d 20 27 3a 27 20 26 26 20 61 72 67 6e 61 == ':' && argna
4310: 6d 65 69 5b 31 5d 20 3d 3d 20 27 3a 27 29 20 7b mei[1] == ':') {
4320: 0a 09 09 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 ...Tcl_SetObjRes
4330: 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f ult(interp, Tcl_
4340: 4f 62 6a 50 72 69 6e 74 66 28 0a 09 09 09 22 66 ObjPrintf(...."f
4350: 6f 72 6d 61 6c 20 70 61 72 61 6d 65 74 65 72 20 ormal parameter
4360: 5c 22 25 73 5c 22 20 69 73 20 6e 6f 74 20 61 20 \"%s\" is not a
4370: 73 69 6d 70 6c 65 20 6e 61 6d 65 22 2c 0a 09 09 simple name",...
4380: 09 54 63 6c 47 65 74 53 74 72 69 6e 67 28 66 69 .TclGetString(fi
4390: 65 6c 64 56 61 6c 75 65 73 5b 30 5d 29 29 29 3b eldValues[0])));
43a0: 0a 09 09 65 72 72 6f 72 43 6f 64 65 20 3d 20 22 ...errorCode = "
43b0: 46 4f 52 4d 41 4c 41 52 47 55 4d 45 4e 54 46 4f FORMALARGUMENTFO
43c0: 52 4d 41 54 22 3b 0a 09 09 67 6f 74 6f 20 70 72 RMAT";...goto pr
43d0: 6f 63 45 72 72 6f 72 3b 0a 09 20 20 20 20 7d 0a ocError;.. }.
43e0: 09 20 20 20 20 61 72 67 6e 61 6d 65 69 2b 2b 3b . argnamei++;
43f0: 0a 09 7d 0a 0a 09 69 66 20 28 70 72 65 63 6f 6d ..}...if (precom
4400: 70 69 6c 65 64 29 20 7b 0a 09 20 20 20 20 2f 2a piled) {.. /*
4410: 0a 09 20 20 20 20 20 2a 20 43 6f 6d 70 61 72 65 .. * Compare
4420: 20 74 68 65 20 70 61 72 73 65 64 20 61 72 67 75 the parsed argu
4430: 6d 65 6e 74 20 77 69 74 68 20 74 68 65 20 73 74 ment with the st
4440: 6f 72 65 64 20 6f 6e 65 2e 20 4e 6f 74 65 20 74 ored one. Note t
4450: 68 61 74 20 74 68 65 0a 09 20 20 20 20 20 2a 20 hat the.. *
4460: 6f 6e 6c 79 20 66 6c 61 67 20 76 61 6c 75 65 20 only flag value
4470: 74 68 61 74 20 6d 61 6b 65 73 20 73 65 6e 73 65 that makes sense
4480: 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 20 69 at this point i
4490: 73 20 56 41 52 5f 41 52 47 55 4d 45 4e 54 0a 09 s VAR_ARGUMENT..
44a0: 20 20 20 20 20 2a 20 28 69 74 73 20 76 61 6c 75 * (its valu
44b0: 65 20 77 61 73 20 6b 65 70 74 20 74 68 65 20 73 e was kept the s
44c0: 61 6d 65 20 61 73 20 70 72 65 20 56 61 72 52 65 ame as pre VarRe
44d0: 66 6f 72 6d 20 74 6f 20 73 69 6d 70 6c 69 66 79 form to simplify
44e0: 0a 09 20 20 20 20 20 2a 20 74 62 63 6c 6f 61 64 .. * tbcload
44f0: 27 73 20 70 72 6f 63 65 73 73 69 6e 67 20 6f 66 's processing of
4500: 20 6f 6c 64 65 72 20 62 79 65 74 63 6f 64 65 73 older byetcodes
4510: 29 2e 0a 09 20 20 20 20 20 2a 0a 09 20 20 20 20 )... *..
4520: 20 2a 20 54 68 65 20 6f 6e 6c 79 20 6f 74 68 65 * The only othe
4530: 72 20 66 6c 61 67 20 76 61 6c 75 65 20 74 68 61 r flag value tha
4540: 74 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 t is important t
4550: 6f 20 72 65 74 72 69 65 76 65 20 66 72 6f 6d 0a o retrieve from.
4560: 09 20 20 20 20 20 2a 20 70 72 65 63 6f 6d 70 69 . * precompi
4570: 6c 65 64 20 70 72 6f 63 73 20 69 73 20 56 41 52 led procs is VAR
4580: 5f 54 45 4d 50 4f 52 41 52 59 20 28 61 6c 73 6f _TEMPORARY (also
4590: 20 75 6e 63 68 61 6e 67 65 64 29 2e 20 49 74 20 unchanged). It
45a0: 69 73 0a 09 20 20 20 20 20 2a 20 6e 65 65 64 65 is.. * neede
45b0: 64 20 6c 61 74 65 72 20 77 68 65 6e 20 72 65 74 d later when ret
45c0: 72 69 65 76 69 6e 67 20 74 68 65 20 76 61 72 69 rieving the vari
45d0: 61 62 6c 65 20 6e 61 6d 65 73 2e 0a 09 20 20 20 able names...
45e0: 20 20 2a 2f 0a 0a 09 20 20 20 20 69 66 20 28 28 */... if ((
45f0: 6c 6f 63 61 6c 50 74 72 2d 3e 6e 61 6d 65 4c 65 localPtr->nameLe
4600: 6e 67 74 68 20 21 3d 20 6e 61 6d 65 4c 65 6e 67 ngth != nameLeng
4610: 74 68 29 0a 09 09 20 20 20 20 7c 7c 20 28 6d 65 th)... || (me
4620: 6d 63 6d 70 28 6c 6f 63 61 6c 50 74 72 2d 3e 6e mcmp(localPtr->n
4630: 61 6d 65 2c 20 61 72 67 6e 61 6d 65 2c 20 6e 61 ame, argname, na
4640: 6d 65 4c 65 6e 67 74 68 29 20 21 3d 20 30 29 0a meLength) != 0).
4650: 09 09 20 20 20 20 7c 7c 20 28 6c 6f 63 61 6c 50 .. || (localP
4660: 74 72 2d 3e 66 72 61 6d 65 49 6e 64 65 78 20 21 tr->frameIndex !
4670: 3d 20 69 29 0a 09 09 20 20 20 20 7c 7c 20 21 28 = i)... || !(
4680: 6c 6f 63 61 6c 50 74 72 2d 3e 66 6c 61 67 73 20 localPtr->flags
4690: 26 20 56 41 52 5f 41 52 47 55 4d 45 4e 54 29 0a & VAR_ARGUMENT).
46a0: 09 09 20 20 20 20 7c 7c 20 28 6c 6f 63 61 6c 50 .. || (localP
46b0: 74 72 2d 3e 64 65 66 56 61 6c 75 65 50 74 72 20 tr->defValuePtr
46c0: 3d 3d 20 4e 55 4c 4c 20 26 26 20 66 69 65 6c 64 == NULL && field
46d0: 43 6f 75 6e 74 20 3d 3d 20 32 29 0a 09 09 20 20 Count == 2)...
46e0: 20 20 7c 7c 20 28 6c 6f 63 61 6c 50 74 72 2d 3e || (localPtr->
46f0: 64 65 66 56 61 6c 75 65 50 74 72 20 21 3d 20 4e defValuePtr != N
4700: 55 4c 4c 20 26 26 20 66 69 65 6c 64 43 6f 75 6e ULL && fieldCoun
4710: 74 20 21 3d 20 32 29 29 20 7b 0a 09 09 54 63 6c t != 2)) {...Tcl
4720: 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e _SetObjResult(in
4730: 74 65 72 70 2c 20 54 63 6c 5f 4f 62 6a 50 72 69 terp, Tcl_ObjPri
4740: 6e 74 66 28 0a 09 09 09 22 70 72 6f 63 65 64 75 ntf(...."procedu
4750: 72 65 20 5c 22 25 73 5c 22 3a 20 66 6f 72 6d 61 re \"%s\": forma
4760: 6c 20 70 61 72 61 6d 65 74 65 72 20 25 22 20 54 l parameter %" T
4770: 43 4c 5f 53 49 5a 45 5f 4d 4f 44 49 46 49 45 52 CL_SIZE_MODIFIER
4780: 20 22 64 20 69 73 20 22 0a 09 09 09 22 69 6e 63 "d is "...."inc
4790: 6f 6e 73 69 73 74 65 6e 74 20 77 69 74 68 20 70 onsistent with p
47a0: 72 65 63 6f 6d 70 69 6c 65 64 20 62 6f 64 79 22 recompiled body"
47b0: 2c 20 70 72 6f 63 4e 61 6d 65 2c 20 69 29 29 3b , procName, i));
47c0: 0a 09 09 65 72 72 6f 72 43 6f 64 65 20 3d 20 22 ...errorCode = "
47d0: 42 59 54 45 43 4f 44 45 4c 49 45 53 22 3b 0a 09 BYTECODELIES";..
47e0: 09 67 6f 74 6f 20 70 72 6f 63 45 72 72 6f 72 3b .goto procError;
47f0: 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20 20 2f 2a .. }... /*
4800: 0a 09 20 20 20 20 20 2a 20 43 6f 6d 70 61 72 65 .. * Compare
4810: 20 74 68 65 20 64 65 66 61 75 6c 74 20 76 61 6c the default val
4820: 75 65 20 69 66 20 61 6e 79 2e 0a 09 20 20 20 20 ue if any...
4830: 20 2a 2f 0a 0a 09 20 20 20 20 69 66 20 28 6c 6f */... if (lo
4840: 63 61 6c 50 74 72 2d 3e 64 65 66 56 61 6c 75 65 calPtr->defValue
4850: 50 74 72 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 Ptr != NULL) {..
4860: 09 54 63 6c 5f 53 69 7a 65 20 74 6d 70 4c 65 6e .Tcl_Size tmpLen
4870: 67 74 68 2c 20 76 61 6c 75 65 4c 65 6e 67 74 68 gth, valueLength
4880: 3b 0a 09 09 63 6f 6e 73 74 20 63 68 61 72 20 2a ;...const char *
4890: 74 6d 70 50 74 72 20 3d 20 54 63 6c 47 65 74 53 tmpPtr = TclGetS
48a0: 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 6c 6f 63 tringFromObj(loc
48b0: 61 6c 50 74 72 2d 3e 64 65 66 56 61 6c 75 65 50 alPtr->defValueP
48c0: 74 72 2c 20 26 74 6d 70 4c 65 6e 67 74 68 29 3b tr, &tmpLength);
48d0: 0a 09 09 63 6f 6e 73 74 20 63 68 61 72 20 2a 76 ...const char *v
48e0: 61 6c 75 65 20 3d 20 54 63 6c 47 65 74 53 74 72 alue = TclGetStr
48f0: 69 6e 67 46 72 6f 6d 4f 62 6a 28 66 69 65 6c 64 ingFromObj(field
4900: 56 61 6c 75 65 73 5b 31 5d 2c 20 26 76 61 6c 75 Values[1], &valu
4910: 65 4c 65 6e 67 74 68 29 3b 0a 0a 09 09 69 66 20 eLength);....if
4920: 28 28 76 61 6c 75 65 4c 65 6e 67 74 68 20 21 3d ((valueLength !=
4930: 20 74 6d 70 4c 65 6e 67 74 68 29 0a 09 09 09 7c tmpLength)....|
4940: 7c 20 6d 65 6d 63 6d 70 28 76 61 6c 75 65 2c 20 | memcmp(value,
4950: 74 6d 70 50 74 72 2c 20 74 6d 70 4c 65 6e 67 74 tmpPtr, tmpLengt
4960: 68 29 20 21 3d 20 30 29 20 7b 0a 09 09 20 20 20 h) != 0) {...
4970: 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c Tcl_SetObjResul
4980: 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4f 62 t(interp, Tcl_Ob
4990: 6a 50 72 69 6e 74 66 28 0a 09 09 09 20 20 20 20 jPrintf(....
49a0: 22 70 72 6f 63 65 64 75 72 65 20 5c 22 25 73 5c "procedure \"%s\
49b0: 22 3a 20 66 6f 72 6d 61 6c 20 70 61 72 61 6d 65 ": formal parame
49c0: 74 65 72 20 5c 22 25 73 5c 22 20 68 61 73 20 22 ter \"%s\" has "
49d0: 0a 09 09 09 20 20 20 20 22 64 65 66 61 75 6c 74 .... "default
49e0: 20 76 61 6c 75 65 20 69 6e 63 6f 6e 73 69 73 74 value inconsist
49f0: 65 6e 74 20 77 69 74 68 20 70 72 65 63 6f 6d 70 ent with precomp
4a00: 69 6c 65 64 20 62 6f 64 79 22 2c 0a 09 09 09 20 iled body",....
4a10: 20 20 20 70 72 6f 63 4e 61 6d 65 2c 20 54 63 6c procName, Tcl
4a20: 47 65 74 53 74 72 69 6e 67 28 66 69 65 6c 64 56 GetString(fieldV
4a30: 61 6c 75 65 73 5b 30 5d 29 29 29 3b 0a 09 09 20 alues[0])));...
4a40: 20 20 20 65 72 72 6f 72 43 6f 64 65 20 3d 20 22 errorCode = "
4a50: 42 59 54 45 43 4f 44 45 4c 49 45 53 22 3b 0a 09 BYTECODELIES";..
4a60: 09 20 20 20 20 67 6f 74 6f 20 70 72 6f 63 45 72 . goto procEr
4a70: 72 6f 72 3b 0a 09 09 7d 0a 09 20 20 20 20 7d 0a ror;...}.. }.
4a80: 09 20 20 20 20 69 66 20 28 28 69 20 3d 3d 20 6e . if ((i == n
4a90: 75 6d 41 72 67 73 20 2d 20 31 29 0a 09 09 20 20 umArgs - 1)...
4aa0: 20 20 26 26 20 28 6c 6f 63 61 6c 50 74 72 2d 3e && (localPtr->
4ab0: 6e 61 6d 65 4c 65 6e 67 74 68 20 3d 3d 20 34 29 nameLength == 4)
4ac0: 0a 09 09 20 20 20 20 26 26 20 28 6c 6f 63 61 6c ... && (local
4ad0: 50 74 72 2d 3e 6e 61 6d 65 5b 30 5d 20 3d 3d 20 Ptr->name[0] ==
4ae0: 27 61 27 29 0a 09 09 20 20 20 20 26 26 20 28 73 'a')... && (s
4af0: 74 72 63 6d 70 28 6c 6f 63 61 6c 50 74 72 2d 3e trcmp(localPtr->
4b00: 6e 61 6d 65 2c 20 22 61 72 67 73 22 29 20 3d 3d name, "args") ==
4b10: 20 30 29 29 20 7b 0a 09 09 6c 6f 63 61 6c 50 74 0)) {...localPt
4b20: 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 56 41 52 5f r->flags |= VAR_
4b30: 49 53 5f 41 52 47 53 3b 0a 09 20 20 20 20 7d 0a IS_ARGS;.. }.
4b40: 0a 09 20 20 20 20 6c 6f 63 61 6c 50 74 72 20 3d .. localPtr =
4b50: 20 6c 6f 63 61 6c 50 74 72 2d 3e 6e 65 78 74 50 localPtr->nextP
4b60: 74 72 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 tr;..} else {..
4b70: 20 20 20 2f 2a 0a 09 20 20 20 20 20 2a 20 41 6c /*.. * Al
4b80: 6c 6f 63 61 74 65 20 61 6e 20 65 6e 74 72 79 20 locate an entry
4b90: 69 6e 20 74 68 65 20 72 75 6e 74 69 6d 65 20 70 in the runtime p
4ba0: 72 6f 63 65 64 75 72 65 20 66 72 61 6d 65 27 73 rocedure frame's
4bb0: 20 61 72 72 61 79 20 6f 66 0a 09 20 20 20 20 20 array of..
4bc0: 2a 20 6c 6f 63 61 6c 20 76 61 72 69 61 62 6c 65 * local variable
4bd0: 73 20 66 6f 72 20 74 68 65 20 61 72 67 75 6d 65 s for the argume
4be0: 6e 74 2e 0a 09 20 20 20 20 20 2a 2f 0a 0a 09 20 nt... */...
4bf0: 20 20 20 6c 6f 63 61 6c 50 74 72 20 3d 20 28 43 localPtr = (C
4c00: 6f 6d 70 69 6c 65 64 4c 6f 63 61 6c 20 2a 29 54 ompiledLocal *)T
4c10: 63 6c 5f 41 74 74 65 6d 70 74 41 6c 6c 6f 63 28 cl_AttemptAlloc(
4c20: 0a 09 09 20 20 20 20 6f 66 66 73 65 74 6f 66 28 ... offsetof(
4c30: 43 6f 6d 70 69 6c 65 64 4c 6f 63 61 6c 2c 20 6e CompiledLocal, n
4c40: 61 6d 65 29 20 2b 20 31 55 20 2b 20 66 69 65 6c ame) + 1U + fiel
4c50: 64 56 61 6c 75 65 73 5b 30 5d 2d 3e 6c 65 6e 67 dValues[0]->leng
4c60: 74 68 29 3b 0a 09 20 20 20 20 69 66 20 28 21 6c th);.. if (!l
4c70: 6f 63 61 6c 50 74 72 29 20 7b 0a 09 09 2f 2a 20 ocalPtr) {.../*
4c80: 44 6f 6e 27 74 20 73 65 74 20 74 68 65 20 69 6e Don't set the in
4c90: 74 65 72 70 20 72 65 73 75 6c 74 20 68 65 72 65 terp result here
4ca0: 2e 20 53 69 6e 63 65 20 61 20 6d 61 6c 6c 6f 63 . Since a malloc
4cb0: 20 6a 75 73 74 20 66 61 69 6c 65 64 2c 0a 09 09 just failed,...
4cc0: 20 2a 20 66 69 72 73 74 20 63 6c 65 61 6e 20 75 * first clean u
4cd0: 70 20 73 6f 6d 65 20 6d 65 6d 6f 72 79 20 62 65 p some memory be
4ce0: 66 6f 72 65 20 64 6f 69 6e 67 20 74 68 61 74 20 fore doing that
4cf0: 2a 2f 0a 09 09 65 72 72 6f 72 43 6f 64 65 20 3d */...errorCode =
4d00: 20 54 4f 4f 4d 41 4e 59 41 52 47 53 3b 0a 09 09 TOOMANYARGS;...
4d10: 67 6f 74 6f 20 70 72 6f 63 45 72 72 6f 72 3b 0a goto procError;.
4d20: 09 20 20 20 20 7d 0a 09 20 20 20 20 69 66 20 28 . }.. if (
4d30: 70 72 6f 63 50 74 72 2d 3e 66 69 72 73 74 4c 6f procPtr->firstLo
4d40: 63 61 6c 50 74 72 20 3d 3d 20 4e 55 4c 4c 29 20 calPtr == NULL)
4d50: 7b 0a 09 09 70 72 6f 63 50 74 72 2d 3e 66 69 72 {...procPtr->fir
4d60: 73 74 4c 6f 63 61 6c 50 74 72 20 3d 20 70 72 6f stLocalPtr = pro
4d70: 63 50 74 72 2d 3e 6c 61 73 74 4c 6f 63 61 6c 50 cPtr->lastLocalP
4d80: 74 72 20 3d 20 6c 6f 63 61 6c 50 74 72 3b 0a 09 tr = localPtr;..
4d90: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 09 70 } else {...p
4da0: 72 6f 63 50 74 72 2d 3e 6c 61 73 74 4c 6f 63 61 rocPtr->lastLoca
4db0: 6c 50 74 72 2d 3e 6e 65 78 74 50 74 72 20 3d 20 lPtr->nextPtr =
4dc0: 6c 6f 63 61 6c 50 74 72 3b 0a 09 09 70 72 6f 63 localPtr;...proc
4dd0: 50 74 72 2d 3e 6c 61 73 74 4c 6f 63 61 6c 50 74 Ptr->lastLocalPt
4de0: 72 20 3d 20 6c 6f 63 61 6c 50 74 72 3b 0a 09 20 r = localPtr;..
4df0: 20 20 20 7d 0a 09 20 20 20 20 6c 6f 63 61 6c 50 }.. localP
4e00: 74 72 2d 3e 6e 65 78 74 50 74 72 20 3d 20 4e 55 tr->nextPtr = NU
4e10: 4c 4c 3b 0a 09 20 20 20 20 6c 6f 63 61 6c 50 74 LL;.. localPt
4e20: 72 2d 3e 6e 61 6d 65 4c 65 6e 67 74 68 20 3d 20 r->nameLength =
4e30: 6e 61 6d 65 4c 65 6e 67 74 68 3b 0a 09 20 20 20 nameLength;..
4e40: 20 6c 6f 63 61 6c 50 74 72 2d 3e 66 72 61 6d 65 localPtr->frame
4e50: 49 6e 64 65 78 20 3d 20 69 3b 0a 09 20 20 20 20 Index = i;..
4e60: 6c 6f 63 61 6c 50 74 72 2d 3e 66 6c 61 67 73 20 localPtr->flags
4e70: 3d 20 56 41 52 5f 41 52 47 55 4d 45 4e 54 3b 0a = VAR_ARGUMENT;.
4e80: 09 20 20 20 20 6c 6f 63 61 6c 50 74 72 2d 3e 72 . localPtr->r
4e90: 65 73 6f 6c 76 65 49 6e 66 6f 20 3d 20 4e 55 4c esolveInfo = NUL
4ea0: 4c 3b 0a 0a 09 20 20 20 20 69 66 20 28 66 69 65 L;... if (fie
4eb0: 6c 64 43 6f 75 6e 74 20 3d 3d 20 32 29 20 7b 0a ldCount == 2) {.
4ec0: 09 09 6c 6f 63 61 6c 50 74 72 2d 3e 64 65 66 56 ..localPtr->defV
4ed0: 61 6c 75 65 50 74 72 20 3d 20 66 69 65 6c 64 56 aluePtr = fieldV
4ee0: 61 6c 75 65 73 5b 31 5d 3b 0a 09 09 54 63 6c 5f alues[1];...Tcl_
4ef0: 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 6c 6f 63 IncrRefCount(loc
4f00: 61 6c 50 74 72 2d 3e 64 65 66 56 61 6c 75 65 50 alPtr->defValueP
4f10: 74 72 29 3b 0a 09 20 20 20 20 7d 20 65 6c 73 65 tr);.. } else
4f20: 20 7b 0a 09 09 6c 6f 63 61 6c 50 74 72 2d 3e 64 {...localPtr->d
4f30: 65 66 56 61 6c 75 65 50 74 72 20 3d 20 4e 55 4c efValuePtr = NUL
4f40: 4c 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 6d L;.. }.. m
4f50: 65 6d 63 70 79 28 6c 6f 63 61 6c 50 74 72 2d 3e emcpy(localPtr->
4f60: 6e 61 6d 65 2c 20 61 72 67 6e 61 6d 65 2c 20 66 name, argname, f
4f70: 69 65 6c 64 56 61 6c 75 65 73 5b 30 5d 2d 3e 6c ieldValues[0]->l
4f80: 65 6e 67 74 68 20 2b 20 31 29 3b 0a 09 20 20 20 ength + 1);..
4f90: 20 69 66 20 28 28 69 20 3d 3d 20 6e 75 6d 41 72 if ((i == numAr
4fa0: 67 73 20 2d 20 31 29 0a 09 09 20 20 20 20 26 26 gs - 1)... &&
4fb0: 20 28 6c 6f 63 61 6c 50 74 72 2d 3e 6e 61 6d 65 (localPtr->name
4fc0: 4c 65 6e 67 74 68 20 3d 3d 20 34 29 0a 09 09 20 Length == 4)...
4fd0: 20 20 20 26 26 20 28 6c 6f 63 61 6c 50 74 72 2d && (localPtr-
4fe0: 3e 6e 61 6d 65 5b 30 5d 20 3d 3d 20 27 61 27 29 >name[0] == 'a')
4ff0: 0a 09 09 20 20 20 20 26 26 20 28 6d 65 6d 63 6d ... && (memcm
5000: 70 28 6c 6f 63 61 6c 50 74 72 2d 3e 6e 61 6d 65 p(localPtr->name
5010: 2c 20 22 61 72 67 73 22 2c 20 34 29 20 3d 3d 20 , "args", 4) ==
5020: 30 29 29 20 7b 0a 09 09 6c 6f 63 61 6c 50 74 72 0)) {...localPtr
5030: 2d 3e 66 6c 61 67 73 20 7c 3d 20 56 41 52 5f 49 ->flags |= VAR_I
5040: 53 5f 41 52 47 53 3b 0a 09 20 20 20 20 7d 0a 09 S_ARGS;.. }..
5050: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2a 70 72 }. }.. *pr
5060: 6f 63 50 74 72 50 74 72 20 3d 20 70 72 6f 63 50 ocPtrPtr = procP
5070: 74 72 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 tr;. return T
5080: 43 4c 5f 4f 4b 3b 0a 0a 20 20 70 72 6f 63 45 72 CL_OK;.. procEr
5090: 72 6f 72 3a 0a 20 20 20 20 69 66 20 28 70 72 65 ror:. if (pre
50a0: 63 6f 6d 70 69 6c 65 64 29 20 7b 0a 09 70 72 6f compiled) {..pro
50b0: 63 50 74 72 2d 3e 72 65 66 43 6f 75 6e 74 2d 2d cPtr->refCount--
50c0: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 ;. } else {..
50d0: 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 Tcl_DecrRefCount
50e0: 28 62 6f 64 79 50 74 72 29 3b 0a 09 77 68 69 6c (bodyPtr);..whil
50f0: 65 20 28 70 72 6f 63 50 74 72 2d 3e 66 69 72 73 e (procPtr->firs
5100: 74 4c 6f 63 61 6c 50 74 72 20 21 3d 20 4e 55 4c tLocalPtr != NUL
5110: 4c 29 20 7b 0a 09 20 20 20 20 6c 6f 63 61 6c 50 L) {.. localP
5120: 74 72 20 3d 20 70 72 6f 63 50 74 72 2d 3e 66 69 tr = procPtr->fi
5130: 72 73 74 4c 6f 63 61 6c 50 74 72 3b 0a 09 20 20 rstLocalPtr;..
5140: 20 20 70 72 6f 63 50 74 72 2d 3e 66 69 72 73 74 procPtr->first
5150: 4c 6f 63 61 6c 50 74 72 20 3d 20 6c 6f 63 61 6c LocalPtr = local
5160: 50 74 72 2d 3e 6e 65 78 74 50 74 72 3b 0a 0a 09 Ptr->nextPtr;...
5170: 20 20 20 20 69 66 20 28 6c 6f 63 61 6c 50 74 72 if (localPtr
5180: 2d 3e 64 65 66 56 61 6c 75 65 50 74 72 20 21 3d ->defValuePtr !=
5190: 20 4e 55 4c 4c 29 20 7b 0a 09 09 54 63 6c 5f 44 NULL) {...Tcl_D
51a0: 65 63 72 52 65 66 43 6f 75 6e 74 28 6c 6f 63 61 ecrRefCount(loca
51b0: 6c 50 74 72 2d 3e 64 65 66 56 61 6c 75 65 50 74 lPtr->defValuePt
51c0: 72 29 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20 r);.. }...
51d0: 20 54 63 6c 5f 46 72 65 65 28 6c 6f 63 61 6c 50 Tcl_Free(localP
51e0: 74 72 29 3b 0a 09 7d 0a 09 54 63 6c 5f 46 72 65 tr);..}..Tcl_Fre
51f0: 65 28 70 72 6f 63 50 74 72 29 3b 0a 20 20 20 20 e(procPtr);.
5200: 7d 0a 20 20 20 20 69 66 20 28 65 72 72 6f 72 43 }. if (errorC
5210: 6f 64 65 29 20 7b 0a 09 69 66 20 28 65 72 72 6f ode) {..if (erro
5220: 72 43 6f 64 65 20 3d 3d 20 54 4f 4f 4d 41 4e 59 rCode == TOOMANY
5230: 41 52 47 53 29 20 7b 0a 09 20 20 20 20 54 63 6c ARGS) {.. Tcl
5240: 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e _SetObjResult(in
5250: 74 65 72 70 2c 20 54 63 6c 5f 4f 62 6a 50 72 69 terp, Tcl_ObjPri
5260: 6e 74 66 28 0a 09 09 20 20 20 20 22 70 72 6f 63 ntf(... "proc
5270: 65 64 75 72 65 20 5c 22 25 73 5c 22 3a 20 61 72 edure \"%s\": ar
5280: 67 20 6c 69 73 74 20 63 6f 6e 74 61 69 6e 73 20 g list contains
5290: 74 6f 6f 20 6d 61 6e 79 20 28 25 22 0a 09 09 20 too many (%"...
52a0: 20 20 20 54 43 4c 5f 53 49 5a 45 5f 4d 4f 44 49 TCL_SIZE_MODI
52b0: 46 49 45 52 20 22 64 29 20 65 6e 74 72 69 65 73 FIER "d) entries
52c0: 22 2c 20 70 72 6f 63 4e 61 6d 65 2c 20 6e 75 6d ", procName, num
52d0: 41 72 67 73 29 29 3b 0a 09 7d 0a 09 54 63 6c 5f Args));..}..Tcl_
52e0: 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 SetErrorCode(int
52f0: 65 72 70 2c 20 22 54 43 4c 22 2c 20 22 4f 50 45 erp, "TCL", "OPE
5300: 52 41 54 49 4f 4e 22 2c 20 22 50 52 4f 43 22 2c RATION", "PROC",
5310: 0a 09 09 65 72 72 6f 72 43 6f 64 65 2c 20 28 63 ...errorCode, (c
5320: 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 20 20 20 har *)NULL);.
5330: 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 }. return TC
5340: 4c 5f 45 52 52 4f 52 3b 0a 7d 0a 0c 0a 2f 2a 0a L_ERROR;.}.../*.
5350: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
5360: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5370: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5380: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5390: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 --------. *. * T
53a0: 63 6c 47 65 74 46 72 61 6d 65 20 2d 2d 0a 20 2a clGetFrame --. *
53b0: 0a 20 2a 09 47 69 76 65 6e 20 61 20 64 65 73 63 . *.Given a desc
53c0: 72 69 70 74 69 6f 6e 20 6f 66 20 61 20 70 72 6f ription of a pro
53d0: 63 65 64 75 72 65 20 66 72 61 6d 65 2c 20 73 75 cedure frame, su
53e0: 63 68 20 61 73 20 74 68 65 20 66 69 72 73 74 20 ch as the first
53f0: 61 72 67 75 6d 65 6e 74 0a 20 2a 09 74 6f 20 61 argument. *.to a
5400: 6e 20 22 75 70 6c 65 76 65 6c 22 20 6f 72 20 22 n "uplevel" or "
5410: 75 70 76 61 72 22 20 63 6f 6d 6d 61 6e 64 2c 20 upvar" command,
5420: 6c 6f 63 61 74 65 20 74 68 65 20 63 61 6c 6c 20 locate the call
5430: 66 72 61 6d 65 20 66 6f 72 20 74 68 65 0a 20 2a frame for the. *
5440: 09 61 70 70 72 6f 70 72 69 61 74 65 20 6c 65 76 .appropriate lev
5450: 65 6c 20 6f 66 20 70 72 6f 63 65 64 75 72 65 2e el of procedure.
5460: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a . *. * Results:.
5470: 20 2a 09 54 68 65 20 72 65 74 75 72 6e 20 76 61 *.The return va
5480: 6c 75 65 20 69 73 20 2d 31 20 69 66 20 61 6e 20 lue is -1 if an
5490: 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64 20 69 error occurred i
54a0: 6e 20 66 69 6e 64 69 6e 67 20 74 68 65 20 66 72 n finding the fr
54b0: 61 6d 65 20 28 69 6e 0a 20 2a 09 74 68 69 73 20 ame (in. *.this
54c0: 63 61 73 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 case an error me
54d0: 73 73 61 67 65 20 69 73 20 6c 65 66 74 20 69 6e ssage is left in
54e0: 20 74 68 65 20 69 6e 74 65 72 70 27 73 20 72 65 the interp's re
54f0: 73 75 6c 74 29 2e 20 31 20 69 73 0a 20 2a 09 72 sult). 1 is. *.r
5500: 65 74 75 72 6e 65 64 20 69 66 20 73 74 72 69 6e eturned if strin
5510: 67 20 77 61 73 20 65 69 74 68 65 72 20 61 20 6e g was either a n
5520: 75 6d 62 65 72 20 6f 72 20 61 20 6e 75 6d 62 65 umber or a numbe
5530: 72 20 70 72 65 63 65 64 65 64 20 62 79 20 22 23 r preceded by "#
5540: 22 20 61 6e 64 0a 20 2a 09 69 74 20 73 70 65 63 " and. *.it spec
5550: 69 66 69 65 64 20 61 20 76 61 6c 69 64 20 66 72 ified a valid fr
5560: 61 6d 65 2e 20 30 20 69 73 20 72 65 74 75 72 6e ame. 0 is return
5570: 65 64 20 69 66 20 73 74 72 69 6e 67 20 69 73 6e ed if string isn
5580: 27 74 20 6f 6e 65 20 6f 66 20 74 68 65 0a 20 2a 't one of the. *
5590: 09 74 77 6f 20 74 68 69 6e 67 73 20 61 62 6f 76 .two things abov
55a0: 65 20 28 69 6e 20 74 68 69 73 20 63 61 73 65 2c e (in this case,
55b0: 20 74 68 65 20 6c 6f 6f 6b 75 70 20 61 63 74 73 the lookup acts
55c0: 20 61 73 20 69 66 20 73 74 72 69 6e 67 20 77 65 as if string we
55d0: 72 65 0a 20 2a 09 22 31 22 29 2e 20 54 68 65 20 re. *."1"). The
55e0: 76 61 72 69 61 62 6c 65 20 70 6f 69 6e 74 65 64 variable pointed
55f0: 20 74 6f 20 62 79 20 66 72 61 6d 65 50 74 72 50 to by framePtrP
5600: 74 72 20 69 73 20 66 69 6c 6c 65 64 20 69 6e 20 tr is filled in
5610: 77 69 74 68 20 74 68 65 0a 20 2a 09 61 64 64 72 with the. *.addr
5620: 65 73 73 20 6f 66 20 74 68 65 20 64 65 73 69 72 ess of the desir
5630: 65 64 20 66 72 61 6d 65 20 28 75 6e 6c 65 73 73 ed frame (unless
5640: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 an error occurs
5650: 2c 20 69 6e 20 77 68 69 63 68 20 63 61 73 65 20 , in which case
5660: 69 74 0a 20 2a 09 69 73 6e 27 74 20 6d 6f 64 69 it. *.isn't modi
5670: 66 69 65 64 29 2e 0a 20 2a 0a 20 2a 20 53 69 64 fied).. *. * Sid
5680: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f e effects:. *.No
5690: 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d ne.. *. *-------
56a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
56b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
56c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
56d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
56e0: 20 2a 2f 0a 0a 69 6e 74 0a 54 63 6c 47 65 74 46 */..int.TclGetF
56f0: 72 61 6d 65 28 0a 20 20 20 20 54 63 6c 5f 49 6e rame(. Tcl_In
5700: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 09 09 2f terp *interp,../
5710: 2a 20 49 6e 74 65 72 70 72 65 74 65 72 20 69 6e * Interpreter in
5720: 20 77 68 69 63 68 20 74 6f 20 66 69 6e 64 20 66 which to find f
5730: 72 61 6d 65 2e 20 2a 2f 0a 20 20 20 20 63 6f 6e rame. */. con
5740: 73 74 20 63 68 61 72 20 2a 6e 61 6d 65 2c 09 09 st char *name,..
5750: 2f 2a 20 53 74 72 69 6e 67 20 64 65 73 63 72 69 /* String descri
5760: 62 69 6e 67 20 66 72 61 6d 65 2e 20 2a 2f 0a 20 bing frame. */.
5770: 20 20 20 43 61 6c 6c 46 72 61 6d 65 20 2a 2a 66 CallFrame **f
5780: 72 61 6d 65 50 74 72 50 74 72 29 09 2f 2a 20 53 ramePtrPtr)./* S
5790: 74 6f 72 65 20 70 6f 69 6e 74 65 72 20 74 6f 20 tore pointer to
57a0: 66 72 61 6d 65 20 68 65 72 65 20 28 6f 72 20 4e frame here (or N
57b0: 55 4c 4c 20 69 66 0a 09 09 09 09 20 2a 20 67 6c ULL if..... * gl
57c0: 6f 62 61 6c 20 66 72 61 6d 65 20 69 6e 64 69 63 obal frame indic
57d0: 61 74 65 64 29 2e 20 2a 2f 0a 7b 0a 20 20 20 20 ated). */.{.
57e0: 69 6e 74 20 72 65 73 75 6c 74 3b 0a 20 20 20 20 int result;.
57f0: 54 63 6c 5f 4f 62 6a 20 6f 62 6a 3b 0a 0a 20 20 Tcl_Obj obj;..
5800: 20 20 6f 62 6a 2e 62 79 74 65 73 20 3d 20 28 63 obj.bytes = (c
5810: 68 61 72 20 2a 29 20 6e 61 6d 65 3b 0a 20 20 20 har *) name;.
5820: 20 6f 62 6a 2e 6c 65 6e 67 74 68 20 3d 20 73 74 obj.length = st
5830: 72 6c 65 6e 28 6e 61 6d 65 29 3b 0a 20 20 20 20 rlen(name);.
5840: 6f 62 6a 2e 74 79 70 65 50 74 72 20 3d 20 4e 55 obj.typePtr = NU
5850: 4c 4c 3b 0a 20 20 20 20 72 65 73 75 6c 74 20 3d LL;. result =
5860: 20 54 63 6c 4f 62 6a 47 65 74 46 72 61 6d 65 28 TclObjGetFrame(
5870: 69 6e 74 65 72 70 2c 20 26 6f 62 6a 2c 20 66 72 interp, &obj, fr
5880: 61 6d 65 50 74 72 50 74 72 29 3b 0a 20 20 20 20 amePtrPtr);.
5890: 54 63 6c 46 72 65 65 49 6e 74 65 72 6e 61 6c 52 TclFreeInternalR
58a0: 65 70 28 26 6f 62 6a 29 3b 0a 20 20 20 20 72 65 ep(&obj);. re
58b0: 74 75 72 6e 20 72 65 73 75 6c 74 3b 0a 7d 0a 0c turn result;.}..
58c0: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ./*. *----------
58d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
58e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
58f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5900: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a ------------. *.
5910: 20 2a 20 54 63 6c 4f 62 6a 47 65 74 46 72 61 6d * TclObjGetFram
5920: 65 20 2d 2d 0a 20 2a 0a 20 2a 09 47 69 76 65 6e e --. *. *.Given
5930: 20 61 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f a description o
5940: 66 20 61 20 70 72 6f 63 65 64 75 72 65 20 66 72 f a procedure fr
5950: 61 6d 65 2c 20 73 75 63 68 20 61 73 20 74 68 65 ame, such as the
5960: 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 0a first argument.
5970: 20 2a 09 74 6f 20 61 6e 20 22 75 70 6c 65 76 65 *.to an "upleve
5980: 6c 22 20 6f 72 20 22 75 70 76 61 72 22 20 63 6f l" or "upvar" co
5990: 6d 6d 61 6e 64 2c 20 6c 6f 63 61 74 65 20 74 68 mmand, locate th
59a0: 65 20 63 61 6c 6c 20 66 72 61 6d 65 20 66 6f 72 e call frame for
59b0: 20 74 68 65 0a 20 2a 09 61 70 70 72 6f 70 72 69 the. *.appropri
59c0: 61 74 65 20 6c 65 76 65 6c 20 6f 66 20 70 72 6f ate level of pro
59d0: 63 65 64 75 72 65 2e 0a 20 2a 0a 20 2a 20 52 65 cedure.. *. * Re
59e0: 73 75 6c 74 73 3a 0a 20 2a 09 54 68 65 20 72 65 sults:. *.The re
59f0: 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 2d 31 turn value is -1
5a00: 20 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 if an error occ
5a10: 75 72 72 65 64 20 69 6e 20 66 69 6e 64 69 6e 67 urred in finding
5a20: 20 74 68 65 20 66 72 61 6d 65 20 28 69 6e 0a 20 the frame (in.
5a30: 2a 09 74 68 69 73 20 63 61 73 65 20 61 6e 20 65 *.this case an e
5a40: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20 rror message is
5a50: 6c 65 66 74 20 69 6e 20 74 68 65 20 69 6e 74 65 left in the inte
5a60: 72 70 27 73 20 72 65 73 75 6c 74 29 2e 20 31 20 rp's result). 1
5a70: 69 73 0a 20 2a 09 72 65 74 75 72 6e 65 64 20 69 is. *.returned i
5a80: 66 20 6f 62 6a 50 74 72 20 77 61 73 20 65 69 74 f objPtr was eit
5a90: 68 65 72 20 61 6e 20 69 6e 74 20 6f 72 20 61 6e her an int or an
5aa0: 20 69 6e 74 20 70 72 65 63 65 64 65 64 20 62 79 int preceded by
5ab0: 20 22 23 22 20 61 6e 64 0a 20 2a 09 69 74 20 73 "#" and. *.it s
5ac0: 70 65 63 69 66 69 65 64 20 61 20 76 61 6c 69 64 pecified a valid
5ad0: 20 66 72 61 6d 65 2e 20 30 20 69 73 20 72 65 74 frame. 0 is ret
5ae0: 75 72 6e 65 64 20 69 66 20 6f 62 6a 50 74 72 20 urned if objPtr
5af0: 69 73 6e 27 74 20 6f 6e 65 20 6f 66 20 74 68 65 isn't one of the
5b00: 0a 20 2a 09 74 77 6f 20 74 68 69 6e 67 73 20 61 . *.two things a
5b10: 62 6f 76 65 20 28 69 6e 20 74 68 69 73 20 63 61 bove (in this ca
5b20: 73 65 2c 20 74 68 65 20 6c 6f 6f 6b 75 70 20 61 se, the lookup a
5b30: 63 74 73 20 61 73 20 69 66 20 6f 62 6a 50 74 72 cts as if objPtr
5b40: 20 77 65 72 65 0a 20 2a 09 22 31 22 29 2e 20 54 were. *."1"). T
5b50: 68 65 20 76 61 72 69 61 62 6c 65 20 70 6f 69 6e he variable poin
5b60: 74 65 64 20 74 6f 20 62 79 20 66 72 61 6d 65 50 ted to by frameP
5b70: 74 72 50 74 72 20 69 73 20 66 69 6c 6c 65 64 20 trPtr is filled
5b80: 69 6e 20 77 69 74 68 20 74 68 65 0a 20 2a 09 61 in with the. *.a
5b90: 64 64 72 65 73 73 20 6f 66 20 74 68 65 20 64 65 ddress of the de
5ba0: 73 69 72 65 64 20 66 72 61 6d 65 20 28 75 6e 6c sired frame (unl
5bb0: 65 73 73 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 ess an error occ
5bc0: 75 72 73 2c 20 69 6e 20 77 68 69 63 68 20 63 61 urs, in which ca
5bd0: 73 65 20 69 74 0a 20 2a 09 69 73 6e 27 74 20 6d se it. *.isn't m
5be0: 6f 64 69 66 69 65 64 29 3b 20 69 66 20 70 61 73 odified); if pas
5bf0: 73 65 64 20 69 6e 20 61 73 20 4e 55 4c 4c 2c 20 sed in as NULL,
5c00: 69 74 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 it indicates tha
5c10: 74 20 72 65 73 6f 6c 75 74 69 6f 6e 20 6f 66 0a t resolution of.
5c20: 20 2a 09 74 68 65 20 66 72 61 6d 65 20 69 73 20 *.the frame is
5c30: 75 6e 69 6e 74 65 72 65 73 74 69 6e 67 3b 20 6f uninteresting; o
5c40: 6e 6c 79 20 70 61 72 73 69 6e 67 20 6f 66 20 74 nly parsing of t
5c50: 68 65 20 66 72 61 6d 65 20 69 64 65 6e 74 69 66 he frame identif
5c60: 69 65 72 20 69 73 0a 20 2a 09 64 65 73 69 72 65 ier is. *.desire
5c70: 64 20 28 61 6e 64 20 6e 6f 20 77 72 69 74 65 20 d (and no write
5c80: 6f 66 20 74 68 65 20 66 72 61 6d 65 20 72 65 66 of the frame ref
5c90: 20 77 69 6c 6c 20 62 65 20 64 6f 6e 65 29 2e 0a will be done)..
5ca0: 20 2a 0a 20 2a 09 54 68 65 20 70 61 72 73 65 2d *. *.The parse-
5cb0: 6f 6e 6c 79 20 6d 6f 64 65 20 69 73 20 75 73 65 only mode is use
5cc0: 64 20 62 79 20 74 68 65 20 62 79 74 65 63 6f 64 d by the bytecod
5cd0: 65 20 63 6f 6d 70 69 6c 65 72 2c 20 77 68 69 63 e compiler, whic
5ce0: 68 20 73 61 76 65 73 0a 20 2a 09 72 65 73 6f 6c h saves. *.resol
5cf0: 75 74 69 6f 6e 20 6f 66 20 74 68 65 20 66 72 61 ution of the fra
5d00: 6d 65 20 74 6f 20 62 79 74 65 63 6f 64 65 20 65 me to bytecode e
5d10: 78 65 63 75 74 69 6f 6e 20 74 69 6d 65 2e 0a 20 xecution time..
5d20: 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 *. * Side effect
5d30: 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 s:. *.None.. *.
5d40: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
5d50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5d60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5d70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5d80: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 69 6e 74 -------. */..int
5d90: 0a 54 63 6c 4f 62 6a 47 65 74 46 72 61 6d 65 28 .TclObjGetFrame(
5da0: 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 . Tcl_Interp
5db0: 2a 69 6e 74 65 72 70 2c 09 09 2f 2a 20 49 6e 74 *interp,../* Int
5dc0: 65 72 70 72 65 74 65 72 20 69 6e 20 77 68 69 63 erpreter in whic
5dd0: 68 20 74 6f 20 66 69 6e 64 20 66 72 61 6d 65 2e h to find frame.
5de0: 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 */. Tcl_Obj
5df0: 2a 6f 62 6a 50 74 72 2c 09 09 2f 2a 20 4f 62 6a *objPtr,../* Obj
5e00: 65 63 74 20 64 65 73 63 72 69 62 69 6e 67 20 66 ect describing f
5e10: 72 61 6d 65 2e 20 2a 2f 0a 20 20 20 20 43 61 6c rame. */. Cal
5e20: 6c 46 72 61 6d 65 20 2a 2a 66 72 61 6d 65 50 74 lFrame **framePt
5e30: 72 50 74 72 29 09 2f 2a 20 53 74 6f 72 65 20 70 rPtr)./* Store p
5e40: 6f 69 6e 74 65 72 20 74 6f 20 66 72 61 6d 65 20 ointer to frame
5e50: 68 65 72 65 20 28 6f 72 20 4e 55 4c 4c 20 69 66 here (or NULL if
5e60: 0a 09 09 09 09 20 2a 20 67 6c 6f 62 61 6c 20 66 ..... * global f
5e70: 72 61 6d 65 20 69 6e 64 69 63 61 74 65 64 29 3b rame indicated);
5e80: 20 77 68 65 6e 20 4e 55 4c 4c 20 69 74 73 65 6c when NULL itsel
5e90: 66 2c 0a 09 09 09 09 20 2a 20 6e 6f 20 66 72 61 f,..... * no fra
5ea0: 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e 20 69 73 me resolution is
5eb0: 20 77 61 6e 74 65 64 2e 20 2a 2f 0a 7b 0a 20 20 wanted. */.{.
5ec0: 20 20 49 6e 74 65 72 70 20 2a 69 50 74 72 20 3d Interp *iPtr =
5ed0: 20 28 49 6e 74 65 72 70 20 2a 29 20 69 6e 74 65 (Interp *) inte
5ee0: 72 70 3b 0a 20 20 20 20 54 63 6c 5f 53 69 7a 65 rp;. Tcl_Size
5ef0: 20 63 75 72 4c 65 76 65 6c 3b 0a 20 20 20 20 69 curLevel;. i
5f00: 6e 74 20 72 65 73 75 6c 74 2c 20 6c 65 76 65 6c nt result, level
5f10: 3b 0a 20 20 20 20 63 6f 6e 73 74 20 54 63 6c 5f ;. const Tcl_
5f20: 4f 62 6a 49 6e 74 65 72 6e 61 6c 52 65 70 20 2a ObjInternalRep *
5f30: 69 72 50 74 72 3b 0a 20 20 20 20 63 6f 6e 73 74 irPtr;. const
5f40: 20 63 68 61 72 20 2a 6e 61 6d 65 20 3d 20 4e 55 char *name = NU
5f50: 4c 4c 3b 0a 20 20 20 20 54 63 6c 5f 57 69 64 65 LL;. Tcl_Wide
5f60: 49 6e 74 20 77 3b 0a 0a 20 20 20 20 2f 2a 0a 20 Int w;.. /*.
5f70: 20 20 20 20 2a 20 50 61 72 73 65 20 6f 62 6a 65 * Parse obje
5f80: 63 74 20 74 6f 20 66 69 67 75 72 65 20 6f 75 74 ct to figure out
5f90: 20 77 68 69 63 68 20 6c 65 76 65 6c 20 6e 75 6d which level num
5fa0: 62 65 72 20 74 6f 20 67 6f 20 74 6f 2e 0a 20 20 ber to go to..
5fb0: 20 20 20 2a 2f 0a 0a 20 20 20 20 72 65 73 75 6c */.. resul
5fc0: 74 20 3d 20 30 3b 0a 20 20 20 20 63 75 72 4c 65 t = 0;. curLe
5fd0: 76 65 6c 20 3d 20 69 50 74 72 2d 3e 76 61 72 46 vel = iPtr->varF
5fe0: 72 61 6d 65 50 74 72 2d 3e 6c 65 76 65 6c 3b 0a ramePtr->level;.
5ff0: 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 43 . /*. * C
6000: 68 65 63 6b 20 66 6f 72 20 69 6e 74 65 67 65 72 heck for integer
6010: 20 66 69 72 73 74 2c 20 73 69 6e 63 65 20 74 68 first, since th
6020: 61 74 20 68 61 73 20 70 6f 74 65 6e 74 69 61 6c at has potential
6030: 20 74 6f 20 73 70 61 72 65 20 75 73 0a 20 20 20 to spare us.
6040: 20 20 2a 20 61 20 67 65 6e 65 72 61 74 69 6f 6e * a generation
6050: 20 6f 66 20 61 20 73 74 72 69 6e 67 72 65 70 2e of a stringrep.
6060: 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 69 66 . */.. if
6070: 20 28 6f 62 6a 50 74 72 20 3d 3d 20 4e 55 4c 4c (objPtr == NULL
6080: 29 20 7b 0a 09 2f 2a 20 44 6f 20 6e 6f 74 68 69 ) {../* Do nothi
6090: 6e 67 20 2a 2f 0a 20 20 20 20 7d 20 65 6c 73 65 ng */. } else
60a0: 20 69 66 20 28 54 43 4c 5f 4f 4b 20 3d 3d 20 54 if (TCL_OK == T
60b0: 63 6c 5f 47 65 74 49 6e 74 46 72 6f 6d 4f 62 6a cl_GetIntFromObj
60c0: 28 4e 55 4c 4c 2c 20 6f 62 6a 50 74 72 2c 20 26 (NULL, objPtr, &
60d0: 6c 65 76 65 6c 29 29 20 7b 0a 09 54 63 6c 47 65 level)) {..TclGe
60e0: 74 57 69 64 65 49 6e 74 46 72 6f 6d 4f 62 6a 28 tWideIntFromObj(
60f0: 4e 55 4c 4c 2c 20 6f 62 6a 50 74 72 2c 20 26 77 NULL, objPtr, &w
6100: 29 3b 0a 09 69 66 20 28 77 20 3c 20 30 20 7c 7c );..if (w < 0 ||
6110: 20 77 20 3e 20 49 4e 54 5f 4d 41 58 20 7c 7c 20 w > INT_MAX ||
6120: 63 75 72 4c 65 76 65 6c 20 3e 20 49 4e 54 5f 4d curLevel > INT_M
6130: 41 58 29 20 7b 0a 09 20 20 20 20 72 65 73 75 6c AX) {.. resul
6140: 74 20 3d 20 2d 31 3b 0a 09 7d 20 65 6c 73 65 20 t = -1;..} else
6150: 7b 0a 09 20 20 20 20 6c 65 76 65 6c 20 3d 20 28 {.. level = (
6160: 69 6e 74 29 63 75 72 4c 65 76 65 6c 20 2d 20 6c int)curLevel - l
6170: 65 76 65 6c 3b 0a 09 20 20 20 20 72 65 73 75 6c evel;.. resul
6180: 74 20 3d 20 31 3b 0a 09 7d 0a 20 20 20 20 7d 20 t = 1;..}. }
6190: 65 6c 73 65 20 69 66 20 28 28 69 72 50 74 72 20 else if ((irPtr
61a0: 3d 20 54 63 6c 46 65 74 63 68 49 6e 74 65 72 6e = TclFetchIntern
61b0: 61 6c 52 65 70 28 6f 62 6a 50 74 72 2c 20 26 6c alRep(objPtr, &l
61c0: 65 76 65 6c 52 65 66 65 72 65 6e 63 65 54 79 70 evelReferenceTyp
61d0: 65 29 29 29 20 7b 0a 09 6c 65 76 65 6c 20 3d 20 e))) {..level =
61e0: 28 69 6e 74 29 69 72 50 74 72 2d 3e 77 69 64 65 (int)irPtr->wide
61f0: 56 61 6c 75 65 3b 0a 09 72 65 73 75 6c 74 20 3d Value;..result =
6200: 20 31 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 1;. } else {
6210: 0a 09 6e 61 6d 65 20 3d 20 54 63 6c 47 65 74 53 ..name = TclGetS
6220: 74 72 69 6e 67 28 6f 62 6a 50 74 72 29 3b 0a 09 tring(objPtr);..
6230: 69 66 20 28 6e 61 6d 65 5b 30 5d 20 3d 3d 20 27 if (name[0] == '
6240: 23 27 29 20 7b 0a 09 20 20 20 20 69 66 20 28 54 #') {.. if (T
6250: 43 4c 5f 4f 4b 20 3d 3d 20 54 63 6c 5f 47 65 74 CL_OK == Tcl_Get
6260: 49 6e 74 28 4e 55 4c 4c 2c 20 6e 61 6d 65 2b 31 Int(NULL, name+1
6270: 2c 20 26 6c 65 76 65 6c 29 29 20 7b 0a 09 09 69 , &level)) {...i
6280: 66 20 28 6c 65 76 65 6c 20 3c 20 30 20 7c 7c 20 f (level < 0 ||
6290: 28 6c 65 76 65 6c 20 3e 20 30 20 26 26 20 6e 61 (level > 0 && na
62a0: 6d 65 5b 31 5d 20 3d 3d 20 27 2d 27 29 29 20 7b me[1] == '-')) {
62b0: 0a 09 09 20 20 20 20 72 65 73 75 6c 74 20 3d 20 ... result =
62c0: 2d 31 3b 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 -1;...} else {..
62d0: 09 20 20 20 20 54 63 6c 5f 4f 62 6a 49 6e 74 65 . Tcl_ObjInte
62e0: 72 6e 61 6c 52 65 70 20 69 72 3b 0a 0a 09 09 20 rnalRep ir;....
62f0: 20 20 20 69 72 2e 77 69 64 65 56 61 6c 75 65 20 ir.wideValue
6300: 3d 20 6c 65 76 65 6c 3b 0a 09 09 20 20 20 20 54 = level;... T
6310: 63 6c 5f 53 74 6f 72 65 49 6e 74 65 72 6e 61 6c cl_StoreInternal
6320: 52 65 70 28 6f 62 6a 50 74 72 2c 20 26 6c 65 76 Rep(objPtr, &lev
6330: 65 6c 52 65 66 65 72 65 6e 63 65 54 79 70 65 2c elReferenceType,
6340: 20 26 69 72 29 3b 0a 09 09 20 20 20 20 72 65 73 &ir);... res
6350: 75 6c 74 20 3d 20 31 3b 0a 09 09 7d 0a 09 20 20 ult = 1;...}..
6360: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 09 72 65 73 } else {...res
6370: 75 6c 74 20 3d 20 2d 31 3b 0a 09 20 20 20 20 7d ult = -1;.. }
6380: 0a 09 7d 20 65 6c 73 65 20 69 66 20 28 54 63 6c ..} else if (Tcl
6390: 47 65 74 57 69 64 65 42 69 74 73 46 72 6f 6d 4f GetWideBitsFromO
63a0: 62 6a 28 4e 55 4c 4c 2c 20 6f 62 6a 50 74 72 2c bj(NULL, objPtr,
63b0: 20 26 77 29 20 3d 3d 20 54 43 4c 5f 4f 4b 29 20 &w) == TCL_OK)
63c0: 7b 0a 09 20 20 20 20 2f 2a 0a 09 20 20 20 20 20 {.. /*..
63d0: 2a 20 49 66 20 74 68 69 73 20 77 65 72 65 20 61 * If this were a
63e0: 6e 20 69 6e 74 65 67 65 72 2c 20 77 65 27 64 20 n integer, we'd
63f0: 68 61 76 65 20 73 75 63 63 65 65 64 65 64 20 61 have succeeded a
6400: 6c 72 65 61 64 79 2e 0a 09 20 20 20 20 20 2a 20 lready... *
6410: 44 6f 63 73 20 73 61 79 20 77 65 20 68 61 76 65 Docs say we have
6420: 20 74 6f 20 74 72 65 61 74 20 74 68 69 73 20 61 to treat this a
6430: 73 20 61 20 27 62 61 64 20 6c 65 76 65 6c 27 20 s a 'bad level'
6440: 20 65 72 72 6f 72 2e 0a 09 20 20 20 20 20 2a 2f error... */
6450: 0a 09 20 20 20 20 72 65 73 75 6c 74 20 3d 20 2d .. result = -
6460: 31 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 1;..}. }..
6470: 20 69 66 20 28 72 65 73 75 6c 74 20 21 3d 20 2d if (result != -
6480: 31 29 20 7b 0a 09 69 66 20 28 66 72 61 6d 65 50 1) {..if (frameP
6490: 74 72 50 74 72 20 3d 3d 20 4e 55 4c 4c 29 20 7b trPtr == NULL) {
64a0: 0a 09 20 20 20 20 2f 2f 20 4e 6f 74 20 69 6e 74 .. // Not int
64b0: 65 72 65 73 74 65 64 20 69 6e 20 72 65 73 6f 6c erested in resol
64c0: 76 69 6e 67 20 74 6f 20 61 6e 20 61 63 74 75 61 ving to an actua
64d0: 6c 20 6c 65 76 65 6c 20 79 65 74 2e 0a 09 20 20 l level yet...
64e0: 20 20 72 65 74 75 72 6e 20 72 65 73 75 6c 74 3b return result;
64f0: 0a 09 7d 0a 09 2f 2a 20 69 66 20 72 65 6c 61 74 ..}../* if relat
6500: 69 76 65 20 63 75 72 72 65 6e 74 20 6c 65 76 65 ive current leve
6510: 6c 20 2a 2f 0a 09 69 66 20 28 72 65 73 75 6c 74 l */..if (result
6520: 20 3d 3d 20 30 29 20 7b 0a 09 20 20 20 20 69 66 == 0) {.. if
6530: 20 28 21 63 75 72 4c 65 76 65 6c 29 20 7b 0a 09 (!curLevel) {..
6540: 09 2f 2a 20 77 65 20 61 72 65 20 69 6e 20 74 6f ./* we are in to
6550: 70 2d 6c 65 76 65 6c 2c 20 73 6f 20 73 69 6d 70 p-level, so simp
6560: 6c 79 20 67 65 6e 65 72 61 74 65 20 62 61 64 20 ly generate bad
6570: 6c 65 76 65 6c 20 2a 2f 0a 09 09 6e 61 6d 65 20 level */...name
6580: 3d 20 22 31 22 3b 0a 09 09 67 6f 74 6f 20 62 61 = "1";...goto ba
6590: 64 4c 65 76 65 6c 3b 0a 09 20 20 20 20 7d 0a 09 dLevel;.. }..
65a0: 20 20 20 20 6c 65 76 65 6c 20 3d 20 28 69 6e 74 level = (int
65b0: 29 63 75 72 4c 65 76 65 6c 20 2d 20 31 3b 0a 09 )curLevel - 1;..
65c0: 7d 0a 09 69 66 20 28 6c 65 76 65 6c 20 3e 3d 20 }..if (level >=
65d0: 30 29 20 7b 0a 09 20 20 20 20 43 61 6c 6c 46 72 0) {.. CallFr
65e0: 61 6d 65 20 2a 66 72 61 6d 65 50 74 72 3b 0a 09 ame *framePtr;..
65f0: 20 20 20 20 66 6f 72 20 28 66 72 61 6d 65 50 74 for (framePt
6600: 72 20 3d 20 69 50 74 72 2d 3e 76 61 72 46 72 61 r = iPtr->varFra
6610: 6d 65 50 74 72 3b 20 66 72 61 6d 65 50 74 72 20 mePtr; framePtr
6620: 21 3d 20 4e 55 4c 4c 3b 0a 09 09 20 20 20 20 66 != NULL;... f
6630: 72 61 6d 65 50 74 72 20 3d 20 66 72 61 6d 65 50 ramePtr = frameP
6640: 74 72 2d 3e 63 61 6c 6c 65 72 56 61 72 50 74 72 tr->callerVarPtr
6650: 29 20 7b 0a 09 09 69 66 20 28 28 69 6e 74 29 66 ) {...if ((int)f
6660: 72 61 6d 65 50 74 72 2d 3e 6c 65 76 65 6c 20 3d ramePtr->level =
6670: 3d 20 6c 65 76 65 6c 29 20 7b 0a 09 09 20 20 20 = level) {...
6680: 20 2a 66 72 61 6d 65 50 74 72 50 74 72 20 3d 20 *framePtrPtr =
6690: 66 72 61 6d 65 50 74 72 3b 0a 09 09 20 20 20 20 framePtr;...
66a0: 72 65 74 75 72 6e 20 72 65 73 75 6c 74 3b 0a 09 return result;..
66b0: 09 7d 0a 09 20 20 20 20 7d 0a 09 7d 0a 20 20 20 .}.. }..}.
66c0: 20 7d 0a 62 61 64 4c 65 76 65 6c 3a 0a 20 20 20 }.badLevel:.
66d0: 20 69 66 20 28 6e 61 6d 65 20 3d 3d 20 4e 55 4c if (name == NUL
66e0: 4c 29 20 7b 0a 09 6e 61 6d 65 20 3d 20 6f 62 6a L) {..name = obj
66f0: 50 74 72 20 3f 20 54 63 6c 47 65 74 53 74 72 69 Ptr ? TclGetStri
6700: 6e 67 28 6f 62 6a 50 74 72 29 20 3a 20 22 31 22 ng(objPtr) : "1"
6710: 20 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c ;. }. Tcl
6720: 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e _SetObjResult(in
6730: 74 65 72 70 2c 20 54 63 6c 5f 4f 62 6a 50 72 69 terp, Tcl_ObjPri
6740: 6e 74 66 28 22 62 61 64 20 6c 65 76 65 6c 20 5c ntf("bad level \
6750: 22 25 73 5c 22 22 2c 20 6e 61 6d 65 29 29 3b 0a "%s\"", name));.
6760: 20 20 20 20 54 63 6c 5f 53 65 74 45 72 72 6f 72 Tcl_SetError
6770: 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54 43 Code(interp, "TC
6780: 4c 22 2c 20 22 4c 4f 4f 4b 55 50 22 2c 20 22 4c L", "LOOKUP", "L
6790: 45 56 45 4c 22 2c 20 6e 61 6d 65 2c 20 28 63 68 EVEL", name, (ch
67a0: 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 20 20 20 20 ar *)NULL);.
67b0: 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0c 0a 2f return -1;.}.../
67c0: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
67d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
67e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
67f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6800: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a ----------. *. *
6810: 20 54 63 6c 5f 55 70 6c 65 76 65 6c 4f 62 6a 43 Tcl_UplevelObjC
6820: 6d 64 20 2d 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 md --. *. *.This
6830: 20 6f 62 6a 65 63 74 20 66 75 6e 63 74 69 6f 6e object function
6840: 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f 20 70 is invoked to p
6850: 72 6f 63 65 73 73 20 74 68 65 20 22 75 70 6c 65 rocess the "uple
6860: 76 65 6c 22 20 54 63 6c 20 63 6f 6d 6d 61 6e 64 vel" Tcl command
6870: 2e 0a 20 2a 09 53 65 65 20 74 68 65 20 75 73 65 .. *.See the use
6880: 72 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 20 r documentation
6890: 66 6f 72 20 64 65 74 61 69 6c 73 20 6f 6e 20 77 for details on w
68a0: 68 61 74 20 69 74 20 64 6f 65 73 2e 0a 20 2a 0a hat it does.. *.
68b0: 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 * Results:. *.A
68c0: 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 6f 62 standard Tcl ob
68d0: 6a 65 63 74 20 72 65 73 75 6c 74 20 76 61 6c 75 ject result valu
68e0: 65 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 e.. *. * Side ef
68f0: 66 65 63 74 73 3a 0a 20 2a 09 53 65 65 20 74 68 fects:. *.See th
6900: 65 20 75 73 65 72 20 64 6f 63 75 6d 65 6e 74 61 e user documenta
6910: 74 69 6f 6e 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d tion.. *. *-----
6920: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6930: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6940: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6950: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6960: 2d 0a 20 2a 2f 0a 0a 69 6e 74 0a 54 63 6c 55 70 -. */..int.TclUp
6970: 6c 65 76 65 6c 43 61 6c 6c 62 61 63 6b 28 0a 20 levelCallback(.
6980: 20 20 20 76 6f 69 64 20 2a 64 61 74 61 5b 5d 2c void *data[],
6990: 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 . Tcl_Interp
69a0: 2a 69 6e 74 65 72 70 2c 0a 20 20 20 20 69 6e 74 *interp,. int
69b0: 20 72 65 73 75 6c 74 29 0a 7b 0a 20 20 20 20 43 result).{. C
69c0: 61 6c 6c 46 72 61 6d 65 20 2a 73 61 76 65 64 56 allFrame *savedV
69d0: 61 72 46 72 61 6d 65 50 74 72 20 3d 20 28 43 61 arFramePtr = (Ca
69e0: 6c 6c 46 72 61 6d 65 20 2a 29 64 61 74 61 5b 30 llFrame *)data[0
69f0: 5d 3b 0a 0a 20 20 20 20 69 66 20 28 72 65 73 75 ];.. if (resu
6a00: 6c 74 20 3d 3d 20 54 43 4c 5f 45 52 52 4f 52 29 lt == TCL_ERROR)
6a10: 20 7b 0a 09 54 63 6c 5f 41 70 70 65 6e 64 4f 62 {..Tcl_AppendOb
6a20: 6a 54 6f 45 72 72 6f 72 49 6e 66 6f 28 69 6e 74 jToErrorInfo(int
6a30: 65 72 70 2c 20 54 63 6c 5f 4f 62 6a 50 72 69 6e erp, Tcl_ObjPrin
6a40: 74 66 28 0a 09 09 22 5c 6e 20 20 20 20 28 5c 22 tf(..."\n (\"
6a50: 75 70 6c 65 76 65 6c 5c 22 20 62 6f 64 79 20 6c uplevel\" body l
6a60: 69 6e 65 20 25 64 29 22 2c 20 54 63 6c 5f 47 65 ine %d)", Tcl_Ge
6a70: 74 45 72 72 6f 72 4c 69 6e 65 28 69 6e 74 65 72 tErrorLine(inter
6a80: 70 29 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 p)));. }..
6a90: 20 2f 2a 0a 20 20 20 20 20 2a 20 52 65 73 74 6f /*. * Resto
6aa0: 72 65 20 74 68 65 20 76 61 72 69 61 62 6c 65 20 re the variable
6ab0: 66 72 61 6d 65 2c 20 61 6e 64 20 72 65 74 75 72 frame, and retur
6ac0: 6e 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 n.. */..
6ad0: 28 28 49 6e 74 65 72 70 20 2a 29 69 6e 74 65 72 ((Interp *)inter
6ae0: 70 29 2d 3e 76 61 72 46 72 61 6d 65 50 74 72 20 p)->varFramePtr
6af0: 3d 20 73 61 76 65 64 56 61 72 46 72 61 6d 65 50 = savedVarFrameP
6b00: 74 72 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 tr;. return r
6b10: 65 73 75 6c 74 3b 0a 7d 0a 0a 69 6e 74 0a 54 63 esult;.}..int.Tc
6b20: 6c 5f 55 70 6c 65 76 65 6c 4f 62 6a 43 6d 64 28 l_UplevelObjCmd(
6b30: 0a 20 20 20 20 76 6f 69 64 20 2a 63 6c 69 65 6e . void *clien
6b40: 74 44 61 74 61 2c 0a 20 20 20 20 54 63 6c 5f 49 tData,. Tcl_I
6b50: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 09 09 nterp *interp,..
6b60: 2f 2a 20 43 75 72 72 65 6e 74 20 69 6e 74 65 72 /* Current inter
6b70: 70 72 65 74 65 72 2e 20 2a 2f 0a 20 20 20 20 54 preter. */. T
6b80: 63 6c 5f 53 69 7a 65 20 6f 62 6a 63 2c 09 09 2f cl_Size objc,../
6b90: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 * Number of argu
6ba0: 6d 65 6e 74 73 2e 20 2a 2f 0a 20 20 20 20 54 63 ments. */. Tc
6bb0: 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 2a 6f 62 l_Obj *const *ob
6bc0: 6a 76 29 09 2f 2a 20 41 72 67 75 6d 65 6e 74 20 jv)./* Argument
6bd0: 6f 62 6a 65 63 74 73 2e 20 2a 2f 0a 7b 0a 20 20 objects. */.{.
6be0: 20 20 72 65 74 75 72 6e 20 54 63 6c 5f 4e 52 43 return Tcl_NRC
6bf0: 61 6c 6c 4f 62 6a 50 72 6f 63 32 28 69 6e 74 65 allObjProc2(inte
6c00: 72 70 2c 20 54 63 6c 4e 52 55 70 6c 65 76 65 6c rp, TclNRUplevel
6c10: 4f 62 6a 43 6d 64 2c 20 63 6c 69 65 6e 74 44 61 ObjCmd, clientDa
6c20: 74 61 2c 20 6f 62 6a 63 2c 20 6f 62 6a 76 29 3b ta, objc, objv);
6c30: 0a 7d 0a 0a 69 6e 74 0a 54 63 6c 4e 52 55 70 6c .}..int.TclNRUpl
6c40: 65 76 65 6c 4f 62 6a 43 6d 64 28 0a 20 20 20 20 evelObjCmd(.
6c50: 54 43 4c 5f 55 4e 55 53 45 44 28 76 6f 69 64 20 TCL_UNUSED(void
6c60: 2a 29 2c 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 *),. Tcl_Inte
6c70: 72 70 20 2a 69 6e 74 65 72 70 2c 09 09 2f 2a 20 rp *interp,../*
6c80: 43 75 72 72 65 6e 74 20 69 6e 74 65 72 70 72 65 Current interpre
6c90: 74 65 72 2e 20 2a 2f 0a 20 20 20 20 54 63 6c 5f ter. */. Tcl_
6ca0: 53 69 7a 65 20 6f 62 6a 63 2c 09 09 2f 2a 20 4e Size objc,../* N
6cb0: 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e umber of argumen
6cc0: 74 73 2e 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f ts. */. Tcl_O
6cd0: 62 6a 20 2a 63 6f 6e 73 74 20 2a 6f 62 6a 76 29 bj *const *objv)
6ce0: 09 2f 2a 20 41 72 67 75 6d 65 6e 74 20 6f 62 6a ./* Argument obj
6cf0: 65 63 74 73 2e 20 2a 2f 0a 7b 0a 0a 20 20 20 20 ects. */.{..
6d00: 49 6e 74 65 72 70 20 2a 69 50 74 72 20 3d 20 28 Interp *iPtr = (
6d10: 49 6e 74 65 72 70 20 2a 29 20 69 6e 74 65 72 70 Interp *) interp
6d20: 3b 0a 20 20 20 20 43 6d 64 46 72 61 6d 65 20 2a ;. CmdFrame *
6d30: 69 6e 76 6f 6b 65 72 20 3d 20 4e 55 4c 4c 3b 0a invoker = NULL;.
6d40: 20 20 20 20 54 63 6c 5f 53 69 7a 65 20 77 6f 72 Tcl_Size wor
6d50: 64 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 72 d = 0;. int r
6d60: 65 73 75 6c 74 3b 0a 20 20 20 20 43 61 6c 6c 46 esult;. CallF
6d70: 72 61 6d 65 20 2a 73 61 76 65 64 56 61 72 46 72 rame *savedVarFr
6d80: 61 6d 65 50 74 72 2c 20 2a 66 72 61 6d 65 50 74 amePtr, *framePt
6d90: 72 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a r;. Tcl_Obj *
6da0: 6f 62 6a 50 74 72 3b 0a 0a 20 20 20 20 69 66 20 objPtr;.. if
6db0: 28 6f 62 6a 63 20 3c 20 32 29 20 7b 0a 20 20 20 (objc < 2) {.
6dc0: 20 2f 2a 20 74 6f 20 64 6f 0a 20 20 20 20 2a 20 /* to do. *
6dd0: 20 20 20 73 69 6d 70 6c 69 66 79 20 74 68 69 6e simplify thin
6de0: 67 73 20 62 79 20 69 6e 74 65 72 70 72 65 74 69 gs by interpreti
6df0: 6e 67 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 ng the argument
6e00: 61 73 20 61 20 63 6f 6d 6d 61 6e 64 20 77 68 65 as a command whe
6e10: 6e 20 74 68 65 72 65 0a 20 20 20 20 2a 20 20 20 n there. *
6e20: 20 69 73 20 6f 6e 6c 79 20 6f 6e 65 20 61 72 67 is only one arg
6e30: 75 6d 65 6e 74 2e 20 20 54 68 69 73 20 72 65 71 ument. This req
6e40: 75 69 72 65 73 20 61 20 54 49 50 20 73 69 6e 63 uires a TIP sinc
6e50: 65 20 63 75 72 72 65 6e 74 6c 79 20 61 20 73 69 e currently a si
6e60: 6e 67 6c 65 0a 20 20 20 20 2a 20 20 20 20 61 72 ngle. * ar
6e70: 67 75 6d 65 6e 74 20 69 73 20 69 6e 74 65 72 70 gument is interp
6e80: 72 65 74 65 64 20 61 73 20 61 20 6c 65 76 65 6c reted as a level
6e90: 20 69 6e 64 69 63 61 74 6f 72 20 69 66 20 70 6f indicator if po
6ea0: 73 73 69 62 6c 65 2e 0a 20 20 20 20 2a 2f 0a 09 ssible.. */..
6eb0: 67 6f 74 6f 20 75 70 6c 65 76 65 6c 53 79 6e 74 goto uplevelSynt
6ec0: 61 78 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 ax;. } else i
6ed0: 66 20 28 21 54 63 6c 48 61 73 53 74 72 69 6e 67 f (!TclHasString
6ee0: 52 65 70 28 6f 62 6a 76 5b 31 5d 29 20 26 26 20 Rep(objv[1]) &&
6ef0: 6f 62 6a 63 20 3d 3d 20 32 29 20 7b 0a 09 69 6e objc == 2) {..in
6f00: 74 20 73 74 61 74 75 73 3b 0a 09 54 63 6c 5f 53 t status;..Tcl_S
6f10: 69 7a 65 20 6c 6c 65 6e 67 74 68 3b 0a 09 73 74 ize llength;..st
6f20: 61 74 75 73 20 3d 20 54 63 6c 4c 69 73 74 4f 62 atus = TclListOb
6f30: 6a 4c 65 6e 67 74 68 28 69 6e 74 65 72 70 2c 20 jLength(interp,
6f40: 6f 62 6a 76 5b 31 5d 2c 20 26 6c 6c 65 6e 67 74 objv[1], &llengt
6f50: 68 29 3b 0a 09 69 66 20 28 73 74 61 74 75 73 20 h);..if (status
6f60: 3d 3d 20 54 43 4c 5f 4f 4b 20 26 26 20 6c 6c 65 == TCL_OK && lle
6f70: 6e 67 74 68 20 3e 20 31 29 20 7b 0a 09 20 20 20 ngth > 1) {..
6f80: 20 2f 2a 20 74 68 65 20 66 69 72 73 74 20 61 72 /* the first ar
6f90: 67 75 6d 65 6e 74 20 63 61 6e 27 74 20 69 6e 74 gument can't int
6fa0: 65 72 70 72 65 74 65 64 20 61 73 20 61 20 6c 65 erpreted as a le
6fb0: 76 65 6c 2e 20 41 76 6f 69 64 0a 09 20 20 20 20 vel. Avoid..
6fc0: 20 2a 20 67 65 6e 65 72 61 74 69 6e 67 20 61 20 * generating a
6fd0: 73 74 72 69 6e 67 20 72 65 70 72 65 73 65 6e 74 string represent
6fe0: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 73 63 72 ation of the scr
6ff0: 69 70 74 2e 20 2a 2f 0a 09 20 20 20 20 72 65 73 ipt. */.. res
7000: 75 6c 74 20 3d 20 54 63 6c 47 65 74 46 72 61 6d ult = TclGetFram
7010: 65 28 69 6e 74 65 72 70 2c 20 22 31 22 2c 20 26 e(interp, "1", &
7020: 66 72 61 6d 65 50 74 72 29 3b 0a 09 20 20 20 20 framePtr);..
7030: 69 66 20 28 72 65 73 75 6c 74 20 3d 3d 20 2d 31 if (result == -1
7040: 29 20 7b 0a 09 09 72 65 74 75 72 6e 20 54 43 4c ) {...return TCL
7050: 5f 45 52 52 4f 52 3b 0a 09 20 20 20 20 7d 0a 09 _ERROR;.. }..
7060: 20 20 20 20 6f 62 6a 63 20 2d 3d 20 31 3b 0a 09 objc -= 1;..
7070: 20 20 20 20 6f 62 6a 76 20 2b 3d 20 31 3b 0a 09 objv += 1;..
7080: 20 20 20 20 67 6f 74 6f 20 68 61 76 65 6c 65 76 goto havelev
7090: 65 6c 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 el;..}. }..
70a0: 20 20 2f 2a 0a 20 20 20 20 20 2a 20 46 69 6e 64 /*. * Find
70b0: 20 74 68 65 20 6c 65 76 65 6c 20 74 6f 20 75 73 the level to us
70c0: 65 20 66 6f 72 20 65 78 65 63 75 74 69 6e 67 20 e for executing
70d0: 74 68 65 20 63 6f 6d 6d 61 6e 64 2e 0a 20 20 20 the command..
70e0: 20 20 2a 2f 0a 0a 20 20 20 20 72 65 73 75 6c 74 */.. result
70f0: 20 3d 20 54 63 6c 4f 62 6a 47 65 74 46 72 61 6d = TclObjGetFram
7100: 65 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 31 e(interp, objv[1
7110: 5d 2c 20 26 66 72 61 6d 65 50 74 72 29 3b 0a 20 ], &framePtr);.
7120: 20 20 20 69 66 20 28 72 65 73 75 6c 74 20 3d 3d if (result ==
7130: 20 2d 31 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 -1) {..return T
7140: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a CL_ERROR;. }.
7150: 20 20 20 20 6f 62 6a 63 20 2d 3d 20 72 65 73 75 objc -= resu
7160: 6c 74 20 2b 20 31 3b 0a 20 20 20 20 69 66 20 28 lt + 1;. if (
7170: 6f 62 6a 63 20 3d 3d 20 30 29 20 7b 0a 09 67 6f objc == 0) {..go
7180: 74 6f 20 75 70 6c 65 76 65 6c 53 79 6e 74 61 78 to uplevelSyntax
7190: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6f 62 6a 76 ;. }. objv
71a0: 20 2b 3d 20 72 65 73 75 6c 74 20 2b 20 31 3b 0a += result + 1;.
71b0: 0a 20 20 68 61 76 65 6c 65 76 65 6c 3a 0a 0a 20 . havelevel:..
71c0: 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 4d 6f 64 /*. * Mod
71d0: 69 66 79 20 74 68 65 20 69 6e 74 65 72 70 72 65 ify the interpre
71e0: 74 65 72 20 73 74 61 74 65 20 74 6f 20 65 78 65 ter state to exe
71f0: 63 75 74 65 20 69 6e 20 74 68 65 20 67 69 76 65 cute in the give
7200: 6e 20 66 72 61 6d 65 2e 0a 20 20 20 20 20 2a 2f n frame.. */
7210: 0a 0a 20 20 20 20 73 61 76 65 64 56 61 72 46 72 .. savedVarFr
7220: 61 6d 65 50 74 72 20 3d 20 69 50 74 72 2d 3e 76 amePtr = iPtr->v
7230: 61 72 46 72 61 6d 65 50 74 72 3b 0a 20 20 20 20 arFramePtr;.
7240: 69 50 74 72 2d 3e 76 61 72 46 72 61 6d 65 50 74 iPtr->varFramePt
7250: 72 20 3d 20 66 72 61 6d 65 50 74 72 3b 0a 0a 20 r = framePtr;..
7260: 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 45 78 65 /*. * Exe
7270: 63 75 74 65 20 74 68 65 20 72 65 73 69 64 75 61 cute the residua
7280: 6c 20 61 72 67 75 6d 65 6e 74 73 20 61 73 20 61 l arguments as a
7290: 20 63 6f 6d 6d 61 6e 64 2e 0a 20 20 20 20 20 2a command.. *
72a0: 2f 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 /.. if (objc
72b0: 3d 3d 20 31 29 20 7b 0a 09 2f 2a 0a 09 20 2a 20 == 1) {../*.. *
72c0: 54 49 50 20 23 32 38 30 2e 20 4d 61 6b 65 20 61 TIP #280. Make a
72d0: 63 74 75 61 6c 20 61 72 67 75 6d 65 6e 74 20 6c ctual argument l
72e0: 6f 63 61 74 69 6f 6e 20 61 76 61 69 6c 61 62 6c ocation availabl
72f0: 65 20 74 6f 20 65 76 61 6c 27 64 20 73 63 72 69 e to eval'd scri
7300: 70 74 0a 09 20 2a 2f 0a 0a 09 54 63 6c 41 72 67 pt.. */...TclArg
7310: 75 6d 65 6e 74 47 65 74 28 69 6e 74 65 72 70 2c umentGet(interp,
7320: 20 6f 62 6a 76 5b 30 5d 2c 20 26 69 6e 76 6f 6b objv[0], &invok
7330: 65 72 2c 20 26 77 6f 72 64 29 3b 0a 09 6f 62 6a er, &word);..obj
7340: 50 74 72 20 3d 20 6f 62 6a 76 5b 30 5d 3b 0a 20 Ptr = objv[0];.
7350: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 2f 2a 0a } else {../*.
7360: 09 20 2a 20 4d 6f 72 65 20 74 68 61 6e 20 6f 6e . * More than on
7370: 65 20 61 72 67 75 6d 65 6e 74 3a 20 63 6f 6e 63 e argument: conc
7380: 61 74 65 6e 61 74 65 20 74 68 65 6d 20 74 6f 67 atenate them tog
7390: 65 74 68 65 72 20 77 69 74 68 20 73 70 61 63 65 ether with space
73a0: 73 0a 09 20 2a 20 62 65 74 77 65 65 6e 2c 20 74 s.. * between, t
73b0: 68 65 6e 20 65 76 61 6c 75 61 74 65 20 74 68 65 hen evaluate the
73c0: 20 72 65 73 75 6c 74 2e 20 54 63 6c 5f 45 76 61 result. Tcl_Eva
73d0: 6c 4f 62 6a 45 78 20 77 69 6c 6c 20 64 65 6c 65 lObjEx will dele
73e0: 74 65 20 74 68 65 0a 09 20 2a 20 6f 62 6a 65 63 te the.. * objec
73f0: 74 20 77 68 65 6e 20 69 74 20 64 65 63 72 65 6d t when it decrem
7400: 65 6e 74 73 20 69 74 73 20 72 65 66 63 6f 75 6e ents its refcoun
7410: 74 20 61 66 74 65 72 20 65 76 61 6c 27 69 6e 67 t after eval'ing
7420: 20 69 74 2e 0a 09 20 2a 2f 0a 0a 09 6f 62 6a 50 it... */...objP
7430: 74 72 20 3d 20 54 63 6c 5f 43 6f 6e 63 61 74 4f tr = Tcl_ConcatO
7440: 62 6a 28 6f 62 6a 63 2c 20 6f 62 6a 76 29 3b 0a bj(objc, objv);.
7450: 20 20 20 20 7d 0a 0a 20 20 20 20 54 63 6c 4e 52 }.. TclNR
7460: 41 64 64 43 61 6c 6c 62 61 63 6b 28 69 6e 74 65 AddCallback(inte
7470: 72 70 2c 20 54 63 6c 55 70 6c 65 76 65 6c 43 61 rp, TclUplevelCa
7480: 6c 6c 62 61 63 6b 2c 20 73 61 76 65 64 56 61 72 llback, savedVar
7490: 46 72 61 6d 65 50 74 72 2c 0a 09 20 20 20 20 4e FramePtr,.. N
74a0: 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 ULL, NULL, NULL)
74b0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 63 6c ;. return Tcl
74c0: 4e 52 45 76 61 6c 4f 62 6a 45 78 28 69 6e 74 65 NREvalObjEx(inte
74d0: 72 70 2c 20 6f 62 6a 50 74 72 2c 20 30 2c 20 69 rp, objPtr, 0, i
74e0: 6e 76 6f 6b 65 72 2c 20 77 6f 72 64 29 3b 0a 20 nvoker, word);.
74f0: 20 75 70 6c 65 76 65 6c 53 79 6e 74 61 78 3a 0a uplevelSyntax:.
7500: 20 20 20 20 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d Tcl_WrongNum
7510: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 Args(interp, 1,
7520: 6f 62 6a 76 2c 20 22 3f 6c 65 76 65 6c 3f 20 63 objv, "?level? c
7530: 6f 6d 6d 61 6e 64 20 3f 61 72 67 20 2e 2e 2e 3f ommand ?arg ...?
7540: 22 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 ");. return T
7550: 43 4c 5f 45 52 52 4f 52 3b 0a 7d 0a 0c 0a 2f 2a CL_ERROR;.}.../*
7560: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
7570: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7580: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7590: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
75a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 ---------. *. *
75b0: 54 63 6c 46 69 6e 64 50 72 6f 63 20 2d 2d 0a 20 TclFindProc --.
75c0: 2a 0a 20 2a 09 47 69 76 65 6e 20 74 68 65 20 6e *. *.Given the n
75d0: 61 6d 65 20 6f 66 20 61 20 70 72 6f 63 65 64 75 ame of a procedu
75e0: 72 65 2c 20 72 65 74 75 72 6e 20 61 20 70 6f 69 re, return a poi
75f0: 6e 74 65 72 20 74 6f 20 74 68 65 20 72 65 63 6f nter to the reco
7600: 72 64 0a 20 2a 09 64 65 73 63 72 69 62 69 6e 67 rd. *.describing
7610: 20 74 68 65 20 70 72 6f 63 65 64 75 72 65 2e 20 the procedure.
7620: 54 68 65 20 70 72 6f 63 65 64 75 72 65 20 77 69 The procedure wi
7630: 6c 6c 20 62 65 20 6c 6f 6f 6b 65 64 20 75 70 20 ll be looked up
7640: 75 73 69 6e 67 20 74 68 65 0a 20 2a 09 75 73 75 using the. *.usu
7650: 61 6c 20 72 75 6c 65 73 3a 20 66 69 72 73 74 20 al rules: first
7660: 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 6e in the current n
7670: 61 6d 65 73 70 61 63 65 20 61 6e 64 20 74 68 65 amespace and the
7680: 6e 20 69 6e 20 74 68 65 20 67 6c 6f 62 61 6c 0a n in the global.
7690: 20 2a 09 6e 61 6d 65 73 70 61 63 65 2e 0a 20 2a *.namespace.. *
76a0: 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 . * Results:. *.
76b0: 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64 NULL is returned
76c0: 20 69 66 20 74 68 65 20 6e 61 6d 65 20 64 6f 65 if the name doe
76d0: 73 6e 27 74 20 63 6f 72 72 65 73 70 6f 6e 64 20 sn't correspond
76e0: 74 6f 20 61 6e 79 20 70 72 6f 63 65 64 75 72 65 to any procedure
76f0: 2e 0a 20 2a 09 4f 74 68 65 72 77 69 73 65 2c 20 .. *.Otherwise,
7700: 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 the return value
7710: 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f is a pointer to
7720: 20 74 68 65 20 70 72 6f 63 65 64 75 72 65 27 73 the procedure's
7730: 20 72 65 63 6f 72 64 2e 20 49 66 0a 20 2a 09 74 record. If. *.t
7740: 68 65 20 6e 61 6d 65 20 69 73 20 66 6f 75 6e 64 he name is found
7750: 20 62 75 74 20 72 65 66 65 72 73 20 74 6f 20 61 but refers to a
7760: 6e 20 69 6d 70 6f 72 74 65 64 20 63 6f 6d 6d 61 n imported comma
7770: 6e 64 20 74 68 61 74 20 70 6f 69 6e 74 73 20 74 nd that points t
7780: 6f 20 61 0a 20 2a 09 22 72 65 61 6c 22 20 70 72 o a. *."real" pr
7790: 6f 63 65 64 75 72 65 20 64 65 66 69 6e 65 64 20 ocedure defined
77a0: 69 6e 20 61 6e 6f 74 68 65 72 20 6e 61 6d 65 73 in another names
77b0: 70 61 63 65 2c 20 61 20 70 6f 69 6e 74 65 72 20 pace, a pointer
77c0: 74 6f 20 74 68 61 74 0a 20 2a 09 22 72 65 61 6c to that. *."real
77d0: 22 20 70 72 6f 63 65 64 75 72 65 27 73 20 73 74 " procedure's st
77e0: 72 75 63 74 75 72 65 20 69 73 20 72 65 74 75 72 ructure is retur
77f0: 6e 65 64 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 ned.. *. * Side
7800: 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e 6f 6e 65 effects:. *.None
7810: 2e 0a 20 2a 0a 20 2a 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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
7860: 2f 0a 0a 50 72 6f 63 20 2a 0a 54 63 6c 46 69 6e /..Proc *.TclFin
7870: 64 50 72 6f 63 28 0a 20 20 20 20 49 6e 74 65 72 dProc(. Inter
7880: 70 20 2a 69 50 74 72 2c 09 09 2f 2a 20 49 6e 74 p *iPtr,../* Int
7890: 65 72 70 72 65 74 65 72 20 69 6e 20 77 68 69 63 erpreter in whic
78a0: 68 20 74 6f 20 6c 6f 6f 6b 2e 20 2a 2f 0a 20 20 h to look. */.
78b0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 70 72 const char *pr
78c0: 6f 63 4e 61 6d 65 29 09 2f 2a 20 4e 61 6d 65 20 ocName)./* Name
78d0: 6f 66 20 64 65 73 69 72 65 64 20 70 72 6f 63 65 of desired proce
78e0: 64 75 72 65 2e 20 2a 2f 0a 7b 0a 20 20 20 20 54 dure. */.{. T
78f0: 63 6c 5f 43 6f 6d 6d 61 6e 64 20 63 6d 64 3b 0a cl_Command cmd;.
7900: 20 20 20 20 43 6f 6d 6d 61 6e 64 20 2a 63 6d 64 Command *cmd
7910: 50 74 72 3b 0a 0a 20 20 20 20 63 6d 64 20 3d 20 Ptr;.. cmd =
7920: 54 63 6c 5f 46 69 6e 64 43 6f 6d 6d 61 6e 64 28 Tcl_FindCommand(
7930: 28 54 63 6c 5f 49 6e 74 65 72 70 20 2a 29 20 69 (Tcl_Interp *) i
7940: 50 74 72 2c 20 70 72 6f 63 4e 61 6d 65 2c 20 4e Ptr, procName, N
7950: 55 4c 4c 2c 20 2f 2a 66 6c 61 67 73 2a 2f 20 30 ULL, /*flags*/ 0
7960: 29 3b 0a 20 20 20 20 69 66 20 28 63 6d 64 20 3d );. if (cmd =
7970: 3d 20 28 54 63 6c 5f 43 6f 6d 6d 61 6e 64 29 20 = (Tcl_Command)
7980: 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 NULL) {..return
7990: 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 20 20 NULL;. }.
79a0: 63 6d 64 50 74 72 20 3d 20 28 43 6f 6d 6d 61 6e cmdPtr = (Comman
79b0: 64 20 2a 29 20 63 6d 64 3b 0a 0a 20 20 20 20 72 d *) cmd;.. r
79c0: 65 74 75 72 6e 20 54 63 6c 49 73 50 72 6f 63 28 eturn TclIsProc(
79d0: 63 6d 64 50 74 72 29 3b 0a 7d 0a 0c 0a 2f 2a 0a cmdPtr);.}.../*.
79e0: 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
79f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7a00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7a10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7a20: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 --------. *. * T
7a30: 63 6c 49 73 50 72 6f 63 20 2d 2d 0a 20 2a 0a 20 clIsProc --. *.
7a40: 2a 09 54 65 6c 6c 73 20 77 68 65 74 68 65 72 20 *.Tells whether
7a50: 61 20 63 6f 6d 6d 61 6e 64 20 69 73 20 61 20 54 a command is a T
7a60: 63 6c 20 70 72 6f 63 65 64 75 72 65 20 6f 72 20 cl procedure or
7a70: 6e 6f 74 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c not.. *. * Resul
7a80: 74 73 3a 0a 20 2a 09 49 66 20 74 68 65 20 67 69 ts:. *.If the gi
7a90: 76 65 6e 20 63 6f 6d 6d 61 6e 64 20 69 73 20 61 ven command is a
7aa0: 63 74 75 61 6c 6c 79 20 61 20 54 63 6c 20 70 72 ctually a Tcl pr
7ab0: 6f 63 65 64 75 72 65 2c 20 74 68 65 20 72 65 74 ocedure, the ret
7ac0: 75 72 6e 20 76 61 6c 75 65 20 69 73 0a 20 2a 09 urn value is. *.
7ad0: 74 68 65 20 61 64 64 72 65 73 73 20 6f 66 20 74 the address of t
7ae0: 68 65 20 72 65 63 6f 72 64 20 64 65 73 63 72 69 he record descri
7af0: 62 69 6e 67 20 74 68 65 20 70 72 6f 63 65 64 75 bing the procedu
7b00: 72 65 2e 20 4f 74 68 65 72 77 69 73 65 20 74 68 re. Otherwise th
7b10: 65 0a 20 2a 09 72 65 74 75 72 6e 20 76 61 6c 75 e. *.return valu
7b20: 65 20 69 73 20 30 2e 0a 20 2a 0a 20 2a 20 53 69 e is 0.. *. * Si
7b30: 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e de effects:. *.N
7b40: 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d one.. *. *------
7b50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7b60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7b70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7b80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7b90: 0a 20 2a 2f 0a 0a 50 72 6f 63 20 2a 0a 54 63 6c . */..Proc *.Tcl
7ba0: 49 73 50 72 6f 63 28 0a 20 20 20 20 43 6f 6d 6d IsProc(. Comm
7bb0: 61 6e 64 20 2a 63 6d 64 50 74 72 29 09 09 2f 2a and *cmdPtr)../*
7bc0: 20 43 6f 6d 6d 61 6e 64 20 74 6f 20 74 65 73 74 Command to test
7bd0: 2e 20 2a 2f 0a 7b 0a 20 20 20 20 54 63 6c 5f 43 . */.{. Tcl_C
7be0: 6f 6d 6d 61 6e 64 20 6f 72 69 67 43 6d 64 20 3d ommand origCmd =
7bf0: 20 54 63 6c 47 65 74 4f 72 69 67 69 6e 61 6c 43 TclGetOriginalC
7c00: 6f 6d 6d 61 6e 64 28 28 54 63 6c 5f 43 6f 6d 6d ommand((Tcl_Comm
7c10: 61 6e 64 29 20 63 6d 64 50 74 72 29 3b 0a 0a 20 and) cmdPtr);..
7c20: 20 20 20 69 66 20 28 6f 72 69 67 43 6d 64 20 21 if (origCmd !
7c30: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 63 6d 64 50 74 = NULL) {..cmdPt
7c40: 72 20 3d 20 28 43 6f 6d 6d 61 6e 64 20 2a 29 20 r = (Command *)
7c50: 6f 72 69 67 43 6d 64 3b 0a 20 20 20 20 7d 0a 20 origCmd;. }.
7c60: 20 20 20 69 66 20 28 63 6d 64 50 74 72 2d 3e 64 if (cmdPtr->d
7c70: 65 6c 65 74 65 50 72 6f 63 20 3d 3d 20 54 63 6c eleteProc == Tcl
7c80: 50 72 6f 63 44 65 6c 65 74 65 50 72 6f 63 29 20 ProcDeleteProc)
7c90: 7b 0a 09 72 65 74 75 72 6e 20 28 50 72 6f 63 20 {..return (Proc
7ca0: 2a 29 63 6d 64 50 74 72 2d 3e 6f 62 6a 43 6c 69 *)cmdPtr->objCli
7cb0: 65 6e 74 44 61 74 61 32 3b 0a 20 20 20 20 7d 0a entData2;. }.
7cc0: 20 20 20 20 72 65 74 75 72 6e 20 4e 55 4c 4c 3b return NULL;
7cd0: 0a 7d 0a 0c 0a 73 74 61 74 69 63 20 69 6e 74 0a .}...static int.
7ce0: 50 72 6f 63 57 72 6f 6e 67 4e 75 6d 41 72 67 73 ProcWrongNumArgs
7cf0: 28 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 (. Tcl_Interp
7d00: 20 2a 69 6e 74 65 72 70 2c 0a 20 20 20 20 54 63 *interp,. Tc
7d10: 6c 5f 53 69 7a 65 20 73 6b 69 70 29 0a 7b 0a 20 l_Size skip).{.
7d20: 20 20 20 43 61 6c 6c 46 72 61 6d 65 20 2a 66 72 CallFrame *fr
7d30: 61 6d 65 50 74 72 20 3d 20 28 28 49 6e 74 65 72 amePtr = ((Inter
7d40: 70 20 2a 29 69 6e 74 65 72 70 29 2d 3e 76 61 72 p *)interp)->var
7d50: 46 72 61 6d 65 50 74 72 3b 0a 20 20 20 20 50 72 FramePtr;. Pr
7d60: 6f 63 20 2a 70 72 6f 63 50 74 72 20 3d 20 66 72 oc *procPtr = fr
7d70: 61 6d 65 50 74 72 2d 3e 70 72 6f 63 50 74 72 3b amePtr->procPtr;
7d80: 0a 20 20 20 20 54 63 6c 5f 53 69 7a 65 20 6c 6f . Tcl_Size lo
7d90: 63 61 6c 43 74 20 3d 20 70 72 6f 63 50 74 72 2d calCt = procPtr-
7da0: 3e 6e 75 6d 43 6f 6d 70 69 6c 65 64 4c 6f 63 61 >numCompiledLoca
7db0: 6c 73 2c 20 6e 75 6d 41 72 67 73 2c 20 69 3b 0a ls, numArgs, i;.
7dc0: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a 64 65 Tcl_Obj **de
7dd0: 73 69 72 65 64 4f 62 6a 73 3b 0a 20 20 20 20 63 siredObjs;. c
7de0: 6f 6e 73 74 20 63 68 61 72 20 2a 66 69 6e 61 6c onst char *final
7df0: 20 3d 20 4e 55 4c 4c 3b 0a 0a 20 20 20 20 2f 2a = NULL;.. /*
7e00: 0a 20 20 20 20 20 2a 20 42 75 69 6c 64 20 75 70 . * Build up
7e10: 20 64 65 73 69 72 65 64 20 61 72 67 75 6d 65 6e desired argumen
7e20: 74 20 6c 69 73 74 20 66 6f 72 20 54 63 6c 5f 57 t list for Tcl_W
7e30: 72 6f 6e 67 4e 75 6d 41 72 67 73 0a 20 20 20 20 rongNumArgs.
7e40: 20 2a 2f 0a 0a 20 20 20 20 6e 75 6d 41 72 67 73 */.. numArgs
7e50: 20 3d 20 66 72 61 6d 65 50 74 72 2d 3e 70 72 6f = framePtr->pro
7e60: 63 50 74 72 2d 3e 6e 75 6d 41 72 67 73 3b 0a 20 cPtr->numArgs;.
7e70: 20 20 20 64 65 73 69 72 65 64 4f 62 6a 73 20 3d desiredObjs =
7e80: 20 28 54 63 6c 5f 4f 62 6a 20 2a 2a 29 54 63 6c (Tcl_Obj **)Tcl
7e90: 53 74 61 63 6b 41 6c 6c 6f 63 28 69 6e 74 65 72 StackAlloc(inter
7ea0: 70 2c 0a 09 20 20 20 20 73 69 7a 65 6f 66 28 54 p,.. sizeof(T
7eb0: 63 6c 5f 4f 62 6a 20 2a 29 20 2a 20 28 6e 75 6d cl_Obj *) * (num
7ec0: 41 72 67 73 2b 31 29 29 3b 0a 0a 20 20 20 20 69 Args+1));.. i
7ed0: 66 20 28 66 72 61 6d 65 50 74 72 2d 3e 69 73 50 f (framePtr->isP
7ee0: 72 6f 63 43 61 6c 6c 46 72 61 6d 65 20 26 20 46 rocCallFrame & F
7ef0: 52 41 4d 45 5f 49 53 5f 4c 41 4d 42 44 41 29 20 RAME_IS_LAMBDA)
7f00: 7b 0a 09 64 65 73 69 72 65 64 4f 62 6a 73 5b 30 {..desiredObjs[0
7f10: 5d 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e ] = Tcl_NewStrin
7f20: 67 4f 62 6a 28 22 6c 61 6d 62 64 61 45 78 70 72 gObj("lambdaExpr
7f30: 22 2c 20 2d 31 29 3b 0a 20 20 20 20 7d 20 65 6c ", -1);. } el
7f40: 73 65 20 7b 0a 09 64 65 73 69 72 65 64 4f 62 6a se {..desiredObj
7f50: 73 5b 30 5d 20 3d 20 66 72 61 6d 65 50 74 72 2d s[0] = framePtr-
7f60: 3e 6f 62 6a 76 5b 73 6b 69 70 2d 31 5d 3b 0a 20 >objv[skip-1];.
7f70: 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 49 6e 63 }. Tcl_Inc
7f80: 72 52 65 66 43 6f 75 6e 74 28 64 65 73 69 72 65 rRefCount(desire
7f90: 64 4f 62 6a 73 5b 30 5d 29 3b 0a 0a 20 20 20 20 dObjs[0]);..
7fa0: 69 66 20 28 6c 6f 63 61 6c 43 74 20 3e 20 30 29 if (localCt > 0)
7fb0: 20 7b 0a 09 56 61 72 20 2a 64 65 66 50 74 72 20 {..Var *defPtr
7fc0: 3d 20 28 56 61 72 20 2a 29 28 26 66 72 61 6d 65 = (Var *)(&frame
7fd0: 50 74 72 2d 3e 6c 6f 63 61 6c 43 61 63 68 65 50 Ptr->localCacheP
7fe0: 74 72 2d 3e 76 61 72 4e 61 6d 65 30 20 2b 20 6c tr->varName0 + l
7ff0: 6f 63 61 6c 43 74 29 3b 0a 0a 09 66 6f 72 20 28 ocalCt);...for (
8000: 69 3d 31 20 3b 20 69 3c 3d 6e 75 6d 41 72 67 73 i=1 ; i<=numArgs
8010: 20 3b 20 69 2b 2b 2c 20 64 65 66 50 74 72 2b 2b ; i++, defPtr++
8020: 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 4f 62 6a ) {.. Tcl_Obj
8030: 20 2a 61 72 67 4f 62 6a 3b 0a 09 20 20 20 20 54 *argObj;.. T
8040: 63 6c 5f 4f 62 6a 20 2a 6e 61 6d 65 50 74 72 20 cl_Obj *namePtr
8050: 3d 20 6c 6f 63 61 6c 4e 61 6d 65 28 66 72 61 6d = localName(fram
8060: 65 50 74 72 2c 20 69 2d 31 29 3b 0a 0a 09 20 20 ePtr, i-1);...
8070: 20 20 69 66 20 28 64 65 66 50 74 72 2d 3e 76 61 if (defPtr->va
8080: 6c 75 65 2e 6f 62 6a 50 74 72 20 21 3d 20 4e 55 lue.objPtr != NU
8090: 4c 4c 29 20 7b 0a 09 09 54 63 6c 4e 65 77 4f 62 LL) {...TclNewOb
80a0: 6a 28 61 72 67 4f 62 6a 29 3b 0a 09 09 54 63 6c j(argObj);...Tcl
80b0: 5f 41 70 70 65 6e 64 53 74 72 69 6e 67 73 54 6f _AppendStringsTo
80c0: 4f 62 6a 28 61 72 67 4f 62 6a 2c 20 22 3f 22 2c Obj(argObj, "?",
80d0: 20 54 63 6c 47 65 74 53 74 72 69 6e 67 28 6e 61 TclGetString(na
80e0: 6d 65 50 74 72 29 2c 20 22 3f 22 2c 0a 09 09 09 mePtr), "?",....
80f0: 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 (char *)NULL);..
8100: 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 64 } else if (d
8110: 65 66 50 74 72 2d 3e 66 6c 61 67 73 20 26 20 56 efPtr->flags & V
8120: 41 52 5f 49 53 5f 41 52 47 53 29 20 7b 0a 09 09 AR_IS_ARGS) {...
8130: 6e 75 6d 41 72 67 73 2d 2d 3b 0a 09 09 66 69 6e numArgs--;...fin
8140: 61 6c 20 3d 20 22 3f 61 72 67 20 2e 2e 2e 3f 22 al = "?arg ...?"
8150: 3b 0a 09 09 62 72 65 61 6b 3b 0a 09 20 20 20 20 ;...break;..
8160: 7d 20 65 6c 73 65 20 7b 0a 09 09 61 72 67 4f 62 } else {...argOb
8170: 6a 20 3d 20 6e 61 6d 65 50 74 72 3b 0a 09 09 54 j = namePtr;...T
8180: 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 cl_IncrRefCount(
8190: 6e 61 6d 65 50 74 72 29 3b 0a 09 20 20 20 20 7d namePtr);.. }
81a0: 0a 09 20 20 20 20 64 65 73 69 72 65 64 4f 62 6a .. desiredObj
81b0: 73 5b 69 5d 20 3d 20 61 72 67 4f 62 6a 3b 0a 09 s[i] = argObj;..
81c0: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 54 63 6c }. }.. Tcl
81d0: 5f 52 65 73 65 74 52 65 73 75 6c 74 28 69 6e 74 _ResetResult(int
81e0: 65 72 70 29 3b 0a 20 20 20 20 54 63 6c 5f 57 72 erp);. Tcl_Wr
81f0: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 ongNumArgs(inter
8200: 70 2c 20 6e 75 6d 41 72 67 73 2b 31 2c 20 64 65 p, numArgs+1, de
8210: 73 69 72 65 64 4f 62 6a 73 2c 20 66 69 6e 61 6c siredObjs, final
8220: 29 3b 0a 0a 20 20 20 20 66 6f 72 20 28 69 3d 30 );.. for (i=0
8230: 20 3b 20 69 3c 3d 6e 75 6d 41 72 67 73 20 3b 20 ; i<=numArgs ;
8240: 69 2b 2b 29 20 7b 0a 09 54 63 6c 5f 44 65 63 72 i++) {..Tcl_Decr
8250: 52 65 66 43 6f 75 6e 74 28 64 65 73 69 72 65 64 RefCount(desired
8260: 4f 62 6a 73 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a Objs[i]);. }.
8270: 20 20 20 20 54 63 6c 53 74 61 63 6b 46 72 65 65 TclStackFree
8280: 28 69 6e 74 65 72 70 2c 20 64 65 73 69 72 65 64 (interp, desired
8290: 4f 62 6a 73 29 3b 0a 20 20 20 20 72 65 74 75 72 Objs);. retur
82a0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 7d 0a 0c n TCL_ERROR;.}..
82b0: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ./*. *----------
82c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
82d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
82e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
82f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a ------------. *.
8300: 20 2a 20 49 6e 69 74 52 65 73 6f 6c 76 65 64 4c * InitResolvedL
8310: 6f 63 61 6c 73 20 2d 2d 0a 20 2a 0a 20 2a 09 54 ocals --. *. *.T
8320: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 69 his routine is i
8330: 6e 76 6f 6b 65 64 20 69 6e 20 6f 72 64 65 72 20 nvoked in order
8340: 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 to initialize th
8350: 65 20 63 6f 6d 70 69 6c 65 64 20 6c 6f 63 61 6c e compiled local
8360: 73 0a 20 2a 09 74 61 62 6c 65 20 66 6f 72 20 61 s. *.table for a
8370: 20 6e 65 77 20 63 61 6c 6c 20 66 72 61 6d 65 2e new call frame.
8380: 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a . *. * Results:.
8390: 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 20 53 *.None.. *. * S
83a0: 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 ide effects:. *.
83b0: 4d 61 79 20 69 6e 76 6f 6b 65 20 76 61 72 69 6f May invoke vario
83c0: 75 73 20 6e 61 6d 65 20 72 65 73 6f 6c 76 65 72 us name resolver
83d0: 73 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 64 65 s in order to de
83e0: 74 65 72 6d 69 6e 65 20 77 68 69 63 68 0a 20 2a termine which. *
83f0: 09 76 61 72 69 61 62 6c 65 73 20 61 72 65 20 62 .variables are b
8400: 65 69 6e 67 20 72 65 66 65 72 65 6e 63 65 64 20 eing referenced
8410: 61 74 20 72 75 6e 74 69 6d 65 2e 0a 20 2a 0a 20 at runtime.. *.
8420: 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
8430: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8440: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8450: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8460: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 -------. */..sta
8470: 74 69 63 20 76 6f 69 64 0a 49 6e 69 74 52 65 73 tic void.InitRes
8480: 6f 6c 76 65 64 4c 6f 63 61 6c 73 28 0a 20 20 20 olvedLocals(.
8490: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 Tcl_Interp *int
84a0: 65 72 70 2c 09 09 2f 2a 20 43 75 72 72 65 6e 74 erp,../* Current
84b0: 20 69 6e 74 65 72 70 72 65 74 65 72 2e 20 2a 2f interpreter. */
84c0: 0a 20 20 20 20 42 79 74 65 43 6f 64 65 20 2a 63 . ByteCode *c
84d0: 6f 64 65 50 74 72 2c 0a 20 20 20 20 56 61 72 20 odePtr,. Var
84e0: 2a 76 61 72 50 74 72 2c 0a 20 20 20 20 4e 61 6d *varPtr,. Nam
84f0: 65 73 70 61 63 65 20 2a 6e 73 50 74 72 29 09 09 espace *nsPtr)..
8500: 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 63 75 /* Pointer to cu
8510: 72 72 65 6e 74 20 6e 61 6d 65 73 70 61 63 65 2e rrent namespace.
8520: 20 2a 2f 0a 7b 0a 20 20 20 20 49 6e 74 65 72 70 */.{. Interp
8530: 20 2a 69 50 74 72 20 3d 20 28 49 6e 74 65 72 70 *iPtr = (Interp
8540: 20 2a 29 20 69 6e 74 65 72 70 3b 0a 20 20 20 20 *) interp;.
8550: 69 6e 74 20 68 61 76 65 52 65 73 6f 6c 76 65 72 int haveResolver
8560: 73 20 3d 20 28 6e 73 50 74 72 2d 3e 63 6f 6d 70 s = (nsPtr->comp
8570: 69 6c 65 64 56 61 72 52 65 73 50 72 6f 63 20 7c iledVarResProc |
8580: 7c 20 69 50 74 72 2d 3e 72 65 73 6f 6c 76 65 72 | iPtr->resolver
8590: 50 74 72 29 3b 0a 20 20 20 20 43 6f 6d 70 69 6c Ptr);. Compil
85a0: 65 64 4c 6f 63 61 6c 20 2a 66 69 72 73 74 4c 6f edLocal *firstLo
85b0: 63 61 6c 50 74 72 2c 20 2a 6c 6f 63 61 6c 50 74 calPtr, *localPt
85c0: 72 3b 0a 20 20 20 20 54 63 6c 5f 53 69 7a 65 20 r;. Tcl_Size
85d0: 76 61 72 4e 75 6d 3b 0a 20 20 20 20 54 63 6c 5f varNum;. Tcl_
85e0: 52 65 73 6f 6c 76 65 64 56 61 72 49 6e 66 6f 20 ResolvedVarInfo
85f0: 2a 72 65 73 56 61 72 49 6e 66 6f 3b 0a 0a 20 20 *resVarInfo;..
8600: 20 20 2f 2a 0a 20 20 20 20 20 2a 20 46 69 6e 64 /*. * Find
8610: 20 74 68 65 20 6c 6f 63 61 6c 50 74 72 20 63 6f the localPtr co
8620: 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 76 rresponding to v
8630: 61 72 50 74 72 0a 20 20 20 20 20 2a 2f 0a 0a 20 arPtr. */..
8640: 20 20 20 76 61 72 4e 75 6d 20 3d 20 76 61 72 50 varNum = varP
8650: 74 72 20 2d 20 69 50 74 72 2d 3e 66 72 61 6d 65 tr - iPtr->frame
8660: 50 74 72 2d 3e 63 6f 6d 70 69 6c 65 64 4c 6f 63 Ptr->compiledLoc
8670: 61 6c 73 3b 0a 20 20 20 20 6c 6f 63 61 6c 50 74 als;. localPt
8680: 72 20 3d 20 69 50 74 72 2d 3e 66 72 61 6d 65 50 r = iPtr->frameP
8690: 74 72 2d 3e 70 72 6f 63 50 74 72 2d 3e 66 69 72 tr->procPtr->fir
86a0: 73 74 4c 6f 63 61 6c 50 74 72 3b 0a 20 20 20 20 stLocalPtr;.
86b0: 77 68 69 6c 65 20 28 76 61 72 4e 75 6d 2d 2d 29 while (varNum--)
86c0: 20 7b 0a 09 6c 6f 63 61 6c 50 74 72 20 3d 20 6c {..localPtr = l
86d0: 6f 63 61 6c 50 74 72 2d 3e 6e 65 78 74 50 74 72 ocalPtr->nextPtr
86e0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 ;. }.. if
86f0: 28 21 28 68 61 76 65 52 65 73 6f 6c 76 65 72 73 (!(haveResolvers
8700: 20 26 26 20 28 63 6f 64 65 50 74 72 2d 3e 66 6c && (codePtr->fl
8710: 61 67 73 20 26 20 54 43 4c 5f 42 59 54 45 43 4f ags & TCL_BYTECO
8720: 44 45 5f 52 45 53 4f 4c 56 45 5f 56 41 52 53 29 DE_RESOLVE_VARS)
8730: 29 29 20 7b 0a 09 67 6f 74 6f 20 64 6f 49 6e 69 )) {..goto doIni
8740: 74 52 65 73 6f 6c 76 65 64 4c 6f 63 61 6c 73 3b tResolvedLocals;
8750: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 . }.. /*.
8760: 20 20 20 20 2a 20 54 68 69 73 20 69 73 20 74 68 * This is th
8770: 65 20 66 69 72 73 74 20 72 75 6e 20 61 66 74 65 e first run afte
8780: 72 20 61 20 72 65 63 6f 6d 70 69 6c 65 2c 20 6f r a recompile, o
8790: 72 20 65 6c 73 65 20 74 68 65 20 72 65 73 6f 6c r else the resol
87a0: 76 65 72 20 65 70 6f 63 68 0a 20 20 20 20 20 2a ver epoch. *
87b0: 20 68 61 73 20 63 68 61 6e 67 65 64 3a 20 75 70 has changed: up
87c0: 64 61 74 65 20 74 68 65 20 72 65 73 6f 6c 76 65 date the resolve
87d0: 72 20 63 61 63 68 65 2e 0a 20 20 20 20 20 2a 2f r cache.. */
87e0: 0a 0a 20 20 20 20 66 69 72 73 74 4c 6f 63 61 6c .. firstLocal
87f0: 50 74 72 20 3d 20 6c 6f 63 61 6c 50 74 72 3b 0a Ptr = localPtr;.
8800: 20 20 20 20 66 6f 72 20 28 3b 20 6c 6f 63 61 6c for (; local
8810: 50 74 72 20 21 3d 20 4e 55 4c 4c 3b 20 6c 6f 63 Ptr != NULL; loc
8820: 61 6c 50 74 72 20 3d 20 6c 6f 63 61 6c 50 74 72 alPtr = localPtr
8830: 2d 3e 6e 65 78 74 50 74 72 29 20 7b 0a 09 69 66 ->nextPtr) {..if
8840: 20 28 6c 6f 63 61 6c 50 74 72 2d 3e 72 65 73 6f (localPtr->reso
8850: 6c 76 65 49 6e 66 6f 29 20 7b 0a 09 20 20 20 20 lveInfo) {..
8860: 69 66 20 28 6c 6f 63 61 6c 50 74 72 2d 3e 72 65 if (localPtr->re
8870: 73 6f 6c 76 65 49 6e 66 6f 2d 3e 64 65 6c 65 74 solveInfo->delet
8880: 65 50 72 6f 63 29 20 7b 0a 09 09 6c 6f 63 61 6c eProc) {...local
8890: 50 74 72 2d 3e 72 65 73 6f 6c 76 65 49 6e 66 6f Ptr->resolveInfo
88a0: 2d 3e 64 65 6c 65 74 65 50 72 6f 63 28 6c 6f 63 ->deleteProc(loc
88b0: 61 6c 50 74 72 2d 3e 72 65 73 6f 6c 76 65 49 6e alPtr->resolveIn
88c0: 66 6f 29 3b 0a 09 20 20 20 20 7d 20 65 6c 73 65 fo);.. } else
88d0: 20 7b 0a 09 09 54 63 6c 5f 46 72 65 65 28 6c 6f {...Tcl_Free(lo
88e0: 63 61 6c 50 74 72 2d 3e 72 65 73 6f 6c 76 65 49 calPtr->resolveI
88f0: 6e 66 6f 29 3b 0a 09 20 20 20 20 7d 0a 09 20 20 nfo);.. }..
8900: 20 20 6c 6f 63 61 6c 50 74 72 2d 3e 72 65 73 6f localPtr->reso
8910: 6c 76 65 49 6e 66 6f 20 3d 20 4e 55 4c 4c 3b 0a lveInfo = NULL;.
8920: 09 7d 0a 09 6c 6f 63 61 6c 50 74 72 2d 3e 66 6c .}..localPtr->fl
8930: 61 67 73 20 26 3d 20 7e 56 41 52 5f 52 45 53 4f ags &= ~VAR_RESO
8940: 4c 56 45 44 3b 0a 0a 09 69 66 20 28 68 61 76 65 LVED;...if (have
8950: 52 65 73 6f 6c 76 65 72 73 20 26 26 0a 09 09 21 Resolvers &&...!
8960: 28 6c 6f 63 61 6c 50 74 72 2d 3e 66 6c 61 67 73 (localPtr->flags
8970: 20 26 20 28 56 41 52 5f 41 52 47 55 4d 45 4e 54 & (VAR_ARGUMENT
8980: 7c 56 41 52 5f 54 45 4d 50 4f 52 41 52 59 29 29 |VAR_TEMPORARY))
8990: 29 20 7b 0a 09 20 20 20 20 52 65 73 6f 6c 76 65 ) {.. Resolve
89a0: 72 53 63 68 65 6d 65 20 2a 72 65 73 50 74 72 20 rScheme *resPtr
89b0: 3d 20 69 50 74 72 2d 3e 72 65 73 6f 6c 76 65 72 = iPtr->resolver
89c0: 50 74 72 3b 0a 09 20 20 20 20 54 63 6c 5f 52 65 Ptr;.. Tcl_Re
89d0: 73 6f 6c 76 65 64 56 61 72 49 6e 66 6f 20 2a 76 solvedVarInfo *v
89e0: 69 6e 66 6f 3b 0a 09 20 20 20 20 69 6e 74 20 72 info;.. int r
89f0: 65 73 75 6c 74 3b 0a 0a 09 20 20 20 20 69 66 20 esult;... if
8a00: 28 6e 73 50 74 72 2d 3e 63 6f 6d 70 69 6c 65 64 (nsPtr->compiled
8a10: 56 61 72 52 65 73 50 72 6f 63 29 20 7b 0a 09 09 VarResProc) {...
8a20: 72 65 73 75 6c 74 20 3d 20 6e 73 50 74 72 2d 3e result = nsPtr->
8a30: 63 6f 6d 70 69 6c 65 64 56 61 72 52 65 73 50 72 compiledVarResPr
8a40: 6f 63 28 6e 73 50 74 72 2d 3e 69 6e 74 65 72 70 oc(nsPtr->interp
8a50: 2c 0a 09 09 09 6c 6f 63 61 6c 50 74 72 2d 3e 6e ,....localPtr->n
8a60: 61 6d 65 2c 20 6c 6f 63 61 6c 50 74 72 2d 3e 6e ame, localPtr->n
8a70: 61 6d 65 4c 65 6e 67 74 68 2c 0a 09 09 09 28 54 ameLength,....(T
8a80: 63 6c 5f 4e 61 6d 65 73 70 61 63 65 20 2a 29 20 cl_Namespace *)
8a90: 6e 73 50 74 72 2c 20 26 76 69 6e 66 6f 29 3b 0a nsPtr, &vinfo);.
8aa0: 09 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 09 . } else {...
8ab0: 72 65 73 75 6c 74 20 3d 20 54 43 4c 5f 43 4f 4e result = TCL_CON
8ac0: 54 49 4e 55 45 3b 0a 09 20 20 20 20 7d 0a 0a 09 TINUE;.. }...
8ad0: 20 20 20 20 77 68 69 6c 65 20 28 28 72 65 73 75 while ((resu
8ae0: 6c 74 20 3d 3d 20 54 43 4c 5f 43 4f 4e 54 49 4e lt == TCL_CONTIN
8af0: 55 45 29 20 26 26 20 72 65 73 50 74 72 29 20 7b UE) && resPtr) {
8b00: 0a 09 09 69 66 20 28 72 65 73 50 74 72 2d 3e 63 ...if (resPtr->c
8b10: 6f 6d 70 69 6c 65 64 56 61 72 52 65 73 50 72 6f ompiledVarResPro
8b20: 63 29 20 7b 0a 09 09 20 20 20 20 72 65 73 75 6c c) {... resul
8b30: 74 20 3d 20 72 65 73 50 74 72 2d 3e 63 6f 6d 70 t = resPtr->comp
8b40: 69 6c 65 64 56 61 72 52 65 73 50 72 6f 63 28 6e iledVarResProc(n
8b50: 73 50 74 72 2d 3e 69 6e 74 65 72 70 2c 0a 09 09 sPtr->interp,...
8b60: 09 20 20 20 20 6c 6f 63 61 6c 50 74 72 2d 3e 6e . localPtr->n
8b70: 61 6d 65 2c 20 6c 6f 63 61 6c 50 74 72 2d 3e 6e ame, localPtr->n
8b80: 61 6d 65 4c 65 6e 67 74 68 2c 0a 09 09 09 20 20 ameLength,....
8b90: 20 20 28 54 63 6c 5f 4e 61 6d 65 73 70 61 63 65 (Tcl_Namespace
8ba0: 20 2a 29 20 6e 73 50 74 72 2c 20 26 76 69 6e 66 *) nsPtr, &vinf
8bb0: 6f 29 3b 0a 09 09 7d 0a 09 09 72 65 73 50 74 72 o);...}...resPtr
8bc0: 20 3d 20 72 65 73 50 74 72 2d 3e 6e 65 78 74 50 = resPtr->nextP
8bd0: 74 72 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 tr;.. }..
8be0: 69 66 20 28 72 65 73 75 6c 74 20 3d 3d 20 54 43 if (result == TC
8bf0: 4c 5f 4f 4b 29 20 7b 0a 09 09 6c 6f 63 61 6c 50 L_OK) {...localP
8c00: 74 72 2d 3e 72 65 73 6f 6c 76 65 49 6e 66 6f 20 tr->resolveInfo
8c10: 3d 20 76 69 6e 66 6f 3b 0a 09 09 6c 6f 63 61 6c = vinfo;...local
8c20: 50 74 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 56 41 Ptr->flags |= VA
8c30: 52 5f 52 45 53 4f 4c 56 45 44 3b 0a 09 20 20 20 R_RESOLVED;..
8c40: 20 7d 0a 09 7d 0a 20 20 20 20 7d 0a 20 20 20 20 }..}. }.
8c50: 6c 6f 63 61 6c 50 74 72 20 3d 20 66 69 72 73 74 localPtr = first
8c60: 4c 6f 63 61 6c 50 74 72 3b 0a 20 20 20 20 63 6f LocalPtr;. co
8c70: 64 65 50 74 72 2d 3e 66 6c 61 67 73 20 26 3d 20 dePtr->flags &=
8c80: 7e 54 43 4c 5f 42 59 54 45 43 4f 44 45 5f 52 45 ~TCL_BYTECODE_RE
8c90: 53 4f 4c 56 45 5f 56 41 52 53 3b 0a 0a 20 20 20 SOLVE_VARS;..
8ca0: 20 2f 2a 0a 20 20 20 20 20 2a 20 49 6e 69 74 69 /*. * Initi
8cb0: 61 6c 69 7a 65 20 74 68 65 20 61 72 72 61 79 20 alize the array
8cc0: 6f 66 20 6c 6f 63 61 6c 20 76 61 72 69 61 62 6c of local variabl
8cd0: 65 73 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 es stored in the
8ce0: 20 63 61 6c 6c 20 66 72 61 6d 65 2e 20 53 6f 6d call frame. Som
8cf0: 65 0a 20 20 20 20 20 2a 20 76 61 72 69 61 62 6c e. * variabl
8d00: 65 73 20 6d 61 79 20 68 61 76 65 20 73 70 65 63 es may have spec
8d10: 69 61 6c 20 72 65 73 6f 6c 75 74 69 6f 6e 20 72 ial resolution r
8d20: 75 6c 65 73 2e 20 49 6e 20 74 68 61 74 20 63 61 ules. In that ca
8d30: 73 65 2c 20 77 65 20 63 61 6c 6c 0a 20 20 20 20 se, we call.
8d40: 20 2a 20 74 68 65 69 72 20 22 72 65 73 6f 6c 76 * their "resolv
8d50: 65 72 22 20 70 72 6f 63 73 20 74 6f 20 67 65 74 er" procs to get
8d60: 20 6f 75 72 20 68 61 6e 64 73 20 6f 6e 20 74 68 our hands on th
8d70: 65 20 76 61 72 69 61 62 6c 65 2c 20 61 6e 64 20 e variable, and
8d80: 77 65 20 6d 61 6b 65 0a 20 20 20 20 20 2a 20 74 we make. * t
8d90: 68 65 20 63 6f 6d 70 69 6c 65 64 20 6c 6f 63 61 he compiled loca
8da0: 6c 20 61 20 6c 69 6e 6b 20 74 6f 20 74 68 65 20 l a link to the
8db0: 72 65 61 6c 20 76 61 72 69 61 62 6c 65 2e 0a 20 real variable..
8dc0: 20 20 20 20 2a 2f 0a 0a 20 20 64 6f 49 6e 69 74 */.. doInit
8dd0: 52 65 73 6f 6c 76 65 64 4c 6f 63 61 6c 73 3a 0a ResolvedLocals:.
8de0: 20 20 20 20 66 6f 72 20 28 3b 20 6c 6f 63 61 6c for (; local
8df0: 50 74 72 20 21 3d 20 4e 55 4c 4c 3b 20 76 61 72 Ptr != NULL; var
8e00: 50 74 72 2b 2b 2c 20 6c 6f 63 61 6c 50 74 72 20 Ptr++, localPtr
8e10: 3d 20 6c 6f 63 61 6c 50 74 72 2d 3e 6e 65 78 74 = localPtr->next
8e20: 50 74 72 29 20 7b 0a 09 76 61 72 50 74 72 2d 3e Ptr) {..varPtr->
8e30: 66 6c 61 67 73 20 3d 20 30 3b 0a 09 76 61 72 50 flags = 0;..varP
8e40: 74 72 2d 3e 76 61 6c 75 65 2e 6f 62 6a 50 74 72 tr->value.objPtr
8e50: 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 2f 2a 0a 09 20 = NULL;.../*..
8e60: 2a 20 4e 6f 77 20 69 6e 76 6f 6b 65 20 74 68 65 * Now invoke the
8e70: 20 72 65 73 6f 6c 76 65 72 73 20 74 6f 20 64 65 resolvers to de
8e80: 74 65 72 6d 69 6e 65 20 74 68 65 20 65 78 61 63 termine the exac
8e90: 74 20 76 61 72 69 61 62 6c 65 73 20 74 68 61 74 t variables that
8ea0: 0a 09 20 2a 20 73 68 6f 75 6c 64 20 62 65 20 75 .. * should be u
8eb0: 73 65 64 2e 0a 09 20 2a 2f 0a 0a 09 72 65 73 56 sed... */...resV
8ec0: 61 72 49 6e 66 6f 20 3d 20 6c 6f 63 61 6c 50 74 arInfo = localPt
8ed0: 72 2d 3e 72 65 73 6f 6c 76 65 49 6e 66 6f 3b 0a r->resolveInfo;.
8ee0: 09 69 66 20 28 72 65 73 56 61 72 49 6e 66 6f 20 .if (resVarInfo
8ef0: 26 26 20 72 65 73 56 61 72 49 6e 66 6f 2d 3e 66 && resVarInfo->f
8f00: 65 74 63 68 50 72 6f 63 29 20 7b 0a 09 20 20 20 etchProc) {..
8f10: 20 56 61 72 20 2a 72 65 73 6f 6c 76 65 64 56 61 Var *resolvedVa
8f20: 72 50 74 72 20 3d 20 28 56 61 72 20 2a 29 0a 09 rPtr = (Var *)..
8f30: 09 20 20 20 20 72 65 73 56 61 72 49 6e 66 6f 2d . resVarInfo-
8f40: 3e 66 65 74 63 68 50 72 6f 63 28 69 6e 74 65 72 >fetchProc(inter
8f50: 70 2c 20 72 65 73 56 61 72 49 6e 66 6f 29 3b 0a p, resVarInfo);.
8f60: 0a 09 20 20 20 20 69 66 20 28 72 65 73 6f 6c 76 .. if (resolv
8f70: 65 64 56 61 72 50 74 72 29 20 7b 0a 09 09 69 66 edVarPtr) {...if
8f80: 20 28 54 63 6c 49 73 56 61 72 49 6e 48 61 73 68 (TclIsVarInHash
8f90: 28 72 65 73 6f 6c 76 65 64 56 61 72 50 74 72 29 (resolvedVarPtr)
8fa0: 29 20 7b 0a 09 09 20 20 20 20 56 61 72 48 61 73 ) {... VarHas
8fb0: 68 52 65 66 43 6f 75 6e 74 28 72 65 73 6f 6c 76 hRefCount(resolv
8fc0: 65 64 56 61 72 50 74 72 29 2b 2b 3b 0a 09 09 7d edVarPtr)++;...}
8fd0: 0a 09 09 76 61 72 50 74 72 2d 3e 66 6c 61 67 73 ...varPtr->flags
8fe0: 20 3d 20 56 41 52 5f 4c 49 4e 4b 3b 0a 09 09 76 = VAR_LINK;...v
8ff0: 61 72 50 74 72 2d 3e 76 61 6c 75 65 2e 6c 69 6e arPtr->value.lin
9000: 6b 50 74 72 20 3d 20 72 65 73 6f 6c 76 65 64 56 kPtr = resolvedV
9010: 61 72 50 74 72 3b 0a 09 20 20 20 20 7d 0a 09 7d arPtr;.. }..}
9020: 0a 20 20 20 20 7d 0a 7d 0a 0c 0a 76 6f 69 64 0a . }.}...void.
9030: 54 63 6c 46 72 65 65 4c 6f 63 61 6c 43 61 63 68 TclFreeLocalCach
9040: 65 28 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 e(. Tcl_Inter
9050: 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 20 20 4c p *interp,. L
9060: 6f 63 61 6c 43 61 63 68 65 20 2a 6c 6f 63 61 6c ocalCache *local
9070: 43 61 63 68 65 50 74 72 29 0a 7b 0a 20 20 20 20 CachePtr).{.
9080: 54 63 6c 5f 53 69 7a 65 20 69 3b 0a 20 20 20 20 Tcl_Size i;.
9090: 54 63 6c 5f 4f 62 6a 20 2a 2a 6e 61 6d 65 50 74 Tcl_Obj **namePt
90a0: 72 50 74 72 20 3d 20 26 6c 6f 63 61 6c 43 61 63 rPtr = &localCac
90b0: 68 65 50 74 72 2d 3e 76 61 72 4e 61 6d 65 30 3b hePtr->varName0;
90c0: 0a 0a 20 20 20 20 66 6f 72 20 28 69 20 3d 20 30 .. for (i = 0
90d0: 3b 20 69 20 3c 20 6c 6f 63 61 6c 43 61 63 68 65 ; i < localCache
90e0: 50 74 72 2d 3e 6e 75 6d 56 61 72 73 3b 20 69 2b Ptr->numVars; i+
90f0: 2b 2c 20 6e 61 6d 65 50 74 72 50 74 72 2b 2b 29 +, namePtrPtr++)
9100: 20 7b 0a 09 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a {..Tcl_Obj *obj
9110: 50 74 72 20 3d 20 2a 6e 61 6d 65 50 74 72 50 74 Ptr = *namePtrPt
9120: 72 3b 0a 0a 09 69 66 20 28 6f 62 6a 50 74 72 29 r;...if (objPtr)
9130: 20 7b 0a 09 20 20 20 20 2f 2a 20 54 63 6c 52 65 {.. /* TclRe
9140: 6c 65 61 73 65 4c 69 74 65 72 61 6c 20 63 61 6c leaseLiteral cal
9150: 6c 73 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f ls Tcl_DecrRefCo
9160: 75 6e 74 20 66 6f 72 20 75 73 20 2a 2f 0a 09 20 unt for us */..
9170: 20 20 20 54 63 6c 52 65 6c 65 61 73 65 4c 69 74 TclReleaseLit
9180: 65 72 61 6c 28 69 6e 74 65 72 70 2c 20 6f 62 6a eral(interp, obj
9190: 50 74 72 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 20 Ptr);..}. }.
91a0: 20 20 20 54 63 6c 5f 46 72 65 65 28 6c 6f 63 61 Tcl_Free(loca
91b0: 6c 43 61 63 68 65 50 74 72 29 3b 0a 7d 0a 0c 0a lCachePtr);.}...
91c0: 73 74 61 74 69 63 20 76 6f 69 64 0a 49 6e 69 74 static void.Init
91d0: 4c 6f 63 61 6c 43 61 63 68 65 28 0a 20 20 20 20 LocalCache(.
91e0: 50 72 6f 63 20 2a 70 72 6f 63 50 74 72 29 0a 7b Proc *procPtr).{
91f0: 0a 20 20 20 20 49 6e 74 65 72 70 20 2a 69 50 74 . Interp *iPt
9200: 72 20 3d 20 70 72 6f 63 50 74 72 2d 3e 69 50 74 r = procPtr->iPt
9210: 72 3b 0a 20 20 20 20 42 79 74 65 43 6f 64 65 20 r;. ByteCode
9220: 2a 63 6f 64 65 50 74 72 3b 0a 20 20 20 20 54 63 *codePtr;. Tc
9230: 6c 5f 53 69 7a 65 20 6c 6f 63 61 6c 43 74 20 3d l_Size localCt =
9240: 20 70 72 6f 63 50 74 72 2d 3e 6e 75 6d 43 6f 6d procPtr->numCom
9250: 70 69 6c 65 64 4c 6f 63 61 6c 73 3b 0a 20 20 20 piledLocals;.
9260: 20 54 63 6c 5f 53 69 7a 65 20 6e 75 6d 41 72 67 Tcl_Size numArg
9270: 73 20 3d 20 70 72 6f 63 50 74 72 2d 3e 6e 75 6d s = procPtr->num
9280: 41 72 67 73 2c 20 69 20 3d 20 30 3b 0a 0a 20 20 Args, i = 0;..
9290: 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a 6e 61 6d 65 Tcl_Obj **name
92a0: 50 74 72 3b 0a 20 20 20 20 56 61 72 20 2a 76 61 Ptr;. Var *va
92b0: 72 50 74 72 3b 0a 20 20 20 20 4c 6f 63 61 6c 43 rPtr;. LocalC
92c0: 61 63 68 65 20 2a 6c 6f 63 61 6c 43 61 63 68 65 ache *localCache
92d0: 50 74 72 3b 0a 20 20 20 20 43 6f 6d 70 69 6c 65 Ptr;. Compile
92e0: 64 4c 6f 63 61 6c 20 2a 6c 6f 63 61 6c 50 74 72 dLocal *localPtr
92f0: 3b 0a 20 20 20 20 69 6e 74 20 69 73 4e 65 77 3b ;. int isNew;
9300: 0a 0a 20 20 20 20 42 79 74 65 43 6f 64 65 47 65 .. ByteCodeGe
9310: 74 49 6e 74 65 72 6e 61 6c 52 65 70 28 70 72 6f tInternalRep(pro
9320: 63 50 74 72 2d 3e 62 6f 64 79 50 74 72 2c 20 26 cPtr->bodyPtr, &
9330: 74 63 6c 42 79 74 65 43 6f 64 65 54 79 70 65 2c tclByteCodeType,
9340: 20 63 6f 64 65 50 74 72 29 3b 0a 0a 20 20 20 20 codePtr);..
9350: 2f 2a 0a 20 20 20 20 20 2a 20 43 61 63 68 65 20 /*. * Cache
9360: 74 68 65 20 6e 61 6d 65 73 20 61 6e 64 20 69 6e the names and in
9370: 69 74 69 61 6c 20 76 61 6c 75 65 73 20 6f 66 20 itial values of
9380: 6c 6f 63 61 6c 20 76 61 72 69 61 62 6c 65 73 3b local variables;
9390: 20 73 74 6f 72 65 20 74 68 65 0a 20 20 20 20 20 store the.
93a0: 2a 20 63 61 63 68 65 20 69 6e 20 62 6f 74 68 20 * cache in both
93b0: 74 68 65 20 66 72 61 6d 65 50 74 72 20 66 6f 72 the framePtr for
93c0: 20 74 68 69 73 20 65 78 65 63 75 74 69 6f 6e 20 this execution
93d0: 61 6e 64 20 69 6e 20 74 68 65 20 63 6f 64 65 50 and in the codeP
93e0: 74 72 0a 20 20 20 20 20 2a 20 66 6f 72 20 66 75 tr. * for fu
93f0: 74 75 72 65 20 63 61 6c 6c 73 2e 0a 20 20 20 20 ture calls..
9400: 20 2a 2f 0a 0a 20 20 20 20 6c 6f 63 61 6c 43 61 */.. localCa
9410: 63 68 65 50 74 72 20 3d 20 28 4c 6f 63 61 6c 43 chePtr = (LocalC
9420: 61 63 68 65 20 2a 29 54 63 6c 5f 41 6c 6c 6f 63 ache *)Tcl_Alloc
9430: 28 6f 66 66 73 65 74 6f 66 28 4c 6f 63 61 6c 43 (offsetof(LocalC
9440: 61 63 68 65 2c 20 76 61 72 4e 61 6d 65 30 29 0a ache, varName0).
9450: 09 20 20 20 20 2b 20 6c 6f 63 61 6c 43 74 20 2a . + localCt *
9460: 20 73 69 7a 65 6f 66 28 54 63 6c 5f 4f 62 6a 20 sizeof(Tcl_Obj
9470: 2a 29 0a 09 20 20 20 20 2b 20 6e 75 6d 41 72 67 *).. + numArg
9480: 73 20 2a 20 73 69 7a 65 6f 66 28 56 61 72 29 29 s * sizeof(Var))
9490: 3b 0a 0a 20 20 20 20 6e 61 6d 65 50 74 72 20 3d ;.. namePtr =
94a0: 20 26 6c 6f 63 61 6c 43 61 63 68 65 50 74 72 2d &localCachePtr-
94b0: 3e 76 61 72 4e 61 6d 65 30 3b 0a 20 20 20 20 76 >varName0;. v
94c0: 61 72 50 74 72 20 3d 20 28 56 61 72 20 2a 29 20 arPtr = (Var *)
94d0: 28 6e 61 6d 65 50 74 72 20 2b 20 6c 6f 63 61 6c (namePtr + local
94e0: 43 74 29 3b 0a 20 20 20 20 6c 6f 63 61 6c 50 74 Ct);. localPt
94f0: 72 20 3d 20 70 72 6f 63 50 74 72 2d 3e 66 69 72 r = procPtr->fir
9500: 73 74 4c 6f 63 61 6c 50 74 72 3b 0a 20 20 20 20 stLocalPtr;.
9510: 77 68 69 6c 65 20 28 6c 6f 63 61 6c 50 74 72 29 while (localPtr)
9520: 20 7b 0a 09 69 66 20 28 54 63 6c 49 73 56 61 72 {..if (TclIsVar
9530: 54 65 6d 70 6f 72 61 72 79 28 6c 6f 63 61 6c 50 Temporary(localP
9540: 74 72 29 29 20 7b 0a 09 20 20 20 20 2a 6e 61 6d tr)) {.. *nam
9550: 65 50 74 72 20 3d 20 4e 55 4c 4c 3b 0a 09 7d 20 ePtr = NULL;..}
9560: 65 6c 73 65 20 7b 0a 09 20 20 20 20 2a 6e 61 6d else {.. *nam
9570: 65 50 74 72 20 3d 20 54 63 6c 43 72 65 61 74 65 ePtr = TclCreate
9580: 4c 69 74 65 72 61 6c 28 69 50 74 72 2c 20 6c 6f Literal(iPtr, lo
9590: 63 61 6c 50 74 72 2d 3e 6e 61 6d 65 2c 0a 09 09 calPtr->name,...
95a0: 20 20 20 20 6c 6f 63 61 6c 50 74 72 2d 3e 6e 61 localPtr->na
95b0: 6d 65 4c 65 6e 67 74 68 2c 20 2f 2a 20 68 61 73 meLength, /* has
95c0: 68 20 2a 2f 20 54 43 4c 5f 49 4e 44 45 58 5f 4e h */ TCL_INDEX_N
95d0: 4f 4e 45 2c 0a 09 09 20 20 20 20 26 69 73 4e 65 ONE,... &isNe
95e0: 77 2c 20 2f 2a 20 6e 73 50 74 72 20 2a 2f 20 4e w, /* nsPtr */ N
95f0: 55 4c 4c 2c 20 30 2c 20 4e 55 4c 4c 29 3b 0a 09 ULL, 0, NULL);..
9600: 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 Tcl_IncrRefC
9610: 6f 75 6e 74 28 2a 6e 61 6d 65 50 74 72 29 3b 0a ount(*namePtr);.
9620: 09 7d 0a 0a 09 69 66 20 28 69 20 3c 20 6e 75 6d .}...if (i < num
9630: 41 72 67 73 29 20 7b 0a 09 20 20 20 20 76 61 72 Args) {.. var
9640: 50 74 72 2d 3e 66 6c 61 67 73 20 3d 20 28 6c 6f Ptr->flags = (lo
9650: 63 61 6c 50 74 72 2d 3e 66 6c 61 67 73 20 26 20 calPtr->flags &
9660: 56 41 52 5f 49 53 5f 41 52 47 53 29 3b 0a 09 20 VAR_IS_ARGS);..
9670: 20 20 20 76 61 72 50 74 72 2d 3e 76 61 6c 75 65 varPtr->value
9680: 2e 6f 62 6a 50 74 72 20 3d 20 6c 6f 63 61 6c 50 .objPtr = localP
9690: 74 72 2d 3e 64 65 66 56 61 6c 75 65 50 74 72 3b tr->defValuePtr;
96a0: 0a 09 20 20 20 20 76 61 72 50 74 72 2b 2b 3b 0a .. varPtr++;.
96b0: 09 20 20 20 20 69 2b 2b 3b 0a 09 7d 0a 09 6e 61 . i++;..}..na
96c0: 6d 65 50 74 72 2b 2b 3b 0a 09 6c 6f 63 61 6c 50 mePtr++;..localP
96d0: 74 72 20 3d 20 6c 6f 63 61 6c 50 74 72 2d 3e 6e tr = localPtr->n
96e0: 65 78 74 50 74 72 3b 0a 20 20 20 20 7d 0a 20 20 extPtr;. }.
96f0: 20 20 63 6f 64 65 50 74 72 2d 3e 6c 6f 63 61 6c codePtr->local
9700: 43 61 63 68 65 50 74 72 20 3d 20 6c 6f 63 61 6c CachePtr = local
9710: 43 61 63 68 65 50 74 72 3b 0a 20 20 20 20 6c 6f CachePtr;. lo
9720: 63 61 6c 43 61 63 68 65 50 74 72 2d 3e 72 65 66 calCachePtr->ref
9730: 43 6f 75 6e 74 20 3d 20 31 3b 0a 20 20 20 20 6c Count = 1;. l
9740: 6f 63 61 6c 43 61 63 68 65 50 74 72 2d 3e 6e 75 ocalCachePtr->nu
9750: 6d 56 61 72 73 20 3d 20 6c 6f 63 61 6c 43 74 3b mVars = localCt;
9760: 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d .}.../*. *------
9770: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9780: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9790: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
97a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
97b0: 0a 20 2a 0a 20 2a 20 49 6e 69 74 41 72 67 73 41 . *. * InitArgsA
97c0: 6e 64 4c 6f 63 61 6c 73 20 2d 2d 0a 20 2a 0a 20 ndLocals --. *.
97d0: 2a 09 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 *.This routine i
97e0: 73 20 69 6e 76 6f 6b 65 64 20 69 6e 20 6f 72 64 s invoked in ord
97f0: 65 72 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65 er to initialize
9800: 20 74 68 65 20 61 72 67 75 6d 65 6e 74 73 20 61 the arguments a
9810: 6e 64 20 6f 74 68 65 72 0a 20 2a 09 63 6f 6d 70 nd other. *.comp
9820: 69 6c 65 64 20 6c 6f 63 61 6c 73 20 74 61 62 6c iled locals tabl
9830: 65 20 66 6f 72 20 61 20 6e 65 77 20 63 61 6c 6c e for a new call
9840: 20 66 72 61 6d 65 2e 0a 20 2a 0a 20 2a 20 52 65 frame.. *. * Re
9850: 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 74 61 6e sults:. *.A stan
9860: 64 61 72 64 20 54 63 6c 20 72 65 73 75 6c 74 2e dard Tcl result.
9870: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 . *. * Side effe
9880: 63 74 73 3a 0a 20 2a 09 41 6c 6c 6f 63 61 74 65 cts:. *.Allocate
9890: 73 20 6d 65 6d 6f 72 79 20 6f 6e 20 74 68 65 20 s memory on the
98a0: 73 74 61 63 6b 20 66 6f 72 20 74 68 65 20 63 6f stack for the co
98b0: 6d 70 69 6c 65 64 20 6c 6f 63 61 6c 20 76 61 72 mpiled local var
98c0: 69 61 62 6c 65 73 2c 20 74 68 65 0a 20 2a 09 63 iables, the. *.c
98d0: 61 6c 6c 65 72 20 69 73 20 72 65 73 70 6f 6e 73 aller is respons
98e0: 69 62 6c 65 20 66 6f 72 20 66 72 65 65 69 6e 67 ible for freeing
98f0: 20 74 68 65 6d 2e 20 49 6e 69 74 69 61 6c 69 73 them. Initialis
9900: 65 73 20 61 6c 6c 20 76 61 72 69 61 62 6c 65 73 es all variables
9910: 2e 20 4d 61 79 0a 20 2a 09 69 6e 76 6f 6b 65 20 . May. *.invoke
9920: 76 61 72 69 6f 75 73 20 6e 61 6d 65 20 72 65 73 various name res
9930: 6f 6c 76 65 72 73 20 69 6e 20 6f 72 64 65 72 20 olvers in order
9940: 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 77 68 69 to determine whi
9950: 63 68 20 76 61 72 69 61 62 6c 65 73 0a 20 2a 09 ch variables. *.
9960: 61 72 65 20 62 65 69 6e 67 20 72 65 66 65 72 65 are being refere
9970: 6e 63 65 64 20 61 74 20 72 75 6e 74 69 6d 65 2e nced at runtime.
9980: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *. *----------
9990: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
99a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
99b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
99c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f ------------. */
99d0: 0a 0a 73 74 61 74 69 63 20 69 6e 74 0a 49 6e 69 ..static int.Ini
99e0: 74 41 72 67 73 41 6e 64 4c 6f 63 61 6c 73 28 0a tArgsAndLocals(.
99f0: 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a Tcl_Interp *
9a00: 69 6e 74 65 72 70 2c 09 09 2f 2a 20 49 6e 74 65 interp,../* Inte
9a10: 72 70 72 65 74 65 72 20 69 6e 20 77 68 69 63 68 rpreter in which
9a20: 20 70 72 6f 63 65 64 75 72 65 20 77 61 73 0a 09 procedure was..
9a30: 09 09 09 20 2a 20 69 6e 76 6f 6b 65 64 2e 20 2a ... * invoked. *
9a40: 2f 0a 20 20 20 20 54 63 6c 5f 53 69 7a 65 20 73 /. Tcl_Size s
9a50: 6b 69 70 29 09 09 2f 2a 20 4e 75 6d 62 65 72 20 kip)../* Number
9a60: 6f 66 20 69 6e 69 74 69 61 6c 20 61 72 67 75 6d of initial argum
9a70: 65 6e 74 73 20 74 6f 20 62 65 20 73 6b 69 70 70 ents to be skipp
9a80: 65 64 2c 0a 09 09 09 09 20 2a 20 69 2e 65 2e 2c ed,..... * i.e.,
9a90: 20 77 6f 72 64 73 20 69 6e 20 74 68 65 20 22 63 words in the "c
9aa0: 6f 6d 6d 61 6e 64 20 6e 61 6d 65 22 2e 20 2a 2f ommand name". */
9ab0: 0a 7b 0a 20 20 20 20 43 61 6c 6c 46 72 61 6d 65 .{. CallFrame
9ac0: 20 2a 66 72 61 6d 65 50 74 72 20 3d 20 28 28 49 *framePtr = ((I
9ad0: 6e 74 65 72 70 20 2a 29 69 6e 74 65 72 70 29 2d nterp *)interp)-
9ae0: 3e 76 61 72 46 72 61 6d 65 50 74 72 3b 0a 20 20 >varFramePtr;.
9af0: 20 20 50 72 6f 63 20 2a 70 72 6f 63 50 74 72 20 Proc *procPtr
9b00: 3d 20 66 72 61 6d 65 50 74 72 2d 3e 70 72 6f 63 = framePtr->proc
9b10: 50 74 72 3b 0a 20 20 20 20 42 79 74 65 43 6f 64 Ptr;. ByteCod
9b20: 65 20 2a 63 6f 64 65 50 74 72 3b 0a 20 20 20 20 e *codePtr;.
9b30: 56 61 72 20 2a 76 61 72 50 74 72 2c 20 2a 64 65 Var *varPtr, *de
9b40: 66 50 74 72 3b 0a 20 20 20 20 54 63 6c 5f 53 69 fPtr;. Tcl_Si
9b50: 7a 65 20 6c 6f 63 61 6c 43 74 20 3d 20 70 72 6f ze localCt = pro
9b60: 63 50 74 72 2d 3e 6e 75 6d 43 6f 6d 70 69 6c 65 cPtr->numCompile
9b70: 64 4c 6f 63 61 6c 73 2c 20 6e 75 6d 41 72 67 73 dLocals, numArgs
9b80: 2c 20 61 72 67 43 74 2c 20 69 2c 20 69 6d 61 78 , argCt, i, imax
9b90: 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 ;. Tcl_Obj *c
9ba0: 6f 6e 73 74 20 2a 61 72 67 4f 62 6a 73 3b 0a 0a onst *argObjs;..
9bb0: 20 20 20 20 42 79 74 65 43 6f 64 65 47 65 74 49 ByteCodeGetI
9bc0: 6e 74 65 72 6e 61 6c 52 65 70 28 70 72 6f 63 50 nternalRep(procP
9bd0: 74 72 2d 3e 62 6f 64 79 50 74 72 2c 20 26 74 63 tr->bodyPtr, &tc
9be0: 6c 42 79 74 65 43 6f 64 65 54 79 70 65 2c 20 63 lByteCodeType, c
9bf0: 6f 64 65 50 74 72 29 3b 0a 0a 20 20 20 20 2f 2a odePtr);.. /*
9c00: 0a 20 20 20 20 20 2a 20 4d 61 6b 65 20 73 75 72 . * Make sur
9c10: 65 20 74 68 61 74 20 74 68 65 20 6c 6f 63 61 6c e that the local
9c20: 20 63 61 63 68 65 20 6f 66 20 76 61 72 69 61 62 cache of variab
9c30: 6c 65 20 6e 61 6d 65 73 20 61 6e 64 20 69 6e 69 le names and ini
9c40: 74 69 61 6c 20 76 61 6c 75 65 73 20 68 61 73 0a tial values has.
9c50: 20 20 20 20 20 2a 20 62 65 65 6e 20 69 6e 69 74 * been init
9c60: 69 61 6c 69 73 65 64 20 70 72 6f 70 65 72 6c 79 ialised properly
9c70: 20 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 .. */..
9c80: 69 66 20 28 6c 6f 63 61 6c 43 74 29 20 7b 0a 09 if (localCt) {..
9c90: 69 66 20 28 21 63 6f 64 65 50 74 72 2d 3e 6c 6f if (!codePtr->lo
9ca0: 63 61 6c 43 61 63 68 65 50 74 72 29 20 7b 0a 09 calCachePtr) {..
9cb0: 20 20 20 20 49 6e 69 74 4c 6f 63 61 6c 43 61 63 InitLocalCac
9cc0: 68 65 28 70 72 6f 63 50 74 72 29 20 3b 0a 09 7d he(procPtr) ;..}
9cd0: 0a 09 66 72 61 6d 65 50 74 72 2d 3e 6c 6f 63 61 ..framePtr->loca
9ce0: 6c 43 61 63 68 65 50 74 72 20 3d 20 63 6f 64 65 lCachePtr = code
9cf0: 50 74 72 2d 3e 6c 6f 63 61 6c 43 61 63 68 65 50 Ptr->localCacheP
9d00: 74 72 3b 0a 09 66 72 61 6d 65 50 74 72 2d 3e 6c tr;..framePtr->l
9d10: 6f 63 61 6c 43 61 63 68 65 50 74 72 2d 3e 72 65 ocalCachePtr->re
9d20: 66 43 6f 75 6e 74 2b 2b 3b 0a 09 64 65 66 50 74 fCount++;..defPt
9d30: 72 20 3d 20 28 56 61 72 20 2a 29 20 28 26 66 72 r = (Var *) (&fr
9d40: 61 6d 65 50 74 72 2d 3e 6c 6f 63 61 6c 43 61 63 amePtr->localCac
9d50: 68 65 50 74 72 2d 3e 76 61 72 4e 61 6d 65 30 20 hePtr->varName0
9d60: 2b 20 6c 6f 63 61 6c 43 74 29 3b 0a 20 20 20 20 + localCt);.
9d70: 7d 20 65 6c 73 65 20 7b 0a 09 64 65 66 50 74 72 } else {..defPtr
9d80: 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 0a = NULL;. }..
9d90: 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 43 72 /*. * Cr
9da0: 65 61 74 65 20 74 68 65 20 22 63 6f 6d 70 69 6c eate the "compil
9db0: 65 64 4c 6f 63 61 6c 73 22 20 61 72 72 61 79 2e edLocals" array.
9dc0: 20 4d 61 6b 65 20 73 75 72 65 20 69 74 20 69 73 Make sure it is
9dd0: 20 6c 61 72 67 65 20 65 6e 6f 75 67 68 20 74 6f large enough to
9de0: 20 68 6f 6c 64 0a 20 20 20 20 20 2a 20 61 6c 6c hold. * all
9df0: 20 74 68 65 20 70 72 6f 63 65 64 75 72 65 27 73 the procedure's
9e00: 20 63 6f 6d 70 69 6c 65 64 20 6c 6f 63 61 6c 20 compiled local
9e10: 76 61 72 69 61 62 6c 65 73 2c 20 69 6e 63 6c 75 variables, inclu
9e20: 64 69 6e 67 20 69 74 73 20 66 6f 72 6d 61 6c 0a ding its formal.
9e30: 20 20 20 20 20 2a 20 70 61 72 61 6d 65 74 65 72 * parameter
9e40: 73 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 s.. */..
9e50: 76 61 72 50 74 72 20 3d 20 28 56 61 72 20 2a 29 varPtr = (Var *)
9e60: 54 63 6c 53 74 61 63 6b 41 6c 6c 6f 63 28 69 6e TclStackAlloc(in
9e70: 74 65 72 70 2c 20 6c 6f 63 61 6c 43 74 20 2a 20 terp, localCt *
9e80: 73 69 7a 65 6f 66 28 56 61 72 29 29 3b 0a 20 20 sizeof(Var));.
9e90: 20 20 66 72 61 6d 65 50 74 72 2d 3e 63 6f 6d 70 framePtr->comp
9ea0: 69 6c 65 64 4c 6f 63 61 6c 73 20 3d 20 76 61 72 iledLocals = var
9eb0: 50 74 72 3b 0a 20 20 20 20 66 72 61 6d 65 50 74 Ptr;. framePt
9ec0: 72 2d 3e 6e 75 6d 43 6f 6d 70 69 6c 65 64 4c 6f r->numCompiledLo
9ed0: 63 61 6c 73 20 3d 20 6c 6f 63 61 6c 43 74 3b 0a cals = localCt;.
9ee0: 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 4d . /*. * M
9ef0: 61 74 63 68 20 61 6e 64 20 61 73 73 69 67 6e 20 atch and assign
9f00: 74 68 65 20 63 61 6c 6c 27 73 20 61 63 74 75 61 the call's actua
9f10: 6c 20 70 61 72 61 6d 65 74 65 72 73 20 74 6f 20 l parameters to
9f20: 74 68 65 20 70 72 6f 63 65 64 75 72 65 27 73 20 the procedure's
9f30: 66 6f 72 6d 61 6c 0a 20 20 20 20 20 2a 20 61 72 formal. * ar
9f40: 67 75 6d 65 6e 74 73 2e 20 54 68 65 20 66 6f 72 guments. The for
9f50: 6d 61 6c 20 61 72 67 75 6d 65 6e 74 73 20 61 72 mal arguments ar
9f60: 65 20 64 65 73 63 72 69 62 65 64 20 62 79 20 74 e described by t
9f70: 68 65 20 66 69 72 73 74 20 6e 75 6d 41 72 67 73 he first numArgs
9f80: 0a 20 20 20 20 20 2a 20 65 6e 74 72 69 65 73 20 . * entries
9f90: 69 6e 20 62 6f 74 68 20 74 68 65 20 50 72 6f 63 in both the Proc
9fa0: 20 73 74 72 75 63 74 75 72 65 27 73 20 6c 6f 63 structure's loc
9fb0: 61 6c 20 76 61 72 69 61 62 6c 65 20 6c 69 73 74 al variable list
9fc0: 20 61 6e 64 20 74 68 65 20 63 61 6c 6c 0a 20 20 and the call.
9fd0: 20 20 20 2a 20 66 72 61 6d 65 27 73 20 6c 6f 63 * frame's loc
9fe0: 61 6c 20 76 61 72 69 61 62 6c 65 20 61 72 72 61 al variable arra
9ff0: 79 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 y.. */..
a000: 6e 75 6d 41 72 67 73 20 3d 20 70 72 6f 63 50 74 numArgs = procPt
a010: 72 2d 3e 6e 75 6d 41 72 67 73 3b 0a 20 20 20 20 r->numArgs;.
a020: 61 72 67 43 74 20 3d 20 66 72 61 6d 65 50 74 72 argCt = framePtr
a030: 2d 3e 6f 62 6a 63 20 2d 20 73 6b 69 70 3b 09 2f ->objc - skip;./
a040: 2a 20 53 65 74 20 69 74 20 74 6f 20 74 68 65 20 * Set it to the
a050: 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 73 20 74 number of args t
a060: 6f 20 74 68 65 0a 09 09 09 09 09 20 2a 20 70 72 o the...... * pr
a070: 6f 63 65 64 75 72 65 2e 20 2a 2f 0a 20 20 20 20 ocedure. */.
a080: 69 66 20 28 6e 75 6d 41 72 67 73 20 3d 3d 20 30 if (numArgs == 0
a090: 29 20 7b 0a 09 69 66 20 28 61 72 67 43 74 29 20 ) {..if (argCt)
a0a0: 7b 0a 09 20 20 20 20 67 6f 74 6f 20 69 6e 63 6f {.. goto inco
a0b0: 72 72 65 63 74 41 72 67 73 3b 0a 09 7d 20 65 6c rrectArgs;..} el
a0c0: 73 65 20 7b 0a 09 20 20 20 20 67 6f 74 6f 20 63 se {.. goto c
a0d0: 6f 72 72 65 63 74 41 72 67 73 3b 0a 09 7d 0a 20 orrectArgs;..}.
a0e0: 20 20 20 7d 0a 20 20 20 20 61 72 67 4f 62 6a 73 }. argObjs
a0f0: 20 3d 20 66 72 61 6d 65 50 74 72 2d 3e 6f 62 6a = framePtr->obj
a100: 76 20 2b 20 73 6b 69 70 3b 0a 20 20 20 20 69 6d v + skip;. im
a110: 61 78 20 3d 20 28 28 61 72 67 43 74 20 3c 20 6e ax = ((argCt < n
a120: 75 6d 41 72 67 73 2d 31 29 20 3f 20 61 72 67 43 umArgs-1) ? argC
a130: 74 20 3a 20 6e 75 6d 41 72 67 73 2d 31 29 3b 0a t : numArgs-1);.
a140: 20 20 20 20 66 6f 72 20 28 69 20 3d 20 30 3b 20 for (i = 0;
a150: 69 20 3c 20 69 6d 61 78 3b 20 69 2b 2b 2c 20 76 i < imax; i++, v
a160: 61 72 50 74 72 2b 2b 2c 20 64 65 66 50 74 72 20 arPtr++, defPtr
a170: 3f 20 64 65 66 50 74 72 2b 2b 20 3a 20 64 65 66 ? defPtr++ : def
a180: 50 74 72 29 20 7b 0a 09 2f 2a 0a 09 20 2a 20 22 Ptr) {../*.. * "
a190: 4e 6f 72 6d 61 6c 22 20 61 72 67 75 6d 65 6e 74 Normal" argument
a1a0: 73 3b 20 6c 61 73 74 20 66 6f 72 6d 61 6c 20 69 s; last formal i
a1b0: 73 20 73 70 65 63 69 61 6c 2c 20 64 65 70 65 6e s special, depen
a1c0: 64 73 20 6f 6e 20 69 74 20 62 65 69 6e 67 0a 09 ds on it being..
a1d0: 20 2a 20 27 61 72 67 73 27 2e 0a 09 20 2a 2f 0a * 'args'... */.
a1e0: 0a 09 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 ..Tcl_Obj *objPt
a1f0: 72 20 3d 20 61 72 67 4f 62 6a 73 5b 69 5d 3b 0a r = argObjs[i];.
a200: 0a 09 76 61 72 50 74 72 2d 3e 66 6c 61 67 73 20 ..varPtr->flags
a210: 3d 20 30 3b 0a 09 76 61 72 50 74 72 2d 3e 76 61 = 0;..varPtr->va
a220: 6c 75 65 2e 6f 62 6a 50 74 72 20 3d 20 6f 62 6a lue.objPtr = obj
a230: 50 74 72 3b 0a 09 54 63 6c 5f 49 6e 63 72 52 65 Ptr;..Tcl_IncrRe
a240: 66 43 6f 75 6e 74 28 6f 62 6a 50 74 72 29 3b 09 fCount(objPtr);.
a250: 2f 2a 20 4c 6f 63 61 6c 20 76 61 72 20 69 73 20 /* Local var is
a260: 61 20 72 65 66 65 72 65 6e 63 65 2e 20 2a 2f 0a a reference. */.
a270: 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 20 28 3b }. for (;
a280: 20 69 20 3c 20 6e 75 6d 41 72 67 73 2d 31 3b 20 i < numArgs-1;
a290: 69 2b 2b 2c 20 76 61 72 50 74 72 2b 2b 2c 20 64 i++, varPtr++, d
a2a0: 65 66 50 74 72 20 3f 20 64 65 66 50 74 72 2b 2b efPtr ? defPtr++
a2b0: 20 3a 20 64 65 66 50 74 72 29 20 7b 0a 09 2f 2a : defPtr) {../*
a2c0: 0a 09 20 2a 20 54 68 69 73 20 6c 6f 6f 70 20 69 .. * This loop i
a2d0: 73 20 65 6e 74 65 72 65 64 20 69 66 20 61 72 67 s entered if arg
a2e0: 43 74 20 3c 20 28 6e 75 6d 41 72 67 73 2d 31 29 Ct < (numArgs-1)
a2f0: 2e 20 53 65 74 20 64 65 66 61 75 6c 74 20 76 61 . Set default va
a300: 6c 75 65 73 3b 0a 09 20 2a 20 6c 61 73 74 20 66 lues;.. * last f
a310: 6f 72 6d 61 6c 20 69 73 20 73 70 65 63 69 61 6c ormal is special
a320: 2e 0a 09 20 2a 2f 0a 0a 09 54 63 6c 5f 4f 62 6a ... */...Tcl_Obj
a330: 20 2a 6f 62 6a 50 74 72 20 3d 20 64 65 66 50 74 *objPtr = defPt
a340: 72 20 3f 20 64 65 66 50 74 72 2d 3e 76 61 6c 75 r ? defPtr->valu
a350: 65 2e 6f 62 6a 50 74 72 20 3a 20 4e 55 4c 4c 3b e.objPtr : NULL;
a360: 0a 0a 09 69 66 20 28 21 6f 62 6a 50 74 72 29 20 ...if (!objPtr)
a370: 7b 0a 09 20 20 20 20 67 6f 74 6f 20 69 6e 63 6f {.. goto inco
a380: 72 72 65 63 74 41 72 67 73 3b 0a 09 7d 0a 09 76 rrectArgs;..}..v
a390: 61 72 50 74 72 2d 3e 66 6c 61 67 73 20 3d 20 30 arPtr->flags = 0
a3a0: 3b 0a 09 76 61 72 50 74 72 2d 3e 76 61 6c 75 65 ;..varPtr->value
a3b0: 2e 6f 62 6a 50 74 72 20 3d 20 6f 62 6a 50 74 72 .objPtr = objPtr
a3c0: 3b 0a 09 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f ;..Tcl_IncrRefCo
a3d0: 75 6e 74 28 6f 62 6a 50 74 72 29 3b 09 2f 2a 20 unt(objPtr);./*
a3e0: 4c 6f 63 61 6c 20 76 61 72 20 72 65 66 65 72 65 Local var refere
a3f0: 6e 63 65 2e 20 2a 2f 0a 20 20 20 20 7d 0a 0a 20 nce. */. }..
a400: 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 57 68 65 /*. * Whe
a410: 6e 20 77 65 20 67 65 74 20 68 65 72 65 2c 20 74 n we get here, t
a420: 68 65 20 6c 61 73 74 20 66 6f 72 6d 61 6c 20 61 he last formal a
a430: 72 67 75 6d 65 6e 74 20 72 65 6d 61 69 6e 73 20 rgument remains
a440: 74 6f 20 62 65 20 64 65 66 69 6e 65 64 3a 0a 20 to be defined:.
a450: 20 20 20 20 2a 20 64 65 66 50 74 72 20 61 6e 64 * defPtr and
a460: 20 76 61 72 50 74 72 20 70 6f 69 6e 74 20 74 6f varPtr point to
a470: 20 74 68 65 20 6c 61 73 74 20 61 72 67 75 6d 65 the last argume
a480: 6e 74 20 74 6f 20 62 65 20 69 6e 69 74 69 61 6c nt to be initial
a490: 69 7a 65 64 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 ized.. */..
a4a0: 20 20 20 76 61 72 50 74 72 2d 3e 66 6c 61 67 73 varPtr->flags
a4b0: 20 3d 20 30 3b 0a 20 20 20 20 69 66 20 28 64 65 = 0;. if (de
a4c0: 66 50 74 72 20 26 26 20 64 65 66 50 74 72 2d 3e fPtr && defPtr->
a4d0: 66 6c 61 67 73 20 26 20 56 41 52 5f 49 53 5f 41 flags & VAR_IS_A
a4e0: 52 47 53 29 20 7b 0a 09 54 63 6c 5f 4f 62 6a 20 RGS) {..Tcl_Obj
a4f0: 2a 6c 69 73 74 50 74 72 20 3d 20 54 63 6c 5f 4e *listPtr = Tcl_N
a500: 65 77 4c 69 73 74 4f 62 6a 28 28 61 72 67 43 74 ewListObj((argCt
a510: 3e 69 29 3f 20 61 72 67 43 74 2d 69 20 3a 20 30 >i)? argCt-i : 0
a520: 2c 20 61 72 67 4f 62 6a 73 2b 69 29 3b 0a 0a 09 , argObjs+i);...
a530: 76 61 72 50 74 72 2d 3e 76 61 6c 75 65 2e 6f 62 varPtr->value.ob
a540: 6a 50 74 72 20 3d 20 6c 69 73 74 50 74 72 3b 0a jPtr = listPtr;.
a550: 09 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e .Tcl_IncrRefCoun
a560: 74 28 6c 69 73 74 50 74 72 29 3b 09 2f 2a 20 4c t(listPtr);./* L
a570: 6f 63 61 6c 20 76 61 72 20 69 73 20 61 20 72 65 ocal var is a re
a580: 66 65 72 65 6e 63 65 2e 20 2a 2f 0a 20 20 20 20 ference. */.
a590: 7d 20 65 6c 73 65 20 69 66 20 28 61 72 67 43 74 } else if (argCt
a5a0: 20 3d 3d 20 6e 75 6d 41 72 67 73 29 20 7b 0a 09 == numArgs) {..
a5b0: 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 20 Tcl_Obj *objPtr
a5c0: 3d 20 61 72 67 4f 62 6a 73 5b 69 5d 3b 0a 0a 09 = argObjs[i];...
a5d0: 76 61 72 50 74 72 2d 3e 76 61 6c 75 65 2e 6f 62 varPtr->value.ob
a5e0: 6a 50 74 72 20 3d 20 6f 62 6a 50 74 72 3b 0a 09 jPtr = objPtr;..
a5f0: 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 Tcl_IncrRefCount
a600: 28 6f 62 6a 50 74 72 29 3b 09 2f 2a 20 4c 6f 63 (objPtr);./* Loc
a610: 61 6c 20 76 61 72 20 69 73 20 61 20 72 65 66 65 al var is a refe
a620: 72 65 6e 63 65 2e 20 2a 2f 0a 20 20 20 20 7d 20 rence. */. }
a630: 65 6c 73 65 20 69 66 20 28 28 61 72 67 43 74 20 else if ((argCt
a640: 3c 20 6e 75 6d 41 72 67 73 29 20 26 26 20 64 65 < numArgs) && de
a650: 66 50 74 72 20 26 26 20 64 65 66 50 74 72 2d 3e fPtr && defPtr->
a660: 76 61 6c 75 65 2e 6f 62 6a 50 74 72 29 20 7b 0a value.objPtr) {.
a670: 09 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 .Tcl_Obj *objPtr
a680: 20 3d 20 64 65 66 50 74 72 2d 3e 76 61 6c 75 65 = defPtr->value
a690: 2e 6f 62 6a 50 74 72 3b 0a 0a 09 76 61 72 50 74 .objPtr;...varPt
a6a0: 72 2d 3e 76 61 6c 75 65 2e 6f 62 6a 50 74 72 20 r->value.objPtr
a6b0: 3d 20 6f 62 6a 50 74 72 3b 0a 09 54 63 6c 5f 49 = objPtr;..Tcl_I
a6c0: 6e 63 72 52 65 66 43 6f 75 6e 74 28 6f 62 6a 50 ncrRefCount(objP
a6d0: 74 72 29 3b 09 2f 2a 20 4c 6f 63 61 6c 20 76 61 tr);./* Local va
a6e0: 72 20 69 73 20 61 20 72 65 66 65 72 65 6e 63 65 r is a reference
a6f0: 2e 20 2a 2f 0a 20 20 20 20 7d 20 65 6c 73 65 20 . */. } else
a700: 7b 0a 09 67 6f 74 6f 20 69 6e 63 6f 72 72 65 63 {..goto incorrec
a710: 74 41 72 67 73 3b 0a 20 20 20 20 7d 0a 20 20 20 tArgs;. }.
a720: 20 76 61 72 50 74 72 2b 2b 3b 0a 0a 20 20 20 20 varPtr++;..
a730: 2f 2a 0a 20 20 20 20 20 2a 20 49 6e 69 74 69 61 /*. * Initia
a740: 6c 69 73 65 20 61 6e 64 20 72 65 73 6f 6c 76 65 lise and resolve
a750: 20 74 68 65 20 72 65 6d 61 69 6e 69 6e 67 20 63 the remaining c
a760: 6f 6d 70 69 6c 65 64 4c 6f 63 61 6c 73 2e 20 49 ompiledLocals. I
a770: 6e 20 74 68 65 20 61 62 73 65 6e 63 65 20 6f 66 n the absence of
a780: 0a 20 20 20 20 20 2a 20 72 65 73 6f 6c 76 65 72 . * resolver
a790: 73 2c 20 74 68 65 79 20 61 72 65 20 75 6e 64 65 s, they are unde
a7a0: 66 69 6e 65 64 20 6c 6f 63 61 6c 20 76 61 72 73 fined local vars
a7b0: 3a 20 28 66 6c 61 67 73 3d 30 2c 20 76 61 6c 75 : (flags=0, valu
a7c0: 65 3d 4e 55 4c 4c 29 2e 0a 20 20 20 20 20 2a 2f e=NULL).. */
a7d0: 0a 0a 20 20 63 6f 72 72 65 63 74 41 72 67 73 3a .. correctArgs:
a7e0: 0a 20 20 20 20 69 66 20 28 6e 75 6d 41 72 67 73 . if (numArgs
a7f0: 20 3c 20 6c 6f 63 61 6c 43 74 29 20 7b 0a 09 69 < localCt) {..i
a800: 66 20 28 21 66 72 61 6d 65 50 74 72 2d 3e 6e 73 f (!framePtr->ns
a810: 50 74 72 2d 3e 63 6f 6d 70 69 6c 65 64 56 61 72 Ptr->compiledVar
a820: 52 65 73 50 72 6f 63 0a 09 09 26 26 20 21 28 28 ResProc...&& !((
a830: 49 6e 74 65 72 70 20 2a 29 69 6e 74 65 72 70 29 Interp *)interp)
a840: 2d 3e 72 65 73 6f 6c 76 65 72 50 74 72 29 20 7b ->resolverPtr) {
a850: 0a 09 20 20 20 20 6d 65 6d 73 65 74 28 76 61 72 .. memset(var
a860: 50 74 72 2c 20 30 2c 20 28 6c 6f 63 61 6c 43 74 Ptr, 0, (localCt
a870: 20 2d 20 6e 75 6d 41 72 67 73 29 2a 73 69 7a 65 - numArgs)*size
a880: 6f 66 28 56 61 72 29 29 3b 0a 09 7d 20 65 6c 73 of(Var));..} els
a890: 65 20 7b 0a 09 20 20 20 20 49 6e 69 74 52 65 73 e {.. InitRes
a8a0: 6f 6c 76 65 64 4c 6f 63 61 6c 73 28 69 6e 74 65 olvedLocals(inte
a8b0: 72 70 2c 20 63 6f 64 65 50 74 72 2c 20 76 61 72 rp, codePtr, var
a8c0: 50 74 72 2c 20 66 72 61 6d 65 50 74 72 2d 3e 6e Ptr, framePtr->n
a8d0: 73 50 74 72 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a sPtr);..}. }.
a8e0: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f . return TCL_
a8f0: 4f 4b 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 OK;.. /*.
a900: 20 2a 20 49 6e 69 74 69 61 6c 69 73 65 20 61 6c * Initialise al
a910: 6c 20 63 6f 6d 70 69 6c 65 64 20 6c 6f 63 61 6c l compiled local
a920: 73 20 74 6f 20 61 76 6f 69 64 20 70 72 6f 62 6c s to avoid probl
a930: 65 6d 73 20 61 74 20 44 65 6c 65 74 65 4c 6f 63 ems at DeleteLoc
a940: 61 6c 56 61 72 73 2e 0a 20 20 20 20 20 2a 2f 0a alVars.. */.
a950: 0a 20 20 69 6e 63 6f 72 72 65 63 74 41 72 67 73 . incorrectArgs
a960: 3a 0a 20 20 20 20 69 66 20 28 28 73 6b 69 70 20 :. if ((skip
a970: 21 3d 20 31 29 20 26 26 0a 09 20 20 20 20 54 63 != 1) &&.. Tc
a980: 6c 49 6e 69 74 52 65 77 72 69 74 65 45 6e 73 65 lInitRewriteEnse
a990: 6d 62 6c 65 28 69 6e 74 65 72 70 2c 20 73 6b 69 mble(interp, ski
a9a0: 70 2d 31 2c 20 30 2c 20 66 72 61 6d 65 50 74 72 p-1, 0, framePtr
a9b0: 2d 3e 6f 62 6a 76 29 29 20 7b 0a 09 54 63 6c 4e ->objv)) {..TclN
a9c0: 52 41 64 64 43 61 6c 6c 62 61 63 6b 28 69 6e 74 RAddCallback(int
a9d0: 65 72 70 2c 20 54 63 6c 43 6c 65 61 72 52 6f 6f erp, TclClearRoo
a9e0: 74 45 6e 73 65 6d 62 6c 65 2c 20 4e 55 4c 4c 2c tEnsemble, NULL,
a9f0: 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 2c 20 4e 55 4c NULL, NULL, NUL
aa00: 4c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 L);. }. me
aa10: 6d 73 65 74 28 76 61 72 50 74 72 2c 20 30 2c 0a mset(varPtr, 0,.
aa20: 09 20 20 20 20 28 28 66 72 61 6d 65 50 74 72 2d . ((framePtr-
aa30: 3e 63 6f 6d 70 69 6c 65 64 4c 6f 63 61 6c 73 20 >compiledLocals
aa40: 2b 20 6c 6f 63 61 6c 43 74 29 2d 76 61 72 50 74 + localCt)-varPt
aa50: 72 29 20 2a 20 73 69 7a 65 6f 66 28 56 61 72 29 r) * sizeof(Var)
aa60: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 50 72 );. return Pr
aa70: 6f 63 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 ocWrongNumArgs(i
aa80: 6e 74 65 72 70 2c 20 73 6b 69 70 29 3b 0a 7d 0a nterp, skip);.}.
aa90: 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d ../*. *---------
aaa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
aab0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
aac0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
aad0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
aae0: 0a 20 2a 20 54 63 6c 50 75 73 68 50 72 6f 63 43 . * TclPushProcC
aaf0: 61 6c 6c 46 72 61 6d 65 20 2d 2d 0a 20 2a 0a 20 allFrame --. *.
ab00: 2a 09 43 6f 6d 70 69 6c 65 73 20 61 20 70 72 6f *.Compiles a pro
ab10: 63 20 62 6f 64 79 20 69 66 20 6e 65 63 65 73 73 c body if necess
ab20: 61 72 79 2c 20 74 68 65 6e 20 70 75 73 68 65 73 ary, then pushes
ab30: 20 61 20 43 61 6c 6c 46 72 61 6d 65 20 73 75 69 a CallFrame sui
ab40: 74 61 62 6c 65 0a 20 2a 09 66 6f 72 20 65 78 65 table. *.for exe
ab50: 63 75 74 69 6e 67 20 69 74 2e 0a 20 2a 0a 20 2a cuting it.. *. *
ab60: 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 73 Results:. *.A s
ab70: 74 61 6e 64 61 72 64 20 54 63 6c 20 6f 62 6a 65 tandard Tcl obje
ab80: 63 74 20 72 65 73 75 6c 74 20 76 61 6c 75 65 2e ct result value.
ab90: 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 . *. * Side effe
aba0: 63 74 73 3a 0a 20 2a 09 54 68 65 20 70 72 6f 63 cts:. *.The proc
abb0: 27 73 20 62 6f 64 79 20 6d 61 79 20 62 65 20 72 's body may be r
abc0: 65 63 6f 6d 70 69 6c 65 64 2e 20 41 20 43 61 6c ecompiled. A Cal
abd0: 6c 46 72 61 6d 65 20 69 73 20 70 75 73 68 65 64 lFrame is pushed
abe0: 2c 20 69 74 20 77 69 6c 6c 20 68 61 76 65 0a 20 , it will have.
abf0: 2a 09 74 6f 20 62 65 20 70 6f 70 70 65 64 20 62 *.to be popped b
ac00: 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 20 2a y the caller.. *
ac10: 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
ac20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
ac30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
ac40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
ac50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 69 ---------. */..i
ac60: 6e 74 0a 54 63 6c 50 75 73 68 50 72 6f 63 43 61 nt.TclPushProcCa
ac70: 6c 6c 46 72 61 6d 65 28 0a 20 20 20 20 76 6f 69 llFrame(. voi
ac80: 64 20 2a 63 6c 69 65 6e 74 44 61 74 61 2c 09 09 d *clientData,..
ac90: 2f 2a 20 52 65 63 6f 72 64 20 64 65 73 63 72 69 /* Record descri
aca0: 62 69 6e 67 20 70 72 6f 63 65 64 75 72 65 20 74 bing procedure t
acb0: 6f 20 62 65 0a 09 09 09 09 20 2a 20 69 6e 74 65 o be..... * inte
acc0: 72 70 72 65 74 65 64 2e 20 2a 2f 0a 20 20 20 20 rpreted. */.
acd0: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 Tcl_Interp *inte
ace0: 72 70 2c 09 09 2f 2a 20 49 6e 74 65 72 70 72 65 rp,../* Interpre
acf0: 74 65 72 20 69 6e 20 77 68 69 63 68 20 70 72 6f ter in which pro
ad00: 63 65 64 75 72 65 20 77 61 73 0a 09 09 09 09 20 cedure was.....
ad10: 2a 20 69 6e 76 6f 6b 65 64 2e 20 2a 2f 0a 20 20 * invoked. */.
ad20: 20 20 54 63 6c 5f 53 69 7a 65 20 6f 62 6a 63 2c Tcl_Size objc,
ad30: 09 09 2f 2a 20 43 6f 75 6e 74 20 6f 66 20 6e 75 ../* Count of nu
ad40: 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 mber of argument
ad50: 73 20 74 6f 20 74 68 69 73 0a 09 09 09 09 20 2a s to this..... *
ad60: 20 70 72 6f 63 65 64 75 72 65 2e 20 2a 2f 0a 20 procedure. */.
ad70: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 Tcl_Obj *cons
ad80: 74 20 2a 6f 62 6a 76 2c 09 2f 2a 20 41 72 67 75 t *objv,./* Argu
ad90: 6d 65 6e 74 20 76 61 6c 75 65 20 6f 62 6a 65 63 ment value objec
ada0: 74 73 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 ts. */. int i
adb0: 73 4c 61 6d 62 64 61 29 09 09 2f 2a 20 31 20 69 sLambda)../* 1 i
adc0: 66 20 74 68 69 73 20 69 73 20 61 20 63 61 6c 6c f this is a call
add0: 20 62 79 20 41 70 70 6c 79 4f 62 6a 43 6d 64 3a by ApplyObjCmd:
ade0: 20 69 74 0a 09 09 09 09 20 2a 20 6e 65 65 64 73 it..... * needs
adf0: 20 73 70 65 63 69 61 6c 20 72 75 6c 65 73 20 66 special rules f
ae00: 6f 72 20 65 72 72 6f 72 20 6d 73 67 20 2a 2f 0a or error msg */.
ae10: 7b 0a 20 20 20 20 50 72 6f 63 20 2a 70 72 6f 63 {. Proc *proc
ae20: 50 74 72 20 3d 20 28 50 72 6f 63 20 2a 29 63 6c Ptr = (Proc *)cl
ae30: 69 65 6e 74 44 61 74 61 3b 0a 20 20 20 20 4e 61 ientData;. Na
ae40: 6d 65 73 70 61 63 65 20 2a 6e 73 50 74 72 20 3d mespace *nsPtr =
ae50: 20 70 72 6f 63 50 74 72 2d 3e 63 6d 64 50 74 72 procPtr->cmdPtr
ae60: 2d 3e 6e 73 50 74 72 3b 0a 20 20 20 20 43 61 6c ->nsPtr;. Cal
ae70: 6c 46 72 61 6d 65 20 2a 66 72 61 6d 65 50 74 72 lFrame *framePtr
ae80: 2c 20 2a 2a 66 72 61 6d 65 50 74 72 50 74 72 3b , **framePtrPtr;
ae90: 0a 20 20 20 20 69 6e 74 20 72 65 73 75 6c 74 3b . int result;
aea0: 0a 20 20 20 20 42 79 74 65 43 6f 64 65 20 2a 63 . ByteCode *c
aeb0: 6f 64 65 50 74 72 3b 0a 0a 20 20 20 20 2f 2a 0a odePtr;.. /*.
aec0: 20 20 20 20 20 2a 20 49 66 20 6e 65 63 65 73 73 * If necess
aed0: 61 72 79 20 28 69 2e 65 2e 20 69 66 20 77 65 20 ary (i.e. if we
aee0: 68 61 76 65 6e 27 74 20 67 6f 74 20 61 20 73 75 haven't got a su
aef0: 69 74 61 62 6c 65 20 63 6f 6d 70 69 6c 61 74 69 itable compilati
af00: 6f 6e 20 61 6c 72 65 61 64 79 0a 20 20 20 20 20 on already.
af10: 2a 20 63 61 63 68 65 64 29 20 63 6f 6d 70 69 6c * cached) compil
af20: 65 20 74 68 65 20 70 72 6f 63 65 64 75 72 65 27 e the procedure'
af30: 73 20 62 6f 64 79 2e 20 54 68 65 20 63 6f 6d 70 s body. The comp
af40: 69 6c 65 72 20 77 69 6c 6c 20 61 6c 6c 6f 63 61 iler will alloca
af50: 74 65 20 66 72 61 6d 65 0a 20 20 20 20 20 2a 20 te frame. *
af60: 73 6c 6f 74 73 20 66 6f 72 20 74 68 65 20 70 72 slots for the pr
af70: 6f 63 65 64 75 72 65 27 73 20 6e 6f 6e 2d 61 72 ocedure's non-ar
af80: 67 75 6d 65 6e 74 20 6c 6f 63 61 6c 20 76 61 72 gument local var
af90: 69 61 62 6c 65 73 2e 20 4e 6f 74 65 20 74 68 61 iables. Note tha
afa0: 74 0a 20 20 20 20 20 2a 20 63 6f 6d 70 69 6c 69 t. * compili
afb0: 6e 67 20 74 68 65 20 62 6f 64 79 20 6d 69 67 68 ng the body migh
afc0: 74 20 69 6e 63 72 65 61 73 65 20 70 72 6f 63 50 t increase procP
afd0: 74 72 2d 3e 6e 75 6d 43 6f 6d 70 69 6c 65 64 4c tr->numCompiledL
afe0: 6f 63 61 6c 73 20 69 66 20 6e 65 77 0a 20 20 20 ocals if new.
aff0: 20 20 2a 20 6c 6f 63 61 6c 20 76 61 72 69 61 62 * local variab
b000: 6c 65 73 20 61 72 65 20 66 6f 75 6e 64 20 77 68 les are found wh
b010: 69 6c 65 20 63 6f 6d 70 69 6c 69 6e 67 2e 0a 20 ile compiling..
b020: 20 20 20 20 2a 2f 0a 0a 20 20 20 20 42 79 74 65 */.. Byte
b030: 43 6f 64 65 47 65 74 49 6e 74 65 72 6e 61 6c 52 CodeGetInternalR
b040: 65 70 28 70 72 6f 63 50 74 72 2d 3e 62 6f 64 79 ep(procPtr->body
b050: 50 74 72 2c 20 26 74 63 6c 42 79 74 65 43 6f 64 Ptr, &tclByteCod
b060: 65 54 79 70 65 2c 20 63 6f 64 65 50 74 72 29 3b eType, codePtr);
b070: 0a 20 20 20 20 69 66 20 28 63 6f 64 65 50 74 72 . if (codePtr
b080: 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 49 6e 74 != NULL) {..Int
b090: 65 72 70 20 2a 69 50 74 72 20 3d 20 28 49 6e 74 erp *iPtr = (Int
b0a0: 65 72 70 20 2a 29 20 69 6e 74 65 72 70 3b 0a 0a erp *) interp;..
b0b0: 09 2f 2a 0a 09 20 2a 20 57 68 65 6e 20 77 65 27 ./*.. * When we'
b0c0: 76 65 20 67 6f 74 20 62 79 74 65 63 6f 64 65 2c ve got bytecode,
b0d0: 20 74 68 69 73 20 69 73 20 74 68 65 20 63 68 65 this is the che
b0e0: 63 6b 20 66 6f 72 20 76 61 6c 69 64 69 74 79 2e ck for validity.
b0f0: 20 54 68 61 74 20 69 73 2c 0a 09 20 2a 20 74 68 That is,.. * th
b100: 65 20 62 79 74 65 63 6f 64 65 20 6d 75 73 74 20 e bytecode must
b110: 62 65 20 66 6f 72 20 74 68 65 20 72 69 67 68 74 be for the right
b120: 20 69 6e 74 65 72 70 72 65 74 65 72 20 28 6e 6f interpreter (no
b130: 20 63 72 6f 73 73 2d 6c 65 61 6b 73 21 29 2c 0a cross-leaks!),.
b140: 09 20 2a 20 74 68 65 20 63 6f 64 65 20 6d 75 73 . * the code mus
b150: 74 20 62 65 20 66 72 6f 6d 20 74 68 65 20 63 75 t be from the cu
b160: 72 72 65 6e 74 20 65 70 6f 63 68 20 28 73 6f 20 rrent epoch (so
b170: 73 75 62 63 6f 6d 6d 61 6e 64 20 63 6f 6d 70 69 subcommand compi
b180: 6c 61 74 69 6f 6e 0a 09 20 2a 20 69 73 20 75 70 lation.. * is up
b190: 2d 74 6f 2d 64 61 74 65 29 2c 20 74 68 65 20 6e -to-date), the n
b1a0: 61 6d 65 73 70 61 63 65 20 6d 75 73 74 20 6d 61 amespace must ma
b1b0: 74 63 68 20 28 73 6f 20 76 61 72 69 61 62 6c 65 tch (so variable
b1c0: 20 68 61 6e 64 6c 69 6e 67 0a 09 20 2a 20 69 73 handling.. * is
b1d0: 20 72 69 67 68 74 29 20 61 6e 64 20 74 68 65 20 right) and the
b1e0: 72 65 73 6f 6c 76 65 72 45 70 6f 63 68 20 6d 75 resolverEpoch mu
b1f0: 73 74 20 6d 61 74 63 68 20 28 73 6f 20 74 68 61 st match (so tha
b200: 74 20 6e 65 77 20 73 68 61 64 6f 77 65 64 0a 09 t new shadowed..
b210: 20 2a 20 63 6f 6d 6d 61 6e 64 73 20 61 6e 64 2f * commands and/
b220: 6f 72 20 72 65 73 6f 6c 76 65 72 20 63 68 61 6e or resolver chan
b230: 67 65 73 20 61 72 65 20 63 6f 6e 73 69 64 65 72 ges are consider
b240: 65 64 29 2e 0a 09 20 2a 20 45 6e 73 75 72 65 20 ed)... * Ensure
b250: 74 68 65 20 42 79 74 65 43 6f 64 65 27 73 20 70 the ByteCode's p
b260: 72 6f 63 50 74 72 20 69 73 20 74 68 65 20 73 61 rocPtr is the sa
b270: 6d 65 20 28 6f 72 20 69 74 27 73 20 70 72 65 63 me (or it's prec
b280: 6f 6d 70 69 6c 65 64 29 2e 0a 09 20 2a 2f 0a 0a ompiled)... */..
b290: 09 69 66 20 28 28 28 49 6e 74 65 72 70 20 2a 29 .if (((Interp *)
b2a0: 20 2a 63 6f 64 65 50 74 72 2d 3e 69 6e 74 65 72 *codePtr->inter
b2b0: 70 48 61 6e 64 6c 65 20 21 3d 20 69 50 74 72 29 pHandle != iPtr)
b2c0: 0a 09 09 7c 7c 20 28 63 6f 64 65 50 74 72 2d 3e ...|| (codePtr->
b2d0: 63 6f 6d 70 69 6c 65 45 70 6f 63 68 20 21 3d 20 compileEpoch !=
b2e0: 69 50 74 72 2d 3e 63 6f 6d 70 69 6c 65 45 70 6f iPtr->compileEpo
b2f0: 63 68 29 0a 09 09 7c 7c 20 28 63 6f 64 65 50 74 ch)...|| (codePt
b300: 72 2d 3e 6e 73 50 74 72 20 21 3d 20 6e 73 50 74 r->nsPtr != nsPt
b310: 72 29 0a 09 09 7c 7c 20 28 63 6f 64 65 50 74 72 r)...|| (codePtr
b320: 2d 3e 6e 73 45 70 6f 63 68 20 21 3d 20 6e 73 50 ->nsEpoch != nsP
b330: 74 72 2d 3e 72 65 73 6f 6c 76 65 72 45 70 6f 63 tr->resolverEpoc
b340: 68 29 0a 09 09 7c 7c 20 28 28 63 6f 64 65 50 74 h)...|| ((codePt
b350: 72 2d 3e 70 72 6f 63 50 74 72 20 21 3d 20 70 72 r->procPtr != pr
b360: 6f 63 50 74 72 29 20 26 26 20 70 72 6f 63 50 74 ocPtr) && procPt
b370: 72 2d 3e 62 6f 64 79 50 74 72 2d 3e 62 79 74 65 r->bodyPtr->byte
b380: 73 29 29 20 7b 0a 09 20 20 20 20 67 6f 74 6f 20 s)) {.. goto
b390: 64 6f 43 6f 6d 70 69 6c 61 74 69 6f 6e 3b 0a 09 doCompilation;..
b3a0: 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 }. } else {.
b3b0: 20 20 20 64 6f 43 6f 6d 70 69 6c 61 74 69 6f 6e doCompilation
b3c0: 3a 0a 09 72 65 73 75 6c 74 20 3d 20 54 63 6c 50 :..result = TclP
b3d0: 72 6f 63 43 6f 6d 70 69 6c 65 50 72 6f 63 28 69 rocCompileProc(i
b3e0: 6e 74 65 72 70 2c 20 70 72 6f 63 50 74 72 2c 20 nterp, procPtr,
b3f0: 70 72 6f 63 50 74 72 2d 3e 62 6f 64 79 50 74 72 procPtr->bodyPtr
b400: 2c 20 6e 73 50 74 72 2c 0a 09 09 28 69 73 4c 61 , nsPtr,...(isLa
b410: 6d 62 64 61 20 3f 20 22 62 6f 64 79 20 6f 66 20 mbda ? "body of
b420: 6c 61 6d 62 64 61 20 74 65 72 6d 22 20 3a 20 22 lambda term" : "
b430: 62 6f 64 79 20 6f 66 20 70 72 6f 63 22 29 2c 0a body of proc"),.
b440: 09 09 54 63 6c 47 65 74 53 74 72 69 6e 67 28 6f ..TclGetString(o
b450: 62 6a 76 5b 69 73 4c 61 6d 62 64 61 5d 29 29 3b bjv[isLambda]));
b460: 0a 09 69 66 20 28 72 65 73 75 6c 74 20 21 3d 20 ..if (result !=
b470: 54 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20 20 20 72 TCL_OK) {.. r
b480: 65 74 75 72 6e 20 72 65 73 75 6c 74 3b 0a 09 7d eturn result;..}
b490: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 . }.. /*.
b4a0: 20 20 20 20 2a 20 53 65 74 20 75 70 20 61 6e 64 * Set up and
b4b0: 20 70 75 73 68 20 61 20 6e 65 77 20 63 61 6c 6c push a new call
b4c0: 20 66 72 61 6d 65 20 66 6f 72 20 74 68 65 20 6e frame for the n
b4d0: 65 77 20 70 72 6f 63 65 64 75 72 65 20 69 6e 76 ew procedure inv
b4e0: 6f 63 61 74 69 6f 6e 2e 0a 20 20 20 20 20 2a 20 ocation.. *
b4f0: 54 68 69 73 20 63 61 6c 6c 20 66 72 61 6d 65 20 This call frame
b500: 77 69 6c 6c 20 65 78 65 63 75 74 65 20 69 6e 20 will execute in
b510: 74 68 65 20 70 72 6f 63 27 73 20 6e 61 6d 65 73 the proc's names
b520: 70 61 63 65 2c 20 77 68 69 63 68 20 6d 69 67 68 pace, which migh
b530: 74 20 62 65 0a 20 20 20 20 20 2a 20 64 69 66 66 t be. * diff
b540: 65 72 65 6e 74 20 74 68 61 6e 20 74 68 65 20 63 erent than the c
b550: 75 72 72 65 6e 74 20 6e 61 6d 65 73 70 61 63 65 urrent namespace
b560: 2e 20 54 68 65 20 70 72 6f 63 27 73 20 6e 61 6d . The proc's nam
b570: 65 73 70 61 63 65 20 69 73 20 74 68 61 74 20 6f espace is that o
b580: 66 0a 20 20 20 20 20 2a 20 69 74 73 20 63 6f 6d f. * its com
b590: 6d 61 6e 64 2c 20 77 68 69 63 68 20 63 61 6e 20 mand, which can
b5a0: 63 68 61 6e 67 65 20 69 66 20 74 68 65 20 63 6f change if the co
b5b0: 6d 6d 61 6e 64 20 69 73 20 72 65 6e 61 6d 65 64 mmand is renamed
b5c0: 20 66 72 6f 6d 20 6f 6e 65 0a 20 20 20 20 20 2a from one. *
b5d0: 20 6e 61 6d 65 73 70 61 63 65 20 74 6f 20 61 6e namespace to an
b5e0: 6f 74 68 65 72 2e 0a 20 20 20 20 20 2a 2f 0a 0a other.. */..
b5f0: 20 20 20 20 66 72 61 6d 65 50 74 72 50 74 72 20 framePtrPtr
b600: 3d 20 26 66 72 61 6d 65 50 74 72 3b 0a 20 20 20 = &framePtr;.
b610: 20 28 76 6f 69 64 29 20 54 63 6c 50 75 73 68 53 (void) TclPushS
b620: 74 61 63 6b 46 72 61 6d 65 28 69 6e 74 65 72 70 tackFrame(interp
b630: 2c 20 28 54 63 6c 5f 43 61 6c 6c 46 72 61 6d 65 , (Tcl_CallFrame
b640: 20 2a 2a 29 20 66 72 61 6d 65 50 74 72 50 74 72 **) framePtrPtr
b650: 2c 0a 09 20 20 20 20 28 54 63 6c 5f 4e 61 6d 65 ,.. (Tcl_Name
b660: 73 70 61 63 65 20 2a 29 20 6e 73 50 74 72 2c 0a space *) nsPtr,.
b670: 09 20 20 20 20 28 69 73 4c 61 6d 62 64 61 3f 20 . (isLambda?
b680: 28 46 52 41 4d 45 5f 49 53 5f 50 52 4f 43 7c 46 (FRAME_IS_PROC|F
b690: 52 41 4d 45 5f 49 53 5f 4c 41 4d 42 44 41 29 20 RAME_IS_LAMBDA)
b6a0: 3a 20 46 52 41 4d 45 5f 49 53 5f 50 52 4f 43 29 : FRAME_IS_PROC)
b6b0: 29 3b 0a 0a 20 20 20 20 66 72 61 6d 65 50 74 72 );.. framePtr
b6c0: 2d 3e 6f 62 6a 63 20 3d 20 6f 62 6a 63 3b 0a 20 ->objc = objc;.
b6d0: 20 20 20 66 72 61 6d 65 50 74 72 2d 3e 6f 62 6a framePtr->obj
b6e0: 76 20 3d 20 6f 62 6a 76 3b 0a 20 20 20 20 66 72 v = objv;. fr
b6f0: 61 6d 65 50 74 72 2d 3e 70 72 6f 63 50 74 72 20 amePtr->procPtr
b700: 3d 20 70 72 6f 63 50 74 72 3b 0a 0a 20 20 20 20 = procPtr;..
b710: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d return TCL_OK;.}
b720: 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d .../*. *--------
b730: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b740: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b750: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b760: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
b770: 2a 0a 20 2a 20 54 63 6c 4f 62 6a 49 6e 74 65 72 *. * TclObjInter
b780: 70 50 72 6f 63 32 2f 54 63 6c 4e 52 49 6e 74 65 pProc2/TclNRInte
b790: 72 70 50 72 6f 63 20 2d 2d 0a 20 2a 0a 20 2a 09 rpProc --. *. *.
b7a0: 57 68 65 6e 20 61 20 54 63 6c 20 70 72 6f 63 65 When a Tcl proce
b7b0: 64 75 72 65 20 67 65 74 73 20 69 6e 76 6f 6b 65 dure gets invoke
b7c0: 64 20 64 75 72 69 6e 67 20 62 79 74 65 63 6f 64 d during bytecod
b7d0: 65 20 65 76 61 6c 75 61 74 69 6f 6e 2c 20 74 68 e evaluation, th
b7e0: 69 73 0a 20 2a 09 6f 62 6a 65 63 74 2d 62 61 73 is. *.object-bas
b7f0: 65 64 20 72 6f 75 74 69 6e 65 20 67 65 74 73 20 ed routine gets
b800: 69 6e 76 6f 6b 65 64 20 74 6f 20 69 6e 74 65 72 invoked to inter
b810: 70 72 65 74 20 74 68 65 20 70 72 6f 63 65 64 75 pret the procedu
b820: 72 65 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 re.. *. * Result
b830: 73 3a 0a 20 2a 09 41 20 73 74 61 6e 64 61 72 64 s:. *.A standard
b840: 20 54 63 6c 20 6f 62 6a 65 63 74 20 72 65 73 75 Tcl object resu
b850: 6c 74 20 76 61 6c 75 65 2e 0a 20 2a 0a 20 2a 20 lt value.. *. *
b860: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a Side effects:. *
b870: 09 44 65 70 65 6e 64 73 20 6f 6e 20 74 68 65 20 .Depends on the
b880: 63 6f 6d 6d 61 6e 64 73 20 69 6e 20 74 68 65 20 commands in the
b890: 70 72 6f 63 65 64 75 72 65 2e 0a 20 2a 0a 20 2a procedure.. *. *
b8a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b8b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b8c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b8d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b8e0: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 69 6e 74 0a ------. */..int.
b8f0: 54 63 6c 4f 62 6a 49 6e 74 65 72 70 50 72 6f 63 TclObjInterpProc
b900: 32 28 0a 20 20 20 20 76 6f 69 64 20 2a 63 6c 69 2(. void *cli
b910: 65 6e 74 44 61 74 61 2c 09 09 2f 2a 20 52 65 63 entData,../* Rec
b920: 6f 72 64 20 64 65 73 63 72 69 62 69 6e 67 20 70 ord describing p
b930: 72 6f 63 65 64 75 72 65 20 74 6f 20 62 65 0a 09 rocedure to be..
b940: 09 09 09 20 2a 20 69 6e 74 65 72 70 72 65 74 65 ... * interprete
b950: 64 2e 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 49 6e d. */. Tcl_In
b960: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 09 09 2f terp *interp,../
b970: 2a 20 49 6e 74 65 72 70 72 65 74 65 72 20 69 6e * Interpreter in
b980: 20 77 68 69 63 68 20 70 72 6f 63 65 64 75 72 65 which procedure
b990: 20 77 61 73 0a 09 09 09 09 20 2a 20 69 6e 76 6f was..... * invo
b9a0: 6b 65 64 2e 20 2a 2f 0a 20 20 20 20 54 63 6c 5f ked. */. Tcl_
b9b0: 53 69 7a 65 20 6f 62 6a 63 2c 09 09 2f 2a 20 43 Size objc,../* C
b9c0: 6f 75 6e 74 20 6f 66 20 6e 75 6d 62 65 72 20 6f ount of number o
b9d0: 66 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 74 f arguments to t
b9e0: 68 69 73 0a 09 09 09 09 20 2a 20 70 72 6f 63 65 his..... * proce
b9f0: 64 75 72 65 2e 20 2a 2f 0a 20 20 20 20 54 63 6c dure. */. Tcl
ba00: 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 2a 6f 62 6a _Obj *const *obj
ba10: 76 29 09 2f 2a 20 41 72 67 75 6d 65 6e 74 20 76 v)./* Argument v
ba20: 61 6c 75 65 20 6f 62 6a 65 63 74 73 2e 20 2a 2f alue objects. */
ba30: 0a 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a .{. /*. *
ba40: 20 4e 6f 74 20 75 73 65 64 20 6d 75 63 68 20 69 Not used much i
ba50: 6e 20 74 68 65 20 63 6f 72 65 3b 20 65 78 74 65 n the core; exte
ba60: 72 6e 61 6c 20 69 6e 74 65 72 66 61 63 65 20 66 rnal interface f
ba70: 6f 72 20 69 54 63 6c 0a 20 20 20 20 20 2a 2f 0a or iTcl. */.
ba80: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 63 6c 5f . return Tcl_
ba90: 4e 52 43 61 6c 6c 4f 62 6a 50 72 6f 63 32 28 69 NRCallObjProc2(i
baa0: 6e 74 65 72 70 2c 20 54 63 6c 4e 52 49 6e 74 65 nterp, TclNRInte
bab0: 72 70 50 72 6f 63 2c 20 63 6c 69 65 6e 74 44 61 rpProc, clientDa
bac0: 74 61 2c 20 6f 62 6a 63 2c 20 6f 62 6a 76 29 3b ta, objc, objv);
bad0: 0a 7d 0a 0a 69 6e 74 0a 54 63 6c 4e 52 49 6e 74 .}..int.TclNRInt
bae0: 65 72 70 50 72 6f 63 28 0a 20 20 20 20 76 6f 69 erpProc(. voi
baf0: 64 20 2a 63 6c 69 65 6e 74 44 61 74 61 2c 09 09 d *clientData,..
bb00: 2f 2a 20 52 65 63 6f 72 64 20 64 65 73 63 72 69 /* Record descri
bb10: 62 69 6e 67 20 70 72 6f 63 65 64 75 72 65 20 74 bing procedure t
bb20: 6f 20 62 65 0a 09 09 09 09 20 2a 20 69 6e 74 65 o be..... * inte
bb30: 72 70 72 65 74 65 64 2e 20 2a 2f 0a 20 20 20 20 rpreted. */.
bb40: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 Tcl_Interp *inte
bb50: 72 70 2c 09 09 2f 2a 20 49 6e 74 65 72 70 72 65 rp,../* Interpre
bb60: 74 65 72 20 69 6e 20 77 68 69 63 68 20 70 72 6f ter in which pro
bb70: 63 65 64 75 72 65 20 77 61 73 0a 09 09 09 09 20 cedure was.....
bb80: 2a 20 69 6e 76 6f 6b 65 64 2e 20 2a 2f 0a 20 20 * invoked. */.
bb90: 20 20 54 63 6c 5f 53 69 7a 65 20 6f 62 6a 63 2c Tcl_Size objc,
bba0: 09 09 2f 2a 20 43 6f 75 6e 74 20 6f 66 20 6e 75 ../* Count of nu
bbb0: 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 mber of argument
bbc0: 73 20 74 6f 20 74 68 69 73 0a 09 09 09 09 20 2a s to this..... *
bbd0: 20 70 72 6f 63 65 64 75 72 65 2e 20 2a 2f 0a 20 procedure. */.
bbe0: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 Tcl_Obj *cons
bbf0: 74 20 2a 6f 62 6a 76 29 09 2f 2a 20 41 72 67 75 t *objv)./* Argu
bc00: 6d 65 6e 74 20 76 61 6c 75 65 20 6f 62 6a 65 63 ment value objec
bc10: 74 73 2e 20 2a 2f 0a 7b 0a 20 20 20 20 69 6e 74 ts. */.{. int
bc20: 20 72 65 73 75 6c 74 20 3d 20 54 63 6c 50 75 73 result = TclPus
bc30: 68 50 72 6f 63 43 61 6c 6c 46 72 61 6d 65 28 63 hProcCallFrame(c
bc40: 6c 69 65 6e 74 44 61 74 61 2c 20 69 6e 74 65 72 lientData, inter
bc50: 70 2c 20 6f 62 6a 63 2c 20 6f 62 6a 76 2c 0a 09 p, objc, objv,..
bc60: 20 20 20 20 2f 2a 69 73 4c 61 6d 62 64 61 2a 2f /*isLambda*/
bc70: 20 30 29 3b 0a 0a 20 20 20 20 69 66 20 28 72 65 0);.. if (re
bc80: 73 75 6c 74 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 sult != TCL_OK)
bc90: 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 {..return TCL_ER
bca0: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 ROR;. }. r
bcb0: 65 74 75 72 6e 20 54 63 6c 4e 52 49 6e 74 65 72 eturn TclNRInter
bcc0: 70 50 72 6f 63 43 6f 72 65 28 69 6e 74 65 72 70 pProcCore(interp
bcd0: 2c 20 6f 62 6a 76 5b 30 5d 2c 20 31 2c 20 26 4d , objv[0], 1, &M
bce0: 61 6b 65 50 72 6f 63 45 72 72 6f 72 29 3b 0a 7d akeProcError);.}
bcf0: 0a 0c 0a 23 69 66 6e 64 65 66 20 54 43 4c 5f 4e ...#ifndef TCL_N
bd00: 4f 5f 44 45 50 52 45 43 41 54 45 44 0a 73 74 61 O_DEPRECATED.sta
bd10: 74 69 63 20 69 6e 74 0a 4e 52 49 6e 74 65 72 70 tic int.NRInterp
bd20: 50 72 6f 63 28 0a 20 20 20 20 76 6f 69 64 20 2a Proc(. void *
bd30: 63 6c 69 65 6e 74 44 61 74 61 2c 09 09 2f 2a 20 clientData,../*
bd40: 52 65 63 6f 72 64 20 64 65 73 63 72 69 62 69 6e Record describin
bd50: 67 20 70 72 6f 63 65 64 75 72 65 20 74 6f 20 62 g procedure to b
bd60: 65 0a 09 09 09 09 20 2a 20 69 6e 74 65 72 70 72 e..... * interpr
bd70: 65 74 65 64 2e 20 2a 2f 0a 20 20 20 20 54 63 6c eted. */. Tcl
bd80: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c _Interp *interp,
bd90: 09 09 2f 2a 20 49 6e 74 65 72 70 72 65 74 65 72 ../* Interpreter
bda0: 20 69 6e 20 77 68 69 63 68 20 70 72 6f 63 65 64 in which proced
bdb0: 75 72 65 20 77 61 73 0a 09 09 09 09 20 2a 20 69 ure was..... * i
bdc0: 6e 76 6f 6b 65 64 2e 20 2a 2f 0a 20 20 20 20 69 nvoked. */. i
bdd0: 6e 74 20 6f 62 6a 63 2c 09 09 09 2f 2a 20 43 6f nt objc,.../* Co
bde0: 75 6e 74 20 6f 66 20 6e 75 6d 62 65 72 20 6f 66 unt of number of
bdf0: 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 74 68 arguments to th
be00: 69 73 0a 09 09 09 09 20 2a 20 70 72 6f 63 65 64 is..... * proced
be10: 75 72 65 2e 20 2a 2f 0a 20 20 20 20 54 63 6c 5f ure. */. Tcl_
be20: 4f 62 6a 20 2a 63 6f 6e 73 74 20 2a 6f 62 6a 76 Obj *const *objv
be30: 29 09 2f 2a 20 41 72 67 75 6d 65 6e 74 20 76 61 )./* Argument va
be40: 6c 75 65 20 6f 62 6a 65 63 74 73 2e 20 2a 2f 0a lue objects. */.
be50: 7b 0a 20 20 20 20 69 6e 74 20 72 65 73 75 6c 74 {. int result
be60: 20 3d 20 54 63 6c 50 75 73 68 50 72 6f 63 43 61 = TclPushProcCa
be70: 6c 6c 46 72 61 6d 65 28 63 6c 69 65 6e 74 44 61 llFrame(clientDa
be80: 74 61 2c 20 69 6e 74 65 72 70 2c 20 6f 62 6a 63 ta, interp, objc
be90: 2c 20 6f 62 6a 76 2c 0a 09 20 20 20 20 2f 2a 69 , objv,.. /*i
bea0: 73 4c 61 6d 62 64 61 2a 2f 20 30 29 3b 0a 0a 20 sLambda*/ 0);..
beb0: 20 20 20 69 66 20 28 72 65 73 75 6c 74 20 21 3d if (result !=
bec0: 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 TCL_OK) {..retu
bed0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 rn TCL_ERROR;.
bee0: 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 54 }. return T
bef0: 63 6c 4e 52 49 6e 74 65 72 70 50 72 6f 63 43 6f clNRInterpProcCo
bf00: 72 65 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b re(interp, objv[
bf10: 30 5d 2c 20 31 2c 20 26 4d 61 6b 65 50 72 6f 63 0], 1, &MakeProc
bf20: 45 72 72 6f 72 29 3b 0a 7d 0a 0a 23 75 6e 64 65 Error);.}..#unde
bf30: 66 20 54 63 6c 4f 62 6a 49 6e 74 65 72 70 50 72 f TclObjInterpPr
bf40: 6f 63 0a 69 6e 74 0a 54 63 6c 4f 62 6a 49 6e 74 oc.int.TclObjInt
bf50: 65 72 70 50 72 6f 63 28 0a 20 20 20 20 76 6f 69 erpProc(. voi
bf60: 64 20 2a 63 6c 69 65 6e 74 44 61 74 61 2c 09 09 d *clientData,..
bf70: 2f 2a 20 52 65 63 6f 72 64 20 64 65 73 63 72 69 /* Record descri
bf80: 62 69 6e 67 20 70 72 6f 63 65 64 75 72 65 20 74 bing procedure t
bf90: 6f 20 62 65 0a 09 09 09 09 20 2a 20 69 6e 74 65 o be..... * inte
bfa0: 72 70 72 65 74 65 64 2e 20 2a 2f 0a 20 20 20 20 rpreted. */.
bfb0: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 Tcl_Interp *inte
bfc0: 72 70 2c 09 09 2f 2a 20 49 6e 74 65 72 70 72 65 rp,../* Interpre
bfd0: 74 65 72 20 69 6e 20 77 68 69 63 68 20 70 72 6f ter in which pro
bfe0: 63 65 64 75 72 65 20 77 61 73 0a 09 09 09 09 20 cedure was.....
bff0: 2a 20 69 6e 76 6f 6b 65 64 2e 20 2a 2f 0a 20 20 * invoked. */.
c000: 20 20 69 6e 74 20 6f 62 6a 63 2c 09 09 09 2f 2a int objc,.../*
c010: 20 43 6f 75 6e 74 20 6f 66 20 6e 75 6d 62 65 72 Count of number
c020: 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 74 6f of arguments to
c030: 20 74 68 69 73 0a 09 09 09 09 20 2a 20 70 72 6f this..... * pro
c040: 63 65 64 75 72 65 2e 20 2a 2f 0a 20 20 20 20 54 cedure. */. T
c050: 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 2a 6f cl_Obj *const *o
c060: 62 6a 76 29 09 2f 2a 20 41 72 67 75 6d 65 6e 74 bjv)./* Argument
c070: 20 76 61 6c 75 65 20 6f 62 6a 65 63 74 73 2e 20 value objects.
c080: 2a 2f 0a 7b 0a 20 20 20 20 2f 2a 0a 20 20 20 20 */.{. /*.
c090: 20 2a 20 4e 6f 74 20 75 73 65 64 20 6d 75 63 68 * Not used much
c0a0: 20 69 6e 20 74 68 65 20 63 6f 72 65 3b 20 65 78 in the core; ex
c0b0: 74 65 72 6e 61 6c 20 69 6e 74 65 72 66 61 63 65 ternal interface
c0c0: 20 66 6f 72 20 69 54 63 6c 0a 20 20 20 20 20 2a for iTcl. *
c0d0: 2f 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 54 63 /.. return Tc
c0e0: 6c 5f 4e 52 43 61 6c 6c 4f 62 6a 50 72 6f 63 28 l_NRCallObjProc(
c0f0: 69 6e 74 65 72 70 2c 20 4e 52 49 6e 74 65 72 70 interp, NRInterp
c100: 50 72 6f 63 2c 20 63 6c 69 65 6e 74 44 61 74 61 Proc, clientData
c110: 2c 20 6f 62 6a 63 2c 20 6f 62 6a 76 29 3b 0a 7d , objc, objv);.}
c120: 0a 23 65 6e 64 69 66 20 2f 2a 20 54 43 4c 5f 4e .#endif /* TCL_N
c130: 4f 5f 44 45 50 52 45 43 41 54 45 44 20 2a 2f 0a O_DEPRECATED */.
c140: 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d ../*. *---------
c150: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c160: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c170: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c180: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
c190: 0a 20 2a 20 54 63 6c 4e 52 49 6e 74 65 72 70 50 . * TclNRInterpP
c1a0: 72 6f 63 43 6f 72 65 20 2d 2d 0a 20 2a 0a 20 2a rocCore --. *. *
c1b0: 09 57 68 65 6e 20 61 20 54 63 6c 20 70 72 6f 63 .When a Tcl proc
c1c0: 65 64 75 72 65 2c 20 6c 61 6d 62 64 61 20 74 65 edure, lambda te
c1d0: 72 6d 20 6f 72 20 61 6e 79 74 68 69 6e 67 20 65 rm or anything e
c1e0: 6c 73 65 20 74 68 61 74 20 77 6f 72 6b 73 20 6c lse that works l
c1f0: 69 6b 65 20 61 0a 20 2a 09 70 72 6f 63 65 64 75 ike a. *.procedu
c200: 72 65 20 67 65 74 73 20 69 6e 76 6f 6b 65 64 20 re gets invoked
c210: 64 75 72 69 6e 67 20 62 79 74 65 63 6f 64 65 20 during bytecode
c220: 65 76 61 6c 75 61 74 69 6f 6e 2c 20 74 68 69 73 evaluation, this
c230: 20 6f 62 6a 65 63 74 2d 62 61 73 65 64 0a 20 2a object-based. *
c240: 09 72 6f 75 74 69 6e 65 20 67 65 74 73 20 69 6e .routine gets in
c250: 76 6f 6b 65 64 20 74 6f 20 69 6e 74 65 72 70 72 voked to interpr
c260: 65 74 20 74 68 65 20 62 6f 64 79 2e 0a 20 2a 0a et the body.. *.
c270: 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 * Results:. *.A
c280: 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 6f 62 standard Tcl ob
c290: 6a 65 63 74 20 72 65 73 75 6c 74 20 76 61 6c 75 ject result valu
c2a0: 65 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 e.. *. * Side ef
c2b0: 66 65 63 74 73 3a 0a 20 2a 09 4e 65 61 72 6c 79 fects:. *.Nearly
c2c0: 20 61 6e 79 74 68 69 6e 67 3b 20 64 65 70 65 6e anything; depen
c2d0: 64 73 20 6f 6e 20 74 68 65 20 63 6f 6d 6d 61 6e ds on the comman
c2e0: 64 73 20 69 6e 20 74 68 65 20 70 72 6f 63 65 64 ds in the proced
c2f0: 75 72 65 20 62 6f 64 79 2e 0a 20 2a 0a 20 2a 2d ure body.. *. *-
c300: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c310: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c320: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c330: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c340: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 69 6e 74 0a 54 -----. */..int.T
c350: 63 6c 4e 52 49 6e 74 65 72 70 50 72 6f 63 43 6f clNRInterpProcCo
c360: 72 65 28 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 re(. Tcl_Inte
c370: 72 70 20 2a 69 6e 74 65 72 70 2c 09 09 2f 2a 20 rp *interp,../*
c380: 49 6e 74 65 72 70 72 65 74 65 72 20 69 6e 20 77 Interpreter in w
c390: 68 69 63 68 20 70 72 6f 63 65 64 75 72 65 20 77 hich procedure w
c3a0: 61 73 0a 09 09 09 09 20 2a 20 69 6e 76 6f 6b 65 as..... * invoke
c3b0: 64 2e 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 d. */. Tcl_Ob
c3c0: 6a 20 2a 70 72 6f 63 4e 61 6d 65 4f 62 6a 2c 09 j *procNameObj,.
c3d0: 2f 2a 20 50 72 6f 63 65 64 75 72 65 20 6e 61 6d /* Procedure nam
c3e0: 65 20 66 6f 72 20 65 72 72 6f 72 20 72 65 70 6f e for error repo
c3f0: 72 74 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 54 63 rting. */. Tc
c400: 6c 5f 53 69 7a 65 20 73 6b 69 70 2c 09 09 2f 2a l_Size skip,../*
c410: 20 4e 75 6d 62 65 72 20 6f 66 20 69 6e 69 74 69 Number of initi
c420: 61 6c 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 al arguments to
c430: 62 65 20 73 6b 69 70 70 65 64 2c 0a 09 09 09 09 be skipped,.....
c440: 20 2a 20 69 2e 65 2e 2c 20 77 6f 72 64 73 20 69 * i.e., words i
c450: 6e 20 74 68 65 20 22 63 6f 6d 6d 61 6e 64 20 6e n the "command n
c460: 61 6d 65 22 2e 20 2a 2f 0a 20 20 20 20 50 72 6f ame". */. Pro
c470: 63 45 72 72 6f 72 50 72 6f 63 20 2a 65 72 72 6f cErrorProc *erro
c480: 72 50 72 6f 63 29 09 2f 2a 20 48 6f 77 20 74 6f rProc)./* How to
c490: 20 63 6f 6e 76 65 72 74 20 72 65 73 75 6c 74 73 convert results
c4a0: 20 66 72 6f 6d 20 74 68 65 20 73 63 72 69 70 74 from the script
c4b0: 20 69 6e 74 6f 0a 09 09 09 09 20 2a 20 72 65 73 into..... * res
c4c0: 75 6c 74 73 20 6f 66 20 74 68 65 20 6f 76 65 72 ults of the over
c4d0: 61 6c 6c 20 70 72 6f 63 65 64 75 72 65 2e 20 2a all procedure. *
c4e0: 2f 0a 7b 0a 20 20 20 20 49 6e 74 65 72 70 20 2a /.{. Interp *
c4f0: 69 50 74 72 20 3d 20 28 49 6e 74 65 72 70 20 2a iPtr = (Interp *
c500: 29 20 69 6e 74 65 72 70 3b 0a 20 20 20 20 50 72 ) interp;. Pr
c510: 6f 63 20 2a 70 72 6f 63 50 74 72 20 3d 20 69 50 oc *procPtr = iP
c520: 74 72 2d 3e 76 61 72 46 72 61 6d 65 50 74 72 2d tr->varFramePtr-
c530: 3e 70 72 6f 63 50 74 72 3b 0a 20 20 20 20 69 6e >procPtr;. in
c540: 74 20 72 65 73 75 6c 74 3b 0a 20 20 20 20 43 61 t result;. Ca
c550: 6c 6c 46 72 61 6d 65 20 2a 66 72 65 65 50 74 72 llFrame *freePtr
c560: 3b 0a 20 20 20 20 42 79 74 65 43 6f 64 65 20 2a ;. ByteCode *
c570: 63 6f 64 65 50 74 72 3b 0a 0a 20 20 20 20 72 65 codePtr;.. re
c580: 73 75 6c 74 20 3d 20 49 6e 69 74 41 72 67 73 41 sult = InitArgsA
c590: 6e 64 4c 6f 63 61 6c 73 28 69 6e 74 65 72 70 2c ndLocals(interp,
c5a0: 20 73 6b 69 70 29 3b 0a 20 20 20 20 69 66 20 28 skip);. if (
c5b0: 72 65 73 75 6c 74 20 21 3d 20 54 43 4c 5f 4f 4b result != TCL_OK
c5c0: 29 20 7b 0a 09 66 72 65 65 50 74 72 20 3d 20 69 ) {..freePtr = i
c5d0: 50 74 72 2d 3e 66 72 61 6d 65 50 74 72 3b 0a 09 Ptr->framePtr;..
c5e0: 54 63 6c 5f 50 6f 70 43 61 6c 6c 46 72 61 6d 65 Tcl_PopCallFrame
c5f0: 28 69 6e 74 65 72 70 29 3b 09 2f 2a 20 50 6f 70 (interp);./* Pop
c600: 20 62 75 74 20 64 6f 20 6e 6f 74 20 66 72 65 65 but do not free
c610: 2e 20 2a 2f 0a 09 54 63 6c 53 74 61 63 6b 46 72 . */..TclStackFr
c620: 65 65 28 69 6e 74 65 72 70 2c 20 66 72 65 65 50 ee(interp, freeP
c630: 74 72 2d 3e 63 6f 6d 70 69 6c 65 64 4c 6f 63 61 tr->compiledLoca
c640: 6c 73 29 3b 0a 09 09 09 09 09 2f 2a 20 46 72 65 ls);....../* Fre
c650: 65 20 63 6f 6d 70 69 6c 65 64 4c 6f 63 61 6c 73 e compiledLocals
c660: 2e 20 2a 2f 0a 09 54 63 6c 53 74 61 63 6b 46 72 . */..TclStackFr
c670: 65 65 28 69 6e 74 65 72 70 2c 20 66 72 65 65 50 ee(interp, freeP
c680: 74 72 29 3b 09 2f 2a 20 46 72 65 65 20 43 61 6c tr);./* Free Cal
c690: 6c 46 72 61 6d 65 2e 20 2a 2f 0a 09 72 65 74 75 lFrame. */..retu
c6a0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 rn TCL_ERROR;.
c6b0: 20 20 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 }..#if defined
c6c0: 28 54 43 4c 5f 43 4f 4d 50 49 4c 45 5f 44 45 42 (TCL_COMPILE_DEB
c6d0: 55 47 29 0a 20 20 20 20 69 66 20 28 74 63 6c 54 UG). if (tclT
c6e0: 72 61 63 65 45 78 65 63 20 3e 3d 20 54 43 4c 5f raceExec >= TCL_
c6f0: 54 52 41 43 45 5f 42 59 54 45 43 4f 44 45 5f 45 TRACE_BYTECODE_E
c700: 58 45 43 5f 50 52 4f 43 53 29 20 7b 0a 09 43 61 XEC_PROCS) {..Ca
c710: 6c 6c 46 72 61 6d 65 20 2a 66 72 61 6d 65 50 74 llFrame *framePt
c720: 72 20 3d 20 69 50 74 72 2d 3e 76 61 72 46 72 61 r = iPtr->varFra
c730: 6d 65 50 74 72 3b 0a 09 54 63 6c 5f 53 69 7a 65 mePtr;..Tcl_Size
c740: 20 69 3b 0a 0a 09 69 66 20 28 66 72 61 6d 65 50 i;...if (frameP
c750: 74 72 2d 3e 69 73 50 72 6f 63 43 61 6c 6c 46 72 tr->isProcCallFr
c760: 61 6d 65 20 26 20 46 52 41 4d 45 5f 49 53 5f 4c ame & FRAME_IS_L
c770: 41 4d 42 44 41 29 20 7b 0a 09 20 20 20 20 66 70 AMBDA) {.. fp
c780: 72 69 6e 74 66 28 73 74 64 6f 75 74 2c 20 22 43 rintf(stdout, "C
c790: 61 6c 6c 69 6e 67 20 6c 61 6d 62 64 61 20 22 29 alling lambda ")
c7a0: 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 ;..} else {..
c7b0: 20 66 70 72 69 6e 74 66 28 73 74 64 6f 75 74 2c fprintf(stdout,
c7c0: 20 22 43 61 6c 6c 69 6e 67 20 70 72 6f 63 20 22 "Calling proc "
c7d0: 29 3b 0a 09 7d 0a 09 66 6f 72 20 28 69 20 3d 20 );..}..for (i =
c7e0: 30 3b 20 69 20 3c 20 66 72 61 6d 65 50 74 72 2d 0; i < framePtr-
c7f0: 3e 6f 62 6a 63 3b 20 69 2b 2b 29 20 7b 0a 09 20 >objc; i++) {..
c800: 20 20 20 54 63 6c 50 72 69 6e 74 4f 62 6a 65 63 TclPrintObjec
c810: 74 28 73 74 64 6f 75 74 2c 20 66 72 61 6d 65 50 t(stdout, frameP
c820: 74 72 2d 3e 6f 62 6a 76 5b 69 5d 2c 20 31 35 29 tr->objv[i], 15)
c830: 3b 0a 09 20 20 20 20 66 70 72 69 6e 74 66 28 73 ;.. fprintf(s
c840: 74 64 6f 75 74 2c 20 22 20 22 29 3b 0a 09 7d 0a tdout, " ");..}.
c850: 09 66 70 72 69 6e 74 66 28 73 74 64 6f 75 74 2c .fprintf(stdout,
c860: 20 22 5c 6e 22 29 3b 0a 09 66 66 6c 75 73 68 28 "\n");..fflush(
c870: 73 74 64 6f 75 74 29 3b 0a 20 20 20 20 7d 0a 23 stdout);. }.#
c880: 65 6e 64 69 66 20 2f 2a 54 43 4c 5f 43 4f 4d 50 endif /*TCL_COMP
c890: 49 4c 45 5f 44 45 42 55 47 2a 2f 0a 0a 23 69 66 ILE_DEBUG*/..#if
c8a0: 64 65 66 20 55 53 45 5f 44 54 52 41 43 45 0a 20 def USE_DTRACE.
c8b0: 20 20 20 69 66 20 28 54 43 4c 5f 44 54 52 41 43 if (TCL_DTRAC
c8c0: 45 5f 50 52 4f 43 5f 41 52 47 53 5f 45 4e 41 42 E_PROC_ARGS_ENAB
c8d0: 4c 45 44 28 29 29 20 7b 0a 09 54 63 6c 5f 53 69 LED()) {..Tcl_Si
c8e0: 7a 65 20 6c 20 3d 20 28 69 50 74 72 2d 3e 76 61 ze l = (iPtr->va
c8f0: 72 46 72 61 6d 65 50 74 72 2d 3e 69 73 50 72 6f rFramePtr->isPro
c900: 63 43 61 6c 6c 46 72 61 6d 65 20 26 20 46 52 41 cCallFrame & FRA
c910: 4d 45 5f 49 53 5f 4c 41 4d 42 44 41 29 20 3f 20 ME_IS_LAMBDA) ?
c920: 31 20 3a 20 30 3b 0a 09 63 6f 6e 73 74 20 63 68 1 : 0;..const ch
c930: 61 72 20 2a 61 5b 31 30 5d 3b 0a 09 54 63 6c 5f ar *a[10];..Tcl_
c940: 53 69 7a 65 20 69 3b 0a 0a 09 66 6f 72 20 28 69 Size i;...for (i
c950: 20 3d 20 30 20 3b 20 69 20 3c 20 31 30 20 3b 20 = 0 ; i < 10 ;
c960: 69 2b 2b 29 20 7b 0a 09 20 20 20 20 61 5b 69 5d i++) {.. a[i]
c970: 20 3d 20 28 6c 20 3c 20 69 50 74 72 2d 3e 76 61 = (l < iPtr->va
c980: 72 46 72 61 6d 65 50 74 72 2d 3e 6f 62 6a 63 20 rFramePtr->objc
c990: 3f 0a 09 09 20 20 20 20 54 63 6c 47 65 74 53 74 ?... TclGetSt
c9a0: 72 69 6e 67 28 69 50 74 72 2d 3e 76 61 72 46 72 ring(iPtr->varFr
c9b0: 61 6d 65 50 74 72 2d 3e 6f 62 6a 76 5b 6c 5d 29 amePtr->objv[l])
c9c0: 20 3a 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 6c : NULL);.. l
c9d0: 2b 2b 3b 0a 09 7d 0a 09 54 43 4c 5f 44 54 52 41 ++;..}..TCL_DTRA
c9e0: 43 45 5f 50 52 4f 43 5f 41 52 47 53 28 61 5b 30 CE_PROC_ARGS(a[0
c9f0: 5d 2c 20 61 5b 31 5d 2c 20 61 5b 32 5d 2c 20 61 ], a[1], a[2], a
ca00: 5b 33 5d 2c 20 61 5b 34 5d 2c 20 61 5b 35 5d 2c [3], a[4], a[5],
ca10: 20 61 5b 36 5d 2c 20 61 5b 37 5d 2c 0a 09 09 61 a[6], a[7],...a
ca20: 5b 38 5d 2c 20 61 5b 39 5d 29 3b 0a 20 20 20 20 [8], a[9]);.
ca30: 7d 0a 20 20 20 20 69 66 20 28 54 43 4c 5f 44 54 }. if (TCL_DT
ca40: 52 41 43 45 5f 50 52 4f 43 5f 49 4e 46 4f 5f 45 RACE_PROC_INFO_E
ca50: 4e 41 42 4c 45 44 28 29 20 26 26 20 69 50 74 72 NABLED() && iPtr
ca60: 2d 3e 63 6d 64 46 72 61 6d 65 50 74 72 29 20 7b ->cmdFramePtr) {
ca70: 0a 09 54 63 6c 5f 4f 62 6a 20 2a 69 6e 66 6f 20 ..Tcl_Obj *info
ca80: 3d 20 54 63 6c 49 6e 66 6f 46 72 61 6d 65 28 69 = TclInfoFrame(i
ca90: 6e 74 65 72 70 2c 20 69 50 74 72 2d 3e 63 6d 64 nterp, iPtr->cmd
caa0: 46 72 61 6d 65 50 74 72 29 3b 0a 09 63 6f 6e 73 FramePtr);..cons
cab0: 74 20 63 68 61 72 20 2a 61 5b 36 5d 3b 0a 09 54 t char *a[6];..T
cac0: 63 6c 5f 53 69 7a 65 20 69 5b 32 5d 3b 0a 0a 09 cl_Size i[2];...
cad0: 54 63 6c 44 54 72 61 63 65 49 6e 66 6f 28 69 6e TclDTraceInfo(in
cae0: 66 6f 2c 20 61 2c 20 69 29 3b 0a 09 54 43 4c 5f fo, a, i);..TCL_
caf0: 44 54 52 41 43 45 5f 50 52 4f 43 5f 49 4e 46 4f DTRACE_PROC_INFO
cb00: 28 61 5b 30 5d 2c 20 61 5b 31 5d 2c 20 61 5b 32 (a[0], a[1], a[2
cb10: 5d 2c 20 61 5b 33 5d 2c 20 69 5b 30 5d 2c 20 69 ], a[3], i[0], i
cb20: 5b 31 5d 2c 20 61 5b 34 5d 2c 20 61 5b 35 5d 29 [1], a[4], a[5])
cb30: 3b 0a 09 54 63 6c 44 65 63 72 52 65 66 43 6f 75 ;..TclDecrRefCou
cb40: 6e 74 28 69 6e 66 6f 29 3b 0a 20 20 20 20 7d 0a nt(info);. }.
cb50: 20 20 20 20 69 66 20 28 54 43 4c 5f 44 54 52 41 if (TCL_DTRA
cb60: 43 45 5f 50 52 4f 43 5f 45 4e 54 52 59 5f 45 4e CE_PROC_ENTRY_EN
cb70: 41 42 4c 45 44 28 29 29 20 7b 0a 09 54 63 6c 5f ABLED()) {..Tcl_
cb80: 53 69 7a 65 20 6c 20 3d 20 28 69 50 74 72 2d 3e Size l = (iPtr->
cb90: 76 61 72 46 72 61 6d 65 50 74 72 2d 3e 69 73 50 varFramePtr->isP
cba0: 72 6f 63 43 61 6c 6c 46 72 61 6d 65 20 26 20 46 rocCallFrame & F
cbb0: 52 41 4d 45 5f 49 53 5f 4c 41 4d 42 44 41 29 20 RAME_IS_LAMBDA)
cbc0: 3f 20 31 20 3a 20 30 3b 0a 0a 09 54 43 4c 5f 44 ? 1 : 0;...TCL_D
cbd0: 54 52 41 43 45 5f 50 52 4f 43 5f 45 4e 54 52 59 TRACE_PROC_ENTRY
cbe0: 28 6c 20 3c 20 69 50 74 72 2d 3e 76 61 72 46 72 (l < iPtr->varFr
cbf0: 61 6d 65 50 74 72 2d 3e 6f 62 6a 63 20 3f 0a 09 amePtr->objc ?..
cc00: 09 54 63 6c 47 65 74 53 74 72 69 6e 67 28 69 50 .TclGetString(iP
cc10: 74 72 2d 3e 76 61 72 46 72 61 6d 65 50 74 72 2d tr->varFramePtr-
cc20: 3e 6f 62 6a 76 5b 6c 5d 29 20 3a 20 4e 55 4c 4c >objv[l]) : NULL
cc30: 2c 0a 09 09 69 50 74 72 2d 3e 76 61 72 46 72 61 ,...iPtr->varFra
cc40: 6d 65 50 74 72 2d 3e 6f 62 6a 63 20 2d 20 6c 20 mePtr->objc - l
cc50: 2d 20 31 2c 0a 09 09 28 54 63 6c 5f 4f 62 6a 20 - 1,...(Tcl_Obj
cc60: 2a 2a 29 28 69 50 74 72 2d 3e 76 61 72 46 72 61 **)(iPtr->varFra
cc70: 6d 65 50 74 72 2d 3e 6f 62 6a 76 20 2b 20 6c 20 mePtr->objv + l
cc80: 2b 20 31 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 + 1));. }.
cc90: 20 69 66 20 28 54 43 4c 5f 44 54 52 41 43 45 5f if (TCL_DTRACE_
cca0: 50 52 4f 43 5f 45 4e 54 52 59 5f 45 4e 41 42 4c PROC_ENTRY_ENABL
ccb0: 45 44 28 29 29 20 7b 0a 09 54 63 6c 5f 53 69 7a ED()) {..Tcl_Siz
ccc0: 65 20 6c 20 3d 20 28 69 50 74 72 2d 3e 76 61 72 e l = (iPtr->var
ccd0: 46 72 61 6d 65 50 74 72 2d 3e 69 73 50 72 6f 63 FramePtr->isProc
cce0: 43 61 6c 6c 46 72 61 6d 65 20 26 20 46 52 41 4d CallFrame & FRAM
ccf0: 45 5f 49 53 5f 4c 41 4d 42 44 41 29 20 3f 20 31 E_IS_LAMBDA) ? 1
cd00: 20 3a 20 30 3b 0a 0a 09 54 43 4c 5f 44 54 52 41 : 0;...TCL_DTRA
cd10: 43 45 5f 50 52 4f 43 5f 45 4e 54 52 59 28 6c 20 CE_PROC_ENTRY(l
cd20: 3c 20 69 50 74 72 2d 3e 76 61 72 46 72 61 6d 65 < iPtr->varFrame
cd30: 50 74 72 2d 3e 6f 62 6a 63 20 3f 0a 09 09 54 63 Ptr->objc ?...Tc
cd40: 6c 47 65 74 53 74 72 69 6e 67 28 69 50 74 72 2d lGetString(iPtr-
cd50: 3e 76 61 72 46 72 61 6d 65 50 74 72 2d 3e 6f 62 >varFramePtr->ob
cd60: 6a 76 5b 6c 5d 29 20 3a 20 4e 55 4c 4c 2c 0a 09 jv[l]) : NULL,..
cd70: 09 69 50 74 72 2d 3e 76 61 72 46 72 61 6d 65 50 .iPtr->varFrameP
cd80: 74 72 2d 3e 6f 62 6a 63 20 2d 20 6c 20 2d 20 31 tr->objc - l - 1
cd90: 2c 0a 09 09 28 54 63 6c 5f 4f 62 6a 20 2a 2a 29 ,...(Tcl_Obj **)
cda0: 28 69 50 74 72 2d 3e 76 61 72 46 72 61 6d 65 50 (iPtr->varFrameP
cdb0: 74 72 2d 3e 6f 62 6a 76 20 2b 20 6c 20 2b 20 31 tr->objv + l + 1
cdc0: 29 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 ));. }.#endif
cdd0: 20 2f 2a 20 55 53 45 5f 44 54 52 41 43 45 20 2a /* USE_DTRACE *
cde0: 2f 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a /.. /*. *
cdf0: 20 49 6e 76 6f 6b 65 20 74 68 65 20 63 6f 6d 6d Invoke the comm
ce00: 61 6e 64 73 20 69 6e 20 74 68 65 20 70 72 6f 63 ands in the proc
ce10: 65 64 75 72 65 27 73 20 62 6f 64 79 2e 0a 20 20 edure's body..
ce20: 20 20 20 2a 2f 0a 0a 20 20 20 20 70 72 6f 63 50 */.. procP
ce30: 74 72 2d 3e 72 65 66 43 6f 75 6e 74 2b 2b 3b 0a tr->refCount++;.
ce40: 20 20 20 20 42 79 74 65 43 6f 64 65 47 65 74 49 ByteCodeGetI
ce50: 6e 74 65 72 6e 61 6c 52 65 70 28 70 72 6f 63 50 nternalRep(procP
ce60: 74 72 2d 3e 62 6f 64 79 50 74 72 2c 20 26 74 63 tr->bodyPtr, &tc
ce70: 6c 42 79 74 65 43 6f 64 65 54 79 70 65 2c 20 63 lByteCodeType, c
ce80: 6f 64 65 50 74 72 29 3b 0a 0a 20 20 20 20 54 63 odePtr);.. Tc
ce90: 6c 4e 52 41 64 64 43 61 6c 6c 62 61 63 6b 28 69 lNRAddCallback(i
cea0: 6e 74 65 72 70 2c 20 49 6e 74 65 72 70 50 72 6f nterp, InterpPro
ceb0: 63 4e 52 32 2c 20 70 72 6f 63 4e 61 6d 65 4f 62 cNR2, procNameOb
cec0: 6a 2c 20 65 72 72 6f 72 50 72 6f 63 2c 0a 09 20 j, errorProc,..
ced0: 20 20 20 4e 55 4c 4c 2c 20 4e 55 4c 4c 29 3b 0a NULL, NULL);.
cee0: 20 20 20 20 72 65 74 75 72 6e 20 54 63 6c 4e 52 return TclNR
cef0: 45 78 65 63 75 74 65 42 79 74 65 43 6f 64 65 28 ExecuteByteCode(
cf00: 69 6e 74 65 72 70 2c 20 63 6f 64 65 50 74 72 29 interp, codePtr)
cf10: 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 0a ;.}..static int.
cf20: 49 6e 74 65 72 70 50 72 6f 63 4e 52 32 28 0a 20 InterpProcNR2(.
cf30: 20 20 20 76 6f 69 64 20 2a 64 61 74 61 5b 5d 2c void *data[],
cf40: 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 . Tcl_Interp
cf50: 2a 69 6e 74 65 72 70 2c 0a 20 20 20 20 69 6e 74 *interp,. int
cf60: 20 72 65 73 75 6c 74 29 0a 7b 0a 20 20 20 20 49 result).{. I
cf70: 6e 74 65 72 70 20 2a 69 50 74 72 20 3d 20 28 49 nterp *iPtr = (I
cf80: 6e 74 65 72 70 20 2a 29 20 69 6e 74 65 72 70 3b nterp *) interp;
cf90: 0a 20 20 20 20 50 72 6f 63 20 2a 70 72 6f 63 50 . Proc *procP
cfa0: 74 72 20 3d 20 69 50 74 72 2d 3e 76 61 72 46 72 tr = iPtr->varFr
cfb0: 61 6d 65 50 74 72 2d 3e 70 72 6f 63 50 74 72 3b amePtr->procPtr;
cfc0: 0a 20 20 20 20 43 61 6c 6c 46 72 61 6d 65 20 2a . CallFrame *
cfd0: 66 72 65 65 50 74 72 3b 0a 20 20 20 20 54 63 6c freePtr;. Tcl
cfe0: 5f 4f 62 6a 20 2a 70 72 6f 63 4e 61 6d 65 4f 62 _Obj *procNameOb
cff0: 6a 20 3d 20 28 54 63 6c 5f 4f 62 6a 20 2a 29 64 j = (Tcl_Obj *)d
d000: 61 74 61 5b 30 5d 3b 0a 20 20 20 20 50 72 6f 63 ata[0];. Proc
d010: 45 72 72 6f 72 50 72 6f 63 20 2a 65 72 72 6f 72 ErrorProc *error
d020: 50 72 6f 63 20 3d 20 28 50 72 6f 63 45 72 72 6f Proc = (ProcErro
d030: 72 50 72 6f 63 20 2a 29 64 61 74 61 5b 31 5d 3b rProc *)data[1];
d040: 0a 0a 20 20 20 20 69 66 20 28 54 43 4c 5f 44 54 .. if (TCL_DT
d050: 52 41 43 45 5f 50 52 4f 43 5f 52 45 54 55 52 4e RACE_PROC_RETURN
d060: 5f 45 4e 41 42 4c 45 44 28 29 29 20 7b 0a 09 54 _ENABLED()) {..T
d070: 63 6c 5f 53 69 7a 65 20 6c 20 3d 20 28 69 50 74 cl_Size l = (iPt
d080: 72 2d 3e 76 61 72 46 72 61 6d 65 50 74 72 2d 3e r->varFramePtr->
d090: 69 73 50 72 6f 63 43 61 6c 6c 46 72 61 6d 65 20 isProcCallFrame
d0a0: 26 20 46 52 41 4d 45 5f 49 53 5f 4c 41 4d 42 44 & FRAME_IS_LAMBD
d0b0: 41 29 20 3f 20 31 20 3a 20 30 3b 0a 0a 09 54 43 A) ? 1 : 0;...TC
d0c0: 4c 5f 44 54 52 41 43 45 5f 50 52 4f 43 5f 52 45 L_DTRACE_PROC_RE
d0d0: 54 55 52 4e 28 6c 20 3c 20 69 50 74 72 2d 3e 76 TURN(l < iPtr->v
d0e0: 61 72 46 72 61 6d 65 50 74 72 2d 3e 6f 62 6a 63 arFramePtr->objc
d0f0: 20 3f 0a 09 09 54 63 6c 47 65 74 53 74 72 69 6e ?...TclGetStrin
d100: 67 28 69 50 74 72 2d 3e 76 61 72 46 72 61 6d 65 g(iPtr->varFrame
d110: 50 74 72 2d 3e 6f 62 6a 76 5b 6c 5d 29 20 3a 20 Ptr->objv[l]) :
d120: 4e 55 4c 4c 2c 20 72 65 73 75 6c 74 29 3b 0a 20 NULL, result);.
d130: 20 20 20 7d 0a 20 20 20 20 69 66 20 28 70 72 6f }. if (pro
d140: 63 50 74 72 2d 3e 72 65 66 43 6f 75 6e 74 2d 2d cPtr->refCount--
d150: 20 3c 3d 20 31 29 20 7b 0a 09 54 63 6c 50 72 6f <= 1) {..TclPro
d160: 63 43 6c 65 61 6e 75 70 50 72 6f 63 28 70 72 6f cCleanupProc(pro
d170: 63 50 74 72 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 cPtr);. }..
d180: 20 20 2f 2a 0a 20 20 20 20 20 2a 20 46 72 65 65 /*. * Free
d190: 20 74 68 65 20 73 74 61 63 6b 2d 61 6c 6c 6f 63 the stack-alloc
d1a0: 61 74 65 64 20 63 6f 6d 70 69 6c 65 64 20 6c 6f ated compiled lo
d1b0: 63 61 6c 73 20 61 6e 64 20 43 61 6c 6c 46 72 61 cals and CallFra
d1c0: 6d 65 2e 20 49 74 20 69 73 20 69 6d 70 6f 72 74 me. It is import
d1d0: 61 6e 74 0a 20 20 20 20 20 2a 20 74 6f 20 70 6f ant. * to po
d1e0: 70 20 74 68 65 20 63 61 6c 6c 20 66 72 61 6d 65 p the call frame
d1f0: 20 77 69 74 68 6f 75 74 20 66 72 65 65 69 6e 67 without freeing
d200: 20 69 74 20 66 69 72 73 74 3a 20 74 68 65 20 63 it first: the c
d210: 6f 6d 70 69 6c 65 64 4c 6f 63 61 6c 73 0a 20 20 ompiledLocals.
d220: 20 20 20 2a 20 63 61 6e 6e 6f 74 20 62 65 20 66 * cannot be f
d230: 72 65 65 64 20 62 65 66 6f 72 65 20 74 68 65 20 reed before the
d240: 66 72 61 6d 65 20 69 73 20 70 6f 70 70 65 64 2c frame is popped,
d250: 20 61 73 20 74 68 65 20 6c 6f 63 61 6c 20 76 61 as the local va
d260: 72 69 61 62 6c 65 73 20 6d 75 73 74 0a 20 20 20 riables must.
d270: 20 20 2a 20 62 65 20 64 65 6c 65 74 65 64 2e 20 * be deleted.
d280: 42 75 74 20 74 68 65 20 63 6f 6d 70 69 6c 65 64 But the compiled
d290: 4c 6f 63 61 6c 73 20 6d 75 73 74 20 62 65 20 66 Locals must be f
d2a0: 72 65 65 64 20 66 69 72 73 74 2c 20 61 73 20 74 reed first, as t
d2b0: 68 65 79 20 77 65 72 65 0a 20 20 20 20 20 2a 20 hey were. *
d2c0: 61 6c 6c 6f 63 61 74 65 64 20 6c 61 74 65 72 20 allocated later
d2d0: 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 0a 20 20 on the stack..
d2e0: 20 20 20 2a 2f 0a 0a 20 20 20 20 69 66 20 28 72 */.. if (r
d2f0: 65 73 75 6c 74 20 21 3d 20 54 43 4c 5f 4f 4b 29 esult != TCL_OK)
d300: 20 7b 0a 09 67 6f 74 6f 20 70 72 6f 63 65 73 73 {..goto process
d310: 3b 0a 20 20 20 20 7d 0a 0a 20 20 64 6f 6e 65 3a ;. }.. done:
d320: 0a 20 20 20 20 69 66 20 28 54 43 4c 5f 44 54 52 . if (TCL_DTR
d330: 41 43 45 5f 50 52 4f 43 5f 52 45 53 55 4c 54 5f ACE_PROC_RESULT_
d340: 45 4e 41 42 4c 45 44 28 29 29 20 7b 0a 09 54 63 ENABLED()) {..Tc
d350: 6c 5f 53 69 7a 65 20 6c 20 3d 20 28 69 50 74 72 l_Size l = (iPtr
d360: 2d 3e 76 61 72 46 72 61 6d 65 50 74 72 2d 3e 69 ->varFramePtr->i
d370: 73 50 72 6f 63 43 61 6c 6c 46 72 61 6d 65 20 26 sProcCallFrame &
d380: 20 46 52 41 4d 45 5f 49 53 5f 4c 41 4d 42 44 41 FRAME_IS_LAMBDA
d390: 29 20 3f 20 31 20 3a 20 30 3b 0a 09 54 63 6c 5f ) ? 1 : 0;..Tcl_
d3a0: 4f 62 6a 20 2a 72 20 3d 20 54 63 6c 5f 47 65 74 Obj *r = Tcl_Get
d3b0: 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 ObjResult(interp
d3c0: 29 3b 0a 0a 09 54 43 4c 5f 44 54 52 41 43 45 5f );...TCL_DTRACE_
d3d0: 50 52 4f 43 5f 52 45 53 55 4c 54 28 6c 20 3c 20 PROC_RESULT(l <
d3e0: 69 50 74 72 2d 3e 76 61 72 46 72 61 6d 65 50 74 iPtr->varFramePt
d3f0: 72 2d 3e 6f 62 6a 63 20 3f 0a 09 09 54 63 6c 47 r->objc ?...TclG
d400: 65 74 53 74 72 69 6e 67 28 69 50 74 72 2d 3e 76 etString(iPtr->v
d410: 61 72 46 72 61 6d 65 50 74 72 2d 3e 6f 62 6a 76 arFramePtr->objv
d420: 5b 6c 5d 29 20 3a 20 4e 55 4c 4c 2c 20 72 65 73 [l]) : NULL, res
d430: 75 6c 74 2c 0a 09 09 54 63 6c 47 65 74 53 74 72 ult,...TclGetStr
d440: 69 6e 67 28 72 29 2c 20 72 29 3b 0a 20 20 20 20 ing(r), r);.
d450: 7d 0a 0a 20 20 20 20 66 72 65 65 50 74 72 20 3d }.. freePtr =
d460: 20 69 50 74 72 2d 3e 66 72 61 6d 65 50 74 72 3b iPtr->framePtr;
d470: 0a 20 20 20 20 54 63 6c 5f 50 6f 70 43 61 6c 6c . Tcl_PopCall
d480: 46 72 61 6d 65 28 69 6e 74 65 72 70 29 3b 09 09 Frame(interp);..
d490: 2f 2a 20 50 6f 70 20 62 75 74 20 64 6f 20 6e 6f /* Pop but do no
d4a0: 74 20 66 72 65 65 2e 20 2a 2f 0a 20 20 20 20 54 t free. */. T
d4b0: 63 6c 53 74 61 63 6b 46 72 65 65 28 69 6e 74 65 clStackFree(inte
d4c0: 72 70 2c 20 66 72 65 65 50 74 72 2d 3e 63 6f 6d rp, freePtr->com
d4d0: 70 69 6c 65 64 4c 6f 63 61 6c 73 29 3b 0a 09 09 piledLocals);...
d4e0: 09 09 09 2f 2a 20 46 72 65 65 20 63 6f 6d 70 69 .../* Free compi
d4f0: 6c 65 64 4c 6f 63 61 6c 73 2e 20 2a 2f 0a 20 20 ledLocals. */.
d500: 20 20 54 63 6c 53 74 61 63 6b 46 72 65 65 28 69 TclStackFree(i
d510: 6e 74 65 72 70 2c 20 66 72 65 65 50 74 72 29 3b nterp, freePtr);
d520: 09 2f 2a 20 46 72 65 65 20 43 61 6c 6c 46 72 61 ./* Free CallFra
d530: 6d 65 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 me. */. retur
d540: 6e 20 72 65 73 75 6c 74 3b 0a 0a 20 20 20 20 2f n result;.. /
d550: 2a 0a 20 20 20 20 20 2a 20 50 72 6f 63 65 73 73 *. * Process
d560: 20 61 6e 79 20 6e 6f 6e 2d 54 43 4c 5f 4f 4b 20 any non-TCL_OK
d570: 72 65 73 75 6c 74 20 63 6f 64 65 2e 0a 20 20 20 result code..
d580: 20 20 2a 2f 0a 0a 20 20 70 72 6f 63 65 73 73 3a */.. process:
d590: 0a 20 20 20 20 73 77 69 74 63 68 20 28 72 65 73 . switch (res
d5a0: 75 6c 74 29 20 7b 0a 20 20 20 20 63 61 73 65 20 ult) {. case
d5b0: 54 43 4c 5f 52 45 54 55 52 4e 3a 0a 09 2f 2a 0a TCL_RETURN:../*.
d5c0: 09 20 2a 20 49 66 20 69 74 20 69 73 20 61 20 27 . * If it is a '
d5d0: 72 65 74 75 72 6e 27 2c 20 64 6f 20 74 68 65 20 return', do the
d5e0: 54 49 50 23 39 30 20 70 72 6f 63 65 73 73 69 6e TIP#90 processin
d5f0: 67 20 6e 6f 77 2e 0a 09 20 2a 2f 0a 0a 09 72 65 g now... */...re
d600: 73 75 6c 74 20 3d 20 54 63 6c 55 70 64 61 74 65 sult = TclUpdate
d610: 52 65 74 75 72 6e 49 6e 66 6f 28 28 49 6e 74 65 ReturnInfo((Inte
d620: 72 70 20 2a 29 20 69 6e 74 65 72 70 29 3b 0a 09 rp *) interp);..
d630: 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 break;.. case
d640: 20 54 43 4c 5f 43 4f 4e 54 49 4e 55 45 3a 0a 20 TCL_CONTINUE:.
d650: 20 20 20 63 61 73 65 20 54 43 4c 5f 42 52 45 41 case TCL_BREA
d660: 4b 3a 0a 09 2f 2a 0a 09 20 2a 20 49 74 27 73 20 K:../*.. * It's
d670: 61 6e 20 65 72 72 6f 72 20 74 6f 20 67 65 74 20 an error to get
d680: 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 20 66 72 to this point fr
d690: 6f 6d 20 61 20 27 62 72 65 61 6b 27 20 6f 72 20 om a 'break' or
d6a0: 27 63 6f 6e 74 69 6e 75 65 27 2c 20 73 6f 0a 09 'continue', so..
d6b0: 20 2a 20 74 72 61 6e 73 66 6f 72 6d 20 74 6f 20 * transform to
d6c0: 61 6e 20 65 72 72 6f 72 20 6e 6f 77 2e 0a 09 20 an error now...
d6d0: 2a 2f 0a 0a 09 54 63 6c 5f 53 65 74 4f 62 6a 52 */...Tcl_SetObjR
d6e0: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 esult(interp, Tc
d6f0: 6c 5f 4f 62 6a 50 72 69 6e 74 66 28 0a 09 09 22 l_ObjPrintf(..."
d700: 69 6e 76 6f 6b 65 64 20 5c 22 25 73 5c 22 20 6f invoked \"%s\" o
d710: 75 74 73 69 64 65 20 6f 66 20 61 20 6c 6f 6f 70 utside of a loop
d720: 22 2c 0a 09 09 28 28 72 65 73 75 6c 74 20 3d 3d ",...((result ==
d730: 20 54 43 4c 5f 42 52 45 41 4b 29 20 3f 20 22 62 TCL_BREAK) ? "b
d740: 72 65 61 6b 22 20 3a 20 22 63 6f 6e 74 69 6e 75 reak" : "continu
d750: 65 22 29 29 29 3b 0a 09 54 63 6c 5f 53 65 74 45 e")));..Tcl_SetE
d760: 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c rrorCode(interp,
d770: 20 22 54 43 4c 22 2c 20 22 52 45 53 55 4c 54 22 "TCL", "RESULT"
d780: 2c 20 22 55 4e 45 58 50 45 43 54 45 44 22 2c 20 , "UNEXPECTED",
d790: 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 (char *)NULL);..
d7a0: 72 65 73 75 6c 74 20 3d 20 54 43 4c 5f 45 52 52 result = TCL_ERR
d7b0: 4f 52 3b 0a 09 54 43 4c 5f 46 41 4c 4c 54 48 52 OR;..TCL_FALLTHR
d7c0: 4f 55 47 48 28 29 3b 0a 0a 20 20 20 20 63 61 73 OUGH();.. cas
d7d0: 65 20 54 43 4c 5f 45 52 52 4f 52 3a 0a 09 2f 2a e TCL_ERROR:../*
d7e0: 0a 09 20 2a 20 4e 6f 77 20 69 74 20 5f 6d 75 73 .. * Now it _mus
d7f0: 74 5f 20 62 65 20 61 6e 20 65 72 72 6f 72 2c 20 t_ be an error,
d800: 73 6f 20 77 65 20 6e 65 65 64 20 74 6f 20 6c 6f so we need to lo
d810: 67 20 69 74 20 61 73 20 73 75 63 68 2e 20 54 68 g it as such. Th
d820: 69 73 20 6d 65 61 6e 73 0a 09 20 2a 20 66 69 6c is means.. * fil
d830: 6c 69 6e 67 20 6f 75 74 20 74 68 65 20 65 72 72 ling out the err
d840: 6f 72 20 74 72 61 63 65 2e 20 4c 75 63 6b 69 6c or trace. Luckil
d850: 79 2c 20 77 65 20 6a 75 73 74 20 68 61 6e 64 20 y, we just hand
d860: 74 68 69 73 20 6f 66 66 20 74 6f 20 74 68 65 0a this off to the.
d870: 09 20 2a 20 66 75 6e 63 74 69 6f 6e 20 68 61 6e . * function han
d880: 64 65 64 20 74 6f 20 75 73 20 61 73 20 61 6e 20 ded to us as an
d890: 61 72 67 75 6d 65 6e 74 2e 0a 09 20 2a 2f 0a 0a argument... */..
d8a0: 09 65 72 72 6f 72 50 72 6f 63 28 69 6e 74 65 72 .errorProc(inter
d8b0: 70 2c 20 70 72 6f 63 4e 61 6d 65 4f 62 6a 29 3b p, procNameObj);
d8c0: 0a 20 20 20 20 7d 0a 20 20 20 20 67 6f 74 6f 20 . }. goto
d8d0: 64 6f 6e 65 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d done;.}.../*. *-
d8e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d8f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d900: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d910: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d920: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 63 6c 50 -----. *. * TclP
d930: 72 6f 63 43 6f 6d 70 69 6c 65 50 72 6f 63 20 2d rocCompileProc -
d940: 2d 0a 20 2a 0a 20 2a 09 43 61 6c 6c 65 64 20 6a -. *. *.Called j
d950: 75 73 74 20 62 65 66 6f 72 65 20 61 20 70 72 6f ust before a pro
d960: 63 65 64 75 72 65 20 69 73 20 65 78 65 63 75 74 cedure is execut
d970: 65 64 20 74 6f 20 63 6f 6d 70 69 6c 65 20 74 68 ed to compile th
d980: 65 20 62 6f 64 79 20 74 6f 20 62 79 74 65 0a 20 e body to byte.
d990: 2a 09 63 6f 64 65 73 2e 20 49 66 20 74 68 65 20 *.codes. If the
d9a0: 74 79 70 65 20 6f 66 20 74 68 65 20 62 6f 64 79 type of the body
d9b0: 20 69 73 20 6e 6f 74 20 22 62 79 74 65 20 63 6f is not "byte co
d9c0: 64 65 22 20 6f 72 20 69 66 20 74 68 65 20 63 6f de" or if the co
d9d0: 6d 70 69 6c 65 0a 20 2a 09 63 6f 6e 64 69 74 69 mpile. *.conditi
d9e0: 6f 6e 73 20 68 61 76 65 20 63 68 61 6e 67 65 64 ons have changed
d9f0: 20 28 6e 61 6d 65 73 70 61 63 65 20 63 6f 6e 74 (namespace cont
da00: 65 78 74 2c 20 65 70 6f 63 68 20 63 6f 75 6e 74 ext, epoch count
da10: 65 72 73 2c 20 65 74 63 2e 29 20 74 68 65 6e 0a ers, etc.) then.
da20: 20 2a 09 74 68 65 20 62 6f 64 79 20 69 73 20 72 *.the body is r
da30: 65 63 6f 6d 70 69 6c 65 64 2e 20 4f 74 68 65 72 ecompiled. Other
da40: 77 69 73 65 2c 20 74 68 69 73 20 66 75 6e 63 74 wise, this funct
da50: 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 68 69 6e 67 ion does nothing
da60: 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a .. *. * Results:
da70: 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 20 . *.None.. *. *
da80: 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a Side effects:. *
da90: 09 4d 61 79 20 63 68 61 6e 67 65 20 74 68 65 20 .May change the
daa0: 69 6e 74 65 72 6e 61 6c 20 72 65 70 72 65 73 65 internal represe
dab0: 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 62 ntation of the b
dac0: 6f 64 79 20 6f 62 6a 65 63 74 20 74 6f 20 63 6f ody object to co
dad0: 6d 70 69 6c 65 64 0a 20 2a 09 63 6f 64 65 2e 0a mpiled. *.code..
dae0: 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *-----------
daf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
db00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
db10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
db20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a -----------. */.
db30: 0a 69 6e 74 0a 54 63 6c 50 72 6f 63 43 6f 6d 70 .int.TclProcComp
db40: 69 6c 65 50 72 6f 63 28 0a 20 20 20 20 54 63 6c ileProc(. Tcl
db50: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c _Interp *interp,
db60: 09 09 2f 2a 20 49 6e 74 65 72 70 72 65 74 65 72 ../* Interpreter
db70: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 70 72 6f 63 containing proc
db80: 65 64 75 72 65 2e 20 2a 2f 0a 20 20 20 20 50 72 edure. */. Pr
db90: 6f 63 20 2a 70 72 6f 63 50 74 72 2c 09 09 2f 2a oc *procPtr,../*
dba0: 20 44 61 74 61 20 61 73 73 6f 63 69 61 74 65 64 Data associated
dbb0: 20 77 69 74 68 20 70 72 6f 63 65 64 75 72 65 2e with procedure.
dbc0: 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 */. Tcl_Obj
dbd0: 2a 62 6f 64 79 50 74 72 2c 09 09 2f 2a 20 42 6f *bodyPtr,../* Bo
dbe0: 64 79 20 6f 66 20 70 72 6f 63 2e 20 28 55 73 75 dy of proc. (Usu
dbf0: 61 6c 6c 79 20 70 72 6f 63 50 74 72 2d 3e 62 6f ally procPtr->bo
dc00: 64 79 50 74 72 2c 0a 09 09 09 09 20 2a 20 62 75 dyPtr,..... * bu
dc10: 74 20 63 6f 75 6c 64 20 62 65 20 61 6e 79 20 63 t could be any c
dc20: 6f 64 65 20 66 72 61 67 6d 65 6e 74 20 63 6f 6d ode fragment com
dc30: 70 69 6c 65 64 20 69 6e 0a 09 09 09 09 20 2a 20 piled in..... *
dc40: 74 68 65 20 63 6f 6e 74 65 78 74 20 6f 66 20 74 the context of t
dc50: 68 69 73 20 70 72 6f 63 65 64 75 72 65 2e 29 20 his procedure.)
dc60: 2a 2f 0a 20 20 20 20 4e 61 6d 65 73 70 61 63 65 */. Namespace
dc70: 20 2a 6e 73 50 74 72 2c 09 09 2f 2a 20 4e 61 6d *nsPtr,../* Nam
dc80: 65 73 70 61 63 65 20 63 6f 6e 74 61 69 6e 69 6e espace containin
dc90: 67 20 70 72 6f 63 65 64 75 72 65 2e 20 2a 2f 0a g procedure. */.
dca0: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a const char *
dcb0: 64 65 73 63 72 69 70 74 69 6f 6e 2c 09 2f 2a 20 description,./*
dcc0: 73 74 72 69 6e 67 20 64 65 73 63 72 69 62 69 6e string describin
dcd0: 67 20 74 68 69 73 20 62 6f 64 79 20 6f 66 20 63 g this body of c
dce0: 6f 64 65 2e 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 ode. */. cons
dcf0: 74 20 63 68 61 72 20 2a 70 72 6f 63 4e 61 6d 65 t char *procName
dd00: 29 09 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 69 )./* Name of thi
dd10: 73 20 70 72 6f 63 65 64 75 72 65 2e 20 2a 2f 0a s procedure. */.
dd20: 7b 0a 20 20 20 20 49 6e 74 65 72 70 20 2a 69 50 {. Interp *iP
dd30: 74 72 20 3d 20 28 49 6e 74 65 72 70 20 2a 29 20 tr = (Interp *)
dd40: 69 6e 74 65 72 70 3b 0a 20 20 20 20 54 63 6c 5f interp;. Tcl_
dd50: 43 61 6c 6c 46 72 61 6d 65 20 2a 66 72 61 6d 65 CallFrame *frame
dd60: 50 74 72 3b 0a 20 20 20 20 42 79 74 65 43 6f 64 Ptr;. ByteCod
dd70: 65 20 2a 63 6f 64 65 50 74 72 3b 0a 0a 20 20 20 e *codePtr;..
dd80: 20 42 79 74 65 43 6f 64 65 47 65 74 49 6e 74 65 ByteCodeGetInte
dd90: 72 6e 61 6c 52 65 70 28 62 6f 64 79 50 74 72 2c rnalRep(bodyPtr,
dda0: 20 26 74 63 6c 42 79 74 65 43 6f 64 65 54 79 70 &tclByteCodeTyp
ddb0: 65 2c 20 63 6f 64 65 50 74 72 29 3b 0a 0a 20 20 e, codePtr);..
ddc0: 20 20 2f 2a 0a 20 20 20 20 20 2a 20 49 66 20 6e /*. * If n
ddd0: 65 63 65 73 73 61 72 79 2c 20 63 6f 6d 70 69 6c ecessary, compil
dde0: 65 20 74 68 65 20 70 72 6f 63 65 64 75 72 65 27 e the procedure'
ddf0: 73 20 62 6f 64 79 2e 20 54 68 65 20 63 6f 6d 70 s body. The comp
de00: 69 6c 65 72 20 77 69 6c 6c 20 61 6c 6c 6f 63 61 iler will alloca
de10: 74 65 0a 20 20 20 20 20 2a 20 66 72 61 6d 65 20 te. * frame
de20: 73 6c 6f 74 73 20 66 6f 72 20 74 68 65 20 70 72 slots for the pr
de30: 6f 63 65 64 75 72 65 27 73 20 6e 6f 6e 2d 61 72 ocedure's non-ar
de40: 67 75 6d 65 6e 74 20 6c 6f 63 61 6c 20 76 61 72 gument local var
de50: 69 61 62 6c 65 73 2e 20 49 66 20 74 68 65 0a 20 iables. If the.
de60: 20 20 20 20 2a 20 42 79 74 65 43 6f 64 65 20 61 * ByteCode a
de70: 6c 72 65 61 64 79 20 65 78 69 73 74 73 2c 20 6d lready exists, m
de80: 61 6b 65 20 73 75 72 65 20 69 74 20 68 61 73 6e ake sure it hasn
de90: 27 74 20 62 65 65 6e 20 69 6e 76 61 6c 69 64 61 't been invalida
dea0: 74 65 64 20 62 79 0a 20 20 20 20 20 2a 20 73 6f ted by. * so
deb0: 6d 65 6f 6e 65 20 72 65 64 65 66 69 6e 69 6e 67 meone redefining
dec0: 20 61 20 63 6f 72 65 20 63 6f 6d 6d 61 6e 64 20 a core command
ded0: 28 74 68 69 73 20 6d 69 67 68 74 20 6d 61 6b 65 (this might make
dee0: 20 74 68 65 20 63 6f 6d 70 69 6c 65 64 20 63 6f the compiled co
def0: 64 65 0a 20 20 20 20 20 2a 20 77 72 6f 6e 67 29 de. * wrong)
df00: 2e 20 41 6c 73 6f 2c 20 69 66 20 74 68 65 20 63 . Also, if the c
df10: 6f 64 65 20 77 61 73 20 63 6f 6d 70 69 6c 65 64 ode was compiled
df20: 20 69 6e 2f 66 6f 72 20 61 20 64 69 66 66 65 72 in/for a differ
df30: 65 6e 74 20 69 6e 74 65 72 70 72 65 74 65 72 2c ent interpreter,
df40: 0a 20 20 20 20 20 2a 20 77 65 20 72 65 63 6f 6d . * we recom
df50: 70 69 6c 65 20 69 74 2e 20 4e 6f 74 65 20 74 68 pile it. Note th
df60: 61 74 20 63 6f 6d 70 69 6c 69 6e 67 20 74 68 65 at compiling the
df70: 20 62 6f 64 79 20 6d 69 67 68 74 20 69 6e 63 72 body might incr
df80: 65 61 73 65 0a 20 20 20 20 20 2a 20 70 72 6f 63 ease. * proc
df90: 50 74 72 2d 3e 6e 75 6d 43 6f 6d 70 69 6c 65 64 Ptr->numCompiled
dfa0: 4c 6f 63 61 6c 73 20 69 66 20 6e 65 77 20 6c 6f Locals if new lo
dfb0: 63 61 6c 20 76 61 72 69 61 62 6c 65 73 20 61 72 cal variables ar
dfc0: 65 20 66 6f 75 6e 64 20 77 68 69 6c 65 0a 20 20 e found while.
dfd0: 20 20 20 2a 20 63 6f 6d 70 69 6c 69 6e 67 2e 0a * compiling..
dfe0: 20 20 20 20 20 2a 0a 20 20 20 20 20 2a 20 45 6e *. * En
dff0: 73 75 72 65 20 74 68 65 20 42 79 74 65 43 6f 64 sure the ByteCod
e000: 65 27 73 20 70 72 6f 63 50 74 72 20 69 73 20 74 e's procPtr is t
e010: 68 65 20 73 61 6d 65 20 28 6f 72 20 69 74 20 69 he same (or it i
e020: 73 20 70 75 72 65 20 70 72 65 63 6f 6d 70 69 6c s pure precompil
e030: 65 64 29 2e 0a 20 20 20 20 20 2a 20 50 72 65 63 ed).. * Prec
e040: 6f 6d 70 69 6c 65 64 20 70 72 6f 63 65 64 75 72 ompiled procedur
e050: 65 20 62 6f 64 69 65 73 2c 20 68 6f 77 65 76 65 e bodies, howeve
e060: 72 2c 20 61 72 65 20 69 6d 6d 75 74 61 62 6c 65 r, are immutable
e070: 20 61 6e 64 20 74 68 65 72 65 66 6f 72 65 20 74 and therefore t
e080: 68 65 79 0a 20 20 20 20 20 2a 20 61 72 65 20 6e hey. * are n
e090: 6f 74 20 72 65 63 6f 6d 70 69 6c 65 64 2c 20 65 ot recompiled, e
e0a0: 76 65 6e 20 69 66 20 74 68 69 6e 67 73 20 68 61 ven if things ha
e0b0: 76 65 20 63 68 61 6e 67 65 64 2e 0a 20 20 20 20 ve changed..
e0c0: 20 2a 2f 0a 0a 20 20 20 20 69 66 20 28 63 6f 64 */.. if (cod
e0d0: 65 50 74 72 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a ePtr != NULL) {.
e0e0: 09 69 66 20 28 28 28 49 6e 74 65 72 70 20 2a 29 .if (((Interp *)
e0f0: 20 2a 63 6f 64 65 50 74 72 2d 3e 69 6e 74 65 72 *codePtr->inter
e100: 70 48 61 6e 64 6c 65 20 3d 3d 20 69 50 74 72 29 pHandle == iPtr)
e110: 0a 09 09 26 26 20 28 63 6f 64 65 50 74 72 2d 3e ...&& (codePtr->
e120: 63 6f 6d 70 69 6c 65 45 70 6f 63 68 20 3d 3d 20 compileEpoch ==
e130: 69 50 74 72 2d 3e 63 6f 6d 70 69 6c 65 45 70 6f iPtr->compileEpo
e140: 63 68 29 0a 09 09 26 26 20 28 63 6f 64 65 50 74 ch)...&& (codePt
e150: 72 2d 3e 6e 73 50 74 72 20 3d 3d 20 6e 73 50 74 r->nsPtr == nsPt
e160: 72 29 0a 09 09 26 26 20 28 63 6f 64 65 50 74 72 r)...&& (codePtr
e170: 2d 3e 6e 73 45 70 6f 63 68 20 3d 3d 20 6e 73 50 ->nsEpoch == nsP
e180: 74 72 2d 3e 72 65 73 6f 6c 76 65 72 45 70 6f 63 tr->resolverEpoc
e190: 68 29 0a 09 09 26 26 20 28 28 63 6f 64 65 50 74 h)...&& ((codePt
e1a0: 72 2d 3e 70 72 6f 63 50 74 72 20 3d 3d 20 70 72 r->procPtr == pr
e1b0: 6f 63 50 74 72 29 20 7c 7c 20 21 62 6f 64 79 50 ocPtr) || !bodyP
e1c0: 74 72 2d 3e 62 79 74 65 73 29 29 20 7b 0a 09 20 tr->bytes)) {..
e1d0: 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b return TCL_OK
e1e0: 3b 0a 09 7d 0a 0a 09 69 66 20 28 63 6f 64 65 50 ;..}...if (codeP
e1f0: 74 72 2d 3e 66 6c 61 67 73 20 26 20 54 43 4c 5f tr->flags & TCL_
e200: 42 59 54 45 43 4f 44 45 5f 50 52 45 43 4f 4d 50 BYTECODE_PRECOMP
e210: 49 4c 45 44 29 20 7b 0a 09 20 20 20 20 69 66 20 ILED) {.. if
e220: 28 28 49 6e 74 65 72 70 20 2a 29 20 2a 63 6f 64 ((Interp *) *cod
e230: 65 50 74 72 2d 3e 69 6e 74 65 72 70 48 61 6e 64 ePtr->interpHand
e240: 6c 65 20 21 3d 20 69 50 74 72 29 20 7b 0a 09 09 le != iPtr) {...
e250: 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 Tcl_SetObjResult
e260: 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 (interp, Tcl_New
e270: 53 74 72 69 6e 67 4f 62 6a 28 0a 09 09 09 22 61 StringObj(...."a
e280: 20 70 72 65 63 6f 6d 70 69 6c 65 64 20 73 63 72 precompiled scr
e290: 69 70 74 20 6a 75 6d 70 65 64 20 69 6e 74 65 72 ipt jumped inter
e2a0: 70 73 22 2c 20 2d 31 29 29 3b 0a 09 09 54 63 6c ps", -1));...Tcl
e2b0: 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e _SetErrorCode(in
e2c0: 74 65 72 70 2c 20 22 54 43 4c 22 2c 20 22 4f 50 terp, "TCL", "OP
e2d0: 45 52 41 54 49 4f 4e 22 2c 20 22 50 52 4f 43 22 ERATION", "PROC"
e2e0: 2c 0a 09 09 09 22 43 52 4f 53 53 49 4e 54 45 52 ,...."CROSSINTER
e2f0: 50 42 59 54 45 43 4f 44 45 22 2c 20 28 63 68 61 PBYTECODE", (cha
e300: 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 09 72 65 74 r *)NULL);...ret
e310: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 urn TCL_ERROR;..
e320: 20 20 20 20 7d 0a 09 20 20 20 20 63 6f 64 65 50 }.. codeP
e330: 74 72 2d 3e 63 6f 6d 70 69 6c 65 45 70 6f 63 68 tr->compileEpoch
e340: 20 3d 20 69 50 74 72 2d 3e 63 6f 6d 70 69 6c 65 = iPtr->compile
e350: 45 70 6f 63 68 3b 0a 09 20 20 20 20 63 6f 64 65 Epoch;.. code
e360: 50 74 72 2d 3e 6e 73 50 74 72 20 3d 20 6e 73 50 Ptr->nsPtr = nsP
e370: 74 72 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 tr;..} else {..
e380: 20 20 20 54 63 6c 5f 53 74 6f 72 65 49 6e 74 65 Tcl_StoreInte
e390: 72 6e 61 6c 52 65 70 28 62 6f 64 79 50 74 72 2c rnalRep(bodyPtr,
e3a0: 20 26 74 63 6c 42 79 74 65 43 6f 64 65 54 79 70 &tclByteCodeTyp
e3b0: 65 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 63 e, NULL);.. c
e3c0: 6f 64 65 50 74 72 20 3d 20 4e 55 4c 4c 3b 0a 09 odePtr = NULL;..
e3d0: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 }. }.. if
e3e0: 28 63 6f 64 65 50 74 72 20 3d 3d 20 4e 55 4c 4c (codePtr == NULL
e3f0: 29 20 7b 0a 09 54 63 6c 5f 48 61 73 68 45 6e 74 ) {..Tcl_HashEnt
e400: 72 79 20 2a 68 65 50 74 72 3b 0a 0a 23 69 66 64 ry *hePtr;..#ifd
e410: 65 66 20 54 43 4c 5f 43 4f 4d 50 49 4c 45 5f 44 ef TCL_COMPILE_D
e420: 45 42 55 47 0a 09 69 66 20 28 74 63 6c 54 72 61 EBUG..if (tclTra
e430: 63 65 43 6f 6d 70 69 6c 65 20 3e 3d 20 54 43 4c ceCompile >= TCL
e440: 5f 54 52 41 43 45 5f 42 59 54 45 43 4f 44 45 5f _TRACE_BYTECODE_
e450: 43 4f 4d 50 49 4c 45 5f 53 55 4d 4d 41 52 59 29 COMPILE_SUMMARY)
e460: 20 7b 0a 09 20 20 20 20 2f 2a 0a 09 20 20 20 20 {.. /*..
e470: 20 2a 20 44 69 73 70 6c 61 79 20 61 20 6c 69 6e * Display a lin
e480: 65 20 73 75 6d 6d 61 72 69 7a 69 6e 67 20 74 68 e summarizing th
e490: 65 20 74 6f 70 20 6c 65 76 65 6c 20 63 6f 6d 6d e top level comm
e4a0: 61 6e 64 20 77 65 20 61 72 65 20 61 62 6f 75 74 and we are about
e4b0: 0a 09 20 20 20 20 20 2a 20 74 6f 20 63 6f 6d 70 .. * to comp
e4c0: 69 6c 65 2e 0a 09 20 20 20 20 20 2a 2f 0a 0a 09 ile... */...
e4d0: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6d 65 73 Tcl_Obj *mes
e4e0: 73 61 67 65 3b 0a 0a 09 20 20 20 20 54 63 6c 4e sage;... TclN
e4f0: 65 77 4c 69 74 65 72 61 6c 53 74 72 69 6e 67 4f ewLiteralStringO
e500: 62 6a 28 6d 65 73 73 61 67 65 2c 20 22 43 6f 6d bj(message, "Com
e510: 70 69 6c 69 6e 67 20 22 29 3b 0a 09 20 20 20 20 piling ");..
e520: 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 Tcl_IncrRefCount
e530: 28 6d 65 73 73 61 67 65 29 3b 0a 09 20 20 20 20 (message);..
e540: 54 63 6c 5f 41 70 70 65 6e 64 53 74 72 69 6e 67 Tcl_AppendString
e550: 73 54 6f 4f 62 6a 28 6d 65 73 73 61 67 65 2c 20 sToObj(message,
e560: 64 65 73 63 72 69 70 74 69 6f 6e 2c 20 22 20 5c description, " \
e570: 22 22 2c 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c "", (char *)NULL
e580: 29 3b 0a 09 20 20 20 20 54 63 6c 5f 41 70 70 65 );.. Tcl_Appe
e590: 6e 64 4c 69 6d 69 74 65 64 54 6f 4f 62 6a 28 6d ndLimitedToObj(m
e5a0: 65 73 73 61 67 65 2c 20 70 72 6f 63 4e 61 6d 65 essage, procName
e5b0: 2c 20 54 43 4c 5f 49 4e 44 45 58 5f 4e 4f 4e 45 , TCL_INDEX_NONE
e5c0: 2c 20 35 30 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 , 50, NULL);..
e5d0: 20 20 66 70 72 69 6e 74 66 28 73 74 64 6f 75 74 fprintf(stdout
e5e0: 2c 20 22 25 73 5c 22 5c 6e 22 2c 20 54 63 6c 47 , "%s\"\n", TclG
e5f0: 65 74 53 74 72 69 6e 67 28 6d 65 73 73 61 67 65 etString(message
e600: 29 29 3b 0a 09 20 20 20 20 54 63 6c 5f 44 65 63 ));.. Tcl_Dec
e610: 72 52 65 66 43 6f 75 6e 74 28 6d 65 73 73 61 67 rRefCount(messag
e620: 65 29 3b 0a 09 7d 0a 23 65 6c 73 65 0a 20 20 20 e);..}.#else.
e630: 20 28 76 6f 69 64 29 64 65 73 63 72 69 70 74 69 (void)descripti
e640: 6f 6e 3b 0a 20 20 20 20 28 76 6f 69 64 29 70 72 on;. (void)pr
e650: 6f 63 4e 61 6d 65 3b 0a 23 65 6e 64 69 66 0a 0a ocName;.#endif..
e660: 09 2f 2a 0a 09 20 2a 20 50 6c 75 67 20 74 68 65 ./*.. * Plug the
e670: 20 63 75 72 72 65 6e 74 20 70 72 6f 63 50 74 72 current procPtr
e680: 20 69 6e 74 6f 20 74 68 65 20 69 6e 74 65 72 70 into the interp
e690: 72 65 74 65 72 20 61 6e 64 20 63 6f 65 72 63 65 reter and coerce
e6a0: 20 74 68 65 20 63 6f 64 65 0a 09 20 2a 20 62 6f the code.. * bo
e6b0: 64 79 20 74 6f 20 62 79 74 65 20 63 6f 64 65 73 dy to byte codes
e6c0: 2e 20 54 68 65 20 69 6e 74 65 72 70 72 65 74 65 . The interprete
e6d0: 72 20 6e 65 65 64 73 20 74 6f 20 6b 6e 6f 77 20 r needs to know
e6e0: 77 68 69 63 68 20 70 72 6f 63 20 69 74 27 73 0a which proc it's.
e6f0: 09 20 2a 20 63 6f 6d 70 69 6c 69 6e 67 20 73 6f . * compiling so
e700: 20 74 68 61 74 20 69 74 20 63 61 6e 20 61 63 63 that it can acc
e710: 65 73 73 20 69 74 73 20 6c 69 73 74 20 6f 66 20 ess its list of
e720: 63 6f 6d 70 69 6c 65 64 20 6c 6f 63 61 6c 73 2e compiled locals.
e730: 0a 09 20 2a 0a 09 20 2a 20 54 52 49 43 4b 59 20 .. *.. * TRICKY
e740: 4e 4f 54 45 3a 20 42 65 20 63 61 72 65 66 75 6c NOTE: Be careful
e750: 20 74 6f 20 70 75 73 68 20 61 20 63 61 6c 6c 20 to push a call
e760: 66 72 61 6d 65 20 77 69 74 68 20 74 68 65 20 70 frame with the p
e770: 72 6f 70 65 72 0a 09 20 2a 20 20 20 6e 61 6d 65 roper.. * name
e780: 73 70 61 63 65 20 63 6f 6e 74 65 78 74 2c 20 73 space context, s
e790: 6f 20 74 68 61 74 20 74 68 65 20 62 79 74 65 20 o that the byte
e7a0: 63 6f 64 65 73 20 61 72 65 20 63 6f 6d 70 69 6c codes are compil
e7b0: 65 64 20 69 6e 20 74 68 65 0a 09 20 2a 20 20 20 ed in the.. *
e7c0: 61 70 70 72 6f 70 72 69 61 74 65 20 63 6c 61 73 appropriate clas
e7d0: 73 20 63 6f 6e 74 65 78 74 2e 0a 09 20 2a 2f 0a s context... */.
e7e0: 0a 09 69 50 74 72 2d 3e 63 6f 6d 70 69 6c 65 64 ..iPtr->compiled
e7f0: 50 72 6f 63 50 74 72 20 3d 20 70 72 6f 63 50 74 ProcPtr = procPt
e800: 72 3b 0a 0a 09 69 66 20 28 70 72 6f 63 50 74 72 r;...if (procPtr
e810: 2d 3e 6e 75 6d 43 6f 6d 70 69 6c 65 64 4c 6f 63 ->numCompiledLoc
e820: 61 6c 73 20 3e 20 70 72 6f 63 50 74 72 2d 3e 6e als > procPtr->n
e830: 75 6d 41 72 67 73 29 20 7b 0a 09 20 20 20 20 43 umArgs) {.. C
e840: 6f 6d 70 69 6c 65 64 4c 6f 63 61 6c 20 2a 63 6c ompiledLocal *cl
e850: 50 74 72 20 3d 20 70 72 6f 63 50 74 72 2d 3e 66 Ptr = procPtr->f
e860: 69 72 73 74 4c 6f 63 61 6c 50 74 72 3b 0a 09 20 irstLocalPtr;..
e870: 20 20 20 43 6f 6d 70 69 6c 65 64 4c 6f 63 61 6c CompiledLocal
e880: 20 2a 6c 61 73 74 50 74 72 20 3d 20 4e 55 4c 4c *lastPtr = NULL
e890: 3b 0a 09 20 20 20 20 54 63 6c 5f 53 69 7a 65 20 ;.. Tcl_Size
e8a0: 69 2c 20 6e 75 6d 41 72 67 73 20 3d 20 70 72 6f i, numArgs = pro
e8b0: 63 50 74 72 2d 3e 6e 75 6d 41 72 67 73 3b 0a 0a cPtr->numArgs;..
e8c0: 09 20 20 20 20 66 6f 72 20 28 69 20 3d 20 30 3b . for (i = 0;
e8d0: 20 69 20 3c 20 6e 75 6d 41 72 67 73 3b 20 69 2b i < numArgs; i+
e8e0: 2b 29 20 7b 0a 09 09 6c 61 73 74 50 74 72 20 3d +) {...lastPtr =
e8f0: 20 63 6c 50 74 72 3b 0a 09 09 63 6c 50 74 72 20 clPtr;...clPtr
e900: 3d 20 63 6c 50 74 72 2d 3e 6e 65 78 74 50 74 72 = clPtr->nextPtr
e910: 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20 20 69 ;.. }... i
e920: 66 20 28 6c 61 73 74 50 74 72 29 20 7b 0a 09 09 f (lastPtr) {...
e930: 6c 61 73 74 50 74 72 2d 3e 6e 65 78 74 50 74 72 lastPtr->nextPtr
e940: 20 3d 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 7d 20 = NULL;.. }
e950: 65 6c 73 65 20 7b 0a 09 09 70 72 6f 63 50 74 72 else {...procPtr
e960: 2d 3e 66 69 72 73 74 4c 6f 63 61 6c 50 74 72 20 ->firstLocalPtr
e970: 3d 20 4e 55 4c 4c 3b 0a 09 20 20 20 20 7d 0a 09 = NULL;.. }..
e980: 20 20 20 20 70 72 6f 63 50 74 72 2d 3e 6c 61 73 procPtr->las
e990: 74 4c 6f 63 61 6c 50 74 72 20 3d 20 6c 61 73 74 tLocalPtr = last
e9a0: 50 74 72 3b 0a 09 20 20 20 20 77 68 69 6c 65 20 Ptr;.. while
e9b0: 28 63 6c 50 74 72 29 20 7b 0a 09 09 43 6f 6d 70 (clPtr) {...Comp
e9c0: 69 6c 65 64 4c 6f 63 61 6c 20 2a 74 6f 46 72 65 iledLocal *toFre
e9d0: 65 20 3d 20 63 6c 50 74 72 3b 0a 0a 09 09 63 6c e = clPtr;....cl
e9e0: 50 74 72 20 3d 20 63 6c 50 74 72 2d 3e 6e 65 78 Ptr = clPtr->nex
e9f0: 74 50 74 72 3b 0a 09 09 69 66 20 28 74 6f 46 72 tPtr;...if (toFr
ea00: 65 65 2d 3e 72 65 73 6f 6c 76 65 49 6e 66 6f 29 ee->resolveInfo)
ea10: 20 7b 0a 09 09 20 20 20 20 69 66 20 28 74 6f 46 {... if (toF
ea20: 72 65 65 2d 3e 72 65 73 6f 6c 76 65 49 6e 66 6f ree->resolveInfo
ea30: 2d 3e 64 65 6c 65 74 65 50 72 6f 63 29 20 7b 0a ->deleteProc) {.
ea40: 09 09 09 74 6f 46 72 65 65 2d 3e 72 65 73 6f 6c ...toFree->resol
ea50: 76 65 49 6e 66 6f 2d 3e 64 65 6c 65 74 65 50 72 veInfo->deletePr
ea60: 6f 63 28 74 6f 46 72 65 65 2d 3e 72 65 73 6f 6c oc(toFree->resol
ea70: 76 65 49 6e 66 6f 29 3b 0a 09 09 20 20 20 20 7d veInfo);... }
ea80: 20 65 6c 73 65 20 7b 0a 09 09 09 54 63 6c 5f 46 else {....Tcl_F
ea90: 72 65 65 28 74 6f 46 72 65 65 2d 3e 72 65 73 6f ree(toFree->reso
eaa0: 6c 76 65 49 6e 66 6f 29 3b 0a 09 09 20 20 20 20 lveInfo);...
eab0: 7d 0a 09 09 7d 0a 09 09 54 63 6c 5f 46 72 65 65 }...}...Tcl_Free
eac0: 28 74 6f 46 72 65 65 29 3b 0a 09 20 20 20 20 7d (toFree);.. }
ead0: 0a 09 20 20 20 20 70 72 6f 63 50 74 72 2d 3e 6e .. procPtr->n
eae0: 75 6d 43 6f 6d 70 69 6c 65 64 4c 6f 63 61 6c 73 umCompiledLocals
eaf0: 20 3d 20 70 72 6f 63 50 74 72 2d 3e 6e 75 6d 41 = procPtr->numA
eb00: 72 67 73 3b 0a 09 7d 0a 0a 09 28 76 6f 69 64 29 rgs;..}...(void)
eb10: 20 54 63 6c 50 75 73 68 53 74 61 63 6b 46 72 61 TclPushStackFra
eb20: 6d 65 28 69 6e 74 65 72 70 2c 20 26 66 72 61 6d me(interp, &fram
eb30: 65 50 74 72 2c 20 28 54 63 6c 5f 4e 61 6d 65 73 ePtr, (Tcl_Names
eb40: 70 61 63 65 20 2a 29 20 6e 73 50 74 72 2c 0a 09 pace *) nsPtr,..
eb50: 09 2f 2a 20 69 73 50 72 6f 63 43 61 6c 6c 46 72 ./* isProcCallFr
eb60: 61 6d 65 20 2a 2f 20 30 29 3b 0a 0a 09 2f 2a 0a ame */ 0);.../*.
eb70: 09 20 2a 20 54 49 50 20 23 32 38 30 3a 20 57 65 . * TIP #280: We
eb80: 20 67 65 74 20 74 68 65 20 69 6e 76 6f 6b 69 6e get the invokin
eb90: 67 20 63 6f 6e 74 65 78 74 20 66 72 6f 6d 20 74 g context from t
eba0: 68 65 20 63 6d 64 46 72 61 6d 65 20 77 68 69 63 he cmdFrame whic
ebb0: 68 0a 09 20 2a 20 77 61 73 20 73 61 76 65 64 20 h.. * was saved
ebc0: 62 79 20 27 54 63 6c 5f 50 72 6f 63 4f 62 6a 43 by 'Tcl_ProcObjC
ebd0: 6d 64 27 20 28 75 73 69 6e 67 20 6c 69 6e 65 50 md' (using lineP
ebe0: 42 6f 64 79 50 74 72 29 2e 0a 09 20 2a 2f 0a 0a BodyPtr)... */..
ebf0: 09 68 65 50 74 72 20 3d 20 54 63 6c 5f 46 69 6e .hePtr = Tcl_Fin
ec00: 64 48 61 73 68 45 6e 74 72 79 28 69 50 74 72 2d dHashEntry(iPtr-
ec10: 3e 6c 69 6e 65 50 42 6f 64 79 50 74 72 2c 20 70 >linePBodyPtr, p
ec20: 72 6f 63 50 74 72 29 3b 0a 0a 09 2f 2a 0a 09 20 rocPtr);.../*..
ec30: 2a 20 43 6f 6e 73 74 72 75 63 74 65 64 20 73 61 * Constructed sa
ec40: 76 65 64 20 66 72 61 6d 65 20 68 61 73 20 62 6f ved frame has bo
ec50: 64 79 20 61 73 20 77 6f 72 64 20 30 2e 20 53 65 dy as word 0. Se
ec60: 65 20 54 63 6c 5f 50 72 6f 63 4f 62 6a 43 6d 64 e Tcl_ProcObjCmd
ec70: 2e 0a 09 20 2a 2f 0a 0a 09 69 50 74 72 2d 3e 69 ... */...iPtr->i
ec80: 6e 76 6f 6b 65 57 6f 72 64 20 3d 20 30 3b 0a 09 nvokeWord = 0;..
ec90: 69 50 74 72 2d 3e 69 6e 76 6f 6b 65 43 6d 64 46 iPtr->invokeCmdF
eca0: 72 61 6d 65 50 74 72 20 3d 20 68 65 50 74 72 20 ramePtr = hePtr
ecb0: 3f 20 28 43 6d 64 46 72 61 6d 65 20 2a 29 54 63 ? (CmdFrame *)Tc
ecc0: 6c 5f 47 65 74 48 61 73 68 56 61 6c 75 65 28 68 l_GetHashValue(h
ecd0: 65 50 74 72 29 20 3a 20 4e 55 4c 4c 3b 0a 09 54 ePtr) : NULL;..T
ece0: 63 6c 53 65 74 42 79 74 65 43 6f 64 65 46 72 6f clSetByteCodeFro
ecf0: 6d 41 6e 79 28 69 6e 74 65 72 70 2c 20 62 6f 64 mAny(interp, bod
ed00: 79 50 74 72 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c yPtr, NULL, NULL
ed10: 29 3b 0a 09 69 50 74 72 2d 3e 69 6e 76 6f 6b 65 );..iPtr->invoke
ed20: 43 6d 64 46 72 61 6d 65 50 74 72 20 3d 20 4e 55 CmdFramePtr = NU
ed30: 4c 4c 3b 0a 09 54 63 6c 50 6f 70 53 74 61 63 6b LL;..TclPopStack
ed40: 46 72 61 6d 65 28 69 6e 74 65 72 70 29 3b 0a 20 Frame(interp);.
ed50: 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 63 6f } else if (co
ed60: 64 65 50 74 72 2d 3e 6e 73 45 70 6f 63 68 20 21 dePtr->nsEpoch !
ed70: 3d 20 6e 73 50 74 72 2d 3e 72 65 73 6f 6c 76 65 = nsPtr->resolve
ed80: 72 45 70 6f 63 68 29 20 7b 0a 09 2f 2a 0a 09 20 rEpoch) {../*..
ed90: 2a 20 54 68 65 20 72 65 73 6f 6c 76 65 72 20 65 * The resolver e
eda0: 70 6f 63 68 20 68 61 73 20 63 68 61 6e 67 65 64 poch has changed
edb0: 2c 20 62 75 74 20 77 65 20 6f 6e 6c 79 20 6e 65 , but we only ne
edc0: 65 64 20 74 6f 20 69 6e 76 61 6c 69 64 61 74 65 ed to invalidate
edd0: 20 74 68 65 0a 09 20 2a 20 72 65 73 6f 6c 76 65 the.. * resolve
ede0: 72 20 63 61 63 68 65 2e 0a 09 20 2a 2f 0a 0a 09 r cache... */...
edf0: 63 6f 64 65 50 74 72 2d 3e 6e 73 45 70 6f 63 68 codePtr->nsEpoch
ee00: 20 3d 20 6e 73 50 74 72 2d 3e 72 65 73 6f 6c 76 = nsPtr->resolv
ee10: 65 72 45 70 6f 63 68 3b 0a 09 63 6f 64 65 50 74 erEpoch;..codePt
ee20: 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 54 43 4c 5f r->flags |= TCL_
ee30: 42 59 54 45 43 4f 44 45 5f 52 45 53 4f 4c 56 45 BYTECODE_RESOLVE
ee40: 5f 56 41 52 53 3b 0a 20 20 20 20 7d 0a 20 20 20 _VARS;. }.
ee50: 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a return TCL_OK;.
ee60: 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d }.../*. *-------
ee70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
ee80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
ee90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
eea0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
eeb0: 20 2a 0a 20 2a 20 4d 61 6b 65 50 72 6f 63 45 72 *. * MakeProcEr
eec0: 72 6f 72 20 2d 2d 0a 20 2a 0a 20 2a 09 46 75 6e ror --. *. *.Fun
eed0: 63 74 69 6f 6e 20 63 61 6c 6c 65 64 20 62 79 20 ction called by
eee0: 54 63 6c 4f 62 6a 49 6e 74 65 72 70 50 72 6f 63 TclObjInterpProc
eef0: 32 20 74 6f 20 63 72 65 61 74 65 20 74 68 65 20 2 to create the
ef00: 73 74 61 63 6b 20 69 6e 66 6f 72 6d 61 74 69 6f stack informatio
ef10: 6e 0a 20 2a 09 75 70 6f 6e 20 61 6e 20 65 72 72 n. *.upon an err
ef20: 6f 72 20 66 72 6f 6d 20 61 20 70 72 6f 63 65 64 or from a proced
ef30: 75 72 65 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c ure.. *. * Resul
ef40: 74 73 3a 0a 20 2a 09 54 68 65 20 69 6e 74 65 72 ts:. *.The inter
ef50: 70 72 65 74 65 72 27 73 20 65 72 72 6f 72 20 69 preter's error i
ef60: 6e 66 6f 20 74 72 61 63 65 20 69 73 20 73 65 74 nfo trace is set
ef70: 20 74 6f 20 61 20 76 61 6c 75 65 20 74 68 61 74 to a value that
ef80: 20 73 75 70 70 6c 65 6d 65 6e 74 73 0a 20 2a 09 supplements. *.
ef90: 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a the error code..
efa0: 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 *. * Side effec
efb0: 74 73 3a 0a 20 2a 09 6e 6f 6e 65 2e 0a 20 2a 0a ts:. *.none.. *.
efc0: 20 2a 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 2d 2d 2d 2d 2d ----------------
efe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
eff0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f000: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 --------. */..st
f010: 61 74 69 63 20 76 6f 69 64 0a 4d 61 6b 65 50 72 atic void.MakePr
f020: 6f 63 45 72 72 6f 72 28 0a 20 20 20 20 54 63 6c ocError(. Tcl
f030: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c _Interp *interp,
f040: 09 09 2f 2a 20 54 68 65 20 69 6e 74 65 72 70 72 ../* The interpr
f050: 65 74 65 72 20 69 6e 20 77 68 69 63 68 20 74 68 eter in which th
f060: 65 20 70 72 6f 63 65 64 75 72 65 20 77 61 73 0a e procedure was.
f070: 09 09 09 09 20 2a 20 63 61 6c 6c 65 64 2e 20 2a .... * called. *
f080: 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 /. Tcl_Obj *p
f090: 72 6f 63 4e 61 6d 65 4f 62 6a 29 09 2f 2a 20 4e rocNameObj)./* N
f0a0: 61 6d 65 20 6f 66 20 74 68 65 20 70 72 6f 63 65 ame of the proce
f0b0: 64 75 72 65 2e 20 55 73 65 64 20 66 6f 72 20 65 dure. Used for e
f0c0: 72 72 6f 72 0a 09 09 09 09 20 2a 20 6d 65 73 73 rror..... * mess
f0d0: 61 67 65 73 20 61 6e 64 20 74 72 61 63 65 20 69 ages and trace i
f0e0: 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20 2a 2f 0a 7b nformation. */.{
f0f0: 0a 20 20 20 20 69 6e 74 20 6f 76 65 72 66 6c 6f . int overflo
f100: 77 2c 20 6c 69 6d 69 74 20 3d 20 36 30 3b 0a 20 w, limit = 60;.
f110: 20 20 20 54 63 6c 5f 53 69 7a 65 20 6e 61 6d 65 Tcl_Size name
f120: 4c 65 6e 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 Len;. const c
f130: 68 61 72 20 2a 70 72 6f 63 4e 61 6d 65 20 3d 20 har *procName =
f140: 54 63 6c 47 65 74 53 74 72 69 6e 67 46 72 6f 6d TclGetStringFrom
f150: 4f 62 6a 28 70 72 6f 63 4e 61 6d 65 4f 62 6a 2c Obj(procNameObj,
f160: 20 26 6e 61 6d 65 4c 65 6e 29 3b 0a 0a 20 20 20 &nameLen);..
f170: 20 6f 76 65 72 66 6c 6f 77 20 3d 20 28 6e 61 6d overflow = (nam
f180: 65 4c 65 6e 20 3e 20 28 54 63 6c 5f 53 69 7a 65 eLen > (Tcl_Size
f190: 29 6c 69 6d 69 74 29 3b 0a 20 20 20 20 54 63 6c )limit);. Tcl
f1a0: 5f 41 70 70 65 6e 64 4f 62 6a 54 6f 45 72 72 6f _AppendObjToErro
f1b0: 72 49 6e 66 6f 28 69 6e 74 65 72 70 2c 20 54 63 rInfo(interp, Tc
f1c0: 6c 5f 4f 62 6a 50 72 69 6e 74 66 28 0a 09 20 20 l_ObjPrintf(..
f1d0: 20 20 22 5c 6e 20 20 20 20 28 70 72 6f 63 65 64 "\n (proced
f1e0: 75 72 65 20 5c 22 25 2e 2a 73 25 73 5c 22 20 6c ure \"%.*s%s\" l
f1f0: 69 6e 65 20 25 64 29 22 2c 0a 09 20 20 20 20 28 ine %d)",.. (
f200: 6f 76 65 72 66 6c 6f 77 20 3f 20 6c 69 6d 69 74 overflow ? limit
f210: 20 3a 20 28 69 6e 74 29 6e 61 6d 65 4c 65 6e 29 : (int)nameLen)
f220: 2c 20 70 72 6f 63 4e 61 6d 65 2c 0a 09 20 20 20 , procName,..
f230: 20 28 6f 76 65 72 66 6c 6f 77 20 3f 20 22 2e 2e (overflow ? "..
f240: 2e 22 20 3a 20 22 22 29 2c 20 54 63 6c 5f 47 65 ." : ""), Tcl_Ge
f250: 74 45 72 72 6f 72 4c 69 6e 65 28 69 6e 74 65 72 tErrorLine(inter
f260: 70 29 29 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d p)));.}.../*. *-
f270: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f280: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f290: 2d 2d 2d 2d 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 0a 20 2a 0a 20 2a 20 54 63 6c 50 -----. *. * TclP
f2c0: 72 6f 63 44 65 6c 65 74 65 50 72 6f 63 20 2d 2d rocDeleteProc --
f2d0: 0a 20 2a 0a 20 2a 09 54 68 69 73 20 66 75 6e 63 . *. *.This func
f2e0: 74 69 6f 6e 20 69 73 20 69 6e 76 6f 6b 65 64 20 tion is invoked
f2f0: 6a 75 73 74 20 62 65 66 6f 72 65 20 61 20 63 6f just before a co
f300: 6d 6d 61 6e 64 20 70 72 6f 63 65 64 75 72 65 20 mmand procedure
f310: 69 73 20 72 65 6d 6f 76 65 64 0a 20 2a 09 66 72 is removed. *.fr
f320: 6f 6d 20 61 6e 20 69 6e 74 65 72 70 72 65 74 65 om an interprete
f330: 72 2e 20 49 74 73 20 6a 6f 62 20 69 73 20 74 6f r. Its job is to
f340: 20 72 65 6c 65 61 73 65 20 61 6c 6c 20 74 68 65 release all the
f350: 20 72 65 73 6f 75 72 63 65 73 20 61 6c 6c 6f 63 resources alloc
f360: 61 74 65 64 0a 20 2a 09 74 6f 20 74 68 65 20 70 ated. *.to the p
f370: 72 6f 63 65 64 75 72 65 2e 0a 20 2a 0a 20 2a 20 rocedure.. *. *
f380: 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e 65 Results:. *.None
f390: 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 .. *. * Side eff
f3a0: 65 63 74 73 3a 0a 20 2a 09 4d 65 6d 6f 72 79 20 ects:. *.Memory
f3b0: 67 65 74 73 20 66 72 65 65 64 2c 20 75 6e 6c 65 gets freed, unle
f3c0: 73 73 20 74 68 65 20 70 72 6f 63 65 64 75 72 65 ss the procedure
f3d0: 20 69 73 20 61 63 74 69 76 65 6c 79 20 62 65 69 is actively bei
f3e0: 6e 67 20 65 78 65 63 75 74 65 64 2e 0a 20 2a 09 ng executed.. *.
f3f0: 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65 In this case the
f400: 20 63 6c 65 61 6e 75 70 20 69 73 20 64 65 6c 61 cleanup is dela
f410: 79 65 64 20 75 6e 74 69 6c 20 74 68 65 20 6c 61 yed until the la
f420: 73 74 20 63 61 6c 6c 20 74 6f 20 74 68 65 20 63 st call to the c
f430: 75 72 72 65 6e 74 0a 20 2a 09 70 72 6f 63 65 64 urrent. *.proced
f440: 75 72 65 20 63 6f 6d 70 6c 65 74 65 73 2e 0a 20 ure completes..
f450: 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
f460: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f470: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f480: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f490: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a ----------. */..
f4a0: 76 6f 69 64 0a 54 63 6c 50 72 6f 63 44 65 6c 65 void.TclProcDele
f4b0: 74 65 50 72 6f 63 28 0a 20 20 20 20 76 6f 69 64 teProc(. void
f4c0: 20 2a 63 6c 69 65 6e 74 44 61 74 61 29 09 09 2f *clientData)../
f4d0: 2a 20 50 72 6f 63 65 64 75 72 65 20 74 6f 20 62 * Procedure to b
f4e0: 65 20 64 65 6c 65 74 65 64 2e 20 2a 2f 0a 7b 0a e deleted. */.{.
f4f0: 20 20 20 20 50 72 6f 63 20 2a 70 72 6f 63 50 74 Proc *procPt
f500: 72 20 3d 20 28 50 72 6f 63 20 2a 29 63 6c 69 65 r = (Proc *)clie
f510: 6e 74 44 61 74 61 3b 0a 0a 20 20 20 20 69 66 20 ntData;.. if
f520: 28 70 72 6f 63 50 74 72 2d 3e 72 65 66 43 6f 75 (procPtr->refCou
f530: 6e 74 2d 2d 20 3c 3d 20 31 29 20 7b 0a 09 54 63 nt-- <= 1) {..Tc
f540: 6c 50 72 6f 63 43 6c 65 61 6e 75 70 50 72 6f 63 lProcCleanupProc
f550: 28 70 72 6f 63 50 74 72 29 3b 0a 20 20 20 20 7d (procPtr);. }
f560: 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d .}.../*. *------
f570: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f580: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f590: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f5a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f5b0: 0a 20 2a 0a 20 2a 20 54 63 6c 50 72 6f 63 43 6c . *. * TclProcCl
f5c0: 65 61 6e 75 70 50 72 6f 63 20 2d 2d 0a 20 2a 0a eanupProc --. *.
f5d0: 20 2a 09 54 68 69 73 20 66 75 6e 63 74 69 6f 6e *.This function
f5e0: 20 64 6f 65 73 20 61 6c 6c 20 74 68 65 20 72 65 does all the re
f5f0: 61 6c 20 77 6f 72 6b 20 6f 66 20 66 72 65 65 69 al work of freei
f600: 6e 67 20 75 70 20 61 20 50 72 6f 63 20 73 74 72 ng up a Proc str
f610: 75 63 74 75 72 65 2e 0a 20 2a 09 49 74 27 73 20 ucture.. *.It's
f620: 63 61 6c 6c 65 64 20 6f 6e 6c 79 20 77 68 65 6e called only when
f630: 20 74 68 65 20 73 74 72 75 63 74 75 72 65 27 73 the structure's
f640: 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 reference count
f650: 20 62 65 63 6f 6d 65 73 20 7a 65 72 6f 2e 0a 20 becomes zero..
f660: 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a *. * Results:. *
f670: 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 20 53 69 64 .None.. *. * Sid
f680: 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4d 65 e effects:. *.Me
f690: 6d 6f 72 79 20 67 65 74 73 20 66 72 65 65 64 2e mory gets freed.
f6a0: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *. *----------
f6b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f6c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f6d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
f6e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f ------------. */
f6f0: 0a 0a 76 6f 69 64 0a 54 63 6c 50 72 6f 63 43 6c ..void.TclProcCl
f700: 65 61 6e 75 70 50 72 6f 63 28 0a 20 20 20 20 50 eanupProc(. P
f710: 72 6f 63 20 2a 70 72 6f 63 50 74 72 29 09 09 2f roc *procPtr)../
f720: 2a 20 50 72 6f 63 65 64 75 72 65 20 74 6f 20 62 * Procedure to b
f730: 65 20 64 65 6c 65 74 65 64 2e 20 2a 2f 0a 7b 0a e deleted. */.{.
f740: 20 20 20 20 43 6f 6d 70 69 6c 65 64 4c 6f 63 61 CompiledLoca
f750: 6c 20 2a 6c 6f 63 61 6c 50 74 72 3b 0a 20 20 20 l *localPtr;.
f760: 20 54 63 6c 5f 4f 62 6a 20 2a 62 6f 64 79 50 74 Tcl_Obj *bodyPt
f770: 72 20 3d 20 70 72 6f 63 50 74 72 2d 3e 62 6f 64 r = procPtr->bod
f780: 79 50 74 72 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 yPtr;. Tcl_Ob
f790: 6a 20 2a 64 65 66 50 74 72 3b 0a 20 20 20 20 54 j *defPtr;. T
f7a0: 63 6c 5f 52 65 73 6f 6c 76 65 64 56 61 72 49 6e cl_ResolvedVarIn
f7b0: 66 6f 20 2a 72 65 73 56 61 72 49 6e 66 6f 3b 0a fo *resVarInfo;.
f7c0: 20 20 20 20 54 63 6c 5f 48 61 73 68 45 6e 74 72 Tcl_HashEntr
f7d0: 79 20 2a 68 65 50 74 72 20 3d 20 4e 55 4c 4c 3b y *hePtr = NULL;
f7e0: 0a 20 20 20 20 43 6d 64 46 72 61 6d 65 20 2a 63 . CmdFrame *c
f7f0: 66 50 74 72 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 fPtr = NULL;.
f800: 20 49 6e 74 65 72 70 20 2a 69 50 74 72 20 3d 20 Interp *iPtr =
f810: 70 72 6f 63 50 74 72 2d 3e 69 50 74 72 3b 0a 0a procPtr->iPtr;..
f820: 20 20 20 20 69 66 20 28 62 6f 64 79 50 74 72 20 if (bodyPtr
f830: 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 2f 2a 20 70 != NULL) {../* p
f840: 72 6f 63 50 74 72 20 69 73 20 73 74 6f 72 65 64 rocPtr is stored
f850: 20 69 6e 20 62 6f 64 79 27 73 20 42 79 74 65 43 in body's ByteC
f860: 6f 64 65 2c 20 73 6f 20 65 6e 73 75 72 65 20 74 ode, so ensure t
f870: 6f 20 72 65 73 65 74 20 69 74 2e 20 2a 2f 0a 09 o reset it. */..
f880: 42 79 74 65 43 6f 64 65 20 2a 63 6f 64 65 50 74 ByteCode *codePt
f890: 72 3b 0a 0a 09 42 79 74 65 43 6f 64 65 47 65 74 r;...ByteCodeGet
f8a0: 49 6e 74 65 72 6e 61 6c 52 65 70 28 62 6f 64 79 InternalRep(body
f8b0: 50 74 72 2c 20 26 74 63 6c 42 79 74 65 43 6f 64 Ptr, &tclByteCod
f8c0: 65 54 79 70 65 2c 20 63 6f 64 65 50 74 72 29 3b eType, codePtr);
f8d0: 0a 09 69 66 20 28 63 6f 64 65 50 74 72 20 21 3d ..if (codePtr !=
f8e0: 20 4e 55 4c 4c 20 26 26 20 63 6f 64 65 50 74 72 NULL && codePtr
f8f0: 2d 3e 70 72 6f 63 50 74 72 20 3d 3d 20 70 72 6f ->procPtr == pro
f900: 63 50 74 72 29 20 7b 0a 09 20 20 20 20 63 6f 64 cPtr) {.. cod
f910: 65 50 74 72 2d 3e 70 72 6f 63 50 74 72 20 3d 20 ePtr->procPtr =
f920: 4e 55 4c 4c 3b 0a 09 7d 0a 09 54 63 6c 5f 44 65 NULL;..}..Tcl_De
f930: 63 72 52 65 66 43 6f 75 6e 74 28 62 6f 64 79 50 crRefCount(bodyP
f940: 74 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 tr);. }. f
f950: 6f 72 20 28 6c 6f 63 61 6c 50 74 72 20 3d 20 70 or (localPtr = p
f960: 72 6f 63 50 74 72 2d 3e 66 69 72 73 74 4c 6f 63 rocPtr->firstLoc
f970: 61 6c 50 74 72 3b 20 6c 6f 63 61 6c 50 74 72 20 alPtr; localPtr
f980: 21 3d 20 4e 55 4c 4c 3b 20 29 20 7b 0a 09 43 6f != NULL; ) {..Co
f990: 6d 70 69 6c 65 64 4c 6f 63 61 6c 20 2a 6e 65 78 mpiledLocal *nex
f9a0: 74 50 74 72 20 3d 20 6c 6f 63 61 6c 50 74 72 2d tPtr = localPtr-
f9b0: 3e 6e 65 78 74 50 74 72 3b 0a 0a 09 72 65 73 56 >nextPtr;...resV
f9c0: 61 72 49 6e 66 6f 20 3d 20 6c 6f 63 61 6c 50 74 arInfo = localPt
f9d0: 72 2d 3e 72 65 73 6f 6c 76 65 49 6e 66 6f 3b 0a r->resolveInfo;.
f9e0: 09 69 66 20 28 72 65 73 56 61 72 49 6e 66 6f 29 .if (resVarInfo)
f9f0: 20 7b 0a 09 20 20 20 20 69 66 20 28 72 65 73 56 {.. if (resV
fa00: 61 72 49 6e 66 6f 2d 3e 64 65 6c 65 74 65 50 72 arInfo->deletePr
fa10: 6f 63 29 20 7b 0a 09 09 72 65 73 56 61 72 49 6e oc) {...resVarIn
fa20: 66 6f 2d 3e 64 65 6c 65 74 65 50 72 6f 63 28 72 fo->deleteProc(r
fa30: 65 73 56 61 72 49 6e 66 6f 29 3b 0a 09 20 20 20 esVarInfo);..
fa40: 20 7d 20 65 6c 73 65 20 7b 0a 09 09 54 63 6c 5f } else {...Tcl_
fa50: 46 72 65 65 28 72 65 73 56 61 72 49 6e 66 6f 29 Free(resVarInfo)
fa60: 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a 0a 09 69 66 ;.. }..}...if
fa70: 20 28 6c 6f 63 61 6c 50 74 72 2d 3e 64 65 66 56 (localPtr->defV
fa80: 61 6c 75 65 50 74 72 20 21 3d 20 4e 55 4c 4c 29 aluePtr != NULL)
fa90: 20 7b 0a 09 20 20 20 20 64 65 66 50 74 72 20 3d {.. defPtr =
faa0: 20 6c 6f 63 61 6c 50 74 72 2d 3e 64 65 66 56 61 localPtr->defVa
fab0: 6c 75 65 50 74 72 3b 0a 09 20 20 20 20 54 63 6c luePtr;.. Tcl
fac0: 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 64 65 _DecrRefCount(de
fad0: 66 50 74 72 29 3b 0a 09 7d 0a 09 54 63 6c 5f 46 fPtr);..}..Tcl_F
fae0: 72 65 65 28 6c 6f 63 61 6c 50 74 72 29 3b 0a 09 ree(localPtr);..
faf0: 6c 6f 63 61 6c 50 74 72 20 3d 20 6e 65 78 74 50 localPtr = nextP
fb00: 74 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 tr;. }.. i
fb10: 66 20 28 28 70 72 6f 63 50 74 72 2d 3e 66 6c 61 f ((procPtr->fla
fb20: 67 73 20 26 20 50 52 4f 43 5f 43 4d 44 5f 4f 57 gs & PROC_CMD_OW
fb30: 4e 45 44 29 20 26 26 20 70 72 6f 63 50 74 72 2d NED) && procPtr-
fb40: 3e 63 6d 64 50 74 72 0a 09 20 20 20 20 26 26 20 >cmdPtr.. &&
fb50: 70 72 6f 63 50 74 72 2d 3e 63 6d 64 50 74 72 2d procPtr->cmdPtr-
fb60: 3e 72 65 66 43 6f 75 6e 74 2d 2d 20 3c 3d 20 31 >refCount-- <= 1
fb70: 29 20 7b 0a 09 2f 2a 20 63 6d 64 50 74 72 20 6f ) {../* cmdPtr o
fb80: 77 6e 65 64 20 62 79 20 70 72 6f 63 50 74 72 20 wned by procPtr
fb90: 28 6c 61 6d 62 64 61 29 20 2a 2f 0a 09 69 66 20 (lambda) */..if
fba0: 28 70 72 6f 63 50 74 72 2d 3e 63 6d 64 50 74 72 (procPtr->cmdPtr
fbb0: 2d 3e 6e 73 50 74 72 29 20 7b 0a 09 20 20 20 20 ->nsPtr) {..
fbc0: 54 63 6c 4e 73 44 65 63 72 52 65 66 43 6f 75 6e TclNsDecrRefCoun
fbd0: 74 28 70 72 6f 63 50 74 72 2d 3e 63 6d 64 50 74 t(procPtr->cmdPt
fbe0: 72 2d 3e 6e 73 50 74 72 29 3b 0a 09 7d 0a 09 54 r->nsPtr);..}..T
fbf0: 63 6c 5f 46 72 65 65 28 70 72 6f 63 50 74 72 2d cl_Free(procPtr-
fc00: 3e 63 6d 64 50 74 72 29 3b 0a 20 20 20 20 7d 0a >cmdPtr);. }.
fc10: 20 20 20 20 54 63 6c 5f 46 72 65 65 28 70 72 6f Tcl_Free(pro
fc20: 63 50 74 72 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 cPtr);.. /*.
fc30: 20 20 20 20 2a 20 54 49 50 20 23 32 38 30 3a 20 * TIP #280:
fc40: 52 65 6c 65 61 73 65 20 74 68 65 20 6c 6f 63 61 Release the loca
fc50: 74 69 6f 6e 20 64 61 74 61 20 61 73 73 6f 63 69 tion data associ
fc60: 61 74 65 64 20 77 69 74 68 20 74 68 69 73 20 50 ated with this P
fc70: 72 6f 63 0a 20 20 20 20 20 2a 20 73 74 72 75 63 roc. * struc
fc80: 74 75 72 65 2c 20 69 66 20 61 6e 79 2e 20 54 68 ture, if any. Th
fc90: 65 20 69 6e 74 65 72 70 72 65 74 65 72 20 6d 61 e interpreter ma
fca0: 79 20 6e 6f 74 20 65 78 69 73 74 20 28 46 6f 72 y not exist (For
fcb0: 20 65 78 61 6d 70 6c 65 20 66 6f 72 0a 20 20 20 example for.
fcc0: 20 20 2a 20 70 72 6f 63 62 6f 64 79 20 73 74 72 * procbody str
fcd0: 75 63 74 75 72 65 73 20 63 72 65 61 74 65 64 20 uctures created
fce0: 62 79 20 74 62 63 6c 6f 61 64 2e 0a 20 20 20 20 by tbcload..
fcf0: 20 2a 2f 0a 0a 20 20 20 20 69 66 20 28 69 50 74 */.. if (iPt
fd00: 72 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 r == NULL) {..re
fd10: 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 turn;. }..
fd20: 20 68 65 50 74 72 20 3d 20 54 63 6c 5f 46 69 6e hePtr = Tcl_Fin
fd30: 64 48 61 73 68 45 6e 74 72 79 28 69 50 74 72 2d dHashEntry(iPtr-
fd40: 3e 6c 69 6e 65 50 42 6f 64 79 50 74 72 2c 20 70 >linePBodyPtr, p
fd50: 72 6f 63 50 74 72 29 3b 0a 20 20 20 20 69 66 20 rocPtr);. if
fd60: 28 21 68 65 50 74 72 29 20 7b 0a 09 72 65 74 75 (!hePtr) {..retu
fd70: 72 6e 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 rn;. }.. c
fd80: 66 50 74 72 20 3d 20 28 43 6d 64 46 72 61 6d 65 fPtr = (CmdFrame
fd90: 20 2a 29 54 63 6c 5f 47 65 74 48 61 73 68 56 61 *)Tcl_GetHashVa
fda0: 6c 75 65 28 68 65 50 74 72 29 3b 0a 0a 20 20 20 lue(hePtr);..
fdb0: 20 69 66 20 28 63 66 50 74 72 29 20 7b 0a 09 69 if (cfPtr) {..i
fdc0: 66 20 28 63 66 50 74 72 2d 3e 74 79 70 65 20 3d f (cfPtr->type =
fdd0: 3d 20 54 43 4c 5f 4c 4f 43 41 54 49 4f 4e 5f 53 = TCL_LOCATION_S
fde0: 4f 55 52 43 45 29 20 7b 0a 09 20 20 20 20 54 63 OURCE) {.. Tc
fdf0: 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 63 l_DecrRefCount(c
fe00: 66 50 74 72 2d 3e 64 61 74 61 2e 65 76 61 6c 2e fPtr->data.eval.
fe10: 70 61 74 68 29 3b 0a 09 20 20 20 20 63 66 50 74 path);.. cfPt
fe20: 72 2d 3e 64 61 74 61 2e 65 76 61 6c 2e 70 61 74 r->data.eval.pat
fe30: 68 20 3d 20 4e 55 4c 4c 3b 0a 09 7d 0a 09 54 63 h = NULL;..}..Tc
fe40: 6c 5f 46 72 65 65 28 63 66 50 74 72 2d 3e 6c 69 l_Free(cfPtr->li
fe50: 6e 65 29 3b 0a 09 63 66 50 74 72 2d 3e 6c 69 6e ne);..cfPtr->lin
fe60: 65 20 3d 20 4e 55 4c 4c 3b 0a 09 54 63 6c 5f 46 e = NULL;..Tcl_F
fe70: 72 65 65 28 63 66 50 74 72 29 3b 0a 20 20 20 20 ree(cfPtr);.
fe80: 7d 0a 20 20 20 20 54 63 6c 5f 44 65 6c 65 74 65 }. Tcl_Delete
fe90: 48 61 73 68 45 6e 74 72 79 28 68 65 50 74 72 29 HashEntry(hePtr)
fea0: 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d ;.}.../*. *-----
feb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
fec0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
fed0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
fee0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
fef0: 2d 0a 20 2a 0a 20 2a 20 54 63 6c 55 70 64 61 74 -. *. * TclUpdat
ff00: 65 52 65 74 75 72 6e 49 6e 66 6f 20 2d 2d 0a 20 eReturnInfo --.
ff10: 2a 0a 20 2a 09 54 68 69 73 20 66 75 6e 63 74 69 *. *.This functi
ff20: 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65 on is called whe
ff30: 6e 20 70 72 6f 63 65 64 75 72 65 73 20 72 65 74 n procedures ret
ff40: 75 72 6e 2c 20 61 6e 64 20 61 74 20 6f 74 68 65 urn, and at othe
ff50: 72 20 70 6f 69 6e 74 73 0a 20 2a 09 77 68 65 72 r points. *.wher
ff60: 65 20 74 68 65 20 54 43 4c 5f 52 45 54 55 52 4e e the TCL_RETURN
ff70: 20 63 6f 64 65 20 69 73 20 75 73 65 64 2e 20 49 code is used. I
ff80: 74 20 65 78 61 6d 69 6e 65 73 20 74 68 65 20 72 t examines the r
ff90: 65 74 75 72 6e 4c 65 76 65 6c 20 61 6e 64 0a 20 eturnLevel and.
ffa0: 2a 09 72 65 74 75 72 6e 43 6f 64 65 20 74 6f 20 *.returnCode to
ffb0: 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 72 65 determine the re
ffc0: 61 6c 20 72 65 74 75 72 6e 20 73 74 61 74 75 73 al return status
ffd0: 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 3a .. *. * Results:
ffe0: 0a 20 2a 09 54 68 65 20 72 65 74 75 72 6e 20 76 . *.The return v
fff0: 61 6c 75 65 20 69 73 20 74 68 65 20 74 72 75 65 alue is the true
10000 20 63 6f 6d 70 6c 65 74 69 6f 6e 20 63 6f 64 65 completion code
10010 20 74 6f 20 75 73 65 20 66 6f 72 20 74 68 65 20 to use for the
10020 70 72 6f 63 65 64 75 72 65 0a 20 2a 09 6f 72 20 procedure. *.or
10030 73 63 72 69 70 74 2c 20 69 6e 73 74 65 61 64 20 script, instead
10040 6f 66 20 54 43 4c 5f 52 45 54 55 52 4e 2e 0a 20 of TCL_RETURN..
10050 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 63 74 *. * Side effect
10060 73 3a 0a 20 2a 09 4e 6f 6e 65 2e 0a 20 2a 0a 20 s:. *.None.. *.
10070 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
10080 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10090 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
100a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
100b0 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 69 6e 74 -------. */..int
100c0 0a 54 63 6c 55 70 64 61 74 65 52 65 74 75 72 6e .TclUpdateReturn
100d0 49 6e 66 6f 28 0a 20 20 20 20 49 6e 74 65 72 70 Info(. Interp
100e0 20 2a 69 50 74 72 29 09 09 2f 2a 20 49 6e 74 65 *iPtr)../* Inte
100f0 72 70 72 65 74 65 72 20 66 6f 72 20 77 68 69 63 rpreter for whic
10100 68 20 54 43 4c 5f 52 45 54 55 52 4e 20 65 78 63 h TCL_RETURN exc
10110 65 70 74 69 6f 6e 0a 09 09 09 09 20 2a 20 69 73 eption..... * is
10120 20 62 65 69 6e 67 20 70 72 6f 63 65 73 73 65 64 being processed
10130 2e 20 2a 2f 0a 7b 0a 20 20 20 20 69 6e 74 20 63 . */.{. int c
10140 6f 64 65 20 3d 20 54 43 4c 5f 52 45 54 55 52 4e ode = TCL_RETURN
10150 3b 0a 0a 20 20 20 20 69 50 74 72 2d 3e 72 65 74 ;.. iPtr->ret
10160 75 72 6e 4c 65 76 65 6c 2d 2d 3b 0a 20 20 20 20 urnLevel--;.
10170 69 66 20 28 69 50 74 72 2d 3e 72 65 74 75 72 6e if (iPtr->return
10180 4c 65 76 65 6c 20 3c 20 30 29 20 7b 0a 09 54 63 Level < 0) {..Tc
10190 6c 5f 50 61 6e 69 63 28 22 54 63 6c 55 70 64 61 l_Panic("TclUpda
101a0 74 65 52 65 74 75 72 6e 49 6e 66 6f 3a 20 6e 65 teReturnInfo: ne
101b0 67 61 74 69 76 65 20 72 65 74 75 72 6e 20 6c 65 gative return le
101c0 76 65 6c 22 29 3b 0a 20 20 20 20 7d 0a 20 20 20 vel");. }.
101d0 20 69 66 20 28 69 50 74 72 2d 3e 72 65 74 75 72 if (iPtr->retur
101e0 6e 4c 65 76 65 6c 20 3d 3d 20 30 29 20 7b 0a 09 nLevel == 0) {..
101f0 2f 2a 0a 09 20 2a 20 4e 6f 77 20 77 65 27 76 65 /*.. * Now we've
10200 20 72 65 61 63 68 65 64 20 74 68 65 20 6c 65 76 reached the lev
10210 65 6c 20 74 6f 20 72 65 74 75 72 6e 20 74 68 65 el to return the
10220 20 72 65 71 75 65 73 74 65 64 20 2d 63 6f 64 65 requested -code
10230 2e 0a 09 20 2a 20 53 69 6e 63 65 20 69 50 74 72 ... * Since iPtr
10240 2d 3e 72 65 74 75 72 6e 4c 65 76 65 6c 20 61 6e ->returnLevel an
10250 64 20 69 50 74 72 2d 3e 72 65 74 75 72 6e 43 6f d iPtr->returnCo
10260 64 65 20 68 61 76 65 20 63 6f 6d 70 6c 65 74 65 de have complete
10270 64 0a 09 20 2a 20 74 68 65 69 72 20 74 61 73 6b d.. * their task
10280 2c 20 77 65 20 6e 6f 77 20 72 65 73 65 74 20 74 , we now reset t
10290 68 65 6d 20 74 6f 20 64 65 66 61 75 6c 74 20 76 hem to default v
102a0 61 6c 75 65 73 20 73 6f 20 74 68 61 74 20 61 6e alues so that an
102b0 79 0a 09 20 2a 20 62 61 72 65 20 22 72 65 74 75 y.. * bare "retu
102c0 72 6e 20 54 43 4c 5f 52 45 54 55 52 4e 22 20 74 rn TCL_RETURN" t
102d0 68 61 74 20 6d 61 79 20 66 6f 6c 6c 6f 77 20 77 hat may follow w
102e0 69 6c 6c 20 77 6f 72 6b 20 5b 42 75 67 20 32 31 ill work [Bug 21
102f0 35 32 32 38 36 5d 2e 0a 09 20 2a 2f 0a 0a 09 63 52286]... */...c
10300 6f 64 65 20 3d 20 69 50 74 72 2d 3e 72 65 74 75 ode = iPtr->retu
10310 72 6e 43 6f 64 65 3b 0a 09 69 50 74 72 2d 3e 72 rnCode;..iPtr->r
10320 65 74 75 72 6e 4c 65 76 65 6c 20 3d 20 31 3b 0a eturnLevel = 1;.
10330 09 69 50 74 72 2d 3e 72 65 74 75 72 6e 43 6f 64 .iPtr->returnCod
10340 65 20 3d 20 54 43 4c 5f 4f 4b 3b 0a 09 69 66 20 e = TCL_OK;..if
10350 28 63 6f 64 65 20 3d 3d 20 54 43 4c 5f 45 52 52 (code == TCL_ERR
10360 4f 52 29 20 7b 0a 09 20 20 20 20 69 50 74 72 2d OR) {.. iPtr-
10370 3e 66 6c 61 67 73 20 7c 3d 20 45 52 52 5f 4c 45 >flags |= ERR_LE
10380 47 41 43 59 5f 43 4f 50 59 3b 0a 09 7d 0a 20 20 GACY_COPY;..}.
10390 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 63 }. return c
103a0 6f 64 65 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d ode;.}.../*. *--
103b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
103c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
103d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
103e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
103f0 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 63 6c 47 65 ----. *. * TclGe
10400 74 4f 62 6a 49 6e 74 65 72 70 50 72 6f 63 32 20 tObjInterpProc2
10410 2d 2d 0a 20 2a 0a 20 2a 09 52 65 74 75 72 6e 73 --. *. *.Returns
10420 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 a pointer to th
10430 65 20 54 63 6c 4f 62 6a 49 6e 74 65 72 70 50 72 e TclObjInterpPr
10440 6f 63 32 20 66 75 6e 63 74 69 6f 6e 3b 20 74 68 oc2 function; th
10450 69 73 20 69 73 20 64 69 66 66 65 72 65 6e 74 0a is is different.
10460 20 2a 09 66 72 6f 6d 20 74 68 65 20 76 61 6c 75 *.from the valu
10470 65 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 e obtained from
10480 74 68 65 20 54 63 6c 4f 62 6a 49 6e 74 65 72 70 the TclObjInterp
10490 50 72 6f 63 32 20 72 65 66 65 72 65 6e 63 65 20 Proc2 reference
104a0 6f 6e 20 73 79 73 74 65 6d 73 0a 20 2a 09 6c 69 on systems. *.li
104b0 6b 65 20 57 69 6e 64 6f 77 73 20 77 68 65 72 65 ke Windows where
104c0 20 69 6d 70 6f 72 74 20 61 6e 64 20 65 78 70 6f import and expo
104d0 72 74 20 76 65 72 73 69 6f 6e 73 20 6f 66 20 61 rt versions of a
104e0 20 66 75 6e 63 74 69 6f 6e 20 65 78 70 6f 72 74 function export
104f0 65 64 0a 20 2a 09 62 79 20 61 20 44 4c 4c 20 65 ed. *.by a DLL e
10500 78 69 73 74 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 xist.. *. * Resu
10510 6c 74 73 3a 0a 20 2a 09 52 65 74 75 72 6e 73 20 lts:. *.Returns
10520 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 61 64 64 the internal add
10530 72 65 73 73 20 6f 66 20 74 68 65 20 54 63 6c 4f ress of the TclO
10540 62 6a 49 6e 74 65 72 70 50 72 6f 63 32 20 66 75 bjInterpProc2 fu
10550 6e 63 74 69 6f 6e 2e 0a 20 2a 0a 20 2a 20 53 69 nction.. *. * Si
10560 64 65 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 4e de effects:. *.N
10570 6f 6e 65 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d one.. *. *------
10580 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10590 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
105a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
105b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
105c0 0a 20 2a 2f 0a 0a 23 69 66 6e 64 65 66 20 54 43 . */..#ifndef TC
105d0 4c 5f 4e 4f 5f 44 45 50 52 45 43 41 54 45 44 0a L_NO_DEPRECATED.
105e0 54 63 6c 5f 4f 62 6a 43 6d 64 50 72 6f 63 20 2a Tcl_ObjCmdProc *
105f0 0a 54 63 6c 47 65 74 4f 62 6a 49 6e 74 65 72 70 .TclGetObjInterp
10600 50 72 6f 63 28 76 6f 69 64 29 0a 7b 0a 20 20 20 Proc(void).{.
10610 20 72 65 74 75 72 6e 20 54 63 6c 4f 62 6a 49 6e return TclObjIn
10620 74 65 72 70 50 72 6f 63 3b 0a 7d 0a 23 65 6e 64 terpProc;.}.#end
10630 69 66 20 2f 2a 20 54 43 4c 5f 4e 4f 5f 44 45 50 if /* TCL_NO_DEP
10640 52 45 43 41 54 45 44 20 2a 2f 0a 0a 54 63 6c 5f RECATED */..Tcl_
10650 4f 62 6a 43 6d 64 50 72 6f 63 32 20 2a 0a 54 63 ObjCmdProc2 *.Tc
10660 6c 47 65 74 4f 62 6a 49 6e 74 65 72 70 50 72 6f lGetObjInterpPro
10670 63 32 28 76 6f 69 64 29 0a 7b 0a 20 20 20 20 72 c2(void).{. r
10680 65 74 75 72 6e 20 54 63 6c 4f 62 6a 49 6e 74 65 eturn TclObjInte
10690 72 70 50 72 6f 63 32 3b 0a 7d 0a 0c 0a 2f 2a 0a rpProc2;.}.../*.
106a0 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
106b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
106c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
106d0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
106e0 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 --------. *. * T
106f0 63 6c 4e 65 77 50 72 6f 63 42 6f 64 79 4f 62 6a clNewProcBodyObj
10700 20 2d 2d 0a 20 2a 0a 20 2a 09 43 72 65 61 74 65 --. *. *.Create
10710 73 20 61 20 6e 65 77 20 6f 62 6a 65 63 74 2c 20 s a new object,
10720 6f 66 20 74 79 70 65 20 22 70 72 6f 63 62 6f 64 of type "procbod
10730 79 22 2c 20 77 68 6f 73 65 20 69 6e 74 65 72 6e y", whose intern
10740 61 6c 0a 20 2a 09 72 65 70 72 65 73 65 6e 74 61 al. *.representa
10750 74 69 6f 6e 20 69 73 20 74 68 65 20 67 69 76 65 tion is the give
10760 6e 20 50 72 6f 63 20 73 74 72 75 63 74 2e 20 54 n Proc struct. T
10770 68 65 20 6e 65 77 6c 79 20 63 72 65 61 74 65 64 he newly created
10780 20 6f 62 6a 65 63 74 27 73 0a 20 2a 09 72 65 66 object's. *.ref
10790 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 69 73 20 erence count is
107a0 30 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 6c 74 73 0.. *. * Results
107b0 3a 0a 20 2a 09 52 65 74 75 72 6e 73 20 61 20 70 :. *.Returns a p
107c0 6f 69 6e 74 65 72 20 74 6f 20 61 20 6e 65 77 6c ointer to a newl
107d0 79 20 61 6c 6c 6f 63 61 74 65 64 20 54 63 6c 5f y allocated Tcl_
107e0 4f 62 6a 2c 20 4e 55 4c 4c 20 6f 6e 20 65 72 72 Obj, NULL on err
107f0 6f 72 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 or.. *. * Side e
10800 66 66 65 63 74 73 3a 0a 20 2a 09 54 68 65 20 72 ffects:. *.The r
10810 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 69 eference count i
10820 6e 20 74 68 65 20 42 79 74 65 43 6f 64 65 20 61 n the ByteCode a
10830 74 74 61 63 68 65 64 20 74 6f 20 74 68 65 20 50 ttached to the P
10840 72 6f 63 20 69 73 20 62 75 6d 70 65 64 20 75 70 roc is bumped up
10850 0a 20 2a 09 62 79 20 6f 6e 65 2c 20 73 69 6e 63 . *.by one, sinc
10860 65 20 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 72 e the internal r
10870 65 70 20 73 74 6f 72 65 73 20 61 20 70 6f 69 6e ep stores a poin
10880 74 65 72 20 74 6f 20 69 74 2e 0a 20 2a 0a 20 2a ter to it.. *. *
10890 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
108a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
108b0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
108c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
108d0 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 54 63 6c 5f ------. */..Tcl_
108e0 4f 62 6a 20 2a 0a 54 63 6c 4e 65 77 50 72 6f 63 Obj *.TclNewProc
108f0 42 6f 64 79 4f 62 6a 28 0a 20 20 20 20 50 72 6f BodyObj(. Pro
10900 63 20 2a 70 72 6f 63 50 74 72 29 09 09 2f 2a 20 c *procPtr)../*
10910 74 68 65 20 50 72 6f 63 20 73 74 72 75 63 74 20 the Proc struct
10920 74 6f 20 73 74 6f 72 65 20 61 73 20 74 68 65 20 to store as the
10930 69 6e 74 65 72 6e 61 6c 0a 09 09 09 09 20 2a 20 internal..... *
10940 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 2e 20 representation.
10950 2a 2f 0a 7b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a */.{. Tcl_Obj
10960 20 2a 6f 62 6a 50 74 72 3b 0a 0a 20 20 20 20 69 *objPtr;.. i
10970 66 20 28 21 70 72 6f 63 50 74 72 29 20 7b 0a 09 f (!procPtr) {..
10980 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 return NULL;.
10990 20 7d 0a 0a 20 20 20 20 54 63 6c 4e 65 77 4f 62 }.. TclNewOb
109a0 6a 28 6f 62 6a 50 74 72 29 3b 0a 20 20 20 20 69 j(objPtr);. i
109b0 66 20 28 6f 62 6a 50 74 72 29 20 7b 0a 09 50 72 f (objPtr) {..Pr
109c0 6f 63 53 65 74 49 6e 74 65 72 6e 61 6c 52 65 70 ocSetInternalRep
109d0 28 6f 62 6a 50 74 72 2c 20 70 72 6f 63 50 74 72 (objPtr, procPtr
109e0 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 65 );. }.. re
109f0 74 75 72 6e 20 6f 62 6a 50 74 72 3b 0a 7d 0a 0c turn objPtr;.}..
10a00 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ./*. *----------
10a10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10a20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10a30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10a40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a ------------. *.
10a50 20 2a 20 50 72 6f 63 42 6f 64 79 44 75 70 20 2d * ProcBodyDup -
10a60 2d 0a 20 2a 0a 20 2a 09 54 63 6c 5f 4f 62 6a 54 -. *. *.Tcl_ObjT
10a70 79 70 65 27 73 20 44 75 70 20 66 75 6e 63 74 69 ype's Dup functi
10a80 6f 6e 20 66 6f 72 20 74 68 65 20 70 72 6f 63 20 on for the proc
10a90 62 6f 64 79 20 6f 62 6a 65 63 74 2e 20 42 75 6d body object. Bum
10aa0 70 73 20 74 68 65 0a 20 2a 09 72 65 66 65 72 65 ps the. *.refere
10ab0 6e 63 65 20 63 6f 75 6e 74 20 6f 6e 20 74 68 65 nce count on the
10ac0 20 50 72 6f 63 20 73 74 6f 72 65 64 20 69 6e 20 Proc stored in
10ad0 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 72 65 70 the internal rep
10ae0 72 65 73 65 6e 74 61 74 69 6f 6e 2e 0a 20 2a 0a resentation.. *.
10af0 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e * Results:. *.N
10b00 6f 6e 65 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 one.. *. * Side
10b10 65 66 66 65 63 74 73 3a 0a 20 2a 09 53 65 74 73 effects:. *.Sets
10b20 20 75 70 20 74 68 65 20 6f 62 6a 65 63 74 20 69 up the object i
10b30 6e 20 64 75 70 50 74 72 20 74 6f 20 62 65 20 61 n dupPtr to be a
10b40 20 64 75 70 6c 69 63 61 74 65 20 6f 66 20 74 68 duplicate of th
10b50 65 20 6f 6e 65 20 69 6e 20 73 72 63 50 74 72 2e e one in srcPtr.
10b60 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *. *----------
10b70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10b80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 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 0a 20 2a 2f ------------. */
10bb0 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 0a 50 72 ..static void.Pr
10bc0 6f 63 42 6f 64 79 44 75 70 28 0a 20 20 20 20 54 ocBodyDup(. T
10bd0 63 6c 5f 4f 62 6a 20 2a 73 72 63 50 74 72 2c 09 cl_Obj *srcPtr,.
10be0 09 2f 2a 20 4f 62 6a 65 63 74 20 74 6f 20 63 6f ./* Object to co
10bf0 70 79 2e 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f py. */. Tcl_O
10c00 62 6a 20 2a 64 75 70 50 74 72 29 09 09 2f 2a 20 bj *dupPtr)../*
10c10 54 61 72 67 65 74 20 6f 62 6a 65 63 74 20 66 6f Target object fo
10c20 72 20 74 68 65 20 64 75 70 6c 69 63 61 74 69 6f r the duplicatio
10c30 6e 2e 20 2a 2f 0a 7b 0a 20 20 20 20 50 72 6f 63 n. */.{. Proc
10c40 20 2a 70 72 6f 63 50 74 72 3b 0a 20 20 20 20 50 *procPtr;. P
10c50 72 6f 63 47 65 74 49 6e 74 65 72 6e 61 6c 52 65 rocGetInternalRe
10c60 70 28 73 72 63 50 74 72 2c 20 70 72 6f 63 50 74 p(srcPtr, procPt
10c70 72 29 3b 0a 0a 20 20 20 20 50 72 6f 63 53 65 74 r);.. ProcSet
10c80 49 6e 74 65 72 6e 61 6c 52 65 70 28 64 75 70 50 InternalRep(dupP
10c90 74 72 2c 20 70 72 6f 63 50 74 72 29 3b 0a 7d 0a tr, procPtr);.}.
10ca0 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d ../*. *---------
10cb0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10cc0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10cd0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10ce0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
10cf0 0a 20 2a 20 50 72 6f 63 42 6f 64 79 46 72 65 65 . * ProcBodyFree
10d00 20 2d 2d 0a 20 2a 0a 20 2a 09 54 63 6c 5f 4f 62 --. *. *.Tcl_Ob
10d10 6a 54 79 70 65 27 73 20 46 72 65 65 20 66 75 6e jType's Free fun
10d20 63 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 70 72 ction for the pr
10d30 6f 63 20 62 6f 64 79 20 6f 62 6a 65 63 74 2e 20 oc body object.
10d40 54 68 65 20 72 65 66 65 72 65 6e 63 65 0a 20 2a The reference. *
10d50 09 63 6f 75 6e 74 20 6f 6e 20 69 74 73 20 50 72 .count on its Pr
10d60 6f 63 20 73 74 72 75 63 74 20 69 73 20 64 65 63 oc struct is dec
10d70 72 65 61 73 65 64 20 62 79 20 31 3b 20 69 66 20 reased by 1; if
10d80 74 68 65 20 63 6f 75 6e 74 20 72 65 61 63 68 65 the count reache
10d90 73 20 30 2c 0a 20 2a 09 74 68 65 20 70 72 6f 63 s 0,. *.the proc
10da0 20 69 73 20 66 72 65 65 64 2e 0a 20 2a 0a 20 2a is freed.. *. *
10db0 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 4e 6f 6e Results:. *.Non
10dc0 65 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 e.. *. * Side ef
10dd0 66 65 63 74 73 3a 0a 20 2a 09 49 66 20 74 68 65 fects:. *.If the
10de0 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 reference count
10df0 20 6f 6e 20 74 68 65 20 50 72 6f 63 20 73 74 72 on the Proc str
10e00 75 63 74 20 72 65 61 63 68 65 73 20 30 2c 20 74 uct reaches 0, t
10e10 68 65 20 73 74 72 75 63 74 20 69 73 0a 20 2a 09 he struct is. *.
10e20 66 72 65 65 64 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d freed.. *. *----
10e30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10e40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10e50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10e60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10e70 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20 76 --. */..static v
10e80 6f 69 64 0a 50 72 6f 63 42 6f 64 79 46 72 65 65 oid.ProcBodyFree
10e90 28 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f (. Tcl_Obj *o
10ea0 62 6a 50 74 72 29 09 09 2f 2a 20 54 68 65 20 6f bjPtr)../* The o
10eb0 62 6a 65 63 74 20 74 6f 20 63 6c 65 61 6e 20 75 bject to clean u
10ec0 70 2e 20 2a 2f 0a 7b 0a 20 20 20 20 50 72 6f 63 p. */.{. Proc
10ed0 20 2a 70 72 6f 63 50 74 72 3b 0a 0a 20 20 20 20 *procPtr;..
10ee0 50 72 6f 63 47 65 74 49 6e 74 65 72 6e 61 6c 52 ProcGetInternalR
10ef0 65 70 28 6f 62 6a 50 74 72 2c 20 70 72 6f 63 50 ep(objPtr, procP
10f00 74 72 29 3b 0a 0a 20 20 20 20 69 66 20 28 70 72 tr);.. if (pr
10f10 6f 63 50 74 72 2d 3e 72 65 66 43 6f 75 6e 74 2d ocPtr->refCount-
10f20 2d 20 3c 3d 20 31 29 20 7b 0a 09 54 63 6c 50 72 - <= 1) {..TclPr
10f30 6f 63 43 6c 65 61 6e 75 70 50 72 6f 63 28 70 72 ocCleanupProc(pr
10f40 6f 63 50 74 72 29 3b 0a 20 20 20 20 7d 0a 7d 0a ocPtr);. }.}.
10f50 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d ../*. *---------
10f60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10f70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10f80 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10f90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
10fa0 0a 20 2a 20 44 75 70 4c 61 6d 62 64 61 49 6e 74 . * DupLambdaInt
10fb0 65 72 6e 61 6c 52 65 70 2c 20 46 72 65 65 4c 61 ernalRep, FreeLa
10fc0 6d 62 64 61 49 6e 74 65 72 6e 61 6c 52 65 70 2c mbdaInternalRep,
10fd0 20 53 65 74 4c 61 6d 62 64 61 46 72 6f 6d 41 6e SetLambdaFromAn
10fe0 79 20 2d 2d 0a 20 2a 0a 20 2a 09 48 6f 77 20 74 y --. *. *.How t
10ff0 6f 20 6d 61 6e 61 67 65 20 74 68 65 20 69 6e 74 o manage the int
11000 65 72 6e 61 6c 20 72 65 70 72 65 73 65 6e 74 61 ernal representa
11010 74 69 6f 6e 73 20 6f 66 20 6c 61 6d 62 64 61 20 tions of lambda
11020 74 65 72 6d 20 6f 62 6a 65 63 74 73 2e 0a 20 2a term objects.. *
11030 09 53 79 6e 74 61 63 74 69 63 61 6c 6c 79 20 74 .Syntactically t
11040 68 65 79 20 6c 6f 6f 6b 20 6c 69 6b 65 20 61 20 hey look like a
11050 74 77 6f 2d 20 6f 72 20 74 68 72 65 65 2d 65 6c two- or three-el
11060 65 6d 65 6e 74 20 6c 69 73 74 2c 20 77 68 65 72 ement list, wher
11070 65 20 74 68 65 0a 20 2a 09 66 69 72 73 74 20 65 e the. *.first e
11080 6c 65 6d 65 6e 74 20 69 73 20 74 68 65 20 66 6f lement is the fo
11090 72 6d 61 6c 20 61 72 67 75 6d 65 6e 74 73 2c 20 rmal arguments,
110a0 74 68 65 20 73 65 63 6f 6e 64 20 69 73 20 74 68 the second is th
110b0 65 20 62 6f 64 79 2c 20 61 6e 64 0a 20 2a 09 74 e body, and. *.t
110c0 68 65 20 28 6f 70 74 69 6f 6e 61 6c 29 20 74 68 he (optional) th
110d0 69 72 64 20 69 73 20 74 68 65 20 6e 61 6d 65 73 ird is the names
110e0 70 61 63 65 20 74 6f 20 65 78 65 63 75 74 65 20 pace to execute
110f0 74 68 65 20 6c 61 6d 62 64 61 20 74 65 72 6d 0a the lambda term.
11100 20 2a 09 77 69 74 68 69 6e 20 28 74 68 65 20 67 *.within (the g
11110 6c 6f 62 61 6c 20 6e 61 6d 65 73 70 61 63 65 20 lobal namespace
11120 69 73 20 61 73 73 75 6d 65 64 20 69 66 20 69 74 is assumed if it
11130 20 69 73 20 61 62 73 65 6e 74 29 2e 0a 20 2a 0a is absent).. *.
11140 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
11150 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11160 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11170 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11180 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 --------. */..st
11190 61 74 69 63 20 76 6f 69 64 0a 44 75 70 4c 61 6d atic void.DupLam
111a0 62 64 61 49 6e 74 65 72 6e 61 6c 52 65 70 28 0a bdaInternalRep(.
111b0 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 73 72 63 Tcl_Obj *src
111c0 50 74 72 2c 09 09 2f 2a 20 4f 62 6a 65 63 74 20 Ptr,../* Object
111d0 77 69 74 68 20 69 6e 74 65 72 6e 61 6c 20 72 65 with internal re
111e0 70 20 74 6f 20 63 6f 70 79 2e 20 2a 2f 0a 20 20 p to copy. */.
111f0 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 70 79 50 Tcl_Obj *copyP
11200 74 72 29 09 09 2f 2a 20 4f 62 6a 65 63 74 20 77 tr)../* Object w
11210 69 74 68 20 69 6e 74 65 72 6e 61 6c 20 72 65 70 ith internal rep
11220 20 74 6f 20 73 65 74 2e 20 2a 2f 0a 7b 0a 20 20 to set. */.{.
11230 20 20 50 72 6f 63 20 2a 70 72 6f 63 50 74 72 3b Proc *procPtr;
11240 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6e 73 . Tcl_Obj *ns
11250 4f 62 6a 50 74 72 3b 0a 0a 20 20 20 20 4c 61 6d ObjPtr;.. Lam
11260 62 64 61 47 65 74 49 6e 74 65 72 6e 61 6c 52 65 bdaGetInternalRe
11270 70 28 73 72 63 50 74 72 2c 20 70 72 6f 63 50 74 p(srcPtr, procPt
11280 72 2c 20 6e 73 4f 62 6a 50 74 72 29 3b 0a 20 20 r, nsObjPtr);.
11290 20 20 61 73 73 65 72 74 28 70 72 6f 63 50 74 72 assert(procPtr
112a0 20 21 3d 20 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20 != NULL);..
112b0 70 72 6f 63 50 74 72 2d 3e 72 65 66 43 6f 75 6e procPtr->refCoun
112c0 74 2b 2b 3b 0a 0a 20 20 20 20 4c 61 6d 62 64 61 t++;.. Lambda
112d0 53 65 74 49 6e 74 65 72 6e 61 6c 52 65 70 28 63 SetInternalRep(c
112e0 6f 70 79 50 74 72 2c 20 70 72 6f 63 50 74 72 2c opyPtr, procPtr,
112f0 20 6e 73 4f 62 6a 50 74 72 29 3b 0a 7d 0a 0a 73 nsObjPtr);.}..s
11300 74 61 74 69 63 20 76 6f 69 64 0a 46 72 65 65 4c tatic void.FreeL
11310 61 6d 62 64 61 49 6e 74 65 72 6e 61 6c 52 65 70 ambdaInternalRep
11320 28 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f (. Tcl_Obj *o
11330 62 6a 50 74 72 29 09 09 2f 2a 20 43 6d 64 4e 61 bjPtr)../* CmdNa
11340 6d 65 20 6f 62 6a 65 63 74 20 77 69 74 68 20 69 me object with i
11350 6e 74 65 72 6e 61 6c 20 72 65 70 72 65 73 65 6e nternal represen
11360 74 61 74 69 6f 6e 0a 09 09 09 09 20 2a 20 74 6f tation..... * to
11370 20 66 72 65 65 2e 20 2a 2f 0a 7b 0a 20 20 20 20 free. */.{.
11380 50 72 6f 63 20 2a 70 72 6f 63 50 74 72 3b 0a 20 Proc *procPtr;.
11390 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6e 73 4f 62 Tcl_Obj *nsOb
113a0 6a 50 74 72 3b 0a 0a 20 20 20 20 4c 61 6d 62 64 jPtr;.. Lambd
113b0 61 47 65 74 49 6e 74 65 72 6e 61 6c 52 65 70 28 aGetInternalRep(
113c0 6f 62 6a 50 74 72 2c 20 70 72 6f 63 50 74 72 2c objPtr, procPtr,
113d0 20 6e 73 4f 62 6a 50 74 72 29 3b 0a 20 20 20 20 nsObjPtr);.
113e0 61 73 73 65 72 74 28 70 72 6f 63 50 74 72 20 21 assert(procPtr !
113f0 3d 20 4e 55 4c 4c 29 3b 0a 0a 20 20 20 20 69 66 = NULL);.. if
11400 20 28 70 72 6f 63 50 74 72 2d 3e 72 65 66 43 6f (procPtr->refCo
11410 75 6e 74 2d 2d 20 3c 3d 20 31 29 20 7b 0a 09 54 unt-- <= 1) {..T
11420 63 6c 50 72 6f 63 43 6c 65 61 6e 75 70 50 72 6f clProcCleanupPro
11430 63 28 70 72 6f 63 50 74 72 29 3b 0a 20 20 20 20 c(procPtr);.
11440 7d 0a 20 20 20 20 54 63 6c 44 65 63 72 52 65 66 }. TclDecrRef
11450 43 6f 75 6e 74 28 6e 73 4f 62 6a 50 74 72 29 3b Count(nsObjPtr);
11460 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 0a 53 .}..static int.S
11470 65 74 4c 61 6d 62 64 61 46 72 6f 6d 41 6e 79 28 etLambdaFromAny(
11480 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 . Tcl_Interp
11490 2a 69 6e 74 65 72 70 2c 09 09 2f 2a 20 55 73 65 *interp,../* Use
114a0 64 20 66 6f 72 20 65 72 72 6f 72 20 72 65 70 6f d for error repo
114b0 72 74 69 6e 67 20 69 66 20 6e 6f 74 20 4e 55 4c rting if not NUL
114c0 4c 2e 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 L. */. Tcl_Ob
114d0 6a 20 2a 6f 62 6a 50 74 72 29 09 09 2f 2a 20 54 j *objPtr)../* T
114e0 68 65 20 6f 62 6a 65 63 74 20 74 6f 20 63 6f 6e he object to con
114f0 76 65 72 74 2e 20 2a 2f 0a 7b 0a 20 20 20 20 49 vert. */.{. I
11500 6e 74 65 72 70 20 2a 69 50 74 72 20 3d 20 28 49 nterp *iPtr = (I
11510 6e 74 65 72 70 20 2a 29 20 69 6e 74 65 72 70 3b nterp *) interp;
11520 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 . const char
11530 2a 6e 61 6d 65 3b 0a 20 20 20 20 54 63 6c 5f 4f *name;. Tcl_O
11540 62 6a 20 2a 61 72 67 73 50 74 72 2c 20 2a 62 6f bj *argsPtr, *bo
11550 64 79 50 74 72 2c 20 2a 6e 73 4f 62 6a 50 74 72 dyPtr, *nsObjPtr
11560 2c 20 2a 2a 6f 62 6a 76 3b 0a 20 20 20 20 69 6e , **objv;. in
11570 74 20 72 65 73 75 6c 74 3b 0a 20 20 20 20 54 63 t result;. Tc
11580 6c 5f 53 69 7a 65 20 6f 62 6a 63 3b 0a 20 20 20 l_Size objc;.
11590 20 43 6d 64 46 72 61 6d 65 20 2a 63 66 50 74 72 CmdFrame *cfPtr
115a0 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 50 72 6f = NULL;. Pro
115b0 63 20 2a 70 72 6f 63 50 74 72 3b 0a 20 20 20 20 c *procPtr;.
115c0 54 63 6c 5f 4e 61 6d 65 73 70 61 63 65 20 2a 6e Tcl_Namespace *n
115d0 73 50 74 72 3b 0a 20 20 20 20 43 6f 6d 6d 61 6e sPtr;. Comman
115e0 64 20 2a 63 6d 64 50 74 72 3b 0a 0a 20 20 20 20 d *cmdPtr;..
115f0 69 66 20 28 69 6e 74 65 72 70 20 3d 3d 20 4e 55 if (interp == NU
11600 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 LL) {..return TC
11610 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a L_ERROR;. }..
11620 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 43 6f /*. * Co
11630 6e 76 65 72 74 20 6f 62 6a 50 74 72 20 74 6f 20 nvert objPtr to
11640 6c 69 73 74 20 74 79 70 65 20 66 69 72 73 74 3b list type first;
11650 20 69 66 20 69 74 20 63 61 6e 6e 6f 74 20 62 65 if it cannot be
11660 20 63 6f 6e 76 65 72 74 65 64 2c 20 6f 72 20 69 converted, or i
11670 66 20 69 74 73 0a 20 20 20 20 20 2a 20 6c 65 6e f its. * len
11680 67 74 68 20 69 73 20 6e 6f 74 20 32 2c 20 74 68 gth is not 2, th
11690 65 6e 20 69 74 20 63 61 6e 6e 6f 74 20 62 65 20 en it cannot be
116a0 63 6f 6e 76 65 72 74 65 64 20 74 6f 20 6c 61 6d converted to lam
116b0 62 64 61 54 79 70 65 2e 0a 20 20 20 20 20 2a 2f bdaType.. */
116c0 0a 0a 20 20 20 20 72 65 73 75 6c 74 20 3d 20 54 .. result = T
116d0 63 6c 4c 69 73 74 4f 62 6a 4c 65 6e 67 74 68 28 clListObjLength(
116e0 4e 55 4c 4c 2c 20 6f 62 6a 50 74 72 2c 20 26 6f NULL, objPtr, &o
116f0 62 6a 63 29 3b 0a 20 20 20 20 69 66 20 28 28 72 bjc);. if ((r
11700 65 73 75 6c 74 20 21 3d 20 54 43 4c 5f 4f 4b 29 esult != TCL_OK)
11710 20 7c 7c 20 28 28 6f 62 6a 63 20 21 3d 20 32 29 || ((objc != 2)
11720 20 26 26 20 28 6f 62 6a 63 20 21 3d 20 33 29 29 && (objc != 3))
11730 29 20 7b 0a 09 54 63 6c 5f 53 65 74 4f 62 6a 52 ) {..Tcl_SetObjR
11740 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 esult(interp, Tc
11750 6c 5f 4f 62 6a 50 72 69 6e 74 66 28 0a 09 09 22 l_ObjPrintf(..."
11760 63 61 6e 27 74 20 69 6e 74 65 72 70 72 65 74 20 can't interpret
11770 5c 22 25 73 5c 22 20 61 73 20 61 20 6c 61 6d 62 \"%s\" as a lamb
11780 64 61 20 65 78 70 72 65 73 73 69 6f 6e 22 2c 0a da expression",.
11790 09 09 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 ..Tcl_GetString(
117a0 6f 62 6a 50 74 72 29 29 29 3b 0a 09 54 63 6c 5f objPtr)));..Tcl_
117b0 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 SetErrorCode(int
117c0 65 72 70 2c 20 22 54 43 4c 22 2c 20 22 56 41 4c erp, "TCL", "VAL
117d0 55 45 22 2c 20 22 4c 41 4d 42 44 41 22 2c 20 28 UE", "LAMBDA", (
117e0 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 72 char *)NULL);..r
117f0 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
11800 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 73 75 6c . }. resul
11810 74 20 3d 20 54 63 6c 4c 69 73 74 4f 62 6a 47 65 t = TclListObjGe
11820 74 45 6c 65 6d 65 6e 74 73 28 4e 55 4c 4c 2c 20 tElements(NULL,
11830 6f 62 6a 50 74 72 2c 20 26 6f 62 6a 63 2c 20 26 objPtr, &objc, &
11840 6f 62 6a 76 29 3b 0a 20 20 20 20 69 66 20 28 28 objv);. if ((
11850 72 65 73 75 6c 74 20 21 3d 20 54 43 4c 5f 4f 4b result != TCL_OK
11860 29 20 7c 7c 20 28 28 6f 62 6a 63 20 21 3d 20 32 ) || ((objc != 2
11870 29 20 26 26 20 28 6f 62 6a 63 20 21 3d 20 33 29 ) && (objc != 3)
11880 29 29 20 7b 0a 09 54 63 6c 5f 53 65 74 4f 62 6a )) {..Tcl_SetObj
11890 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 Result(interp, T
118a0 63 6c 5f 4f 62 6a 50 72 69 6e 74 66 28 0a 09 09 cl_ObjPrintf(...
118b0 22 63 61 6e 27 74 20 69 6e 74 65 72 70 72 65 74 "can't interpret
118c0 20 5c 22 25 73 5c 22 20 61 73 20 61 20 6c 61 6d \"%s\" as a lam
118d0 62 64 61 20 65 78 70 72 65 73 73 69 6f 6e 22 2c bda expression",
118e0 0a 09 09 54 63 6c 47 65 74 53 74 72 69 6e 67 28 ...TclGetString(
118f0 6f 62 6a 50 74 72 29 29 29 3b 0a 09 54 63 6c 5f objPtr)));..Tcl_
11900 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 SetErrorCode(int
11910 65 72 70 2c 20 22 54 43 4c 22 2c 20 22 56 41 4c erp, "TCL", "VAL
11920 55 45 22 2c 20 22 4c 41 4d 42 44 41 22 2c 20 28 UE", "LAMBDA", (
11930 63 68 61 72 20 2a 29 4e 55 4c 4c 29 3b 0a 09 72 char *)NULL);..r
11940 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
11950 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 . }.. /*.
11960 20 20 20 20 2a 20 53 65 74 20 74 68 65 20 6e 61 * Set the na
11970 6d 65 73 70 61 63 65 20 66 6f 72 20 74 68 69 73 mespace for this
11980 20 6c 61 6d 62 64 61 3a 20 67 69 76 65 6e 20 62 lambda: given b
11990 79 20 6f 62 6a 76 5b 32 5d 20 75 6e 64 65 72 73 y objv[2] unders
119a0 74 6f 6f 64 20 61 73 20 61 0a 20 20 20 20 20 2a tood as a. *
119b0 20 67 6c 6f 62 61 6c 20 72 65 66 65 72 65 6e 63 global referenc
119c0 65 2c 20 6f 72 20 65 6c 73 65 20 67 6c 6f 62 61 e, or else globa
119d0 6c 20 70 65 72 20 64 65 66 61 75 6c 74 2e 0a 20 l per default..
119e0 20 20 20 20 2a 2f 0a 0a 20 20 20 20 69 66 20 28 */.. if (
119f0 6f 62 6a 63 20 3d 3d 20 32 29 20 7b 0a 09 54 63 objc == 2) {..Tc
11a00 6c 4e 65 77 4c 69 74 65 72 61 6c 53 74 72 69 6e lNewLiteralStrin
11a10 67 4f 62 6a 28 6e 73 4f 62 6a 50 74 72 2c 20 22 gObj(nsObjPtr, "
11a20 3a 3a 22 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 ::");. } else
11a30 20 7b 0a 09 63 6f 6e 73 74 20 63 68 61 72 20 2a {..const char *
11a40 6e 73 4e 61 6d 65 20 3d 20 54 63 6c 47 65 74 53 nsName = TclGetS
11a50 74 72 69 6e 67 28 6f 62 6a 76 5b 32 5d 29 3b 0a tring(objv[2]);.
11a60 0a 09 69 66 20 28 28 2a 6e 73 4e 61 6d 65 20 21 ..if ((*nsName !
11a70 3d 20 27 3a 27 29 20 7c 7c 20 28 2a 28 6e 73 4e = ':') || (*(nsN
11a80 61 6d 65 2b 31 29 20 21 3d 20 27 3a 27 29 29 20 ame+1) != ':'))
11a90 7b 0a 09 20 20 20 20 54 63 6c 4e 65 77 4c 69 74 {.. TclNewLit
11aa0 65 72 61 6c 53 74 72 69 6e 67 4f 62 6a 28 6e 73 eralStringObj(ns
11ab0 4f 62 6a 50 74 72 2c 20 22 3a 3a 22 29 3b 0a 09 ObjPtr, "::");..
11ac0 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 4f 62 Tcl_AppendOb
11ad0 6a 54 6f 4f 62 6a 28 6e 73 4f 62 6a 50 74 72 2c jToObj(nsObjPtr,
11ae0 20 6f 62 6a 76 5b 32 5d 29 3b 0a 09 7d 20 65 6c objv[2]);..} el
11af0 73 65 20 7b 0a 09 20 20 20 20 6e 73 4f 62 6a 50 se {.. nsObjP
11b00 74 72 20 3d 20 6f 62 6a 76 5b 32 5d 3b 0a 09 7d tr = objv[2];..}
11b10 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 49 . }. Tcl_I
11b20 6e 63 72 52 65 66 43 6f 75 6e 74 28 6e 73 4f 62 ncrRefCount(nsOb
11b30 6a 50 74 72 29 3b 0a 20 20 20 20 2f 2a 20 46 69 jPtr);. /* Fi
11b40 6e 64 20 74 68 65 20 6e 61 6d 65 73 70 61 63 65 nd the namespace
11b50 20 77 68 65 72 65 20 74 68 69 73 20 6c 61 6d 62 where this lamb
11b60 64 61 20 73 68 6f 75 6c 64 20 72 75 6e 2e 20 2a da should run. *
11b70 2f 0a 20 20 20 20 72 65 73 75 6c 74 20 3d 20 54 /. result = T
11b80 63 6c 47 65 74 4e 61 6d 65 73 70 61 63 65 46 72 clGetNamespaceFr
11b90 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6e 73 omObj(interp, ns
11ba0 4f 62 6a 50 74 72 2c 20 26 6e 73 50 74 72 29 3b ObjPtr, &nsPtr);
11bb0 0a 20 20 20 20 69 66 20 28 72 65 73 75 6c 74 20 . if (result
11bc0 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 54 63 != TCL_OK) {..Tc
11bd0 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 6e l_DecrRefCount(n
11be0 73 4f 62 6a 50 74 72 29 3b 0a 09 72 65 74 75 72 sObjPtr);..retur
11bf0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 n TCL_ERROR;.
11c00 20 7d 0a 0a 20 20 20 20 61 72 67 73 50 74 72 20 }.. argsPtr
11c10 3d 20 6f 62 6a 76 5b 30 5d 3b 0a 20 20 20 20 62 = objv[0];. b
11c20 6f 64 79 50 74 72 20 3d 20 6f 62 6a 76 5b 31 5d odyPtr = objv[1]
11c30 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a ;.. /*. *
11c40 20 43 72 65 61 74 65 20 61 6e 64 20 69 6e 69 74 Create and init
11c50 69 61 6c 69 7a 65 20 74 68 65 20 50 72 6f 63 20 ialize the Proc
11c60 73 74 72 75 63 74 2e 20 54 68 65 20 63 6d 64 50 struct. The cmdP
11c70 74 72 20 66 69 65 6c 64 20 69 73 20 73 65 74 20 tr field is set
11c80 74 6f 0a 20 20 20 20 20 2a 20 61 72 74 69 66 69 to. * artifi
11c90 63 69 61 6c 20 63 6f 6d 6d 61 6e 64 20 6f 77 6e cial command own
11ca0 65 64 20 62 79 20 74 68 65 20 70 72 6f 63 50 74 ed by the procPt
11cb0 72 20 77 69 74 68 20 66 65 77 20 69 6e 66 6f 2c r with few info,
11cc0 20 65 2e 20 67 2e 20 75 73 65 64 0a 20 20 20 20 e. g. used.
11cd0 20 2a 20 69 6e 20 54 63 6c 49 6e 66 6f 46 72 61 * in TclInfoFra
11ce0 6d 65 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 me.. */..
11cf0 20 6e 61 6d 65 20 3d 20 54 63 6c 47 65 74 53 74 name = TclGetSt
11d00 72 69 6e 67 28 6f 62 6a 50 74 72 29 3b 0a 0a 20 ring(objPtr);..
11d10 20 20 20 69 66 20 28 54 63 6c 43 72 65 61 74 65 if (TclCreate
11d20 50 72 6f 63 28 69 6e 74 65 72 70 2c 20 2f 2a 69 Proc(interp, /*i
11d30 67 6e 6f 72 65 64 20 6e 73 50 74 72 2a 2f 20 4e gnored nsPtr*/ N
11d40 55 4c 4c 2c 20 6e 61 6d 65 2c 20 61 72 67 73 50 ULL, name, argsP
11d50 74 72 2c 20 62 6f 64 79 50 74 72 2c 0a 09 20 20 tr, bodyPtr,..
11d60 20 20 26 70 72 6f 63 50 74 72 29 20 21 3d 20 54 &procPtr) != T
11d70 43 4c 5f 4f 4b 29 20 7b 0a 09 54 63 6c 5f 41 70 CL_OK) {..Tcl_Ap
11d80 70 65 6e 64 4f 62 6a 54 6f 45 72 72 6f 72 49 6e pendObjToErrorIn
11d90 66 6f 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4f fo(interp, Tcl_O
11da0 62 6a 50 72 69 6e 74 66 28 0a 09 09 22 5c 6e 20 bjPrintf(..."\n
11db0 20 20 20 28 70 61 72 73 69 6e 67 20 6c 61 6d 62 (parsing lamb
11dc0 64 61 20 65 78 70 72 65 73 73 69 6f 6e 20 5c 22 da expression \"
11dd0 25 73 5c 22 29 22 2c 20 6e 61 6d 65 29 29 3b 0a %s\")", name));.
11de0 09 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e .Tcl_DecrRefCoun
11df0 74 28 6e 73 4f 62 6a 50 74 72 29 3b 0a 09 72 65 t(nsObjPtr);..re
11e00 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
11e10 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 }.. /*.
11e20 20 20 20 2a 20 43 41 52 45 46 55 4c 3a 20 54 63 * CAREFUL: Tc
11e30 6c 43 72 65 61 74 65 50 72 6f 63 20 72 65 74 75 lCreateProc retu
11e40 72 6e 73 20 72 65 66 43 6f 75 6e 74 3d 3d 31 21 rns refCount==1!
11e50 20 5b 42 75 67 20 31 35 37 38 34 35 34 5d 0a 20 [Bug 1578454].
11e60 20 20 20 20 2a 20 70 72 6f 63 50 74 72 2d 3e 72 * procPtr->r
11e70 65 66 43 6f 75 6e 74 20 3d 20 31 3b 0a 20 20 20 efCount = 1;.
11e80 20 20 2a 2f 0a 0a 20 20 20 20 63 6d 64 50 74 72 */.. cmdPtr
11e90 20 3d 20 28 43 6f 6d 6d 61 6e 64 20 2a 29 54 63 = (Command *)Tc
11ea0 6c 5f 41 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 43 l_Alloc(sizeof(C
11eb0 6f 6d 6d 61 6e 64 29 29 3b 0a 20 20 20 20 6d 65 ommand));. me
11ec0 6d 73 65 74 28 63 6d 64 50 74 72 2c 20 30 2c 20 mset(cmdPtr, 0,
11ed0 73 69 7a 65 6f 66 28 2a 63 6d 64 50 74 72 29 29 sizeof(*cmdPtr))
11ee0 3b 0a 20 20 20 20 63 6d 64 50 74 72 2d 3e 6e 73 ;. cmdPtr->ns
11ef0 50 74 72 20 3d 20 28 4e 61 6d 65 73 70 61 63 65 Ptr = (Namespace
11f00 20 2a 29 20 6e 73 50 74 72 3b 0a 20 20 20 20 28 *) nsPtr;. (
11f10 28 4e 61 6d 65 73 70 61 63 65 20 2a 29 6e 73 50 (Namespace *)nsP
11f20 74 72 29 2d 3e 72 65 66 43 6f 75 6e 74 2b 2b 3b tr)->refCount++;
11f30 0a 20 20 20 20 63 6d 64 50 74 72 2d 3e 6f 62 6a . cmdPtr->obj
11f40 43 6c 69 65 6e 74 44 61 74 61 32 20 3d 20 6f 62 ClientData2 = ob
11f50 6a 50 74 72 3b 0a 20 20 20 20 63 6d 64 50 74 72 jPtr;. cmdPtr
11f60 2d 3e 72 65 66 43 6f 75 6e 74 2b 2b 3b 0a 20 20 ->refCount++;.
11f70 20 20 70 72 6f 63 50 74 72 2d 3e 63 6d 64 50 74 procPtr->cmdPt
11f80 72 20 3d 20 63 6d 64 50 74 72 3b 0a 20 20 20 20 r = cmdPtr;.
11f90 70 72 6f 63 50 74 72 2d 3e 66 6c 61 67 73 20 3d procPtr->flags =
11fa0 20 50 52 4f 43 5f 43 4d 44 5f 4f 57 4e 45 44 3b PROC_CMD_OWNED;
11fb0 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 .. /*. *
11fc0 54 49 50 20 23 32 38 30 3a 20 52 65 6d 65 6d 62 TIP #280: Rememb
11fd0 65 72 20 74 68 65 20 6c 69 6e 65 20 74 68 65 20 er the line the
11fe0 61 70 70 6c 79 20 62 6f 64 79 20 69 73 20 73 74 apply body is st
11ff0 61 72 74 69 6e 67 20 6f 6e 2e 20 49 6e 20 61 20 arting on. In a
12000 42 79 74 65 0a 20 20 20 20 20 2a 20 63 6f 64 65 Byte. * code
12010 20 63 6f 6e 74 65 78 74 20 77 65 20 61 73 6b 20 context we ask
12020 74 68 65 20 65 6e 67 69 6e 65 20 74 6f 20 70 72 the engine to pr
12030 6f 76 69 64 65 20 75 73 20 77 69 74 68 20 74 68 ovide us with th
12040 65 20 6e 65 63 65 73 73 61 72 79 0a 20 20 20 20 e necessary.
12050 20 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20 * information.
12060 54 68 69 73 20 69 73 20 66 6f 72 20 74 68 65 20 This is for the
12070 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 6f initialization o
12080 66 20 74 68 65 20 62 79 74 65 20 63 6f 64 65 20 f the byte code
12090 63 6f 6d 70 69 6c 65 72 0a 20 20 20 20 20 2a 20 compiler. *
120a0 77 68 65 6e 20 74 68 65 20 62 6f 64 79 20 69 73 when the body is
120b0 20 75 73 65 64 20 66 6f 72 20 74 68 65 20 66 69 used for the fi
120c0 72 73 74 20 74 69 6d 65 2e 0a 20 20 20 20 20 2a rst time.. *
120d0 0a 20 20 20 20 20 2a 20 4e 4f 54 45 3a 20 54 68 . * NOTE: Th
120e0 65 20 62 6f 64 79 20 69 73 20 74 68 65 20 73 65 e body is the se
120f0 63 6f 6e 64 20 77 6f 72 64 20 69 6e 20 74 68 65 cond word in the
12100 20 27 6f 62 6a 50 74 72 27 2e 20 49 74 73 20 6c 'objPtr'. Its l
12110 6f 63 61 74 69 6f 6e 2c 0a 20 20 20 20 20 2a 20 ocation,. *
12120 61 63 63 65 73 73 69 62 6c 65 20 74 68 72 6f 75 accessible throu
12130 67 68 20 27 63 6f 6e 74 65 78 74 2e 6c 69 6e 65 gh 'context.line
12140 5b 31 5d 27 20 28 73 65 65 20 62 65 6c 6f 77 29 [1]' (see below)
12150 20 69 73 20 74 68 65 72 65 66 6f 72 65 20 6f 6e is therefore on
12160 6c 79 20 74 68 65 0a 20 20 20 20 20 2a 20 66 69 ly the. * fi
12170 72 73 74 20 61 70 70 72 6f 78 69 6d 61 74 69 6f rst approximatio
12180 6e 20 6f 66 20 74 68 65 20 61 63 74 75 61 6c 20 n of the actual
12190 6c 69 6e 65 20 74 68 65 20 62 6f 64 79 20 69 73 line the body is
121a0 20 6f 6e 2e 20 57 65 20 68 61 76 65 20 74 6f 20 on. We have to
121b0 75 73 65 0a 20 20 20 20 20 2a 20 74 68 65 20 73 use. * the s
121c0 74 72 69 6e 67 20 72 65 70 20 6f 66 20 74 68 65 tring rep of the
121d0 20 27 6f 62 6a 50 74 72 27 20 74 6f 20 64 65 74 'objPtr' to det
121e0 65 72 6d 69 6e 65 20 74 68 65 20 65 78 61 63 74 ermine the exact
121f0 20 6c 69 6e 65 2e 20 54 68 69 73 20 69 73 0a 20 line. This is.
12200 20 20 20 20 2a 20 61 76 61 69 6c 61 62 6c 65 20 * available
12210 61 6c 72 65 61 64 79 20 74 68 72 6f 75 67 68 20 already through
12220 27 6e 61 6d 65 27 2e 20 55 73 65 20 27 54 63 6c 'name'. Use 'Tcl
12230 4c 69 73 74 4c 69 6e 65 73 27 2c 20 73 65 65 20 ListLines', see
12240 27 73 77 69 74 63 68 27 0a 20 20 20 20 20 2a 20 'switch'. *
12250 28 74 63 6c 43 6d 64 4d 5a 2e 63 29 2e 0a 20 20 (tclCmdMZ.c)..
12260 20 20 20 2a 0a 20 20 20 20 20 2a 20 54 68 69 73 *. * This
12270 20 63 6f 64 65 20 69 73 20 6e 65 61 72 6c 79 20 code is nearly
12280 69 64 65 6e 74 69 63 61 6c 20 74 6f 20 74 68 65 identical to the
12290 20 23 32 38 30 20 63 6f 64 65 20 69 6e 20 54 63 #280 code in Tc
122a0 6c 5f 50 72 6f 63 4f 62 6a 43 6d 64 2c 20 73 65 l_ProcObjCmd, se
122b0 65 0a 20 20 20 20 20 2a 20 74 68 69 73 20 66 69 e. * this fi
122c0 6c 65 2e 20 54 68 65 20 64 69 66 66 65 72 65 6e le. The differen
122d0 63 65 73 20 61 72 65 20 74 68 65 20 64 69 66 66 ces are the diff
122e0 65 72 65 6e 74 20 69 6e 64 65 78 20 6f 66 20 74 erent index of t
122f0 68 65 20 62 6f 64 79 20 69 6e 20 74 68 65 0a 20 he body in the.
12300 20 20 20 20 2a 20 6c 69 6e 65 20 61 72 72 61 79 * line array
12310 20 6f 66 20 74 68 65 20 63 6f 6e 74 65 78 74 2c of the context,
12320 20 61 6e 64 20 74 68 65 20 73 70 65 63 69 61 6c and the special
12330 20 70 72 6f 63 65 73 73 69 6e 67 20 6d 65 6e 74 processing ment
12340 69 6f 6e 65 64 20 69 6e 20 74 68 65 0a 20 20 20 ioned in the.
12350 20 20 2a 20 70 72 65 76 69 6f 75 73 20 70 61 72 * previous par
12360 61 67 72 61 70 68 20 74 6f 20 74 72 61 63 6b 20 agraph to track
12370 69 6e 74 6f 20 74 68 65 20 6c 69 73 74 2e 20 46 into the list. F
12380 69 6e 64 20 61 20 77 61 79 20 74 6f 20 66 61 63 ind a way to fac
12390 74 6f 72 20 74 68 65 0a 20 20 20 20 20 2a 20 63 tor the. * c
123a0 6f 6d 6d 6f 6e 20 65 6c 65 6d 65 6e 74 73 20 69 ommon elements i
123b0 6e 74 6f 20 61 20 73 69 6e 67 6c 65 20 66 75 6e nto a single fun
123c0 63 74 69 6f 6e 2e 0a 20 20 20 20 20 2a 2f 0a 0a ction.. */..
123d0 20 20 20 20 69 66 20 28 69 50 74 72 2d 3e 63 6d if (iPtr->cm
123e0 64 46 72 61 6d 65 50 74 72 29 20 7b 0a 09 43 6d dFramePtr) {..Cm
123f0 64 46 72 61 6d 65 20 2a 63 6f 6e 74 65 78 74 50 dFrame *contextP
12400 74 72 20 3d 20 28 43 6d 64 46 72 61 6d 65 20 2a tr = (CmdFrame *
12410 29 54 63 6c 53 74 61 63 6b 41 6c 6c 6f 63 28 69 )TclStackAlloc(i
12420 6e 74 65 72 70 2c 20 73 69 7a 65 6f 66 28 43 6d nterp, sizeof(Cm
12430 64 46 72 61 6d 65 29 29 3b 0a 0a 09 2a 63 6f 6e dFrame));...*con
12440 74 65 78 74 50 74 72 20 3d 20 2a 69 50 74 72 2d textPtr = *iPtr-
12450 3e 63 6d 64 46 72 61 6d 65 50 74 72 3b 0a 09 69 >cmdFramePtr;..i
12460 66 20 28 63 6f 6e 74 65 78 74 50 74 72 2d 3e 74 f (contextPtr->t
12470 79 70 65 20 3d 3d 20 54 43 4c 5f 4c 4f 43 41 54 ype == TCL_LOCAT
12480 49 4f 4e 5f 42 43 29 20 7b 0a 09 20 20 20 20 2f ION_BC) {.. /
12490 2a 0a 09 20 20 20 20 20 2a 20 52 65 74 72 69 65 *.. * Retrie
124a0 76 65 20 74 68 65 20 73 6f 75 72 63 65 20 63 6f ve the source co
124b0 6e 74 65 78 74 20 66 72 6f 6d 20 74 68 65 20 62 ntext from the b
124c0 79 74 65 63 6f 64 65 2e 20 54 68 69 73 20 63 61 ytecode. This ca
124d0 6c 6c 0a 09 20 20 20 20 20 2a 20 61 63 63 6f 75 ll.. * accou
124e0 6e 74 73 20 66 6f 72 20 74 68 65 20 72 65 66 65 nts for the refe
124f0 72 65 6e 63 65 20 74 6f 20 74 68 65 20 73 6f 75 rence to the sou
12500 72 63 65 20 66 69 6c 65 2c 20 69 66 20 61 6e 79 rce file, if any
12510 2c 20 68 65 6c 64 20 69 6e 0a 09 20 20 20 20 20 , held in..
12520 2a 20 27 63 6f 6e 74 65 78 74 2e 64 61 74 61 2e * 'context.data.
12530 65 76 61 6c 2e 70 61 74 68 27 2e 0a 09 20 20 20 eval.path'...
12540 20 20 2a 2f 0a 0a 09 20 20 20 20 54 63 6c 47 65 */... TclGe
12550 74 53 72 63 49 6e 66 6f 46 6f 72 50 63 28 63 6f tSrcInfoForPc(co
12560 6e 74 65 78 74 50 74 72 29 3b 0a 09 7d 20 65 6c ntextPtr);..} el
12570 73 65 20 69 66 20 28 63 6f 6e 74 65 78 74 50 74 se if (contextPt
12580 72 2d 3e 74 79 70 65 20 3d 3d 20 54 43 4c 5f 4c r->type == TCL_L
12590 4f 43 41 54 49 4f 4e 5f 53 4f 55 52 43 45 29 20 OCATION_SOURCE)
125a0 7b 0a 09 20 20 20 20 2f 2a 0a 09 20 20 20 20 20 {.. /*..
125b0 2a 20 57 65 20 63 72 65 61 74 65 64 20 61 20 6e * We created a n
125c0 65 77 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 ew reference to
125d0 74 68 65 20 73 6f 75 72 63 65 20 66 69 6c 65 20 the source file
125e0 70 61 74 68 20 6e 61 6d 65 20 77 68 65 6e 20 77 path name when w
125f0 65 0a 09 20 20 20 20 20 2a 20 63 72 65 61 74 65 e.. * create
12600 64 20 27 63 6f 6e 74 65 78 74 27 20 61 62 6f 76 d 'context' abov
12610 65 2e 20 41 63 63 6f 75 6e 74 20 66 6f 72 20 74 e. Account for t
12620 68 65 20 72 65 66 65 72 65 6e 63 65 2e 0a 09 20 he reference...
12630 20 20 20 20 2a 2f 0a 0a 09 20 20 20 20 54 63 6c */... Tcl
12640 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 63 6f _IncrRefCount(co
12650 6e 74 65 78 74 50 74 72 2d 3e 64 61 74 61 2e 65 ntextPtr->data.e
12660 76 61 6c 2e 70 61 74 68 29 3b 0a 09 7d 0a 0a 09 val.path);..}...
12670 69 66 20 28 63 6f 6e 74 65 78 74 50 74 72 2d 3e if (contextPtr->
12680 74 79 70 65 20 3d 3d 20 54 43 4c 5f 4c 4f 43 41 type == TCL_LOCA
12690 54 49 4f 4e 5f 53 4f 55 52 43 45 29 20 7b 0a 09 TION_SOURCE) {..
126a0 20 20 20 20 2f 2a 0a 09 20 20 20 20 20 2a 20 57 /*.. * W
126b0 65 20 63 61 6e 20 72 65 63 6f 72 64 20 73 6f 75 e can record sou
126c0 72 63 65 20 6c 6f 63 61 74 69 6f 6e 20 77 69 74 rce location wit
126d0 68 69 6e 20 61 20 6c 61 6d 62 64 61 20 6f 6e 6c hin a lambda onl
126e0 79 20 69 66 20 74 68 65 20 62 6f 64 79 0a 09 20 y if the body..
126f0 20 20 20 20 2a 20 77 61 73 20 6e 6f 74 20 63 72 * was not cr
12700 65 61 74 65 64 20 62 79 20 73 75 62 73 74 69 74 eated by substit
12710 75 74 69 6f 6e 2e 0a 09 20 20 20 20 20 2a 2f 0a ution... */.
12720 0a 09 20 20 20 20 69 66 20 28 63 6f 6e 74 65 78 .. if (contex
12730 74 50 74 72 2d 3e 6c 69 6e 65 0a 09 09 20 20 20 tPtr->line...
12740 20 26 26 20 28 63 6f 6e 74 65 78 74 50 74 72 2d && (contextPtr-
12750 3e 6e 6c 69 6e 65 20 3e 3d 20 32 29 20 26 26 20 >nline >= 2) &&
12760 28 63 6f 6e 74 65 78 74 50 74 72 2d 3e 6c 69 6e (contextPtr->lin
12770 65 5b 31 5d 20 3e 3d 20 30 29 29 20 7b 0a 09 09 e[1] >= 0)) {...
12780 69 6e 74 20 62 75 66 5b 32 5d 3b 0a 0a 09 09 2f int buf[2];..../
12790 2a 0a 09 09 20 2a 20 4d 6f 76 65 20 66 72 6f 6d *... * Move from
127a0 20 61 70 70 72 6f 78 69 6d 61 74 69 6f 6e 20 28 approximation (
127b0 6c 69 6e 65 20 6f 66 20 6c 69 73 74 20 63 6d 64 line of list cmd
127c0 20 77 6f 72 64 29 20 74 6f 20 61 63 74 75 61 6c word) to actual
127d0 0a 09 09 20 2a 20 6c 6f 63 61 74 69 6f 6e 20 28 ... * location (
127e0 6c 69 6e 65 20 6f 66 20 32 6e 64 20 6c 69 73 74 line of 2nd list
127f0 20 65 6c 65 6d 65 6e 74 29 2e 0a 09 09 20 2a 2f element).... */
12800 0a 0a 09 09 63 66 50 74 72 20 3d 20 28 43 6d 64 ....cfPtr = (Cmd
12810 46 72 61 6d 65 20 2a 29 54 63 6c 5f 41 6c 6c 6f Frame *)Tcl_Allo
12820 63 28 73 69 7a 65 6f 66 28 43 6d 64 46 72 61 6d c(sizeof(CmdFram
12830 65 29 29 3b 0a 09 09 54 63 6c 4c 69 73 74 4c 69 e));...TclListLi
12840 6e 65 73 28 6f 62 6a 50 74 72 2c 20 63 6f 6e 74 nes(objPtr, cont
12850 65 78 74 50 74 72 2d 3e 6c 69 6e 65 5b 31 5d 2c extPtr->line[1],
12860 20 32 2c 20 62 75 66 2c 20 4e 55 4c 4c 29 3b 0a 2, buf, NULL);.
12870 0a 09 09 63 66 50 74 72 2d 3e 6c 65 76 65 6c 20 ...cfPtr->level
12880 3d 20 2d 31 3b 0a 09 09 63 66 50 74 72 2d 3e 74 = -1;...cfPtr->t
12890 79 70 65 20 3d 20 63 6f 6e 74 65 78 74 50 74 72 ype = contextPtr
128a0 2d 3e 74 79 70 65 3b 0a 09 09 63 66 50 74 72 2d ->type;...cfPtr-
128b0 3e 6c 69 6e 65 20 3d 20 28 69 6e 74 20 2a 29 54 >line = (int *)T
128c0 63 6c 5f 41 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 cl_Alloc(sizeof(
128d0 69 6e 74 29 29 3b 0a 09 09 63 66 50 74 72 2d 3e int));...cfPtr->
128e0 6c 69 6e 65 5b 30 5d 20 3d 20 62 75 66 5b 31 5d line[0] = buf[1]
128f0 3b 0a 09 09 63 66 50 74 72 2d 3e 6e 6c 69 6e 65 ;...cfPtr->nline
12900 20 3d 20 31 3b 0a 09 09 63 66 50 74 72 2d 3e 66 = 1;...cfPtr->f
12910 72 61 6d 65 50 74 72 20 3d 20 4e 55 4c 4c 3b 0a ramePtr = NULL;.
12920 09 09 63 66 50 74 72 2d 3e 6e 65 78 74 50 74 72 ..cfPtr->nextPtr
12930 20 3d 20 4e 55 4c 4c 3b 0a 0a 09 09 63 66 50 74 = NULL;....cfPt
12940 72 2d 3e 64 61 74 61 2e 65 76 61 6c 2e 70 61 74 r->data.eval.pat
12950 68 20 3d 20 63 6f 6e 74 65 78 74 50 74 72 2d 3e h = contextPtr->
12960 64 61 74 61 2e 65 76 61 6c 2e 70 61 74 68 3b 0a data.eval.path;.
12970 09 09 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 ..Tcl_IncrRefCou
12980 6e 74 28 63 66 50 74 72 2d 3e 64 61 74 61 2e 65 nt(cfPtr->data.e
12990 76 61 6c 2e 70 61 74 68 29 3b 0a 0a 09 09 63 66 val.path);....cf
129a0 50 74 72 2d 3e 63 6d 64 20 3d 20 4e 55 4c 4c 3b Ptr->cmd = NULL;
129b0 0a 09 09 63 66 50 74 72 2d 3e 6c 65 6e 20 3d 20 ...cfPtr->len =
129c0 30 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20 20 0;.. }...
129d0 2f 2a 0a 09 20 20 20 20 20 2a 20 27 63 6f 6e 74 /*.. * 'cont
129e0 65 78 74 50 74 72 27 20 69 73 20 67 6f 69 6e 67 extPtr' is going
129f0 20 6f 75 74 20 6f 66 20 73 63 6f 70 65 2e 20 52 out of scope. R
12a00 65 6c 65 61 73 65 20 74 68 65 20 72 65 66 65 72 elease the refer
12a10 65 6e 63 65 20 74 68 61 74 0a 09 20 20 20 20 20 ence that..
12a20 2a 20 69 74 27 73 20 68 6f 6c 64 69 6e 67 20 74 * it's holding t
12a30 6f 20 74 68 65 20 73 6f 75 72 63 65 20 66 69 6c o the source fil
12a40 65 20 70 61 74 68 0a 09 20 20 20 20 20 2a 2f 0a e path.. */.
12a50 0a 09 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 .. Tcl_DecrRe
12a60 66 43 6f 75 6e 74 28 63 6f 6e 74 65 78 74 50 74 fCount(contextPt
12a70 72 2d 3e 64 61 74 61 2e 65 76 61 6c 2e 70 61 74 r->data.eval.pat
12a80 68 29 3b 0a 09 7d 0a 09 54 63 6c 53 74 61 63 6b h);..}..TclStack
12a90 46 72 65 65 28 69 6e 74 65 72 70 2c 20 63 6f 6e Free(interp, con
12aa0 74 65 78 74 50 74 72 29 3b 0a 20 20 20 20 7d 0a textPtr);. }.
12ab0 20 20 20 20 54 63 6c 5f 53 65 74 48 61 73 68 56 Tcl_SetHashV
12ac0 61 6c 75 65 28 54 63 6c 5f 43 72 65 61 74 65 48 alue(Tcl_CreateH
12ad0 61 73 68 45 6e 74 72 79 28 69 50 74 72 2d 3e 6c ashEntry(iPtr->l
12ae0 69 6e 65 50 42 6f 64 79 50 74 72 2c 20 70 72 6f inePBodyPtr, pro
12af0 63 50 74 72 2c 0a 09 20 20 20 20 4e 55 4c 4c 29 cPtr,.. NULL)
12b00 2c 20 63 66 50 74 72 29 3b 0a 0a 20 20 20 20 2f , cfPtr);.. /
12b10 2a 0a 20 20 20 20 20 2a 20 46 72 65 65 20 74 68 *. * Free th
12b20 65 20 6c 69 73 74 20 69 6e 74 65 72 6e 61 6c 72 e list internalr
12b30 65 70 20 6f 66 20 6f 62 6a 50 74 72 20 2d 20 74 ep of objPtr - t
12b40 68 69 73 20 77 69 6c 6c 20 66 72 65 65 20 61 72 his will free ar
12b50 67 73 50 74 72 2c 20 62 75 74 0a 20 20 20 20 20 gsPtr, but.
12b60 2a 20 62 6f 64 79 50 74 72 20 72 65 74 61 69 6e * bodyPtr retain
12b70 73 20 61 20 72 65 66 65 72 65 6e 63 65 20 66 72 s a reference fr
12b80 6f 6d 20 74 68 65 20 50 72 6f 63 20 73 74 72 75 om the Proc stru
12b90 63 74 75 72 65 2e 20 54 68 65 6e 20 66 69 6e 69 cture. Then fini
12ba0 73 68 20 74 68 65 0a 20 20 20 20 20 2a 20 63 6f sh the. * co
12bb0 6e 76 65 72 73 69 6f 6e 20 74 6f 20 6c 61 6d 62 nversion to lamb
12bc0 64 61 54 79 70 65 2e 0a 20 20 20 20 20 2a 2f 0a daType.. */.
12bd0 0a 20 20 20 20 4c 61 6d 62 64 61 53 65 74 49 6e . LambdaSetIn
12be0 74 65 72 6e 61 6c 52 65 70 28 6f 62 6a 50 74 72 ternalRep(objPtr
12bf0 2c 20 70 72 6f 63 50 74 72 2c 20 6e 73 4f 62 6a , procPtr, nsObj
12c00 50 74 72 29 3b 0a 20 20 20 20 54 63 6c 5f 44 65 Ptr);. Tcl_De
12c10 63 72 52 65 66 43 6f 75 6e 74 28 6e 73 4f 62 6a crRefCount(nsObj
12c20 50 74 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e Ptr);. return
12c30 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a 50 72 6f 63 TCL_OK;.}..Proc
12c40 20 2a 0a 54 63 6c 47 65 74 4c 61 6d 62 64 61 46 *.TclGetLambdaF
12c50 72 6f 6d 4f 62 6a 28 0a 20 20 20 20 54 63 6c 5f romObj(. Tcl_
12c60 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a Interp *interp,.
12c70 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a Tcl_Obj *obj
12c80 50 74 72 2c 0a 20 20 20 20 54 63 6c 5f 4f 62 6a Ptr,. Tcl_Obj
12c90 20 2a 2a 6e 73 4f 62 6a 50 74 72 50 74 72 29 0a **nsObjPtrPtr).
12ca0 7b 0a 20 20 20 20 50 72 6f 63 20 2a 70 72 6f 63 {. Proc *proc
12cb0 50 74 72 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a Ptr;. Tcl_Obj
12cc0 20 2a 6e 73 4f 62 6a 50 74 72 3b 0a 0a 20 20 20 *nsObjPtr;..
12cd0 20 4c 61 6d 62 64 61 47 65 74 49 6e 74 65 72 6e LambdaGetIntern
12ce0 61 6c 52 65 70 28 6f 62 6a 50 74 72 2c 20 70 72 alRep(objPtr, pr
12cf0 6f 63 50 74 72 2c 20 6e 73 4f 62 6a 50 74 72 29 ocPtr, nsObjPtr)
12d00 3b 0a 0a 20 20 20 20 69 66 20 28 21 70 72 6f 63 ;.. if (!proc
12d10 50 74 72 20 7c 7c 20 28 70 72 6f 63 50 74 72 2d Ptr || (procPtr-
12d20 3e 69 50 74 72 20 21 3d 20 28 49 6e 74 65 72 70 >iPtr != (Interp
12d30 20 2a 29 69 6e 74 65 72 70 29 29 20 7b 0a 09 69 *)interp)) {..i
12d40 66 20 28 53 65 74 4c 61 6d 62 64 61 46 72 6f 6d f (SetLambdaFrom
12d50 41 6e 79 28 69 6e 74 65 72 70 2c 20 6f 62 6a 50 Any(interp, objP
12d60 74 72 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b tr) != TCL_OK) {
12d70 0a 09 20 20 20 20 72 65 74 75 72 6e 20 4e 55 4c .. return NUL
12d80 4c 3b 0a 09 7d 0a 09 4c 61 6d 62 64 61 47 65 74 L;..}..LambdaGet
12d90 49 6e 74 65 72 6e 61 6c 52 65 70 28 6f 62 6a 50 InternalRep(objP
12da0 74 72 2c 20 70 72 6f 63 50 74 72 2c 20 6e 73 4f tr, procPtr, nsO
12db0 62 6a 50 74 72 29 3b 0a 20 20 20 20 7d 0a 0a 20 bjPtr);. }..
12dc0 20 20 20 61 73 73 65 72 74 28 70 72 6f 63 50 74 assert(procPt
12dd0 72 20 21 3d 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 r != NULL);.
12de0 61 73 73 65 72 74 28 70 72 6f 63 50 74 72 2d 3e assert(procPtr->
12df0 63 6d 64 50 74 72 20 21 3d 20 4e 55 4c 4c 29 3b cmdPtr != NULL);
12e00 0a 0a 20 20 20 20 69 66 20 28 21 70 72 6f 63 50 .. if (!procP
12e10 74 72 2d 3e 63 6d 64 50 74 72 2d 3e 6e 73 50 74 tr->cmdPtr->nsPt
12e20 72 20 7c 7c 20 70 72 6f 63 50 74 72 2d 3e 63 6d r || procPtr->cm
12e30 64 50 74 72 2d 3e 6e 73 50 74 72 2d 3e 66 6c 61 dPtr->nsPtr->fla
12e40 67 73 20 26 20 4e 53 5f 44 45 41 44 29 20 7b 0a gs & NS_DEAD) {.
12e50 09 43 6f 6d 6d 61 6e 64 20 2a 63 6d 64 50 74 72 .Command *cmdPtr
12e60 20 3d 20 70 72 6f 63 50 74 72 2d 3e 63 6d 64 50 = procPtr->cmdP
12e70 74 72 3b 0a 09 54 63 6c 5f 4e 61 6d 65 73 70 61 tr;..Tcl_Namespa
12e80 63 65 20 2a 6e 73 50 74 72 3b 0a 09 69 66 20 28 ce *nsPtr;..if (
12e90 63 6d 64 50 74 72 2d 3e 6e 73 50 74 72 29 20 7b cmdPtr->nsPtr) {
12ea0 0a 09 20 20 20 20 54 63 6c 4e 73 44 65 63 72 52 .. TclNsDecrR
12eb0 65 66 43 6f 75 6e 74 28 63 6d 64 50 74 72 2d 3e efCount(cmdPtr->
12ec0 6e 73 50 74 72 29 3b 0a 09 20 20 20 20 63 6d 64 nsPtr);.. cmd
12ed0 50 74 72 2d 3e 6e 73 50 74 72 20 3d 20 4e 55 4c Ptr->nsPtr = NUL
12ee0 4c 3b 0a 09 7d 0a 09 2f 2a 20 52 65 74 72 79 20 L;..}../* Retry
12ef0 74 6f 20 6f 62 74 61 69 6e 20 6e 61 6d 65 73 70 to obtain namesp
12f00 61 63 65 20 61 67 61 69 6e 2e 2e 2e 20 2a 2f 0a ace again... */.
12f10 09 69 66 20 28 54 63 6c 47 65 74 4e 61 6d 65 73 .if (TclGetNames
12f20 70 61 63 65 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 paceFromObj(inte
12f30 72 70 2c 20 6e 73 4f 62 6a 50 74 72 2c 20 26 6e rp, nsObjPtr, &n
12f40 73 50 74 72 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 sPtr) != TCL_OK)
12f50 20 7b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 4e {.. return N
12f60 55 4c 4c 3b 0a 09 7d 0a 09 63 6d 64 50 74 72 2d ULL;..}..cmdPtr-
12f70 3e 6e 73 50 74 72 20 3d 20 28 4e 61 6d 65 73 70 >nsPtr = (Namesp
12f80 61 63 65 20 2a 29 20 6e 73 50 74 72 3b 0a 09 28 ace *) nsPtr;..(
12f90 28 4e 61 6d 65 73 70 61 63 65 20 2a 29 6e 73 50 (Namespace *)nsP
12fa0 74 72 29 2d 3e 72 65 66 43 6f 75 6e 74 2b 2b 3b tr)->refCount++;
12fb0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2a 6e 73 4f . }.. *nsO
12fc0 62 6a 50 74 72 50 74 72 20 3d 20 6e 73 4f 62 6a bjPtrPtr = nsObj
12fd0 50 74 72 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 Ptr;. return
12fe0 70 72 6f 63 50 74 72 3b 0a 7d 0a 0c 0a 2f 2a 0a procPtr;.}.../*.
12ff0 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *--------------
13000 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13010 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13020 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13030 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 --------. *. * T
13040 63 6c 5f 41 70 70 6c 79 4f 62 6a 43 6d 64 20 2d cl_ApplyObjCmd -
13050 2d 0a 20 2a 0a 20 2a 09 54 68 69 73 20 6f 62 6a -. *. *.This obj
13060 65 63 74 2d 62 61 73 65 64 20 66 75 6e 63 74 69 ect-based functi
13070 6f 6e 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f on is invoked to
13080 20 70 72 6f 63 65 73 73 20 74 68 65 20 22 61 70 process the "ap
13090 70 6c 79 22 20 54 63 6c 0a 20 2a 09 63 6f 6d 6d ply" Tcl. *.comm
130a0 61 6e 64 2e 20 53 65 65 20 74 68 65 20 75 73 65 and. See the use
130b0 72 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 20 r documentation
130c0 66 6f 72 20 64 65 74 61 69 6c 73 20 6f 6e 20 77 for details on w
130d0 68 61 74 20 69 74 20 64 6f 65 73 2e 0a 20 2a 0a hat it does.. *.
130e0 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 * Results:. *.A
130f0 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 6f 62 standard Tcl ob
13100 6a 65 63 74 20 72 65 73 75 6c 74 20 76 61 6c 75 ject result valu
13110 65 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 e.. *. * Side ef
13120 66 65 63 74 73 3a 0a 20 2a 09 44 65 70 65 6e 64 fects:. *.Depend
13130 73 20 6f 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 s on the content
13140 20 6f 66 20 74 68 65 20 6c 61 6d 62 64 61 20 74 of the lambda t
13150 65 72 6d 20 28 69 2e 65 2e 2c 20 6f 62 6a 76 5b erm (i.e., objv[
13160 31 5d 29 2e 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 1]).. *. *------
13170 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13180 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13190 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
131a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
131b0 0a 20 2a 2f 0a 0a 69 6e 74 0a 54 63 6c 5f 41 70 . */..int.Tcl_Ap
131c0 70 6c 79 4f 62 6a 43 6d 64 28 0a 20 20 20 20 76 plyObjCmd(. v
131d0 6f 69 64 20 2a 63 6c 69 65 6e 74 44 61 74 61 2c oid *clientData,
131e0 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 . Tcl_Interp
131f0 2a 69 6e 74 65 72 70 2c 09 09 2f 2a 20 43 75 72 *interp,../* Cur
13200 72 65 6e 74 20 69 6e 74 65 72 70 72 65 74 65 72 rent interpreter
13210 2e 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 53 69 7a . */. Tcl_Siz
13220 65 20 6f 62 6a 63 2c 09 09 2f 2a 20 4e 75 6d 62 e objc,../* Numb
13230 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 2e er of arguments.
13240 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 */. Tcl_Obj
13250 2a 63 6f 6e 73 74 20 2a 6f 62 6a 76 29 09 2f 2a *const *objv)./*
13260 20 41 72 67 75 6d 65 6e 74 20 6f 62 6a 65 63 74 Argument object
13270 73 2e 20 2a 2f 0a 7b 0a 20 20 20 20 72 65 74 75 s. */.{. retu
13280 72 6e 20 54 63 6c 5f 4e 52 43 61 6c 6c 4f 62 6a rn Tcl_NRCallObj
13290 50 72 6f 63 32 28 69 6e 74 65 72 70 2c 20 54 63 Proc2(interp, Tc
132a0 6c 4e 52 41 70 70 6c 79 4f 62 6a 43 6d 64 2c 20 lNRApplyObjCmd,
132b0 63 6c 69 65 6e 74 44 61 74 61 2c 20 6f 62 6a 63 clientData, objc
132c0 2c 20 6f 62 6a 76 29 3b 0a 7d 0a 0a 69 6e 74 0a , objv);.}..int.
132d0 54 63 6c 4e 52 41 70 70 6c 79 4f 62 6a 43 6d 64 TclNRApplyObjCmd
132e0 28 0a 20 20 20 20 54 43 4c 5f 55 4e 55 53 45 44 (. TCL_UNUSED
132f0 28 76 6f 69 64 20 2a 29 2c 0a 20 20 20 20 54 63 (void *),. Tc
13300 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 l_Interp *interp
13310 2c 09 09 2f 2a 20 43 75 72 72 65 6e 74 20 69 6e ,../* Current in
13320 74 65 72 70 72 65 74 65 72 2e 20 2a 2f 0a 20 20 terpreter. */.
13330 20 20 54 63 6c 5f 53 69 7a 65 20 6f 62 6a 63 2c Tcl_Size objc,
13340 09 09 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 ../* Number of a
13350 72 67 75 6d 65 6e 74 73 2e 20 2a 2f 0a 20 20 20 rguments. */.
13360 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 Tcl_Obj *const
13370 2a 6f 62 6a 76 29 09 2f 2a 20 41 72 67 75 6d 65 *objv)./* Argume
13380 6e 74 20 6f 62 6a 65 63 74 73 2e 20 2a 2f 0a 7b nt objects. */.{
13390 0a 20 20 20 20 50 72 6f 63 20 2a 70 72 6f 63 50 . Proc *procP
133a0 74 72 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 54 tr = NULL;. T
133b0 63 6c 5f 4f 62 6a 20 2a 6c 61 6d 62 64 61 50 74 cl_Obj *lambdaPt
133c0 72 2c 20 2a 6e 73 4f 62 6a 50 74 72 3b 0a 20 20 r, *nsObjPtr;.
133d0 20 20 69 6e 74 20 72 65 73 75 6c 74 3b 0a 0a 20 int result;..
133e0 20 20 20 69 66 20 28 6f 62 6a 63 20 3c 20 32 29 if (objc < 2)
133f0 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d {..Tcl_WrongNum
13400 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 Args(interp, 1,
13410 6f 62 6a 76 2c 20 22 6c 61 6d 62 64 61 45 78 70 objv, "lambdaExp
13420 72 20 3f 61 72 67 20 2e 2e 2e 3f 22 29 3b 0a 09 r ?arg ...?");..
13430 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
13440 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a ;. }.. /*.
13450 20 20 20 20 20 2a 20 53 65 74 20 6c 61 6d 62 64 * Set lambd
13460 61 50 74 72 2c 20 63 6f 6e 76 65 72 74 20 69 74 aPtr, convert it
13470 20 74 6f 20 74 63 6c 4c 61 6d 62 64 61 54 79 70 to tclLambdaTyp
13480 65 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 e in the current
13490 20 69 6e 74 65 72 70 20 69 66 0a 20 20 20 20 20 interp if.
134a0 2a 20 6e 65 63 65 73 73 61 72 79 2e 0a 20 20 20 * necessary..
134b0 20 20 2a 2f 0a 0a 20 20 20 20 6c 61 6d 62 64 61 */.. lambda
134c0 50 74 72 20 3d 20 6f 62 6a 76 5b 31 5d 3b 0a 20 Ptr = objv[1];.
134d0 20 20 20 70 72 6f 63 50 74 72 20 3d 20 54 63 6c procPtr = Tcl
134e0 47 65 74 4c 61 6d 62 64 61 46 72 6f 6d 4f 62 6a GetLambdaFromObj
134f0 28 69 6e 74 65 72 70 2c 20 6c 61 6d 62 64 61 50 (interp, lambdaP
13500 74 72 2c 20 26 6e 73 4f 62 6a 50 74 72 29 3b 0a tr, &nsObjPtr);.
13510 0a 20 20 20 20 69 66 20 28 70 72 6f 63 50 74 72 . if (procPtr
13520 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 == NULL) {..ret
13530 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 urn TCL_ERROR;.
13540 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 }.. /*.
13550 20 20 2a 20 50 75 73 68 20 61 20 63 61 6c 6c 20 * Push a call
13560 66 72 61 6d 65 20 66 6f 72 20 74 68 61 74 20 70 frame for that p
13570 72 6f 63 50 74 72 2e 20 4e 6f 74 65 20 74 68 61 rocPtr. Note tha
13580 74 20 54 63 6c 4e 52 49 6e 74 65 72 70 50 72 6f t TclNRInterpPro
13590 63 43 6f 72 65 28 29 0a 20 20 20 20 20 2a 20 77 cCore(). * w
135a0 69 6c 6c 20 70 6f 70 20 69 74 20 28 4e 52 45 2d ill pop it (NRE-
135b0 62 61 73 65 64 29 2e 0a 20 20 20 20 20 2a 2f 0a based).. */.
135c0 20 20 20 20 72 65 73 75 6c 74 20 3d 20 54 63 6c result = Tcl
135d0 50 75 73 68 50 72 6f 63 43 61 6c 6c 46 72 61 6d PushProcCallFram
135e0 65 28 70 72 6f 63 50 74 72 2c 20 69 6e 74 65 72 e(procPtr, inter
135f0 70 2c 20 6f 62 6a 63 2c 20 6f 62 6a 76 2c 20 31 p, objc, objv, 1
13600 29 3b 0a 20 20 20 20 69 66 20 28 72 65 73 75 6c );. if (resul
13610 74 20 3d 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 t == TCL_OK) {..
13620 72 65 73 75 6c 74 20 3d 20 54 63 6c 4e 52 49 6e result = TclNRIn
13630 74 65 72 70 50 72 6f 63 43 6f 72 65 28 69 6e 74 terpProcCore(int
13640 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 32 2c erp, objv[1], 2,
13650 20 26 4d 61 6b 65 4c 61 6d 62 64 61 45 72 72 6f &MakeLambdaErro
13660 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 r);. }. re
13670 74 75 72 6e 20 72 65 73 75 6c 74 3b 0a 7d 0a 0c turn result;.}..
13680 0a 2f 2a 0a 20 2a 2d 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 0a 20 2a 0a ------------. *.
136d0 20 2a 20 4d 61 6b 65 4c 61 6d 62 64 61 45 72 72 * MakeLambdaErr
136e0 6f 72 20 2d 2d 0a 20 2a 0a 20 2a 09 46 75 6e 63 or --. *. *.Func
136f0 74 69 6f 6e 20 63 61 6c 6c 65 64 20 62 79 20 54 tion called by T
13700 63 6c 4f 62 6a 49 6e 74 65 72 70 50 72 6f 63 32 clObjInterpProc2
13710 20 74 6f 20 63 72 65 61 74 65 20 74 68 65 20 73 to create the s
13720 74 61 63 6b 20 69 6e 66 6f 72 6d 61 74 69 6f 6e tack information
13730 0a 20 2a 09 75 70 6f 6e 20 61 6e 20 65 72 72 6f . *.upon an erro
13740 72 20 66 72 6f 6d 20 61 20 6c 61 6d 62 64 61 20 r from a lambda
13750 74 65 72 6d 2e 0a 20 2a 0a 20 2a 20 52 65 73 75 term.. *. * Resu
13760 6c 74 73 3a 0a 20 2a 09 54 68 65 20 69 6e 74 65 lts:. *.The inte
13770 72 70 72 65 74 65 72 27 73 20 65 72 72 6f 72 20 rpreter's error
13780 69 6e 66 6f 20 74 72 61 63 65 20 69 73 20 73 65 info trace is se
13790 74 20 74 6f 20 61 20 76 61 6c 75 65 20 74 68 61 t to a value tha
137a0 74 20 73 75 70 70 6c 65 6d 65 6e 74 73 0a 20 2a t supplements. *
137b0 09 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 2e .the error code.
137c0 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 65 . *. * Side effe
137d0 63 74 73 3a 0a 20 2a 09 6e 6f 6e 65 2e 0a 20 2a cts:. *.none.. *
137e0 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . *-------------
137f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13800 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13810 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13820 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 ---------. */..s
13830 74 61 74 69 63 20 76 6f 69 64 0a 4d 61 6b 65 4c tatic void.MakeL
13840 61 6d 62 64 61 45 72 72 6f 72 28 0a 20 20 20 20 ambdaError(.
13850 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 Tcl_Interp *inte
13860 72 70 2c 09 09 2f 2a 20 54 68 65 20 69 6e 74 65 rp,../* The inte
13870 72 70 72 65 74 65 72 20 69 6e 20 77 68 69 63 68 rpreter in which
13880 20 74 68 65 20 70 72 6f 63 65 64 75 72 65 20 77 the procedure w
13890 61 73 0a 09 09 09 09 20 2a 20 63 61 6c 6c 65 64 as..... * called
138a0 2e 20 2a 2f 0a 20 20 20 20 54 63 6c 5f 4f 62 6a . */. Tcl_Obj
138b0 20 2a 70 72 6f 63 4e 61 6d 65 4f 62 6a 29 09 2f *procNameObj)./
138c0 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 70 72 * Name of the pr
138d0 6f 63 65 64 75 72 65 2e 20 55 73 65 64 20 66 6f ocedure. Used fo
138e0 72 20 65 72 72 6f 72 0a 09 09 09 09 20 2a 20 6d r error..... * m
138f0 65 73 73 61 67 65 73 20 61 6e 64 20 74 72 61 63 essages and trac
13900 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20 2a e information. *
13910 2f 0a 7b 0a 20 20 20 20 69 6e 74 20 6f 76 65 72 /.{. int over
13920 66 6c 6f 77 2c 20 6c 69 6d 69 74 20 3d 20 36 30 flow, limit = 60
13930 3b 0a 20 20 20 20 54 63 6c 5f 53 69 7a 65 20 6e ;. Tcl_Size n
13940 61 6d 65 4c 65 6e 3b 0a 20 20 20 20 63 6f 6e 73 ameLen;. cons
13950 74 20 63 68 61 72 20 2a 70 72 6f 63 4e 61 6d 65 t char *procName
13960 20 3d 20 54 63 6c 47 65 74 53 74 72 69 6e 67 46 = TclGetStringF
13970 72 6f 6d 4f 62 6a 28 70 72 6f 63 4e 61 6d 65 4f romObj(procNameO
13980 62 6a 2c 20 26 6e 61 6d 65 4c 65 6e 29 3b 0a 0a bj, &nameLen);..
13990 20 20 20 20 6f 76 65 72 66 6c 6f 77 20 3d 20 28 overflow = (
139a0 6e 61 6d 65 4c 65 6e 20 3e 20 28 54 63 6c 5f 53 nameLen > (Tcl_S
139b0 69 7a 65 29 6c 69 6d 69 74 29 3b 0a 20 20 20 20 ize)limit);.
139c0 54 63 6c 5f 41 70 70 65 6e 64 4f 62 6a 54 6f 45 Tcl_AppendObjToE
139d0 72 72 6f 72 49 6e 66 6f 28 69 6e 74 65 72 70 2c rrorInfo(interp,
139e0 20 54 63 6c 5f 4f 62 6a 50 72 69 6e 74 66 28 0a Tcl_ObjPrintf(.
139f0 09 20 20 20 20 22 5c 6e 20 20 20 20 28 6c 61 6d . "\n (lam
13a00 62 64 61 20 74 65 72 6d 20 5c 22 25 2e 2a 73 25 bda term \"%.*s%
13a10 73 5c 22 20 6c 69 6e 65 20 25 64 29 22 2c 0a 09 s\" line %d)",..
13a20 20 20 20 20 28 6f 76 65 72 66 6c 6f 77 20 3f 20 (overflow ?
13a30 6c 69 6d 69 74 20 3a 20 28 69 6e 74 29 6e 61 6d limit : (int)nam
13a40 65 4c 65 6e 29 2c 20 70 72 6f 63 4e 61 6d 65 2c eLen), procName,
13a50 0a 09 20 20 20 20 28 6f 76 65 72 66 6c 6f 77 20 .. (overflow
13a60 3f 20 22 2e 2e 2e 22 20 3a 20 22 22 29 2c 20 54 ? "..." : ""), T
13a70 63 6c 5f 47 65 74 45 72 72 6f 72 4c 69 6e 65 28 cl_GetErrorLine(
13a80 69 6e 74 65 72 70 29 29 29 3b 0a 7d 0a 0c 0a 2f interp)));.}.../
13a90 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
13aa0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13ab0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13ac0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13ad0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a ----------. *. *
13ae0 20 54 63 6c 47 65 74 43 6d 64 46 72 61 6d 65 46 TclGetCmdFrameF
13af0 6f 72 50 72 6f 63 65 64 75 72 65 20 2d 2d 0a 20 orProcedure --.
13b00 2a 0a 20 2a 09 48 6f 77 20 74 6f 20 67 65 74 20 *. *.How to get
13b10 74 68 65 20 43 6d 64 46 72 61 6d 65 20 69 6e 66 the CmdFrame inf
13b20 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 61 20 70 ormation for a p
13b30 72 6f 63 65 64 75 72 65 2e 0a 20 2a 0a 20 2a 20 rocedure.. *. *
13b40 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 20 70 6f Results:. *.A po
13b50 69 6e 74 65 72 20 74 6f 20 74 68 65 20 43 6d 64 inter to the Cmd
13b60 46 72 61 6d 65 20 28 6f 6e 6c 79 20 67 75 61 72 Frame (only guar
13b70 61 6e 74 65 65 64 20 74 6f 20 62 65 20 76 61 6c anteed to be val
13b80 69 64 20 75 6e 74 69 6c 20 74 68 65 20 6e 65 78 id until the nex
13b90 74 0a 20 2a 09 54 63 6c 20 63 6f 6d 6d 61 6e 64 t. *.Tcl command
13ba0 20 69 73 20 70 72 6f 63 65 73 73 65 64 20 6f 72 is processed or
13bb0 20 74 68 65 20 69 6e 74 65 72 70 72 65 74 65 72 the interpreter
13bc0 27 73 20 73 74 61 74 65 20 69 73 20 6f 74 68 65 's state is othe
13bd0 72 77 69 73 65 0a 20 2a 09 6d 6f 64 69 66 69 65 rwise. *.modifie
13be0 64 29 20 6f 72 20 61 20 4e 55 4c 4c 20 69 66 20 d) or a NULL if
13bf0 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 the information
13c00 69 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 is not available
13c10 2e 0a 20 2a 0a 20 2a 20 53 69 64 65 20 65 66 66 .. *. * Side eff
13c20 65 63 74 73 3a 0a 20 2a 09 6e 6f 6e 65 2e 0a 20 ects:. *.none..
13c30 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *. *------------
13c40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13c50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13c60 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13c70 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a ----------. */..
13c80 43 6d 64 46 72 61 6d 65 20 2a 0a 54 63 6c 47 65 CmdFrame *.TclGe
13c90 74 43 6d 64 46 72 61 6d 65 46 6f 72 50 72 6f 63 tCmdFrameForProc
13ca0 65 64 75 72 65 28 0a 20 20 20 20 50 72 6f 63 20 edure(. Proc
13cb0 2a 70 72 6f 63 50 74 72 29 09 09 2f 2a 20 54 68 *procPtr)../* Th
13cc0 65 20 70 72 6f 63 65 64 75 72 65 20 77 68 6f 73 e procedure whos
13cd0 65 20 63 6d 64 2d 66 72 61 6d 65 20 69 73 20 74 e cmd-frame is t
13ce0 6f 20 62 65 0a 09 09 09 09 20 2a 20 6c 6f 6f 6b o be..... * look
13cf0 65 64 20 75 70 2e 20 2a 2f 0a 7b 0a 20 20 20 20 ed up. */.{.
13d00 54 63 6c 5f 48 61 73 68 45 6e 74 72 79 20 2a 68 Tcl_HashEntry *h
13d10 65 50 74 72 3b 0a 0a 20 20 20 20 69 66 20 28 70 ePtr;.. if (p
13d20 72 6f 63 50 74 72 20 3d 3d 20 4e 55 4c 4c 20 7c rocPtr == NULL |
13d30 7c 20 70 72 6f 63 50 74 72 2d 3e 69 50 74 72 20 | procPtr->iPtr
13d40 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 == NULL) {..retu
13d50 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 rn NULL;. }.
13d60 20 20 20 68 65 50 74 72 20 3d 20 54 63 6c 5f 46 hePtr = Tcl_F
13d70 69 6e 64 48 61 73 68 45 6e 74 72 79 28 70 72 6f indHashEntry(pro
13d80 63 50 74 72 2d 3e 69 50 74 72 2d 3e 6c 69 6e 65 cPtr->iPtr->line
13d90 50 42 6f 64 79 50 74 72 2c 20 70 72 6f 63 50 74 PBodyPtr, procPt
13da0 72 29 3b 0a 20 20 20 20 69 66 20 28 68 65 50 74 r);. if (hePt
13db0 72 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 r == NULL) {..re
13dc0 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 20 7d turn NULL;. }
13dd0 0a 20 20 20 20 72 65 74 75 72 6e 20 28 43 6d 64 . return (Cmd
13de0 46 72 61 6d 65 20 2a 29 20 54 63 6c 5f 47 65 74 Frame *) Tcl_Get
13df0 48 61 73 68 56 61 6c 75 65 28 68 65 50 74 72 29 HashValue(hePtr)
13e00 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d ;.}.../*. *-----
13e10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13e20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13e30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13e40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13e50 2d 0a 20 2a 0a 20 2a 20 54 63 6c 43 6f 70 79 4e -. *. * TclCopyN
13e60 61 6d 65 73 70 61 63 65 50 72 6f 63 65 64 75 72 amespaceProcedur
13e70 65 73 20 2d 2d 0a 20 2a 0a 20 2a 09 43 6f 70 79 es --. *. *.Copy
13e80 20 70 72 6f 63 65 64 75 72 65 73 20 66 72 6f 6d procedures from
13e90 20 6f 6e 65 20 6e 61 6d 65 73 70 61 63 65 20 69 one namespace i
13ea0 6e 74 6f 20 61 6e 6f 74 68 65 72 2e 0a 20 2a 0a nto another.. *.
13eb0 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09 41 * Results:. *.A
13ec0 20 73 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 standard Tcl re
13ed0 73 75 6c 74 20 63 6f 64 65 2e 0a 20 2a 0a 20 2a sult code.. *. *
13ee0 20 53 69 64 65 20 65 66 66 65 63 74 73 3a 0a 20 Side effects:.
13ef0 2a 09 4d 6f 64 69 66 69 65 73 20 74 68 65 20 74 *.Modifies the t
13f00 61 72 67 65 74 20 6e 61 6d 65 73 70 61 63 65 27 arget namespace'
13f10 73 20 63 6f 6d 6d 61 6e 64 73 2e 0a 20 2a 0a 20 s commands.. *.
13f20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d *---------------
13f30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13f40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13f50 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13f60 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 2f 2f 20 -------. */..//
13f70 44 75 70 6c 69 63 61 74 65 20 61 6e 20 61 72 67 Duplicate an arg
13f80 75 6d 65 6e 74 20 74 6f 20 61 20 70 72 6f 63 65 ument to a proce
13f90 64 75 72 65 2e 0a 73 74 61 74 69 63 20 69 6e 6c dure..static inl
13fa0 69 6e 65 20 69 6e 74 0a 44 75 70 6c 69 63 61 74 ine int.Duplicat
13fb0 65 41 72 67 75 6d 65 6e 74 28 0a 20 20 20 20 50 eArgument(. P
13fc0 72 6f 63 20 2a 6e 65 77 50 72 6f 63 2c 0a 20 20 roc *newProc,.
13fd0 20 20 63 6f 6e 73 74 20 43 6f 6d 70 69 6c 65 64 const Compiled
13fe0 4c 6f 63 61 6c 20 2a 6f 72 69 67 4c 6f 63 61 6c Local *origLocal
13ff0 2c 0a 20 20 20 20 54 63 6c 5f 53 69 7a 65 20 69 ,. Tcl_Size i
14000 29 0a 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 ).{. const ch
14010 61 72 20 2a 61 72 67 6e 61 6d 65 20 3d 20 6f 72 ar *argname = or
14020 69 67 4c 6f 63 61 6c 2d 3e 6e 61 6d 65 3b 0a 20 igLocal->name;.
14030 20 20 20 54 63 6c 5f 53 69 7a 65 20 6e 61 6d 65 Tcl_Size name
14040 4c 65 6e 67 74 68 20 3d 20 6f 72 69 67 4c 6f 63 Length = origLoc
14050 61 6c 2d 3e 6e 61 6d 65 4c 65 6e 67 74 68 3b 0a al->nameLength;.
14060 0a 20 20 20 20 2f 2f 20 41 6c 6c 6f 63 61 74 65 . // Allocate
14070 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 74 68 65 an entry in the
14080 20 72 75 6e 74 69 6d 65 20 70 72 6f 63 65 64 75 runtime procedu
14090 72 65 20 66 72 61 6d 65 27 73 20 6c 69 73 74 20 re frame's list
140a0 6f 66 20 6c 6f 63 61 6c 0a 20 20 20 20 2f 2f 20 of local. //
140b0 76 61 72 69 61 62 6c 65 73 20 66 6f 72 20 74 68 variables for th
140c0 65 20 61 72 67 75 6d 65 6e 74 2e 0a 0a 20 20 20 e argument...
140d0 20 43 6f 6d 70 69 6c 65 64 4c 6f 63 61 6c 20 2a CompiledLocal *
140e0 6c 6f 63 61 6c 50 74 72 20 3d 20 28 43 6f 6d 70 localPtr = (Comp
140f0 69 6c 65 64 4c 6f 63 61 6c 20 2a 29 54 63 6c 5f iledLocal *)Tcl_
14100 41 74 74 65 6d 70 74 41 6c 6c 6f 63 28 0a 09 20 AttemptAlloc(..
14110 20 20 20 6f 66 66 73 65 74 6f 66 28 43 6f 6d 70 offsetof(Comp
14120 69 6c 65 64 4c 6f 63 61 6c 2c 20 6e 61 6d 65 29 iledLocal, name)
14130 20 2b 20 31 55 20 2b 20 6e 61 6d 65 4c 65 6e 67 + 1U + nameLeng
14140 74 68 29 3b 0a 20 20 20 20 69 66 20 28 21 6c 6f th);. if (!lo
14150 63 61 6c 50 74 72 29 20 7b 0a 09 72 65 74 75 72 calPtr) {..retur
14160 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 n TCL_ERROR;.
14170 20 7d 0a 20 20 20 20 69 66 20 28 6e 65 77 50 72 }. if (newPr
14180 6f 63 2d 3e 66 69 72 73 74 4c 6f 63 61 6c 50 74 oc->firstLocalPt
14190 72 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 6e 65 r == NULL) {..ne
141a0 77 50 72 6f 63 2d 3e 66 69 72 73 74 4c 6f 63 61 wProc->firstLoca
141b0 6c 50 74 72 20 3d 20 6e 65 77 50 72 6f 63 2d 3e lPtr = newProc->
141c0 6c 61 73 74 4c 6f 63 61 6c 50 74 72 20 3d 20 6c lastLocalPtr = l
141d0 6f 63 61 6c 50 74 72 3b 0a 20 20 20 20 7d 20 65 ocalPtr;. } e
141e0 6c 73 65 20 7b 0a 09 6e 65 77 50 72 6f 63 2d 3e lse {..newProc->
141f0 6c 61 73 74 4c 6f 63 61 6c 50 74 72 2d 3e 6e 65 lastLocalPtr->ne
14200 78 74 50 74 72 20 3d 20 6c 6f 63 61 6c 50 74 72 xtPtr = localPtr
14210 3b 0a 09 6e 65 77 50 72 6f 63 2d 3e 6c 61 73 74 ;..newProc->last
14220 4c 6f 63 61 6c 50 74 72 20 3d 20 6c 6f 63 61 6c LocalPtr = local
14230 50 74 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6c Ptr;. }. l
14240 6f 63 61 6c 50 74 72 2d 3e 6e 65 78 74 50 74 72 ocalPtr->nextPtr
14250 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 6c 6f 63 = NULL;. loc
14260 61 6c 50 74 72 2d 3e 6e 61 6d 65 4c 65 6e 67 74 alPtr->nameLengt
14270 68 20 3d 20 6e 61 6d 65 4c 65 6e 67 74 68 3b 0a h = nameLength;.
14280 20 20 20 20 6c 6f 63 61 6c 50 74 72 2d 3e 66 72 localPtr->fr
14290 61 6d 65 49 6e 64 65 78 20 3d 20 69 3b 0a 20 20 ameIndex = i;.
142a0 20 20 6c 6f 63 61 6c 50 74 72 2d 3e 66 6c 61 67 localPtr->flag
142b0 73 20 3d 20 56 41 52 5f 41 52 47 55 4d 45 4e 54 s = VAR_ARGUMENT
142c0 3b 0a 20 20 20 20 6c 6f 63 61 6c 50 74 72 2d 3e ;. localPtr->
142d0 72 65 73 6f 6c 76 65 49 6e 66 6f 20 3d 20 4e 55 resolveInfo = NU
142e0 4c 4c 3b 0a 20 20 20 20 6c 6f 63 61 6c 50 74 72 LL;. localPtr
142f0 2d 3e 64 65 66 56 61 6c 75 65 50 74 72 20 3d 20 ->defValuePtr =
14300 6f 72 69 67 4c 6f 63 61 6c 2d 3e 64 65 66 56 61 origLocal->defVa
14310 6c 75 65 50 74 72 3b 0a 20 20 20 20 69 66 20 28 luePtr;. if (
14320 6c 6f 63 61 6c 50 74 72 2d 3e 64 65 66 56 61 6c localPtr->defVal
14330 75 65 50 74 72 29 20 7b 0a 09 54 63 6c 5f 49 6e uePtr) {..Tcl_In
14340 63 72 52 65 66 43 6f 75 6e 74 28 6c 6f 63 61 6c crRefCount(local
14350 50 74 72 2d 3e 64 65 66 56 61 6c 75 65 50 74 72 Ptr->defValuePtr
14360 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65 6d );. }. mem
14370 63 70 79 28 6c 6f 63 61 6c 50 74 72 2d 3e 6e 61 cpy(localPtr->na
14380 6d 65 2c 20 61 72 67 6e 61 6d 65 2c 20 6e 61 6d me, argname, nam
14390 65 4c 65 6e 67 74 68 20 2b 20 31 29 3b 0a 20 20 eLength + 1);.
143a0 20 20 69 66 20 28 6f 72 69 67 4c 6f 63 61 6c 2d if (origLocal-
143b0 3e 66 6c 61 67 73 20 26 20 56 41 52 5f 49 53 5f >flags & VAR_IS_
143c0 41 52 47 53 29 20 7b 0a 09 6c 6f 63 61 6c 50 74 ARGS) {..localPt
143d0 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 56 41 52 5f r->flags |= VAR_
143e0 49 53 5f 41 52 47 53 3b 0a 20 20 20 20 7d 0a 20 IS_ARGS;. }.
143f0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b return TCL_OK
14400 3b 0a 7d 0a 0a 2f 2f 20 44 75 70 6c 69 63 61 74 ;.}..// Duplicat
14410 65 20 61 20 70 72 6f 63 65 64 75 72 65 20 69 6e e a procedure in
14420 74 6f 20 61 20 64 69 66 66 65 72 65 6e 74 20 6e to a different n
14430 61 6d 65 73 70 61 63 65 2e 0a 73 74 61 74 69 63 amespace..static
14440 20 69 6e 74 0a 44 75 70 6c 69 63 61 74 65 50 72 int.DuplicatePr
14450 6f 63 28 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 oc(. Tcl_Inte
14460 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 20 20 rp *interp,.
14470 4e 61 6d 65 73 70 61 63 65 20 2a 6e 73 50 74 72 Namespace *nsPtr
14480 2c 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 ,. const char
14490 20 2a 63 6d 64 4e 61 6d 65 2c 0a 20 20 20 20 63 *cmdName,. c
144a0 6f 6e 73 74 20 50 72 6f 63 20 2a 6f 72 69 67 50 onst Proc *origP
144b0 72 6f 63 2c 0a 20 20 20 20 63 6f 6e 73 74 20 43 roc,. const C
144c0 6f 6d 6d 61 6e 64 20 2a 6f 72 69 67 43 6d 64 29 ommand *origCmd)
144d0 0a 7b 0a 20 20 20 20 49 6e 74 65 72 70 20 2a 69 .{. Interp *i
144e0 50 74 72 20 3d 20 28 49 6e 74 65 72 70 20 2a 29 Ptr = (Interp *)
144f0 20 69 6e 74 65 72 70 3b 0a 20 20 20 20 54 63 6c interp;. Tcl
14500 5f 48 61 73 68 45 6e 74 72 79 20 2a 6f 72 69 67 _HashEntry *orig
14510 48 65 50 74 72 3b 0a 0a 20 20 20 20 2f 2f 20 44 HePtr;.. // D
14520 75 70 6c 69 63 61 74 65 20 74 68 65 20 73 74 72 uplicate the str
14530 69 6e 67 20 6f 66 20 62 6f 64 79 2c 20 6e 6f 74 ing of body, not
14540 20 74 68 65 20 62 79 74 65 63 6f 64 65 2e 0a 20 the bytecode..
14550 20 20 20 54 63 6c 5f 53 69 7a 65 20 6c 65 6e 67 Tcl_Size leng
14560 74 68 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 th;. const ch
14570 61 72 20 2a 62 79 74 65 73 20 3d 20 54 63 6c 47 ar *bytes = TclG
14580 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f 62 6a 28 etStringFromObj(
14590 6f 72 69 67 50 72 6f 63 2d 3e 62 6f 64 79 50 74 origProc->bodyPt
145a0 72 2c 20 26 6c 65 6e 67 74 68 29 3b 0a 20 20 20 r, &length);.
145b0 20 54 63 6c 5f 4f 62 6a 20 2a 62 6f 64 79 50 74 Tcl_Obj *bodyPt
145c0 72 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e r = Tcl_NewStrin
145d0 67 4f 62 6a 28 62 79 74 65 73 2c 20 6c 65 6e 67 gObj(bytes, leng
145e0 74 68 29 3b 0a 20 20 20 20 54 63 6c 43 6f 6e 74 th);. TclCont
145f0 69 6e 75 61 74 69 6f 6e 73 43 6f 70 79 28 62 6f inuationsCopy(bo
14600 64 79 50 74 72 2c 20 6f 72 69 67 50 72 6f 63 2d dyPtr, origProc-
14610 3e 62 6f 64 79 50 74 72 29 3b 0a 20 20 20 20 54 >bodyPtr);. T
14620 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 cl_IncrRefCount(
14630 62 6f 64 79 50 74 72 29 3b 0a 0a 20 20 20 20 2f bodyPtr);.. /
14640 2f 20 54 68 65 20 6e 65 77 20 70 72 6f 63 65 64 / The new proced
14650 75 72 65 20 72 65 63 6f 72 64 2e 0a 20 20 20 20 ure record..
14660 50 72 6f 63 20 2a 6e 65 77 50 72 6f 63 20 3d 20 Proc *newProc =
14670 28 50 72 6f 63 20 2a 29 20 54 63 6c 5f 41 6c 6c (Proc *) Tcl_All
14680 6f 63 28 73 69 7a 65 6f 66 28 50 72 6f 63 29 29 oc(sizeof(Proc))
14690 3b 0a 20 20 20 20 6e 65 77 50 72 6f 63 2d 3e 69 ;. newProc->i
146a0 50 74 72 20 3d 20 69 50 74 72 3b 0a 20 20 20 20 Ptr = iPtr;.
146b0 6e 65 77 50 72 6f 63 2d 3e 72 65 66 43 6f 75 6e newProc->refCoun
146c0 74 20 3d 20 31 3b 0a 20 20 20 20 6e 65 77 50 72 t = 1;. newPr
146d0 6f 63 2d 3e 62 6f 64 79 50 74 72 20 3d 20 62 6f oc->bodyPtr = bo
146e0 64 79 50 74 72 3b 0a 20 20 20 20 6e 65 77 50 72 dyPtr;. newPr
146f0 6f 63 2d 3e 6e 75 6d 41 72 67 73 20 3d 20 6f 72 oc->numArgs = or
14700 69 67 50 72 6f 63 2d 3e 6e 75 6d 41 72 67 73 3b igProc->numArgs;
14710 0a 20 20 20 20 6e 65 77 50 72 6f 63 2d 3e 6e 75 . newProc->nu
14720 6d 43 6f 6d 70 69 6c 65 64 4c 6f 63 61 6c 73 20 mCompiledLocals
14730 3d 20 6f 72 69 67 50 72 6f 63 2d 3e 6e 75 6d 41 = origProc->numA
14740 72 67 73 3b 0a 20 20 20 20 6e 65 77 50 72 6f 63 rgs;. newProc
14750 2d 3e 66 69 72 73 74 4c 6f 63 61 6c 50 74 72 20 ->firstLocalPtr
14760 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 6e 65 77 50 = NULL;. newP
14770 72 6f 63 2d 3e 6c 61 73 74 4c 6f 63 61 6c 50 74 roc->lastLocalPt
14780 72 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 6e 65 r = NULL;. ne
14790 77 50 72 6f 63 2d 3e 66 6c 61 67 73 20 3d 20 30 wProc->flags = 0
147a0 3b 0a 0a 20 20 20 20 2f 2f 20 57 6f 72 6b 20 74 ;.. // Work t
147b0 68 72 6f 75 67 68 20 74 68 65 20 6f 72 69 67 69 hrough the origi
147c0 6e 61 6c 20 61 72 67 75 6d 65 6e 74 73 2c 20 64 nal arguments, d
147d0 75 70 6c 69 63 61 74 69 6e 67 20 74 68 65 6d 2e uplicating them.
147e0 0a 20 20 20 20 63 6f 6e 73 74 20 43 6f 6d 70 69 . const Compi
147f0 6c 65 64 4c 6f 63 61 6c 20 2a 6f 72 69 67 4c 6f ledLocal *origLo
14800 63 61 6c 20 3d 20 6f 72 69 67 50 72 6f 63 2d 3e cal = origProc->
14810 66 69 72 73 74 4c 6f 63 61 6c 50 74 72 3b 0a 20 firstLocalPtr;.
14820 20 20 20 66 6f 72 20 28 54 63 6c 5f 53 69 7a 65 for (Tcl_Size
14830 20 69 20 3d 20 30 3b 20 69 20 3c 20 6e 65 77 50 i = 0; i < newP
14840 72 6f 63 2d 3e 6e 75 6d 41 72 67 73 3b 20 69 2b roc->numArgs; i+
14850 2b 29 20 7b 0a 09 69 66 20 28 44 75 70 6c 69 63 +) {..if (Duplic
14860 61 74 65 41 72 67 75 6d 65 6e 74 28 6e 65 77 50 ateArgument(newP
14870 72 6f 63 2c 20 6f 72 69 67 4c 6f 63 61 6c 2c 20 roc, origLocal,
14880 69 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a i) != TCL_OK) {.
14890 09 20 20 20 20 2f 2f 20 44 6f 6e 27 74 20 73 65 . // Don't se
148a0 74 20 74 68 65 20 69 6e 74 65 72 70 20 72 65 73 t the interp res
148b0 75 6c 74 20 68 65 72 65 2e 20 53 69 6e 63 65 20 ult here. Since
148c0 61 20 6d 61 6c 6c 6f 63 20 6a 75 73 74 20 66 61 a malloc just fa
148d0 69 6c 65 64 2c 0a 09 20 20 20 20 2f 2f 20 66 69 iled,.. // fi
148e0 72 73 74 20 63 6c 65 61 6e 20 75 70 20 73 6f 6d rst clean up som
148f0 65 20 6d 65 6d 6f 72 79 20 62 65 66 6f 72 65 20 e memory before
14900 64 6f 69 6e 67 20 74 68 61 74 20 2a 2f 0a 09 20 doing that */..
14910 20 20 20 67 6f 74 6f 20 70 72 6f 63 45 72 72 6f goto procErro
14920 72 3b 0a 09 7d 0a 09 6f 72 69 67 4c 6f 63 61 6c r;..}..origLocal
14930 20 3d 20 6f 72 69 67 4c 6f 63 61 6c 2d 3e 6e 65 = origLocal->ne
14940 78 74 50 74 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 xtPtr;. }..
14950 20 20 2f 2f 20 43 72 65 61 74 65 20 74 68 65 20 // Create the
14960 6e 65 77 20 63 6f 6d 6d 61 6e 64 20 62 61 63 6b new command back
14970 65 64 20 62 79 20 74 68 65 20 70 72 6f 63 65 64 ed by the proced
14980 75 72 65 2e 0a 20 20 20 20 6e 65 77 50 72 6f 63 ure.. newProc
14990 2d 3e 63 6d 64 50 74 72 20 3d 20 28 43 6f 6d 6d ->cmdPtr = (Comm
149a0 61 6e 64 20 2a 29 20 54 63 6c 4e 52 43 72 65 61 and *) TclNRCrea
149b0 74 65 43 6f 6d 6d 61 6e 64 49 6e 4e 73 28 69 6e teCommandInNs(in
149c0 74 65 72 70 2c 20 63 6d 64 4e 61 6d 65 2c 0a 09 terp, cmdName,..
149d0 20 20 20 20 28 54 63 6c 5f 4e 61 6d 65 73 70 61 (Tcl_Namespa
149e0 63 65 20 2a 29 20 6e 73 50 74 72 2c 20 54 63 6c ce *) nsPtr, Tcl
149f0 4f 62 6a 49 6e 74 65 72 70 50 72 6f 63 32 2c 20 ObjInterpProc2,
14a00 54 63 6c 4e 52 49 6e 74 65 72 70 50 72 6f 63 2c TclNRInterpProc,
14a10 20 6e 65 77 50 72 6f 63 2c 0a 09 20 20 20 20 54 newProc,.. T
14a20 63 6c 50 72 6f 63 44 65 6c 65 74 65 50 72 6f 63 clProcDeleteProc
14a30 29 3b 0a 0a 20 20 20 20 2f 2f 20 54 49 50 20 23 );.. // TIP #
14a40 32 38 30 3a 20 44 75 70 6c 69 63 61 74 65 20 74 280: Duplicate t
14a50 68 65 20 6f 72 69 67 69 6e 20 69 6e 66 6f 72 6d he origin inform
14a60 61 74 69 6f 6e 20 28 69 66 20 77 65 20 68 61 76 ation (if we hav
14a70 65 20 69 74 29 2e 0a 20 20 20 20 6f 72 69 67 48 e it).. origH
14a80 65 50 74 72 20 3d 20 54 63 6c 5f 46 69 6e 64 48 ePtr = Tcl_FindH
14a90 61 73 68 45 6e 74 72 79 28 69 50 74 72 2d 3e 6c ashEntry(iPtr->l
14aa0 69 6e 65 50 42 6f 64 79 50 74 72 2c 20 6f 72 69 inePBodyPtr, ori
14ab0 67 50 72 6f 63 29 3b 0a 20 20 20 20 69 66 20 28 gProc);. if (
14ac0 6f 72 69 67 48 65 50 74 72 29 20 7b 0a 09 43 6d origHePtr) {..Cm
14ad0 64 46 72 61 6d 65 20 2a 6e 65 77 43 66 50 74 72 dFrame *newCfPtr
14ae0 20 3d 20 28 43 6d 64 46 72 61 6d 65 20 2a 29 20 = (CmdFrame *)
14af0 54 63 6c 5f 41 6c 6c 6f 63 28 73 69 7a 65 6f 66 Tcl_Alloc(sizeof
14b00 28 43 6d 64 46 72 61 6d 65 29 29 3b 0a 09 63 6f (CmdFrame));..co
14b10 6e 73 74 20 43 6d 64 46 72 61 6d 65 20 2a 6f 72 nst CmdFrame *or
14b20 69 67 43 66 50 74 72 20 3d 20 28 43 6d 64 46 72 igCfPtr = (CmdFr
14b30 61 6d 65 20 2a 29 20 54 63 6c 5f 47 65 74 48 61 ame *) Tcl_GetHa
14b40 73 68 56 61 6c 75 65 28 6f 72 69 67 48 65 50 74 shValue(origHePt
14b50 72 29 3b 0a 0a 09 2f 2f 20 43 6f 70 79 20 69 6e r);...// Copy in
14b60 66 6f 2c 20 74 68 65 6e 20 66 69 78 20 75 70 20 fo, then fix up
14b70 62 69 74 73 20 74 68 61 74 20 6e 65 65 64 20 64 bits that need d
14b80 69 66 66 65 72 65 6e 74 20 74 72 65 61 74 6d 65 ifferent treatme
14b90 6e 74 2e 0a 09 6d 65 6d 63 70 79 28 6e 65 77 43 nt...memcpy(newC
14ba0 66 50 74 72 2c 20 6f 72 69 67 43 66 50 74 72 2c fPtr, origCfPtr,
14bb0 20 73 69 7a 65 6f 66 28 43 6d 64 46 72 61 6d 65 sizeof(CmdFrame
14bc0 29 29 3b 0a 09 6e 65 77 43 66 50 74 72 2d 3e 6c ));..newCfPtr->l
14bd0 69 6e 65 20 3d 20 28 69 6e 74 20 2a 29 54 63 6c ine = (int *)Tcl
14be0 5f 41 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 69 6e _Alloc(sizeof(in
14bf0 74 29 29 3b 0a 09 6e 65 77 43 66 50 74 72 2d 3e t));..newCfPtr->
14c00 6c 69 6e 65 5b 30 5d 20 3d 20 6f 72 69 67 43 66 line[0] = origCf
14c10 50 74 72 2d 3e 6c 69 6e 65 5b 30 5d 3b 0a 09 54 Ptr->line[0];..T
14c20 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 cl_IncrRefCount(
14c30 6e 65 77 43 66 50 74 72 2d 3e 64 61 74 61 2e 65 newCfPtr->data.e
14c40 76 61 6c 2e 70 61 74 68 29 3b 0a 0a 09 54 63 6c val.path);...Tcl
14c50 5f 48 61 73 68 45 6e 74 72 79 20 2a 68 65 50 74 _HashEntry *hePt
14c60 72 20 3d 20 54 63 6c 5f 43 72 65 61 74 65 48 61 r = Tcl_CreateHa
14c70 73 68 45 6e 74 72 79 28 69 50 74 72 2d 3e 6c 69 shEntry(iPtr->li
14c80 6e 65 50 42 6f 64 79 50 74 72 2c 0a 09 09 6e 65 nePBodyPtr,...ne
14c90 77 50 72 6f 63 2c 20 4e 55 4c 4c 29 3b 0a 09 54 wProc, NULL);..T
14ca0 63 6c 5f 53 65 74 48 61 73 68 56 61 6c 75 65 28 cl_SetHashValue(
14cb0 68 65 50 74 72 2c 20 6e 65 77 43 66 50 74 72 29 hePtr, newCfPtr)
14cc0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2f 20 ;. }.. //
14cd0 4f 70 74 69 6d 69 7a 65 20 66 6f 72 20 6e 6f 2d Optimize for no-
14ce0 6f 70 20 70 72 6f 63 73 2e 20 4e 6f 74 65 20 74 op procs. Note t
14cf0 68 61 74 20 74 68 69 73 20 69 73 20 73 69 6d 70 hat this is simp
14d00 6c 65 72 20 74 68 61 6e 20 69 6e 20 5b 70 72 6f ler than in [pro
14d10 63 5d 3b 20 77 65 0a 20 20 20 20 2f 2f 20 6a 75 c]; we. // ju
14d20 73 74 20 73 65 65 20 77 68 65 74 68 65 72 20 77 st see whether w
14d30 65 27 76 65 20 67 6f 74 20 74 68 65 20 63 6f 6d e've got the com
14d40 70 69 6c 65 72 20 69 6e 20 74 68 65 20 6f 6c 64 piler in the old
14d50 20 63 6f 6d 6d 61 6e 64 21 0a 20 20 20 20 69 66 command!. if
14d60 20 28 6f 72 69 67 43 6d 64 2d 3e 63 6f 6d 70 69 (origCmd->compi
14d70 6c 65 50 72 6f 63 20 3d 3d 20 54 63 6c 43 6f 6d leProc == TclCom
14d80 70 69 6c 65 4e 6f 4f 70 29 20 7b 0a 09 6e 65 77 pileNoOp) {..new
14d90 50 72 6f 63 2d 3e 63 6d 64 50 74 72 2d 3e 63 6f Proc->cmdPtr->co
14da0 6d 70 69 6c 65 50 72 6f 63 20 3d 20 54 63 6c 43 mpileProc = TclC
14db0 6f 6d 70 69 6c 65 4e 6f 4f 70 3b 0a 20 20 20 20 ompileNoOp;.
14dc0 7d 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 }.. return TC
14dd0 4c 5f 4f 4b 3b 0a 0a 20 20 70 72 6f 63 45 72 72 L_OK;.. procErr
14de0 6f 72 3a 0a 20 20 20 20 2f 2f 20 44 65 6c 65 74 or:. // Delet
14df0 65 20 74 68 65 20 64 61 74 61 20 61 6c 6c 6f 63 e the data alloc
14e00 61 74 65 64 20 73 6f 20 66 61 72 0a 20 20 20 20 ated so far.
14e10 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 Tcl_DecrRefCount
14e20 28 62 6f 64 79 50 74 72 29 3b 0a 20 20 20 20 77 (bodyPtr);. w
14e30 68 69 6c 65 20 28 6e 65 77 50 72 6f 63 2d 3e 66 hile (newProc->f
14e40 69 72 73 74 4c 6f 63 61 6c 50 74 72 20 21 3d 20 irstLocalPtr !=
14e50 4e 55 4c 4c 29 20 7b 0a 09 43 6f 6d 70 69 6c 65 NULL) {..Compile
14e60 64 4c 6f 63 61 6c 20 2a 6c 6f 63 61 6c 50 74 72 dLocal *localPtr
14e70 20 3d 20 6e 65 77 50 72 6f 63 2d 3e 66 69 72 73 = newProc->firs
14e80 74 4c 6f 63 61 6c 50 74 72 3b 0a 09 6e 65 77 50 tLocalPtr;..newP
14e90 72 6f 63 2d 3e 66 69 72 73 74 4c 6f 63 61 6c 50 roc->firstLocalP
14ea0 74 72 20 3d 20 6c 6f 63 61 6c 50 74 72 2d 3e 6e tr = localPtr->n
14eb0 65 78 74 50 74 72 3b 0a 0a 09 69 66 20 28 6c 6f extPtr;...if (lo
14ec0 63 61 6c 50 74 72 2d 3e 64 65 66 56 61 6c 75 65 calPtr->defValue
14ed0 50 74 72 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 Ptr != NULL) {..
14ee0 20 20 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 Tcl_DecrRefC
14ef0 6f 75 6e 74 28 6c 6f 63 61 6c 50 74 72 2d 3e 64 ount(localPtr->d
14f00 65 66 56 61 6c 75 65 50 74 72 29 3b 0a 09 7d 0a efValuePtr);..}.
14f10 0a 09 54 63 6c 5f 46 72 65 65 28 6c 6f 63 61 6c ..Tcl_Free(local
14f20 50 74 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 Ptr);. }.
14f30 54 63 6c 5f 46 72 65 65 28 6e 65 77 50 72 6f 63 Tcl_Free(newProc
14f40 29 3b 0a 20 20 20 20 2f 2f 20 43 6f 6d 70 6c 61 );. // Compla
14f50 69 6e 20 61 62 6f 75 74 20 74 68 65 20 66 61 69 in about the fai
14f60 6c 75 72 65 20 74 6f 20 61 6c 6c 6f 63 61 74 65 lure to allocate
14f70 2e 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a .. Tcl_SetObj
14f80 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 Result(interp, T
14f90 63 6c 5f 4f 62 6a 50 72 69 6e 74 66 28 0a 09 20 cl_ObjPrintf(..
14fa0 20 20 20 22 70 72 6f 63 65 64 75 72 65 20 5c 22 "procedure \"
14fb0 25 73 5c 22 3a 20 61 72 67 20 6c 69 73 74 20 63 %s\": arg list c
14fc0 6f 6e 74 61 69 6e 73 20 74 6f 6f 20 6d 61 6e 79 ontains too many
14fd0 20 28 25 22 0a 09 20 20 20 20 54 43 4c 5f 53 49 (%".. TCL_SI
14fe0 5a 45 5f 4d 4f 44 49 46 49 45 52 20 22 64 29 20 ZE_MODIFIER "d)
14ff0 65 6e 74 72 69 65 73 22 2c 20 63 6d 64 4e 61 6d entries", cmdNam
15000 65 2c 20 6f 72 69 67 50 72 6f 63 2d 3e 6e 75 6d e, origProc->num
15010 41 72 67 73 29 29 3b 0a 20 20 20 20 54 63 6c 5f Args));. Tcl_
15020 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 SetErrorCode(int
15030 65 72 70 2c 20 22 54 43 4c 22 2c 20 22 4f 50 45 erp, "TCL", "OPE
15040 52 41 54 49 4f 4e 22 2c 20 22 50 52 4f 43 22 2c RATION", "PROC",
15050 0a 09 20 20 20 20 54 4f 4f 4d 41 4e 59 41 52 47 .. TOOMANYARG
15060 53 2c 20 28 63 68 61 72 20 2a 29 4e 55 4c 4c 29 S, (char *)NULL)
15070 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c ;. return TCL
15080 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 2f 2f 20 44 75 _ERROR;.}..// Du
15090 70 6c 69 63 61 74 65 20 61 6c 6c 20 74 68 65 20 plicate all the
150a0 70 72 6f 63 65 64 75 72 65 73 20 69 6e 20 61 20 procedures in a
150b0 6e 61 6d 65 73 70 61 63 65 20 69 6e 74 6f 20 61 namespace into a
150c0 6e 6f 74 68 65 72 20 28 6e 65 77 29 20 6e 61 6d nother (new) nam
150d0 65 73 70 61 63 65 2e 0a 69 6e 74 0a 54 63 6c 43 espace..int.TclC
150e0 6f 70 79 4e 61 6d 65 73 70 61 63 65 50 72 6f 63 opyNamespaceProc
150f0 65 64 75 72 65 73 28 0a 20 20 20 20 54 63 6c 5f edures(. Tcl_
15100 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a Interp *interp,.
15110 20 20 20 20 4e 61 6d 65 73 70 61 63 65 20 2a 73 Namespace *s
15120 72 63 4e 73 50 74 72 2c 09 2f 2f 20 57 68 65 72 rcNsPtr,.// Wher
15130 65 20 74 6f 20 63 6f 70 79 20 66 72 6f 6d 2e 0a e to copy from..
15140 20 20 20 20 4e 61 6d 65 73 70 61 63 65 20 2a 74 Namespace *t
15150 67 74 4e 73 50 74 72 29 09 2f 2f 20 57 68 65 72 gtNsPtr).// Wher
15160 65 20 74 6f 20 63 6f 70 79 20 74 6f 2e 0a 7b 0a e to copy to..{.
15170 20 20 20 20 54 63 6c 5f 48 61 73 68 53 65 61 72 Tcl_HashSear
15180 63 68 20 73 65 61 72 63 68 3b 0a 20 20 20 20 69 ch search;. i
15190 66 20 28 73 72 63 4e 73 50 74 72 20 3d 3d 20 74 f (srcNsPtr == t
151a0 67 74 4e 73 50 74 72 29 20 7b 0a 09 54 63 6c 5f gtNsPtr) {..Tcl_
151b0 50 61 6e 69 63 28 22 63 61 6e 6e 6f 74 20 63 6f Panic("cannot co
151c0 70 79 20 70 72 6f 63 65 64 75 72 65 73 20 66 72 py procedures fr
151d0 6f 6d 20 6f 6e 65 20 6e 61 6d 65 73 70 61 63 65 om one namespace
151e0 20 74 6f 20 69 74 73 65 6c 66 22 29 3b 0a 20 20 to itself");.
151f0 20 20 7d 0a 20 20 20 20 66 6f 72 20 28 54 63 6c }. for (Tcl
15200 5f 48 61 73 68 45 6e 74 72 79 20 2a 65 6e 74 72 _HashEntry *entr
15210 79 50 74 72 20 3d 20 54 63 6c 5f 46 69 72 73 74 yPtr = Tcl_First
15220 48 61 73 68 45 6e 74 72 79 28 26 73 72 63 4e 73 HashEntry(&srcNs
15230 50 74 72 2d 3e 63 6d 64 54 61 62 6c 65 2c 20 26 Ptr->cmdTable, &
15240 73 65 61 72 63 68 29 3b 0a 09 20 20 20 20 65 6e search);.. en
15250 74 72 79 50 74 72 3b 20 65 6e 74 72 79 50 74 72 tryPtr; entryPtr
15260 20 3d 20 54 63 6c 5f 4e 65 78 74 48 61 73 68 45 = Tcl_NextHashE
15270 6e 74 72 79 28 26 73 65 61 72 63 68 29 29 20 7b ntry(&search)) {
15280 0a 09 63 6f 6e 73 74 20 63 68 61 72 20 2a 63 6d ..const char *cm
15290 64 4e 61 6d 65 20 3d 20 28 63 6f 6e 73 74 20 63 dName = (const c
152a0 68 61 72 20 2a 29 0a 09 09 54 63 6c 5f 47 65 74 har *)...Tcl_Get
152b0 48 61 73 68 4b 65 79 28 26 73 72 63 4e 73 50 74 HashKey(&srcNsPt
152c0 72 2d 3e 63 6d 64 54 61 62 6c 65 2c 20 65 6e 74 r->cmdTable, ent
152d0 72 79 50 74 72 29 3b 0a 09 43 6f 6d 6d 61 6e 64 ryPtr);..Command
152e0 20 2a 63 6d 64 50 74 72 20 3d 20 28 43 6f 6d 6d *cmdPtr = (Comm
152f0 61 6e 64 20 2a 29 20 54 63 6c 5f 47 65 74 48 61 and *) Tcl_GetHa
15300 73 68 56 61 6c 75 65 28 65 6e 74 72 79 50 74 72 shValue(entryPtr
15310 29 3b 0a 0a 09 2f 2f 20 46 6f 72 20 6e 6f 6e 2d );...// For non-
15320 70 72 6f 63 65 64 75 72 65 73 2c 20 63 68 65 63 procedures, chec
15330 6b 20 69 66 20 74 68 69 73 20 69 73 20 61 6e 20 k if this is an
15340 69 6d 70 6f 72 74 20 6f 66 20 61 20 70 72 6f 63 import of a proc
15350 65 64 75 72 65 3b 20 74 68 6f 73 65 0a 09 2f 2f edure; those..//
15360 20 61 6c 73 6f 20 67 65 74 20 63 6f 70 69 65 64 also get copied
15370 2e 73 0a 09 69 66 20 28 21 54 63 6c 49 73 50 72 .s..if (!TclIsPr
15380 6f 63 28 63 6d 64 50 74 72 29 29 20 7b 0a 09 20 oc(cmdPtr)) {..
15390 20 20 20 43 6f 6d 6d 61 6e 64 20 2a 72 65 61 6c Command *real
153a0 43 6d 64 50 74 72 20 3d 20 28 43 6f 6d 6d 61 6e CmdPtr = (Comman
153b0 64 20 2a 29 0a 09 09 20 20 20 20 54 63 6c 47 65 d *)... TclGe
153c0 74 4f 72 69 67 69 6e 61 6c 43 6f 6d 6d 61 6e 64 tOriginalCommand
153d0 28 28 54 63 6c 5f 43 6f 6d 6d 61 6e 64 29 20 63 ((Tcl_Command) c
153e0 6d 64 50 74 72 29 3b 0a 09 20 20 20 20 69 66 20 mdPtr);.. if
153f0 28 21 72 65 61 6c 43 6d 64 50 74 72 20 7c 7c 20 (!realCmdPtr ||
15400 21 54 63 6c 49 73 50 72 6f 63 28 72 65 61 6c 43 !TclIsProc(realC
15410 6d 64 50 74 72 29 29 20 7b 0a 09 09 63 6f 6e 74 mdPtr)) {...cont
15420 69 6e 75 65 3b 0a 09 20 20 20 20 7d 0a 09 20 20 inue;.. }..
15430 20 20 63 6d 64 50 74 72 20 3d 20 72 65 61 6c 43 cmdPtr = realC
15440 6d 64 50 74 72 3b 0a 09 7d 0a 0a 09 2f 2f 20 4d mdPtr;..}...// M
15450 61 6b 65 20 74 68 65 20 63 6f 70 79 0a 09 50 72 ake the copy..Pr
15460 6f 63 20 2a 70 72 6f 63 50 74 72 20 3d 20 28 50 oc *procPtr = (P
15470 72 6f 63 20 2a 29 20 63 6d 64 50 74 72 2d 3e 6f roc *) cmdPtr->o
15480 62 6a 43 6c 69 65 6e 74 44 61 74 61 32 3b 0a 09 bjClientData2;..
15490 69 66 20 28 44 75 70 6c 69 63 61 74 65 50 72 6f if (DuplicatePro
154a0 63 28 69 6e 74 65 72 70 2c 20 74 67 74 4e 73 50 c(interp, tgtNsP
154b0 74 72 2c 20 63 6d 64 4e 61 6d 65 2c 20 70 72 6f tr, cmdName, pro
154c0 63 50 74 72 2c 20 63 6d 64 50 74 72 29 20 21 3d cPtr, cmdPtr) !=
154d0 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 20 20 20 20 TCL_OK) {..
154e0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
154f0 3b 0a 09 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72 ;..}. }. r
15500 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a eturn TCL_OK;.}.
15510 0c 0a 2f 2a 0a 20 2a 20 4c 6f 63 61 6c 20 56 61 ../*. * Local Va
15520 72 69 61 62 6c 65 73 3a 0a 20 2a 20 6d 6f 64 65 riables:. * mode
15530 3a 20 63 0a 20 2a 20 63 2d 62 61 73 69 63 2d 6f : c. * c-basic-o
15540 66 66 73 65 74 3a 20 34 0a 20 2a 20 66 69 6c 6c ffset: 4. * fill
15550 2d 63 6f 6c 75 6d 6e 3a 20 37 38 0a 20 2a 20 45 -column: 78. * E
15560 6e 64 3a 0a 20 2a 2f 0a nd:. */.