0000: 2f 2a 0a 20 2a 20 74 63 6c 4f 4f 44 65 66 69 6e /*. * tclOODefin
0010: 65 43 6d 64 73 2e 63 20 2d 2d 0a 20 2a 0a 20 2a eCmds.c --. *. *
0020: 09 54 68 69 73 20 66 69 6c 65 20 63 6f 6e 74 61 .This file conta
0030: 69 6e 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e ins the implemen
0040: 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 3a 3a tation of the ::
0050: 6f 6f 3a 3a 64 65 66 69 6e 65 20 63 6f 6d 6d 61 oo::define comma
0060: 6e 64 2c 0a 20 2a 09 70 61 72 74 20 6f 66 20 74 nd,. *.part of t
0070: 68 65 20 6f 62 6a 65 63 74 2d 73 79 73 74 65 6d he object-system
0080: 20 63 6f 72 65 20 28 4e 42 3a 20 6e 6f 74 20 54 core (NB: not T
0090: 63 6c 5f 4f 62 6a 2c 20 62 75 74 20 3a 3a 6f 6f cl_Obj, but ::oo
00a0: 29 2e 0a 20 2a 0a 20 2a 20 43 6f 70 79 72 69 67 ).. *. * Copyrig
00b0: 68 74 20 28 63 29 20 32 30 30 36 2d 32 30 31 33 ht (c) 2006-2013
00c0: 20 62 79 20 44 6f 6e 61 6c 20 4b 2e 20 46 65 6c by Donal K. Fel
00d0: 6c 6f 77 73 0a 20 2a 0a 20 2a 20 53 65 65 20 74 lows. *. * See t
00e0: 68 65 20 66 69 6c 65 20 22 6c 69 63 65 6e 73 65 he file "license
00f0: 2e 74 65 72 6d 73 22 20 66 6f 72 20 69 6e 66 6f .terms" for info
0100: 72 6d 61 74 69 6f 6e 20 6f 6e 20 75 73 61 67 65 rmation on usage
0110: 20 61 6e 64 20 72 65 64 69 73 74 72 69 62 75 74 and redistribut
0120: 69 6f 6e 20 6f 66 0a 20 2a 20 74 68 69 73 20 66 ion of. * this f
0130: 69 6c 65 2c 20 61 6e 64 20 66 6f 72 20 61 20 44 ile, and for a D
0140: 49 53 43 4c 41 49 4d 45 52 20 4f 46 20 41 4c 4c ISCLAIMER OF ALL
0150: 20 57 41 52 52 41 4e 54 49 45 53 2e 0a 20 2a 2f WARRANTIES.. */
0160: 0a 0a 23 69 66 64 65 66 20 48 41 56 45 5f 43 4f ..#ifdef HAVE_CO
0170: 4e 46 49 47 5f 48 0a 23 69 6e 63 6c 75 64 65 20 NFIG_H.#include
0180: 22 63 6f 6e 66 69 67 2e 68 22 0a 23 65 6e 64 69 "config.h".#endi
0190: 66 0a 23 69 6e 63 6c 75 64 65 20 22 74 63 6c 49 f.#include "tclI
01a0: 6e 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 22 nt.h".#include "
01b0: 74 63 6c 4f 4f 49 6e 74 2e 68 22 0a 0a 2f 2a 0a tclOOInt.h"../*.
01c0: 20 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 6c * The maximum l
01d0: 65 6e 67 74 68 20 6f 66 20 66 75 6c 6c 79 2d 71 ength of fully-q
01e0: 75 61 6c 69 66 69 65 64 20 6f 62 6a 65 63 74 20 ualified object
01f0: 6e 61 6d 65 20 74 6f 20 75 73 65 20 69 6e 20 61 name to use in a
0200: 6e 20 65 72 72 6f 72 69 6e 66 6f 0a 20 2a 20 6d n errorinfo. * m
0210: 65 73 73 61 67 65 2e 20 4c 6f 6e 67 65 72 20 74 essage. Longer t
0220: 68 61 6e 20 74 68 69 73 20 77 69 6c 6c 20 62 65 han this will be
0230: 20 63 75 72 74 61 69 6c 65 64 2e 0a 20 2a 2f 0a curtailed.. */.
0240: 0a 23 64 65 66 69 6e 65 20 4f 42 4a 4e 41 4d 45 .#define OBJNAME
0250: 5f 4c 45 4e 47 54 48 5f 49 4e 5f 45 52 52 4f 52 _LENGTH_IN_ERROR
0260: 49 4e 46 4f 5f 4c 49 4d 49 54 20 33 30 0a 0a 2f INFO_LIMIT 30../
0270: 2a 0a 20 2a 20 53 6f 6d 65 20 74 68 69 6e 67 73 *. * Some things
0280: 20 74 68 61 74 20 6d 61 6b 65 20 69 74 20 65 61 that make it ea
0290: 73 69 65 72 20 74 6f 20 64 65 63 6c 61 72 65 20 sier to declare
02a0: 61 20 73 6c 6f 74 2e 0a 20 2a 2f 0a 0a 73 74 72 a slot.. */..str
02b0: 75 63 74 20 44 65 63 6c 61 72 65 64 53 6c 6f 74 uct DeclaredSlot
02c0: 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 {. const cha
02d0: 72 20 2a 6e 61 6d 65 3b 0a 20 20 20 20 63 6f 6e r *name;. con
02e0: 73 74 20 54 63 6c 5f 4d 65 74 68 6f 64 54 79 70 st Tcl_MethodTyp
02f0: 65 20 67 65 74 74 65 72 54 79 70 65 3b 0a 20 20 e getterType;.
0300: 20 20 63 6f 6e 73 74 20 54 63 6c 5f 4d 65 74 68 const Tcl_Meth
0310: 6f 64 54 79 70 65 20 73 65 74 74 65 72 54 79 70 odType setterTyp
0320: 65 3b 0a 7d 3b 0a 0a 23 64 65 66 69 6e 65 20 53 e;.};..#define S
0330: 4c 4f 54 28 6e 61 6d 65 2c 67 65 74 74 65 72 2c LOT(name,getter,
0340: 73 65 74 74 65 72 29 09 09 09 09 09 5c 0a 20 20 setter).....\.
0350: 20 20 7b 22 3a 3a 6f 6f 3a 3a 22 20 6e 61 6d 65 {"::oo::" name
0360: 2c 09 09 09 09 09 09 09 5c 0a 09 20 20 20 20 7b ,.......\.. {
0370: 54 43 4c 5f 4f 4f 5f 4d 45 54 48 4f 44 5f 56 45 TCL_OO_METHOD_VE
0380: 52 53 49 4f 4e 5f 43 55 52 52 45 4e 54 2c 20 22 RSION_CURRENT, "
0390: 63 6f 72 65 20 6d 65 74 68 6f 64 3a 20 22 20 6e core method: " n
03a0: 61 6d 65 20 22 20 47 65 74 74 65 72 22 2c 20 5c ame " Getter", \
03b0: 0a 09 09 20 20 20 20 67 65 74 74 65 72 2c 20 4e ... getter, N
03c0: 55 4c 4c 2c 20 4e 55 4c 4c 7d 2c 09 09 09 09 5c ULL, NULL},....\
03d0: 0a 09 20 20 20 20 7b 54 43 4c 5f 4f 4f 5f 4d 45 .. {TCL_OO_ME
03e0: 54 48 4f 44 5f 56 45 52 53 49 4f 4e 5f 43 55 52 THOD_VERSION_CUR
03f0: 52 45 4e 54 2c 20 22 63 6f 72 65 20 6d 65 74 68 RENT, "core meth
0400: 6f 64 3a 20 22 20 6e 61 6d 65 20 22 20 53 65 74 od: " name " Set
0410: 74 65 72 22 2c 20 5c 0a 09 09 20 20 20 20 73 65 ter", \... se
0420: 74 74 65 72 2c 20 4e 55 4c 4c 2c 20 4e 55 4c 4c tter, NULL, NULL
0430: 7d 7d 0a 0a 2f 2a 0a 20 2a 20 46 6f 72 77 61 72 }}../*. * Forwar
0440: 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 73 2e 0a d declarations..
0450: 20 2a 2f 0a 0a 73 74 61 74 69 63 20 69 6e 6c 69 */..static inli
0460: 6e 65 20 76 6f 69 64 09 42 75 6d 70 47 6c 6f 62 ne void.BumpGlob
0470: 61 6c 45 70 6f 63 68 28 54 63 6c 5f 49 6e 74 65 alEpoch(Tcl_Inte
0480: 72 70 20 2a 69 6e 74 65 72 70 2c 20 43 6c 61 73 rp *interp, Clas
0490: 73 20 2a 63 6c 61 73 73 50 74 72 29 3b 0a 73 74 s *classPtr);.st
04a0: 61 74 69 63 20 54 63 6c 5f 43 6f 6d 6d 61 6e 64 atic Tcl_Command
04b0: 09 46 69 6e 64 43 6f 6d 6d 61 6e 64 28 54 63 6c .FindCommand(Tcl
04c0: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c _Interp *interp,
04d0: 20 54 63 6c 5f 4f 62 6a 20 2a 73 74 72 69 6e 67 Tcl_Obj *string
04e0: 4f 62 6a 2c 0a 09 09 09 20 20 20 20 54 63 6c 5f Obj,.... Tcl_
04f0: 4e 61 6d 65 73 70 61 63 65 20 2a 63 6f 6e 73 74 Namespace *const
0500: 20 6e 61 6d 65 73 70 61 63 65 50 74 72 29 3b 0a namespacePtr);.
0510: 73 74 61 74 69 63 20 76 6f 69 64 09 09 47 65 6e static void..Gen
0520: 65 72 61 74 65 45 72 72 6f 72 49 6e 66 6f 28 54 erateErrorInfo(T
0530: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 cl_Interp *inter
0540: 70 2c 20 4f 62 6a 65 63 74 20 2a 6f 50 74 72 2c p, Object *oPtr,
0550: 0a 09 09 09 20 20 20 20 54 63 6c 5f 4f 62 6a 20 .... Tcl_Obj
0560: 2a 73 61 76 65 64 4e 61 6d 65 4f 62 6a 2c 20 63 *savedNameObj, c
0570: 6f 6e 73 74 20 63 68 61 72 20 2a 74 79 70 65 4f onst char *typeO
0580: 66 53 75 62 6a 65 63 74 29 3b 0a 73 74 61 74 69 fSubject);.stati
0590: 63 20 69 6e 6c 69 6e 65 20 43 6c 61 73 73 20 2a c inline Class *
05a0: 09 47 65 74 43 6c 61 73 73 49 6e 4f 75 74 65 72 .GetClassInOuter
05b0: 43 6f 6e 74 65 78 74 28 54 63 6c 5f 49 6e 74 65 Context(Tcl_Inte
05c0: 72 70 20 2a 69 6e 74 65 72 70 2c 0a 09 09 09 20 rp *interp,....
05d0: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6c 61 73 Tcl_Obj *clas
05e0: 73 4e 61 6d 65 2c 20 63 6f 6e 73 74 20 63 68 61 sName, const cha
05f0: 72 20 2a 65 72 72 4d 73 67 29 3b 0a 73 74 61 74 r *errMsg);.stat
0600: 69 63 20 69 6e 6c 69 6e 65 20 69 6e 74 09 49 6e ic inline int.In
0610: 69 74 44 65 66 69 6e 65 43 6f 6e 74 65 78 74 28 itDefineContext(
0620: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 Tcl_Interp *inte
0630: 72 70 2c 0a 09 09 09 20 20 20 20 54 63 6c 5f 4e rp,.... Tcl_N
0640: 61 6d 65 73 70 61 63 65 20 2a 6e 61 6d 65 73 70 amespace *namesp
0650: 61 63 65 50 74 72 2c 20 4f 62 6a 65 63 74 20 2a acePtr, Object *
0660: 6f 50 74 72 2c 0a 09 09 09 20 20 20 20 69 6e 74 oPtr,.... int
0670: 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a objc, Tcl_Obj *
0680: 63 6f 6e 73 74 20 6f 62 6a 76 5b 5d 29 3b 0a 73 const objv[]);.s
0690: 74 61 74 69 63 20 69 6e 6c 69 6e 65 20 76 6f 69 tatic inline voi
06a0: 64 09 52 65 63 6f 6d 70 75 74 65 43 6c 61 73 73 d.RecomputeClass
06b0: 43 61 63 68 65 46 6c 61 67 28 4f 62 6a 65 63 74 CacheFlag(Object
06c0: 20 2a 6f 50 74 72 29 3b 0a 73 74 61 74 69 63 20 *oPtr);.static
06d0: 69 6e 74 09 09 52 65 6e 61 6d 65 44 65 6c 65 74 int..RenameDelet
06e0: 65 4d 65 74 68 6f 64 28 54 63 6c 5f 49 6e 74 65 eMethod(Tcl_Inte
06f0: 72 70 20 2a 69 6e 74 65 72 70 2c 20 4f 62 6a 65 rp *interp, Obje
0700: 63 74 20 2a 6f 50 74 72 2c 0a 09 09 09 20 20 20 ct *oPtr,....
0710: 20 69 6e 74 20 75 73 65 43 6c 61 73 73 2c 20 54 int useClass, T
0720: 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 66 72 cl_Obj *const fr
0730: 6f 6d 50 74 72 2c 0a 09 09 09 20 20 20 20 54 63 omPtr,.... Tc
0740: 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 74 6f 50 l_Obj *const toP
0750: 74 72 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 09 tr);.static int.
0760: 09 43 6c 61 73 73 46 69 6c 74 65 72 47 65 74 28 .ClassFilterGet(
0770: 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e ClientData clien
0780: 74 44 61 74 61 2c 0a 09 09 09 20 20 20 20 54 63 tData,.... Tc
0790: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 l_Interp *interp
07a0: 2c 20 54 63 6c 5f 4f 62 6a 65 63 74 43 6f 6e 74 , Tcl_ObjectCont
07b0: 65 78 74 20 63 6f 6e 74 65 78 74 2c 0a 09 09 09 ext context,....
07c0: 20 20 20 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 int objc, Tc
07d0: 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 2a 6f 62 l_Obj *const *ob
07e0: 6a 76 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 09 jv);.static int.
07f0: 09 43 6c 61 73 73 46 69 6c 74 65 72 53 65 74 28 .ClassFilterSet(
0800: 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e ClientData clien
0810: 74 44 61 74 61 2c 0a 09 09 09 20 20 20 20 54 63 tData,.... Tc
0820: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 l_Interp *interp
0830: 2c 20 54 63 6c 5f 4f 62 6a 65 63 74 43 6f 6e 74 , Tcl_ObjectCont
0840: 65 78 74 20 63 6f 6e 74 65 78 74 2c 0a 09 09 09 ext context,....
0850: 20 20 20 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 int objc, Tc
0860: 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 2a 6f 62 l_Obj *const *ob
0870: 6a 76 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 09 jv);.static int.
0880: 09 43 6c 61 73 73 4d 69 78 69 6e 47 65 74 28 43 .ClassMixinGet(C
0890: 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 lientData client
08a0: 44 61 74 61 2c 0a 09 09 09 20 20 20 20 54 63 6c Data,.... Tcl
08b0: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c _Interp *interp,
08c0: 20 54 63 6c 5f 4f 62 6a 65 63 74 43 6f 6e 74 65 Tcl_ObjectConte
08d0: 78 74 20 63 6f 6e 74 65 78 74 2c 0a 09 09 09 20 xt context,....
08e0: 20 20 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c int objc, Tcl
08f0: 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 2a 6f 62 6a _Obj *const *obj
0900: 76 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 09 09 v);.static int..
0910: 43 6c 61 73 73 4d 69 78 69 6e 53 65 74 28 43 6c ClassMixinSet(Cl
0920: 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 ientData clientD
0930: 61 74 61 2c 0a 09 09 09 20 20 20 20 54 63 6c 5f ata,.... Tcl_
0940: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 Interp *interp,
0950: 54 63 6c 5f 4f 62 6a 65 63 74 43 6f 6e 74 65 78 Tcl_ObjectContex
0960: 74 20 63 6f 6e 74 65 78 74 2c 0a 09 09 09 20 20 t context,....
0970: 20 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f int objc, Tcl_
0980: 4f 62 6a 20 2a 63 6f 6e 73 74 20 2a 6f 62 6a 76 Obj *const *objv
0990: 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 09 09 43 );.static int..C
09a0: 6c 61 73 73 53 75 70 65 72 47 65 74 28 43 6c 69 lassSuperGet(Cli
09b0: 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 entData clientDa
09c0: 74 61 2c 0a 09 09 09 20 20 20 20 54 63 6c 5f 49 ta,.... Tcl_I
09d0: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 54 nterp *interp, T
09e0: 63 6c 5f 4f 62 6a 65 63 74 43 6f 6e 74 65 78 74 cl_ObjectContext
09f0: 20 63 6f 6e 74 65 78 74 2c 0a 09 09 09 20 20 20 context,....
0a00: 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f int objc, Tcl_O
0a10: 62 6a 20 2a 63 6f 6e 73 74 20 2a 6f 62 6a 76 29 bj *const *objv)
0a20: 3b 0a 73 74 61 74 69 63 20 69 6e 74 09 09 43 6c ;.static int..Cl
0a30: 61 73 73 53 75 70 65 72 53 65 74 28 43 6c 69 65 assSuperSet(Clie
0a40: 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 ntData clientDat
0a50: 61 2c 0a 09 09 09 20 20 20 20 54 63 6c 5f 49 6e a,.... Tcl_In
0a60: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 54 63 terp *interp, Tc
0a70: 6c 5f 4f 62 6a 65 63 74 43 6f 6e 74 65 78 74 20 l_ObjectContext
0a80: 63 6f 6e 74 65 78 74 2c 0a 09 09 09 20 20 20 20 context,....
0a90: 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 int objc, Tcl_Ob
0aa0: 6a 20 2a 63 6f 6e 73 74 20 2a 6f 62 6a 76 29 3b j *const *objv);
0ab0: 0a 73 74 61 74 69 63 20 69 6e 74 09 09 43 6c 61 .static int..Cla
0ac0: 73 73 56 61 72 73 47 65 74 28 43 6c 69 65 6e 74 ssVarsGet(Client
0ad0: 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c Data clientData,
0ae0: 0a 09 09 09 20 20 20 20 54 63 6c 5f 49 6e 74 65 .... Tcl_Inte
0af0: 72 70 20 2a 69 6e 74 65 72 70 2c 20 54 63 6c 5f rp *interp, Tcl_
0b00: 4f 62 6a 65 63 74 43 6f 6e 74 65 78 74 20 63 6f ObjectContext co
0b10: 6e 74 65 78 74 2c 0a 09 09 09 20 20 20 20 69 6e ntext,.... in
0b20: 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 t objc, Tcl_Obj
0b30: 2a 63 6f 6e 73 74 20 2a 6f 62 6a 76 29 3b 0a 73 *const *objv);.s
0b40: 74 61 74 69 63 20 69 6e 74 09 09 43 6c 61 73 73 tatic int..Class
0b50: 56 61 72 73 53 65 74 28 43 6c 69 65 6e 74 44 61 VarsSet(ClientDa
0b60: 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 09 ta clientData,..
0b70: 09 09 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 .. Tcl_Interp
0b80: 20 2a 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4f 62 *interp, Tcl_Ob
0b90: 6a 65 63 74 43 6f 6e 74 65 78 74 20 63 6f 6e 74 jectContext cont
0ba0: 65 78 74 2c 0a 09 09 09 20 20 20 20 69 6e 74 20 ext,.... int
0bb0: 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 objc, Tcl_Obj *c
0bc0: 6f 6e 73 74 20 2a 6f 62 6a 76 29 3b 0a 73 74 61 onst *objv);.sta
0bd0: 74 69 63 20 69 6e 74 09 09 4f 62 6a 46 69 6c 74 tic int..ObjFilt
0be0: 65 72 47 65 74 28 43 6c 69 65 6e 74 44 61 74 61 erGet(ClientData
0bf0: 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 09 09 09 clientData,....
0c00: 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a Tcl_Interp *
0c10: 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4f 62 6a 65 interp, Tcl_Obje
0c20: 63 74 43 6f 6e 74 65 78 74 20 63 6f 6e 74 65 78 ctContext contex
0c30: 74 2c 0a 09 09 09 20 20 20 20 69 6e 74 20 6f 62 t,.... int ob
0c40: 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e jc, Tcl_Obj *con
0c50: 73 74 20 2a 6f 62 6a 76 29 3b 0a 73 74 61 74 69 st *objv);.stati
0c60: 63 20 69 6e 74 09 09 4f 62 6a 46 69 6c 74 65 72 c int..ObjFilter
0c70: 53 65 74 28 43 6c 69 65 6e 74 44 61 74 61 20 63 Set(ClientData c
0c80: 6c 69 65 6e 74 44 61 74 61 2c 0a 09 09 09 20 20 lientData,....
0c90: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e Tcl_Interp *in
0ca0: 74 65 72 70 2c 20 54 63 6c 5f 4f 62 6a 65 63 74 terp, Tcl_Object
0cb0: 43 6f 6e 74 65 78 74 20 63 6f 6e 74 65 78 74 2c Context context,
0cc0: 0a 09 09 09 20 20 20 20 69 6e 74 20 6f 62 6a 63 .... int objc
0cd0: 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 , Tcl_Obj *const
0ce0: 20 2a 6f 62 6a 76 29 3b 0a 73 74 61 74 69 63 20 *objv);.static
0cf0: 69 6e 74 09 09 4f 62 6a 4d 69 78 69 6e 47 65 74 int..ObjMixinGet
0d00: 28 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 (ClientData clie
0d10: 6e 74 44 61 74 61 2c 0a 09 09 09 20 20 20 20 54 ntData,.... T
0d20: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 cl_Interp *inter
0d30: 70 2c 20 54 63 6c 5f 4f 62 6a 65 63 74 43 6f 6e p, Tcl_ObjectCon
0d40: 74 65 78 74 20 63 6f 6e 74 65 78 74 2c 0a 09 09 text context,...
0d50: 09 20 20 20 20 69 6e 74 20 6f 62 6a 63 2c 20 54 . int objc, T
0d60: 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 2a 6f cl_Obj *const *o
0d70: 62 6a 76 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 bjv);.static int
0d80: 09 09 4f 62 6a 4d 69 78 69 6e 53 65 74 28 43 6c ..ObjMixinSet(Cl
0d90: 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 ientData clientD
0da0: 61 74 61 2c 0a 09 09 09 20 20 20 20 54 63 6c 5f ata,.... Tcl_
0db0: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 20 Interp *interp,
0dc0: 54 63 6c 5f 4f 62 6a 65 63 74 43 6f 6e 74 65 78 Tcl_ObjectContex
0dd0: 74 20 63 6f 6e 74 65 78 74 2c 0a 09 09 09 20 20 t context,....
0de0: 20 20 69 6e 74 20 6f 62 6a 63 2c 20 54 63 6c 5f int objc, Tcl_
0df0: 4f 62 6a 20 2a 63 6f 6e 73 74 20 2a 6f 62 6a 76 Obj *const *objv
0e00: 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 09 09 4f );.static int..O
0e10: 62 6a 56 61 72 73 47 65 74 28 43 6c 69 65 6e 74 bjVarsGet(Client
0e20: 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c Data clientData,
0e30: 0a 09 09 09 20 20 20 20 54 63 6c 5f 49 6e 74 65 .... Tcl_Inte
0e40: 72 70 20 2a 69 6e 74 65 72 70 2c 20 54 63 6c 5f rp *interp, Tcl_
0e50: 4f 62 6a 65 63 74 43 6f 6e 74 65 78 74 20 63 6f ObjectContext co
0e60: 6e 74 65 78 74 2c 0a 09 09 09 20 20 20 20 69 6e ntext,.... in
0e70: 74 20 6f 62 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 t objc, Tcl_Obj
0e80: 2a 63 6f 6e 73 74 20 2a 6f 62 6a 76 29 3b 0a 73 *const *objv);.s
0e90: 74 61 74 69 63 20 69 6e 74 09 09 4f 62 6a 56 61 tatic int..ObjVa
0ea0: 72 73 53 65 74 28 43 6c 69 65 6e 74 44 61 74 61 rsSet(ClientData
0eb0: 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 09 09 09 clientData,....
0ec0: 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a Tcl_Interp *
0ed0: 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4f 62 6a 65 interp, Tcl_Obje
0ee0: 63 74 43 6f 6e 74 65 78 74 20 63 6f 6e 74 65 78 ctContext contex
0ef0: 74 2c 0a 09 09 09 20 20 20 20 69 6e 74 20 6f 62 t,.... int ob
0f00: 6a 63 2c 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e jc, Tcl_Obj *con
0f10: 73 74 20 2a 6f 62 6a 76 29 3b 0a 0a 2f 2a 0a 20 st *objv);../*.
0f20: 2a 20 4e 6f 77 20 64 65 66 69 6e 65 20 74 68 65 * Now define the
0f30: 20 73 6c 6f 74 73 20 75 73 65 64 20 69 6e 20 64 slots used in d
0f40: 65 63 6c 61 72 61 74 69 6f 6e 73 2e 0a 20 2a 2f eclarations.. */
0f50: 0a 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 ..static const s
0f60: 74 72 75 63 74 20 44 65 63 6c 61 72 65 64 53 6c truct DeclaredSl
0f70: 6f 74 20 73 6c 6f 74 73 5b 5d 20 3d 20 7b 0a 20 ot slots[] = {.
0f80: 20 20 20 53 4c 4f 54 28 22 64 65 66 69 6e 65 3a SLOT("define:
0f90: 3a 66 69 6c 74 65 72 22 2c 20 20 20 20 20 20 43 :filter", C
0fa0: 6c 61 73 73 46 69 6c 74 65 72 47 65 74 2c 20 43 lassFilterGet, C
0fb0: 6c 61 73 73 46 69 6c 74 65 72 53 65 74 29 2c 0a lassFilterSet),.
0fc0: 20 20 20 20 53 4c 4f 54 28 22 64 65 66 69 6e 65 SLOT("define
0fd0: 3a 3a 6d 69 78 69 6e 22 2c 20 20 20 20 20 20 20 ::mixin",
0fe0: 43 6c 61 73 73 4d 69 78 69 6e 47 65 74 2c 20 20 ClassMixinGet,
0ff0: 43 6c 61 73 73 4d 69 78 69 6e 53 65 74 29 2c 0a ClassMixinSet),.
1000: 20 20 20 20 53 4c 4f 54 28 22 64 65 66 69 6e 65 SLOT("define
1010: 3a 3a 73 75 70 65 72 63 6c 61 73 73 22 2c 20 20 ::superclass",
1020: 43 6c 61 73 73 53 75 70 65 72 47 65 74 2c 20 20 ClassSuperGet,
1030: 43 6c 61 73 73 53 75 70 65 72 53 65 74 29 2c 0a ClassSuperSet),.
1040: 20 20 20 20 53 4c 4f 54 28 22 64 65 66 69 6e 65 SLOT("define
1050: 3a 3a 76 61 72 69 61 62 6c 65 22 2c 20 20 20 20 ::variable",
1060: 43 6c 61 73 73 56 61 72 73 47 65 74 2c 20 20 20 ClassVarsGet,
1070: 43 6c 61 73 73 56 61 72 73 53 65 74 29 2c 0a 20 ClassVarsSet),.
1080: 20 20 20 53 4c 4f 54 28 22 6f 62 6a 64 65 66 69 SLOT("objdefi
1090: 6e 65 3a 3a 66 69 6c 74 65 72 22 2c 20 20 20 4f ne::filter", O
10a0: 62 6a 46 69 6c 74 65 72 47 65 74 2c 20 20 20 4f bjFilterGet, O
10b0: 62 6a 46 69 6c 74 65 72 53 65 74 29 2c 0a 20 20 bjFilterSet),.
10c0: 20 20 53 4c 4f 54 28 22 6f 62 6a 64 65 66 69 6e SLOT("objdefin
10d0: 65 3a 3a 6d 69 78 69 6e 22 2c 20 20 20 20 4f 62 e::mixin", Ob
10e0: 6a 4d 69 78 69 6e 47 65 74 2c 20 20 20 20 4f 62 jMixinGet, Ob
10f0: 6a 4d 69 78 69 6e 53 65 74 29 2c 0a 20 20 20 20 jMixinSet),.
1100: 53 4c 4f 54 28 22 6f 62 6a 64 65 66 69 6e 65 3a SLOT("objdefine:
1110: 3a 76 61 72 69 61 62 6c 65 22 2c 20 4f 62 6a 56 :variable", ObjV
1120: 61 72 73 47 65 74 2c 20 20 20 20 20 4f 62 6a 56 arsGet, ObjV
1130: 61 72 73 53 65 74 29 2c 0a 20 20 20 20 7b 4e 55 arsSet),. {NU
1140: 4c 4c 2c 20 7b 30 2c 20 30 2c 20 30 2c 20 30 2c LL, {0, 0, 0, 0,
1150: 20 30 7d 2c 20 7b 30 2c 20 30 2c 20 30 2c 20 30 0}, {0, 0, 0, 0
1160: 2c 20 30 7d 7d 0a 7d 3b 0a 0c 0a 2f 2a 0a 20 2a , 0}}.};.../*. *
1170: 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ---------------
1180: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1190: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11b0: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 42 75 -------. *. * Bu
11c0: 6d 70 47 6c 6f 62 61 6c 45 70 6f 63 68 20 2d 2d mpGlobalEpoch --
11d0: 0a 20 2a 09 55 74 69 6c 69 74 79 20 74 68 61 74 . *.Utility that
11e0: 20 65 6e 73 75 72 65 73 20 74 68 61 74 20 63 61 ensures that ca
11f0: 6c 6c 20 63 68 61 69 6e 73 20 74 68 61 74 20 61 ll chains that a
1200: 72 65 20 69 6e 76 61 6c 69 64 20 77 69 6c 6c 20 re invalid will
1210: 67 65 74 20 74 68 72 6f 77 6e 0a 20 2a 09 61 77 get thrown. *.aw
1220: 61 79 20 61 74 20 61 6e 20 61 70 70 72 6f 70 72 ay at an appropr
1230: 69 61 74 65 20 74 69 6d 65 2e 20 4e 6f 74 65 20 iate time. Note
1240: 74 68 61 74 20 65 78 61 63 74 6c 79 20 77 68 69 that exactly whi
1250: 63 68 20 65 70 6f 63 68 20 67 65 74 73 0a 20 2a ch epoch gets. *
1260: 09 61 64 76 61 6e 63 65 64 20 77 69 6c 6c 20 64 .advanced will d
1270: 65 70 65 6e 64 20 6f 6e 20 65 78 61 63 74 6c 79 epend on exactly
1280: 20 77 68 61 74 20 74 68 65 20 63 6c 61 73 73 20 what the class
1290: 69 73 20 74 61 6e 67 6c 65 64 20 75 70 20 69 6e is tangled up in
12a0: 3b 20 69 6e 0a 20 2a 09 74 68 65 20 77 6f 72 73 ; in. *.the wors
12b0: 74 20 63 61 73 65 2c 20 74 68 65 20 73 69 6d 70 t case, the simp
12c0: 6c 65 73 74 20 6f 70 74 69 6f 6e 20 69 73 20 74 lest option is t
12d0: 6f 20 61 64 76 61 6e 63 65 20 74 68 65 20 67 6c o advance the gl
12e0: 6f 62 61 6c 20 65 70 6f 63 68 2c 0a 20 2a 09 63 obal epoch,. *.c
12f0: 61 75 73 69 6e 67 20 2a 65 76 65 72 79 74 68 69 ausing *everythi
1300: 6e 67 2a 20 74 6f 20 62 65 20 74 68 72 6f 77 6e ng* to be thrown
1310: 20 61 77 61 79 20 6f 6e 20 6e 65 78 74 20 75 73 away on next us
1320: 61 67 65 2e 0a 20 2a 0a 20 2a 20 2d 2d 2d 2d 2d age.. *. * -----
1330: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1340: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1350: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1360: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1370: 2d 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20 69 6e -. */..static in
1380: 6c 69 6e 65 20 76 6f 69 64 0a 42 75 6d 70 47 6c line void.BumpGl
1390: 6f 62 61 6c 45 70 6f 63 68 28 0a 20 20 20 20 54 obalEpoch(. T
13a0: 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 cl_Interp *inter
13b0: 70 2c 0a 20 20 20 20 43 6c 61 73 73 20 2a 63 6c p,. Class *cl
13c0: 61 73 73 50 74 72 29 0a 7b 0a 20 20 20 20 69 66 assPtr).{. if
13d0: 20 28 63 6c 61 73 73 50 74 72 20 21 3d 20 4e 55 (classPtr != NU
13e0: 4c 4c 0a 09 20 20 20 20 26 26 20 63 6c 61 73 73 LL.. && class
13f0: 50 74 72 2d 3e 73 75 62 63 6c 61 73 73 65 73 2e Ptr->subclasses.
1400: 6e 75 6d 20 3d 3d 20 30 0a 09 20 20 20 20 26 26 num == 0.. &&
1410: 20 63 6c 61 73 73 50 74 72 2d 3e 69 6e 73 74 61 classPtr->insta
1420: 6e 63 65 73 2e 6e 75 6d 20 3d 3d 20 30 0a 09 20 nces.num == 0..
1430: 20 20 20 26 26 20 63 6c 61 73 73 50 74 72 2d 3e && classPtr->
1440: 6d 69 78 69 6e 53 75 62 73 2e 6e 75 6d 20 3d 3d mixinSubs.num ==
1450: 20 30 29 20 7b 0a 09 2f 2a 0a 09 20 2a 20 49 66 0) {../*.. * If
1460: 20 61 20 63 6c 61 73 73 20 68 61 73 20 6e 6f 20 a class has no
1470: 73 75 62 63 6c 61 73 73 65 73 20 6f 72 20 69 6e subclasses or in
1480: 73 74 61 6e 63 65 73 2c 20 61 6e 64 20 69 73 20 stances, and is
1490: 6e 6f 74 20 6d 69 78 65 64 20 69 6e 74 6f 0a 09 not mixed into..
14a0: 20 2a 20 61 6e 79 74 68 69 6e 67 2c 20 61 20 63 * anything, a c
14b0: 68 61 6e 67 65 20 74 6f 20 69 74 73 20 73 74 72 hange to its str
14c0: 75 63 74 75 72 65 20 64 6f 65 73 20 6e 6f 74 20 ucture does not
14d0: 72 65 71 75 69 72 65 20 75 73 20 74 6f 0a 09 20 require us to..
14e0: 2a 20 69 6e 76 61 6c 69 64 61 74 65 20 61 6e 79 * invalidate any
14f0: 20 63 61 6c 6c 20 63 68 61 69 6e 73 2e 20 4e 6f call chains. No
1500: 74 65 20 74 68 61 74 20 77 65 20 73 74 69 6c 6c te that we still
1510: 20 62 75 6d 70 20 6f 75 72 20 6f 62 6a 65 63 74 bump our object
1520: 27 73 0a 09 20 2a 20 65 70 6f 63 68 20 69 66 20 's.. * epoch if
1530: 69 74 20 68 61 73 20 61 6e 79 20 6d 69 78 69 6e it has any mixin
1540: 73 3b 20 74 68 65 20 72 65 6c 61 74 69 6f 6e 20 s; the relation
1550: 62 65 74 77 65 65 6e 20 61 20 63 6c 61 73 73 20 between a class
1560: 61 6e 64 20 69 74 73 0a 09 20 2a 20 72 65 70 72 and its.. * repr
1570: 65 73 65 6e 74 61 74 69 76 65 20 6f 62 6a 65 63 esentative objec
1580: 74 20 69 73 20 73 70 65 63 69 61 6c 2e 20 42 75 t is special. Bu
1590: 74 20 69 74 20 77 6f 6e 27 74 20 68 75 72 74 2e t it won't hurt.
15a0: 0a 09 20 2a 2f 0a 0a 09 69 66 20 28 63 6c 61 73 .. */...if (clas
15b0: 73 50 74 72 2d 3e 74 68 69 73 50 74 72 2d 3e 6d sPtr->thisPtr->m
15c0: 69 78 69 6e 73 2e 6e 75 6d 20 3e 20 30 29 20 7b ixins.num > 0) {
15d0: 0a 09 20 20 20 20 63 6c 61 73 73 50 74 72 2d 3e .. classPtr->
15e0: 74 68 69 73 50 74 72 2d 3e 65 70 6f 63 68 2b 2b thisPtr->epoch++
15f0: 3b 0a 09 7d 0a 09 72 65 74 75 72 6e 3b 0a 20 20 ;..}..return;.
1600: 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 }.. /*.
1610: 20 2a 20 45 69 74 68 65 72 20 74 68 65 72 65 27 * Either there'
1620: 73 20 6e 6f 20 63 6c 61 73 73 20 28 3f 21 29 20 s no class (?!)
1630: 6f 72 20 77 65 27 72 65 20 72 65 63 6f 6e 66 69 or we're reconfi
1640: 67 75 72 69 6e 67 20 73 6f 6d 65 74 68 69 6e 67 guring something
1650: 20 74 68 61 74 20 69 73 0a 20 20 20 20 20 2a 20 that is. *
1660: 69 6e 20 75 73 65 2e 20 46 6f 72 63 65 20 72 65 in use. Force re
1670: 67 65 6e 65 72 61 74 69 6f 6e 20 6f 66 20 63 61 generation of ca
1680: 6c 6c 20 63 68 61 69 6e 73 2e 0a 20 20 20 20 20 ll chains..
1690: 2a 2f 0a 0a 20 20 20 20 54 63 6c 4f 4f 47 65 74 */.. TclOOGet
16a0: 46 6f 75 6e 64 61 74 69 6f 6e 28 69 6e 74 65 72 Foundation(inter
16b0: 70 29 2d 3e 65 70 6f 63 68 2b 2b 3b 0a 7d 0a 0c p)->epoch++;.}..
16c0: 0a 2f 2a 0a 20 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d ./*. * ---------
16d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
16f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1700: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
1710: 0a 20 2a 20 52 65 63 6f 6d 70 75 74 65 43 6c 61 . * RecomputeCla
1720: 73 73 43 61 63 68 65 46 6c 61 67 20 2d 2d 0a 20 ssCacheFlag --.
1730: 2a 09 44 65 74 65 72 6d 69 6e 65 20 77 68 65 74 *.Determine whet
1740: 68 65 72 20 74 68 65 20 6f 62 6a 65 63 74 20 69 her the object i
1750: 73 20 70 72 6f 74 6f 74 79 70 69 63 61 6c 20 6f s prototypical o
1760: 66 20 69 74 73 20 63 6c 61 73 73 2c 20 61 6e 64 f its class, and
1770: 20 68 65 6e 63 65 0a 20 2a 09 61 62 6c 65 20 74 hence. *.able t
1780: 6f 20 75 73 65 20 74 68 65 20 63 6c 61 73 73 27 o use the class'
1790: 73 20 6d 65 74 68 6f 64 20 63 68 61 69 6e 20 63 s method chain c
17a0: 61 63 68 65 2e 0a 20 2a 0a 20 2a 20 2d 2d 2d 2d ache.. *. * ----
17b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
17c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
17d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
17e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
17f0: 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20 69 --. */..static i
1800: 6e 6c 69 6e 65 20 76 6f 69 64 0a 52 65 63 6f 6d nline void.Recom
1810: 70 75 74 65 43 6c 61 73 73 43 61 63 68 65 46 6c puteClassCacheFl
1820: 61 67 28 0a 20 20 20 20 4f 62 6a 65 63 74 20 2a ag(. Object *
1830: 6f 50 74 72 29 0a 7b 0a 20 20 20 20 69 66 20 28 oPtr).{. if (
1840: 28 6f 50 74 72 2d 3e 6d 65 74 68 6f 64 73 50 74 (oPtr->methodsPt
1850: 72 20 3d 3d 20 4e 55 4c 4c 20 7c 7c 20 6f 50 74 r == NULL || oPt
1860: 72 2d 3e 6d 65 74 68 6f 64 73 50 74 72 2d 3e 6e r->methodsPtr->n
1870: 75 6d 45 6e 74 72 69 65 73 20 3d 3d 20 30 29 0a umEntries == 0).
1880: 09 20 20 20 20 26 26 20 28 6f 50 74 72 2d 3e 6d . && (oPtr->m
1890: 69 78 69 6e 73 2e 6e 75 6d 20 3d 3d 20 30 29 20 ixins.num == 0)
18a0: 26 26 20 28 6f 50 74 72 2d 3e 66 69 6c 74 65 72 && (oPtr->filter
18b0: 73 2e 6e 75 6d 20 3d 3d 20 30 29 29 20 7b 0a 09 s.num == 0)) {..
18c0: 6f 50 74 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 55 oPtr->flags |= U
18d0: 53 45 5f 43 4c 41 53 53 5f 43 41 43 48 45 3b 0a SE_CLASS_CACHE;.
18e0: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 6f 50 } else {..oP
18f0: 74 72 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 55 53 tr->flags &= ~US
1900: 45 5f 43 4c 41 53 53 5f 43 41 43 48 45 3b 0a 20 E_CLASS_CACHE;.
1910: 20 20 20 7d 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 20 2d }.}.../*. * -
1920: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1930: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1940: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1950: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1960: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 63 6c 4f -----. *. * TclO
1970: 4f 4f 62 6a 65 63 74 53 65 74 46 69 6c 74 65 72 OObjectSetFilter
1980: 73 20 2d 2d 0a 20 2a 09 49 6e 73 74 61 6c 6c 20 s --. *.Install
1990: 61 20 6c 69 73 74 20 6f 66 20 66 69 6c 74 65 72 a list of filter
19a0: 20 6d 65 74 68 6f 64 20 6e 61 6d 65 73 20 69 6e method names in
19b0: 74 6f 20 61 6e 20 6f 62 6a 65 63 74 2e 0a 20 2a to an object.. *
19c0: 0a 20 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . * ------------
19d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
19e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
19f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1a00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a ----------. */..
1a10: 76 6f 69 64 0a 54 63 6c 4f 4f 4f 62 6a 65 63 74 void.TclOOObject
1a20: 53 65 74 46 69 6c 74 65 72 73 28 0a 20 20 20 20 SetFilters(.
1a30: 4f 62 6a 65 63 74 20 2a 6f 50 74 72 2c 0a 20 20 Object *oPtr,.
1a40: 20 20 69 6e 74 20 6e 75 6d 46 69 6c 74 65 72 73 int numFilters
1a50: 2c 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 ,. Tcl_Obj *c
1a60: 6f 6e 73 74 20 2a 66 69 6c 74 65 72 73 29 0a 7b onst *filters).{
1a70: 0a 20 20 20 20 69 6e 74 20 69 3b 0a 0a 20 20 20 . int i;..
1a80: 20 69 66 20 28 6f 50 74 72 2d 3e 66 69 6c 74 65 if (oPtr->filte
1a90: 72 73 2e 6e 75 6d 29 20 7b 0a 09 54 63 6c 5f 4f rs.num) {..Tcl_O
1aa0: 62 6a 20 2a 66 69 6c 74 65 72 4f 62 6a 3b 0a 0a bj *filterObj;..
1ab0: 09 46 4f 52 45 41 43 48 28 66 69 6c 74 65 72 4f .FOREACH(filterO
1ac0: 62 6a 2c 20 6f 50 74 72 2d 3e 66 69 6c 74 65 72 bj, oPtr->filter
1ad0: 73 29 20 7b 0a 09 20 20 20 20 54 63 6c 5f 44 65 s) {.. Tcl_De
1ae0: 63 72 52 65 66 43 6f 75 6e 74 28 66 69 6c 74 65 crRefCount(filte
1af0: 72 4f 62 6a 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a rObj);..}. }.
1b00: 0a 20 20 20 20 69 66 20 28 6e 75 6d 46 69 6c 74 . if (numFilt
1b10: 65 72 73 20 3d 3d 20 30 29 20 7b 0a 09 2f 2a 0a ers == 0) {../*.
1b20: 09 20 2a 20 4e 6f 20 6c 69 73 74 20 6f 66 20 66 . * No list of f
1b30: 69 6c 74 65 72 73 20 77 61 73 20 73 75 70 70 6c ilters was suppl
1b40: 69 65 64 2c 20 73 6f 20 77 65 27 72 65 20 64 65 ied, so we're de
1b50: 6c 65 74 69 6e 67 20 66 69 6c 74 65 72 73 2e 0a leting filters..
1b60: 09 20 2a 2f 0a 0a 09 63 6b 66 72 65 65 28 6f 50 . */...ckfree(oP
1b70: 74 72 2d 3e 66 69 6c 74 65 72 73 2e 6c 69 73 74 tr->filters.list
1b80: 29 3b 0a 09 6f 50 74 72 2d 3e 66 69 6c 74 65 72 );..oPtr->filter
1b90: 73 2e 6c 69 73 74 20 3d 20 4e 55 4c 4c 3b 0a 09 s.list = NULL;..
1ba0: 6f 50 74 72 2d 3e 66 69 6c 74 65 72 73 2e 6e 75 oPtr->filters.nu
1bb0: 6d 20 3d 20 30 3b 0a 09 52 65 63 6f 6d 70 75 74 m = 0;..Recomput
1bc0: 65 43 6c 61 73 73 43 61 63 68 65 46 6c 61 67 28 eClassCacheFlag(
1bd0: 6f 50 74 72 29 3b 0a 20 20 20 20 7d 20 65 6c 73 oPtr);. } els
1be0: 65 20 7b 0a 09 2f 2a 0a 09 20 2a 20 57 65 27 76 e {../*.. * We'v
1bf0: 65 20 67 6f 74 20 61 20 6c 69 73 74 20 6f 66 20 e got a list of
1c00: 66 69 6c 74 65 72 73 2c 20 73 6f 20 77 65 27 72 filters, so we'r
1c10: 65 20 63 72 65 61 74 69 6e 67 20 66 69 6c 74 65 e creating filte
1c20: 72 73 2e 0a 09 20 2a 2f 0a 0a 09 54 63 6c 5f 4f rs... */...Tcl_O
1c30: 62 6a 20 2a 2a 66 69 6c 74 65 72 73 4c 69 73 74 bj **filtersList
1c40: 3b 0a 09 69 6e 74 20 73 69 7a 65 20 3d 20 73 69 ;..int size = si
1c50: 7a 65 6f 66 28 54 63 6c 5f 4f 62 6a 20 2a 29 20 zeof(Tcl_Obj *)
1c60: 2a 20 6e 75 6d 46 69 6c 74 65 72 73 3b 09 2f 2a * numFilters;./*
1c70: 20 73 68 6f 75 6c 64 20 62 65 20 73 69 7a 65 5f should be size_
1c80: 74 20 2a 2f 0a 0a 09 69 66 20 28 6f 50 74 72 2d t */...if (oPtr-
1c90: 3e 66 69 6c 74 65 72 73 2e 6e 75 6d 20 3d 3d 20 >filters.num ==
1ca0: 30 29 20 7b 0a 09 20 20 20 20 66 69 6c 74 65 72 0) {.. filter
1cb0: 73 4c 69 73 74 20 3d 20 63 6b 61 6c 6c 6f 63 28 sList = ckalloc(
1cc0: 73 69 7a 65 29 3b 0a 09 7d 20 65 6c 73 65 20 7b size);..} else {
1cd0: 0a 09 20 20 20 20 66 69 6c 74 65 72 73 4c 69 73 .. filtersLis
1ce0: 74 20 3d 20 63 6b 72 65 61 6c 6c 6f 63 28 6f 50 t = ckrealloc(oP
1cf0: 74 72 2d 3e 66 69 6c 74 65 72 73 2e 6c 69 73 74 tr->filters.list
1d00: 2c 20 73 69 7a 65 29 3b 0a 09 7d 0a 09 66 6f 72 , size);..}..for
1d10: 20 28 69 3d 30 20 3b 20 69 3c 6e 75 6d 46 69 6c (i=0 ; i<numFil
1d20: 74 65 72 73 20 3b 20 69 2b 2b 29 20 7b 0a 09 20 ters ; i++) {..
1d30: 20 20 20 66 69 6c 74 65 72 73 4c 69 73 74 5b 69 filtersList[i
1d40: 5d 20 3d 20 66 69 6c 74 65 72 73 5b 69 5d 3b 0a ] = filters[i];.
1d50: 09 20 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 . Tcl_IncrRef
1d60: 43 6f 75 6e 74 28 66 69 6c 74 65 72 73 5b 69 5d Count(filters[i]
1d70: 29 3b 0a 09 7d 0a 09 6f 50 74 72 2d 3e 66 69 6c );..}..oPtr->fil
1d80: 74 65 72 73 2e 6c 69 73 74 20 3d 20 66 69 6c 74 ters.list = filt
1d90: 65 72 73 4c 69 73 74 3b 0a 09 6f 50 74 72 2d 3e ersList;..oPtr->
1da0: 66 69 6c 74 65 72 73 2e 6e 75 6d 20 3d 20 6e 75 filters.num = nu
1db0: 6d 46 69 6c 74 65 72 73 3b 0a 09 6f 50 74 72 2d mFilters;..oPtr-
1dc0: 3e 66 6c 61 67 73 20 26 3d 20 7e 55 53 45 5f 43 >flags &= ~USE_C
1dd0: 4c 41 53 53 5f 43 41 43 48 45 3b 0a 20 20 20 20 LASS_CACHE;.
1de0: 7d 0a 20 20 20 20 6f 50 74 72 2d 3e 65 70 6f 63 }. oPtr->epoc
1df0: 68 2b 2b 3b 09 09 2f 2a 20 4f 6e 6c 79 20 74 68 h++;../* Only th
1e00: 69 73 20 6f 62 6a 65 63 74 20 63 61 6e 20 62 65 is object can be
1e10: 20 61 66 66 65 63 74 65 64 2e 20 2a 2f 0a 7d 0a affected. */.}.
1e20: 0c 0a 2f 2a 0a 20 2a 20 2d 2d 2d 2d 2d 2d 2d 2d ../*. * --------
1e30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1e40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1e50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1e60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
1e70: 2a 0a 20 2a 20 54 63 6c 4f 4f 43 6c 61 73 73 53 *. * TclOOClassS
1e80: 65 74 46 69 6c 74 65 72 73 20 2d 2d 0a 20 2a 09 etFilters --. *.
1e90: 49 6e 73 74 61 6c 6c 20 61 20 6c 69 73 74 20 6f Install a list o
1ea0: 66 20 66 69 6c 74 65 72 20 6d 65 74 68 6f 64 20 f filter method
1eb0: 6e 61 6d 65 73 20 69 6e 74 6f 20 61 20 63 6c 61 names into a cla
1ec0: 73 73 2e 0a 20 2a 0a 20 2a 20 2d 2d 2d 2d 2d 2d ss.. *. * ------
1ed0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1ee0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1ef0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1f00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1f10: 0a 20 2a 2f 0a 0a 76 6f 69 64 0a 54 63 6c 4f 4f . */..void.TclOO
1f20: 43 6c 61 73 73 53 65 74 46 69 6c 74 65 72 73 28 ClassSetFilters(
1f30: 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 . Tcl_Interp
1f40: 2a 69 6e 74 65 72 70 2c 0a 20 20 20 20 43 6c 61 *interp,. Cla
1f50: 73 73 20 2a 63 6c 61 73 73 50 74 72 2c 0a 20 20 ss *classPtr,.
1f60: 20 20 69 6e 74 20 6e 75 6d 46 69 6c 74 65 72 73 int numFilters
1f70: 2c 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 ,. Tcl_Obj *c
1f80: 6f 6e 73 74 20 2a 66 69 6c 74 65 72 73 29 0a 7b onst *filters).{
1f90: 0a 20 20 20 20 69 6e 74 20 69 3b 0a 0a 20 20 20 . int i;..
1fa0: 20 69 66 20 28 63 6c 61 73 73 50 74 72 2d 3e 66 if (classPtr->f
1fb0: 69 6c 74 65 72 73 2e 6e 75 6d 29 20 7b 0a 09 54 ilters.num) {..T
1fc0: 63 6c 5f 4f 62 6a 20 2a 66 69 6c 74 65 72 4f 62 cl_Obj *filterOb
1fd0: 6a 3b 0a 0a 09 46 4f 52 45 41 43 48 28 66 69 6c j;...FOREACH(fil
1fe0: 74 65 72 4f 62 6a 2c 20 63 6c 61 73 73 50 74 72 terObj, classPtr
1ff0: 2d 3e 66 69 6c 74 65 72 73 29 20 7b 0a 09 20 20 ->filters) {..
2000: 20 20 54 63 6c 5f 44 65 63 72 52 65 66 43 6f 75 Tcl_DecrRefCou
2010: 6e 74 28 66 69 6c 74 65 72 4f 62 6a 29 3b 0a 09 nt(filterObj);..
2020: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 }. }.. if
2030: 28 6e 75 6d 46 69 6c 74 65 72 73 20 3d 3d 20 30 (numFilters == 0
2040: 29 20 7b 0a 09 2f 2a 0a 09 20 2a 20 4e 6f 20 6c ) {../*.. * No l
2050: 69 73 74 20 6f 66 20 66 69 6c 74 65 72 73 20 77 ist of filters w
2060: 61 73 20 73 75 70 70 6c 69 65 64 2c 20 73 6f 20 as supplied, so
2070: 77 65 27 72 65 20 64 65 6c 65 74 69 6e 67 20 66 we're deleting f
2080: 69 6c 74 65 72 73 2e 0a 09 20 2a 2f 0a 0a 09 63 ilters... */...c
2090: 6b 66 72 65 65 28 63 6c 61 73 73 50 74 72 2d 3e kfree(classPtr->
20a0: 66 69 6c 74 65 72 73 2e 6c 69 73 74 29 3b 0a 09 filters.list);..
20b0: 63 6c 61 73 73 50 74 72 2d 3e 66 69 6c 74 65 72 classPtr->filter
20c0: 73 2e 6c 69 73 74 20 3d 20 4e 55 4c 4c 3b 0a 09 s.list = NULL;..
20d0: 63 6c 61 73 73 50 74 72 2d 3e 66 69 6c 74 65 72 classPtr->filter
20e0: 73 2e 6e 75 6d 20 3d 20 30 3b 0a 20 20 20 20 7d s.num = 0;. }
20f0: 20 65 6c 73 65 20 7b 0a 09 2f 2a 0a 09 20 2a 20 else {../*.. *
2100: 57 65 27 76 65 20 67 6f 74 20 61 20 6c 69 73 74 We've got a list
2110: 20 6f 66 20 66 69 6c 74 65 72 73 2c 20 73 6f 20 of filters, so
2120: 77 65 27 72 65 20 63 72 65 61 74 69 6e 67 20 66 we're creating f
2130: 69 6c 74 65 72 73 2e 0a 09 20 2a 2f 0a 0a 09 54 ilters... */...T
2140: 63 6c 5f 4f 62 6a 20 2a 2a 66 69 6c 74 65 72 73 cl_Obj **filters
2150: 4c 69 73 74 3b 0a 09 69 6e 74 20 73 69 7a 65 20 List;..int size
2160: 3d 20 73 69 7a 65 6f 66 28 54 63 6c 5f 4f 62 6a = sizeof(Tcl_Obj
2170: 20 2a 29 20 2a 20 6e 75 6d 46 69 6c 74 65 72 73 *) * numFilters
2180: 3b 09 2f 2a 20 73 68 6f 75 6c 64 20 62 65 20 73 ;./* should be s
2190: 69 7a 65 5f 74 20 2a 2f 0a 0a 09 69 66 20 28 63 ize_t */...if (c
21a0: 6c 61 73 73 50 74 72 2d 3e 66 69 6c 74 65 72 73 lassPtr->filters
21b0: 2e 6e 75 6d 20 3d 3d 20 30 29 20 7b 0a 09 20 20 .num == 0) {..
21c0: 20 20 66 69 6c 74 65 72 73 4c 69 73 74 20 3d 20 filtersList =
21d0: 63 6b 61 6c 6c 6f 63 28 73 69 7a 65 29 3b 0a 09 ckalloc(size);..
21e0: 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 66 69 } else {.. fi
21f0: 6c 74 65 72 73 4c 69 73 74 20 3d 20 63 6b 72 65 ltersList = ckre
2200: 61 6c 6c 6f 63 28 63 6c 61 73 73 50 74 72 2d 3e alloc(classPtr->
2210: 66 69 6c 74 65 72 73 2e 6c 69 73 74 2c 20 73 69 filters.list, si
2220: 7a 65 29 3b 0a 09 7d 0a 09 66 6f 72 20 28 69 3d ze);..}..for (i=
2230: 30 20 3b 20 69 3c 6e 75 6d 46 69 6c 74 65 72 73 0 ; i<numFilters
2240: 20 3b 20 69 2b 2b 29 20 7b 0a 09 20 20 20 20 66 ; i++) {.. f
2250: 69 6c 74 65 72 73 4c 69 73 74 5b 69 5d 20 3d 20 iltersList[i] =
2260: 66 69 6c 74 65 72 73 5b 69 5d 3b 0a 09 20 20 20 filters[i];..
2270: 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e Tcl_IncrRefCoun
2280: 74 28 66 69 6c 74 65 72 73 5b 69 5d 29 3b 0a 09 t(filters[i]);..
2290: 7d 0a 09 63 6c 61 73 73 50 74 72 2d 3e 66 69 6c }..classPtr->fil
22a0: 74 65 72 73 2e 6c 69 73 74 20 3d 20 66 69 6c 74 ters.list = filt
22b0: 65 72 73 4c 69 73 74 3b 0a 09 63 6c 61 73 73 50 ersList;..classP
22c0: 74 72 2d 3e 66 69 6c 74 65 72 73 2e 6e 75 6d 20 tr->filters.num
22d0: 3d 20 6e 75 6d 46 69 6c 74 65 72 73 3b 0a 20 20 = numFilters;.
22e0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 }.. /*.
22f0: 20 2a 20 54 68 65 72 65 20 6d 61 79 20 62 65 20 * There may be
2300: 6d 61 6e 79 20 6f 62 6a 65 63 74 73 20 61 66 66 many objects aff
2310: 65 63 74 65 64 2c 20 73 6f 20 62 75 6d 70 20 74 ected, so bump t
2320: 68 65 20 67 6c 6f 62 61 6c 20 65 70 6f 63 68 2e he global epoch.
2330: 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 42 75 . */.. Bu
2340: 6d 70 47 6c 6f 62 61 6c 45 70 6f 63 68 28 69 6e mpGlobalEpoch(in
2350: 74 65 72 70 2c 20 63 6c 61 73 73 50 74 72 29 3b terp, classPtr);
2360: 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 20 2d 2d 2d 2d 2d .}.../*. * -----
2370: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2380: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2390: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
23a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
23b0: 2d 0a 20 2a 0a 20 2a 20 54 63 6c 4f 4f 4f 62 6a -. *. * TclOOObj
23c0: 65 63 74 53 65 74 4d 69 78 69 6e 73 20 2d 2d 0a ectSetMixins --.
23d0: 20 2a 09 49 6e 73 74 61 6c 6c 20 61 20 6c 69 73 *.Install a lis
23e0: 74 20 6f 66 20 6d 69 78 69 6e 20 63 6c 61 73 73 t of mixin class
23f0: 65 73 20 69 6e 74 6f 20 61 6e 20 6f 62 6a 65 63 es into an objec
2400: 74 2e 0a 20 2a 0a 20 2a 20 2d 2d 2d 2d 2d 2d 2d t.. *. * -------
2410: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2420: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2430: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2440: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
2450: 20 2a 2f 0a 0a 76 6f 69 64 0a 54 63 6c 4f 4f 4f */..void.TclOOO
2460: 62 6a 65 63 74 53 65 74 4d 69 78 69 6e 73 28 0a bjectSetMixins(.
2470: 20 20 20 20 4f 62 6a 65 63 74 20 2a 6f 50 74 72 Object *oPtr
2480: 2c 0a 20 20 20 20 69 6e 74 20 6e 75 6d 4d 69 78 ,. int numMix
2490: 69 6e 73 2c 0a 20 20 20 20 43 6c 61 73 73 20 2a ins,. Class *
24a0: 63 6f 6e 73 74 20 2a 6d 69 78 69 6e 73 29 0a 7b const *mixins).{
24b0: 0a 20 20 20 20 43 6c 61 73 73 20 2a 6d 69 78 69 . Class *mixi
24c0: 6e 50 74 72 3b 0a 20 20 20 20 69 6e 74 20 69 3b nPtr;. int i;
24d0: 0a 0a 20 20 20 20 69 66 20 28 6e 75 6d 4d 69 78 .. if (numMix
24e0: 69 6e 73 20 3d 3d 20 30 29 20 7b 0a 09 69 66 20 ins == 0) {..if
24f0: 28 6f 50 74 72 2d 3e 6d 69 78 69 6e 73 2e 6e 75 (oPtr->mixins.nu
2500: 6d 20 21 3d 20 30 29 20 7b 0a 09 20 20 20 20 46 m != 0) {.. F
2510: 4f 52 45 41 43 48 28 6d 69 78 69 6e 50 74 72 2c OREACH(mixinPtr,
2520: 20 6f 50 74 72 2d 3e 6d 69 78 69 6e 73 29 20 7b oPtr->mixins) {
2530: 0a 09 09 69 66 20 28 6d 69 78 69 6e 50 74 72 29 ...if (mixinPtr)
2540: 20 7b 0a 09 09 20 20 20 20 54 63 6c 4f 4f 52 65 {... TclOORe
2550: 6d 6f 76 65 46 72 6f 6d 49 6e 73 74 61 6e 63 65 moveFromInstance
2560: 73 28 6f 50 74 72 2c 20 6d 69 78 69 6e 50 74 72 s(oPtr, mixinPtr
2570: 29 3b 0a 09 09 7d 0a 09 20 20 20 20 7d 0a 09 20 );...}.. }..
2580: 20 20 20 63 6b 66 72 65 65 28 6f 50 74 72 2d 3e ckfree(oPtr->
2590: 6d 69 78 69 6e 73 2e 6c 69 73 74 29 3b 0a 09 20 mixins.list);..
25a0: 20 20 20 6f 50 74 72 2d 3e 6d 69 78 69 6e 73 2e oPtr->mixins.
25b0: 6e 75 6d 20 3d 20 30 3b 0a 09 7d 0a 09 52 65 63 num = 0;..}..Rec
25c0: 6f 6d 70 75 74 65 43 6c 61 73 73 43 61 63 68 65 omputeClassCache
25d0: 46 6c 61 67 28 6f 50 74 72 29 3b 0a 20 20 20 20 Flag(oPtr);.
25e0: 7d 20 65 6c 73 65 20 7b 0a 09 69 66 20 28 6f 50 } else {..if (oP
25f0: 74 72 2d 3e 6d 69 78 69 6e 73 2e 6e 75 6d 20 21 tr->mixins.num !
2600: 3d 20 30 29 20 7b 0a 09 20 20 20 20 46 4f 52 45 = 0) {.. FORE
2610: 41 43 48 28 6d 69 78 69 6e 50 74 72 2c 20 6f 50 ACH(mixinPtr, oP
2620: 74 72 2d 3e 6d 69 78 69 6e 73 29 20 7b 0a 09 09 tr->mixins) {...
2630: 69 66 20 28 6d 69 78 69 6e 50 74 72 20 26 26 20 if (mixinPtr &&
2640: 6d 69 78 69 6e 50 74 72 20 21 3d 20 6f 50 74 72 mixinPtr != oPtr
2650: 2d 3e 73 65 6c 66 43 6c 73 29 20 7b 0a 09 09 20 ->selfCls) {...
2660: 20 20 20 54 63 6c 4f 4f 52 65 6d 6f 76 65 46 72 TclOORemoveFr
2670: 6f 6d 49 6e 73 74 61 6e 63 65 73 28 6f 50 74 72 omInstances(oPtr
2680: 2c 20 6d 69 78 69 6e 50 74 72 29 3b 0a 09 09 7d , mixinPtr);...}
2690: 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 6f 50 74 .. }.. oPt
26a0: 72 2d 3e 6d 69 78 69 6e 73 2e 6c 69 73 74 20 3d r->mixins.list =
26b0: 20 63 6b 72 65 61 6c 6c 6f 63 28 6f 50 74 72 2d ckrealloc(oPtr-
26c0: 3e 6d 69 78 69 6e 73 2e 6c 69 73 74 2c 0a 09 09 >mixins.list,...
26d0: 20 20 20 20 73 69 7a 65 6f 66 28 43 6c 61 73 73 sizeof(Class
26e0: 20 2a 29 20 2a 20 6e 75 6d 4d 69 78 69 6e 73 29 *) * numMixins)
26f0: 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 ;..} else {..
2700: 20 6f 50 74 72 2d 3e 6d 69 78 69 6e 73 2e 6c 69 oPtr->mixins.li
2710: 73 74 20 3d 20 63 6b 61 6c 6c 6f 63 28 73 69 7a st = ckalloc(siz
2720: 65 6f 66 28 43 6c 61 73 73 20 2a 29 20 2a 20 6e eof(Class *) * n
2730: 75 6d 4d 69 78 69 6e 73 29 3b 0a 09 20 20 20 20 umMixins);..
2740: 6f 50 74 72 2d 3e 66 6c 61 67 73 20 26 3d 20 7e oPtr->flags &= ~
2750: 55 53 45 5f 43 4c 41 53 53 5f 43 41 43 48 45 3b USE_CLASS_CACHE;
2760: 0a 09 7d 0a 09 6f 50 74 72 2d 3e 6d 69 78 69 6e ..}..oPtr->mixin
2770: 73 2e 6e 75 6d 20 3d 20 6e 75 6d 4d 69 78 69 6e s.num = numMixin
2780: 73 3b 0a 09 6d 65 6d 63 70 79 28 6f 50 74 72 2d s;..memcpy(oPtr-
2790: 3e 6d 69 78 69 6e 73 2e 6c 69 73 74 2c 20 6d 69 >mixins.list, mi
27a0: 78 69 6e 73 2c 20 73 69 7a 65 6f 66 28 43 6c 61 xins, sizeof(Cla
27b0: 73 73 20 2a 29 20 2a 20 6e 75 6d 4d 69 78 69 6e ss *) * numMixin
27c0: 73 29 3b 0a 09 46 4f 52 45 41 43 48 28 6d 69 78 s);..FOREACH(mix
27d0: 69 6e 50 74 72 2c 20 6f 50 74 72 2d 3e 6d 69 78 inPtr, oPtr->mix
27e0: 69 6e 73 29 20 7b 0a 09 20 20 20 20 69 66 20 28 ins) {.. if (
27f0: 6d 69 78 69 6e 50 74 72 20 21 3d 20 6f 50 74 72 mixinPtr != oPtr
2800: 2d 3e 73 65 6c 66 43 6c 73 29 20 7b 0a 09 09 54 ->selfCls) {...T
2810: 63 6c 4f 4f 41 64 64 54 6f 49 6e 73 74 61 6e 63 clOOAddToInstanc
2820: 65 73 28 6f 50 74 72 2c 20 6d 69 78 69 6e 50 74 es(oPtr, mixinPt
2830: 72 29 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a 20 20 r);.. }..}.
2840: 20 20 7d 0a 20 20 20 20 6f 50 74 72 2d 3e 65 70 }. oPtr->ep
2850: 6f 63 68 2b 2b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a och++;.}.../*. *
2860: 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ---------------
2870: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2880: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2890: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
28a0: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 63 -------. *. * Tc
28b0: 6c 4f 4f 43 6c 61 73 73 53 65 74 4d 69 78 69 6e lOOClassSetMixin
28c0: 73 20 2d 2d 0a 20 2a 09 49 6e 73 74 61 6c 6c 20 s --. *.Install
28d0: 61 20 6c 69 73 74 20 6f 66 20 6d 69 78 69 6e 20 a list of mixin
28e0: 63 6c 61 73 73 65 73 20 69 6e 74 6f 20 61 20 63 classes into a c
28f0: 6c 61 73 73 2e 0a 20 2a 0a 20 2a 20 2d 2d 2d 2d lass.. *. * ----
2900: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2910: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2920: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2930: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2940: 2d 2d 0a 20 2a 2f 0a 0a 76 6f 69 64 0a 54 63 6c --. */..void.Tcl
2950: 4f 4f 43 6c 61 73 73 53 65 74 4d 69 78 69 6e 73 OOClassSetMixins
2960: 28 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 (. Tcl_Interp
2970: 20 2a 69 6e 74 65 72 70 2c 0a 20 20 20 20 43 6c *interp,. Cl
2980: 61 73 73 20 2a 63 6c 61 73 73 50 74 72 2c 0a 20 ass *classPtr,.
2990: 20 20 20 69 6e 74 20 6e 75 6d 4d 69 78 69 6e 73 int numMixins
29a0: 2c 0a 20 20 20 20 43 6c 61 73 73 20 2a 63 6f 6e ,. Class *con
29b0: 73 74 20 2a 6d 69 78 69 6e 73 29 0a 7b 0a 20 20 st *mixins).{.
29c0: 20 20 43 6c 61 73 73 20 2a 6d 69 78 69 6e 50 74 Class *mixinPt
29d0: 72 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 0a 20 r;. int i;..
29e0: 20 20 20 69 66 20 28 6e 75 6d 4d 69 78 69 6e 73 if (numMixins
29f0: 20 3d 3d 20 30 29 20 7b 0a 09 69 66 20 28 63 6c == 0) {..if (cl
2a00: 61 73 73 50 74 72 2d 3e 6d 69 78 69 6e 73 2e 6e assPtr->mixins.n
2a10: 75 6d 20 21 3d 20 30 29 20 7b 0a 09 20 20 20 20 um != 0) {..
2a20: 46 4f 52 45 41 43 48 28 6d 69 78 69 6e 50 74 72 FOREACH(mixinPtr
2a30: 2c 20 63 6c 61 73 73 50 74 72 2d 3e 6d 69 78 69 , classPtr->mixi
2a40: 6e 73 29 20 7b 0a 09 09 54 63 6c 4f 4f 52 65 6d ns) {...TclOORem
2a50: 6f 76 65 46 72 6f 6d 4d 69 78 69 6e 53 75 62 73 oveFromMixinSubs
2a60: 28 63 6c 61 73 73 50 74 72 2c 20 6d 69 78 69 6e (classPtr, mixin
2a70: 50 74 72 29 3b 0a 09 20 20 20 20 7d 0a 09 20 20 Ptr);.. }..
2a80: 20 20 63 6b 66 72 65 65 28 63 6c 61 73 73 50 74 ckfree(classPt
2a90: 72 2d 3e 6d 69 78 69 6e 73 2e 6c 69 73 74 29 3b r->mixins.list);
2aa0: 0a 09 20 20 20 20 63 6c 61 73 73 50 74 72 2d 3e .. classPtr->
2ab0: 6d 69 78 69 6e 73 2e 6e 75 6d 20 3d 20 30 3b 0a mixins.num = 0;.
2ac0: 09 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a .}. } else {.
2ad0: 09 69 66 20 28 63 6c 61 73 73 50 74 72 2d 3e 6d .if (classPtr->m
2ae0: 69 78 69 6e 73 2e 6e 75 6d 20 21 3d 20 30 29 20 ixins.num != 0)
2af0: 7b 0a 09 20 20 20 20 46 4f 52 45 41 43 48 28 6d {.. FOREACH(m
2b00: 69 78 69 6e 50 74 72 2c 20 63 6c 61 73 73 50 74 ixinPtr, classPt
2b10: 72 2d 3e 6d 69 78 69 6e 73 29 20 7b 0a 09 09 54 r->mixins) {...T
2b20: 63 6c 4f 4f 52 65 6d 6f 76 65 46 72 6f 6d 4d 69 clOORemoveFromMi
2b30: 78 69 6e 53 75 62 73 28 63 6c 61 73 73 50 74 72 xinSubs(classPtr
2b40: 2c 20 6d 69 78 69 6e 50 74 72 29 3b 0a 09 20 20 , mixinPtr);..
2b50: 20 20 7d 0a 09 20 20 20 20 63 6c 61 73 73 50 74 }.. classPt
2b60: 72 2d 3e 6d 69 78 69 6e 73 2e 6c 69 73 74 20 3d r->mixins.list =
2b70: 20 63 6b 72 65 61 6c 6c 6f 63 28 63 6c 61 73 73 ckrealloc(class
2b80: 50 74 72 2d 3e 6d 69 78 69 6e 73 2e 6c 69 73 74 Ptr->mixins.list
2b90: 2c 0a 09 09 20 20 20 20 73 69 7a 65 6f 66 28 43 ,... sizeof(C
2ba0: 6c 61 73 73 20 2a 29 20 2a 20 6e 75 6d 4d 69 78 lass *) * numMix
2bb0: 69 6e 73 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a ins);..} else {.
2bc0: 09 20 20 20 20 63 6c 61 73 73 50 74 72 2d 3e 6d . classPtr->m
2bd0: 69 78 69 6e 73 2e 6c 69 73 74 20 3d 20 63 6b 61 ixins.list = cka
2be0: 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 43 6c 61 73 lloc(sizeof(Clas
2bf0: 73 20 2a 29 20 2a 20 6e 75 6d 4d 69 78 69 6e 73 s *) * numMixins
2c00: 29 3b 0a 09 7d 0a 09 63 6c 61 73 73 50 74 72 2d );..}..classPtr-
2c10: 3e 6d 69 78 69 6e 73 2e 6e 75 6d 20 3d 20 6e 75 >mixins.num = nu
2c20: 6d 4d 69 78 69 6e 73 3b 0a 09 6d 65 6d 63 70 79 mMixins;..memcpy
2c30: 28 63 6c 61 73 73 50 74 72 2d 3e 6d 69 78 69 6e (classPtr->mixin
2c40: 73 2e 6c 69 73 74 2c 20 6d 69 78 69 6e 73 2c 20 s.list, mixins,
2c50: 73 69 7a 65 6f 66 28 43 6c 61 73 73 20 2a 29 20 sizeof(Class *)
2c60: 2a 20 6e 75 6d 4d 69 78 69 6e 73 29 3b 0a 09 46 * numMixins);..F
2c70: 4f 52 45 41 43 48 28 6d 69 78 69 6e 50 74 72 2c OREACH(mixinPtr,
2c80: 20 63 6c 61 73 73 50 74 72 2d 3e 6d 69 78 69 6e classPtr->mixin
2c90: 73 29 20 7b 0a 09 20 20 20 20 54 63 6c 4f 4f 41 s) {.. TclOOA
2ca0: 64 64 54 6f 4d 69 78 69 6e 53 75 62 73 28 63 6c ddToMixinSubs(cl
2cb0: 61 73 73 50 74 72 2c 20 6d 69 78 69 6e 50 74 72 assPtr, mixinPtr
2cc0: 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 20 20 20 20 );..}. }.
2cd0: 42 75 6d 70 47 6c 6f 62 61 6c 45 70 6f 63 68 28 BumpGlobalEpoch(
2ce0: 69 6e 74 65 72 70 2c 20 63 6c 61 73 73 50 74 72 interp, classPtr
2cf0: 29 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 20 2d 2d 2d );.}.../*. * ---
2d00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2d10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2d20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2d30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2d40: 2d 2d 2d 0a 20 2a 0a 20 2a 20 52 65 6e 61 6d 65 ---. *. * Rename
2d50: 44 65 6c 65 74 65 4d 65 74 68 6f 64 20 2d 2d 0a DeleteMethod --.
2d60: 20 2a 09 43 6f 72 65 20 6f 66 20 74 68 65 20 63 *.Core of the c
2d70: 6f 64 65 20 74 6f 20 72 65 6e 61 6d 65 20 61 6e ode to rename an
2d80: 64 20 64 65 6c 65 74 65 20 6d 65 74 68 6f 64 73 d delete methods
2d90: 2e 0a 20 2a 0a 20 2a 20 2d 2d 2d 2d 2d 2d 2d 2d .. *. * --------
2da0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2db0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2dc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2dd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
2de0: 2a 2f 0a 0a 73 74 61 74 69 63 20 69 6e 74 0a 52 */..static int.R
2df0: 65 6e 61 6d 65 44 65 6c 65 74 65 4d 65 74 68 6f enameDeleteMetho
2e00: 64 28 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 d(. Tcl_Inter
2e10: 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 20 20 4f p *interp,. O
2e20: 62 6a 65 63 74 20 2a 6f 50 74 72 2c 0a 20 20 20 bject *oPtr,.
2e30: 20 69 6e 74 20 75 73 65 43 6c 61 73 73 2c 0a 20 int useClass,.
2e40: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 Tcl_Obj *cons
2e50: 74 20 66 72 6f 6d 50 74 72 2c 0a 20 20 20 20 54 t fromPtr,. T
2e60: 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 74 6f cl_Obj *const to
2e70: 50 74 72 29 0a 7b 0a 20 20 20 20 54 63 6c 5f 48 Ptr).{. Tcl_H
2e80: 61 73 68 45 6e 74 72 79 20 2a 68 50 74 72 2c 20 ashEntry *hPtr,
2e90: 2a 6e 65 77 48 50 74 72 20 3d 20 4e 55 4c 4c 3b *newHPtr = NULL;
2ea0: 0a 20 20 20 20 4d 65 74 68 6f 64 20 2a 6d 50 74 . Method *mPt
2eb0: 72 3b 0a 20 20 20 20 69 6e 74 20 69 73 4e 65 77 r;. int isNew
2ec0: 3b 0a 0a 20 20 20 20 69 66 20 28 21 75 73 65 43 ;.. if (!useC
2ed0: 6c 61 73 73 29 20 7b 0a 09 69 66 20 28 21 6f 50 lass) {..if (!oP
2ee0: 74 72 2d 3e 6d 65 74 68 6f 64 73 50 74 72 29 20 tr->methodsPtr)
2ef0: 7b 0a 09 6e 6f 53 75 63 68 4d 65 74 68 6f 64 3a {..noSuchMethod:
2f00: 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a .. Tcl_SetObj
2f10: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 Result(interp, T
2f20: 63 6c 5f 4f 62 6a 50 72 69 6e 74 66 28 0a 09 09 cl_ObjPrintf(...
2f30: 20 20 20 20 22 6d 65 74 68 6f 64 20 25 73 20 64 "method %s d
2f40: 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 22 2c 20 oes not exist",
2f50: 54 63 6c 47 65 74 53 74 72 69 6e 67 28 66 72 6f TclGetString(fro
2f60: 6d 50 74 72 29 29 29 3b 0a 09 20 20 20 20 54 63 mPtr)));.. Tc
2f70: 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 l_SetErrorCode(i
2f80: 6e 74 65 72 70 2c 20 22 54 43 4c 22 2c 20 22 4c nterp, "TCL", "L
2f90: 4f 4f 4b 55 50 22 2c 20 22 4d 45 54 48 4f 44 22 OOKUP", "METHOD"
2fa0: 2c 0a 09 09 20 20 20 20 54 63 6c 47 65 74 53 74 ,... TclGetSt
2fb0: 72 69 6e 67 28 66 72 6f 6d 50 74 72 29 2c 20 4e ring(fromPtr), N
2fc0: 55 4c 4c 29 3b 0a 09 20 20 20 20 72 65 74 75 72 ULL);.. retur
2fd0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a n TCL_ERROR;..}.
2fe0: 09 68 50 74 72 20 3d 20 54 63 6c 5f 46 69 6e 64 .hPtr = Tcl_Find
2ff0: 48 61 73 68 45 6e 74 72 79 28 6f 50 74 72 2d 3e HashEntry(oPtr->
3000: 6d 65 74 68 6f 64 73 50 74 72 2c 20 28 63 68 61 methodsPtr, (cha
3010: 72 20 2a 29 20 66 72 6f 6d 50 74 72 29 3b 0a 09 r *) fromPtr);..
3020: 69 66 20 28 68 50 74 72 20 3d 3d 20 4e 55 4c 4c if (hPtr == NULL
3030: 29 20 7b 0a 09 20 20 20 20 67 6f 74 6f 20 6e 6f ) {.. goto no
3040: 53 75 63 68 4d 65 74 68 6f 64 3b 0a 09 7d 0a 09 SuchMethod;..}..
3050: 69 66 20 28 74 6f 50 74 72 29 20 7b 0a 09 20 20 if (toPtr) {..
3060: 20 20 6e 65 77 48 50 74 72 20 3d 20 54 63 6c 5f newHPtr = Tcl_
3070: 43 72 65 61 74 65 48 61 73 68 45 6e 74 72 79 28 CreateHashEntry(
3080: 6f 50 74 72 2d 3e 6d 65 74 68 6f 64 73 50 74 72 oPtr->methodsPtr
3090: 2c 20 28 63 68 61 72 20 2a 29 20 74 6f 50 74 72 , (char *) toPtr
30a0: 2c 0a 09 09 20 20 20 20 26 69 73 4e 65 77 29 3b ,... &isNew);
30b0: 0a 09 20 20 20 20 69 66 20 28 68 50 74 72 20 3d .. if (hPtr =
30c0: 3d 20 6e 65 77 48 50 74 72 29 20 7b 0a 09 20 20 = newHPtr) {..
30d0: 20 20 72 65 6e 61 6d 65 54 6f 53 65 6c 66 3a 0a renameToSelf:.
30e0: 09 09 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 ..Tcl_SetObjResu
30f0: 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e lt(interp, Tcl_N
3100: 65 77 53 74 72 69 6e 67 4f 62 6a 28 0a 09 09 09 ewStringObj(....
3110: 22 63 61 6e 6e 6f 74 20 72 65 6e 61 6d 65 20 6d "cannot rename m
3120: 65 74 68 6f 64 20 74 6f 20 69 74 73 65 6c 66 22 ethod to itself"
3130: 2c 20 2d 31 29 29 3b 0a 09 09 54 63 6c 5f 53 65 , -1));...Tcl_Se
3140: 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 tErrorCode(inter
3150: 70 2c 20 22 54 43 4c 22 2c 20 22 4f 4f 22 2c 20 p, "TCL", "OO",
3160: 22 52 45 4e 41 4d 45 5f 54 4f 5f 53 45 4c 46 22 "RENAME_TO_SELF"
3170: 2c 20 4e 55 4c 4c 29 3b 0a 09 09 72 65 74 75 72 , NULL);...retur
3180: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 n TCL_ERROR;..
3190: 20 20 7d 20 65 6c 73 65 20 69 66 20 28 21 69 73 } else if (!is
31a0: 4e 65 77 29 20 7b 0a 09 20 20 20 20 72 65 6e 61 New) {.. rena
31b0: 6d 65 54 6f 45 78 69 73 74 69 6e 67 3a 0a 09 09 meToExisting:...
31c0: 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 Tcl_SetObjResult
31d0: 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4f 62 6a (interp, Tcl_Obj
31e0: 50 72 69 6e 74 66 28 0a 09 09 09 22 6d 65 74 68 Printf(...."meth
31f0: 6f 64 20 63 61 6c 6c 65 64 20 25 73 20 61 6c 72 od called %s alr
3200: 65 61 64 79 20 65 78 69 73 74 73 22 2c 0a 09 09 eady exists",...
3210: 09 54 63 6c 47 65 74 53 74 72 69 6e 67 28 74 6f .TclGetString(to
3220: 50 74 72 29 29 29 3b 0a 09 09 54 63 6c 5f 53 65 Ptr)));...Tcl_Se
3230: 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 tErrorCode(inter
3240: 70 2c 20 22 54 43 4c 22 2c 20 22 4f 4f 22 2c 20 p, "TCL", "OO",
3250: 22 52 45 4e 41 4d 45 5f 4f 56 45 52 22 2c 20 4e "RENAME_OVER", N
3260: 55 4c 4c 29 3b 0a 09 09 72 65 74 75 72 6e 20 54 ULL);...return T
3270: 43 4c 5f 45 52 52 4f 52 3b 0a 09 20 20 20 20 7d CL_ERROR;.. }
3280: 0a 09 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b ..}. } else {
3290: 0a 09 68 50 74 72 20 3d 20 54 63 6c 5f 46 69 6e ..hPtr = Tcl_Fin
32a0: 64 48 61 73 68 45 6e 74 72 79 28 26 6f 50 74 72 dHashEntry(&oPtr
32b0: 2d 3e 63 6c 61 73 73 50 74 72 2d 3e 63 6c 61 73 ->classPtr->clas
32c0: 73 4d 65 74 68 6f 64 73 2c 0a 09 09 28 63 68 61 sMethods,...(cha
32d0: 72 20 2a 29 20 66 72 6f 6d 50 74 72 29 3b 0a 09 r *) fromPtr);..
32e0: 69 66 20 28 68 50 74 72 20 3d 3d 20 4e 55 4c 4c if (hPtr == NULL
32f0: 29 20 7b 0a 09 20 20 20 20 67 6f 74 6f 20 6e 6f ) {.. goto no
3300: 53 75 63 68 4d 65 74 68 6f 64 3b 0a 09 7d 0a 09 SuchMethod;..}..
3310: 69 66 20 28 74 6f 50 74 72 29 20 7b 0a 09 20 20 if (toPtr) {..
3320: 20 20 6e 65 77 48 50 74 72 20 3d 20 54 63 6c 5f newHPtr = Tcl_
3330: 43 72 65 61 74 65 48 61 73 68 45 6e 74 72 79 28 CreateHashEntry(
3340: 26 6f 50 74 72 2d 3e 63 6c 61 73 73 50 74 72 2d &oPtr->classPtr-
3350: 3e 63 6c 61 73 73 4d 65 74 68 6f 64 73 2c 0a 09 >classMethods,..
3360: 09 20 20 20 20 28 63 68 61 72 20 2a 29 20 74 6f . (char *) to
3370: 50 74 72 2c 20 26 69 73 4e 65 77 29 3b 0a 09 20 Ptr, &isNew);..
3380: 20 20 20 69 66 20 28 68 50 74 72 20 3d 3d 20 6e if (hPtr == n
3390: 65 77 48 50 74 72 29 20 7b 0a 09 09 67 6f 74 6f ewHPtr) {...goto
33a0: 20 72 65 6e 61 6d 65 54 6f 53 65 6c 66 3b 0a 09 renameToSelf;..
33b0: 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 21 } else if (!
33c0: 69 73 4e 65 77 29 20 7b 0a 09 09 67 6f 74 6f 20 isNew) {...goto
33d0: 72 65 6e 61 6d 65 54 6f 45 78 69 73 74 69 6e 67 renameToExisting
33e0: 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a 20 20 20 20 ;.. }..}.
33f0: 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a }.. /*. *
3400: 20 43 6f 6d 70 6c 65 74 65 20 74 68 65 20 73 70 Complete the sp
3410: 6c 69 63 69 6e 67 20 62 79 20 63 68 61 6e 67 69 licing by changi
3420: 6e 67 20 74 68 65 20 6d 65 74 68 6f 64 27 73 20 ng the method's
3430: 6e 61 6d 65 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 name.. */..
3440: 20 20 20 6d 50 74 72 20 3d 20 54 63 6c 5f 47 65 mPtr = Tcl_Ge
3450: 74 48 61 73 68 56 61 6c 75 65 28 68 50 74 72 29 tHashValue(hPtr)
3460: 3b 0a 20 20 20 20 69 66 20 28 74 6f 50 74 72 29 ;. if (toPtr)
3470: 20 7b 0a 09 54 63 6c 5f 49 6e 63 72 52 65 66 43 {..Tcl_IncrRefC
3480: 6f 75 6e 74 28 74 6f 50 74 72 29 3b 0a 09 54 63 ount(toPtr);..Tc
3490: 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 6d l_DecrRefCount(m
34a0: 50 74 72 2d 3e 6e 61 6d 65 50 74 72 29 3b 0a 09 Ptr->namePtr);..
34b0: 6d 50 74 72 2d 3e 6e 61 6d 65 50 74 72 20 3d 20 mPtr->namePtr =
34c0: 74 6f 50 74 72 3b 0a 09 54 63 6c 5f 53 65 74 48 toPtr;..Tcl_SetH
34d0: 61 73 68 56 61 6c 75 65 28 6e 65 77 48 50 74 72 ashValue(newHPtr
34e0: 2c 20 6d 50 74 72 29 3b 0a 20 20 20 20 7d 20 65 , mPtr);. } e
34f0: 6c 73 65 20 7b 0a 09 69 66 20 28 21 75 73 65 43 lse {..if (!useC
3500: 6c 61 73 73 29 20 7b 0a 09 20 20 20 20 52 65 63 lass) {.. Rec
3510: 6f 6d 70 75 74 65 43 6c 61 73 73 43 61 63 68 65 omputeClassCache
3520: 46 6c 61 67 28 6f 50 74 72 29 3b 0a 09 7d 0a 09 Flag(oPtr);..}..
3530: 54 63 6c 4f 4f 44 65 6c 4d 65 74 68 6f 64 52 65 TclOODelMethodRe
3540: 66 28 6d 50 74 72 29 3b 0a 20 20 20 20 7d 0a 20 f(mPtr);. }.
3550: 20 20 20 54 63 6c 5f 44 65 6c 65 74 65 48 61 73 Tcl_DeleteHas
3560: 68 45 6e 74 72 79 28 68 50 74 72 29 3b 0a 20 20 hEntry(hPtr);.
3570: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b return TCL_OK;
3580: 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 20 2d 2d 2d 2d 2d .}.../*. * -----
3590: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
35a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
35b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
35c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
35d0: 2d 0a 20 2a 0a 20 2a 20 54 63 6c 4f 4f 55 6e 6b -. *. * TclOOUnk
35e0: 6e 6f 77 6e 44 65 66 69 6e 69 74 69 6f 6e 20 2d nownDefinition -
35f0: 2d 0a 20 2a 09 48 61 6e 64 6c 65 73 20 77 68 61 -. *.Handles wha
3600: 74 20 68 61 70 70 65 6e 73 20 77 68 65 6e 20 61 t happens when a
3610: 6e 20 75 6e 6b 6e 6f 77 6e 20 63 6f 6d 6d 61 6e n unknown comman
3620: 64 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 d is encountered
3630: 20 64 75 72 69 6e 67 20 74 68 65 0a 20 2a 09 70 during the. *.p
3640: 72 6f 63 65 73 73 69 6e 67 20 6f 66 20 61 20 64 rocessing of a d
3650: 65 66 69 6e 69 74 69 6f 6e 20 73 63 72 69 70 74 efinition script
3660: 2e 20 57 6f 72 6b 73 20 62 79 20 66 69 6e 64 69 . Works by findi
3670: 6e 67 20 61 20 63 6f 6d 6d 61 6e 64 20 69 6e 20 ng a command in
3680: 74 68 65 0a 20 2a 09 6f 70 65 72 61 74 69 6e 67 the. *.operating
3690: 20 64 65 66 69 6e 69 74 69 6f 6e 20 6e 61 6d 65 definition name
36a0: 73 70 61 63 65 20 74 68 61 74 20 74 68 65 20 72 space that the r
36b0: 65 71 75 65 73 74 65 64 20 63 6f 6d 6d 61 6e 64 equested command
36c0: 20 69 73 20 61 20 75 6e 69 71 75 65 0a 20 2a 09 is a unique. *.
36d0: 70 72 65 66 69 78 20 6f 66 2e 0a 20 2a 0a 20 2a prefix of.. *. *
36e0: 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ---------------
36f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3700: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3710: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3720: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 69 6e 74 -------. */..int
3730: 0a 54 63 6c 4f 4f 55 6e 6b 6e 6f 77 6e 44 65 66 .TclOOUnknownDef
3740: 69 6e 69 74 69 6f 6e 28 0a 20 20 20 20 43 6c 69 inition(. Cli
3750: 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 entData clientDa
3760: 74 61 2c 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 ta,. Tcl_Inte
3770: 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 20 20 rp *interp,.
3780: 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 20 20 54 63 int objc,. Tc
3790: 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 2a 6f 62 l_Obj *const *ob
37a0: 6a 76 29 0a 7b 0a 20 20 20 20 4e 61 6d 65 73 70 jv).{. Namesp
37b0: 61 63 65 20 2a 6e 73 50 74 72 20 3d 20 28 4e 61 ace *nsPtr = (Na
37c0: 6d 65 73 70 61 63 65 20 2a 29 20 54 63 6c 5f 47 mespace *) Tcl_G
37d0: 65 74 43 75 72 72 65 6e 74 4e 61 6d 65 73 70 61 etCurrentNamespa
37e0: 63 65 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 ce(interp);.
37f0: 54 63 6c 5f 48 61 73 68 53 65 61 72 63 68 20 73 Tcl_HashSearch s
3800: 65 61 72 63 68 3b 0a 20 20 20 20 54 63 6c 5f 48 earch;. Tcl_H
3810: 61 73 68 45 6e 74 72 79 20 2a 68 50 74 72 3b 0a ashEntry *hPtr;.
3820: 20 20 20 20 69 6e 74 20 73 6f 75 67 68 74 4c 65 int soughtLe
3830: 6e 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 n;. const cha
3840: 72 20 2a 73 6f 75 67 68 74 53 74 72 2c 20 2a 6d r *soughtStr, *m
3850: 61 74 63 68 65 64 53 74 72 20 3d 20 4e 55 4c 4c atchedStr = NULL
3860: 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 ;.. if (objc
3870: 3c 20 32 29 20 7b 0a 09 54 63 6c 5f 53 65 74 4f < 2) {..Tcl_SetO
3880: 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c bjResult(interp,
3890: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
38a0: 6a 28 0a 09 09 22 62 61 64 20 63 61 6c 6c 20 6f j(..."bad call o
38b0: 66 20 75 6e 6b 6e 6f 77 6e 20 68 61 6e 64 6c 65 f unknown handle
38c0: 72 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 53 r", -1));..Tcl_S
38d0: 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 etErrorCode(inte
38e0: 72 70 2c 20 22 54 43 4c 22 2c 20 22 4f 4f 22 2c rp, "TCL", "OO",
38f0: 20 22 42 41 44 5f 55 4e 4b 4e 4f 57 4e 22 2c 20 "BAD_UNKNOWN",
3900: 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 NULL);..return T
3910: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a CL_ERROR;. }.
3920: 20 20 20 20 69 66 20 28 54 63 6c 4f 4f 47 65 74 if (TclOOGet
3930: 44 65 66 69 6e 65 43 6d 64 43 6f 6e 74 65 78 74 DefineCmdContext
3940: 28 69 6e 74 65 72 70 29 20 3d 3d 20 4e 55 4c 4c (interp) == NULL
3950: 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f ) {..return TCL_
3960: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 ERROR;. }..
3970: 20 20 73 6f 75 67 68 74 53 74 72 20 3d 20 54 63 soughtStr = Tc
3980: 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 6f 6d 4f l_GetStringFromO
3990: 62 6a 28 6f 62 6a 76 5b 31 5d 2c 20 26 73 6f 75 bj(objv[1], &sou
39a0: 67 68 74 4c 65 6e 29 3b 0a 20 20 20 20 69 66 20 ghtLen);. if
39b0: 28 73 6f 75 67 68 74 4c 65 6e 20 3d 3d 20 30 29 (soughtLen == 0)
39c0: 20 7b 0a 09 67 6f 74 6f 20 6e 6f 4d 61 74 63 68 {..goto noMatch
39d0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 68 50 74 72 ;. }. hPtr
39e0: 20 3d 20 54 63 6c 5f 46 69 72 73 74 48 61 73 68 = Tcl_FirstHash
39f0: 45 6e 74 72 79 28 26 6e 73 50 74 72 2d 3e 63 6d Entry(&nsPtr->cm
3a00: 64 54 61 62 6c 65 2c 20 26 73 65 61 72 63 68 29 dTable, &search)
3a10: 3b 0a 20 20 20 20 77 68 69 6c 65 20 28 68 50 74 ;. while (hPt
3a20: 72 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 63 6f r != NULL) {..co
3a30: 6e 73 74 20 63 68 61 72 20 2a 6e 61 6d 65 53 74 nst char *nameSt
3a40: 72 20 3d 20 54 63 6c 5f 47 65 74 48 61 73 68 4b r = Tcl_GetHashK
3a50: 65 79 28 26 6e 73 50 74 72 2d 3e 63 6d 64 54 61 ey(&nsPtr->cmdTa
3a60: 62 6c 65 2c 20 68 50 74 72 29 3b 0a 0a 09 69 66 ble, hPtr);...if
3a70: 20 28 73 74 72 6e 63 6d 70 28 73 6f 75 67 68 74 (strncmp(sought
3a80: 53 74 72 2c 20 6e 61 6d 65 53 74 72 2c 20 73 6f Str, nameStr, so
3a90: 75 67 68 74 4c 65 6e 29 20 3d 3d 20 30 29 20 7b ughtLen) == 0) {
3aa0: 0a 09 20 20 20 20 69 66 20 28 6d 61 74 63 68 65 .. if (matche
3ab0: 64 53 74 72 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a dStr != NULL) {.
3ac0: 09 09 67 6f 74 6f 20 6e 6f 4d 61 74 63 68 3b 0a ..goto noMatch;.
3ad0: 09 20 20 20 20 7d 0a 09 20 20 20 20 6d 61 74 63 . }.. matc
3ae0: 68 65 64 53 74 72 20 3d 20 6e 61 6d 65 53 74 72 hedStr = nameStr
3af0: 3b 0a 09 7d 0a 09 68 50 74 72 20 3d 20 54 63 6c ;..}..hPtr = Tcl
3b00: 5f 4e 65 78 74 48 61 73 68 45 6e 74 72 79 28 26 _NextHashEntry(&
3b10: 73 65 61 72 63 68 29 3b 0a 20 20 20 20 7d 0a 0a search);. }..
3b20: 20 20 20 20 69 66 20 28 6d 61 74 63 68 65 64 53 if (matchedS
3b30: 74 72 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 2f tr != NULL) {../
3b40: 2a 0a 09 20 2a 20 47 6f 74 20 6f 6e 65 20 6d 61 *.. * Got one ma
3b50: 74 63 68 2c 20 61 6e 64 20 6f 6e 6c 79 20 6f 6e tch, and only on
3b60: 65 20 6d 61 74 63 68 21 0a 09 20 2a 2f 0a 0a 09 e match!.. */...
3b70: 54 63 6c 5f 4f 62 6a 20 2a 2a 6e 65 77 4f 62 6a Tcl_Obj **newObj
3b80: 76 20 3d 20 54 63 6c 53 74 61 63 6b 41 6c 6c 6f v = TclStackAllo
3b90: 63 28 69 6e 74 65 72 70 2c 20 73 69 7a 65 6f 66 c(interp, sizeof
3ba0: 28 54 63 6c 5f 4f 62 6a 2a 29 2a 28 6f 62 6a 63 (Tcl_Obj*)*(objc
3bb0: 2d 31 29 29 3b 0a 09 69 6e 74 20 72 65 73 75 6c -1));..int resul
3bc0: 74 3b 0a 0a 09 6e 65 77 4f 62 6a 76 5b 30 5d 20 t;...newObjv[0]
3bd0: 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f = Tcl_NewStringO
3be0: 62 6a 28 6d 61 74 63 68 65 64 53 74 72 2c 20 2d bj(matchedStr, -
3bf0: 31 29 3b 0a 09 54 63 6c 5f 49 6e 63 72 52 65 66 1);..Tcl_IncrRef
3c00: 43 6f 75 6e 74 28 6e 65 77 4f 62 6a 76 5b 30 5d Count(newObjv[0]
3c10: 29 3b 0a 09 69 66 20 28 6f 62 6a 63 20 3e 20 32 );..if (objc > 2
3c20: 29 20 7b 0a 09 20 20 20 20 6d 65 6d 63 70 79 28 ) {.. memcpy(
3c30: 6e 65 77 4f 62 6a 76 2b 31 2c 20 6f 62 6a 76 2b newObjv+1, objv+
3c40: 32 2c 20 73 69 7a 65 6f 66 28 54 63 6c 5f 4f 62 2, sizeof(Tcl_Ob
3c50: 6a 20 2a 29 20 2a 20 28 6f 62 6a 63 2d 32 29 29 j *) * (objc-2))
3c60: 3b 0a 09 7d 0a 09 72 65 73 75 6c 74 20 3d 20 54 ;..}..result = T
3c70: 63 6c 5f 45 76 61 6c 4f 62 6a 76 28 69 6e 74 65 cl_EvalObjv(inte
3c80: 72 70 2c 20 6f 62 6a 63 2d 31 2c 20 6e 65 77 4f rp, objc-1, newO
3c90: 62 6a 76 2c 20 30 29 3b 0a 09 54 63 6c 5f 44 65 bjv, 0);..Tcl_De
3ca0: 63 72 52 65 66 43 6f 75 6e 74 28 6e 65 77 4f 62 crRefCount(newOb
3cb0: 6a 76 5b 30 5d 29 3b 0a 09 54 63 6c 53 74 61 63 jv[0]);..TclStac
3cc0: 6b 46 72 65 65 28 69 6e 74 65 72 70 2c 20 6e 65 kFree(interp, ne
3cd0: 77 4f 62 6a 76 29 3b 0a 09 72 65 74 75 72 6e 20 wObjv);..return
3ce0: 72 65 73 75 6c 74 3b 0a 20 20 20 20 7d 0a 0a 20 result;. }..
3cf0: 20 6e 6f 4d 61 74 63 68 3a 0a 20 20 20 20 54 63 noMatch:. Tc
3d00: 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 l_SetObjResult(i
3d10: 6e 74 65 72 70 2c 20 54 63 6c 5f 4f 62 6a 50 72 nterp, Tcl_ObjPr
3d20: 69 6e 74 66 28 0a 09 20 20 20 20 22 69 6e 76 61 intf(.. "inva
3d30: 6c 69 64 20 63 6f 6d 6d 61 6e 64 20 6e 61 6d 65 lid command name
3d40: 20 5c 22 25 73 5c 22 22 2c 20 73 6f 75 67 68 74 \"%s\"", sought
3d50: 53 74 72 29 29 3b 0a 20 20 20 20 54 63 6c 5f 53 Str));. Tcl_S
3d60: 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 etErrorCode(inte
3d70: 72 70 2c 20 22 54 43 4c 22 2c 20 22 4c 4f 4f 4b rp, "TCL", "LOOK
3d80: 55 50 22 2c 20 22 43 4f 4d 4d 41 4e 44 22 2c 20 UP", "COMMAND",
3d90: 73 6f 75 67 68 74 53 74 72 2c 20 4e 55 4c 4c 29 soughtStr, NULL)
3da0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c ;. return TCL
3db0: 5f 45 52 52 4f 52 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 _ERROR;.}.../*.
3dc0: 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d * --------------
3dd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3de0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3df0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3e00: 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 46 --------. *. * F
3e10: 69 6e 64 43 6f 6d 6d 61 6e 64 20 2d 2d 0a 20 2a indCommand --. *
3e20: 09 53 70 65 63 69 61 6c 69 7a 65 64 20 76 65 72 .Specialized ver
3e30: 73 69 6f 6e 20 6f 66 20 54 63 6c 5f 46 69 6e 64 sion of Tcl_Find
3e40: 43 6f 6d 6d 61 6e 64 20 74 68 61 74 20 68 61 6e Command that han
3e50: 64 6c 65 73 20 63 6f 6d 6d 61 6e 64 20 70 72 65 dles command pre
3e60: 66 69 78 65 73 0a 20 2a 09 61 6e 64 20 64 69 73 fixes. *.and dis
3e70: 61 6c 6c 6f 77 73 20 6e 61 6d 65 73 70 61 63 65 allows namespace
3e80: 20 6d 61 67 69 63 2e 0a 20 2a 0a 20 2a 20 2d 2d magic.. *. * --
3e90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3ea0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3eb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3ec0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3ed0: 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 ----. */..static
3ee0: 20 54 63 6c 5f 43 6f 6d 6d 61 6e 64 0a 46 69 6e Tcl_Command.Fin
3ef0: 64 43 6f 6d 6d 61 6e 64 28 0a 20 20 20 20 54 63 dCommand(. Tc
3f00: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 l_Interp *interp
3f10: 2c 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 73 ,. Tcl_Obj *s
3f20: 74 72 69 6e 67 4f 62 6a 2c 0a 20 20 20 20 54 63 tringObj,. Tc
3f30: 6c 5f 4e 61 6d 65 73 70 61 63 65 20 2a 63 6f 6e l_Namespace *con
3f40: 73 74 20 6e 61 6d 65 73 70 61 63 65 50 74 72 29 st namespacePtr)
3f50: 0a 7b 0a 20 20 20 20 69 6e 74 20 6c 65 6e 67 74 .{. int lengt
3f60: 68 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 h;. const cha
3f70: 72 20 2a 6e 61 6d 65 53 74 72 2c 20 2a 73 74 72 r *nameStr, *str
3f80: 69 6e 67 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 ing = Tcl_GetStr
3f90: 69 6e 67 46 72 6f 6d 4f 62 6a 28 73 74 72 69 6e ingFromObj(strin
3fa0: 67 4f 62 6a 2c 20 26 6c 65 6e 67 74 68 29 3b 0a gObj, &length);.
3fb0: 20 20 20 20 72 65 67 69 73 74 65 72 20 4e 61 6d register Nam
3fc0: 65 73 70 61 63 65 20 2a 63 6f 6e 73 74 20 6e 73 espace *const ns
3fd0: 50 74 72 20 3d 20 28 4e 61 6d 65 73 70 61 63 65 Ptr = (Namespace
3fe0: 20 2a 29 20 6e 61 6d 65 73 70 61 63 65 50 74 72 *) namespacePtr
3ff0: 3b 0a 20 20 20 20 46 4f 52 45 41 43 48 5f 48 41 ;. FOREACH_HA
4000: 53 48 5f 44 45 43 4c 53 3b 0a 20 20 20 20 54 63 SH_DECLS;. Tc
4010: 6c 5f 43 6f 6d 6d 61 6e 64 20 63 6d 64 2c 20 63 l_Command cmd, c
4020: 6d 64 32 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 md2;.. /*.
4030: 20 20 2a 20 49 66 20 73 6f 6d 65 6f 6e 65 20 69 * If someone i
4040: 73 20 70 6c 61 79 69 6e 67 20 67 61 6d 65 73 2c s playing games,
4050: 20 77 65 20 73 74 6f 70 20 70 6c 61 79 69 6e 67 we stop playing
4060: 20 72 69 67 68 74 20 6e 6f 77 2e 0a 20 20 20 20 right now..
4070: 20 2a 2f 0a 0a 20 20 20 20 69 66 20 28 73 74 72 */.. if (str
4080: 69 6e 67 5b 30 5d 20 3d 3d 20 27 5c 30 27 20 7c ing[0] == '\0' |
4090: 7c 20 73 74 72 73 74 72 28 73 74 72 69 6e 67 2c | strstr(string,
40a0: 20 22 3a 3a 22 29 20 21 3d 20 4e 55 4c 4c 29 20 "::") != NULL)
40b0: 7b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a {..return NULL;.
40c0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 }.. /*.
40d0: 20 20 20 2a 20 44 6f 20 74 68 65 20 65 78 61 63 * Do the exac
40e0: 74 20 6c 6f 6f 6b 75 70 20 66 69 72 73 74 2e 0a t lookup first..
40f0: 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 63 6d 64 */.. cmd
4100: 20 3d 20 54 63 6c 5f 46 69 6e 64 43 6f 6d 6d 61 = Tcl_FindComma
4110: 6e 64 28 69 6e 74 65 72 70 2c 20 73 74 72 69 6e nd(interp, strin
4120: 67 2c 20 6e 61 6d 65 73 70 61 63 65 50 74 72 2c g, namespacePtr,
4130: 20 54 43 4c 5f 4e 41 4d 45 53 50 41 43 45 5f 4f TCL_NAMESPACE_O
4140: 4e 4c 59 29 3b 0a 20 20 20 20 69 66 20 28 63 6d NLY);. if (cm
4150: 64 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 d != NULL) {..re
4160: 74 75 72 6e 20 63 6d 64 3b 0a 20 20 20 20 7d 0a turn cmd;. }.
4170: 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 42 . /*. * B
4180: 6f 74 68 65 72 2c 20 6e 65 65 64 20 74 6f 20 70 other, need to p
4190: 65 72 66 6f 72 6d 20 61 6e 20 61 70 70 72 6f 78 erform an approx
41a0: 69 6d 61 74 65 20 6d 61 74 63 68 2e 20 49 74 65 imate match. Ite
41b0: 72 61 74 65 20 61 63 72 6f 73 73 20 74 68 65 20 rate across the
41c0: 68 61 73 68 0a 20 20 20 20 20 2a 20 74 61 62 6c hash. * tabl
41d0: 65 20 6f 66 20 63 6f 6d 6d 61 6e 64 73 20 69 6e e of commands in
41e0: 20 74 68 65 20 6e 61 6d 65 73 70 61 63 65 2e 0a the namespace..
41f0: 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 46 4f 52 */.. FOR
4200: 45 41 43 48 5f 48 41 53 48 28 6e 61 6d 65 53 74 EACH_HASH(nameSt
4210: 72 2c 20 63 6d 64 32 2c 20 26 6e 73 50 74 72 2d r, cmd2, &nsPtr-
4220: 3e 63 6d 64 54 61 62 6c 65 29 20 7b 0a 09 69 66 >cmdTable) {..if
4230: 20 28 73 74 72 6e 63 6d 70 28 73 74 72 69 6e 67 (strncmp(string
4240: 2c 20 6e 61 6d 65 53 74 72 2c 20 6c 65 6e 67 74 , nameStr, lengt
4250: 68 29 20 3d 3d 20 30 29 20 7b 0a 09 20 20 20 20 h) == 0) {..
4260: 69 66 20 28 63 6d 64 20 21 3d 20 4e 55 4c 4c 29 if (cmd != NULL)
4270: 20 7b 0a 09 09 72 65 74 75 72 6e 20 4e 55 4c 4c {...return NULL
4280: 3b 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 63 6d ;.. }.. cm
4290: 64 20 3d 20 63 6d 64 32 3b 0a 09 7d 0a 20 20 20 d = cmd2;..}.
42a0: 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 }.. /*.
42b0: 2a 20 45 69 74 68 65 72 20 77 65 20 66 6f 75 6e * Either we foun
42c0: 64 20 6f 6e 65 20 74 68 69 6e 67 20 6f 72 20 77 d one thing or w
42d0: 65 20 66 6f 75 6e 64 20 6e 6f 74 68 69 6e 67 2e e found nothing.
42e0: 20 45 69 74 68 65 72 20 77 61 79 2c 20 72 65 74 Either way, ret
42f0: 75 72 6e 20 69 74 2e 0a 20 20 20 20 20 2a 2f 0a urn it.. */.
4300: 0a 20 20 20 20 72 65 74 75 72 6e 20 63 6d 64 3b . return cmd;
4310: 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 20 2d 2d 2d 2d 2d .}.../*. * -----
4320: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4330: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4340: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4350: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4360: 2d 0a 20 2a 0a 20 2a 20 49 6e 69 74 44 65 66 69 -. *. * InitDefi
4370: 6e 65 43 6f 6e 74 65 78 74 20 2d 2d 0a 20 2a 09 neContext --. *.
4380: 44 6f 65 73 20 74 68 65 20 6d 61 67 69 63 20 69 Does the magic i
4390: 6e 63 61 6e 74 61 74 69 6f 6e 73 20 6e 65 63 65 ncantations nece
43a0: 73 73 61 72 79 20 74 6f 20 70 75 73 68 20 74 68 ssary to push th
43b0: 65 20 73 70 65 63 69 61 6c 20 73 74 61 63 6b 20 e special stack
43c0: 66 72 61 6d 65 0a 20 2a 09 75 73 65 64 20 77 68 frame. *.used wh
43d0: 65 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 6f 62 en processing ob
43e0: 6a 65 63 74 20 64 65 66 69 6e 69 74 69 6f 6e 73 ject definitions
43f0: 2e 20 49 74 20 69 73 20 75 70 20 74 6f 20 74 68 . It is up to th
4400: 65 20 63 61 6c 6c 65 72 20 74 6f 0a 20 2a 09 64 e caller to. *.d
4410: 69 73 70 6f 73 65 20 6f 66 20 74 68 65 20 66 72 ispose of the fr
4420: 61 6d 65 20 28 77 69 74 68 20 54 63 6c 50 6f 70 ame (with TclPop
4430: 53 74 61 63 6b 46 72 61 6d 65 29 20 77 68 65 6e StackFrame) when
4440: 20 66 69 6e 69 73 68 65 64 2e 0a 20 2a 0a 20 2a finished.. *. *
4450: 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ---------------
4460: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4470: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4480: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4490: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 -------. */..sta
44a0: 74 69 63 20 69 6e 6c 69 6e 65 20 69 6e 74 0a 49 tic inline int.I
44b0: 6e 69 74 44 65 66 69 6e 65 43 6f 6e 74 65 78 74 nitDefineContext
44c0: 28 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 (. Tcl_Interp
44d0: 20 2a 69 6e 74 65 72 70 2c 0a 20 20 20 20 54 63 *interp,. Tc
44e0: 6c 5f 4e 61 6d 65 73 70 61 63 65 20 2a 6e 61 6d l_Namespace *nam
44f0: 65 73 70 61 63 65 50 74 72 2c 0a 20 20 20 20 4f espacePtr,. O
4500: 62 6a 65 63 74 20 2a 6f 50 74 72 2c 0a 20 20 20 bject *oPtr,.
4510: 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 20 20 54 int objc,. T
4520: 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 6f 62 cl_Obj *const ob
4530: 6a 76 5b 5d 29 0a 7b 0a 20 20 20 20 43 61 6c 6c jv[]).{. Call
4540: 46 72 61 6d 65 20 2a 66 72 61 6d 65 50 74 72 2c Frame *framePtr,
4550: 20 2a 2a 66 72 61 6d 65 50 74 72 50 74 72 20 3d **framePtrPtr =
4560: 20 26 66 72 61 6d 65 50 74 72 3b 0a 0a 20 20 20 &framePtr;..
4570: 20 69 66 20 28 6e 61 6d 65 73 70 61 63 65 50 74 if (namespacePt
4580: 72 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 r == NULL) {..Tc
4590: 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 l_SetObjResult(i
45a0: 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 53 74 nterp, Tcl_NewSt
45b0: 72 69 6e 67 4f 62 6a 28 0a 09 09 22 63 61 6e 6e ringObj(..."cann
45c0: 6f 74 20 70 72 6f 63 65 73 73 20 64 65 66 69 6e ot process defin
45d0: 69 74 69 6f 6e 73 3b 20 73 75 70 70 6f 72 74 20 itions; support
45e0: 6e 61 6d 65 73 70 61 63 65 20 64 65 6c 65 74 65 namespace delete
45f0: 64 22 2c 0a 09 09 2d 31 29 29 3b 0a 09 54 63 6c d",...-1));..Tcl
4600: 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e _SetErrorCode(in
4610: 74 65 72 70 2c 20 22 54 43 4c 22 2c 20 22 4f 4f terp, "TCL", "OO
4620: 22 2c 20 22 4d 4f 4e 4b 45 59 5f 42 55 53 49 4e ", "MONKEY_BUSIN
4630: 45 53 53 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 ESS", NULL);..re
4640: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
4650: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 66 72 }.. /* fr
4660: 61 6d 65 50 74 72 50 74 72 20 69 73 20 6e 65 65 amePtrPtr is nee
4670: 64 65 64 20 74 6f 20 73 61 74 69 73 66 79 20 47 ded to satisfy G
4680: 43 43 20 33 2e 33 27 73 20 73 74 72 69 63 74 20 CC 3.3's strict
4690: 61 6c 69 61 73 69 6e 67 20 72 75 6c 65 73 20 2a aliasing rules *
46a0: 2f 0a 0a 20 20 20 20 28 76 6f 69 64 29 20 54 63 /.. (void) Tc
46b0: 6c 50 75 73 68 53 74 61 63 6b 46 72 61 6d 65 28 lPushStackFrame(
46c0: 69 6e 74 65 72 70 2c 20 28 54 63 6c 5f 43 61 6c interp, (Tcl_Cal
46d0: 6c 46 72 61 6d 65 20 2a 2a 29 20 66 72 61 6d 65 lFrame **) frame
46e0: 50 74 72 50 74 72 2c 0a 09 20 20 20 20 6e 61 6d PtrPtr,.. nam
46f0: 65 73 70 61 63 65 50 74 72 2c 20 46 52 41 4d 45 espacePtr, FRAME
4700: 5f 49 53 5f 4f 4f 5f 44 45 46 49 4e 45 29 3b 0a _IS_OO_DEFINE);.
4710: 20 20 20 20 66 72 61 6d 65 50 74 72 2d 3e 63 6c framePtr->cl
4720: 69 65 6e 74 44 61 74 61 20 3d 20 6f 50 74 72 3b ientData = oPtr;
4730: 0a 20 20 20 20 66 72 61 6d 65 50 74 72 2d 3e 6f . framePtr->o
4740: 62 6a 63 20 3d 20 6f 62 6a 63 3b 0a 20 20 20 20 bjc = objc;.
4750: 66 72 61 6d 65 50 74 72 2d 3e 6f 62 6a 76 20 3d framePtr->objv =
4760: 20 6f 62 6a 76 3b 09 2f 2a 20 52 65 66 65 72 65 objv;./* Refere
4770: 6e 63 65 20 63 6f 75 6e 74 73 20 64 6f 20 6e 6f nce counts do no
4780: 74 20 6e 65 65 64 20 74 6f 20 62 65 0a 09 09 09 t need to be....
4790: 09 20 2a 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 . * incremented
47a0: 68 65 72 65 2e 20 2a 2f 0a 20 20 20 20 72 65 74 here. */. ret
47b0: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a urn TCL_OK;.}...
47c0: 2f 2a 0a 20 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d /*. * ----------
47d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
47e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
47f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4800: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a ------------. *.
4810: 20 2a 20 54 63 6c 4f 4f 47 65 74 44 65 66 69 6e * TclOOGetDefin
4820: 65 43 6d 64 43 6f 6e 74 65 78 74 20 2d 2d 0a 20 eCmdContext --.
4830: 2a 09 45 78 74 72 61 63 74 73 20 74 68 65 20 6d *.Extracts the m
4840: 61 67 69 63 20 74 6f 6b 65 6e 20 66 72 6f 6d 20 agic token from
4850: 74 68 65 20 63 75 72 72 65 6e 74 20 73 74 61 63 the current stac
4860: 6b 20 66 72 61 6d 65 2c 20 6f 72 20 72 65 74 75 k frame, or retu
4870: 72 6e 73 20 4e 55 4c 4c 0a 20 2a 09 28 61 6e 64 rns NULL. *.(and
4880: 20 6c 65 61 76 65 73 20 61 6e 20 65 72 72 6f 72 leaves an error
4890: 20 6d 65 73 73 61 67 65 29 20 6f 74 68 65 72 77 message) otherw
48a0: 69 73 65 2e 0a 20 2a 0a 20 2a 20 2d 2d 2d 2d 2d ise.. *. * -----
48b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
48c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
48d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
48e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
48f0: 2d 0a 20 2a 2f 0a 0a 54 63 6c 5f 4f 62 6a 65 63 -. */..Tcl_Objec
4900: 74 0a 54 63 6c 4f 4f 47 65 74 44 65 66 69 6e 65 t.TclOOGetDefine
4910: 43 6d 64 43 6f 6e 74 65 78 74 28 0a 20 20 20 20 CmdContext(.
4920: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 Tcl_Interp *inte
4930: 72 70 29 0a 7b 0a 20 20 20 20 49 6e 74 65 72 70 rp).{. Interp
4940: 20 2a 69 50 74 72 20 3d 20 28 49 6e 74 65 72 70 *iPtr = (Interp
4950: 20 2a 29 20 69 6e 74 65 72 70 3b 0a 20 20 20 20 *) interp;.
4960: 54 63 6c 5f 4f 62 6a 65 63 74 20 6f 62 6a 65 63 Tcl_Object objec
4970: 74 3b 0a 0a 20 20 20 20 69 66 20 28 28 69 50 74 t;.. if ((iPt
4980: 72 2d 3e 76 61 72 46 72 61 6d 65 50 74 72 20 3d r->varFramePtr =
4990: 3d 20 4e 55 4c 4c 29 0a 09 20 20 20 20 7c 7c 20 = NULL).. ||
49a0: 28 69 50 74 72 2d 3e 76 61 72 46 72 61 6d 65 50 (iPtr->varFrameP
49b0: 74 72 2d 3e 69 73 50 72 6f 63 43 61 6c 6c 46 72 tr->isProcCallFr
49c0: 61 6d 65 20 21 3d 20 46 52 41 4d 45 5f 49 53 5f ame != FRAME_IS_
49d0: 4f 4f 5f 44 45 46 49 4e 45 29 29 20 7b 0a 09 54 OO_DEFINE)) {..T
49e0: 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 cl_SetObjResult(
49f0: 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 53 interp, Tcl_NewS
4a00: 74 72 69 6e 67 4f 62 6a 28 0a 09 09 22 74 68 69 tringObj(..."thi
4a10: 73 20 63 6f 6d 6d 61 6e 64 20 6d 61 79 20 6f 6e s command may on
4a20: 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 66 72 6f ly be called fro
4a30: 6d 20 77 69 74 68 69 6e 20 74 68 65 20 63 6f 6e m within the con
4a40: 74 65 78 74 20 6f 66 22 0a 09 09 22 20 61 6e 20 text of"..." an
4a50: 3a 3a 6f 6f 3a 3a 64 65 66 69 6e 65 20 6f 72 20 ::oo::define or
4a60: 3a 3a 6f 6f 3a 3a 6f 62 6a 64 65 66 69 6e 65 20 ::oo::objdefine
4a70: 63 6f 6d 6d 61 6e 64 22 2c 20 2d 31 29 29 3b 0a command", -1));.
4a80: 09 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 .Tcl_SetErrorCod
4a90: 65 28 69 6e 74 65 72 70 2c 20 22 54 43 4c 22 2c e(interp, "TCL",
4aa0: 20 22 4f 4f 22 2c 20 22 4d 4f 4e 4b 45 59 5f 42 "OO", "MONKEY_B
4ab0: 55 53 49 4e 45 53 53 22 2c 20 4e 55 4c 4c 29 3b USINESS", NULL);
4ac0: 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 ..return NULL;.
4ad0: 20 20 20 7d 0a 20 20 20 20 6f 62 6a 65 63 74 20 }. object
4ae0: 3d 20 69 50 74 72 2d 3e 76 61 72 46 72 61 6d 65 = iPtr->varFrame
4af0: 50 74 72 2d 3e 63 6c 69 65 6e 74 44 61 74 61 3b Ptr->clientData;
4b00: 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 4f 62 6a . if (Tcl_Obj
4b10: 65 63 74 44 65 6c 65 74 65 64 28 6f 62 6a 65 63 ectDeleted(objec
4b20: 74 29 29 20 7b 0a 09 54 63 6c 5f 53 65 74 4f 62 t)) {..Tcl_SetOb
4b30: 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 jResult(interp,
4b40: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
4b50: 28 0a 09 09 22 74 68 69 73 20 63 6f 6d 6d 61 6e (..."this comman
4b60: 64 20 63 61 6e 6e 6f 74 20 62 65 20 63 61 6c 6c d cannot be call
4b70: 65 64 20 77 68 65 6e 20 74 68 65 20 6f 62 6a 65 ed when the obje
4b80: 63 74 20 68 61 73 20 62 65 65 6e 22 0a 09 09 22 ct has been"..."
4b90: 20 64 65 6c 65 74 65 64 22 2c 20 2d 31 29 29 3b deleted", -1));
4ba0: 0a 09 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f ..Tcl_SetErrorCo
4bb0: 64 65 28 69 6e 74 65 72 70 2c 20 22 54 43 4c 22 de(interp, "TCL"
4bc0: 2c 20 22 4f 4f 22 2c 20 22 4d 4f 4e 4b 45 59 5f , "OO", "MONKEY_
4bd0: 42 55 53 49 4e 45 53 53 22 2c 20 4e 55 4c 4c 29 BUSINESS", NULL)
4be0: 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a ;..return NULL;.
4bf0: 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e }. return
4c00: 20 6f 62 6a 65 63 74 3b 0a 7d 0a 0c 0a 2f 2a 0a object;.}.../*.
4c10: 20 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d * -------------
4c20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4c30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4c40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4c50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 ---------. *. *
4c60: 47 65 74 43 6c 61 73 73 49 6e 4f 75 74 65 72 43 GetClassInOuterC
4c70: 6f 6e 74 65 78 74 20 2d 2d 0a 20 2a 09 57 72 61 ontext --. *.Wra
4c80: 70 70 65 72 20 72 6f 75 6e 64 20 54 63 6c 5f 47 pper round Tcl_G
4c90: 65 74 4f 62 6a 65 63 74 46 72 6f 6d 4f 62 6a 20 etObjectFromObj
4ca0: 74 6f 20 70 65 72 66 6f 72 6d 20 74 68 65 20 6c to perform the l
4cb0: 6f 6f 6b 75 70 20 69 6e 20 74 68 65 0a 20 2a 09 ookup in the. *.
4cc0: 63 6f 6e 74 65 78 74 20 74 68 61 74 20 63 61 6c context that cal
4cd0: 6c 65 64 20 6f 6f 3a 3a 64 65 66 69 6e 65 20 28 led oo::define (
4ce0: 6f 72 20 65 71 75 69 76 61 6c 65 6e 74 29 2e 20 or equivalent).
4cf0: 4e 6f 74 65 20 74 68 61 74 20 74 68 69 73 20 6d Note that this m
4d00: 61 79 0a 20 2a 09 68 61 76 65 20 74 6f 20 67 6f ay. *.have to go
4d10: 20 75 70 20 6d 75 6c 74 69 70 6c 65 20 6c 65 76 up multiple lev
4d20: 65 6c 73 20 74 6f 20 67 65 74 20 74 68 65 20 6c els to get the l
4d30: 65 76 65 6c 20 74 68 61 74 20 77 65 20 73 74 61 evel that we sta
4d40: 72 74 65 64 20 64 6f 69 6e 67 0a 20 2a 09 64 65 rted doing. *.de
4d50: 66 69 6e 69 74 69 6f 6e 73 20 61 74 2e 0a 20 2a finitions at.. *
4d60: 0a 20 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . * ------------
4d70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4d80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4d90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
4da0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a ----------. */..
4db0: 73 74 61 74 69 63 20 69 6e 6c 69 6e 65 20 43 6c static inline Cl
4dc0: 61 73 73 20 2a 0a 47 65 74 43 6c 61 73 73 49 6e ass *.GetClassIn
4dd0: 4f 75 74 65 72 43 6f 6e 74 65 78 74 28 0a 20 20 OuterContext(.
4de0: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e Tcl_Interp *in
4df0: 74 65 72 70 2c 0a 20 20 20 20 54 63 6c 5f 4f 62 terp,. Tcl_Ob
4e00: 6a 20 2a 63 6c 61 73 73 4e 61 6d 65 2c 0a 20 20 j *className,.
4e10: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 65 72 const char *er
4e20: 72 4d 73 67 29 0a 7b 0a 20 20 20 20 49 6e 74 65 rMsg).{. Inte
4e30: 72 70 20 2a 69 50 74 72 20 3d 20 28 49 6e 74 65 rp *iPtr = (Inte
4e40: 72 70 20 2a 29 20 69 6e 74 65 72 70 3b 0a 20 20 rp *) interp;.
4e50: 20 20 4f 62 6a 65 63 74 20 2a 6f 50 74 72 3b 0a Object *oPtr;.
4e60: 20 20 20 20 43 61 6c 6c 46 72 61 6d 65 20 2a 73 CallFrame *s
4e70: 61 76 65 64 46 72 61 6d 65 50 74 72 20 3d 20 69 avedFramePtr = i
4e80: 50 74 72 2d 3e 76 61 72 46 72 61 6d 65 50 74 72 Ptr->varFramePtr
4e90: 3b 0a 0a 20 20 20 20 77 68 69 6c 65 20 28 69 50 ;.. while (iP
4ea0: 74 72 2d 3e 76 61 72 46 72 61 6d 65 50 74 72 2d tr->varFramePtr-
4eb0: 3e 69 73 50 72 6f 63 43 61 6c 6c 46 72 61 6d 65 >isProcCallFrame
4ec0: 20 3d 3d 20 46 52 41 4d 45 5f 49 53 5f 4f 4f 5f == FRAME_IS_OO_
4ed0: 44 45 46 49 4e 45 29 20 7b 0a 09 69 66 20 28 69 DEFINE) {..if (i
4ee0: 50 74 72 2d 3e 76 61 72 46 72 61 6d 65 50 74 72 Ptr->varFramePtr
4ef0: 2d 3e 63 61 6c 6c 65 72 56 61 72 50 74 72 20 3d ->callerVarPtr =
4f00: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 20 20 54 = NULL) {.. T
4f10: 63 6c 5f 50 61 6e 69 63 28 22 67 65 74 74 69 6e cl_Panic("gettin
4f20: 67 20 6f 75 74 65 72 20 63 6f 6e 74 65 78 74 20 g outer context
4f30: 77 68 65 6e 20 61 6c 72 65 61 64 79 20 69 6e 20 when already in
4f40: 67 6c 6f 62 61 6c 20 63 6f 6e 74 65 78 74 22 29 global context")
4f50: 3b 0a 09 7d 0a 09 69 50 74 72 2d 3e 76 61 72 46 ;..}..iPtr->varF
4f60: 72 61 6d 65 50 74 72 20 3d 20 69 50 74 72 2d 3e ramePtr = iPtr->
4f70: 76 61 72 46 72 61 6d 65 50 74 72 2d 3e 63 61 6c varFramePtr->cal
4f80: 6c 65 72 56 61 72 50 74 72 3b 0a 20 20 20 20 7d lerVarPtr;. }
4f90: 0a 20 20 20 20 6f 50 74 72 20 3d 20 28 4f 62 6a . oPtr = (Obj
4fa0: 65 63 74 20 2a 29 20 54 63 6c 5f 47 65 74 4f 62 ect *) Tcl_GetOb
4fb0: 6a 65 63 74 46 72 6f 6d 4f 62 6a 28 69 6e 74 65 jectFromObj(inte
4fc0: 72 70 2c 20 63 6c 61 73 73 4e 61 6d 65 29 3b 0a rp, className);.
4fd0: 20 20 20 20 69 50 74 72 2d 3e 76 61 72 46 72 61 iPtr->varFra
4fe0: 6d 65 50 74 72 20 3d 20 73 61 76 65 64 46 72 61 mePtr = savedFra
4ff0: 6d 65 50 74 72 3b 0a 20 20 20 20 69 66 20 28 6f mePtr;. if (o
5000: 50 74 72 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 Ptr == NULL) {..
5010: 72 65 74 75 72 6e 20 4e 55 4c 4c 3b 0a 20 20 20 return NULL;.
5020: 20 7d 0a 20 20 20 20 69 66 20 28 6f 50 74 72 2d }. if (oPtr-
5030: 3e 63 6c 61 73 73 50 74 72 20 3d 3d 20 4e 55 4c >classPtr == NUL
5040: 4c 29 20 7b 0a 09 54 63 6c 5f 53 65 74 4f 62 6a L) {..Tcl_SetObj
5050: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 Result(interp, T
5060: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
5070: 65 72 72 4d 73 67 2c 20 2d 31 29 29 3b 0a 09 54 errMsg, -1));..T
5080: 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 cl_SetErrorCode(
5090: 69 6e 74 65 72 70 2c 20 22 54 43 4c 22 2c 20 22 interp, "TCL", "
50a0: 4c 4f 4f 4b 55 50 22 2c 20 22 43 4c 41 53 53 22 LOOKUP", "CLASS"
50b0: 2c 0a 09 09 54 63 6c 47 65 74 53 74 72 69 6e 67 ,...TclGetString
50c0: 28 63 6c 61 73 73 4e 61 6d 65 29 2c 20 4e 55 4c (className), NUL
50d0: 4c 29 3b 0a 09 72 65 74 75 72 6e 20 4e 55 4c 4c L);..return NULL
50e0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 ;. }. retu
50f0: 72 6e 20 6f 50 74 72 2d 3e 63 6c 61 73 73 50 74 rn oPtr->classPt
5100: 72 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 20 2d 2d 2d r;.}.../*. * ---
5110: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5120: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5130: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5140: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5150: 2d 2d 2d 0a 20 2a 0a 20 2a 20 47 65 6e 65 72 61 ---. *. * Genera
5160: 74 65 45 72 72 6f 72 49 6e 66 6f 20 2d 2d 0a 20 teErrorInfo --.
5170: 2a 09 46 61 63 74 6f 72 65 64 20 6f 75 74 20 63 *.Factored out c
5180: 6f 64 65 20 74 6f 20 67 65 6e 65 72 61 74 65 20 ode to generate
5190: 70 61 72 74 20 6f 66 20 74 68 65 20 65 72 72 6f part of the erro
51a0: 72 20 74 72 61 63 65 20 6d 65 73 73 61 67 65 73 r trace messages
51b0: 2e 0a 20 2a 0a 20 2a 20 2d 2d 2d 2d 2d 2d 2d 2d .. *. * --------
51c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
51d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
51e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
51f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
5200: 2a 2f 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 0a */..static void.
5210: 47 65 6e 65 72 61 74 65 45 72 72 6f 72 49 6e 66 GenerateErrorInf
5220: 6f 28 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 o(. Tcl_Inter
5230: 70 20 2a 69 6e 74 65 72 70 2c 09 09 2f 2a 20 57 p *interp,../* W
5240: 68 65 72 65 20 74 6f 20 73 74 6f 72 65 20 74 68 here to store th
5250: 65 20 65 72 72 6f 72 20 69 6e 66 6f 20 74 72 61 e error info tra
5260: 63 65 2e 20 2a 2f 0a 20 20 20 20 4f 62 6a 65 63 ce. */. Objec
5270: 74 20 2a 6f 50 74 72 2c 09 09 2f 2a 20 57 68 61 t *oPtr,../* Wha
5280: 74 20 6f 62 6a 65 63 74 20 28 6f 72 20 63 6c 61 t object (or cla
5290: 73 73 29 20 77 61 73 20 62 65 69 6e 67 20 63 6f ss) was being co
52a0: 6e 66 69 67 75 72 65 64 0a 09 09 09 09 20 2a 20 nfigured..... *
52b0: 77 68 65 6e 20 74 68 65 20 65 72 72 6f 72 20 6f when the error o
52c0: 63 63 75 72 72 65 64 3f 20 2a 2f 0a 20 20 20 20 ccurred? */.
52d0: 54 63 6c 5f 4f 62 6a 20 2a 73 61 76 65 64 4e 61 Tcl_Obj *savedNa
52e0: 6d 65 4f 62 6a 2c 09 2f 2a 20 4e 61 6d 65 20 6f meObj,./* Name o
52f0: 66 20 6f 62 6a 65 63 74 20 73 61 76 65 64 20 66 f object saved f
5300: 72 6f 6d 20 62 65 66 6f 72 65 20 73 63 72 69 70 rom before scrip
5310: 74 20 77 61 73 0a 09 09 09 09 20 2a 20 65 76 61 t was..... * eva
5320: 6c 75 61 74 65 64 2c 20 77 68 69 63 68 20 69 73 luated, which is
5330: 20 6e 65 65 64 65 64 20 69 66 20 74 68 65 20 6f needed if the o
5340: 62 6a 65 63 74 0a 09 09 09 09 20 2a 20 67 6f 65 bject..... * goe
5350: 73 20 61 77 61 79 20 70 61 72 74 20 77 61 79 20 s away part way
5360: 74 68 72 6f 75 67 68 20 65 78 65 63 75 74 69 6f through executio
5370: 6e 2e 20 4f 54 4f 48 2c 0a 09 09 09 09 20 2a 20 n. OTOH,..... *
5380: 69 66 20 74 68 65 20 6f 62 6a 65 63 74 20 69 73 if the object is
5390: 6e 27 74 20 64 65 6c 65 74 65 64 20 74 68 65 6e n't deleted then
53a0: 20 69 74 73 0a 09 09 09 09 20 2a 20 63 75 72 72 its..... * curr
53b0: 65 6e 74 20 6e 61 6d 65 20 28 70 6f 73 74 2d 65 ent name (post-e
53c0: 78 65 63 75 74 69 6f 6e 29 20 68 61 73 20 74 6f xecution) has to
53d0: 20 62 65 0a 09 09 09 09 20 2a 20 75 73 65 64 2e be..... * used.
53e0: 20 54 68 69 73 20 6d 61 74 74 65 72 73 2c 20 62 This matters, b
53f0: 65 63 61 75 73 65 20 74 68 65 20 6f 62 6a 65 63 ecause the objec
5400: 74 0a 09 09 09 09 20 2a 20 63 6f 75 6c 64 20 68 t..... * could h
5410: 61 76 65 20 62 65 65 6e 20 72 65 6e 61 6d 65 64 ave been renamed
5420: 2e 2e 2e 20 2a 2f 0a 20 20 20 20 63 6f 6e 73 74 ... */. const
5430: 20 63 68 61 72 20 2a 74 79 70 65 4f 66 53 75 62 char *typeOfSub
5440: 6a 65 63 74 29 09 2f 2a 20 50 61 72 74 20 6f 66 ject)./* Part of
5450: 20 74 68 65 20 6d 65 73 73 61 67 65 2c 20 73 61 the message, sa
5460: 79 69 6e 67 20 77 68 65 74 68 65 72 20 69 74 20 ying whether it
5470: 77 61 73 0a 09 09 09 09 20 2a 20 61 6e 20 6f 62 was..... * an ob
5480: 6a 65 63 74 2c 20 63 6c 61 73 73 20 6f 72 20 63 ject, class or c
5490: 6c 61 73 73 2d 61 73 2d 6f 62 6a 65 63 74 20 74 lass-as-object t
54a0: 68 61 74 0a 09 09 09 09 20 2a 20 77 61 73 20 62 hat..... * was b
54b0: 65 69 6e 67 20 63 6f 6e 66 69 67 75 72 65 64 2e eing configured.
54c0: 20 2a 2f 0a 7b 0a 20 20 20 20 69 6e 74 20 6c 65 */.{. int le
54d0: 6e 67 74 68 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 ngth;. Tcl_Ob
54e0: 6a 20 2a 72 65 61 6c 4e 61 6d 65 4f 62 6a 20 3d j *realNameObj =
54f0: 20 54 63 6c 5f 4f 62 6a 65 63 74 44 65 6c 65 74 Tcl_ObjectDelet
5500: 65 64 28 28 54 63 6c 5f 4f 62 6a 65 63 74 29 20 ed((Tcl_Object)
5510: 6f 50 74 72 29 0a 09 20 20 20 20 3f 20 73 61 76 oPtr).. ? sav
5520: 65 64 4e 61 6d 65 4f 62 6a 20 3a 20 54 63 6c 4f edNameObj : TclO
5530: 4f 4f 62 6a 65 63 74 4e 61 6d 65 28 69 6e 74 65 OObjectName(inte
5540: 72 70 2c 20 6f 50 74 72 29 3b 0a 20 20 20 20 63 rp, oPtr);. c
5550: 6f 6e 73 74 20 63 68 61 72 20 2a 6f 62 6a 4e 61 onst char *objNa
5560: 6d 65 20 3d 20 54 63 6c 5f 47 65 74 53 74 72 69 me = Tcl_GetStri
5570: 6e 67 46 72 6f 6d 4f 62 6a 28 72 65 61 6c 4e 61 ngFromObj(realNa
5580: 6d 65 4f 62 6a 2c 20 26 6c 65 6e 67 74 68 29 3b meObj, &length);
5590: 0a 20 20 20 20 69 6e 74 20 6c 69 6d 69 74 20 3d . int limit =
55a0: 20 4f 42 4a 4e 41 4d 45 5f 4c 45 4e 47 54 48 5f OBJNAME_LENGTH_
55b0: 49 4e 5f 45 52 52 4f 52 49 4e 46 4f 5f 4c 49 4d IN_ERRORINFO_LIM
55c0: 49 54 3b 0a 20 20 20 20 69 6e 74 20 6f 76 65 72 IT;. int over
55d0: 66 6c 6f 77 20 3d 20 28 6c 65 6e 67 74 68 20 3e flow = (length >
55e0: 20 6c 69 6d 69 74 29 3b 0a 0a 20 20 20 20 54 63 limit);.. Tc
55f0: 6c 5f 41 70 70 65 6e 64 4f 62 6a 54 6f 45 72 72 l_AppendObjToErr
5600: 6f 72 49 6e 66 6f 28 69 6e 74 65 72 70 2c 20 54 orInfo(interp, T
5610: 63 6c 5f 4f 62 6a 50 72 69 6e 74 66 28 0a 09 20 cl_ObjPrintf(..
5620: 20 20 20 22 5c 6e 20 20 20 20 28 69 6e 20 64 65 "\n (in de
5630: 66 69 6e 69 74 69 6f 6e 20 73 63 72 69 70 74 20 finition script
5640: 66 6f 72 20 25 73 20 5c 22 25 2e 2a 73 25 73 5c for %s \"%.*s%s\
5650: 22 20 6c 69 6e 65 20 25 64 29 22 2c 0a 09 20 20 " line %d)",..
5660: 20 20 74 79 70 65 4f 66 53 75 62 6a 65 63 74 2c typeOfSubject,
5670: 20 28 6f 76 65 72 66 6c 6f 77 20 3f 20 6c 69 6d (overflow ? lim
5680: 69 74 20 3a 20 6c 65 6e 67 74 68 29 2c 20 6f 62 it : length), ob
5690: 6a 4e 61 6d 65 2c 0a 09 20 20 20 20 28 6f 76 65 jName,.. (ove
56a0: 72 66 6c 6f 77 20 3f 20 22 2e 2e 2e 22 20 3a 20 rflow ? "..." :
56b0: 22 22 29 2c 20 54 63 6c 5f 47 65 74 45 72 72 6f ""), Tcl_GetErro
56c0: 72 4c 69 6e 65 28 69 6e 74 65 72 70 29 29 29 3b rLine(interp)));
56d0: 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 20 2d 2d 2d 2d 2d .}.../*. * -----
56e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
56f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5700: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5710: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5720: 2d 0a 20 2a 0a 20 2a 20 54 63 6c 4f 4f 44 65 66 -. *. * TclOODef
5730: 69 6e 65 4f 62 6a 43 6d 64 20 2d 2d 0a 20 2a 09 ineObjCmd --. *.
5740: 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f Implementation o
5750: 66 20 74 68 65 20 22 6f 6f 3a 3a 64 65 66 69 6e f the "oo::defin
5760: 65 22 20 63 6f 6d 6d 61 6e 64 2e 20 57 6f 72 6b e" command. Work
5770: 73 20 62 79 20 65 66 66 65 63 74 69 76 65 6c 79 s by effectively
5780: 20 64 6f 69 6e 67 0a 20 2a 09 74 68 65 20 73 61 doing. *.the sa
5790: 6d 65 20 61 73 20 27 6e 61 6d 65 73 70 61 63 65 me as 'namespace
57a0: 20 65 76 61 6c 27 2c 20 62 75 74 20 77 69 74 68 eval', but with
57b0: 20 65 78 74 72 61 20 6d 61 67 69 63 20 61 70 70 extra magic app
57c0: 6c 69 65 64 20 73 6f 20 74 68 61 74 20 74 68 65 lied so that the
57d0: 0a 20 2a 09 6f 62 6a 65 63 74 20 74 6f 20 62 65 . *.object to be
57e0: 20 6d 6f 64 69 66 69 65 64 20 69 73 20 6b 6e 6f modified is kno
57f0: 77 6e 20 74 6f 20 74 68 65 20 63 6f 6d 6d 61 6e wn to the comman
5800: 64 73 20 69 6e 20 74 68 65 20 74 61 72 67 65 74 ds in the target
5810: 0a 20 2a 09 6e 61 6d 65 73 70 61 63 65 2e 20 41 . *.namespace. A
5820: 6c 73 6f 20 64 6f 65 73 20 65 6e 73 65 6d 62 6c lso does ensembl
5830: 65 2d 6c 69 6b 65 20 74 72 69 63 6b 73 20 77 69 e-like tricks wi
5840: 74 68 20 64 69 73 70 61 74 63 68 20 73 6f 20 74 th dispatch so t
5850: 68 61 74 20 65 72 72 6f 72 0a 20 2a 09 6d 65 73 hat error. *.mes
5860: 73 61 67 65 73 20 61 72 65 20 63 6c 65 61 72 65 sages are cleare
5870: 72 2e 0a 20 2a 0a 20 2a 20 2d 2d 2d 2d 2d 2d 2d r.. *. * -------
5880: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
5890: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
58a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
58b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
58c0: 20 2a 2f 0a 0a 69 6e 74 0a 54 63 6c 4f 4f 44 65 */..int.TclOODe
58d0: 66 69 6e 65 4f 62 6a 43 6d 64 28 0a 20 20 20 20 fineObjCmd(.
58e0: 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e ClientData clien
58f0: 74 44 61 74 61 2c 0a 20 20 20 20 54 63 6c 5f 49 tData,. Tcl_I
5900: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 nterp *interp,.
5910: 20 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 20 int objc,.
5920: 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 Tcl_Obj *const
5930: 2a 6f 62 6a 76 29 0a 7b 0a 20 20 20 20 46 6f 75 *objv).{. Fou
5940: 6e 64 61 74 69 6f 6e 20 2a 66 50 74 72 20 3d 20 ndation *fPtr =
5950: 54 63 6c 4f 4f 47 65 74 46 6f 75 6e 64 61 74 69 TclOOGetFoundati
5960: 6f 6e 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 on(interp);.
5970: 69 6e 74 20 72 65 73 75 6c 74 3b 0a 20 20 20 20 int result;.
5980: 4f 62 6a 65 63 74 20 2a 6f 50 74 72 3b 0a 0a 20 Object *oPtr;..
5990: 20 20 20 69 66 20 28 6f 62 6a 63 20 3c 20 33 29 if (objc < 3)
59a0: 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d {..Tcl_WrongNum
59b0: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 Args(interp, 1,
59c0: 6f 62 6a 76 2c 20 22 63 6c 61 73 73 4e 61 6d 65 objv, "className
59d0: 20 61 72 67 20 3f 61 72 67 20 2e 2e 2e 3f 22 29 arg ?arg ...?")
59e0: 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 ;..return TCL_ER
59f0: 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ROR;. }..
5a00: 6f 50 74 72 20 3d 20 28 4f 62 6a 65 63 74 20 2a oPtr = (Object *
5a10: 29 20 54 63 6c 5f 47 65 74 4f 62 6a 65 63 74 46 ) Tcl_GetObjectF
5a20: 72 6f 6d 4f 62 6a 28 69 6e 74 65 72 70 2c 20 6f romObj(interp, o
5a30: 62 6a 76 5b 31 5d 29 3b 0a 20 20 20 20 69 66 20 bjv[1]);. if
5a40: 28 6f 50 74 72 20 3d 3d 20 4e 55 4c 4c 29 20 7b (oPtr == NULL) {
5a50: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 ..return TCL_ERR
5a60: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 OR;. }. if
5a70: 20 28 6f 50 74 72 2d 3e 63 6c 61 73 73 50 74 72 (oPtr->classPtr
5a80: 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c == NULL) {..Tcl
5a90: 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e _SetObjResult(in
5aa0: 74 65 72 70 2c 20 54 63 6c 5f 4f 62 6a 50 72 69 terp, Tcl_ObjPri
5ab0: 6e 74 66 28 0a 09 09 22 25 73 20 64 6f 65 73 20 ntf(..."%s does
5ac0: 6e 6f 74 20 72 65 66 65 72 20 74 6f 20 61 20 63 not refer to a c
5ad0: 6c 61 73 73 22 2c 54 63 6c 47 65 74 53 74 72 69 lass",TclGetStri
5ae0: 6e 67 28 6f 62 6a 76 5b 31 5d 29 29 29 3b 0a 09 ng(objv[1])));..
5af0: 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 Tcl_SetErrorCode
5b00: 28 69 6e 74 65 72 70 2c 20 22 54 43 4c 22 2c 20 (interp, "TCL",
5b10: 22 4c 4f 4f 4b 55 50 22 2c 20 22 43 4c 41 53 53 "LOOKUP", "CLASS
5b20: 22 2c 0a 09 09 54 63 6c 47 65 74 53 74 72 69 6e ",...TclGetStrin
5b30: 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 4e 55 4c 4c g(objv[1]), NULL
5b40: 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 );..return TCL_E
5b50: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 RROR;. }..
5b60: 20 2f 2a 0a 20 20 20 20 20 2a 20 4d 61 6b 65 20 /*. * Make
5b70: 74 68 65 20 6f 6f 3a 3a 64 65 66 69 6e 65 20 6e the oo::define n
5b80: 61 6d 65 73 70 61 63 65 20 74 68 65 20 63 75 72 amespace the cur
5b90: 72 65 6e 74 20 6e 61 6d 65 73 70 61 63 65 20 61 rent namespace a
5ba0: 6e 64 20 65 76 61 6c 75 61 74 65 20 74 68 65 0a nd evaluate the.
5bb0: 20 20 20 20 20 2a 20 63 6f 6d 6d 61 6e 64 28 73 * command(s
5bc0: 29 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 ).. */..
5bd0: 69 66 20 28 49 6e 69 74 44 65 66 69 6e 65 43 6f if (InitDefineCo
5be0: 6e 74 65 78 74 28 69 6e 74 65 72 70 2c 20 66 50 ntext(interp, fP
5bf0: 74 72 2d 3e 64 65 66 69 6e 65 4e 73 2c 20 6f 50 tr->defineNs, oP
5c00: 74 72 2c 20 6f 62 6a 63 2c 6f 62 6a 76 29 20 21 tr, objc,objv) !
5c10: 3d 20 54 43 4c 5f 4f 4b 29 7b 0a 09 72 65 74 75 = TCL_OK){..retu
5c20: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 rn TCL_ERROR;.
5c30: 20 20 7d 0a 0a 20 20 20 20 41 64 64 52 65 66 28 }.. AddRef(
5c40: 6f 50 74 72 29 3b 0a 20 20 20 20 69 66 20 28 6f oPtr);. if (o
5c50: 62 6a 63 20 3d 3d 20 33 29 20 7b 0a 09 54 63 6c bjc == 3) {..Tcl
5c60: 5f 4f 62 6a 20 2a 6f 62 6a 4e 61 6d 65 4f 62 6a _Obj *objNameObj
5c70: 20 3d 20 54 63 6c 4f 4f 4f 62 6a 65 63 74 4e 61 = TclOOObjectNa
5c80: 6d 65 28 69 6e 74 65 72 70 2c 20 6f 50 74 72 29 me(interp, oPtr)
5c90: 3b 0a 0a 09 54 63 6c 5f 49 6e 63 72 52 65 66 43 ;...Tcl_IncrRefC
5ca0: 6f 75 6e 74 28 6f 62 6a 4e 61 6d 65 4f 62 6a 29 ount(objNameObj)
5cb0: 3b 0a 09 72 65 73 75 6c 74 20 3d 20 54 63 6c 45 ;..result = TclE
5cc0: 76 61 6c 4f 62 6a 45 78 28 69 6e 74 65 72 70 2c valObjEx(interp,
5cd0: 20 6f 62 6a 76 5b 32 5d 2c 20 30 2c 0a 09 09 28 objv[2], 0,...(
5ce0: 28 49 6e 74 65 72 70 20 2a 29 69 6e 74 65 72 70 (Interp *)interp
5cf0: 29 2d 3e 63 6d 64 46 72 61 6d 65 50 74 72 2c 20 )->cmdFramePtr,
5d00: 32 29 3b 0a 09 69 66 20 28 72 65 73 75 6c 74 20 2);..if (result
5d10: 3d 3d 20 54 43 4c 5f 45 52 52 4f 52 29 20 7b 0a == TCL_ERROR) {.
5d20: 09 20 20 20 20 47 65 6e 65 72 61 74 65 45 72 72 . GenerateErr
5d30: 6f 72 49 6e 66 6f 28 69 6e 74 65 72 70 2c 20 6f orInfo(interp, o
5d40: 50 74 72 2c 20 6f 62 6a 4e 61 6d 65 4f 62 6a 2c Ptr, objNameObj,
5d50: 20 22 63 6c 61 73 73 22 29 3b 0a 09 7d 0a 09 54 "class");..}..T
5d60: 63 6c 44 65 63 72 52 65 66 43 6f 75 6e 74 28 6f clDecrRefCount(o
5d70: 62 6a 4e 61 6d 65 4f 62 6a 29 3b 0a 20 20 20 20 bjNameObj);.
5d80: 7d 20 65 6c 73 65 20 7b 0a 09 54 63 6c 5f 4f 62 } else {..Tcl_Ob
5d90: 6a 20 2a 6f 62 6a 50 74 72 2c 20 2a 6f 62 6a 32 j *objPtr, *obj2
5da0: 50 74 72 2c 20 2a 2a 6f 62 6a 73 3b 0a 09 54 63 Ptr, **objs;..Tc
5db0: 6c 5f 43 6f 6d 6d 61 6e 64 20 63 6d 64 3b 0a 09 l_Command cmd;..
5dc0: 69 6e 74 20 69 73 52 6f 6f 74 2c 20 64 75 6d 6d int isRoot, dumm
5dd0: 79 3b 0a 0a 09 2f 2a 0a 09 20 2a 20 4d 6f 72 65 y;.../*.. * More
5de0: 20 74 68 61 6e 20 6f 6e 65 20 61 72 67 75 6d 65 than one argume
5df0: 6e 74 3a 20 66 69 72 65 20 74 68 65 6d 20 74 68 nt: fire them th
5e00: 72 6f 75 67 68 20 74 68 65 20 65 6e 73 65 6d 62 rough the ensemb
5e10: 6c 65 20 70 72 6f 63 65 73 73 69 6e 67 0a 09 20 le processing..
5e20: 2a 20 65 6e 67 69 6e 65 20 73 6f 20 74 68 61 74 * engine so that
5e30: 20 65 76 65 72 79 74 68 69 6e 67 20 61 70 70 65 everything appe
5e40: 61 72 73 20 74 6f 20 62 65 20 67 6f 6f 64 20 61 ars to be good a
5e50: 6e 64 20 70 72 6f 70 65 72 20 69 6e 20 65 72 72 nd proper in err
5e60: 6f 72 0a 09 20 2a 20 6d 65 73 73 61 67 65 73 2e or.. * messages.
5e70: 20 4e 6f 74 65 20 74 68 61 74 20 77 65 20 63 61 Note that we ca
5e80: 6e 6e 6f 74 20 6a 75 73 74 20 63 6f 6e 63 61 74 nnot just concat
5e90: 65 6e 61 74 65 20 61 6e 64 20 73 65 6e 64 20 74 enate and send t
5ea0: 68 72 6f 75 67 68 0a 09 20 2a 20 54 63 6c 5f 45 hrough.. * Tcl_E
5eb0: 76 61 6c 4f 62 6a 45 78 2c 20 61 73 20 74 68 61 valObjEx, as tha
5ec0: 74 20 64 6f 65 73 6e 27 74 20 64 6f 20 65 6e 73 t doesn't do ens
5ed0: 65 6d 62 6c 65 20 70 72 6f 63 65 73 73 69 6e 67 emble processing
5ee0: 2c 20 61 6e 64 20 77 65 0a 09 20 2a 20 63 61 6e , and we.. * can
5ef0: 6e 6f 74 20 67 6f 20 74 68 72 6f 75 67 68 20 54 not go through T
5f00: 63 6c 5f 45 76 61 6c 4f 62 6a 76 20 77 69 74 68 cl_EvalObjv with
5f10: 6f 75 74 20 74 68 65 20 65 78 74 72 61 20 77 6f out the extra wo
5f20: 72 6b 20 74 6f 20 70 72 65 2d 66 69 6e 64 0a 09 rk to pre-find..
5f30: 20 2a 20 74 68 65 20 63 6f 6d 6d 61 6e 64 2c 20 * the command,
5f40: 61 73 20 74 68 61 74 20 66 69 6e 64 73 20 63 6f as that finds co
5f50: 6d 6d 61 6e 64 20 6e 61 6d 65 73 20 69 6e 20 74 mmand names in t
5f60: 68 65 20 77 72 6f 6e 67 20 6e 61 6d 65 73 70 61 he wrong namespa
5f70: 63 65 20 61 74 0a 09 20 2a 20 74 68 65 20 6d 6f ce at.. * the mo
5f80: 6d 65 6e 74 2e 20 55 67 6c 79 21 0a 09 20 2a 2f ment. Ugly!.. */
5f90: 0a 0a 09 69 73 52 6f 6f 74 20 3d 20 54 63 6c 49 ...isRoot = TclI
5fa0: 6e 69 74 52 65 77 72 69 74 65 45 6e 73 65 6d 62 nitRewriteEnsemb
5fb0: 6c 65 28 69 6e 74 65 72 70 2c 20 33 2c 20 31 2c le(interp, 3, 1,
5fc0: 20 6f 62 6a 76 29 3b 0a 0a 09 2f 2a 0a 09 20 2a objv);.../*.. *
5fd0: 20 42 75 69 6c 64 20 74 68 65 20 6c 69 73 74 20 Build the list
5fe0: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 75 73 69 of arguments usi
5ff0: 6e 67 20 61 20 54 63 6c 5f 4f 62 6a 20 61 73 20 ng a Tcl_Obj as
6000: 61 20 77 6f 72 6b 73 70 61 63 65 2e 20 53 65 65 a workspace. See
6010: 0a 09 20 2a 20 63 6f 6d 6d 65 6e 74 73 20 61 62 .. * comments ab
6020: 6f 76 65 20 66 6f 72 20 77 68 79 20 74 68 65 73 ove for why thes
6030: 65 20 63 6f 6e 74 6f 72 74 69 6f 6e 73 20 61 72 e contortions ar
6040: 65 20 6e 65 63 65 73 73 61 72 79 2e 0a 09 20 2a e necessary... *
6050: 2f 0a 0a 09 6f 62 6a 50 74 72 20 3d 20 54 63 6c /...objPtr = Tcl
6060: 5f 4e 65 77 4f 62 6a 28 29 3b 0a 09 6f 62 6a 32 _NewObj();..obj2
6070: 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a Ptr = Tcl_NewObj
6080: 28 29 3b 0a 09 63 6d 64 20 3d 20 46 69 6e 64 43 ();..cmd = FindC
6090: 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 6f ommand(interp, o
60a0: 62 6a 76 5b 32 5d 2c 20 66 50 74 72 2d 3e 64 65 bjv[2], fPtr->de
60b0: 66 69 6e 65 4e 73 29 3b 0a 09 69 66 20 28 63 6d fineNs);..if (cm
60c0: 64 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 d == NULL) {..
60d0: 20 20 2f 2a 20 70 75 6e 74 20 74 68 69 73 20 63 /* punt this c
60e0: 61 73 65 21 20 2a 2f 0a 09 20 20 20 20 54 63 6c ase! */.. Tcl
60f0: 5f 41 70 70 65 6e 64 4f 62 6a 54 6f 4f 62 6a 28 _AppendObjToObj(
6100: 6f 62 6a 32 50 74 72 2c 20 6f 62 6a 76 5b 32 5d obj2Ptr, objv[2]
6110: 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 );..} else {..
6120: 20 20 54 63 6c 5f 47 65 74 43 6f 6d 6d 61 6e 64 Tcl_GetCommand
6130: 46 75 6c 6c 4e 61 6d 65 28 69 6e 74 65 72 70 2c FullName(interp,
6140: 20 63 6d 64 2c 20 6f 62 6a 32 50 74 72 29 3b 0a cmd, obj2Ptr);.
6150: 09 7d 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 .}..Tcl_ListObjA
6160: 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 4e 55 4c ppendElement(NUL
6170: 4c 2c 20 6f 62 6a 50 74 72 2c 20 6f 62 6a 32 50 L, objPtr, obj2P
6180: 74 72 29 3b 0a 09 2f 2a 20 54 4f 44 4f 3a 20 6f tr);../* TODO: o
6190: 76 65 72 66 6c 6f 77 3f 20 2a 2f 0a 09 54 63 6c verflow? */..Tcl
61a0: 5f 4c 69 73 74 4f 62 6a 52 65 70 6c 61 63 65 28 _ListObjReplace(
61b0: 4e 55 4c 4c 2c 20 6f 62 6a 50 74 72 2c 20 31 2c NULL, objPtr, 1,
61c0: 20 30 2c 20 6f 62 6a 63 2d 33 2c 20 6f 62 6a 76 0, objc-3, objv
61d0: 2b 33 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 +3);..Tcl_ListOb
61e0: 6a 47 65 74 45 6c 65 6d 65 6e 74 73 28 4e 55 4c jGetElements(NUL
61f0: 4c 2c 20 6f 62 6a 50 74 72 2c 20 26 64 75 6d 6d L, objPtr, &dumm
6200: 79 2c 20 26 6f 62 6a 73 29 3b 0a 0a 09 72 65 73 y, &objs);...res
6210: 75 6c 74 20 3d 20 54 63 6c 5f 45 76 61 6c 4f 62 ult = Tcl_EvalOb
6220: 6a 76 28 69 6e 74 65 72 70 2c 20 6f 62 6a 63 2d jv(interp, objc-
6230: 32 2c 20 6f 62 6a 73 2c 20 54 43 4c 5f 45 56 41 2, objs, TCL_EVA
6240: 4c 5f 49 4e 56 4f 4b 45 29 3b 0a 09 69 66 20 28 L_INVOKE);..if (
6250: 69 73 52 6f 6f 74 29 20 7b 0a 09 20 20 20 20 54 isRoot) {.. T
6260: 63 6c 52 65 73 65 74 52 65 77 72 69 74 65 45 6e clResetRewriteEn
6270: 73 65 6d 62 6c 65 28 69 6e 74 65 72 70 2c 20 31 semble(interp, 1
6280: 29 3b 0a 09 7d 0a 09 54 63 6c 5f 44 65 63 72 52 );..}..Tcl_DecrR
6290: 65 66 43 6f 75 6e 74 28 6f 62 6a 50 74 72 29 3b efCount(objPtr);
62a0: 0a 20 20 20 20 7d 0a 20 20 20 20 44 65 6c 52 65 . }. DelRe
62b0: 66 28 6f 50 74 72 29 3b 0a 0a 20 20 20 20 2f 2a f(oPtr);.. /*
62c0: 0a 20 20 20 20 20 2a 20 52 65 73 74 6f 72 65 20 . * Restore
62d0: 74 68 65 20 70 72 65 76 69 6f 75 73 20 22 63 75 the previous "cu
62e0: 72 72 65 6e 74 22 20 6e 61 6d 65 73 70 61 63 65 rrent" namespace
62f0: 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 54 .. */.. T
6300: 63 6c 50 6f 70 53 74 61 63 6b 46 72 61 6d 65 28 clPopStackFrame(
6310: 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 72 65 74 interp);. ret
6320: 75 72 6e 20 72 65 73 75 6c 74 3b 0a 7d 0a 0c 0a urn result;.}...
6330: 2f 2a 0a 20 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d /*. * ----------
6340: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6350: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6360: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6370: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a ------------. *.
6380: 20 2a 20 54 63 6c 4f 4f 4f 62 6a 44 65 66 4f 62 * TclOOObjDefOb
6390: 6a 43 6d 64 20 2d 2d 0a 20 2a 09 49 6d 70 6c 65 jCmd --. *.Imple
63a0: 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 mentation of the
63b0: 20 22 6f 6f 3a 3a 6f 62 6a 64 65 66 69 6e 65 22 "oo::objdefine"
63c0: 20 63 6f 6d 6d 61 6e 64 2e 20 57 6f 72 6b 73 20 command. Works
63d0: 62 79 20 65 66 66 65 63 74 69 76 65 6c 79 0a 20 by effectively.
63e0: 2a 09 64 6f 69 6e 67 20 74 68 65 20 73 61 6d 65 *.doing the same
63f0: 20 61 73 20 27 6e 61 6d 65 73 70 61 63 65 20 65 as 'namespace e
6400: 76 61 6c 27 2c 20 62 75 74 20 77 69 74 68 20 65 val', but with e
6410: 78 74 72 61 20 6d 61 67 69 63 20 61 70 70 6c 69 xtra magic appli
6420: 65 64 20 73 6f 0a 20 2a 09 74 68 61 74 20 74 68 ed so. *.that th
6430: 65 20 6f 62 6a 65 63 74 20 74 6f 20 62 65 20 6d e object to be m
6440: 6f 64 69 66 69 65 64 20 69 73 20 6b 6e 6f 77 6e odified is known
6450: 20 74 6f 20 74 68 65 20 63 6f 6d 6d 61 6e 64 73 to the commands
6460: 20 69 6e 20 74 68 65 20 74 61 72 67 65 74 0a 20 in the target.
6470: 2a 09 6e 61 6d 65 73 70 61 63 65 2e 20 41 6c 73 *.namespace. Als
6480: 6f 20 64 6f 65 73 20 65 6e 73 65 6d 62 6c 65 2d o does ensemble-
6490: 6c 69 6b 65 20 74 72 69 63 6b 73 20 77 69 74 68 like tricks with
64a0: 20 64 69 73 70 61 74 63 68 20 73 6f 20 74 68 61 dispatch so tha
64b0: 74 20 65 72 72 6f 72 0a 20 2a 09 6d 65 73 73 61 t error. *.messa
64c0: 67 65 73 20 61 72 65 20 63 6c 65 61 72 65 72 2e ges are clearer.
64d0: 0a 20 2a 0a 20 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d . *. * ---------
64e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
64f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6500: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6510: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
6520: 2f 0a 0a 69 6e 74 0a 54 63 6c 4f 4f 4f 62 6a 44 /..int.TclOOObjD
6530: 65 66 4f 62 6a 43 6d 64 28 0a 20 20 20 20 43 6c efObjCmd(. Cl
6540: 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 ientData clientD
6550: 61 74 61 2c 0a 20 20 20 20 54 63 6c 5f 49 6e 74 ata,. Tcl_Int
6560: 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 20 erp *interp,.
6570: 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 20 20 54 int objc,. T
6580: 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 2a 6f cl_Obj *const *o
6590: 62 6a 76 29 0a 7b 0a 20 20 20 20 46 6f 75 6e 64 bjv).{. Found
65a0: 61 74 69 6f 6e 20 2a 66 50 74 72 20 3d 20 54 63 ation *fPtr = Tc
65b0: 6c 4f 4f 47 65 74 46 6f 75 6e 64 61 74 69 6f 6e lOOGetFoundation
65c0: 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 69 6e (interp);. in
65d0: 74 20 69 73 52 6f 6f 74 2c 20 72 65 73 75 6c 74 t isRoot, result
65e0: 3b 0a 20 20 20 20 4f 62 6a 65 63 74 20 2a 6f 50 ;. Object *oP
65f0: 74 72 3b 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a tr;.. if (obj
6600: 63 20 3c 20 33 29 20 7b 0a 09 54 63 6c 5f 57 72 c < 3) {..Tcl_Wr
6610: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 ongNumArgs(inter
6620: 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 6f 62 6a p, 1, objv, "obj
6630: 65 63 74 4e 61 6d 65 20 61 72 67 20 3f 61 72 67 ectName arg ?arg
6640: 20 2e 2e 2e 3f 22 29 3b 0a 09 72 65 74 75 72 6e ...?");..return
6650: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 TCL_ERROR;.
6660: 7d 0a 0a 20 20 20 20 6f 50 74 72 20 3d 20 28 4f }.. oPtr = (O
6670: 62 6a 65 63 74 20 2a 29 20 54 63 6c 5f 47 65 74 bject *) Tcl_Get
6680: 4f 62 6a 65 63 74 46 72 6f 6d 4f 62 6a 28 69 6e ObjectFromObj(in
6690: 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 29 3b 0a terp, objv[1]);.
66a0: 20 20 20 20 69 66 20 28 6f 50 74 72 20 3d 3d 20 if (oPtr ==
66b0: 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 NULL) {..return
66c0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d TCL_ERROR;. }
66d0: 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 .. /*. *
66e0: 4d 61 6b 65 20 74 68 65 20 6f 6f 3a 3a 6f 62 6a Make the oo::obj
66f0: 64 65 66 69 6e 65 20 6e 61 6d 65 73 70 61 63 65 define namespace
6700: 20 74 68 65 20 63 75 72 72 65 6e 74 20 6e 61 6d the current nam
6710: 65 73 70 61 63 65 20 61 6e 64 20 65 76 61 6c 75 espace and evalu
6720: 61 74 65 20 74 68 65 0a 20 20 20 20 20 2a 20 63 ate the. * c
6730: 6f 6d 6d 61 6e 64 28 73 29 2e 0a 20 20 20 20 20 ommand(s)..
6740: 2a 2f 0a 0a 20 20 20 20 69 66 20 28 49 6e 69 74 */.. if (Init
6750: 44 65 66 69 6e 65 43 6f 6e 74 65 78 74 28 69 6e DefineContext(in
6760: 74 65 72 70 2c 20 66 50 74 72 2d 3e 6f 62 6a 64 terp, fPtr->objd
6770: 65 66 4e 73 2c 20 6f 50 74 72 2c 20 6f 62 6a 63 efNs, oPtr, objc
6780: 2c 6f 62 6a 76 29 20 21 3d 20 54 43 4c 5f 4f 4b ,objv) != TCL_OK
6790: 29 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 ){..return TCL_E
67a0: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 RROR;. }..
67b0: 20 41 64 64 52 65 66 28 6f 50 74 72 29 3b 0a 20 AddRef(oPtr);.
67c0: 20 20 20 69 66 20 28 6f 62 6a 63 20 3d 3d 20 33 if (objc == 3
67d0: 29 20 7b 0a 09 54 63 6c 5f 4f 62 6a 20 2a 6f 62 ) {..Tcl_Obj *ob
67e0: 6a 4e 61 6d 65 4f 62 6a 20 3d 20 54 63 6c 4f 4f jNameObj = TclOO
67f0: 4f 62 6a 65 63 74 4e 61 6d 65 28 69 6e 74 65 72 ObjectName(inter
6800: 70 2c 20 6f 50 74 72 29 3b 0a 0a 09 54 63 6c 5f p, oPtr);...Tcl_
6810: 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 6f 62 6a IncrRefCount(obj
6820: 4e 61 6d 65 4f 62 6a 29 3b 0a 09 72 65 73 75 6c NameObj);..resul
6830: 74 20 3d 20 54 63 6c 45 76 61 6c 4f 62 6a 45 78 t = TclEvalObjEx
6840: 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 32 5d (interp, objv[2]
6850: 2c 20 30 2c 0a 09 09 28 28 49 6e 74 65 72 70 20 , 0,...((Interp
6860: 2a 29 69 6e 74 65 72 70 29 2d 3e 63 6d 64 46 72 *)interp)->cmdFr
6870: 61 6d 65 50 74 72 2c 20 32 29 3b 0a 09 69 66 20 amePtr, 2);..if
6880: 28 72 65 73 75 6c 74 20 3d 3d 20 54 43 4c 5f 45 (result == TCL_E
6890: 52 52 4f 52 29 20 7b 0a 09 20 20 20 20 47 65 6e RROR) {.. Gen
68a0: 65 72 61 74 65 45 72 72 6f 72 49 6e 66 6f 28 69 erateErrorInfo(i
68b0: 6e 74 65 72 70 2c 20 6f 50 74 72 2c 20 6f 62 6a nterp, oPtr, obj
68c0: 4e 61 6d 65 4f 62 6a 2c 20 22 6f 62 6a 65 63 74 NameObj, "object
68d0: 22 29 3b 0a 09 7d 0a 09 54 63 6c 44 65 63 72 52 ");..}..TclDecrR
68e0: 65 66 43 6f 75 6e 74 28 6f 62 6a 4e 61 6d 65 4f efCount(objNameO
68f0: 62 6a 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 bj);. } else
6900: 7b 0a 09 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 {..Tcl_Obj *objP
6910: 74 72 2c 20 2a 6f 62 6a 32 50 74 72 2c 20 2a 2a tr, *obj2Ptr, **
6920: 6f 62 6a 73 3b 0a 09 54 63 6c 5f 43 6f 6d 6d 61 objs;..Tcl_Comma
6930: 6e 64 20 63 6d 64 3b 0a 09 69 6e 74 20 64 75 6d nd cmd;..int dum
6940: 6d 79 3b 0a 0a 09 2f 2a 0a 09 20 2a 20 4d 6f 72 my;.../*.. * Mor
6950: 65 20 74 68 61 6e 20 6f 6e 65 20 61 72 67 75 6d e than one argum
6960: 65 6e 74 3a 20 66 69 72 65 20 74 68 65 6d 20 74 ent: fire them t
6970: 68 72 6f 75 67 68 20 74 68 65 20 65 6e 73 65 6d hrough the ensem
6980: 62 6c 65 20 70 72 6f 63 65 73 73 69 6e 67 0a 09 ble processing..
6990: 20 2a 20 65 6e 67 69 6e 65 20 73 6f 20 74 68 61 * engine so tha
69a0: 74 20 65 76 65 72 79 74 68 69 6e 67 20 61 70 70 t everything app
69b0: 65 61 72 73 20 74 6f 20 62 65 20 67 6f 6f 64 20 ears to be good
69c0: 61 6e 64 20 70 72 6f 70 65 72 20 69 6e 20 65 72 and proper in er
69d0: 72 6f 72 0a 09 20 2a 20 6d 65 73 73 61 67 65 73 ror.. * messages
69e0: 2e 20 4e 6f 74 65 20 74 68 61 74 20 77 65 20 63 . Note that we c
69f0: 61 6e 6e 6f 74 20 6a 75 73 74 20 63 6f 6e 63 61 annot just conca
6a00: 74 65 6e 61 74 65 20 61 6e 64 20 73 65 6e 64 20 tenate and send
6a10: 74 68 72 6f 75 67 68 0a 09 20 2a 20 54 63 6c 5f through.. * Tcl_
6a20: 45 76 61 6c 4f 62 6a 45 78 2c 20 61 73 20 74 68 EvalObjEx, as th
6a30: 61 74 20 64 6f 65 73 6e 27 74 20 64 6f 20 65 6e at doesn't do en
6a40: 73 65 6d 62 6c 65 20 70 72 6f 63 65 73 73 69 6e semble processin
6a50: 67 2c 20 61 6e 64 20 77 65 0a 09 20 2a 20 63 61 g, and we.. * ca
6a60: 6e 6e 6f 74 20 67 6f 20 74 68 72 6f 75 67 68 20 nnot go through
6a70: 54 63 6c 5f 45 76 61 6c 4f 62 6a 76 20 77 69 74 Tcl_EvalObjv wit
6a80: 68 6f 75 74 20 74 68 65 20 65 78 74 72 61 20 77 hout the extra w
6a90: 6f 72 6b 20 74 6f 20 70 72 65 2d 66 69 6e 64 0a ork to pre-find.
6aa0: 09 20 2a 20 74 68 65 20 63 6f 6d 6d 61 6e 64 2c . * the command,
6ab0: 20 61 73 20 74 68 61 74 20 66 69 6e 64 73 20 63 as that finds c
6ac0: 6f 6d 6d 61 6e 64 20 6e 61 6d 65 73 20 69 6e 20 ommand names in
6ad0: 74 68 65 20 77 72 6f 6e 67 20 6e 61 6d 65 73 70 the wrong namesp
6ae0: 61 63 65 20 61 74 0a 09 20 2a 20 74 68 65 20 6d ace at.. * the m
6af0: 6f 6d 65 6e 74 2e 20 55 67 6c 79 21 0a 09 20 2a oment. Ugly!.. *
6b00: 2f 0a 0a 09 69 73 52 6f 6f 74 20 3d 20 54 63 6c /...isRoot = Tcl
6b10: 49 6e 69 74 52 65 77 72 69 74 65 45 6e 73 65 6d InitRewriteEnsem
6b20: 62 6c 65 28 69 6e 74 65 72 70 2c 20 33 2c 20 31 ble(interp, 3, 1
6b30: 2c 20 6f 62 6a 76 29 3b 0a 0a 09 2f 2a 0a 09 20 , objv);.../*..
6b40: 2a 20 42 75 69 6c 64 20 74 68 65 20 6c 69 73 74 * Build the list
6b50: 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 75 73 of arguments us
6b60: 69 6e 67 20 61 20 54 63 6c 5f 4f 62 6a 20 61 73 ing a Tcl_Obj as
6b70: 20 61 20 77 6f 72 6b 73 70 61 63 65 2e 20 53 65 a workspace. Se
6b80: 65 0a 09 20 2a 20 63 6f 6d 6d 65 6e 74 73 20 61 e.. * comments a
6b90: 62 6f 76 65 20 66 6f 72 20 77 68 79 20 74 68 65 bove for why the
6ba0: 73 65 20 63 6f 6e 74 6f 72 74 69 6f 6e 73 20 61 se contortions a
6bb0: 72 65 20 6e 65 63 65 73 73 61 72 79 2e 0a 09 20 re necessary...
6bc0: 2a 2f 0a 0a 09 6f 62 6a 50 74 72 20 3d 20 54 63 */...objPtr = Tc
6bd0: 6c 5f 4e 65 77 4f 62 6a 28 29 3b 0a 09 6f 62 6a l_NewObj();..obj
6be0: 32 50 74 72 20 3d 20 54 63 6c 5f 4e 65 77 4f 62 2Ptr = Tcl_NewOb
6bf0: 6a 28 29 3b 0a 09 63 6d 64 20 3d 20 46 69 6e 64 j();..cmd = Find
6c00: 43 6f 6d 6d 61 6e 64 28 69 6e 74 65 72 70 2c 20 Command(interp,
6c10: 6f 62 6a 76 5b 32 5d 2c 20 66 50 74 72 2d 3e 6f objv[2], fPtr->o
6c20: 62 6a 64 65 66 4e 73 29 3b 0a 09 69 66 20 28 63 bjdefNs);..if (c
6c30: 6d 64 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 md == NULL) {..
6c40: 20 20 20 2f 2a 20 70 75 6e 74 20 74 68 69 73 20 /* punt this
6c50: 63 61 73 65 21 20 2a 2f 0a 09 20 20 20 20 54 63 case! */.. Tc
6c60: 6c 5f 41 70 70 65 6e 64 4f 62 6a 54 6f 4f 62 6a l_AppendObjToObj
6c70: 28 6f 62 6a 32 50 74 72 2c 20 6f 62 6a 76 5b 32 (obj2Ptr, objv[2
6c80: 5d 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 ]);..} else {..
6c90: 20 20 20 54 63 6c 5f 47 65 74 43 6f 6d 6d 61 6e Tcl_GetComman
6ca0: 64 46 75 6c 6c 4e 61 6d 65 28 69 6e 74 65 72 70 dFullName(interp
6cb0: 2c 20 63 6d 64 2c 20 6f 62 6a 32 50 74 72 29 3b , cmd, obj2Ptr);
6cc0: 0a 09 7d 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a ..}..Tcl_ListObj
6cd0: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 4e 55 AppendElement(NU
6ce0: 4c 4c 2c 20 6f 62 6a 50 74 72 2c 20 6f 62 6a 32 LL, objPtr, obj2
6cf0: 50 74 72 29 3b 0a 09 2f 2a 20 54 4f 44 4f 3a 20 Ptr);../* TODO:
6d00: 6f 76 65 72 66 6c 6f 77 3f 20 2a 2f 0a 09 54 63 overflow? */..Tc
6d10: 6c 5f 4c 69 73 74 4f 62 6a 52 65 70 6c 61 63 65 l_ListObjReplace
6d20: 28 4e 55 4c 4c 2c 20 6f 62 6a 50 74 72 2c 20 31 (NULL, objPtr, 1
6d30: 2c 20 30 2c 20 6f 62 6a 63 2d 33 2c 20 6f 62 6a , 0, objc-3, obj
6d40: 76 2b 33 29 3b 0a 09 54 63 6c 5f 4c 69 73 74 4f v+3);..Tcl_ListO
6d50: 62 6a 47 65 74 45 6c 65 6d 65 6e 74 73 28 4e 55 bjGetElements(NU
6d60: 4c 4c 2c 20 6f 62 6a 50 74 72 2c 20 26 64 75 6d LL, objPtr, &dum
6d70: 6d 79 2c 20 26 6f 62 6a 73 29 3b 0a 0a 09 72 65 my, &objs);...re
6d80: 73 75 6c 74 20 3d 20 54 63 6c 5f 45 76 61 6c 4f sult = Tcl_EvalO
6d90: 62 6a 76 28 69 6e 74 65 72 70 2c 20 6f 62 6a 63 bjv(interp, objc
6da0: 2d 32 2c 20 6f 62 6a 73 2c 20 54 43 4c 5f 45 56 -2, objs, TCL_EV
6db0: 41 4c 5f 49 4e 56 4f 4b 45 29 3b 0a 0a 09 69 66 AL_INVOKE);...if
6dc0: 20 28 69 73 52 6f 6f 74 29 20 7b 0a 09 20 20 20 (isRoot) {..
6dd0: 20 54 63 6c 52 65 73 65 74 52 65 77 72 69 74 65 TclResetRewrite
6de0: 45 6e 73 65 6d 62 6c 65 28 69 6e 74 65 72 70 2c Ensemble(interp,
6df0: 20 31 29 3b 0a 09 7d 0a 09 54 63 6c 5f 44 65 63 1);..}..Tcl_Dec
6e00: 72 52 65 66 43 6f 75 6e 74 28 6f 62 6a 50 74 72 rRefCount(objPtr
6e10: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 44 65 6c );. }. Del
6e20: 52 65 66 28 6f 50 74 72 29 3b 0a 0a 20 20 20 20 Ref(oPtr);..
6e30: 2f 2a 0a 20 20 20 20 20 2a 20 52 65 73 74 6f 72 /*. * Restor
6e40: 65 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 22 e the previous "
6e50: 63 75 72 72 65 6e 74 22 20 6e 61 6d 65 73 70 61 current" namespa
6e60: 63 65 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 ce.. */..
6e70: 20 54 63 6c 50 6f 70 53 74 61 63 6b 46 72 61 6d TclPopStackFram
6e80: 65 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 72 e(interp);. r
6e90: 65 74 75 72 6e 20 72 65 73 75 6c 74 3b 0a 7d 0a eturn result;.}.
6ea0: 0c 0a 2f 2a 0a 20 2a 20 2d 2d 2d 2d 2d 2d 2d 2d ../*. * --------
6eb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6ec0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6ed0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
6ee0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
6ef0: 2a 0a 20 2a 20 54 63 6c 4f 4f 44 65 66 69 6e 65 *. * TclOODefine
6f00: 53 65 6c 66 4f 62 6a 43 6d 64 20 2d 2d 0a 20 2a SelfObjCmd --. *
6f10: 09 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 .Implementation
6f20: 6f 66 20 74 68 65 20 22 73 65 6c 66 22 20 73 75 of the "self" su
6f30: 62 63 6f 6d 6d 61 6e 64 20 6f 66 20 74 68 65 20 bcommand of the
6f40: 22 6f 6f 3a 3a 64 65 66 69 6e 65 22 20 63 6f 6d "oo::define" com
6f50: 6d 61 6e 64 2e 0a 20 2a 09 57 6f 72 6b 73 20 62 mand.. *.Works b
6f60: 79 20 65 66 66 65 63 74 69 76 65 6c 79 20 64 6f y effectively do
6f70: 69 6e 67 20 74 68 65 20 73 61 6d 65 20 61 73 20 ing the same as
6f80: 27 6e 61 6d 65 73 70 61 63 65 20 65 76 61 6c 27 'namespace eval'
6f90: 2c 20 62 75 74 20 77 69 74 68 0a 20 2a 09 65 78 , but with. *.ex
6fa0: 74 72 61 20 6d 61 67 69 63 20 61 70 70 6c 69 65 tra magic applie
6fb0: 64 20 73 6f 20 74 68 61 74 20 74 68 65 20 6f 62 d so that the ob
6fc0: 6a 65 63 74 20 74 6f 20 62 65 20 6d 6f 64 69 66 ject to be modif
6fd0: 69 65 64 20 69 73 20 6b 6e 6f 77 6e 20 74 6f 20 ied is known to
6fe0: 74 68 65 0a 20 2a 09 63 6f 6d 6d 61 6e 64 73 20 the. *.commands
6ff0: 69 6e 20 74 68 65 20 74 61 72 67 65 74 20 6e 61 in the target na
7000: 6d 65 73 70 61 63 65 2e 20 41 6c 73 6f 20 64 6f mespace. Also do
7010: 65 73 20 65 6e 73 65 6d 62 6c 65 2d 6c 69 6b 65 es ensemble-like
7020: 20 74 72 69 63 6b 73 20 77 69 74 68 0a 20 2a 09 tricks with. *.
7030: 64 69 73 70 61 74 63 68 20 73 6f 20 74 68 61 74 dispatch so that
7040: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20 error messages
7050: 61 72 65 20 63 6c 65 61 72 65 72 2e 0a 20 2a 0a are clearer.. *.
7060: 20 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d * -------------
7070: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7080: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7090: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
70a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 69 ---------. */..i
70b0: 6e 74 0a 54 63 6c 4f 4f 44 65 66 69 6e 65 53 65 nt.TclOODefineSe
70c0: 6c 66 4f 62 6a 43 6d 64 28 0a 20 20 20 20 43 6c lfObjCmd(. Cl
70d0: 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 ientData clientD
70e0: 61 74 61 2c 0a 20 20 20 20 54 63 6c 5f 49 6e 74 ata,. Tcl_Int
70f0: 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 20 erp *interp,.
7100: 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 20 20 54 int objc,. T
7110: 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 2a 6f cl_Obj *const *o
7120: 62 6a 76 29 0a 7b 0a 20 20 20 20 46 6f 75 6e 64 bjv).{. Found
7130: 61 74 69 6f 6e 20 2a 66 50 74 72 20 3d 20 54 63 ation *fPtr = Tc
7140: 6c 4f 4f 47 65 74 46 6f 75 6e 64 61 74 69 6f 6e lOOGetFoundation
7150: 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 69 6e (interp);. in
7160: 74 20 72 65 73 75 6c 74 3b 0a 20 20 20 20 4f 62 t result;. Ob
7170: 6a 65 63 74 20 2a 6f 50 74 72 3b 0a 0a 20 20 20 ject *oPtr;..
7180: 20 69 66 20 28 6f 62 6a 63 20 3c 20 32 29 20 7b if (objc < 2) {
7190: 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 ..Tcl_WrongNumAr
71a0: 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 gs(interp, 1, ob
71b0: 6a 76 2c 20 22 61 72 67 20 3f 61 72 67 20 2e 2e jv, "arg ?arg ..
71c0: 2e 3f 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 .?");..return TC
71d0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a L_ERROR;. }..
71e0: 20 20 20 20 6f 50 74 72 20 3d 20 28 4f 62 6a 65 oPtr = (Obje
71f0: 63 74 20 2a 29 20 54 63 6c 4f 4f 47 65 74 44 65 ct *) TclOOGetDe
7200: 66 69 6e 65 43 6d 64 43 6f 6e 74 65 78 74 28 69 fineCmdContext(i
7210: 6e 74 65 72 70 29 3b 0a 20 20 20 20 69 66 20 28 nterp);. if (
7220: 6f 50 74 72 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a oPtr == NULL) {.
7230: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f .return TCL_ERRO
7240: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a R;. }.. /*
7250: 0a 20 20 20 20 20 2a 20 4d 61 6b 65 20 74 68 65 . * Make the
7260: 20 6f 6f 3a 3a 6f 62 6a 64 65 66 69 6e 65 20 6e oo::objdefine n
7270: 61 6d 65 73 70 61 63 65 20 74 68 65 20 63 75 72 amespace the cur
7280: 72 65 6e 74 20 6e 61 6d 65 73 70 61 63 65 20 61 rent namespace a
7290: 6e 64 20 65 76 61 6c 75 61 74 65 20 74 68 65 0a nd evaluate the.
72a0: 20 20 20 20 20 2a 20 63 6f 6d 6d 61 6e 64 28 73 * command(s
72b0: 29 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 ).. */..
72c0: 69 66 20 28 49 6e 69 74 44 65 66 69 6e 65 43 6f if (InitDefineCo
72d0: 6e 74 65 78 74 28 69 6e 74 65 72 70 2c 20 66 50 ntext(interp, fP
72e0: 74 72 2d 3e 6f 62 6a 64 65 66 4e 73 2c 20 6f 50 tr->objdefNs, oP
72f0: 74 72 2c 20 6f 62 6a 63 2c 6f 62 6a 76 29 20 21 tr, objc,objv) !
7300: 3d 20 54 43 4c 5f 4f 4b 29 7b 0a 09 72 65 74 75 = TCL_OK){..retu
7310: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 rn TCL_ERROR;.
7320: 20 20 7d 0a 0a 20 20 20 20 41 64 64 52 65 66 28 }.. AddRef(
7330: 6f 50 74 72 29 3b 0a 20 20 20 20 69 66 20 28 6f oPtr);. if (o
7340: 62 6a 63 20 3d 3d 20 32 29 20 7b 0a 09 54 63 6c bjc == 2) {..Tcl
7350: 5f 4f 62 6a 20 2a 6f 62 6a 4e 61 6d 65 4f 62 6a _Obj *objNameObj
7360: 20 3d 20 54 63 6c 4f 4f 4f 62 6a 65 63 74 4e 61 = TclOOObjectNa
7370: 6d 65 28 69 6e 74 65 72 70 2c 20 6f 50 74 72 29 me(interp, oPtr)
7380: 3b 0a 0a 09 54 63 6c 5f 49 6e 63 72 52 65 66 43 ;...Tcl_IncrRefC
7390: 6f 75 6e 74 28 6f 62 6a 4e 61 6d 65 4f 62 6a 29 ount(objNameObj)
73a0: 3b 0a 09 72 65 73 75 6c 74 20 3d 20 54 63 6c 45 ;..result = TclE
73b0: 76 61 6c 4f 62 6a 45 78 28 69 6e 74 65 72 70 2c valObjEx(interp,
73c0: 20 6f 62 6a 76 5b 31 5d 2c 20 30 2c 0a 09 09 28 objv[1], 0,...(
73d0: 28 49 6e 74 65 72 70 20 2a 29 69 6e 74 65 72 70 (Interp *)interp
73e0: 29 2d 3e 63 6d 64 46 72 61 6d 65 50 74 72 2c 20 )->cmdFramePtr,
73f0: 32 29 3b 0a 09 69 66 20 28 72 65 73 75 6c 74 20 2);..if (result
7400: 3d 3d 20 54 43 4c 5f 45 52 52 4f 52 29 20 7b 0a == TCL_ERROR) {.
7410: 09 20 20 20 20 47 65 6e 65 72 61 74 65 45 72 72 . GenerateErr
7420: 6f 72 49 6e 66 6f 28 69 6e 74 65 72 70 2c 20 6f orInfo(interp, o
7430: 50 74 72 2c 20 6f 62 6a 4e 61 6d 65 4f 62 6a 2c Ptr, objNameObj,
7440: 20 22 63 6c 61 73 73 20 6f 62 6a 65 63 74 22 29 "class object")
7450: 3b 0a 09 7d 0a 09 54 63 6c 44 65 63 72 52 65 66 ;..}..TclDecrRef
7460: 43 6f 75 6e 74 28 6f 62 6a 4e 61 6d 65 4f 62 6a Count(objNameObj
7470: 29 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a );. } else {.
7480: 09 54 63 6c 5f 4f 62 6a 20 2a 6f 62 6a 50 74 72 .Tcl_Obj *objPtr
7490: 2c 20 2a 6f 62 6a 32 50 74 72 2c 20 2a 2a 6f 62 , *obj2Ptr, **ob
74a0: 6a 73 3b 0a 09 54 63 6c 5f 43 6f 6d 6d 61 6e 64 js;..Tcl_Command
74b0: 20 63 6d 64 3b 0a 09 69 6e 74 20 69 73 52 6f 6f cmd;..int isRoo
74c0: 74 2c 20 64 75 6d 6d 79 3b 0a 0a 09 2f 2a 0a 09 t, dummy;.../*..
74d0: 20 2a 20 4d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 * More than one
74e0: 20 61 72 67 75 6d 65 6e 74 3a 20 66 69 72 65 20 argument: fire
74f0: 74 68 65 6d 20 74 68 72 6f 75 67 68 20 74 68 65 them through the
7500: 20 65 6e 73 65 6d 62 6c 65 20 70 72 6f 63 65 73 ensemble proces
7510: 73 69 6e 67 0a 09 20 2a 20 65 6e 67 69 6e 65 20 sing.. * engine
7520: 73 6f 20 74 68 61 74 20 65 76 65 72 79 74 68 69 so that everythi
7530: 6e 67 20 61 70 70 65 61 72 73 20 74 6f 20 62 65 ng appears to be
7540: 20 67 6f 6f 64 20 61 6e 64 20 70 72 6f 70 65 72 good and proper
7550: 20 69 6e 20 65 72 72 6f 72 0a 09 20 2a 20 6d 65 in error.. * me
7560: 73 73 61 67 65 73 2e 20 4e 6f 74 65 20 74 68 61 ssages. Note tha
7570: 74 20 77 65 20 63 61 6e 6e 6f 74 20 6a 75 73 74 t we cannot just
7580: 20 63 6f 6e 63 61 74 65 6e 61 74 65 20 61 6e 64 concatenate and
7590: 20 73 65 6e 64 20 74 68 72 6f 75 67 68 0a 09 20 send through..
75a0: 2a 20 54 63 6c 5f 45 76 61 6c 4f 62 6a 45 78 2c * Tcl_EvalObjEx,
75b0: 20 61 73 20 74 68 61 74 20 64 6f 65 73 6e 27 74 as that doesn't
75c0: 20 64 6f 20 65 6e 73 65 6d 62 6c 65 20 70 72 6f do ensemble pro
75d0: 63 65 73 73 69 6e 67 2c 20 61 6e 64 20 77 65 0a cessing, and we.
75e0: 09 20 2a 20 63 61 6e 6e 6f 74 20 67 6f 20 74 68 . * cannot go th
75f0: 72 6f 75 67 68 20 54 63 6c 5f 45 76 61 6c 4f 62 rough Tcl_EvalOb
7600: 6a 76 20 77 69 74 68 6f 75 74 20 74 68 65 20 65 jv without the e
7610: 78 74 72 61 20 77 6f 72 6b 20 74 6f 20 70 72 65 xtra work to pre
7620: 2d 66 69 6e 64 0a 09 20 2a 20 74 68 65 20 63 6f -find.. * the co
7630: 6d 6d 61 6e 64 2c 20 61 73 20 74 68 61 74 20 66 mmand, as that f
7640: 69 6e 64 73 20 63 6f 6d 6d 61 6e 64 20 6e 61 6d inds command nam
7650: 65 73 20 69 6e 20 74 68 65 20 77 72 6f 6e 67 20 es in the wrong
7660: 6e 61 6d 65 73 70 61 63 65 20 61 74 0a 09 20 2a namespace at.. *
7670: 20 74 68 65 20 6d 6f 6d 65 6e 74 2e 20 55 67 6c the moment. Ugl
7680: 79 21 0a 09 20 2a 2f 0a 0a 09 69 73 52 6f 6f 74 y!.. */...isRoot
7690: 20 3d 20 54 63 6c 49 6e 69 74 52 65 77 72 69 74 = TclInitRewrit
76a0: 65 45 6e 73 65 6d 62 6c 65 28 69 6e 74 65 72 70 eEnsemble(interp
76b0: 2c 20 32 2c 20 31 2c 20 6f 62 6a 76 29 3b 0a 0a , 2, 1, objv);..
76c0: 09 2f 2a 0a 09 20 2a 20 42 75 69 6c 64 20 74 68 ./*.. * Build th
76d0: 65 20 6c 69 73 74 20 6f 66 20 61 72 67 75 6d 65 e list of argume
76e0: 6e 74 73 20 75 73 69 6e 67 20 61 20 54 63 6c 5f nts using a Tcl_
76f0: 4f 62 6a 20 61 73 20 61 20 77 6f 72 6b 73 70 61 Obj as a workspa
7700: 63 65 2e 20 53 65 65 0a 09 20 2a 20 63 6f 6d 6d ce. See.. * comm
7710: 65 6e 74 73 20 61 62 6f 76 65 20 66 6f 72 20 77 ents above for w
7720: 68 79 20 74 68 65 73 65 20 63 6f 6e 74 6f 72 74 hy these contort
7730: 69 6f 6e 73 20 61 72 65 20 6e 65 63 65 73 73 61 ions are necessa
7740: 72 79 2e 0a 09 20 2a 2f 0a 0a 09 6f 62 6a 50 74 ry... */...objPt
7750: 72 20 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a 28 29 r = Tcl_NewObj()
7760: 3b 0a 09 6f 62 6a 32 50 74 72 20 3d 20 54 63 6c ;..obj2Ptr = Tcl
7770: 5f 4e 65 77 4f 62 6a 28 29 3b 0a 09 63 6d 64 20 _NewObj();..cmd
7780: 3d 20 46 69 6e 64 43 6f 6d 6d 61 6e 64 28 69 6e = FindCommand(in
7790: 74 65 72 70 2c 20 6f 62 6a 76 5b 31 5d 2c 20 66 terp, objv[1], f
77a0: 50 74 72 2d 3e 6f 62 6a 64 65 66 4e 73 29 3b 0a Ptr->objdefNs);.
77b0: 09 69 66 20 28 63 6d 64 20 3d 3d 20 4e 55 4c 4c .if (cmd == NULL
77c0: 29 20 7b 0a 09 20 20 20 20 2f 2a 20 70 75 6e 74 ) {.. /* punt
77d0: 20 74 68 69 73 20 63 61 73 65 21 20 2a 2f 0a 09 this case! */..
77e0: 20 20 20 20 54 63 6c 5f 41 70 70 65 6e 64 4f 62 Tcl_AppendOb
77f0: 6a 54 6f 4f 62 6a 28 6f 62 6a 32 50 74 72 2c 20 jToObj(obj2Ptr,
7800: 6f 62 6a 76 5b 31 5d 29 3b 0a 09 7d 20 65 6c 73 objv[1]);..} els
7810: 65 20 7b 0a 09 20 20 20 20 54 63 6c 5f 47 65 74 e {.. Tcl_Get
7820: 43 6f 6d 6d 61 6e 64 46 75 6c 6c 4e 61 6d 65 28 CommandFullName(
7830: 69 6e 74 65 72 70 2c 20 63 6d 64 2c 20 6f 62 6a interp, cmd, obj
7840: 32 50 74 72 29 3b 0a 09 7d 0a 09 54 63 6c 5f 4c 2Ptr);..}..Tcl_L
7850: 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d istObjAppendElem
7860: 65 6e 74 28 4e 55 4c 4c 2c 20 6f 62 6a 50 74 72 ent(NULL, objPtr
7870: 2c 20 6f 62 6a 32 50 74 72 29 3b 0a 09 2f 2a 20 , obj2Ptr);../*
7880: 54 4f 44 4f 3a 20 6f 76 65 72 66 6c 6f 77 3f 20 TODO: overflow?
7890: 2a 2f 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a 52 */..Tcl_ListObjR
78a0: 65 70 6c 61 63 65 28 4e 55 4c 4c 2c 20 6f 62 6a eplace(NULL, obj
78b0: 50 74 72 2c 20 31 2c 20 30 2c 20 6f 62 6a 63 2d Ptr, 1, 0, objc-
78c0: 32 2c 20 6f 62 6a 76 2b 32 29 3b 0a 09 54 63 6c 2, objv+2);..Tcl
78d0: 5f 4c 69 73 74 4f 62 6a 47 65 74 45 6c 65 6d 65 _ListObjGetEleme
78e0: 6e 74 73 28 4e 55 4c 4c 2c 20 6f 62 6a 50 74 72 nts(NULL, objPtr
78f0: 2c 20 26 64 75 6d 6d 79 2c 20 26 6f 62 6a 73 29 , &dummy, &objs)
7900: 3b 0a 0a 09 72 65 73 75 6c 74 20 3d 20 54 63 6c ;...result = Tcl
7910: 5f 45 76 61 6c 4f 62 6a 76 28 69 6e 74 65 72 70 _EvalObjv(interp
7920: 2c 20 6f 62 6a 63 2d 31 2c 20 6f 62 6a 73 2c 20 , objc-1, objs,
7930: 54 43 4c 5f 45 56 41 4c 5f 49 4e 56 4f 4b 45 29 TCL_EVAL_INVOKE)
7940: 3b 0a 09 69 66 20 28 69 73 52 6f 6f 74 29 20 7b ;..if (isRoot) {
7950: 0a 09 20 20 20 20 54 63 6c 52 65 73 65 74 52 65 .. TclResetRe
7960: 77 72 69 74 65 45 6e 73 65 6d 62 6c 65 28 69 6e writeEnsemble(in
7970: 74 65 72 70 2c 20 31 29 3b 0a 09 7d 0a 09 54 63 terp, 1);..}..Tc
7980: 6c 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 6f l_DecrRefCount(o
7990: 62 6a 50 74 72 29 3b 0a 20 20 20 20 7d 0a 20 20 bjPtr);. }.
79a0: 20 20 44 65 6c 52 65 66 28 6f 50 74 72 29 3b 0a DelRef(oPtr);.
79b0: 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 52 . /*. * R
79c0: 65 73 74 6f 72 65 20 74 68 65 20 70 72 65 76 69 estore the previ
79d0: 6f 75 73 20 22 63 75 72 72 65 6e 74 22 20 6e 61 ous "current" na
79e0: 6d 65 73 70 61 63 65 2e 0a 20 20 20 20 20 2a 2f mespace.. */
79f0: 0a 0a 20 20 20 20 54 63 6c 50 6f 70 53 74 61 63 .. TclPopStac
7a00: 6b 46 72 61 6d 65 28 69 6e 74 65 72 70 29 3b 0a kFrame(interp);.
7a10: 20 20 20 20 72 65 74 75 72 6e 20 72 65 73 75 6c return resul
7a20: 74 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 20 2d 2d 2d t;.}.../*. * ---
7a30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7a40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7a50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7a60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7a70: 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 63 6c 4f 4f 44 ---. *. * TclOOD
7a80: 65 66 69 6e 65 43 6c 61 73 73 4f 62 6a 43 6d 64 efineClassObjCmd
7a90: 20 2d 2d 0a 20 2a 09 49 6d 70 6c 65 6d 65 6e 74 --. *.Implement
7aa0: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 22 63 6c ation of the "cl
7ab0: 61 73 73 22 20 73 75 62 63 6f 6d 6d 61 6e 64 20 ass" subcommand
7ac0: 6f 66 20 74 68 65 20 22 6f 6f 3a 3a 6f 62 6a 64 of the "oo::objd
7ad0: 65 66 69 6e 65 22 0a 20 2a 09 63 6f 6d 6d 61 6e efine". *.comman
7ae0: 64 2e 0a 20 2a 0a 20 2a 20 2d 2d 2d 2d 2d 2d 2d d.. *. * -------
7af0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7b00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7b10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
7b20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
7b30: 20 2a 2f 0a 0a 69 6e 74 0a 54 63 6c 4f 4f 44 65 */..int.TclOODe
7b40: 66 69 6e 65 43 6c 61 73 73 4f 62 6a 43 6d 64 28 fineClassObjCmd(
7b50: 0a 20 20 20 20 43 6c 69 65 6e 74 44 61 74 61 20 . ClientData
7b60: 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 20 20 clientData,.
7b70: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 Tcl_Interp *inte
7b80: 72 70 2c 0a 20 20 20 20 69 6e 74 20 6f 62 6a 63 rp,. int objc
7b90: 2c 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 ,. Tcl_Obj *c
7ba0: 6f 6e 73 74 20 2a 6f 62 6a 76 29 0a 7b 0a 20 20 onst *objv).{.
7bb0: 20 20 4f 62 6a 65 63 74 20 2a 6f 50 74 72 3b 0a Object *oPtr;.
7bc0: 20 20 20 20 43 6c 61 73 73 20 2a 63 6c 73 50 74 Class *clsPt
7bd0: 72 3b 0a 20 20 20 20 46 6f 75 6e 64 61 74 69 6f r;. Foundatio
7be0: 6e 20 2a 66 50 74 72 20 3d 20 54 63 6c 4f 4f 47 n *fPtr = TclOOG
7bf0: 65 74 46 6f 75 6e 64 61 74 69 6f 6e 28 69 6e 74 etFoundation(int
7c00: 65 72 70 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 erp);.. /*.
7c10: 20 20 20 2a 20 50 61 72 73 65 20 74 68 65 20 63 * Parse the c
7c20: 6f 6e 74 65 78 74 20 74 6f 20 67 65 74 20 74 68 ontext to get th
7c30: 65 20 6f 62 6a 65 63 74 20 74 6f 20 6f 70 65 72 e object to oper
7c40: 61 74 65 20 6f 6e 2e 0a 20 20 20 20 20 2a 2f 0a ate on.. */.
7c50: 0a 20 20 20 20 6f 50 74 72 20 3d 20 28 4f 62 6a . oPtr = (Obj
7c60: 65 63 74 20 2a 29 20 54 63 6c 4f 4f 47 65 74 44 ect *) TclOOGetD
7c70: 65 66 69 6e 65 43 6d 64 43 6f 6e 74 65 78 74 28 efineCmdContext(
7c80: 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 69 66 20 interp);. if
7c90: 28 6f 50 74 72 20 3d 3d 20 4e 55 4c 4c 29 20 7b (oPtr == NULL) {
7ca0: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 ..return TCL_ERR
7cb0: 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 OR;. }. if
7cc0: 20 28 6f 50 74 72 2d 3e 66 6c 61 67 73 20 26 20 (oPtr->flags &
7cd0: 52 4f 4f 54 5f 4f 42 4a 45 43 54 29 20 7b 0a 09 ROOT_OBJECT) {..
7ce0: 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 Tcl_SetObjResult
7cf0: 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 (interp, Tcl_New
7d00: 53 74 72 69 6e 67 4f 62 6a 28 0a 09 09 22 6d 61 StringObj(..."ma
7d10: 79 20 6e 6f 74 20 6d 6f 64 69 66 79 20 74 68 65 y not modify the
7d20: 20 63 6c 61 73 73 20 6f 66 20 74 68 65 20 72 6f class of the ro
7d30: 6f 74 20 6f 62 6a 65 63 74 20 63 6c 61 73 73 22 ot object class"
7d40: 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 53 65 74 , -1));..Tcl_Set
7d50: 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 ErrorCode(interp
7d60: 2c 20 22 54 43 4c 22 2c 20 22 4f 4f 22 2c 20 22 , "TCL", "OO", "
7d70: 4d 4f 4e 4b 45 59 5f 42 55 53 49 4e 45 53 53 22 MONKEY_BUSINESS"
7d80: 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e , NULL);..return
7d90: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 TCL_ERROR;.
7da0: 7d 0a 20 20 20 20 69 66 20 28 6f 50 74 72 2d 3e }. if (oPtr->
7db0: 66 6c 61 67 73 20 26 20 52 4f 4f 54 5f 43 4c 41 flags & ROOT_CLA
7dc0: 53 53 29 20 7b 0a 09 54 63 6c 5f 53 65 74 4f 62 SS) {..Tcl_SetOb
7dd0: 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 jResult(interp,
7de0: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
7df0: 28 0a 09 09 22 6d 61 79 20 6e 6f 74 20 6d 6f 64 (..."may not mod
7e00: 69 66 79 20 74 68 65 20 63 6c 61 73 73 20 6f 66 ify the class of
7e10: 20 74 68 65 20 63 6c 61 73 73 20 6f 66 20 63 6c the class of cl
7e20: 61 73 73 65 73 22 2c 20 2d 31 29 29 3b 0a 09 54 asses", -1));..T
7e30: 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 cl_SetErrorCode(
7e40: 69 6e 74 65 72 70 2c 20 22 54 43 4c 22 2c 20 22 interp, "TCL", "
7e50: 4f 4f 22 2c 20 22 4d 4f 4e 4b 45 59 5f 42 55 53 OO", "MONKEY_BUS
7e60: 49 4e 45 53 53 22 2c 20 4e 55 4c 4c 29 3b 0a 09 INESS", NULL);..
7e70: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
7e80: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a ;. }.. /*.
7e90: 20 20 20 20 20 2a 20 50 61 72 73 65 20 74 68 65 * Parse the
7ea0: 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 67 65 74 argument to get
7eb0: 20 74 68 65 20 63 6c 61 73 73 20 74 6f 20 73 65 the class to se
7ec0: 74 20 74 68 65 20 6f 62 6a 65 63 74 27 73 20 63 t the object's c
7ed0: 6c 61 73 73 20 74 6f 2e 0a 20 20 20 20 20 2a 2f lass to.. */
7ee0: 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 21 .. if (objc !
7ef0: 3d 20 32 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e = 2) {..Tcl_Wron
7f00: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c gNumArgs(interp,
7f10: 20 31 2c 20 6f 62 6a 76 2c 20 22 63 6c 61 73 73 1, objv, "class
7f20: 4e 61 6d 65 22 29 3b 0a 09 72 65 74 75 72 6e 20 Name");..return
7f30: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d TCL_ERROR;. }
7f40: 0a 20 20 20 20 63 6c 73 50 74 72 20 3d 20 47 65 . clsPtr = Ge
7f50: 74 43 6c 61 73 73 49 6e 4f 75 74 65 72 43 6f 6e tClassInOuterCon
7f60: 74 65 78 74 28 69 6e 74 65 72 70 2c 20 6f 62 6a text(interp, obj
7f70: 76 5b 31 5d 2c 0a 09 20 20 20 20 22 74 68 65 20 v[1],.. "the
7f80: 63 6c 61 73 73 20 6f 66 20 61 6e 20 6f 62 6a 65 class of an obje
7f90: 63 74 20 6d 75 73 74 20 62 65 20 61 20 63 6c 61 ct must be a cla
7fa0: 73 73 22 29 3b 0a 20 20 20 20 69 66 20 28 63 6c ss");. if (cl
7fb0: 73 50 74 72 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a sPtr == NULL) {.
7fc0: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f .return TCL_ERRO
7fd0: 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a R;. }.. /*
7fe0: 0a 20 20 20 20 20 2a 20 41 70 70 6c 79 20 73 65 . * Apply se
7ff0: 6d 61 6e 74 69 63 20 63 68 65 63 6b 73 2e 20 49 mantic checks. I
8000: 6e 20 70 61 72 74 69 63 75 6c 61 72 2c 20 63 6c n particular, cl
8010: 61 73 73 65 73 20 61 6e 64 20 6e 6f 6e 2d 63 6c asses and non-cl
8020: 61 73 73 65 73 20 61 72 65 20 6e 6f 74 0a 20 20 asses are not.
8030: 20 20 20 2a 20 69 6e 74 65 72 63 68 61 6e 67 61 * interchanga
8040: 62 6c 65 20 28 74 6f 6f 20 63 6f 6d 70 6c 69 63 ble (too complic
8050: 61 74 65 64 20 74 6f 20 64 6f 20 74 68 65 20 63 ated to do the c
8060: 6f 6e 76 65 72 73 69 6f 6e 21 29 20 73 6f 20 77 onversion!) so w
8070: 65 20 6d 75 73 74 0a 20 20 20 20 20 2a 20 70 72 e must. * pr
8080: 6f 64 75 63 65 20 61 6e 20 65 72 72 6f 72 20 69 oduce an error i
8090: 66 20 61 6e 79 20 61 74 74 65 6d 70 74 20 69 73 f any attempt is
80a0: 20 6d 61 64 65 20 74 6f 20 73 77 61 70 20 66 72 made to swap fr
80b0: 6f 6d 20 6f 6e 65 20 74 6f 20 74 68 65 20 6f 74 om one to the ot
80c0: 68 65 72 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 her.. */..
80d0: 20 20 69 66 20 28 28 6f 50 74 72 2d 3e 63 6c 61 if ((oPtr->cla
80e0: 73 73 50 74 72 3d 3d 4e 55 4c 4c 29 20 3d 3d 20 ssPtr==NULL) ==
80f0: 54 63 6c 4f 4f 49 73 52 65 61 63 68 61 62 6c 65 TclOOIsReachable
8100: 28 66 50 74 72 2d 3e 63 6c 61 73 73 43 6c 73 2c (fPtr->classCls,
8110: 20 63 6c 73 50 74 72 29 29 20 7b 0a 09 54 63 6c clsPtr)) {..Tcl
8120: 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e _SetObjResult(in
8130: 74 65 72 70 2c 20 54 63 6c 5f 4f 62 6a 50 72 69 terp, Tcl_ObjPri
8140: 6e 74 66 28 0a 09 09 22 6d 61 79 20 6e 6f 74 20 ntf(..."may not
8150: 63 68 61 6e 67 65 20 61 20 25 73 63 6c 61 73 73 change a %sclass
8160: 20 6f 62 6a 65 63 74 20 69 6e 74 6f 20 61 20 25 object into a %
8170: 73 63 6c 61 73 73 20 6f 62 6a 65 63 74 22 2c 0a sclass object",.
8180: 09 09 28 6f 50 74 72 2d 3e 63 6c 61 73 73 50 74 ..(oPtr->classPt
8190: 72 3d 3d 4e 55 4c 4c 20 3f 20 22 6e 6f 6e 2d 22 r==NULL ? "non-"
81a0: 20 3a 20 22 22 29 2c 0a 09 09 28 6f 50 74 72 2d : ""),...(oPtr-
81b0: 3e 63 6c 61 73 73 50 74 72 3d 3d 4e 55 4c 4c 20 >classPtr==NULL
81c0: 3f 20 22 22 20 3a 20 22 6e 6f 6e 2d 22 29 29 29 ? "" : "non-")))
81d0: 3b 0a 09 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 ;..Tcl_SetErrorC
81e0: 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54 43 4c ode(interp, "TCL
81f0: 22 2c 20 22 4f 4f 22 2c 20 22 54 52 41 4e 53 4d ", "OO", "TRANSM
8200: 55 54 41 54 49 4f 4e 22 2c 20 4e 55 4c 4c 29 3b UTATION", NULL);
8210: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 ..return TCL_ERR
8220: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f OR;. }.. /
8230: 2a 0a 20 20 20 20 20 2a 20 53 65 74 20 74 68 65 *. * Set the
8240: 20 6f 62 6a 65 63 74 27 73 20 63 6c 61 73 73 2e object's class.
8250: 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 69 66 . */.. if
8260: 20 28 6f 50 74 72 2d 3e 73 65 6c 66 43 6c 73 20 (oPtr->selfCls
8270: 21 3d 20 63 6c 73 50 74 72 29 20 7b 0a 09 54 63 != clsPtr) {..Tc
8280: 6c 4f 4f 52 65 6d 6f 76 65 46 72 6f 6d 49 6e 73 lOORemoveFromIns
8290: 74 61 6e 63 65 73 28 6f 50 74 72 2c 20 6f 50 74 tances(oPtr, oPt
82a0: 72 2d 3e 73 65 6c 66 43 6c 73 29 3b 0a 09 6f 50 r->selfCls);..oP
82b0: 74 72 2d 3e 73 65 6c 66 43 6c 73 20 3d 20 63 6c tr->selfCls = cl
82c0: 73 50 74 72 3b 0a 09 54 63 6c 4f 4f 41 64 64 54 sPtr;..TclOOAddT
82d0: 6f 49 6e 73 74 61 6e 63 65 73 28 6f 50 74 72 2c oInstances(oPtr,
82e0: 20 6f 50 74 72 2d 3e 73 65 6c 66 43 6c 73 29 3b oPtr->selfCls);
82f0: 0a 09 69 66 20 28 21 28 63 6c 73 50 74 72 2d 3e ..if (!(clsPtr->
8300: 74 68 69 73 50 74 72 2d 3e 66 6c 61 67 73 20 26 thisPtr->flags &
8310: 20 4f 42 4a 45 43 54 5f 44 45 4c 45 54 45 44 29 OBJECT_DELETED)
8320: 29 20 7b 0a 09 20 20 20 20 6f 50 74 72 2d 3e 66 ) {.. oPtr->f
8330: 6c 61 67 73 20 26 3d 20 7e 43 4c 41 53 53 5f 47 lags &= ~CLASS_G
8340: 4f 4e 45 3b 0a 09 7d 0a 09 69 66 20 28 6f 50 74 ONE;..}..if (oPt
8350: 72 2d 3e 63 6c 61 73 73 50 74 72 20 21 3d 20 4e r->classPtr != N
8360: 55 4c 4c 29 20 7b 0a 09 20 20 20 20 42 75 6d 70 ULL) {.. Bump
8370: 47 6c 6f 62 61 6c 45 70 6f 63 68 28 69 6e 74 65 GlobalEpoch(inte
8380: 72 70 2c 20 6f 50 74 72 2d 3e 63 6c 61 73 73 50 rp, oPtr->classP
8390: 74 72 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 tr);..} else {..
83a0: 20 20 20 20 6f 50 74 72 2d 3e 65 70 6f 63 68 2b oPtr->epoch+
83b0: 2b 3b 0a 09 7d 0a 20 20 20 20 7d 0a 20 20 20 20 +;..}. }.
83c0: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d return TCL_OK;.}
83d0: 0a 0c 0a 2f 2a 0a 20 2a 20 2d 2d 2d 2d 2d 2d 2d .../*. * -------
83e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
83f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8400: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8410: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
8420: 20 2a 0a 20 2a 20 54 63 6c 4f 4f 44 65 66 69 6e *. * TclOODefin
8430: 65 43 6f 6e 73 74 72 75 63 74 6f 72 4f 62 6a 43 eConstructorObjC
8440: 6d 64 20 2d 2d 0a 20 2a 09 49 6d 70 6c 65 6d 65 md --. *.Impleme
8450: 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 22 ntation of the "
8460: 63 6f 6e 73 74 72 75 63 74 6f 72 22 20 73 75 62 constructor" sub
8470: 63 6f 6d 6d 61 6e 64 20 6f 66 20 74 68 65 20 22 command of the "
8480: 6f 6f 3a 3a 64 65 66 69 6e 65 22 0a 20 2a 09 63 oo::define". *.c
8490: 6f 6d 6d 61 6e 64 2e 0a 20 2a 0a 20 2a 20 2d 2d ommand.. *. * --
84a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
84b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
84c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
84d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
84e0: 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 69 6e 74 0a 54 63 ----. */..int.Tc
84f0: 6c 4f 4f 44 65 66 69 6e 65 43 6f 6e 73 74 72 75 lOODefineConstru
8500: 63 74 6f 72 4f 62 6a 43 6d 64 28 0a 20 20 20 20 ctorObjCmd(.
8510: 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e ClientData clien
8520: 74 44 61 74 61 2c 0a 20 20 20 20 54 63 6c 5f 49 tData,. Tcl_I
8530: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 nterp *interp,.
8540: 20 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 20 int objc,.
8550: 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 Tcl_Obj *const
8560: 2a 6f 62 6a 76 29 0a 7b 0a 20 20 20 20 4f 62 6a *objv).{. Obj
8570: 65 63 74 20 2a 6f 50 74 72 3b 0a 20 20 20 20 43 ect *oPtr;. C
8580: 6c 61 73 73 20 2a 63 6c 73 50 74 72 3b 0a 20 20 lass *clsPtr;.
8590: 20 20 54 63 6c 5f 4d 65 74 68 6f 64 20 6d 65 74 Tcl_Method met
85a0: 68 6f 64 3b 0a 20 20 20 20 69 6e 74 20 62 6f 64 hod;. int bod
85b0: 79 4c 65 6e 67 74 68 3b 0a 0a 20 20 20 20 69 66 yLength;.. if
85c0: 20 28 6f 62 6a 63 20 21 3d 20 33 29 20 7b 0a 09 (objc != 3) {..
85d0: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 Tcl_WrongNumArgs
85e0: 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 (interp, 1, objv
85f0: 2c 20 22 61 72 67 75 6d 65 6e 74 73 20 62 6f 64 , "arguments bod
8600: 79 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c y");..return TCL
8610: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 _ERROR;. }..
8620: 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 45 78 74 /*. * Ext
8630: 72 61 63 74 20 61 6e 64 20 76 61 6c 69 64 61 74 ract and validat
8640: 65 20 74 68 65 20 63 6f 6e 74 65 78 74 2c 20 77 e the context, w
8650: 68 69 63 68 20 69 73 20 74 68 65 20 63 6c 61 73 hich is the clas
8660: 73 20 74 68 61 74 20 77 65 20 77 69 73 68 20 74 s that we wish t
8670: 6f 0a 20 20 20 20 20 2a 20 6d 6f 64 69 66 79 2e o. * modify.
8680: 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 6f 50 . */.. oP
8690: 74 72 20 3d 20 28 4f 62 6a 65 63 74 20 2a 29 20 tr = (Object *)
86a0: 54 63 6c 4f 4f 47 65 74 44 65 66 69 6e 65 43 6d TclOOGetDefineCm
86b0: 64 43 6f 6e 74 65 78 74 28 69 6e 74 65 72 70 29 dContext(interp)
86c0: 3b 0a 20 20 20 20 69 66 20 28 6f 50 74 72 20 3d ;. if (oPtr =
86d0: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 = NULL) {..retur
86e0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 n TCL_ERROR;.
86f0: 20 7d 0a 20 20 20 20 63 6c 73 50 74 72 20 3d 20 }. clsPtr =
8700: 6f 50 74 72 2d 3e 63 6c 61 73 73 50 74 72 3b 0a oPtr->classPtr;.
8710: 0a 20 20 20 20 54 63 6c 5f 47 65 74 53 74 72 69 . Tcl_GetStri
8720: 6e 67 46 72 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 32 ngFromObj(objv[2
8730: 5d 2c 20 26 62 6f 64 79 4c 65 6e 67 74 68 29 3b ], &bodyLength);
8740: 0a 20 20 20 20 69 66 20 28 62 6f 64 79 4c 65 6e . if (bodyLen
8750: 67 74 68 20 3e 20 30 29 20 7b 0a 09 2f 2a 0a 09 gth > 0) {../*..
8760: 20 2a 20 43 72 65 61 74 65 20 74 68 65 20 6d 65 * Create the me
8770: 74 68 6f 64 20 73 74 72 75 63 74 75 72 65 2e 0a thod structure..
8780: 09 20 2a 2f 0a 0a 09 6d 65 74 68 6f 64 20 3d 20 . */...method =
8790: 28 54 63 6c 5f 4d 65 74 68 6f 64 29 20 54 63 6c (Tcl_Method) Tcl
87a0: 4f 4f 4e 65 77 50 72 6f 63 4d 65 74 68 6f 64 28 OONewProcMethod(
87b0: 69 6e 74 65 72 70 2c 20 63 6c 73 50 74 72 2c 0a interp, clsPtr,.
87c0: 09 09 50 55 42 4c 49 43 5f 4d 45 54 48 4f 44 2c ..PUBLIC_METHOD,
87d0: 20 4e 55 4c 4c 2c 20 6f 62 6a 76 5b 31 5d 2c 20 NULL, objv[1],
87e0: 6f 62 6a 76 5b 32 5d 2c 20 4e 55 4c 4c 29 3b 0a objv[2], NULL);.
87f0: 09 69 66 20 28 6d 65 74 68 6f 64 20 3d 3d 20 4e .if (method == N
8800: 55 4c 4c 29 20 7b 0a 09 20 20 20 20 72 65 74 75 ULL) {.. retu
8810: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d rn TCL_ERROR;..}
8820: 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 2f . } else {../
8830: 2a 0a 09 20 2a 20 44 65 6c 65 74 65 20 74 68 65 *.. * Delete the
8840: 20 63 6f 6e 73 74 72 75 63 74 6f 72 20 6d 65 74 constructor met
8850: 68 6f 64 20 72 65 63 6f 72 64 20 61 6e 64 20 73 hod record and s
8860: 65 74 20 74 68 65 20 66 69 65 6c 64 20 69 6e 20 et the field in
8870: 74 68 65 0a 09 20 2a 20 63 6c 61 73 73 20 72 65 the.. * class re
8880: 63 6f 72 64 20 74 6f 20 4e 55 4c 4c 2e 0a 09 20 cord to NULL...
8890: 2a 2f 0a 0a 09 6d 65 74 68 6f 64 20 3d 20 4e 55 */...method = NU
88a0: 4c 4c 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f LL;. }.. /
88b0: 2a 0a 20 20 20 20 20 2a 20 50 6c 61 63 65 20 74 *. * Place t
88c0: 68 65 20 6d 65 74 68 6f 64 20 73 74 72 75 63 74 he method struct
88d0: 75 72 65 20 69 6e 20 74 68 65 20 63 6c 61 73 73 ure in the class
88e0: 20 72 65 63 6f 72 64 2e 20 4e 6f 74 65 20 74 68 record. Note th
88f0: 61 74 20 77 65 20 6d 69 67 68 74 20 6e 6f 74 0a at we might not.
8900: 20 20 20 20 20 2a 20 69 6d 6d 65 64 69 61 74 65 * immediate
8910: 6c 79 20 64 65 6c 65 74 65 20 74 68 65 20 63 6f ly delete the co
8920: 6e 73 74 72 75 63 74 6f 72 20 61 73 20 74 68 69 nstructor as thi
8930: 73 20 6d 69 67 68 74 20 62 65 20 62 65 69 6e 67 s might be being
8940: 20 64 6f 6e 65 20 64 75 72 69 6e 67 0a 20 20 20 done during.
8950: 20 20 2a 20 65 78 65 63 75 74 69 6f 6e 20 6f 66 * execution of
8960: 20 74 68 65 20 63 6f 6e 73 74 72 75 63 74 6f 72 the constructor
8970: 20 69 74 73 65 6c 66 2e 0a 20 20 20 20 20 2a 2f itself.. */
8980: 0a 0a 20 20 20 20 54 63 6c 5f 43 6c 61 73 73 53 .. Tcl_ClassS
8990: 65 74 43 6f 6e 73 74 72 75 63 74 6f 72 28 69 6e etConstructor(in
89a0: 74 65 72 70 2c 20 28 54 63 6c 5f 43 6c 61 73 73 terp, (Tcl_Class
89b0: 29 20 63 6c 73 50 74 72 2c 20 6d 65 74 68 6f 64 ) clsPtr, method
89c0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 );. return TC
89d0: 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 20 L_OK;.}.../*. *
89e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
89f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8a00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8a10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8a20: 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 63 6c ------. *. * Tcl
8a30: 4f 4f 44 65 66 69 6e 65 44 65 6c 65 74 65 4d 65 OODefineDeleteMe
8a40: 74 68 6f 64 4f 62 6a 43 6d 64 20 2d 2d 0a 20 2a thodObjCmd --. *
8a50: 09 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 .Implementation
8a60: 6f 66 20 74 68 65 20 22 64 65 6c 65 74 65 6d 65 of the "deleteme
8a70: 74 68 6f 64 22 20 73 75 62 63 6f 6d 6d 61 6e 64 thod" subcommand
8a80: 20 6f 66 20 74 68 65 20 22 6f 6f 3a 3a 64 65 66 of the "oo::def
8a90: 69 6e 65 22 0a 20 2a 09 61 6e 64 20 22 6f 6f 3a ine". *.and "oo:
8aa0: 3a 6f 62 6a 64 65 66 69 6e 65 22 20 63 6f 6d 6d :objdefine" comm
8ab0: 61 6e 64 73 2e 0a 20 2a 0a 20 2a 20 2d 2d 2d 2d ands.. *. * ----
8ac0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8ad0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8ae0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8af0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8b00: 2d 2d 0a 20 2a 2f 0a 0a 69 6e 74 0a 54 63 6c 4f --. */..int.TclO
8b10: 4f 44 65 66 69 6e 65 44 65 6c 65 74 65 4d 65 74 ODefineDeleteMet
8b20: 68 6f 64 4f 62 6a 43 6d 64 28 0a 20 20 20 20 43 hodObjCmd(. C
8b30: 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 lientData client
8b40: 44 61 74 61 2c 0a 20 20 20 20 54 63 6c 5f 49 6e Data,. Tcl_In
8b50: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 terp *interp,.
8b60: 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 20 20 int objc,.
8b70: 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 2a Tcl_Obj *const *
8b80: 6f 62 6a 76 29 0a 7b 0a 20 20 20 20 69 6e 74 20 objv).{. int
8b90: 69 73 49 6e 73 74 61 6e 63 65 44 65 6c 65 74 65 isInstanceDelete
8ba0: 4d 65 74 68 6f 64 20 3d 20 28 63 6c 69 65 6e 74 Method = (client
8bb0: 44 61 74 61 20 21 3d 20 4e 55 4c 4c 29 3b 0a 20 Data != NULL);.
8bc0: 20 20 20 4f 62 6a 65 63 74 20 2a 6f 50 74 72 3b Object *oPtr;
8bd0: 0a 20 20 20 20 69 6e 74 20 69 3b 0a 0a 20 20 20 . int i;..
8be0: 20 69 66 20 28 6f 62 6a 63 20 3c 20 32 29 20 7b if (objc < 2) {
8bf0: 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 ..Tcl_WrongNumAr
8c00: 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 gs(interp, 1, ob
8c10: 6a 76 2c 20 22 6e 61 6d 65 20 3f 6e 61 6d 65 20 jv, "name ?name
8c20: 2e 2e 2e 3f 22 29 3b 0a 09 72 65 74 75 72 6e 20 ...?");..return
8c30: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d TCL_ERROR;. }
8c40: 0a 0a 20 20 20 20 6f 50 74 72 20 3d 20 28 4f 62 .. oPtr = (Ob
8c50: 6a 65 63 74 20 2a 29 20 54 63 6c 4f 4f 47 65 74 ject *) TclOOGet
8c60: 44 65 66 69 6e 65 43 6d 64 43 6f 6e 74 65 78 74 DefineCmdContext
8c70: 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 69 66 (interp);. if
8c80: 20 28 6f 50 74 72 20 3d 3d 20 4e 55 4c 4c 29 20 (oPtr == NULL)
8c90: 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 {..return TCL_ER
8ca0: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 ROR;. }. i
8cb0: 66 20 28 21 69 73 49 6e 73 74 61 6e 63 65 44 65 f (!isInstanceDe
8cc0: 6c 65 74 65 4d 65 74 68 6f 64 20 26 26 20 21 6f leteMethod && !o
8cd0: 50 74 72 2d 3e 63 6c 61 73 73 50 74 72 29 20 7b Ptr->classPtr) {
8ce0: 0a 09 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 ..Tcl_SetObjResu
8cf0: 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e lt(interp, Tcl_N
8d00: 65 77 53 74 72 69 6e 67 4f 62 6a 28 0a 09 09 22 ewStringObj(..."
8d10: 61 74 74 65 6d 70 74 20 74 6f 20 6d 69 73 75 73 attempt to misus
8d20: 65 20 41 50 49 22 2c 20 2d 31 29 29 3b 0a 09 54 e API", -1));..T
8d30: 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 cl_SetErrorCode(
8d40: 69 6e 74 65 72 70 2c 20 22 54 43 4c 22 2c 20 22 interp, "TCL", "
8d50: 4f 4f 22 2c 20 22 4d 4f 4e 4b 45 59 5f 42 55 53 OO", "MONKEY_BUS
8d60: 49 4e 45 53 53 22 2c 20 4e 55 4c 4c 29 3b 0a 09 INESS", NULL);..
8d70: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
8d80: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72 ;. }.. for
8d90: 20 28 69 3d 31 20 3b 20 69 3c 6f 62 6a 63 20 3b (i=1 ; i<objc ;
8da0: 20 69 2b 2b 29 20 7b 0a 09 2f 2a 0a 09 20 2a 20 i++) {../*.. *
8db0: 44 65 6c 65 74 65 20 74 68 65 20 6d 65 74 68 6f Delete the metho
8dc0: 64 20 73 74 72 75 63 74 75 72 65 20 66 72 6f 6d d structure from
8dd0: 20 74 68 65 20 61 70 70 72 6f 70 72 69 61 74 65 the appropriate
8de0: 20 68 61 73 68 20 74 61 62 6c 65 2e 0a 09 20 2a hash table... *
8df0: 2f 0a 0a 09 69 66 20 28 52 65 6e 61 6d 65 44 65 /...if (RenameDe
8e00: 6c 65 74 65 4d 65 74 68 6f 64 28 69 6e 74 65 72 leteMethod(inter
8e10: 70 2c 20 6f 50 74 72 2c 20 21 69 73 49 6e 73 74 p, oPtr, !isInst
8e20: 61 6e 63 65 44 65 6c 65 74 65 4d 65 74 68 6f 64 anceDeleteMethod
8e30: 2c 0a 09 09 6f 62 6a 76 5b 69 5d 2c 20 4e 55 4c ,...objv[i], NUL
8e40: 4c 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a L) != TCL_OK) {.
8e50: 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f . return TCL_
8e60: 45 52 52 4f 52 3b 0a 09 7d 0a 20 20 20 20 7d 0a ERROR;..}. }.
8e70: 0a 20 20 20 20 69 66 20 28 69 73 49 6e 73 74 61 . if (isInsta
8e80: 6e 63 65 44 65 6c 65 74 65 4d 65 74 68 6f 64 29 nceDeleteMethod)
8e90: 20 7b 0a 09 6f 50 74 72 2d 3e 65 70 6f 63 68 2b {..oPtr->epoch+
8ea0: 2b 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a +;. } else {.
8eb0: 09 42 75 6d 70 47 6c 6f 62 61 6c 45 70 6f 63 68 .BumpGlobalEpoch
8ec0: 28 69 6e 74 65 72 70 2c 20 6f 50 74 72 2d 3e 63 (interp, oPtr->c
8ed0: 6c 61 73 73 50 74 72 29 3b 0a 20 20 20 20 7d 0a lassPtr);. }.
8ee0: 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f return TCL_O
8ef0: 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 20 2d 2d 2d K;.}.../*. * ---
8f00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8f10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8f20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8f30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8f40: 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 63 6c 4f 4f 44 ---. *. * TclOOD
8f50: 65 66 69 6e 65 44 65 73 74 72 75 63 74 6f 72 4f efineDestructorO
8f60: 62 6a 43 6d 64 20 2d 2d 0a 20 2a 09 49 6d 70 6c bjCmd --. *.Impl
8f70: 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 ementation of th
8f80: 65 20 22 64 65 73 74 72 75 63 74 6f 72 22 20 73 e "destructor" s
8f90: 75 62 63 6f 6d 6d 61 6e 64 20 6f 66 20 74 68 65 ubcommand of the
8fa0: 20 22 6f 6f 3a 3a 64 65 66 69 6e 65 22 0a 20 2a "oo::define". *
8fb0: 09 63 6f 6d 6d 61 6e 64 2e 0a 20 2a 0a 20 2a 20 .command.. *. *
8fc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8fd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8fe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
8ff0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9000: 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 69 6e 74 0a ------. */..int.
9010: 54 63 6c 4f 4f 44 65 66 69 6e 65 44 65 73 74 72 TclOODefineDestr
9020: 75 63 74 6f 72 4f 62 6a 43 6d 64 28 0a 20 20 20 uctorObjCmd(.
9030: 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 ClientData clie
9040: 6e 74 44 61 74 61 2c 0a 20 20 20 20 54 63 6c 5f ntData,. Tcl_
9050: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a Interp *interp,.
9060: 20 20 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 int objc,.
9070: 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 Tcl_Obj *const
9080: 20 2a 6f 62 6a 76 29 0a 7b 0a 20 20 20 20 4f 62 *objv).{. Ob
9090: 6a 65 63 74 20 2a 6f 50 74 72 3b 0a 20 20 20 20 ject *oPtr;.
90a0: 43 6c 61 73 73 20 2a 63 6c 73 50 74 72 3b 0a 20 Class *clsPtr;.
90b0: 20 20 20 54 63 6c 5f 4d 65 74 68 6f 64 20 6d 65 Tcl_Method me
90c0: 74 68 6f 64 3b 0a 20 20 20 20 69 6e 74 20 62 6f thod;. int bo
90d0: 64 79 4c 65 6e 67 74 68 3b 0a 0a 20 20 20 20 69 dyLength;.. i
90e0: 66 20 28 6f 62 6a 63 20 21 3d 20 32 29 20 7b 0a f (objc != 2) {.
90f0: 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 .Tcl_WrongNumArg
9100: 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a s(interp, 1, obj
9110: 76 2c 20 22 62 6f 64 79 22 29 3b 0a 09 72 65 74 v, "body");..ret
9120: 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 urn TCL_ERROR;.
9130: 20 20 20 7d 0a 0a 20 20 20 20 6f 50 74 72 20 3d }.. oPtr =
9140: 20 28 4f 62 6a 65 63 74 20 2a 29 20 54 63 6c 4f (Object *) TclO
9150: 4f 47 65 74 44 65 66 69 6e 65 43 6d 64 43 6f 6e OGetDefineCmdCon
9160: 74 65 78 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 text(interp);.
9170: 20 20 69 66 20 28 6f 50 74 72 20 3d 3d 20 4e 55 if (oPtr == NU
9180: 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 LL) {..return TC
9190: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 L_ERROR;. }.
91a0: 20 20 20 63 6c 73 50 74 72 20 3d 20 6f 50 74 72 clsPtr = oPtr
91b0: 2d 3e 63 6c 61 73 73 50 74 72 3b 0a 0a 20 20 20 ->classPtr;..
91c0: 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 46 72 Tcl_GetStringFr
91d0: 6f 6d 4f 62 6a 28 6f 62 6a 76 5b 31 5d 2c 20 26 omObj(objv[1], &
91e0: 62 6f 64 79 4c 65 6e 67 74 68 29 3b 0a 20 20 20 bodyLength);.
91f0: 20 69 66 20 28 62 6f 64 79 4c 65 6e 67 74 68 20 if (bodyLength
9200: 3e 20 30 29 20 7b 0a 09 2f 2a 0a 09 20 2a 20 43 > 0) {../*.. * C
9210: 72 65 61 74 65 20 74 68 65 20 6d 65 74 68 6f 64 reate the method
9220: 20 73 74 72 75 63 74 75 72 65 2e 0a 09 20 2a 2f structure... */
9230: 0a 0a 09 6d 65 74 68 6f 64 20 3d 20 28 54 63 6c ...method = (Tcl
9240: 5f 4d 65 74 68 6f 64 29 20 54 63 6c 4f 4f 4e 65 _Method) TclOONe
9250: 77 50 72 6f 63 4d 65 74 68 6f 64 28 69 6e 74 65 wProcMethod(inte
9260: 72 70 2c 20 63 6c 73 50 74 72 2c 0a 09 09 50 55 rp, clsPtr,...PU
9270: 42 4c 49 43 5f 4d 45 54 48 4f 44 2c 20 4e 55 4c BLIC_METHOD, NUL
9280: 4c 2c 20 4e 55 4c 4c 2c 20 6f 62 6a 76 5b 31 5d L, NULL, objv[1]
9290: 2c 20 4e 55 4c 4c 29 3b 0a 09 69 66 20 28 6d 65 , NULL);..if (me
92a0: 74 68 6f 64 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a thod == NULL) {.
92b0: 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f . return TCL_
92c0: 45 52 52 4f 52 3b 0a 09 7d 0a 20 20 20 20 7d 20 ERROR;..}. }
92d0: 65 6c 73 65 20 7b 0a 09 2f 2a 0a 09 20 2a 20 44 else {../*.. * D
92e0: 65 6c 65 74 65 20 74 68 65 20 64 65 73 74 72 75 elete the destru
92f0: 63 74 6f 72 20 6d 65 74 68 6f 64 20 72 65 63 6f ctor method reco
9300: 72 64 20 61 6e 64 20 73 65 74 20 74 68 65 20 66 rd and set the f
9310: 69 65 6c 64 20 69 6e 20 74 68 65 20 63 6c 61 73 ield in the clas
9320: 73 0a 09 20 2a 20 72 65 63 6f 72 64 20 74 6f 20 s.. * record to
9330: 4e 55 4c 4c 2e 0a 09 20 2a 2f 0a 0a 09 6d 65 74 NULL... */...met
9340: 68 6f 64 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 hod = NULL;.
9350: 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a }.. /*. *
9360: 20 50 6c 61 63 65 20 74 68 65 20 6d 65 74 68 6f Place the metho
9370: 64 20 73 74 72 75 63 74 75 72 65 20 69 6e 20 74 d structure in t
9380: 68 65 20 63 6c 61 73 73 20 72 65 63 6f 72 64 2e he class record.
9390: 20 4e 6f 74 65 20 74 68 61 74 20 77 65 20 6d 69 Note that we mi
93a0: 67 68 74 20 6e 6f 74 0a 20 20 20 20 20 2a 20 69 ght not. * i
93b0: 6d 6d 65 64 69 61 74 65 6c 79 20 64 65 6c 65 74 mmediately delet
93c0: 65 20 74 68 65 20 64 65 73 74 72 75 63 74 6f 72 e the destructor
93d0: 20 61 73 20 74 68 69 73 20 6d 69 67 68 74 20 62 as this might b
93e0: 65 20 62 65 69 6e 67 20 64 6f 6e 65 20 64 75 72 e being done dur
93f0: 69 6e 67 0a 20 20 20 20 20 2a 20 65 78 65 63 75 ing. * execu
9400: 74 69 6f 6e 20 6f 66 20 74 68 65 20 64 65 73 74 tion of the dest
9410: 72 75 63 74 6f 72 20 69 74 73 65 6c 66 2e 20 41 ructor itself. A
9420: 6c 73 6f 20 6e 6f 74 65 20 74 68 61 74 20 73 65 lso note that se
9430: 74 74 69 6e 67 20 61 0a 20 20 20 20 20 2a 20 64 tting a. * d
9440: 65 73 74 72 75 63 74 6f 72 20 64 75 72 69 6e 67 estructor during
9450: 20 61 20 64 65 73 74 72 75 63 74 6f 72 20 69 73 a destructor is
9460: 20 66 61 69 72 6c 79 20 64 75 6d 62 20 61 6e 79 fairly dumb any
9470: 77 61 79 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 way.. */..
9480: 20 20 54 63 6c 5f 43 6c 61 73 73 53 65 74 44 65 Tcl_ClassSetDe
9490: 73 74 72 75 63 74 6f 72 28 69 6e 74 65 72 70 2c structor(interp,
94a0: 20 28 54 63 6c 5f 43 6c 61 73 73 29 20 63 6c 73 (Tcl_Class) cls
94b0: 50 74 72 2c 20 6d 65 74 68 6f 64 29 3b 0a 20 20 Ptr, method);.
94c0: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b return TCL_OK;
94d0: 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 20 2d 2d 2d 2d 2d .}.../*. * -----
94e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
94f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9500: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9510: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9520: 2d 0a 20 2a 0a 20 2a 20 54 63 6c 4f 4f 44 65 66 -. *. * TclOODef
9530: 69 6e 65 45 78 70 6f 72 74 4f 62 6a 43 6d 64 20 ineExportObjCmd
9540: 2d 2d 0a 20 2a 09 49 6d 70 6c 65 6d 65 6e 74 61 --. *.Implementa
9550: 74 69 6f 6e 20 6f 66 20 74 68 65 20 22 65 78 70 tion of the "exp
9560: 6f 72 74 22 20 73 75 62 63 6f 6d 6d 61 6e 64 20 ort" subcommand
9570: 6f 66 20 74 68 65 20 22 6f 6f 3a 3a 64 65 66 69 of the "oo::defi
9580: 6e 65 22 20 61 6e 64 0a 20 2a 09 22 6f 6f 3a 3a ne" and. *."oo::
9590: 6f 62 6a 64 65 66 69 6e 65 22 20 63 6f 6d 6d 61 objdefine" comma
95a0: 6e 64 73 2e 0a 20 2a 0a 20 2a 20 2d 2d 2d 2d 2d nds.. *. * -----
95b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
95c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
95d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
95e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
95f0: 2d 0a 20 2a 2f 0a 0a 69 6e 74 0a 54 63 6c 4f 4f -. */..int.TclOO
9600: 44 65 66 69 6e 65 45 78 70 6f 72 74 4f 62 6a 43 DefineExportObjC
9610: 6d 64 28 0a 20 20 20 20 43 6c 69 65 6e 74 44 61 md(. ClientDa
9620: 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 ta clientData,.
9630: 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 Tcl_Interp *i
9640: 6e 74 65 72 70 2c 0a 20 20 20 20 69 6e 74 20 6f nterp,. int o
9650: 62 6a 63 2c 0a 20 20 20 20 54 63 6c 5f 4f 62 6a bjc,. Tcl_Obj
9660: 20 2a 63 6f 6e 73 74 20 2a 6f 62 6a 76 29 0a 7b *const *objv).{
9670: 0a 20 20 20 20 69 6e 74 20 69 73 49 6e 73 74 61 . int isInsta
9680: 6e 63 65 45 78 70 6f 72 74 20 3d 20 28 63 6c 69 nceExport = (cli
9690: 65 6e 74 44 61 74 61 20 21 3d 20 4e 55 4c 4c 29 entData != NULL)
96a0: 3b 0a 20 20 20 20 4f 62 6a 65 63 74 20 2a 6f 50 ;. Object *oP
96b0: 74 72 3b 0a 20 20 20 20 4d 65 74 68 6f 64 20 2a tr;. Method *
96c0: 6d 50 74 72 3b 0a 20 20 20 20 54 63 6c 5f 48 61 mPtr;. Tcl_Ha
96d0: 73 68 45 6e 74 72 79 20 2a 68 50 74 72 3b 0a 20 shEntry *hPtr;.
96e0: 20 20 20 43 6c 61 73 73 20 2a 63 6c 73 50 74 72 Class *clsPtr
96f0: 3b 0a 20 20 20 20 69 6e 74 20 69 2c 20 69 73 4e ;. int i, isN
9700: 65 77 2c 20 63 68 61 6e 67 65 64 20 3d 20 30 3b ew, changed = 0;
9710: 0a 0a 20 20 20 20 69 66 20 28 6f 62 6a 63 20 3c .. if (objc <
9720: 20 32 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 2) {..Tcl_Wrong
9730: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 NumArgs(interp,
9740: 31 2c 20 6f 62 6a 76 2c 20 22 6e 61 6d 65 20 3f 1, objv, "name ?
9750: 6e 61 6d 65 20 2e 2e 2e 3f 22 29 3b 0a 09 72 65 name ...?");..re
9760: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
9770: 20 20 20 20 7d 0a 0a 20 20 20 20 6f 50 74 72 20 }.. oPtr
9780: 3d 20 28 4f 62 6a 65 63 74 20 2a 29 20 54 63 6c = (Object *) Tcl
9790: 4f 4f 47 65 74 44 65 66 69 6e 65 43 6d 64 43 6f OOGetDefineCmdCo
97a0: 6e 74 65 78 74 28 69 6e 74 65 72 70 29 3b 0a 20 ntext(interp);.
97b0: 20 20 20 69 66 20 28 6f 50 74 72 20 3d 3d 20 4e if (oPtr == N
97c0: 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 ULL) {..return T
97d0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a CL_ERROR;. }.
97e0: 20 20 20 20 63 6c 73 50 74 72 20 3d 20 6f 50 74 clsPtr = oPt
97f0: 72 2d 3e 63 6c 61 73 73 50 74 72 3b 0a 20 20 20 r->classPtr;.
9800: 20 69 66 20 28 21 69 73 49 6e 73 74 61 6e 63 65 if (!isInstance
9810: 45 78 70 6f 72 74 20 26 26 20 21 63 6c 73 50 74 Export && !clsPt
9820: 72 29 20 7b 0a 09 54 63 6c 5f 53 65 74 4f 62 6a r) {..Tcl_SetObj
9830: 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 Result(interp, T
9840: 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 cl_NewStringObj(
9850: 0a 09 09 22 61 74 74 65 6d 70 74 20 74 6f 20 6d ..."attempt to m
9860: 69 73 75 73 65 20 41 50 49 22 2c 20 2d 31 29 29 isuse API", -1))
9870: 3b 0a 09 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 ;..Tcl_SetErrorC
9880: 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54 43 4c ode(interp, "TCL
9890: 22 2c 20 22 4f 4f 22 2c 20 22 4d 4f 4e 4b 45 59 ", "OO", "MONKEY
98a0: 5f 42 55 53 49 4e 45 53 53 22 2c 20 4e 55 4c 4c _BUSINESS", NULL
98b0: 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 );..return TCL_E
98c0: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 RROR;. }..
98d0: 20 66 6f 72 20 28 69 3d 31 20 3b 20 69 3c 6f 62 for (i=1 ; i<ob
98e0: 6a 63 20 3b 20 69 2b 2b 29 20 7b 0a 09 2f 2a 0a jc ; i++) {../*.
98f0: 09 20 2a 20 45 78 70 6f 72 74 69 6e 67 20 69 73 . * Exporting is
9900: 20 64 6f 6e 65 20 62 79 20 61 64 64 69 6e 67 20 done by adding
9910: 74 68 65 20 50 55 42 4c 49 43 5f 4d 45 54 48 4f the PUBLIC_METHO
9920: 44 20 66 6c 61 67 20 74 6f 20 74 68 65 20 6d 65 D flag to the me
9930: 74 68 6f 64 0a 09 20 2a 20 72 65 63 6f 72 64 2e thod.. * record.
9940: 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 If there is no
9950: 73 75 63 68 20 6d 65 74 68 6f 64 20 69 6e 20 74 such method in t
9960: 68 69 73 20 6f 62 6a 65 63 74 20 6f 72 20 63 6c his object or cl
9970: 61 73 73 20 28 69 2e 65 2e 0a 09 20 2a 20 74 68 ass (i.e... * th
9980: 65 20 6d 65 74 68 6f 64 20 63 6f 6d 65 73 20 66 e method comes f
9990: 72 6f 6d 20 73 6f 6d 65 74 68 69 6e 67 20 69 6e rom something in
99a0: 68 65 72 69 74 65 64 20 66 72 6f 6d 20 6f 72 20 herited from or
99b0: 74 68 61 74 20 77 65 27 72 65 20 61 6e 0a 09 20 that we're an..
99c0: 2a 20 69 6e 73 74 61 6e 63 65 20 6f 66 29 20 74 * instance of) t
99d0: 68 65 6e 20 77 65 20 70 75 74 20 69 6e 20 61 20 hen we put in a
99e0: 62 6c 61 6e 6b 20 72 65 63 6f 72 64 20 77 69 74 blank record wit
99f0: 68 20 74 68 61 74 20 66 6c 61 67 3b 20 73 75 63 h that flag; suc
9a00: 68 0a 09 20 2a 20 72 65 63 6f 72 64 73 20 61 72 h.. * records ar
9a10: 65 20 73 6b 69 70 70 65 64 20 6f 76 65 72 20 62 e skipped over b
9a20: 79 20 74 68 65 20 63 61 6c 6c 20 63 68 61 69 6e y the call chain
9a30: 20 65 6e 67 69 6e 65 20 2a 65 78 63 65 70 74 2a engine *except*
9a40: 20 66 6f 72 0a 09 20 2a 20 74 68 65 69 72 20 66 for.. * their f
9a50: 6c 61 67 73 20 6d 65 6d 62 65 72 2e 0a 09 20 2a lags member... *
9a60: 2f 0a 0a 09 69 66 20 28 69 73 49 6e 73 74 61 6e /...if (isInstan
9a70: 63 65 45 78 70 6f 72 74 29 20 7b 0a 09 20 20 20 ceExport) {..
9a80: 20 69 66 20 28 21 6f 50 74 72 2d 3e 6d 65 74 68 if (!oPtr->meth
9a90: 6f 64 73 50 74 72 29 20 7b 0a 09 09 6f 50 74 72 odsPtr) {...oPtr
9aa0: 2d 3e 6d 65 74 68 6f 64 73 50 74 72 20 3d 20 63 ->methodsPtr = c
9ab0: 6b 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 54 63 kalloc(sizeof(Tc
9ac0: 6c 5f 48 61 73 68 54 61 62 6c 65 29 29 3b 0a 09 l_HashTable));..
9ad0: 09 54 63 6c 5f 49 6e 69 74 4f 62 6a 48 61 73 68 .Tcl_InitObjHash
9ae0: 54 61 62 6c 65 28 6f 50 74 72 2d 3e 6d 65 74 68 Table(oPtr->meth
9af0: 6f 64 73 50 74 72 29 3b 0a 09 09 6f 50 74 72 2d odsPtr);...oPtr-
9b00: 3e 66 6c 61 67 73 20 26 3d 20 7e 55 53 45 5f 43 >flags &= ~USE_C
9b10: 4c 41 53 53 5f 43 41 43 48 45 3b 0a 09 20 20 20 LASS_CACHE;..
9b20: 20 7d 0a 09 20 20 20 20 68 50 74 72 20 3d 20 54 }.. hPtr = T
9b30: 63 6c 5f 43 72 65 61 74 65 48 61 73 68 45 6e 74 cl_CreateHashEnt
9b40: 72 79 28 6f 50 74 72 2d 3e 6d 65 74 68 6f 64 73 ry(oPtr->methods
9b50: 50 74 72 2c 20 28 63 68 61 72 20 2a 29 20 6f 62 Ptr, (char *) ob
9b60: 6a 76 5b 69 5d 2c 0a 09 09 20 20 20 20 26 69 73 jv[i],... &is
9b70: 4e 65 77 29 3b 0a 09 7d 20 65 6c 73 65 20 7b 0a New);..} else {.
9b80: 09 20 20 20 20 68 50 74 72 20 3d 20 54 63 6c 5f . hPtr = Tcl_
9b90: 43 72 65 61 74 65 48 61 73 68 45 6e 74 72 79 28 CreateHashEntry(
9ba0: 26 63 6c 73 50 74 72 2d 3e 63 6c 61 73 73 4d 65 &clsPtr->classMe
9bb0: 74 68 6f 64 73 2c 20 28 63 68 61 72 2a 29 20 6f thods, (char*) o
9bc0: 62 6a 76 5b 69 5d 2c 0a 09 09 20 20 20 20 26 69 bjv[i],... &i
9bd0: 73 4e 65 77 29 3b 0a 09 7d 0a 0a 09 69 66 20 28 sNew);..}...if (
9be0: 69 73 4e 65 77 29 20 7b 0a 09 20 20 20 20 6d 50 isNew) {.. mP
9bf0: 74 72 20 3d 20 63 6b 61 6c 6c 6f 63 28 73 69 7a tr = ckalloc(siz
9c00: 65 6f 66 28 4d 65 74 68 6f 64 29 29 3b 0a 09 20 eof(Method));..
9c10: 20 20 20 6d 65 6d 73 65 74 28 6d 50 74 72 2c 20 memset(mPtr,
9c20: 30 2c 20 73 69 7a 65 6f 66 28 4d 65 74 68 6f 64 0, sizeof(Method
9c30: 29 29 3b 0a 09 20 20 20 20 6d 50 74 72 2d 3e 72 ));.. mPtr->r
9c40: 65 66 43 6f 75 6e 74 20 3d 20 31 3b 0a 09 20 20 efCount = 1;..
9c50: 20 20 6d 50 74 72 2d 3e 6e 61 6d 65 50 74 72 20 mPtr->namePtr
9c60: 3d 20 6f 62 6a 76 5b 69 5d 3b 0a 09 20 20 20 20 = objv[i];..
9c70: 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 Tcl_IncrRefCount
9c80: 28 6f 62 6a 76 5b 69 5d 29 3b 0a 09 20 20 20 20 (objv[i]);..
9c90: 54 63 6c 5f 53 65 74 48 61 73 68 56 61 6c 75 65 Tcl_SetHashValue
9ca0: 28 68 50 74 72 2c 20 6d 50 74 72 29 3b 0a 09 7d (hPtr, mPtr);..}
9cb0: 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 6d 50 74 else {.. mPt
9cc0: 72 20 3d 20 54 63 6c 5f 47 65 74 48 61 73 68 56 r = Tcl_GetHashV
9cd0: 61 6c 75 65 28 68 50 74 72 29 3b 0a 09 7d 0a 09 alue(hPtr);..}..
9ce0: 69 66 20 28 69 73 4e 65 77 20 7c 7c 20 21 28 6d if (isNew || !(m
9cf0: 50 74 72 2d 3e 66 6c 61 67 73 20 26 20 50 55 42 Ptr->flags & PUB
9d00: 4c 49 43 5f 4d 45 54 48 4f 44 29 29 20 7b 0a 09 LIC_METHOD)) {..
9d10: 20 20 20 20 6d 50 74 72 2d 3e 66 6c 61 67 73 20 mPtr->flags
9d20: 7c 3d 20 50 55 42 4c 49 43 5f 4d 45 54 48 4f 44 |= PUBLIC_METHOD
9d30: 3b 0a 09 20 20 20 20 63 68 61 6e 67 65 64 20 3d ;.. changed =
9d40: 20 31 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 1;..}. }..
9d50: 20 20 2f 2a 0a 20 20 20 20 20 2a 20 42 75 6d 70 /*. * Bump
9d60: 20 74 68 65 20 72 69 67 68 74 20 65 70 6f 63 68 the right epoch
9d70: 20 69 66 20 77 65 20 61 63 74 75 61 6c 6c 79 20 if we actually
9d80: 63 68 61 6e 67 65 64 20 61 6e 79 74 68 69 6e 67 changed anything
9d90: 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 69 .. */.. i
9da0: 66 20 28 63 68 61 6e 67 65 64 29 20 7b 0a 09 69 f (changed) {..i
9db0: 66 20 28 69 73 49 6e 73 74 61 6e 63 65 45 78 70 f (isInstanceExp
9dc0: 6f 72 74 29 20 7b 0a 09 20 20 20 20 6f 50 74 72 ort) {.. oPtr
9dd0: 2d 3e 65 70 6f 63 68 2b 2b 3b 0a 09 7d 20 65 6c ->epoch++;..} el
9de0: 73 65 20 7b 0a 09 20 20 20 20 42 75 6d 70 47 6c se {.. BumpGl
9df0: 6f 62 61 6c 45 70 6f 63 68 28 69 6e 74 65 72 70 obalEpoch(interp
9e00: 2c 20 63 6c 73 50 74 72 29 3b 0a 09 7d 0a 20 20 , clsPtr);..}.
9e10: 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 54 }. return T
9e20: 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a CL_OK;.}.../*. *
9e30: 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ---------------
9e40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9e50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9e60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9e70: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 63 -------. *. * Tc
9e80: 6c 4f 4f 44 65 66 69 6e 65 46 6f 72 77 61 72 64 lOODefineForward
9e90: 4f 62 6a 43 6d 64 20 2d 2d 0a 20 2a 09 49 6d 70 ObjCmd --. *.Imp
9ea0: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 lementation of t
9eb0: 68 65 20 22 66 6f 72 77 61 72 64 22 20 73 75 62 he "forward" sub
9ec0: 63 6f 6d 6d 61 6e 64 20 6f 66 20 74 68 65 20 22 command of the "
9ed0: 6f 6f 3a 3a 64 65 66 69 6e 65 22 20 61 6e 64 0a oo::define" and.
9ee0: 20 2a 09 22 6f 6f 3a 3a 6f 62 6a 64 65 66 69 6e *."oo::objdefin
9ef0: 65 22 20 63 6f 6d 6d 61 6e 64 73 2e 0a 20 2a 0a e" commands.. *.
9f00: 20 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d * -------------
9f10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9f20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9f30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
9f40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 69 ---------. */..i
9f50: 6e 74 0a 54 63 6c 4f 4f 44 65 66 69 6e 65 46 6f nt.TclOODefineFo
9f60: 72 77 61 72 64 4f 62 6a 43 6d 64 28 0a 20 20 20 rwardObjCmd(.
9f70: 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 ClientData clie
9f80: 6e 74 44 61 74 61 2c 0a 20 20 20 20 54 63 6c 5f ntData,. Tcl_
9f90: 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a Interp *interp,.
9fa0: 20 20 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 int objc,.
9fb0: 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 Tcl_Obj *const
9fc0: 20 2a 6f 62 6a 76 29 0a 7b 0a 20 20 20 20 69 6e *objv).{. in
9fd0: 74 20 69 73 49 6e 73 74 61 6e 63 65 46 6f 72 77 t isInstanceForw
9fe0: 61 72 64 20 3d 20 28 63 6c 69 65 6e 74 44 61 74 ard = (clientDat
9ff0: 61 20 21 3d 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 a != NULL);.
a000: 4f 62 6a 65 63 74 20 2a 6f 50 74 72 3b 0a 20 20 Object *oPtr;.
a010: 20 20 4d 65 74 68 6f 64 20 2a 6d 50 74 72 3b 0a Method *mPtr;.
a020: 20 20 20 20 69 6e 74 20 69 73 50 75 62 6c 69 63 int isPublic
a030: 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 70 ;. Tcl_Obj *p
a040: 72 65 66 69 78 4f 62 6a 3b 0a 0a 20 20 20 20 69 refixObj;.. i
a050: 66 20 28 6f 62 6a 63 20 3c 20 33 29 20 7b 0a 09 f (objc < 3) {..
a060: 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 Tcl_WrongNumArgs
a070: 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 (interp, 1, objv
a080: 2c 20 22 6e 61 6d 65 20 63 6d 64 4e 61 6d 65 20 , "name cmdName
a090: 3f 61 72 67 20 2e 2e 2e 3f 22 29 3b 0a 09 72 65 ?arg ...?");..re
a0a0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
a0b0: 20 20 20 20 7d 0a 0a 20 20 20 20 6f 50 74 72 20 }.. oPtr
a0c0: 3d 20 28 4f 62 6a 65 63 74 20 2a 29 20 54 63 6c = (Object *) Tcl
a0d0: 4f 4f 47 65 74 44 65 66 69 6e 65 43 6d 64 43 6f OOGetDefineCmdCo
a0e0: 6e 74 65 78 74 28 69 6e 74 65 72 70 29 3b 0a 20 ntext(interp);.
a0f0: 20 20 20 69 66 20 28 6f 50 74 72 20 3d 3d 20 4e if (oPtr == N
a100: 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 ULL) {..return T
a110: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a CL_ERROR;. }.
a120: 20 20 20 20 69 66 20 28 21 69 73 49 6e 73 74 61 if (!isInsta
a130: 6e 63 65 46 6f 72 77 61 72 64 20 26 26 20 21 6f nceForward && !o
a140: 50 74 72 2d 3e 63 6c 61 73 73 50 74 72 29 20 7b Ptr->classPtr) {
a150: 0a 09 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 ..Tcl_SetObjResu
a160: 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e lt(interp, Tcl_N
a170: 65 77 53 74 72 69 6e 67 4f 62 6a 28 0a 09 09 22 ewStringObj(..."
a180: 61 74 74 65 6d 70 74 20 74 6f 20 6d 69 73 75 73 attempt to misus
a190: 65 20 41 50 49 22 2c 20 2d 31 29 29 3b 0a 09 54 e API", -1));..T
a1a0: 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 cl_SetErrorCode(
a1b0: 69 6e 74 65 72 70 2c 20 22 54 43 4c 22 2c 20 22 interp, "TCL", "
a1c0: 4f 4f 22 2c 20 22 4d 4f 4e 4b 45 59 5f 42 55 53 OO", "MONKEY_BUS
a1d0: 49 4e 45 53 53 22 2c 20 4e 55 4c 4c 29 3b 0a 09 INESS", NULL);..
a1e0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
a1f0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 73 50 75 ;. }. isPu
a200: 62 6c 69 63 20 3d 20 54 63 6c 5f 53 74 72 69 6e blic = Tcl_Strin
a210: 67 4d 61 74 63 68 28 54 63 6c 47 65 74 53 74 72 gMatch(TclGetStr
a220: 69 6e 67 28 6f 62 6a 76 5b 31 5d 29 2c 20 22 5b ing(objv[1]), "[
a230: 61 2d 7a 5d 2a 22 29 0a 09 20 20 20 20 3f 20 50 a-z]*").. ? P
a240: 55 42 4c 49 43 5f 4d 45 54 48 4f 44 20 3a 20 30 UBLIC_METHOD : 0
a250: 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a ;.. /*. *
a260: 20 43 72 65 61 74 65 20 74 68 65 20 6d 65 74 68 Create the meth
a270: 6f 64 20 73 74 72 75 63 74 75 72 65 2e 0a 20 20 od structure..
a280: 20 20 20 2a 2f 0a 0a 20 20 20 20 70 72 65 66 69 */.. prefi
a290: 78 4f 62 6a 20 3d 20 54 63 6c 5f 4e 65 77 4c 69 xObj = Tcl_NewLi
a2a0: 73 74 4f 62 6a 28 6f 62 6a 63 2d 32 2c 20 6f 62 stObj(objc-2, ob
a2b0: 6a 76 2b 32 29 3b 0a 20 20 20 20 69 66 20 28 69 jv+2);. if (i
a2c0: 73 49 6e 73 74 61 6e 63 65 46 6f 72 77 61 72 64 sInstanceForward
a2d0: 29 20 7b 0a 09 6d 50 74 72 20 3d 20 54 63 6c 4f ) {..mPtr = TclO
a2e0: 4f 4e 65 77 46 6f 72 77 61 72 64 49 6e 73 74 61 ONewForwardInsta
a2f0: 6e 63 65 4d 65 74 68 6f 64 28 69 6e 74 65 72 70 nceMethod(interp
a300: 2c 20 6f 50 74 72 2c 20 69 73 50 75 62 6c 69 63 , oPtr, isPublic
a310: 2c 20 6f 62 6a 76 5b 31 5d 2c 0a 09 09 70 72 65 , objv[1],...pre
a320: 66 69 78 4f 62 6a 29 3b 0a 20 20 20 20 7d 20 65 fixObj);. } e
a330: 6c 73 65 20 7b 0a 09 6d 50 74 72 20 3d 20 54 63 lse {..mPtr = Tc
a340: 6c 4f 4f 4e 65 77 46 6f 72 77 61 72 64 4d 65 74 lOONewForwardMet
a350: 68 6f 64 28 69 6e 74 65 72 70 2c 20 6f 50 74 72 hod(interp, oPtr
a360: 2d 3e 63 6c 61 73 73 50 74 72 2c 20 69 73 50 75 ->classPtr, isPu
a370: 62 6c 69 63 2c 0a 09 09 6f 62 6a 76 5b 31 5d 2c blic,...objv[1],
a380: 20 70 72 65 66 69 78 4f 62 6a 29 3b 0a 20 20 20 prefixObj);.
a390: 20 7d 0a 20 20 20 20 69 66 20 28 6d 50 74 72 20 }. if (mPtr
a3a0: 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 54 63 6c 5f == NULL) {..Tcl_
a3b0: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 70 72 65 DecrRefCount(pre
a3c0: 66 69 78 4f 62 6a 29 3b 0a 09 72 65 74 75 72 6e fixObj);..return
a3d0: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 TCL_ERROR;.
a3e0: 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c }. return TCL
a3f0: 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 20 2d _OK;.}.../*. * -
a400: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a410: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a420: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a430: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a440: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 54 63 6c 4f -----. *. * TclO
a450: 4f 44 65 66 69 6e 65 4d 65 74 68 6f 64 4f 62 6a ODefineMethodObj
a460: 43 6d 64 20 2d 2d 0a 20 2a 09 49 6d 70 6c 65 6d Cmd --. *.Implem
a470: 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 entation of the
a480: 22 6d 65 74 68 6f 64 22 20 73 75 62 63 6f 6d 6d "method" subcomm
a490: 61 6e 64 20 6f 66 20 74 68 65 20 22 6f 6f 3a 3a and of the "oo::
a4a0: 64 65 66 69 6e 65 22 20 61 6e 64 0a 20 2a 09 22 define" and. *."
a4b0: 6f 6f 3a 3a 6f 62 6a 64 65 66 69 6e 65 22 20 63 oo::objdefine" c
a4c0: 6f 6d 6d 61 6e 64 73 2e 0a 20 2a 0a 20 2a 20 2d ommands.. *. * -
a4d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a4e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a4f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a500: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a510: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 69 6e 74 0a 54 -----. */..int.T
a520: 63 6c 4f 4f 44 65 66 69 6e 65 4d 65 74 68 6f 64 clOODefineMethod
a530: 4f 62 6a 43 6d 64 28 0a 20 20 20 20 43 6c 69 65 ObjCmd(. Clie
a540: 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 ntData clientDat
a550: 61 2c 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 a,. Tcl_Inter
a560: 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 20 20 69 p *interp,. i
a570: 6e 74 20 6f 62 6a 63 2c 0a 20 20 20 20 54 63 6c nt objc,. Tcl
a580: 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 2a 6f 62 6a _Obj *const *obj
a590: 76 29 0a 7b 0a 20 20 20 20 69 6e 74 20 69 73 49 v).{. int isI
a5a0: 6e 73 74 61 6e 63 65 4d 65 74 68 6f 64 20 3d 20 nstanceMethod =
a5b0: 28 63 6c 69 65 6e 74 44 61 74 61 20 21 3d 20 4e (clientData != N
a5c0: 55 4c 4c 29 3b 0a 20 20 20 20 4f 62 6a 65 63 74 ULL);. Object
a5d0: 20 2a 6f 50 74 72 3b 0a 20 20 20 20 69 6e 74 20 *oPtr;. int
a5e0: 69 73 50 75 62 6c 69 63 3b 0a 0a 20 20 20 20 69 isPublic;.. i
a5f0: 66 20 28 6f 62 6a 63 20 21 3d 20 34 29 20 7b 0a f (objc != 4) {.
a600: 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 .Tcl_WrongNumArg
a610: 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 6f 62 6a s(interp, 1, obj
a620: 76 2c 20 22 6e 61 6d 65 20 61 72 67 73 20 62 6f v, "name args bo
a630: 64 79 22 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 dy");..return TC
a640: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a L_ERROR;. }..
a650: 20 20 20 20 6f 50 74 72 20 3d 20 28 4f 62 6a 65 oPtr = (Obje
a660: 63 74 20 2a 29 20 54 63 6c 4f 4f 47 65 74 44 65 ct *) TclOOGetDe
a670: 66 69 6e 65 43 6d 64 43 6f 6e 74 65 78 74 28 69 fineCmdContext(i
a680: 6e 74 65 72 70 29 3b 0a 20 20 20 20 69 66 20 28 nterp);. if (
a690: 6f 50 74 72 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a oPtr == NULL) {.
a6a0: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f .return TCL_ERRO
a6b0: 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 R;. }. if
a6c0: 28 21 69 73 49 6e 73 74 61 6e 63 65 4d 65 74 68 (!isInstanceMeth
a6d0: 6f 64 20 26 26 20 21 6f 50 74 72 2d 3e 63 6c 61 od && !oPtr->cla
a6e0: 73 73 50 74 72 29 20 7b 0a 09 54 63 6c 5f 53 65 ssPtr) {..Tcl_Se
a6f0: 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 tObjResult(inter
a700: 70 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 p, Tcl_NewString
a710: 4f 62 6a 28 0a 09 09 22 61 74 74 65 6d 70 74 20 Obj(..."attempt
a720: 74 6f 20 6d 69 73 75 73 65 20 41 50 49 22 2c 20 to misuse API",
a730: 2d 31 29 29 3b 0a 09 54 63 6c 5f 53 65 74 45 72 -1));..Tcl_SetEr
a740: 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 rorCode(interp,
a750: 22 54 43 4c 22 2c 20 22 4f 4f 22 2c 20 22 4d 4f "TCL", "OO", "MO
a760: 4e 4b 45 59 5f 42 55 53 49 4e 45 53 53 22 2c 20 NKEY_BUSINESS",
a770: 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 NULL);..return T
a780: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a CL_ERROR;. }.
a790: 20 20 20 20 69 73 50 75 62 6c 69 63 20 3d 20 54 isPublic = T
a7a0: 63 6c 5f 53 74 72 69 6e 67 4d 61 74 63 68 28 54 cl_StringMatch(T
a7b0: 63 6c 47 65 74 53 74 72 69 6e 67 28 6f 62 6a 76 clGetString(objv
a7c0: 5b 31 5d 29 2c 20 22 5b 61 2d 7a 5d 2a 22 29 0a [1]), "[a-z]*").
a7d0: 09 20 20 20 20 3f 20 50 55 42 4c 49 43 5f 4d 45 . ? PUBLIC_ME
a7e0: 54 48 4f 44 20 3a 20 30 3b 0a 0a 20 20 20 20 2f THOD : 0;.. /
a7f0: 2a 0a 20 20 20 20 20 2a 20 43 72 65 61 74 65 20 *. * Create
a800: 74 68 65 20 6d 65 74 68 6f 64 20 62 79 20 75 73 the method by us
a810: 69 6e 67 20 74 68 65 20 72 69 67 68 74 20 62 61 ing the right ba
a820: 63 6b 2d 65 6e 64 20 41 50 49 2e 0a 20 20 20 20 ck-end API..
a830: 20 2a 2f 0a 0a 20 20 20 20 69 66 20 28 69 73 49 */.. if (isI
a840: 6e 73 74 61 6e 63 65 4d 65 74 68 6f 64 29 20 7b nstanceMethod) {
a850: 0a 09 69 66 20 28 54 63 6c 4f 4f 4e 65 77 50 72 ..if (TclOONewPr
a860: 6f 63 49 6e 73 74 61 6e 63 65 4d 65 74 68 6f 64 ocInstanceMethod
a870: 28 69 6e 74 65 72 70 2c 20 6f 50 74 72 2c 20 69 (interp, oPtr, i
a880: 73 50 75 62 6c 69 63 2c 20 6f 62 6a 76 5b 31 5d sPublic, objv[1]
a890: 2c 0a 09 09 6f 62 6a 76 5b 32 5d 2c 20 6f 62 6a ,...objv[2], obj
a8a0: 76 5b 33 5d 2c 20 4e 55 4c 4c 29 20 3d 3d 20 4e v[3], NULL) == N
a8b0: 55 4c 4c 29 20 7b 0a 09 20 20 20 20 72 65 74 75 ULL) {.. retu
a8c0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d rn TCL_ERROR;..}
a8d0: 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 69 . } else {..i
a8e0: 66 20 28 54 63 6c 4f 4f 4e 65 77 50 72 6f 63 4d f (TclOONewProcM
a8f0: 65 74 68 6f 64 28 69 6e 74 65 72 70 2c 20 6f 50 ethod(interp, oP
a900: 74 72 2d 3e 63 6c 61 73 73 50 74 72 2c 20 69 73 tr->classPtr, is
a910: 50 75 62 6c 69 63 2c 20 6f 62 6a 76 5b 31 5d 2c Public, objv[1],
a920: 0a 09 09 6f 62 6a 76 5b 32 5d 2c 20 6f 62 6a 76 ...objv[2], objv
a930: 5b 33 5d 2c 20 4e 55 4c 4c 29 20 3d 3d 20 4e 55 [3], NULL) == NU
a940: 4c 4c 29 20 7b 0a 09 20 20 20 20 72 65 74 75 72 LL) {.. retur
a950: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a n TCL_ERROR;..}.
a960: 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e }. return
a970: 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a TCL_OK;.}.../*.
a980: 20 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d * -------------
a990: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a9a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a9b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
a9c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 ---------. *. *
a9d0: 54 63 6c 4f 4f 44 65 66 69 6e 65 4d 69 78 69 6e TclOODefineMixin
a9e0: 4f 62 6a 43 6d 64 20 2d 2d 0a 20 2a 09 49 6d 70 ObjCmd --. *.Imp
a9f0: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 lementation of t
aa00: 68 65 20 22 6d 69 78 69 6e 22 20 73 75 62 63 6f he "mixin" subco
aa10: 6d 6d 61 6e 64 20 6f 66 20 74 68 65 20 22 6f 6f mmand of the "oo
aa20: 3a 3a 64 65 66 69 6e 65 22 20 61 6e 64 0a 20 2a ::define" and. *
aa30: 09 22 6f 6f 3a 3a 6f 62 6a 64 65 66 69 6e 65 22 ."oo::objdefine"
aa40: 20 63 6f 6d 6d 61 6e 64 73 2e 0a 20 2a 0a 20 2a commands.. *. *
aa50: 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ---------------
aa60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
aa70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
aa80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
aa90: 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 69 6e 74 -------. */..int
aaa0: 0a 54 63 6c 4f 4f 44 65 66 69 6e 65 4d 69 78 69 .TclOODefineMixi
aab0: 6e 4f 62 6a 43 6d 64 28 0a 20 20 20 20 43 6c 69 nObjCmd(. Cli
aac0: 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 entData clientDa
aad0: 74 61 2c 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 ta,. Tcl_Inte
aae0: 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 20 20 rp *interp,.
aaf0: 63 6f 6e 73 74 20 69 6e 74 20 6f 62 6a 63 2c 0a const int objc,.
ab00: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e Tcl_Obj *con
ab10: 73 74 20 2a 6f 62 6a 76 29 0a 7b 0a 20 20 20 20 st *objv).{.
ab20: 69 6e 74 20 69 73 49 6e 73 74 61 6e 63 65 4d 69 int isInstanceMi
ab30: 78 69 6e 20 3d 20 28 63 6c 69 65 6e 74 44 61 74 xin = (clientDat
ab40: 61 20 21 3d 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 a != NULL);.
ab50: 4f 62 6a 65 63 74 20 2a 6f 50 74 72 20 3d 20 28 Object *oPtr = (
ab60: 4f 62 6a 65 63 74 20 2a 29 20 54 63 6c 4f 4f 47 Object *) TclOOG
ab70: 65 74 44 65 66 69 6e 65 43 6d 64 43 6f 6e 74 65 etDefineCmdConte
ab80: 78 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 xt(interp);.
ab90: 43 6c 61 73 73 20 2a 2a 6d 69 78 69 6e 73 3b 0a Class **mixins;.
aba0: 20 20 20 20 69 6e 74 20 69 3b 0a 0a 20 20 20 20 int i;..
abb0: 69 66 20 28 6f 50 74 72 20 3d 3d 20 4e 55 4c 4c if (oPtr == NULL
abc0: 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f ) {..return TCL_
abd0: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 ERROR;. }.
abe0: 20 69 66 20 28 21 69 73 49 6e 73 74 61 6e 63 65 if (!isInstance
abf0: 4d 69 78 69 6e 20 26 26 20 21 6f 50 74 72 2d 3e Mixin && !oPtr->
ac00: 63 6c 61 73 73 50 74 72 29 20 7b 0a 09 54 63 6c classPtr) {..Tcl
ac10: 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e _SetObjResult(in
ac20: 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 53 74 72 terp, Tcl_NewStr
ac30: 69 6e 67 4f 62 6a 28 0a 09 09 22 61 74 74 65 6d ingObj(..."attem
ac40: 70 74 20 74 6f 20 6d 69 73 75 73 65 20 41 50 49 pt to misuse API
ac50: 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 53 65 ", -1));..Tcl_Se
ac60: 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 tErrorCode(inter
ac70: 70 2c 20 22 54 43 4c 22 2c 20 22 4f 4f 22 2c 20 p, "TCL", "OO",
ac80: 22 4d 4f 4e 4b 45 59 5f 42 55 53 49 4e 45 53 53 "MONKEY_BUSINESS
ac90: 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 ", NULL);..retur
aca0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 n TCL_ERROR;.
acb0: 20 7d 0a 20 20 20 20 6d 69 78 69 6e 73 20 3d 20 }. mixins =
acc0: 54 63 6c 53 74 61 63 6b 41 6c 6c 6f 63 28 69 6e TclStackAlloc(in
acd0: 74 65 72 70 2c 20 73 69 7a 65 6f 66 28 43 6c 61 terp, sizeof(Cla
ace0: 73 73 20 2a 29 20 2a 20 28 6f 62 6a 63 2d 31 29 ss *) * (objc-1)
acf0: 29 3b 0a 0a 20 20 20 20 66 6f 72 20 28 69 3d 31 );.. for (i=1
ad00: 20 3b 20 69 3c 6f 62 6a 63 20 3b 20 69 2b 2b 29 ; i<objc ; i++)
ad10: 20 7b 0a 09 43 6c 61 73 73 20 2a 63 6c 73 50 74 {..Class *clsPt
ad20: 72 20 3d 20 47 65 74 43 6c 61 73 73 49 6e 4f 75 r = GetClassInOu
ad30: 74 65 72 43 6f 6e 74 65 78 74 28 69 6e 74 65 72 terContext(inter
ad40: 70 2c 20 6f 62 6a 76 5b 69 5d 2c 0a 09 09 22 6d p, objv[i],..."m
ad50: 61 79 20 6f 6e 6c 79 20 6d 69 78 20 69 6e 20 63 ay only mix in c
ad60: 6c 61 73 73 65 73 22 29 3b 0a 0a 09 69 66 20 28 lasses");...if (
ad70: 63 6c 73 50 74 72 20 3d 3d 20 4e 55 4c 4c 29 20 clsPtr == NULL)
ad80: 7b 0a 09 20 20 20 20 67 6f 74 6f 20 66 72 65 65 {.. goto free
ad90: 41 6e 64 45 72 72 6f 72 3b 0a 09 7d 0a 09 69 66 AndError;..}..if
ada0: 20 28 21 69 73 49 6e 73 74 61 6e 63 65 4d 69 78 (!isInstanceMix
adb0: 69 6e 20 26 26 20 54 63 6c 4f 4f 49 73 52 65 61 in && TclOOIsRea
adc0: 63 68 61 62 6c 65 28 6f 50 74 72 2d 3e 63 6c 61 chable(oPtr->cla
add0: 73 73 50 74 72 2c 20 63 6c 73 50 74 72 29 29 20 ssPtr, clsPtr))
ade0: 7b 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 {.. Tcl_SetOb
adf0: 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 jResult(interp,
ae00: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
ae10: 28 0a 09 09 20 20 20 20 22 6d 61 79 20 6e 6f 74 (... "may not
ae20: 20 6d 69 78 20 61 20 63 6c 61 73 73 20 69 6e 74 mix a class int
ae30: 6f 20 69 74 73 65 6c 66 22 2c 20 2d 31 29 29 3b o itself", -1));
ae40: 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 45 72 72 .. Tcl_SetErr
ae50: 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 orCode(interp, "
ae60: 54 43 4c 22 2c 20 22 4f 4f 22 2c 20 22 53 45 4c TCL", "OO", "SEL
ae70: 46 5f 4d 49 58 49 4e 22 2c 20 4e 55 4c 4c 29 3b F_MIXIN", NULL);
ae80: 0a 09 20 20 20 20 67 6f 74 6f 20 66 72 65 65 41 .. goto freeA
ae90: 6e 64 45 72 72 6f 72 3b 0a 09 7d 0a 09 6d 69 78 ndError;..}..mix
aea0: 69 6e 73 5b 69 2d 31 5d 20 3d 20 63 6c 73 50 74 ins[i-1] = clsPt
aeb0: 72 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 r;. }.. if
aec0: 20 28 69 73 49 6e 73 74 61 6e 63 65 4d 69 78 69 (isInstanceMixi
aed0: 6e 29 20 7b 0a 09 54 63 6c 4f 4f 4f 62 6a 65 63 n) {..TclOOObjec
aee0: 74 53 65 74 4d 69 78 69 6e 73 28 6f 50 74 72 2c tSetMixins(oPtr,
aef0: 20 6f 62 6a 63 2d 31 2c 20 6d 69 78 69 6e 73 29 objc-1, mixins)
af00: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 ;. } else {..
af10: 54 63 6c 4f 4f 43 6c 61 73 73 53 65 74 4d 69 78 TclOOClassSetMix
af20: 69 6e 73 28 69 6e 74 65 72 70 2c 20 6f 50 74 72 ins(interp, oPtr
af30: 2d 3e 63 6c 61 73 73 50 74 72 2c 20 6f 62 6a 63 ->classPtr, objc
af40: 2d 31 2c 20 6d 69 78 69 6e 73 29 3b 0a 20 20 20 -1, mixins);.
af50: 20 7d 0a 0a 20 20 20 20 54 63 6c 53 74 61 63 6b }.. TclStack
af60: 46 72 65 65 28 69 6e 74 65 72 70 2c 20 6d 69 78 Free(interp, mix
af70: 69 6e 73 29 3b 0a 20 20 20 20 72 65 74 75 72 6e ins);. return
af80: 20 54 43 4c 5f 4f 4b 3b 0a 0a 20 20 66 72 65 65 TCL_OK;.. free
af90: 41 6e 64 45 72 72 6f 72 3a 0a 20 20 20 20 54 63 AndError:. Tc
afa0: 6c 53 74 61 63 6b 46 72 65 65 28 69 6e 74 65 72 lStackFree(inter
afb0: 70 2c 20 6d 69 78 69 6e 73 29 3b 0a 20 20 20 20 p, mixins);.
afc0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
afd0: 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 20 2d 2d 2d 2d ;.}.../*. * ----
afe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
aff0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b000: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b010: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b020: 2d 2d 0a 20 2a 0a 20 2a 20 54 63 6c 4f 4f 44 65 --. *. * TclOODe
b030: 66 69 6e 65 52 65 6e 61 6d 65 4d 65 74 68 6f 64 fineRenameMethod
b040: 4f 62 6a 43 6d 64 20 2d 2d 0a 20 2a 09 49 6d 70 ObjCmd --. *.Imp
b050: 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 lementation of t
b060: 68 65 20 22 72 65 6e 61 6d 65 6d 65 74 68 6f 64 he "renamemethod
b070: 22 20 73 75 62 63 6f 6d 6d 61 6e 64 20 6f 66 20 " subcommand of
b080: 74 68 65 20 22 6f 6f 3a 3a 64 65 66 69 6e 65 22 the "oo::define"
b090: 0a 20 2a 09 61 6e 64 20 22 6f 6f 3a 3a 6f 62 6a . *.and "oo::obj
b0a0: 64 65 66 69 6e 65 22 20 63 6f 6d 6d 61 6e 64 73 define" commands
b0b0: 2e 0a 20 2a 0a 20 2a 20 2d 2d 2d 2d 2d 2d 2d 2d .. *. * --------
b0c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b0d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b0e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b0f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
b100: 2a 2f 0a 0a 69 6e 74 0a 54 63 6c 4f 4f 44 65 66 */..int.TclOODef
b110: 69 6e 65 52 65 6e 61 6d 65 4d 65 74 68 6f 64 4f ineRenameMethodO
b120: 62 6a 43 6d 64 28 0a 20 20 20 20 43 6c 69 65 6e bjCmd(. Clien
b130: 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 tData clientData
b140: 2c 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 ,. Tcl_Interp
b150: 20 2a 69 6e 74 65 72 70 2c 0a 20 20 20 20 69 6e *interp,. in
b160: 74 20 6f 62 6a 63 2c 0a 20 20 20 20 54 63 6c 5f t objc,. Tcl_
b170: 4f 62 6a 20 2a 63 6f 6e 73 74 20 2a 6f 62 6a 76 Obj *const *objv
b180: 29 0a 7b 0a 20 20 20 20 69 6e 74 20 69 73 49 6e ).{. int isIn
b190: 73 74 61 6e 63 65 52 65 6e 61 6d 65 4d 65 74 68 stanceRenameMeth
b1a0: 6f 64 20 3d 20 28 63 6c 69 65 6e 74 44 61 74 61 od = (clientData
b1b0: 20 21 3d 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 4f != NULL);. O
b1c0: 62 6a 65 63 74 20 2a 6f 50 74 72 3b 0a 0a 20 20 bject *oPtr;..
b1d0: 20 20 69 66 20 28 6f 62 6a 63 20 21 3d 20 33 29 if (objc != 3)
b1e0: 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d {..Tcl_WrongNum
b1f0: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 31 2c 20 Args(interp, 1,
b200: 6f 62 6a 76 2c 20 22 6f 6c 64 4e 61 6d 65 20 6e objv, "oldName n
b210: 65 77 4e 61 6d 65 22 29 3b 0a 09 72 65 74 75 72 ewName");..retur
b220: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 n TCL_ERROR;.
b230: 20 7d 0a 0a 20 20 20 20 6f 50 74 72 20 3d 20 28 }.. oPtr = (
b240: 4f 62 6a 65 63 74 20 2a 29 20 54 63 6c 4f 4f 47 Object *) TclOOG
b250: 65 74 44 65 66 69 6e 65 43 6d 64 43 6f 6e 74 65 etDefineCmdConte
b260: 78 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 xt(interp);.
b270: 69 66 20 28 6f 50 74 72 20 3d 3d 20 4e 55 4c 4c if (oPtr == NULL
b280: 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f ) {..return TCL_
b290: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 ERROR;. }.
b2a0: 20 69 66 20 28 21 69 73 49 6e 73 74 61 6e 63 65 if (!isInstance
b2b0: 52 65 6e 61 6d 65 4d 65 74 68 6f 64 20 26 26 20 RenameMethod &&
b2c0: 21 6f 50 74 72 2d 3e 63 6c 61 73 73 50 74 72 29 !oPtr->classPtr)
b2d0: 20 7b 0a 09 54 63 6c 5f 53 65 74 4f 62 6a 52 65 {..Tcl_SetObjRe
b2e0: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c sult(interp, Tcl
b2f0: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 0a 09 _NewStringObj(..
b300: 09 22 61 74 74 65 6d 70 74 20 74 6f 20 6d 69 73 ."attempt to mis
b310: 75 73 65 20 41 50 49 22 2c 20 2d 31 29 29 3b 0a use API", -1));.
b320: 09 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 .Tcl_SetErrorCod
b330: 65 28 69 6e 74 65 72 70 2c 20 22 54 43 4c 22 2c e(interp, "TCL",
b340: 20 22 4f 4f 22 2c 20 22 4d 4f 4e 4b 45 59 5f 42 "OO", "MONKEY_B
b350: 55 53 49 4e 45 53 53 22 2c 20 4e 55 4c 4c 29 3b USINESS", NULL);
b360: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 ..return TCL_ERR
b370: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f OR;. }.. /
b380: 2a 0a 20 20 20 20 20 2a 20 44 65 6c 65 74 65 20 *. * Delete
b390: 74 68 65 20 6d 65 74 68 6f 64 20 65 6e 74 72 79 the method entry
b3a0: 20 66 72 6f 6d 20 74 68 65 20 61 70 70 72 6f 70 from the approp
b3b0: 72 69 61 74 65 20 68 61 73 68 20 74 61 62 6c 65 riate hash table
b3c0: 2c 20 61 6e 64 20 74 72 61 6e 73 66 65 72 0a 20 , and transfer.
b3d0: 20 20 20 20 2a 20 74 68 65 20 74 68 69 6e 67 20 * the thing
b3e0: 69 74 20 70 6f 69 6e 74 73 20 74 6f 20 74 6f 20 it points to to
b3f0: 69 74 73 20 6e 65 77 20 65 6e 74 72 79 2e 20 54 its new entry. T
b400: 6f 20 64 6f 20 74 68 69 73 2c 20 77 65 20 66 69 o do this, we fi
b410: 72 73 74 20 6e 65 65 64 20 74 6f 0a 20 20 20 20 rst need to.
b420: 20 2a 20 67 65 74 20 74 68 65 20 65 6e 74 72 69 * get the entri
b430: 65 73 20 66 72 6f 6d 20 74 68 65 20 61 70 70 72 es from the appr
b440: 6f 70 72 69 61 74 65 20 68 61 73 68 20 74 61 62 opriate hash tab
b450: 6c 65 73 20 28 74 68 69 73 20 63 61 6e 20 67 65 les (this can ge
b460: 6e 65 72 61 74 65 20 61 0a 20 20 20 20 20 2a 20 nerate a. *
b470: 72 61 6e 67 65 20 6f 66 20 65 72 72 6f 72 73 2e range of errors.
b480: 2e 2e 29 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 ..). */..
b490: 20 69 66 20 28 52 65 6e 61 6d 65 44 65 6c 65 74 if (RenameDelet
b4a0: 65 4d 65 74 68 6f 64 28 69 6e 74 65 72 70 2c 20 eMethod(interp,
b4b0: 6f 50 74 72 2c 20 21 69 73 49 6e 73 74 61 6e 63 oPtr, !isInstanc
b4c0: 65 52 65 6e 61 6d 65 4d 65 74 68 6f 64 2c 0a 09 eRenameMethod,..
b4d0: 20 20 20 20 6f 62 6a 76 5b 31 5d 2c 20 6f 62 6a objv[1], obj
b4e0: 76 5b 32 5d 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 v[2]) != TCL_OK)
b4f0: 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 {..return TCL_E
b500: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 RROR;. }..
b510: 20 69 66 20 28 69 73 49 6e 73 74 61 6e 63 65 52 if (isInstanceR
b520: 65 6e 61 6d 65 4d 65 74 68 6f 64 29 20 7b 0a 09 enameMethod) {..
b530: 6f 50 74 72 2d 3e 65 70 6f 63 68 2b 2b 3b 0a 20 oPtr->epoch++;.
b540: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 42 75 6d } else {..Bum
b550: 70 47 6c 6f 62 61 6c 45 70 6f 63 68 28 69 6e 74 pGlobalEpoch(int
b560: 65 72 70 2c 20 6f 50 74 72 2d 3e 63 6c 61 73 73 erp, oPtr->class
b570: 50 74 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 Ptr);. }.
b580: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d return TCL_OK;.}
b590: 0a 0c 0a 2f 2a 0a 20 2a 20 2d 2d 2d 2d 2d 2d 2d .../*. * -------
b5a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b5b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b5c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b5d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
b5e0: 20 2a 0a 20 2a 20 54 63 6c 4f 4f 44 65 66 69 6e *. * TclOODefin
b5f0: 65 55 6e 65 78 70 6f 72 74 4f 62 6a 43 6d 64 20 eUnexportObjCmd
b600: 2d 2d 0a 20 2a 09 49 6d 70 6c 65 6d 65 6e 74 61 --. *.Implementa
b610: 74 69 6f 6e 20 6f 66 20 74 68 65 20 22 75 6e 65 tion of the "une
b620: 78 70 6f 72 74 22 20 73 75 62 63 6f 6d 6d 61 6e xport" subcomman
b630: 64 20 6f 66 20 74 68 65 20 22 6f 6f 3a 3a 64 65 d of the "oo::de
b640: 66 69 6e 65 22 20 61 6e 64 0a 20 2a 09 22 6f 6f fine" and. *."oo
b650: 3a 3a 6f 62 6a 64 65 66 69 6e 65 22 20 63 6f 6d ::objdefine" com
b660: 6d 61 6e 64 73 2e 0a 20 2a 0a 20 2a 20 2d 2d 2d mands.. *. * ---
b670: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b680: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b690: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b6a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
b6b0: 2d 2d 2d 0a 20 2a 2f 0a 0a 69 6e 74 0a 54 63 6c ---. */..int.Tcl
b6c0: 4f 4f 44 65 66 69 6e 65 55 6e 65 78 70 6f 72 74 OODefineUnexport
b6d0: 4f 62 6a 43 6d 64 28 0a 20 20 20 20 43 6c 69 65 ObjCmd(. Clie
b6e0: 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 44 61 74 ntData clientDat
b6f0: 61 2c 0a 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 a,. Tcl_Inter
b700: 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 20 20 69 p *interp,. i
b710: 6e 74 20 6f 62 6a 63 2c 0a 20 20 20 20 54 63 6c nt objc,. Tcl
b720: 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 2a 6f 62 6a _Obj *const *obj
b730: 76 29 0a 7b 0a 20 20 20 20 69 6e 74 20 69 73 49 v).{. int isI
b740: 6e 73 74 61 6e 63 65 55 6e 65 78 70 6f 72 74 20 nstanceUnexport
b750: 3d 20 28 63 6c 69 65 6e 74 44 61 74 61 20 21 3d = (clientData !=
b760: 20 4e 55 4c 4c 29 3b 0a 20 20 20 20 4f 62 6a 65 NULL);. Obje
b770: 63 74 20 2a 6f 50 74 72 3b 0a 20 20 20 20 4d 65 ct *oPtr;. Me
b780: 74 68 6f 64 20 2a 6d 50 74 72 3b 0a 20 20 20 20 thod *mPtr;.
b790: 54 63 6c 5f 48 61 73 68 45 6e 74 72 79 20 2a 68 Tcl_HashEntry *h
b7a0: 50 74 72 3b 0a 20 20 20 20 43 6c 61 73 73 20 2a Ptr;. Class *
b7b0: 63 6c 73 50 74 72 3b 0a 20 20 20 20 69 6e 74 20 clsPtr;. int
b7c0: 69 2c 20 69 73 4e 65 77 2c 20 63 68 61 6e 67 65 i, isNew, change
b7d0: 64 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66 20 28 d = 0;.. if (
b7e0: 6f 62 6a 63 20 3c 20 32 29 20 7b 0a 09 54 63 6c objc < 2) {..Tcl
b7f0: 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e _WrongNumArgs(in
b800: 74 65 72 70 2c 20 31 2c 20 6f 62 6a 76 2c 20 22 terp, 1, objv, "
b810: 6e 61 6d 65 20 3f 6e 61 6d 65 20 2e 2e 2e 3f 22 name ?name ...?"
b820: 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 );..return TCL_E
b830: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 RROR;. }..
b840: 20 6f 50 74 72 20 3d 20 28 4f 62 6a 65 63 74 20 oPtr = (Object
b850: 2a 29 20 54 63 6c 4f 4f 47 65 74 44 65 66 69 6e *) TclOOGetDefin
b860: 65 43 6d 64 43 6f 6e 74 65 78 74 28 69 6e 74 65 eCmdContext(inte
b870: 72 70 29 3b 0a 20 20 20 20 69 66 20 28 6f 50 74 rp);. if (oPt
b880: 72 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 r == NULL) {..re
b890: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
b8a0: 20 20 20 20 7d 0a 20 20 20 20 63 6c 73 50 74 72 }. clsPtr
b8b0: 20 3d 20 6f 50 74 72 2d 3e 63 6c 61 73 73 50 74 = oPtr->classPt
b8c0: 72 3b 0a 20 20 20 20 69 66 20 28 21 69 73 49 6e r;. if (!isIn
b8d0: 73 74 61 6e 63 65 55 6e 65 78 70 6f 72 74 20 26 stanceUnexport &
b8e0: 26 20 21 63 6c 73 50 74 72 29 20 7b 0a 09 54 63 & !clsPtr) {..Tc
b8f0: 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 l_SetObjResult(i
b900: 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 53 74 nterp, Tcl_NewSt
b910: 72 69 6e 67 4f 62 6a 28 0a 09 09 22 61 74 74 65 ringObj(..."atte
b920: 6d 70 74 20 74 6f 20 6d 69 73 75 73 65 20 41 50 mpt to misuse AP
b930: 49 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 53 I", -1));..Tcl_S
b940: 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 etErrorCode(inte
b950: 72 70 2c 20 22 54 43 4c 22 2c 20 22 4f 4f 22 2c rp, "TCL", "OO",
b960: 20 22 4d 4f 4e 4b 45 59 5f 42 55 53 49 4e 45 53 "MONKEY_BUSINES
b970: 53 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 S", NULL);..retu
b980: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 rn TCL_ERROR;.
b990: 20 20 7d 0a 0a 20 20 20 20 66 6f 72 20 28 69 3d }.. for (i=
b9a0: 31 20 3b 20 69 3c 6f 62 6a 63 20 3b 20 69 2b 2b 1 ; i<objc ; i++
b9b0: 29 20 7b 0a 09 2f 2a 0a 09 20 2a 20 55 6e 65 78 ) {../*.. * Unex
b9c0: 70 6f 72 74 69 6e 67 20 69 73 20 64 6f 6e 65 20 porting is done
b9d0: 62 79 20 72 65 6d 6f 76 69 6e 67 20 74 68 65 20 by removing the
b9e0: 50 55 42 4c 49 43 5f 4d 45 54 48 4f 44 20 66 6c PUBLIC_METHOD fl
b9f0: 61 67 20 66 72 6f 6d 20 74 68 65 0a 09 20 2a 20 ag from the.. *
ba00: 6d 65 74 68 6f 64 20 72 65 63 6f 72 64 2e 20 49 method record. I
ba10: 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 73 75 f there is no su
ba20: 63 68 20 6d 65 74 68 6f 64 20 69 6e 20 74 68 69 ch method in thi
ba30: 73 20 6f 62 6a 65 63 74 20 6f 72 20 63 6c 61 73 s object or clas
ba40: 73 0a 09 20 2a 20 28 69 2e 65 2e 20 74 68 65 20 s.. * (i.e. the
ba50: 6d 65 74 68 6f 64 20 63 6f 6d 65 73 20 66 72 6f method comes fro
ba60: 6d 20 73 6f 6d 65 74 68 69 6e 67 20 69 6e 68 65 m something inhe
ba70: 72 69 74 65 64 20 66 72 6f 6d 20 6f 72 20 74 68 rited from or th
ba80: 61 74 20 77 65 27 72 65 0a 09 20 2a 20 61 6e 20 at we're.. * an
ba90: 69 6e 73 74 61 6e 63 65 20 6f 66 29 20 74 68 65 instance of) the
baa0: 6e 20 77 65 20 70 75 74 20 69 6e 20 61 20 62 6c n we put in a bl
bab0: 61 6e 6b 20 72 65 63 6f 72 64 20 77 69 74 68 6f ank record witho
bac0: 75 74 20 74 68 61 74 20 66 6c 61 67 3b 0a 09 20 ut that flag;..
bad0: 2a 20 73 75 63 68 20 72 65 63 6f 72 64 73 20 61 * such records a
bae0: 72 65 20 73 6b 69 70 70 65 64 20 6f 76 65 72 20 re skipped over
baf0: 62 79 20 74 68 65 20 63 61 6c 6c 20 63 68 61 69 by the call chai
bb00: 6e 20 65 6e 67 69 6e 65 20 2a 65 78 63 65 70 74 n engine *except
bb10: 2a 20 66 6f 72 0a 09 20 2a 20 74 68 65 69 72 20 * for.. * their
bb20: 66 6c 61 67 73 20 6d 65 6d 62 65 72 2e 0a 09 20 flags member...
bb30: 2a 2f 0a 0a 09 69 66 20 28 69 73 49 6e 73 74 61 */...if (isInsta
bb40: 6e 63 65 55 6e 65 78 70 6f 72 74 29 20 7b 0a 09 nceUnexport) {..
bb50: 20 20 20 20 69 66 20 28 21 6f 50 74 72 2d 3e 6d if (!oPtr->m
bb60: 65 74 68 6f 64 73 50 74 72 29 20 7b 0a 09 09 6f ethodsPtr) {...o
bb70: 50 74 72 2d 3e 6d 65 74 68 6f 64 73 50 74 72 20 Ptr->methodsPtr
bb80: 3d 20 63 6b 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 = ckalloc(sizeof
bb90: 28 54 63 6c 5f 48 61 73 68 54 61 62 6c 65 29 29 (Tcl_HashTable))
bba0: 3b 0a 09 09 54 63 6c 5f 49 6e 69 74 4f 62 6a 48 ;...Tcl_InitObjH
bbb0: 61 73 68 54 61 62 6c 65 28 6f 50 74 72 2d 3e 6d ashTable(oPtr->m
bbc0: 65 74 68 6f 64 73 50 74 72 29 3b 0a 09 09 6f 50 ethodsPtr);...oP
bbd0: 74 72 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 55 53 tr->flags &= ~US
bbe0: 45 5f 43 4c 41 53 53 5f 43 41 43 48 45 3b 0a 09 E_CLASS_CACHE;..
bbf0: 20 20 20 20 7d 0a 09 20 20 20 20 68 50 74 72 20 }.. hPtr
bc00: 3d 20 54 63 6c 5f 43 72 65 61 74 65 48 61 73 68 = Tcl_CreateHash
bc10: 45 6e 74 72 79 28 6f 50 74 72 2d 3e 6d 65 74 68 Entry(oPtr->meth
bc20: 6f 64 73 50 74 72 2c 20 28 63 68 61 72 20 2a 29 odsPtr, (char *)
bc30: 20 6f 62 6a 76 5b 69 5d 2c 0a 09 09 20 20 20 20 objv[i],...
bc40: 26 69 73 4e 65 77 29 3b 0a 09 7d 20 65 6c 73 65 &isNew);..} else
bc50: 20 7b 0a 09 20 20 20 20 68 50 74 72 20 3d 20 54 {.. hPtr = T
bc60: 63 6c 5f 43 72 65 61 74 65 48 61 73 68 45 6e 74 cl_CreateHashEnt
bc70: 72 79 28 26 63 6c 73 50 74 72 2d 3e 63 6c 61 73 ry(&clsPtr->clas
bc80: 73 4d 65 74 68 6f 64 73 2c 20 28 63 68 61 72 2a sMethods, (char*
bc90: 29 20 6f 62 6a 76 5b 69 5d 2c 0a 09 09 20 20 20 ) objv[i],...
bca0: 20 26 69 73 4e 65 77 29 3b 0a 09 7d 0a 0a 09 69 &isNew);..}...i
bcb0: 66 20 28 69 73 4e 65 77 29 20 7b 0a 09 20 20 20 f (isNew) {..
bcc0: 20 6d 50 74 72 20 3d 20 63 6b 61 6c 6c 6f 63 28 mPtr = ckalloc(
bcd0: 73 69 7a 65 6f 66 28 4d 65 74 68 6f 64 29 29 3b sizeof(Method));
bce0: 0a 09 20 20 20 20 6d 65 6d 73 65 74 28 6d 50 74 .. memset(mPt
bcf0: 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 4d 65 74 r, 0, sizeof(Met
bd00: 68 6f 64 29 29 3b 0a 09 20 20 20 20 6d 50 74 72 hod));.. mPtr
bd10: 2d 3e 72 65 66 43 6f 75 6e 74 20 3d 20 31 3b 0a ->refCount = 1;.
bd20: 09 20 20 20 20 6d 50 74 72 2d 3e 6e 61 6d 65 50 . mPtr->nameP
bd30: 74 72 20 3d 20 6f 62 6a 76 5b 69 5d 3b 0a 09 20 tr = objv[i];..
bd40: 20 20 20 54 63 6c 5f 49 6e 63 72 52 65 66 43 6f Tcl_IncrRefCo
bd50: 75 6e 74 28 6f 62 6a 76 5b 69 5d 29 3b 0a 09 20 unt(objv[i]);..
bd60: 20 20 20 54 63 6c 5f 53 65 74 48 61 73 68 56 61 Tcl_SetHashVa
bd70: 6c 75 65 28 68 50 74 72 2c 20 6d 50 74 72 29 3b lue(hPtr, mPtr);
bd80: 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 ..} else {..
bd90: 6d 50 74 72 20 3d 20 54 63 6c 5f 47 65 74 48 61 mPtr = Tcl_GetHa
bda0: 73 68 56 61 6c 75 65 28 68 50 74 72 29 3b 0a 09 shValue(hPtr);..
bdb0: 7d 0a 09 69 66 20 28 69 73 4e 65 77 20 7c 7c 20 }..if (isNew ||
bdc0: 6d 50 74 72 2d 3e 66 6c 61 67 73 20 26 20 50 55 mPtr->flags & PU
bdd0: 42 4c 49 43 5f 4d 45 54 48 4f 44 29 20 7b 0a 09 BLIC_METHOD) {..
bde0: 20 20 20 20 6d 50 74 72 2d 3e 66 6c 61 67 73 20 mPtr->flags
bdf0: 26 3d 20 7e 50 55 42 4c 49 43 5f 4d 45 54 48 4f &= ~PUBLIC_METHO
be00: 44 3b 0a 09 20 20 20 20 63 68 61 6e 67 65 64 20 D;.. changed
be10: 3d 20 31 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 = 1;..}. }..
be20: 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 42 75 6d /*. * Bum
be30: 70 20 74 68 65 20 72 69 67 68 74 20 65 70 6f 63 p the right epoc
be40: 68 20 69 66 20 77 65 20 61 63 74 75 61 6c 6c 79 h if we actually
be50: 20 63 68 61 6e 67 65 64 20 61 6e 79 74 68 69 6e changed anythin
be60: 67 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 g.. */..
be70: 69 66 20 28 63 68 61 6e 67 65 64 29 20 7b 0a 09 if (changed) {..
be80: 69 66 20 28 69 73 49 6e 73 74 61 6e 63 65 55 6e if (isInstanceUn
be90: 65 78 70 6f 72 74 29 20 7b 0a 09 20 20 20 20 6f export) {.. o
bea0: 50 74 72 2d 3e 65 70 6f 63 68 2b 2b 3b 0a 09 7d Ptr->epoch++;..}
beb0: 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 42 75 6d else {.. Bum
bec0: 70 47 6c 6f 62 61 6c 45 70 6f 63 68 28 69 6e 74 pGlobalEpoch(int
bed0: 65 72 70 2c 20 63 6c 73 50 74 72 29 3b 0a 09 7d erp, clsPtr);..}
bee0: 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 . }. retur
bef0: 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a n TCL_OK;.}.../*
bf00: 0a 20 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . * ------------
bf10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
bf20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
bf30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
bf40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a ----------. *. *
bf50: 20 54 63 6c 5f 43 6c 61 73 73 53 65 74 43 6f 6e Tcl_ClassSetCon
bf60: 73 74 72 75 63 74 6f 72 2c 20 54 63 6c 5f 43 6c structor, Tcl_Cl
bf70: 61 73 73 53 65 74 44 65 73 74 72 75 63 74 6f 72 assSetDestructor
bf80: 20 2d 2d 0a 20 2a 09 48 6f 77 20 74 6f 20 69 6e --. *.How to in
bf90: 73 74 61 6c 6c 20 61 20 63 6f 6e 73 74 72 75 63 stall a construc
bfa0: 74 6f 72 20 6f 72 20 64 65 73 74 72 75 63 74 6f tor or destructo
bfb0: 72 20 69 6e 74 6f 20 61 20 63 6c 61 73 73 3b 20 r into a class;
bfc0: 41 50 49 20 74 6f 20 63 61 6c 6c 0a 20 2a 09 66 API to call. *.f
bfd0: 72 6f 6d 20 43 2e 0a 20 2a 0a 20 2a 20 2d 2d 2d rom C.. *. * ---
bfe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
bff0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c000: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c010: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c020: 2d 2d 2d 0a 20 2a 2f 0a 0a 76 6f 69 64 0a 54 63 ---. */..void.Tc
c030: 6c 5f 43 6c 61 73 73 53 65 74 43 6f 6e 73 74 72 l_ClassSetConstr
c040: 75 63 74 6f 72 28 0a 20 20 20 20 54 63 6c 5f 49 uctor(. Tcl_I
c050: 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 nterp *interp,.
c060: 20 20 20 54 63 6c 5f 43 6c 61 73 73 20 63 6c 61 Tcl_Class cla
c070: 7a 7a 2c 0a 20 20 20 20 54 63 6c 5f 4d 65 74 68 zz,. Tcl_Meth
c080: 6f 64 20 6d 65 74 68 6f 64 29 0a 7b 0a 20 20 20 od method).{.
c090: 20 43 6c 61 73 73 20 2a 63 6c 73 50 74 72 20 3d Class *clsPtr =
c0a0: 20 28 43 6c 61 73 73 20 2a 29 20 63 6c 61 7a 7a (Class *) clazz
c0b0: 3b 0a 0a 20 20 20 20 69 66 20 28 6d 65 74 68 6f ;.. if (metho
c0c0: 64 20 21 3d 20 28 54 63 6c 5f 4d 65 74 68 6f 64 d != (Tcl_Method
c0d0: 29 20 63 6c 73 50 74 72 2d 3e 63 6f 6e 73 74 72 ) clsPtr->constr
c0e0: 75 63 74 6f 72 50 74 72 29 20 7b 0a 09 54 63 6c uctorPtr) {..Tcl
c0f0: 4f 4f 44 65 6c 4d 65 74 68 6f 64 52 65 66 28 63 OODelMethodRef(c
c100: 6c 73 50 74 72 2d 3e 63 6f 6e 73 74 72 75 63 74 lsPtr->construct
c110: 6f 72 50 74 72 29 3b 0a 09 63 6c 73 50 74 72 2d orPtr);..clsPtr-
c120: 3e 63 6f 6e 73 74 72 75 63 74 6f 72 50 74 72 20 >constructorPtr
c130: 3d 20 28 4d 65 74 68 6f 64 20 2a 29 20 6d 65 74 = (Method *) met
c140: 68 6f 64 3b 0a 0a 09 2f 2a 0a 09 20 2a 20 52 65 hod;.../*.. * Re
c150: 6d 65 6d 62 65 72 20 74 6f 20 69 6e 76 61 6c 69 member to invali
c160: 64 61 74 65 20 74 68 65 20 63 61 63 68 65 64 20 date the cached
c170: 63 6f 6e 73 74 72 75 63 74 6f 72 20 63 68 61 69 constructor chai
c180: 6e 20 66 6f 72 20 74 68 69 73 20 63 6c 61 73 73 n for this class
c190: 2e 0a 09 20 2a 20 5b 42 75 67 20 32 35 33 31 35 ... * [Bug 25315
c1a0: 37 37 5d 0a 09 20 2a 2f 0a 0a 09 69 66 20 28 63 77].. */...if (c
c1b0: 6c 73 50 74 72 2d 3e 63 6f 6e 73 74 72 75 63 74 lsPtr->construct
c1c0: 6f 72 43 68 61 69 6e 50 74 72 29 20 7b 0a 09 20 orChainPtr) {..
c1d0: 20 20 20 54 63 6c 4f 4f 44 65 6c 65 74 65 43 68 TclOODeleteCh
c1e0: 61 69 6e 28 63 6c 73 50 74 72 2d 3e 63 6f 6e 73 ain(clsPtr->cons
c1f0: 74 72 75 63 74 6f 72 43 68 61 69 6e 50 74 72 29 tructorChainPtr)
c200: 3b 0a 09 20 20 20 20 63 6c 73 50 74 72 2d 3e 63 ;.. clsPtr->c
c210: 6f 6e 73 74 72 75 63 74 6f 72 43 68 61 69 6e 50 onstructorChainP
c220: 74 72 20 3d 20 4e 55 4c 4c 3b 0a 09 7d 0a 09 42 tr = NULL;..}..B
c230: 75 6d 70 47 6c 6f 62 61 6c 45 70 6f 63 68 28 69 umpGlobalEpoch(i
c240: 6e 74 65 72 70 2c 20 63 6c 73 50 74 72 29 3b 0a nterp, clsPtr);.
c250: 20 20 20 20 7d 0a 7d 0a 0a 76 6f 69 64 0a 54 63 }.}..void.Tc
c260: 6c 5f 43 6c 61 73 73 53 65 74 44 65 73 74 72 75 l_ClassSetDestru
c270: 63 74 6f 72 28 0a 20 20 20 20 54 63 6c 5f 49 6e ctor(. Tcl_In
c280: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 terp *interp,.
c290: 20 20 54 63 6c 5f 43 6c 61 73 73 20 63 6c 61 7a Tcl_Class claz
c2a0: 7a 2c 0a 20 20 20 20 54 63 6c 5f 4d 65 74 68 6f z,. Tcl_Metho
c2b0: 64 20 6d 65 74 68 6f 64 29 0a 7b 0a 20 20 20 20 d method).{.
c2c0: 43 6c 61 73 73 20 2a 63 6c 73 50 74 72 20 3d 20 Class *clsPtr =
c2d0: 28 43 6c 61 73 73 20 2a 29 20 63 6c 61 7a 7a 3b (Class *) clazz;
c2e0: 0a 0a 20 20 20 20 69 66 20 28 6d 65 74 68 6f 64 .. if (method
c2f0: 20 21 3d 20 28 54 63 6c 5f 4d 65 74 68 6f 64 29 != (Tcl_Method)
c300: 20 63 6c 73 50 74 72 2d 3e 64 65 73 74 72 75 63 clsPtr->destruc
c310: 74 6f 72 50 74 72 29 20 7b 0a 09 54 63 6c 4f 4f torPtr) {..TclOO
c320: 44 65 6c 4d 65 74 68 6f 64 52 65 66 28 63 6c 73 DelMethodRef(cls
c330: 50 74 72 2d 3e 64 65 73 74 72 75 63 74 6f 72 50 Ptr->destructorP
c340: 74 72 29 3b 0a 09 63 6c 73 50 74 72 2d 3e 64 65 tr);..clsPtr->de
c350: 73 74 72 75 63 74 6f 72 50 74 72 20 3d 20 28 4d structorPtr = (M
c360: 65 74 68 6f 64 20 2a 29 20 6d 65 74 68 6f 64 3b ethod *) method;
c370: 0a 09 69 66 20 28 63 6c 73 50 74 72 2d 3e 64 65 ..if (clsPtr->de
c380: 73 74 72 75 63 74 6f 72 43 68 61 69 6e 50 74 72 structorChainPtr
c390: 29 20 7b 0a 09 20 20 20 20 54 63 6c 4f 4f 44 65 ) {.. TclOODe
c3a0: 6c 65 74 65 43 68 61 69 6e 28 63 6c 73 50 74 72 leteChain(clsPtr
c3b0: 2d 3e 64 65 73 74 72 75 63 74 6f 72 43 68 61 69 ->destructorChai
c3c0: 6e 50 74 72 29 3b 0a 09 20 20 20 20 63 6c 73 50 nPtr);.. clsP
c3d0: 74 72 2d 3e 64 65 73 74 72 75 63 74 6f 72 43 68 tr->destructorCh
c3e0: 61 69 6e 50 74 72 20 3d 20 4e 55 4c 4c 3b 0a 09 ainPtr = NULL;..
c3f0: 7d 0a 09 42 75 6d 70 47 6c 6f 62 61 6c 45 70 6f }..BumpGlobalEpo
c400: 63 68 28 69 6e 74 65 72 70 2c 20 63 6c 73 50 74 ch(interp, clsPt
c410: 72 29 3b 0a 20 20 20 20 7d 0a 7d 0a 0c 0a 2f 2a r);. }.}.../*
c420: 0a 20 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . * ------------
c430: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c440: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c450: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c460: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a ----------. *. *
c470: 20 54 63 6c 4f 4f 44 65 66 69 6e 65 53 6c 6f 74 TclOODefineSlot
c480: 73 20 2d 2d 0a 20 2a 09 43 72 65 61 74 65 20 74 s --. *.Create t
c490: 68 65 20 22 3a 3a 6f 6f 3a 3a 53 6c 6f 74 22 20 he "::oo::Slot"
c4a0: 63 6c 61 73 73 20 61 6e 64 20 69 74 73 20 73 74 class and its st
c4b0: 61 6e 64 61 72 64 20 69 6e 73 74 61 6e 63 65 73 andard instances
c4c0: 2e 20 43 6c 61 73 73 0a 20 2a 09 64 65 66 69 6e . Class. *.defin
c4d0: 69 74 69 6f 6e 20 69 73 20 65 6d 70 74 79 20 61 ition is empty a
c4e0: 74 20 74 68 65 20 73 74 61 67 65 20 28 61 64 64 t the stage (add
c4f0: 65 64 20 62 79 20 73 63 72 69 70 74 69 6e 67 29 ed by scripting)
c500: 2e 0a 20 2a 0a 20 2a 20 2d 2d 2d 2d 2d 2d 2d 2d .. *. * --------
c510: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c520: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c530: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c540: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 --------------.
c550: 2a 2f 0a 0a 69 6e 74 0a 54 63 6c 4f 4f 44 65 66 */..int.TclOODef
c560: 69 6e 65 53 6c 6f 74 73 28 0a 20 20 20 20 46 6f ineSlots(. Fo
c570: 75 6e 64 61 74 69 6f 6e 20 2a 66 50 74 72 29 0a undation *fPtr).
c580: 7b 0a 20 20 20 20 63 6f 6e 73 74 20 73 74 72 75 {. const stru
c590: 63 74 20 44 65 63 6c 61 72 65 64 53 6c 6f 74 20 ct DeclaredSlot
c5a0: 2a 73 6c 6f 74 49 6e 66 6f 50 74 72 3b 0a 20 20 *slotInfoPtr;.
c5b0: 20 20 54 63 6c 5f 4f 62 6a 20 2a 67 65 74 4e 61 Tcl_Obj *getNa
c5c0: 6d 65 20 3d 20 54 63 6c 5f 4e 65 77 53 74 72 69 me = Tcl_NewStri
c5d0: 6e 67 4f 62 6a 28 22 47 65 74 22 2c 20 2d 31 29 ngObj("Get", -1)
c5e0: 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 73 ;. Tcl_Obj *s
c5f0: 65 74 4e 61 6d 65 20 3d 20 54 63 6c 5f 4e 65 77 etName = Tcl_New
c600: 53 74 72 69 6e 67 4f 62 6a 28 22 53 65 74 22 2c StringObj("Set",
c610: 20 2d 31 29 3b 0a 20 20 20 20 43 6c 61 73 73 20 -1);. Class
c620: 2a 73 6c 6f 74 43 6c 73 3b 0a 0a 20 20 20 20 73 *slotCls;.. s
c630: 6c 6f 74 43 6c 73 20 3d 20 28 28 4f 62 6a 65 63 lotCls = ((Objec
c640: 74 20 2a 29 20 54 63 6c 5f 4e 65 77 4f 62 6a 65 t *) Tcl_NewObje
c650: 63 74 49 6e 73 74 61 6e 63 65 28 66 50 74 72 2d ctInstance(fPtr-
c660: 3e 69 6e 74 65 72 70 2c 20 28 54 63 6c 5f 43 6c >interp, (Tcl_Cl
c670: 61 73 73 29 0a 09 20 20 20 20 66 50 74 72 2d 3e ass).. fPtr->
c680: 63 6c 61 73 73 43 6c 73 2c 20 22 3a 3a 6f 6f 3a classCls, "::oo:
c690: 3a 53 6c 6f 74 22 2c 20 4e 55 4c 4c 2c 20 2d 31 :Slot", NULL, -1
c6a0: 2c 20 4e 55 4c 4c 2c 20 30 29 29 2d 3e 63 6c 61 , NULL, 0))->cla
c6b0: 73 73 50 74 72 3b 0a 20 20 20 20 69 66 20 28 73 ssPtr;. if (s
c6c0: 6c 6f 74 43 6c 73 20 3d 3d 20 4e 55 4c 4c 29 20 lotCls == NULL)
c6d0: 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 {..return TCL_ER
c6e0: 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 ROR;. }. T
c6f0: 63 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 cl_IncrRefCount(
c700: 67 65 74 4e 61 6d 65 29 3b 0a 20 20 20 20 54 63 getName);. Tc
c710: 6c 5f 49 6e 63 72 52 65 66 43 6f 75 6e 74 28 73 l_IncrRefCount(s
c720: 65 74 4e 61 6d 65 29 3b 0a 20 20 20 20 66 6f 72 etName);. for
c730: 20 28 73 6c 6f 74 49 6e 66 6f 50 74 72 20 3d 20 (slotInfoPtr =
c740: 73 6c 6f 74 73 20 3b 20 73 6c 6f 74 49 6e 66 6f slots ; slotInfo
c750: 50 74 72 2d 3e 6e 61 6d 65 20 3b 20 73 6c 6f 74 Ptr->name ; slot
c760: 49 6e 66 6f 50 74 72 2b 2b 29 20 7b 0a 09 54 63 InfoPtr++) {..Tc
c770: 6c 5f 4f 62 6a 65 63 74 20 73 6c 6f 74 4f 62 6a l_Object slotObj
c780: 65 63 74 20 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a ect = Tcl_NewObj
c790: 65 63 74 49 6e 73 74 61 6e 63 65 28 66 50 74 72 ectInstance(fPtr
c7a0: 2d 3e 69 6e 74 65 72 70 2c 0a 09 09 28 54 63 6c ->interp,...(Tcl
c7b0: 5f 43 6c 61 73 73 29 20 73 6c 6f 74 43 6c 73 2c _Class) slotCls,
c7c0: 20 73 6c 6f 74 49 6e 66 6f 50 74 72 2d 3e 6e 61 slotInfoPtr->na
c7d0: 6d 65 2c 20 4e 55 4c 4c 2c 2d 31 2c 4e 55 4c 4c me, NULL,-1,NULL
c7e0: 2c 30 29 3b 0a 0a 09 69 66 20 28 73 6c 6f 74 4f ,0);...if (slotO
c7f0: 62 6a 65 63 74 20 3d 3d 20 4e 55 4c 4c 29 20 7b bject == NULL) {
c800: 0a 09 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a .. continue;.
c810: 09 7d 0a 09 54 63 6c 5f 4e 65 77 49 6e 73 74 61 .}..Tcl_NewInsta
c820: 6e 63 65 4d 65 74 68 6f 64 28 66 50 74 72 2d 3e nceMethod(fPtr->
c830: 69 6e 74 65 72 70 2c 20 73 6c 6f 74 4f 62 6a 65 interp, slotObje
c840: 63 74 2c 20 67 65 74 4e 61 6d 65 2c 20 30 2c 0a ct, getName, 0,.
c850: 09 09 26 73 6c 6f 74 49 6e 66 6f 50 74 72 2d 3e ..&slotInfoPtr->
c860: 67 65 74 74 65 72 54 79 70 65 2c 20 4e 55 4c 4c getterType, NULL
c870: 29 3b 0a 09 54 63 6c 5f 4e 65 77 49 6e 73 74 61 );..Tcl_NewInsta
c880: 6e 63 65 4d 65 74 68 6f 64 28 66 50 74 72 2d 3e nceMethod(fPtr->
c890: 69 6e 74 65 72 70 2c 20 73 6c 6f 74 4f 62 6a 65 interp, slotObje
c8a0: 63 74 2c 20 73 65 74 4e 61 6d 65 2c 20 30 2c 0a ct, setName, 0,.
c8b0: 09 09 26 73 6c 6f 74 49 6e 66 6f 50 74 72 2d 3e ..&slotInfoPtr->
c8c0: 73 65 74 74 65 72 54 79 70 65 2c 20 4e 55 4c 4c setterType, NULL
c8d0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c );. }. Tcl
c8e0: 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 67 65 _DecrRefCount(ge
c8f0: 74 4e 61 6d 65 29 3b 0a 20 20 20 20 54 63 6c 5f tName);. Tcl_
c900: 44 65 63 72 52 65 66 43 6f 75 6e 74 28 73 65 74 DecrRefCount(set
c910: 4e 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72 Name);. retur
c920: 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a n TCL_OK;.}.../*
c930: 0a 20 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d . * ------------
c940: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c950: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c960: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
c970: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a ----------. *. *
c980: 20 43 6c 61 73 73 46 69 6c 74 65 72 47 65 74 2c ClassFilterGet,
c990: 20 43 6c 61 73 73 46 69 6c 74 65 72 53 65 74 20 ClassFilterSet
c9a0: 2d 2d 0a 20 2a 09 49 6d 70 6c 65 6d 65 6e 74 61 --. *.Implementa
c9b0: 74 69 6f 6e 20 6f 66 20 74 68 65 20 22 66 69 6c tion of the "fil
c9c0: 74 65 72 22 20 73 6c 6f 74 20 61 63 63 65 73 73 ter" slot access
c9d0: 6f 72 73 20 6f 66 20 74 68 65 20 22 6f 6f 3a 3a ors of the "oo::
c9e0: 64 65 66 69 6e 65 22 0a 20 2a 09 63 6f 6d 6d 61 define". *.comma
c9f0: 6e 64 2e 0a 20 2a 0a 20 2a 20 2d 2d 2d 2d 2d 2d nd.. *. * ------
ca00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
ca10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
ca20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
ca30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
ca40: 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20 69 6e 74 . */..static int
ca50: 0a 43 6c 61 73 73 46 69 6c 74 65 72 47 65 74 28 .ClassFilterGet(
ca60: 0a 20 20 20 20 43 6c 69 65 6e 74 44 61 74 61 20 . ClientData
ca70: 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 20 20 clientData,.
ca80: 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 Tcl_Interp *inte
ca90: 72 70 2c 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 65 rp,. Tcl_Obje
caa0: 63 74 43 6f 6e 74 65 78 74 20 63 6f 6e 74 65 78 ctContext contex
cab0: 74 2c 0a 20 20 20 20 69 6e 74 20 6f 62 6a 63 2c t,. int objc,
cac0: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f . Tcl_Obj *co
cad0: 6e 73 74 20 2a 6f 62 6a 76 29 0a 7b 0a 20 20 20 nst *objv).{.
cae0: 20 4f 62 6a 65 63 74 20 2a 6f 50 74 72 20 3d 20 Object *oPtr =
caf0: 28 4f 62 6a 65 63 74 20 2a 29 20 54 63 6c 4f 4f (Object *) TclOO
cb00: 47 65 74 44 65 66 69 6e 65 43 6d 64 43 6f 6e 74 GetDefineCmdCont
cb10: 65 78 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 ext(interp);.
cb20: 20 54 63 6c 5f 4f 62 6a 20 2a 72 65 73 75 6c 74 Tcl_Obj *result
cb30: 4f 62 6a 2c 20 2a 66 69 6c 74 65 72 4f 62 6a 3b Obj, *filterObj;
cb40: 0a 20 20 20 20 69 6e 74 20 69 3b 0a 0a 20 20 20 . int i;..
cb50: 20 69 66 20 28 54 63 6c 5f 4f 62 6a 65 63 74 43 if (Tcl_ObjectC
cb60: 6f 6e 74 65 78 74 53 6b 69 70 70 65 64 41 72 67 ontextSkippedArg
cb70: 73 28 63 6f 6e 74 65 78 74 29 20 21 3d 20 6f 62 s(context) != ob
cb80: 6a 63 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 jc) {..Tcl_Wrong
cb90: 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 NumArgs(interp,
cba0: 54 63 6c 5f 4f 62 6a 65 63 74 43 6f 6e 74 65 78 Tcl_ObjectContex
cbb0: 74 53 6b 69 70 70 65 64 41 72 67 73 28 63 6f 6e tSkippedArgs(con
cbc0: 74 65 78 74 29 2c 20 6f 62 6a 76 2c 0a 09 09 4e text), objv,...N
cbd0: 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 ULL);..return TC
cbe0: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 L_ERROR;. }.
cbf0: 20 20 20 69 66 20 28 6f 50 74 72 20 3d 3d 20 4e if (oPtr == N
cc00: 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 ULL) {..return T
cc10: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 20 CL_ERROR;. }
cc20: 65 6c 73 65 20 69 66 20 28 21 6f 50 74 72 2d 3e else if (!oPtr->
cc30: 63 6c 61 73 73 50 74 72 29 20 7b 0a 09 54 63 6c classPtr) {..Tcl
cc40: 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e _SetObjResult(in
cc50: 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 53 74 72 terp, Tcl_NewStr
cc60: 69 6e 67 4f 62 6a 28 0a 09 09 22 61 74 74 65 6d ingObj(..."attem
cc70: 70 74 20 74 6f 20 6d 69 73 75 73 65 20 41 50 49 pt to misuse API
cc80: 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 53 65 ", -1));..Tcl_Se
cc90: 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 tErrorCode(inter
cca0: 70 2c 20 22 54 43 4c 22 2c 20 22 4f 4f 22 2c 20 p, "TCL", "OO",
ccb0: 22 4d 4f 4e 4b 45 59 5f 42 55 53 49 4e 45 53 53 "MONKEY_BUSINESS
ccc0: 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 ", NULL);..retur
ccd0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 n TCL_ERROR;.
cce0: 20 7d 0a 0a 20 20 20 20 72 65 73 75 6c 74 4f 62 }.. resultOb
ccf0: 6a 20 3d 20 54 63 6c 5f 4e 65 77 4f 62 6a 28 29 j = Tcl_NewObj()
cd00: 3b 0a 20 20 20 20 46 4f 52 45 41 43 48 28 66 69 ;. FOREACH(fi
cd10: 6c 74 65 72 4f 62 6a 2c 20 6f 50 74 72 2d 3e 63 lterObj, oPtr->c
cd20: 6c 61 73 73 50 74 72 2d 3e 66 69 6c 74 65 72 73 lassPtr->filters
cd30: 29 20 7b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 6a ) {..Tcl_ListObj
cd40: 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 4e 55 AppendElement(NU
cd50: 4c 4c 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 20 66 LL, resultObj, f
cd60: 69 6c 74 65 72 4f 62 6a 29 3b 0a 20 20 20 20 7d ilterObj);. }
cd70: 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 . Tcl_SetObjR
cd80: 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 72 65 esult(interp, re
cd90: 73 75 6c 74 4f 62 6a 29 3b 0a 20 20 20 20 72 65 sultObj);. re
cda0: 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0a turn TCL_OK;.}..
cdb0: 73 74 61 74 69 63 20 69 6e 74 0a 43 6c 61 73 73 static int.Class
cdc0: 46 69 6c 74 65 72 53 65 74 28 0a 20 20 20 20 43 FilterSet(. C
cdd0: 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 lientData client
cde0: 44 61 74 61 2c 0a 20 20 20 20 54 63 6c 5f 49 6e Data,. Tcl_In
cdf0: 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 terp *interp,.
ce00: 20 20 54 63 6c 5f 4f 62 6a 65 63 74 43 6f 6e 74 Tcl_ObjectCont
ce10: 65 78 74 20 63 6f 6e 74 65 78 74 2c 0a 20 20 20 ext context,.
ce20: 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 20 20 54 int objc,. T
ce30: 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 2a 6f cl_Obj *const *o
ce40: 62 6a 76 29 0a 7b 0a 20 20 20 20 4f 62 6a 65 63 bjv).{. Objec
ce50: 74 20 2a 6f 50 74 72 20 3d 20 28 4f 62 6a 65 63 t *oPtr = (Objec
ce60: 74 20 2a 29 20 54 63 6c 4f 4f 47 65 74 44 65 66 t *) TclOOGetDef
ce70: 69 6e 65 43 6d 64 43 6f 6e 74 65 78 74 28 69 6e ineCmdContext(in
ce80: 74 65 72 70 29 3b 0a 20 20 20 20 69 6e 74 20 66 terp);. int f
ce90: 69 6c 74 65 72 63 3b 0a 20 20 20 20 54 63 6c 5f ilterc;. Tcl_
cea0: 4f 62 6a 20 2a 2a 66 69 6c 74 65 72 76 3b 0a 0a Obj **filterv;..
ceb0: 20 20 20 20 69 66 20 28 54 63 6c 5f 4f 62 6a 65 if (Tcl_Obje
cec0: 63 74 43 6f 6e 74 65 78 74 53 6b 69 70 70 65 64 ctContextSkipped
ced0: 41 72 67 73 28 63 6f 6e 74 65 78 74 29 2b 31 20 Args(context)+1
cee0: 21 3d 20 6f 62 6a 63 29 20 7b 0a 09 54 63 6c 5f != objc) {..Tcl_
cef0: 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 WrongNumArgs(int
cf00: 65 72 70 2c 20 54 63 6c 5f 4f 62 6a 65 63 74 43 erp, Tcl_ObjectC
cf10: 6f 6e 74 65 78 74 53 6b 69 70 70 65 64 41 72 67 ontextSkippedArg
cf20: 73 28 63 6f 6e 74 65 78 74 29 2c 20 6f 62 6a 76 s(context), objv
cf30: 2c 0a 09 09 22 66 69 6c 74 65 72 4c 69 73 74 22 ,..."filterList"
cf40: 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 );..return TCL_E
cf50: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 RROR;. }.
cf60: 6f 62 6a 76 20 2b 3d 20 54 63 6c 5f 4f 62 6a 65 objv += Tcl_Obje
cf70: 63 74 43 6f 6e 74 65 78 74 53 6b 69 70 70 65 64 ctContextSkipped
cf80: 41 72 67 73 28 63 6f 6e 74 65 78 74 29 3b 0a 0a Args(context);..
cf90: 20 20 20 20 69 66 20 28 6f 50 74 72 20 3d 3d 20 if (oPtr ==
cfa0: 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 NULL) {..return
cfb0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d TCL_ERROR;. }
cfc0: 20 65 6c 73 65 20 69 66 20 28 21 6f 50 74 72 2d else if (!oPtr-
cfd0: 3e 63 6c 61 73 73 50 74 72 29 20 7b 0a 09 54 63 >classPtr) {..Tc
cfe0: 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 l_SetObjResult(i
cff0: 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 53 74 nterp, Tcl_NewSt
d000: 72 69 6e 67 4f 62 6a 28 0a 09 09 22 61 74 74 65 ringObj(..."atte
d010: 6d 70 74 20 74 6f 20 6d 69 73 75 73 65 20 41 50 mpt to misuse AP
d020: 49 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 53 I", -1));..Tcl_S
d030: 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 etErrorCode(inte
d040: 72 70 2c 20 22 54 43 4c 22 2c 20 22 4f 4f 22 2c rp, "TCL", "OO",
d050: 20 22 4d 4f 4e 4b 45 59 5f 42 55 53 49 4e 45 53 "MONKEY_BUSINES
d060: 53 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 S", NULL);..retu
d070: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 rn TCL_ERROR;.
d080: 20 20 7d 20 65 6c 73 65 20 69 66 20 28 54 63 6c } else if (Tcl
d090: 5f 4c 69 73 74 4f 62 6a 47 65 74 45 6c 65 6d 65 _ListObjGetEleme
d0a0: 6e 74 73 28 69 6e 74 65 72 70 2c 20 6f 62 6a 76 nts(interp, objv
d0b0: 5b 30 5d 2c 20 26 66 69 6c 74 65 72 63 2c 0a 09 [0], &filterc,..
d0c0: 20 20 20 20 26 66 69 6c 74 65 72 76 29 20 21 3d &filterv) !=
d0d0: 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 TCL_OK) {..retu
d0e0: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 rn TCL_ERROR;.
d0f0: 20 20 7d 0a 0a 20 20 20 20 54 63 6c 4f 4f 43 6c }.. TclOOCl
d100: 61 73 73 53 65 74 46 69 6c 74 65 72 73 28 69 6e assSetFilters(in
d110: 74 65 72 70 2c 20 6f 50 74 72 2d 3e 63 6c 61 73 terp, oPtr->clas
d120: 73 50 74 72 2c 20 66 69 6c 74 65 72 63 2c 20 66 sPtr, filterc, f
d130: 69 6c 74 65 72 76 29 3b 0a 20 20 20 20 72 65 74 ilterv);. ret
d140: 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a urn TCL_OK;.}...
d150: 2f 2a 0a 20 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d /*. * ----------
d160: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d170: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d180: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d190: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a ------------. *.
d1a0: 20 2a 20 43 6c 61 73 73 4d 69 78 69 6e 47 65 74 * ClassMixinGet
d1b0: 2c 20 43 6c 61 73 73 4d 69 78 69 6e 53 65 74 20 , ClassMixinSet
d1c0: 2d 2d 0a 20 2a 09 49 6d 70 6c 65 6d 65 6e 74 61 --. *.Implementa
d1d0: 74 69 6f 6e 20 6f 66 20 74 68 65 20 22 6d 69 78 tion of the "mix
d1e0: 69 6e 22 20 73 6c 6f 74 20 61 63 63 65 73 73 6f in" slot accesso
d1f0: 72 73 20 6f 66 20 74 68 65 20 22 6f 6f 3a 3a 64 rs of the "oo::d
d200: 65 66 69 6e 65 22 0a 20 2a 09 63 6f 6d 6d 61 6e efine". *.comman
d210: 64 2e 0a 20 2a 0a 20 2a 20 2d 2d 2d 2d 2d 2d 2d d.. *. * -------
d220: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d230: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d240: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
d250: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
d260: 20 2a 2f 0a 0a 73 74 61 74 69 63 20 69 6e 74 0a */..static int.
d270: 43 6c 61 73 73 4d 69 78 69 6e 47 65 74 28 0a 20 ClassMixinGet(.
d280: 20 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c ClientData cl
d290: 69 65 6e 74 44 61 74 61 2c 0a 20 20 20 20 54 63 ientData,. Tc
d2a0: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 l_Interp *interp
d2b0: 2c 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 65 63 74 ,. Tcl_Object
d2c0: 43 6f 6e 74 65 78 74 20 63 6f 6e 74 65 78 74 2c Context context,
d2d0: 0a 20 20 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 . int objc,.
d2e0: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 Tcl_Obj *cons
d2f0: 74 20 2a 6f 62 6a 76 29 0a 7b 0a 20 20 20 20 4f t *objv).{. O
d300: 62 6a 65 63 74 20 2a 6f 50 74 72 20 3d 20 28 4f bject *oPtr = (O
d310: 62 6a 65 63 74 20 2a 29 20 54 63 6c 4f 4f 47 65 bject *) TclOOGe
d320: 74 44 65 66 69 6e 65 43 6d 64 43 6f 6e 74 65 78 tDefineCmdContex
d330: 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 54 t(interp);. T
d340: 63 6c 5f 4f 62 6a 20 2a 72 65 73 75 6c 74 4f 62 cl_Obj *resultOb
d350: 6a 3b 0a 20 20 20 20 43 6c 61 73 73 20 2a 6d 69 j;. Class *mi
d360: 78 69 6e 50 74 72 3b 0a 20 20 20 20 69 6e 74 20 xinPtr;. int
d370: 69 3b 0a 0a 20 20 20 20 69 66 20 28 54 63 6c 5f i;.. if (Tcl_
d380: 4f 62 6a 65 63 74 43 6f 6e 74 65 78 74 53 6b 69 ObjectContextSki
d390: 70 70 65 64 41 72 67 73 28 63 6f 6e 74 65 78 74 ppedArgs(context
d3a0: 29 20 21 3d 20 6f 62 6a 63 29 20 7b 0a 09 54 63 ) != objc) {..Tc
d3b0: 6c 5f 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 l_WrongNumArgs(i
d3c0: 6e 74 65 72 70 2c 20 54 63 6c 5f 4f 62 6a 65 63 nterp, Tcl_Objec
d3d0: 74 43 6f 6e 74 65 78 74 53 6b 69 70 70 65 64 41 tContextSkippedA
d3e0: 72 67 73 28 63 6f 6e 74 65 78 74 29 2c 20 6f 62 rgs(context), ob
d3f0: 6a 76 2c 0a 09 09 4e 55 4c 4c 29 3b 0a 09 72 65 jv,...NULL);..re
d400: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
d410: 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 6f 50 }. if (oP
d420: 74 72 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 tr == NULL) {..r
d430: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
d440: 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 . } else if (
d450: 21 6f 50 74 72 2d 3e 63 6c 61 73 73 50 74 72 29 !oPtr->classPtr)
d460: 20 7b 0a 09 54 63 6c 5f 53 65 74 4f 62 6a 52 65 {..Tcl_SetObjRe
d470: 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c sult(interp, Tcl
d480: 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a 28 0a 09 _NewStringObj(..
d490: 09 22 61 74 74 65 6d 70 74 20 74 6f 20 6d 69 73 ."attempt to mis
d4a0: 75 73 65 20 41 50 49 22 2c 20 2d 31 29 29 3b 0a use API", -1));.
d4b0: 09 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 .Tcl_SetErrorCod
d4c0: 65 28 69 6e 74 65 72 70 2c 20 22 54 43 4c 22 2c e(interp, "TCL",
d4d0: 20 22 4f 4f 22 2c 20 22 4d 4f 4e 4b 45 59 5f 42 "OO", "MONKEY_B
d4e0: 55 53 49 4e 45 53 53 22 2c 20 4e 55 4c 4c 29 3b USINESS", NULL);
d4f0: 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 ..return TCL_ERR
d500: 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 OR;. }.. r
d510: 65 73 75 6c 74 4f 62 6a 20 3d 20 54 63 6c 5f 4e esultObj = Tcl_N
d520: 65 77 4f 62 6a 28 29 3b 0a 20 20 20 20 46 4f 52 ewObj();. FOR
d530: 45 41 43 48 28 6d 69 78 69 6e 50 74 72 2c 20 6f EACH(mixinPtr, o
d540: 50 74 72 2d 3e 63 6c 61 73 73 50 74 72 2d 3e 6d Ptr->classPtr->m
d550: 69 78 69 6e 73 29 20 7b 0a 09 54 63 6c 5f 4c 69 ixins) {..Tcl_Li
d560: 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
d570: 6e 74 28 4e 55 4c 4c 2c 20 72 65 73 75 6c 74 4f nt(NULL, resultO
d580: 62 6a 2c 0a 09 09 54 63 6c 4f 4f 4f 62 6a 65 63 bj,...TclOOObjec
d590: 74 4e 61 6d 65 28 69 6e 74 65 72 70 2c 20 6d 69 tName(interp, mi
d5a0: 78 69 6e 50 74 72 2d 3e 74 68 69 73 50 74 72 29 xinPtr->thisPtr)
d5b0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c );. }. Tcl
d5c0: 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e _SetObjResult(in
d5d0: 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 29 terp, resultObj)
d5e0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c ;. return TCL
d5f0: 5f 4f 4b 3b 0a 0a 7d 0a 0a 73 74 61 74 69 63 20 _OK;..}..static
d600: 69 6e 74 0a 43 6c 61 73 73 4d 69 78 69 6e 53 65 int.ClassMixinSe
d610: 74 28 0a 20 20 20 20 43 6c 69 65 6e 74 44 61 74 t(. ClientDat
d620: 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 a clientData,.
d630: 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e Tcl_Interp *in
d640: 74 65 72 70 2c 0a 20 20 20 20 54 63 6c 5f 4f 62 terp,. Tcl_Ob
d650: 6a 65 63 74 43 6f 6e 74 65 78 74 20 63 6f 6e 74 jectContext cont
d660: 65 78 74 2c 0a 20 20 20 20 69 6e 74 20 6f 62 6a ext,. int obj
d670: 63 2c 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a c,. Tcl_Obj *
d680: 63 6f 6e 73 74 20 2a 6f 62 6a 76 29 0a 7b 0a 20 const *objv).{.
d690: 20 20 20 4f 62 6a 65 63 74 20 2a 6f 50 74 72 20 Object *oPtr
d6a0: 3d 20 28 4f 62 6a 65 63 74 20 2a 29 20 54 63 6c = (Object *) Tcl
d6b0: 4f 4f 47 65 74 44 65 66 69 6e 65 43 6d 64 43 6f OOGetDefineCmdCo
d6c0: 6e 74 65 78 74 28 69 6e 74 65 72 70 29 3b 0a 20 ntext(interp);.
d6d0: 20 20 20 69 6e 74 20 6d 69 78 69 6e 63 2c 20 69 int mixinc, i
d6e0: 3b 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a ;. Tcl_Obj **
d6f0: 6d 69 78 69 6e 76 3b 0a 20 20 20 20 43 6c 61 73 mixinv;. Clas
d700: 73 20 2a 2a 6d 69 78 69 6e 73 3b 0a 0a 20 20 20 s **mixins;..
d710: 20 69 66 20 28 54 63 6c 5f 4f 62 6a 65 63 74 43 if (Tcl_ObjectC
d720: 6f 6e 74 65 78 74 53 6b 69 70 70 65 64 41 72 67 ontextSkippedArg
d730: 73 28 63 6f 6e 74 65 78 74 29 2b 31 20 21 3d 20 s(context)+1 !=
d740: 6f 62 6a 63 29 20 7b 0a 09 54 63 6c 5f 57 72 6f objc) {..Tcl_Wro
d750: 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 ngNumArgs(interp
d760: 2c 20 54 63 6c 5f 4f 62 6a 65 63 74 43 6f 6e 74 , Tcl_ObjectCont
d770: 65 78 74 53 6b 69 70 70 65 64 41 72 67 73 28 63 extSkippedArgs(c
d780: 6f 6e 74 65 78 74 29 2c 20 6f 62 6a 76 2c 0a 09 ontext), objv,..
d790: 09 22 6d 69 78 69 6e 4c 69 73 74 22 29 3b 0a 09 ."mixinList");..
d7a0: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
d7b0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6f 62 6a 76 ;. }. objv
d7c0: 20 2b 3d 20 54 63 6c 5f 4f 62 6a 65 63 74 43 6f += Tcl_ObjectCo
d7d0: 6e 74 65 78 74 53 6b 69 70 70 65 64 41 72 67 73 ntextSkippedArgs
d7e0: 28 63 6f 6e 74 65 78 74 29 3b 0a 0a 20 20 20 20 (context);..
d7f0: 69 66 20 28 6f 50 74 72 20 3d 3d 20 4e 55 4c 4c if (oPtr == NULL
d800: 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f ) {..return TCL_
d810: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 20 65 6c 73 ERROR;. } els
d820: 65 20 69 66 20 28 21 6f 50 74 72 2d 3e 63 6c 61 e if (!oPtr->cla
d830: 73 73 50 74 72 29 20 7b 0a 09 54 63 6c 5f 53 65 ssPtr) {..Tcl_Se
d840: 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 tObjResult(inter
d850: 70 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 p, Tcl_NewString
d860: 4f 62 6a 28 0a 09 09 22 61 74 74 65 6d 70 74 20 Obj(..."attempt
d870: 74 6f 20 6d 69 73 75 73 65 20 41 50 49 22 2c 20 to misuse API",
d880: 2d 31 29 29 3b 0a 09 54 63 6c 5f 53 65 74 45 72 -1));..Tcl_SetEr
d890: 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 rorCode(interp,
d8a0: 22 54 43 4c 22 2c 20 22 4f 4f 22 2c 20 22 4d 4f "TCL", "OO", "MO
d8b0: 4e 4b 45 59 5f 42 55 53 49 4e 45 53 53 22 2c 20 NKEY_BUSINESS",
d8c0: 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 NULL);..return T
d8d0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 20 CL_ERROR;. }
d8e0: 65 6c 73 65 20 69 66 20 28 54 63 6c 5f 4c 69 73 else if (Tcl_Lis
d8f0: 74 4f 62 6a 47 65 74 45 6c 65 6d 65 6e 74 73 28 tObjGetElements(
d900: 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 30 5d 2c interp, objv[0],
d910: 20 26 6d 69 78 69 6e 63 2c 0a 09 20 20 20 20 26 &mixinc,.. &
d920: 6d 69 78 69 6e 76 29 20 21 3d 20 54 43 4c 5f 4f mixinv) != TCL_O
d930: 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c K) {..return TCL
d940: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 _ERROR;. }..
d950: 20 20 20 6d 69 78 69 6e 73 20 3d 20 54 63 6c 53 mixins = TclS
d960: 74 61 63 6b 41 6c 6c 6f 63 28 69 6e 74 65 72 70 tackAlloc(interp
d970: 2c 20 73 69 7a 65 6f 66 28 43 6c 61 73 73 20 2a , sizeof(Class *
d980: 29 20 2a 20 6d 69 78 69 6e 63 29 3b 0a 0a 20 20 ) * mixinc);..
d990: 20 20 66 6f 72 20 28 69 3d 30 20 3b 20 69 3c 6d for (i=0 ; i<m
d9a0: 69 78 69 6e 63 20 3b 20 69 2b 2b 29 20 7b 0a 09 ixinc ; i++) {..
d9b0: 6d 69 78 69 6e 73 5b 69 5d 20 3d 20 47 65 74 43 mixins[i] = GetC
d9c0: 6c 61 73 73 49 6e 4f 75 74 65 72 43 6f 6e 74 65 lassInOuterConte
d9d0: 78 74 28 69 6e 74 65 72 70 2c 20 6d 69 78 69 6e xt(interp, mixin
d9e0: 76 5b 69 5d 2c 0a 09 09 22 6d 61 79 20 6f 6e 6c v[i],..."may onl
d9f0: 79 20 6d 69 78 20 69 6e 20 63 6c 61 73 73 65 73 y mix in classes
da00: 22 29 3b 0a 09 69 66 20 28 6d 69 78 69 6e 73 5b ");..if (mixins[
da10: 69 5d 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 i] == NULL) {..
da20: 20 20 20 67 6f 74 6f 20 66 72 65 65 41 6e 64 45 goto freeAndE
da30: 72 72 6f 72 3b 0a 09 7d 0a 09 69 66 20 28 54 63 rror;..}..if (Tc
da40: 6c 4f 4f 49 73 52 65 61 63 68 61 62 6c 65 28 6f lOOIsReachable(o
da50: 50 74 72 2d 3e 63 6c 61 73 73 50 74 72 2c 20 6d Ptr->classPtr, m
da60: 69 78 69 6e 73 5b 69 5d 29 29 20 7b 0a 09 20 20 ixins[i])) {..
da70: 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 Tcl_SetObjResu
da80: 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e lt(interp, Tcl_N
da90: 65 77 53 74 72 69 6e 67 4f 62 6a 28 0a 09 09 20 ewStringObj(...
daa0: 20 20 20 22 6d 61 79 20 6e 6f 74 20 6d 69 78 20 "may not mix
dab0: 61 20 63 6c 61 73 73 20 69 6e 74 6f 20 69 74 73 a class into its
dac0: 65 6c 66 22 2c 20 2d 31 29 29 3b 0a 09 20 20 20 elf", -1));..
dad0: 20 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 Tcl_SetErrorCod
dae0: 65 28 69 6e 74 65 72 70 2c 20 22 54 43 4c 22 2c e(interp, "TCL",
daf0: 20 22 4f 4f 22 2c 20 22 53 45 4c 46 5f 4d 49 58 "OO", "SELF_MIX
db00: 49 4e 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 IN", NULL);..
db10: 20 67 6f 74 6f 20 66 72 65 65 41 6e 64 45 72 72 goto freeAndErr
db20: 6f 72 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 or;..}. }..
db30: 20 20 54 63 6c 4f 4f 43 6c 61 73 73 53 65 74 4d TclOOClassSetM
db40: 69 78 69 6e 73 28 69 6e 74 65 72 70 2c 20 6f 50 ixins(interp, oP
db50: 74 72 2d 3e 63 6c 61 73 73 50 74 72 2c 20 6d 69 tr->classPtr, mi
db60: 78 69 6e 63 2c 20 6d 69 78 69 6e 73 29 3b 0a 20 xinc, mixins);.
db70: 20 20 20 54 63 6c 53 74 61 63 6b 46 72 65 65 28 TclStackFree(
db80: 69 6e 74 65 72 70 2c 20 6d 69 78 69 6e 73 29 3b interp, mixins);
db90: 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f . return TCL_
dba0: 4f 4b 3b 0a 0a 20 20 66 72 65 65 41 6e 64 45 72 OK;.. freeAndEr
dbb0: 72 6f 72 3a 0a 20 20 20 20 54 63 6c 53 74 61 63 ror:. TclStac
dbc0: 6b 46 72 65 65 28 69 6e 74 65 72 70 2c 20 6d 69 kFree(interp, mi
dbd0: 78 69 6e 73 29 3b 0a 20 20 20 20 72 65 74 75 72 xins);. retur
dbe0: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 7d 0a 0c n TCL_ERROR;.}..
dbf0: 0a 2f 2a 0a 20 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d ./*. * ---------
dc00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
dc10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
dc20: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
dc30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a -------------. *
dc40: 0a 20 2a 20 43 6c 61 73 73 53 75 70 65 72 47 65 . * ClassSuperGe
dc50: 74 2c 20 43 6c 61 73 73 53 75 70 65 72 53 65 74 t, ClassSuperSet
dc60: 20 2d 2d 0a 20 2a 09 49 6d 70 6c 65 6d 65 6e 74 --. *.Implement
dc70: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 22 73 75 ation of the "su
dc80: 70 65 72 63 6c 61 73 73 22 20 73 6c 6f 74 20 61 perclass" slot a
dc90: 63 63 65 73 73 6f 72 73 20 6f 66 20 74 68 65 20 ccessors of the
dca0: 22 6f 6f 3a 3a 64 65 66 69 6e 65 22 0a 20 2a 09 "oo::define". *.
dcb0: 63 6f 6d 6d 61 6e 64 2e 0a 20 2a 0a 20 2a 20 2d command.. *. * -
dcc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
dcd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
dce0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
dcf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
dd00: 2d 2d 2d 2d 2d 0a 20 2a 2f 0a 0a 73 74 61 74 69 -----. */..stati
dd10: 63 20 69 6e 74 0a 43 6c 61 73 73 53 75 70 65 72 c int.ClassSuper
dd20: 47 65 74 28 0a 20 20 20 20 43 6c 69 65 6e 74 44 Get(. ClientD
dd30: 61 74 61 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a ata clientData,.
dd40: 20 20 20 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a Tcl_Interp *
dd50: 69 6e 74 65 72 70 2c 0a 20 20 20 20 54 63 6c 5f interp,. Tcl_
dd60: 4f 62 6a 65 63 74 43 6f 6e 74 65 78 74 20 63 6f ObjectContext co
dd70: 6e 74 65 78 74 2c 0a 20 20 20 20 69 6e 74 20 6f ntext,. int o
dd80: 62 6a 63 2c 0a 20 20 20 20 54 63 6c 5f 4f 62 6a bjc,. Tcl_Obj
dd90: 20 2a 63 6f 6e 73 74 20 2a 6f 62 6a 76 29 0a 7b *const *objv).{
dda0: 0a 20 20 20 20 4f 62 6a 65 63 74 20 2a 6f 50 74 . Object *oPt
ddb0: 72 20 3d 20 28 4f 62 6a 65 63 74 20 2a 29 20 54 r = (Object *) T
ddc0: 63 6c 4f 4f 47 65 74 44 65 66 69 6e 65 43 6d 64 clOOGetDefineCmd
ddd0: 43 6f 6e 74 65 78 74 28 69 6e 74 65 72 70 29 3b Context(interp);
dde0: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 72 65 . Tcl_Obj *re
ddf0: 73 75 6c 74 4f 62 6a 3b 0a 20 20 20 20 43 6c 61 sultObj;. Cla
de00: 73 73 20 2a 73 75 70 65 72 50 74 72 3b 0a 20 20 ss *superPtr;.
de10: 20 20 69 6e 74 20 69 3b 0a 0a 20 20 20 20 69 66 int i;.. if
de20: 20 28 54 63 6c 5f 4f 62 6a 65 63 74 43 6f 6e 74 (Tcl_ObjectCont
de30: 65 78 74 53 6b 69 70 70 65 64 41 72 67 73 28 63 extSkippedArgs(c
de40: 6f 6e 74 65 78 74 29 20 21 3d 20 6f 62 6a 63 29 ontext) != objc)
de50: 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d {..Tcl_WrongNum
de60: 41 72 67 73 28 69 6e 74 65 72 70 2c 20 54 63 6c Args(interp, Tcl
de70: 5f 4f 62 6a 65 63 74 43 6f 6e 74 65 78 74 53 6b _ObjectContextSk
de80: 69 70 70 65 64 41 72 67 73 28 63 6f 6e 74 65 78 ippedArgs(contex
de90: 74 29 2c 20 6f 62 6a 76 2c 0a 09 09 4e 55 4c 4c t), objv,...NULL
dea0: 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 );..return TCL_E
deb0: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 RROR;. }.
dec0: 69 66 20 28 6f 50 74 72 20 3d 3d 20 4e 55 4c 4c if (oPtr == NULL
ded0: 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f ) {..return TCL_
dee0: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 20 65 6c 73 ERROR;. } els
def0: 65 20 69 66 20 28 21 6f 50 74 72 2d 3e 63 6c 61 e if (!oPtr->cla
df00: 73 73 50 74 72 29 20 7b 0a 09 54 63 6c 5f 53 65 ssPtr) {..Tcl_Se
df10: 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 tObjResult(inter
df20: 70 2c 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 p, Tcl_NewString
df30: 4f 62 6a 28 0a 09 09 22 61 74 74 65 6d 70 74 20 Obj(..."attempt
df40: 74 6f 20 6d 69 73 75 73 65 20 41 50 49 22 2c 20 to misuse API",
df50: 2d 31 29 29 3b 0a 09 54 63 6c 5f 53 65 74 45 72 -1));..Tcl_SetEr
df60: 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 rorCode(interp,
df70: 22 54 43 4c 22 2c 20 22 4f 4f 22 2c 20 22 4d 4f "TCL", "OO", "MO
df80: 4e 4b 45 59 5f 42 55 53 49 4e 45 53 53 22 2c 20 NKEY_BUSINESS",
df90: 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 NULL);..return T
dfa0: 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a CL_ERROR;. }.
dfb0: 0a 20 20 20 20 72 65 73 75 6c 74 4f 62 6a 20 3d . resultObj =
dfc0: 20 54 63 6c 5f 4e 65 77 4f 62 6a 28 29 3b 0a 20 Tcl_NewObj();.
dfd0: 20 20 20 46 4f 52 45 41 43 48 28 73 75 70 65 72 FOREACH(super
dfe0: 50 74 72 2c 20 6f 50 74 72 2d 3e 63 6c 61 73 73 Ptr, oPtr->class
dff0: 50 74 72 2d 3e 73 75 70 65 72 63 6c 61 73 73 65 Ptr->superclasse
e000: 73 29 20 7b 0a 09 54 63 6c 5f 4c 69 73 74 4f 62 s) {..Tcl_ListOb
e010: 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 4e jAppendElement(N
e020: 55 4c 4c 2c 20 72 65 73 75 6c 74 4f 62 6a 2c 0a ULL, resultObj,.
e030: 09 09 54 63 6c 4f 4f 4f 62 6a 65 63 74 4e 61 6d ..TclOOObjectNam
e040: 65 28 69 6e 74 65 72 70 2c 20 73 75 70 65 72 50 e(interp, superP
e050: 74 72 2d 3e 74 68 69 73 50 74 72 29 29 3b 0a 20 tr->thisPtr));.
e060: 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 53 65 74 }. Tcl_Set
e070: 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 ObjResult(interp
e080: 2c 20 72 65 73 75 6c 74 4f 62 6a 29 3b 0a 20 20 , resultObj);.
e090: 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b return TCL_OK;
e0a0: 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 0a 43 .}..static int.C
e0b0: 6c 61 73 73 53 75 70 65 72 53 65 74 28 0a 20 20 lassSuperSet(.
e0c0: 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 ClientData cli
e0d0: 65 6e 74 44 61 74 61 2c 0a 20 20 20 20 54 63 6c entData,. Tcl
e0e0: 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c _Interp *interp,
e0f0: 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 65 63 74 43 . Tcl_ObjectC
e100: 6f 6e 74 65 78 74 20 63 6f 6e 74 65 78 74 2c 0a ontext context,.
e110: 20 20 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 int objc,.
e120: 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 Tcl_Obj *const
e130: 20 2a 6f 62 6a 76 29 0a 7b 0a 20 20 20 20 4f 62 *objv).{. Ob
e140: 6a 65 63 74 20 2a 6f 50 74 72 20 3d 20 28 4f 62 ject *oPtr = (Ob
e150: 6a 65 63 74 20 2a 29 20 54 63 6c 4f 4f 47 65 74 ject *) TclOOGet
e160: 44 65 66 69 6e 65 43 6d 64 43 6f 6e 74 65 78 74 DefineCmdContext
e170: 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 69 6e (interp);. in
e180: 74 20 73 75 70 65 72 63 2c 20 69 2c 20 6a 3b 0a t superc, i, j;.
e190: 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 2a 73 75 Tcl_Obj **su
e1a0: 70 65 72 76 3b 0a 20 20 20 20 43 6c 61 73 73 20 perv;. Class
e1b0: 2a 2a 73 75 70 65 72 63 6c 61 73 73 65 73 2c 20 **superclasses,
e1c0: 2a 73 75 70 65 72 50 74 72 3b 0a 0a 20 20 20 20 *superPtr;..
e1d0: 69 66 20 28 54 63 6c 5f 4f 62 6a 65 63 74 43 6f if (Tcl_ObjectCo
e1e0: 6e 74 65 78 74 53 6b 69 70 70 65 64 41 72 67 73 ntextSkippedArgs
e1f0: 28 63 6f 6e 74 65 78 74 29 2b 31 20 21 3d 20 6f (context)+1 != o
e200: 62 6a 63 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e bjc) {..Tcl_Wron
e210: 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c gNumArgs(interp,
e220: 20 54 63 6c 5f 4f 62 6a 65 63 74 43 6f 6e 74 65 Tcl_ObjectConte
e230: 78 74 53 6b 69 70 70 65 64 41 72 67 73 28 63 6f xtSkippedArgs(co
e240: 6e 74 65 78 74 29 2c 20 6f 62 6a 76 2c 0a 09 09 ntext), objv,...
e250: 22 73 75 70 65 72 63 6c 61 73 73 4c 69 73 74 22 "superclassList"
e260: 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 );..return TCL_E
e270: 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 20 RROR;. }.
e280: 6f 62 6a 76 20 2b 3d 20 54 63 6c 5f 4f 62 6a 65 objv += Tcl_Obje
e290: 63 74 43 6f 6e 74 65 78 74 53 6b 69 70 70 65 64 ctContextSkipped
e2a0: 41 72 67 73 28 63 6f 6e 74 65 78 74 29 3b 0a 0a Args(context);..
e2b0: 20 20 20 20 69 66 20 28 6f 50 74 72 20 3d 3d 20 if (oPtr ==
e2c0: 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 NULL) {..return
e2d0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d TCL_ERROR;. }
e2e0: 20 65 6c 73 65 20 69 66 20 28 21 6f 50 74 72 2d else if (!oPtr-
e2f0: 3e 63 6c 61 73 73 50 74 72 29 20 7b 0a 09 54 63 >classPtr) {..Tc
e300: 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 l_SetObjResult(i
e310: 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 53 74 nterp, Tcl_NewSt
e320: 72 69 6e 67 4f 62 6a 28 0a 09 09 22 61 74 74 65 ringObj(..."atte
e330: 6d 70 74 20 74 6f 20 6d 69 73 75 73 65 20 41 50 mpt to misuse AP
e340: 49 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c 5f 53 I", -1));..Tcl_S
e350: 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 etErrorCode(inte
e360: 72 70 2c 20 22 54 43 4c 22 2c 20 22 4f 4f 22 2c rp, "TCL", "OO",
e370: 20 22 4d 4f 4e 4b 45 59 5f 42 55 53 49 4e 45 53 "MONKEY_BUSINES
e380: 53 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 S", NULL);..retu
e390: 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 rn TCL_ERROR;.
e3a0: 20 20 7d 20 65 6c 73 65 20 69 66 20 28 6f 50 74 } else if (oPt
e3b0: 72 20 3d 3d 20 6f 50 74 72 2d 3e 66 50 74 72 2d r == oPtr->fPtr-
e3c0: 3e 6f 62 6a 65 63 74 43 6c 73 2d 3e 74 68 69 73 >objectCls->this
e3d0: 50 74 72 29 20 7b 0a 09 54 63 6c 5f 53 65 74 4f Ptr) {..Tcl_SetO
e3e0: 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c bjResult(interp,
e3f0: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
e400: 6a 28 0a 09 09 22 6d 61 79 20 6e 6f 74 20 6d 6f j(..."may not mo
e410: 64 69 66 79 20 74 68 65 20 73 75 70 65 72 63 6c dify the supercl
e420: 61 73 73 20 6f 66 20 74 68 65 20 72 6f 6f 74 20 ass of the root
e430: 6f 62 6a 65 63 74 22 2c 20 2d 31 29 29 3b 0a 09 object", -1));..
e440: 54 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 Tcl_SetErrorCode
e450: 28 69 6e 74 65 72 70 2c 20 22 54 43 4c 22 2c 20 (interp, "TCL",
e460: 22 4f 4f 22 2c 20 22 4d 4f 4e 4b 45 59 5f 42 55 "OO", "MONKEY_BU
e470: 53 49 4e 45 53 53 22 2c 20 4e 55 4c 4c 29 3b 0a SINESS", NULL);.
e480: 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f .return TCL_ERRO
e490: 52 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 69 66 R;. } else if
e4a0: 20 28 54 63 6c 5f 4c 69 73 74 4f 62 6a 47 65 74 (Tcl_ListObjGet
e4b0: 45 6c 65 6d 65 6e 74 73 28 69 6e 74 65 72 70 2c Elements(interp,
e4c0: 20 6f 62 6a 76 5b 30 5d 2c 20 26 73 75 70 65 72 objv[0], &super
e4d0: 63 2c 0a 09 20 20 20 20 26 73 75 70 65 72 76 29 c,.. &superv)
e4e0: 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 72 != TCL_OK) {..r
e4f0: 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b eturn TCL_ERROR;
e500: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 . }.. /*.
e510: 20 20 20 20 2a 20 41 6c 6c 6f 63 61 74 65 20 73 * Allocate s
e520: 6f 6d 65 20 77 6f 72 6b 69 6e 67 20 73 70 61 63 ome working spac
e530: 65 2e 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 20 e.. */..
e540: 73 75 70 65 72 63 6c 61 73 73 65 73 20 3d 20 28 superclasses = (
e550: 43 6c 61 73 73 20 2a 2a 29 20 63 6b 61 6c 6c 6f Class **) ckallo
e560: 63 28 73 69 7a 65 6f 66 28 43 6c 61 73 73 20 2a c(sizeof(Class *
e570: 29 20 2a 20 73 75 70 65 72 63 29 3b 0a 0a 20 20 ) * superc);..
e580: 20 20 2f 2a 0a 20 20 20 20 20 2a 20 50 61 72 73 /*. * Pars
e590: 65 20 74 68 65 20 61 72 67 75 6d 65 6e 74 73 20 e the arguments
e5a0: 74 6f 20 67 65 74 20 74 68 65 20 63 6c 61 73 73 to get the class
e5b0: 20 74 6f 20 75 73 65 20 61 73 20 73 75 70 65 72 to use as super
e5c0: 63 6c 61 73 73 65 73 2e 0a 20 20 20 20 20 2a 0a classes.. *.
e5d0: 20 20 20 20 20 2a 20 4e 6f 74 65 20 74 68 61 74 * Note that
e5e0: 20 7a 65 72 6f 20 63 6c 61 73 73 65 73 20 69 73 zero classes is
e5f0: 20 73 70 65 63 69 61 6c 2c 20 61 73 20 69 74 20 special, as it
e600: 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f is equivalent to
e610: 20 6a 75 73 74 20 74 68 65 0a 20 20 20 20 20 2a just the. *
e620: 20 63 6c 61 73 73 20 6f 66 20 6f 62 6a 65 63 74 class of object
e630: 73 2e 20 5b 42 75 67 20 39 64 36 31 36 32 34 62 s. [Bug 9d61624b
e640: 33 64 5d 0a 20 20 20 20 20 2a 2f 0a 0a 20 20 20 3d]. */..
e650: 20 69 66 20 28 73 75 70 65 72 63 20 3d 3d 20 30 if (superc == 0
e660: 29 20 7b 0a 09 73 75 70 65 72 63 6c 61 73 73 65 ) {..superclasse
e670: 73 20 3d 20 63 6b 72 65 61 6c 6c 6f 63 28 73 75 s = ckrealloc(su
e680: 70 65 72 63 6c 61 73 73 65 73 2c 20 73 69 7a 65 perclasses, size
e690: 6f 66 28 43 6c 61 73 73 20 2a 29 29 3b 0a 09 73 of(Class *));..s
e6a0: 75 70 65 72 63 6c 61 73 73 65 73 5b 30 5d 20 3d uperclasses[0] =
e6b0: 20 6f 50 74 72 2d 3e 66 50 74 72 2d 3e 6f 62 6a oPtr->fPtr->obj
e6c0: 65 63 74 43 6c 73 3b 0a 09 73 75 70 65 72 63 20 ectCls;..superc
e6d0: 3d 20 31 3b 0a 09 69 66 20 28 54 63 6c 4f 4f 49 = 1;..if (TclOOI
e6e0: 73 52 65 61 63 68 61 62 6c 65 28 6f 50 74 72 2d sReachable(oPtr-
e6f0: 3e 66 50 74 72 2d 3e 63 6c 61 73 73 43 6c 73 2c >fPtr->classCls,
e700: 20 6f 50 74 72 2d 3e 63 6c 61 73 73 50 74 72 29 oPtr->classPtr)
e710: 29 20 7b 0a 09 20 20 20 20 73 75 70 65 72 63 6c ) {.. supercl
e720: 61 73 73 65 73 5b 30 5d 20 3d 20 6f 50 74 72 2d asses[0] = oPtr-
e730: 3e 66 50 74 72 2d 3e 63 6c 61 73 73 43 6c 73 3b >fPtr->classCls;
e740: 0a 09 7d 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b ..}. } else {
e750: 0a 09 66 6f 72 20 28 69 3d 30 20 3b 20 69 3c 73 ..for (i=0 ; i<s
e760: 75 70 65 72 63 20 3b 20 69 2b 2b 29 20 7b 0a 09 uperc ; i++) {..
e770: 20 20 20 20 73 75 70 65 72 63 6c 61 73 73 65 73 superclasses
e780: 5b 69 5d 20 3d 20 47 65 74 43 6c 61 73 73 49 6e [i] = GetClassIn
e790: 4f 75 74 65 72 43 6f 6e 74 65 78 74 28 69 6e 74 OuterContext(int
e7a0: 65 72 70 2c 20 73 75 70 65 72 76 5b 69 5d 2c 0a erp, superv[i],.
e7b0: 09 09 20 20 20 20 22 6f 6e 6c 79 20 61 20 63 6c .. "only a cl
e7c0: 61 73 73 20 63 61 6e 20 62 65 20 61 20 73 75 70 ass can be a sup
e7d0: 65 72 63 6c 61 73 73 22 29 3b 0a 09 20 20 20 20 erclass");..
e7e0: 69 66 20 28 73 75 70 65 72 63 6c 61 73 73 65 73 if (superclasses
e7f0: 5b 69 5d 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 [i] == NULL) {..
e800: 09 67 6f 74 6f 20 66 61 69 6c 65 64 41 66 74 65 .goto failedAfte
e810: 72 41 6c 6c 6f 63 3b 0a 09 20 20 20 20 7d 0a 09 rAlloc;.. }..
e820: 20 20 20 20 66 6f 72 20 28 6a 3d 30 20 3b 20 6a for (j=0 ; j
e830: 3c 69 20 3b 20 6a 2b 2b 29 20 7b 0a 09 09 69 66 <i ; j++) {...if
e840: 20 28 73 75 70 65 72 63 6c 61 73 73 65 73 5b 6a (superclasses[j
e850: 5d 20 3d 3d 20 73 75 70 65 72 63 6c 61 73 73 65 ] == superclasse
e860: 73 5b 69 5d 29 20 7b 0a 09 09 20 20 20 20 54 63 s[i]) {... Tc
e870: 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 l_SetObjResult(i
e880: 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 53 74 nterp, Tcl_NewSt
e890: 72 69 6e 67 4f 62 6a 28 0a 09 09 09 20 20 20 20 ringObj(....
e8a0: 22 63 6c 61 73 73 20 73 68 6f 75 6c 64 20 6f 6e "class should on
e8b0: 6c 79 20 62 65 20 61 20 64 69 72 65 63 74 20 73 ly be a direct s
e8c0: 75 70 65 72 63 6c 61 73 73 20 6f 6e 63 65 22 2c uperclass once",
e8d0: 0a 09 09 09 20 20 20 20 2d 31 29 29 3b 0a 09 09 .... -1));...
e8e0: 20 20 20 20 54 63 6c 5f 53 65 74 45 72 72 6f 72 Tcl_SetError
e8f0: 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54 43 Code(interp, "TC
e900: 4c 22 2c 20 22 4f 4f 22 2c 20 22 52 45 50 45 54 L", "OO", "REPET
e910: 49 54 49 4f 55 53 22 2c 4e 55 4c 4c 29 3b 0a 09 ITIOUS",NULL);..
e920: 09 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 . goto failed
e930: 41 66 74 65 72 41 6c 6c 6f 63 3b 0a 09 09 7d 0a AfterAlloc;...}.
e940: 09 20 20 20 20 7d 0a 09 20 20 20 20 69 66 20 28 . }.. if (
e950: 54 63 6c 4f 4f 49 73 52 65 61 63 68 61 62 6c 65 TclOOIsReachable
e960: 28 6f 50 74 72 2d 3e 63 6c 61 73 73 50 74 72 2c (oPtr->classPtr,
e970: 20 73 75 70 65 72 63 6c 61 73 73 65 73 5b 69 5d superclasses[i]
e980: 29 29 20 7b 0a 09 09 54 63 6c 5f 53 65 74 4f 62 )) {...Tcl_SetOb
e990: 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 jResult(interp,
e9a0: 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 6a Tcl_NewStringObj
e9b0: 28 0a 09 09 09 22 61 74 74 65 6d 70 74 20 74 6f (...."attempt to
e9c0: 20 66 6f 72 6d 20 63 69 72 63 75 6c 61 72 20 64 form circular d
e9d0: 65 70 65 6e 64 65 6e 63 79 20 67 72 61 70 68 22 ependency graph"
e9e0: 2c 20 2d 31 29 29 3b 0a 09 09 54 63 6c 5f 53 65 , -1));...Tcl_Se
e9f0: 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 tErrorCode(inter
ea00: 70 2c 20 22 54 43 4c 22 2c 20 22 4f 4f 22 2c 20 p, "TCL", "OO",
ea10: 22 43 49 52 43 55 4c 41 52 49 54 59 22 2c 20 4e "CIRCULARITY", N
ea20: 55 4c 4c 29 3b 0a 09 20 20 20 20 66 61 69 6c 65 ULL);.. faile
ea30: 64 41 66 74 65 72 41 6c 6c 6f 63 3a 0a 09 09 63 dAfterAlloc:...c
ea40: 6b 66 72 65 65 28 28 63 68 61 72 20 2a 29 20 73 kfree((char *) s
ea50: 75 70 65 72 63 6c 61 73 73 65 73 29 3b 0a 09 09 uperclasses);...
ea60: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
ea70: 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a 20 20 20 20 ;.. }..}.
ea80: 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 20 2a }.. /*. *
ea90: 20 49 6e 73 74 61 6c 6c 20 74 68 65 20 6c 69 73 Install the lis
eaa0: 74 20 6f 66 20 73 75 70 65 72 63 6c 61 73 73 65 t of superclasse
eab0: 73 20 69 6e 74 6f 20 74 68 65 20 63 6c 61 73 73 s into the class
eac0: 2e 20 4e 6f 74 65 20 74 68 61 74 20 74 68 69 73 . Note that this
ead0: 20 61 6c 73 6f 0a 20 20 20 20 20 2a 20 69 6e 76 also. * inv
eae0: 6f 6c 76 65 73 20 73 70 6c 69 63 69 6e 67 20 74 olves splicing t
eaf0: 68 65 20 63 6c 61 73 73 20 6f 75 74 20 6f 66 20 he class out of
eb00: 74 68 65 20 73 75 70 65 72 63 6c 61 73 73 65 73 the superclasses
eb10: 27 20 73 75 62 63 6c 61 73 73 20 6c 69 73 74 20 ' subclass list
eb20: 74 68 61 74 0a 20 20 20 20 20 2a 20 69 74 20 75 that. * it u
eb30: 73 65 64 20 74 6f 20 62 65 20 61 20 6d 65 6d 62 sed to be a memb
eb40: 65 72 20 6f 66 20 61 6e 64 20 73 70 6c 69 63 69 er of and splici
eb50: 6e 67 20 69 74 20 69 6e 74 6f 20 74 68 65 20 6e ng it into the n
eb60: 65 77 20 73 75 70 65 72 63 6c 61 73 73 65 73 27 ew superclasses'
eb70: 0a 20 20 20 20 20 2a 20 73 75 62 63 6c 61 73 73 . * subclass
eb80: 20 6c 69 73 74 2e 0a 20 20 20 20 20 2a 2f 0a 0a list.. */..
eb90: 20 20 20 20 69 66 20 28 6f 50 74 72 2d 3e 63 6c if (oPtr->cl
eba0: 61 73 73 50 74 72 2d 3e 73 75 70 65 72 63 6c 61 assPtr->supercla
ebb0: 73 73 65 73 2e 6e 75 6d 20 21 3d 20 30 29 20 7b sses.num != 0) {
ebc0: 0a 09 46 4f 52 45 41 43 48 28 73 75 70 65 72 50 ..FOREACH(superP
ebd0: 74 72 2c 20 6f 50 74 72 2d 3e 63 6c 61 73 73 50 tr, oPtr->classP
ebe0: 74 72 2d 3e 73 75 70 65 72 63 6c 61 73 73 65 73 tr->superclasses
ebf0: 29 20 7b 0a 09 20 20 20 20 54 63 6c 4f 4f 52 65 ) {.. TclOORe
ec00: 6d 6f 76 65 46 72 6f 6d 53 75 62 63 6c 61 73 73 moveFromSubclass
ec10: 65 73 28 6f 50 74 72 2d 3e 63 6c 61 73 73 50 74 es(oPtr->classPt
ec20: 72 2c 20 73 75 70 65 72 50 74 72 29 3b 0a 09 7d r, superPtr);..}
ec30: 0a 09 63 6b 66 72 65 65 28 28 63 68 61 72 20 2a ..ckfree((char *
ec40: 29 20 6f 50 74 72 2d 3e 63 6c 61 73 73 50 74 72 ) oPtr->classPtr
ec50: 2d 3e 73 75 70 65 72 63 6c 61 73 73 65 73 2e 6c ->superclasses.l
ec60: 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 ist);. }.
ec70: 6f 50 74 72 2d 3e 63 6c 61 73 73 50 74 72 2d 3e oPtr->classPtr->
ec80: 73 75 70 65 72 63 6c 61 73 73 65 73 2e 6c 69 73 superclasses.lis
ec90: 74 20 3d 20 73 75 70 65 72 63 6c 61 73 73 65 73 t = superclasses
eca0: 3b 0a 20 20 20 20 6f 50 74 72 2d 3e 63 6c 61 73 ;. oPtr->clas
ecb0: 73 50 74 72 2d 3e 73 75 70 65 72 63 6c 61 73 73 sPtr->superclass
ecc0: 65 73 2e 6e 75 6d 20 3d 20 73 75 70 65 72 63 3b es.num = superc;
ecd0: 0a 20 20 20 20 46 4f 52 45 41 43 48 28 73 75 70 . FOREACH(sup
ece0: 65 72 50 74 72 2c 20 6f 50 74 72 2d 3e 63 6c 61 erPtr, oPtr->cla
ecf0: 73 73 50 74 72 2d 3e 73 75 70 65 72 63 6c 61 73 ssPtr->superclas
ed00: 73 65 73 29 20 7b 0a 09 54 63 6c 4f 4f 41 64 64 ses) {..TclOOAdd
ed10: 54 6f 53 75 62 63 6c 61 73 73 65 73 28 6f 50 74 ToSubclasses(oPt
ed20: 72 2d 3e 63 6c 61 73 73 50 74 72 2c 20 73 75 70 r->classPtr, sup
ed30: 65 72 50 74 72 29 3b 0a 20 20 20 20 7d 0a 20 20 erPtr);. }.
ed40: 20 20 42 75 6d 70 47 6c 6f 62 61 6c 45 70 6f 63 BumpGlobalEpoc
ed50: 68 28 69 6e 74 65 72 70 2c 20 6f 50 74 72 2d 3e h(interp, oPtr->
ed60: 63 6c 61 73 73 50 74 72 29 3b 0a 0a 20 20 20 20 classPtr);..
ed70: 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d return TCL_OK;.}
ed80: 0a 0c 0a 2f 2a 0a 20 2a 20 2d 2d 2d 2d 2d 2d 2d .../*. * -------
ed90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
eda0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
edb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
edc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
edd0: 20 2a 0a 20 2a 20 43 6c 61 73 73 56 61 72 73 47 *. * ClassVarsG
ede0: 65 74 2c 20 43 6c 61 73 73 56 61 72 73 53 65 74 et, ClassVarsSet
edf0: 20 2d 2d 0a 20 2a 09 49 6d 70 6c 65 6d 65 6e 74 --. *.Implement
ee00: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 22 76 61 ation of the "va
ee10: 72 69 61 62 6c 65 22 20 73 6c 6f 74 20 61 63 63 riable" slot acc
ee20: 65 73 73 6f 72 73 20 6f 66 20 74 68 65 20 22 6f essors of the "o
ee30: 6f 3a 3a 64 65 66 69 6e 65 22 0a 20 2a 09 63 6f o::define". *.co
ee40: 6d 6d 61 6e 64 2e 0a 20 2a 0a 20 2a 20 2d 2d 2d mmand.. *. * ---
ee50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
ee60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 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 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20 ---. */..static
eea0: 69 6e 74 0a 43 6c 61 73 73 56 61 72 73 47 65 74 int.ClassVarsGet
eeb0: 28 0a 20 20 20 20 43 6c 69 65 6e 74 44 61 74 61 (. ClientData
eec0: 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 20 clientData,.
eed0: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 Tcl_Interp *int
eee0: 65 72 70 2c 0a 20 20 20 20 54 63 6c 5f 4f 62 6a erp,. Tcl_Obj
eef0: 65 63 74 43 6f 6e 74 65 78 74 20 63 6f 6e 74 65 ectContext conte
ef00: 78 74 2c 0a 20 20 20 20 69 6e 74 20 6f 62 6a 63 xt,. int objc
ef10: 2c 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 ,. Tcl_Obj *c
ef20: 6f 6e 73 74 20 2a 6f 62 6a 76 29 0a 7b 0a 20 20 onst *objv).{.
ef30: 20 20 4f 62 6a 65 63 74 20 2a 6f 50 74 72 20 3d Object *oPtr =
ef40: 20 28 4f 62 6a 65 63 74 20 2a 29 20 54 63 6c 4f (Object *) TclO
ef50: 4f 47 65 74 44 65 66 69 6e 65 43 6d 64 43 6f 6e OGetDefineCmdCon
ef60: 74 65 78 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 text(interp);.
ef70: 20 20 54 63 6c 5f 4f 62 6a 20 2a 72 65 73 75 6c Tcl_Obj *resul
ef80: 74 4f 62 6a 2c 20 2a 76 61 72 69 61 62 6c 65 4f tObj, *variableO
ef90: 62 6a 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 0a bj;. int i;..
efa0: 20 20 20 20 69 66 20 28 54 63 6c 5f 4f 62 6a 65 if (Tcl_Obje
efb0: 63 74 43 6f 6e 74 65 78 74 53 6b 69 70 70 65 64 ctContextSkipped
efc0: 41 72 67 73 28 63 6f 6e 74 65 78 74 29 20 21 3d Args(context) !=
efd0: 20 6f 62 6a 63 29 20 7b 0a 09 54 63 6c 5f 57 72 objc) {..Tcl_Wr
efe0: 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 ongNumArgs(inter
eff0: 70 2c 20 54 63 6c 5f 4f 62 6a 65 63 74 43 6f 6e p, Tcl_ObjectCon
f000: 74 65 78 74 53 6b 69 70 70 65 64 41 72 67 73 28 textSkippedArgs(
f010: 63 6f 6e 74 65 78 74 29 2c 20 6f 62 6a 76 2c 0a context), objv,.
f020: 09 09 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 72 6e ..NULL);..return
f030: 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 TCL_ERROR;.
f040: 7d 0a 20 20 20 20 69 66 20 28 6f 50 74 72 20 3d }. if (oPtr =
f050: 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 74 75 72 = NULL) {..retur
f060: 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 n TCL_ERROR;.
f070: 20 7d 20 65 6c 73 65 20 69 66 20 28 21 6f 50 74 } else if (!oPt
f080: 72 2d 3e 63 6c 61 73 73 50 74 72 29 20 7b 0a 09 r->classPtr) {..
f090: 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 Tcl_SetObjResult
f0a0: 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4e 65 77 (interp, Tcl_New
f0b0: 53 74 72 69 6e 67 4f 62 6a 28 0a 09 09 22 61 74 StringObj(..."at
f0c0: 74 65 6d 70 74 20 74 6f 20 6d 69 73 75 73 65 20 tempt to misuse
f0d0: 41 50 49 22 2c 20 2d 31 29 29 3b 0a 09 54 63 6c API", -1));..Tcl
f0e0: 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e _SetErrorCode(in
f0f0: 74 65 72 70 2c 20 22 54 43 4c 22 2c 20 22 4f 4f terp, "TCL", "OO
f100: 22 2c 20 22 4d 4f 4e 4b 45 59 5f 42 55 53 49 4e ", "MONKEY_BUSIN
f110: 45 53 53 22 2c 20 4e 55 4c 4c 29 3b 0a 09 72 65 ESS", NULL);..re
f120: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
f130: 20 20 20 20 7d 0a 0a 20 20 20 20 72 65 73 75 6c }.. resul
f140: 74 4f 62 6a 20 3d 20 54 63 6c 5f 4e 65 77 4f 62 tObj = Tcl_NewOb
f150: 6a 28 29 3b 0a 20 20 20 20 46 4f 52 45 41 43 48 j();. FOREACH
f160: 28 76 61 72 69 61 62 6c 65 4f 62 6a 2c 20 6f 50 (variableObj, oP
f170: 74 72 2d 3e 63 6c 61 73 73 50 74 72 2d 3e 76 61 tr->classPtr->va
f180: 72 69 61 62 6c 65 73 29 20 7b 0a 09 54 63 6c 5f riables) {..Tcl_
f190: 4c 69 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 ListObjAppendEle
f1a0: 6d 65 6e 74 28 4e 55 4c 4c 2c 20 72 65 73 75 6c ment(NULL, resul
f1b0: 74 4f 62 6a 2c 20 76 61 72 69 61 62 6c 65 4f 62 tObj, variableOb
f1c0: 6a 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 j);. }. Tc
f1d0: 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 l_SetObjResult(i
f1e0: 6e 74 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a nterp, resultObj
f1f0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 );. return TC
f200: 4c 5f 4f 4b 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 L_OK;.}..static
f210: 69 6e 74 0a 43 6c 61 73 73 56 61 72 73 53 65 74 int.ClassVarsSet
f220: 28 0a 20 20 20 20 43 6c 69 65 6e 74 44 61 74 61 (. ClientData
f230: 20 63 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20 20 clientData,.
f240: 20 54 63 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 Tcl_Interp *int
f250: 65 72 70 2c 0a 20 20 20 20 54 63 6c 5f 4f 62 6a erp,. Tcl_Obj
f260: 65 63 74 43 6f 6e 74 65 78 74 20 63 6f 6e 74 65 ectContext conte
f270: 78 74 2c 0a 20 20 20 20 69 6e 74 20 6f 62 6a 63 xt,. int objc
f280: 2c 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 ,. Tcl_Obj *c
f290: 6f 6e 73 74 20 2a 6f 62 6a 76 29 0a 7b 0a 20 20 onst *objv).{.
f2a0: 20 20 4f 62 6a 65 63 74 20 2a 6f 50 74 72 20 3d Object *oPtr =
f2b0: 20 28 4f 62 6a 65 63 74 20 2a 29 20 54 63 6c 4f (Object *) TclO
f2c0: 4f 47 65 74 44 65 66 69 6e 65 43 6d 64 43 6f 6e OGetDefineCmdCon
f2d0: 74 65 78 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 text(interp);.
f2e0: 20 20 69 6e 74 20 76 61 72 63 3b 0a 20 20 20 20 int varc;.
f2f0: 54 63 6c 5f 4f 62 6a 20 2a 2a 76 61 72 76 2c 20 Tcl_Obj **varv,
f300: 2a 76 61 72 69 61 62 6c 65 4f 62 6a 3b 0a 20 20 *variableObj;.
f310: 20 20 69 6e 74 20 69 3b 0a 0a 20 20 20 20 69 66 int i;.. if
f320: 20 28 54 63 6c 5f 4f 62 6a 65 63 74 43 6f 6e 74 (Tcl_ObjectCont
f330: 65 78 74 53 6b 69 70 70 65 64 41 72 67 73 28 63 extSkippedArgs(c
f340: 6f 6e 74 65 78 74 29 2b 31 20 21 3d 20 6f 62 6a ontext)+1 != obj
f350: 63 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e c) {..Tcl_WrongN
f360: 75 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 54 umArgs(interp, T
f370: 63 6c 5f 4f 62 6a 65 63 74 43 6f 6e 74 65 78 74 cl_ObjectContext
f380: 53 6b 69 70 70 65 64 41 72 67 73 28 63 6f 6e 74 SkippedArgs(cont
f390: 65 78 74 29 2c 20 6f 62 6a 76 2c 0a 09 09 22 66 ext), objv,..."f
f3a0: 69 6c 74 65 72 4c 69 73 74 22 29 3b 0a 09 72 65 ilterList");..re
f3b0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
f3c0: 20 20 20 20 7d 0a 20 20 20 20 6f 62 6a 76 20 2b }. objv +
f3d0: 3d 20 54 63 6c 5f 4f 62 6a 65 63 74 43 6f 6e 74 = Tcl_ObjectCont
f3e0: 65 78 74 53 6b 69 70 70 65 64 41 72 67 73 28 63 extSkippedArgs(c
f3f0: 6f 6e 74 65 78 74 29 3b 0a 0a 20 20 20 20 69 66 ontext);.. if
f400: 20 28 6f 50 74 72 20 3d 3d 20 4e 55 4c 4c 29 20 (oPtr == NULL)
f410: 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 {..return TCL_ER
f420: 52 4f 52 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 ROR;. } else
f430: 69 66 20 28 21 6f 50 74 72 2d 3e 63 6c 61 73 73 if (!oPtr->class
f440: 50 74 72 29 20 7b 0a 09 54 63 6c 5f 53 65 74 4f Ptr) {..Tcl_SetO
f450: 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c bjResult(interp,
f460: 20 54 63 6c 5f 4e 65 77 53 74 72 69 6e 67 4f 62 Tcl_NewStringOb
f470: 6a 28 0a 09 09 22 61 74 74 65 6d 70 74 20 74 6f j(..."attempt to
f480: 20 6d 69 73 75 73 65 20 41 50 49 22 2c 20 2d 31 misuse API", -1
f490: 29 29 3b 0a 09 54 63 6c 5f 53 65 74 45 72 72 6f ));..Tcl_SetErro
f4a0: 72 43 6f 64 65 28 69 6e 74 65 72 70 2c 20 22 54 rCode(interp, "T
f4b0: 43 4c 22 2c 20 22 4f 4f 22 2c 20 22 4d 4f 4e 4b CL", "OO", "MONK
f4c0: 45 59 5f 42 55 53 49 4e 45 53 53 22 2c 20 4e 55 EY_BUSINESS", NU
f4d0: 4c 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c LL);..return TCL
f4e0: 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 20 65 6c _ERROR;. } el
f4f0: 73 65 20 69 66 20 28 54 63 6c 5f 4c 69 73 74 4f se if (Tcl_ListO
f500: 62 6a 47 65 74 45 6c 65 6d 65 6e 74 73 28 69 6e bjGetElements(in
f510: 74 65 72 70 2c 20 6f 62 6a 76 5b 30 5d 2c 20 26 terp, objv[0], &
f520: 76 61 72 63 2c 0a 09 20 20 20 20 26 76 61 72 76 varc,.. &varv
f530: 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b 0a 09 ) != TCL_OK) {..
f540: 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
f550: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f 72 ;. }.. for
f560: 20 28 69 3d 30 20 3b 20 69 3c 76 61 72 63 20 3b (i=0 ; i<varc ;
f570: 20 69 2b 2b 29 20 7b 0a 09 63 6f 6e 73 74 20 63 i++) {..const c
f580: 68 61 72 20 2a 76 61 72 4e 61 6d 65 20 3d 20 54 har *varName = T
f590: 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 76 61 72 cl_GetString(var
f5a0: 76 5b 69 5d 29 3b 0a 0a 09 69 66 20 28 73 74 72 v[i]);...if (str
f5b0: 73 74 72 28 76 61 72 4e 61 6d 65 2c 20 22 3a 3a str(varName, "::
f5c0: 22 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 ") != NULL) {..
f5d0: 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 Tcl_SetObjRes
f5e0: 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f ult(interp, Tcl_
f5f0: 4f 62 6a 50 72 69 6e 74 66 28 0a 09 09 20 20 20 ObjPrintf(...
f600: 20 22 69 6e 76 61 6c 69 64 20 64 65 63 6c 61 72 "invalid declar
f610: 65 64 20 76 61 72 69 61 62 6c 65 20 6e 61 6d 65 ed variable name
f620: 20 5c 22 25 73 5c 22 3a 20 6d 75 73 74 20 6e 6f \"%s\": must no
f630: 74 20 25 73 22 2c 0a 09 09 20 20 20 20 76 61 72 t %s",... var
f640: 4e 61 6d 65 2c 20 22 63 6f 6e 74 61 69 6e 20 6e Name, "contain n
f650: 61 6d 65 73 70 61 63 65 20 73 65 70 61 72 61 74 amespace separat
f660: 6f 72 73 22 29 29 3b 0a 09 20 20 20 20 54 63 6c ors"));.. Tcl
f670: 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 69 6e _SetErrorCode(in
f680: 74 65 72 70 2c 20 22 54 43 4c 22 2c 20 22 4f 4f terp, "TCL", "OO
f690: 22 2c 20 22 42 41 44 5f 44 45 43 4c 56 41 52 22 ", "BAD_DECLVAR"
f6a0: 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 72 65 , NULL);.. re
f6b0: 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
f6c0: 09 7d 0a 09 69 66 20 28 54 63 6c 5f 53 74 72 69 .}..if (Tcl_Stri
f6d0: 6e 67 4d 61 74 63 68 28 76 61 72 4e 61 6d 65 2c ngMatch(varName,
f6e0: 20 22 2a 28 2a 29 22 29 29 20 7b 0a 09 20 20 20 "*(*)")) {..
f6f0: 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 75 6c Tcl_SetObjResul
f700: 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f 4f 62 t(interp, Tcl_Ob
f710: 6a 50 72 69 6e 74 66 28 0a 09 09 20 20 20 20 22 jPrintf(... "
f720: 69 6e 76 61 6c 69 64 20 64 65 63 6c 61 72 65 64 invalid declared
f730: 20 76 61 72 69 61 62 6c 65 20 6e 61 6d 65 20 5c variable name \
f740: 22 25 73 5c 22 3a 20 6d 75 73 74 20 6e 6f 74 20 "%s\": must not
f750: 25 73 22 2c 0a 09 09 20 20 20 20 76 61 72 4e 61 %s",... varNa
f760: 6d 65 2c 20 22 72 65 66 65 72 20 74 6f 20 61 6e me, "refer to an
f770: 20 61 72 72 61 79 20 65 6c 65 6d 65 6e 74 22 29 array element")
f780: 29 3b 0a 09 20 20 20 20 54 63 6c 5f 53 65 74 45 );.. Tcl_SetE
f790: 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 70 2c rrorCode(interp,
f7a0: 20 22 54 43 4c 22 2c 20 22 4f 4f 22 2c 20 22 42 "TCL", "OO", "B
f7b0: 41 44 5f 44 45 43 4c 56 41 52 22 2c 20 4e 55 4c AD_DECLVAR", NUL
f7c0: 4c 29 3b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 L);.. return
f7d0: 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a 20 20 TCL_ERROR;..}.
f7e0: 20 20 7d 0a 0a 20 20 20 20 66 6f 72 20 28 69 3d }.. for (i=
f7f0: 30 20 3b 20 69 3c 76 61 72 63 20 3b 20 69 2b 2b 0 ; i<varc ; i++
f800: 29 20 7b 0a 09 54 63 6c 5f 49 6e 63 72 52 65 66 ) {..Tcl_IncrRef
f810: 43 6f 75 6e 74 28 76 61 72 76 5b 69 5d 29 3b 0a Count(varv[i]);.
f820: 20 20 20 20 7d 0a 20 20 20 20 46 4f 52 45 41 43 }. FOREAC
f830: 48 28 76 61 72 69 61 62 6c 65 4f 62 6a 2c 20 6f H(variableObj, o
f840: 50 74 72 2d 3e 63 6c 61 73 73 50 74 72 2d 3e 76 Ptr->classPtr->v
f850: 61 72 69 61 62 6c 65 73 29 20 7b 0a 09 54 63 6c ariables) {..Tcl
f860: 5f 44 65 63 72 52 65 66 43 6f 75 6e 74 28 76 61 _DecrRefCount(va
f870: 72 69 61 62 6c 65 4f 62 6a 29 3b 0a 20 20 20 20 riableObj);.
f880: 7d 0a 20 20 20 20 69 66 20 28 69 20 21 3d 20 76 }. if (i != v
f890: 61 72 63 29 20 7b 0a 09 69 66 20 28 76 61 72 63 arc) {..if (varc
f8a0: 20 3d 3d 20 30 29 20 7b 0a 09 20 20 20 20 63 6b == 0) {.. ck
f8b0: 66 72 65 65 28 28 63 68 61 72 20 2a 29 20 6f 50 free((char *) oP
f8c0: 74 72 2d 3e 63 6c 61 73 73 50 74 72 2d 3e 76 61 tr->classPtr->va
f8d0: 72 69 61 62 6c 65 73 2e 6c 69 73 74 29 3b 0a 09 riables.list);..
f8e0: 7d 20 65 6c 73 65 20 69 66 20 28 69 29 20 7b 0a } else if (i) {.
f8f0: 09 20 20 20 20 6f 50 74 72 2d 3e 63 6c 61 73 73 . oPtr->class
f900: 50 74 72 2d 3e 76 61 72 69 61 62 6c 65 73 2e 6c Ptr->variables.l
f910: 69 73 74 20 3d 20 28 54 63 6c 5f 4f 62 6a 20 2a ist = (Tcl_Obj *
f920: 2a 29 0a 09 09 20 20 20 20 63 6b 72 65 61 6c 6c *)... ckreall
f930: 6f 63 28 28 63 68 61 72 20 2a 29 20 6f 50 74 72 oc((char *) oPtr
f940: 2d 3e 63 6c 61 73 73 50 74 72 2d 3e 76 61 72 69 ->classPtr->vari
f950: 61 62 6c 65 73 2e 6c 69 73 74 2c 0a 09 09 20 20 ables.list,...
f960: 20 20 73 69 7a 65 6f 66 28 54 63 6c 5f 4f 62 6a sizeof(Tcl_Obj
f970: 20 2a 29 20 2a 20 76 61 72 63 29 3b 0a 09 7d 20 *) * varc);..}
f980: 65 6c 73 65 20 7b 0a 09 20 20 20 20 6f 50 74 72 else {.. oPtr
f990: 2d 3e 63 6c 61 73 73 50 74 72 2d 3e 76 61 72 69 ->classPtr->vari
f9a0: 61 62 6c 65 73 2e 6c 69 73 74 20 3d 20 28 54 63 ables.list = (Tc
f9b0: 6c 5f 4f 62 6a 20 2a 2a 29 0a 09 09 20 20 20 20 l_Obj **)...
f9c0: 63 6b 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 54 ckalloc(sizeof(T
f9d0: 63 6c 5f 4f 62 6a 20 2a 29 20 2a 20 76 61 72 63 cl_Obj *) * varc
f9e0: 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 );..}. }..
f9f0: 20 6f 50 74 72 2d 3e 63 6c 61 73 73 50 74 72 2d oPtr->classPtr-
fa00: 3e 76 61 72 69 61 62 6c 65 73 2e 6e 75 6d 20 3d >variables.num =
fa10: 20 30 3b 0a 20 20 20 20 69 66 20 28 76 61 72 63 0;. if (varc
fa20: 20 3e 20 30 29 20 7b 0a 09 69 6e 74 20 63 72 65 > 0) {..int cre
fa30: 61 74 65 64 2c 20 6e 3b 0a 09 54 63 6c 5f 48 61 ated, n;..Tcl_Ha
fa40: 73 68 54 61 62 6c 65 20 75 6e 69 71 75 65 54 61 shTable uniqueTa
fa50: 62 6c 65 3b 0a 0a 09 54 63 6c 5f 49 6e 69 74 4f ble;...Tcl_InitO
fa60: 62 6a 48 61 73 68 54 61 62 6c 65 28 26 75 6e 69 bjHashTable(&uni
fa70: 71 75 65 54 61 62 6c 65 29 3b 0a 09 66 6f 72 20 queTable);..for
fa80: 28 69 3d 6e 3d 30 20 3b 20 69 3c 76 61 72 63 20 (i=n=0 ; i<varc
fa90: 3b 20 69 2b 2b 29 20 7b 0a 09 20 20 20 20 54 63 ; i++) {.. Tc
faa0: 6c 5f 43 72 65 61 74 65 48 61 73 68 45 6e 74 72 l_CreateHashEntr
fab0: 79 28 26 75 6e 69 71 75 65 54 61 62 6c 65 2c 20 y(&uniqueTable,
fac0: 76 61 72 76 5b 69 5d 2c 20 26 63 72 65 61 74 65 varv[i], &create
fad0: 64 29 3b 0a 09 20 20 20 20 69 66 20 28 63 72 65 d);.. if (cre
fae0: 61 74 65 64 29 20 7b 0a 09 09 6f 50 74 72 2d 3e ated) {...oPtr->
faf0: 63 6c 61 73 73 50 74 72 2d 3e 76 61 72 69 61 62 classPtr->variab
fb00: 6c 65 73 2e 6c 69 73 74 5b 6e 2b 2b 5d 20 3d 20 les.list[n++] =
fb10: 76 61 72 76 5b 69 5d 3b 0a 09 20 20 20 20 7d 20 varv[i];.. }
fb20: 65 6c 73 65 20 7b 0a 09 09 54 63 6c 5f 44 65 63 else {...Tcl_Dec
fb30: 72 52 65 66 43 6f 75 6e 74 28 76 61 72 76 5b 69 rRefCount(varv[i
fb40: 5d 29 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 6f ]);.. }..}..o
fb50: 50 74 72 2d 3e 63 6c 61 73 73 50 74 72 2d 3e 76 Ptr->classPtr->v
fb60: 61 72 69 61 62 6c 65 73 2e 6e 75 6d 20 3d 20 6e ariables.num = n
fb70: 3b 0a 0a 09 2f 2a 0a 09 20 2a 20 53 68 6f 75 6c ;.../*.. * Shoul
fb80: 64 6e 27 74 20 62 65 20 6e 65 63 65 73 73 61 72 dn't be necessar
fb90: 79 2c 20 62 75 74 20 6d 61 69 6e 74 61 69 6e 20 y, but maintain
fba0: 6e 75 6d 2f 6c 69 73 74 20 69 6e 76 61 72 69 61 num/list invaria
fbb0: 6e 74 2e 0a 09 20 2a 2f 0a 0a 09 6f 50 74 72 2d nt... */...oPtr-
fbc0: 3e 63 6c 61 73 73 50 74 72 2d 3e 76 61 72 69 61 >classPtr->varia
fbd0: 62 6c 65 73 2e 6c 69 73 74 20 3d 20 28 54 63 6c bles.list = (Tcl
fbe0: 5f 4f 62 6a 20 2a 2a 29 0a 09 09 63 6b 72 65 61 _Obj **)...ckrea
fbf0: 6c 6c 6f 63 28 28 63 68 61 72 20 2a 29 20 6f 50 lloc((char *) oP
fc00: 74 72 2d 3e 63 6c 61 73 73 50 74 72 2d 3e 76 61 tr->classPtr->va
fc10: 72 69 61 62 6c 65 73 2e 6c 69 73 74 2c 0a 09 09 riables.list,...
fc20: 73 69 7a 65 6f 66 28 54 63 6c 5f 4f 62 6a 20 2a sizeof(Tcl_Obj *
fc30: 29 20 2a 20 6e 29 3b 0a 09 54 63 6c 5f 44 65 6c ) * n);..Tcl_Del
fc40: 65 74 65 48 61 73 68 54 61 62 6c 65 28 26 75 6e eteHashTable(&un
fc50: 69 71 75 65 54 61 62 6c 65 29 3b 0a 20 20 20 20 iqueTable);.
fc60: 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c }. return TCL
fc70: 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 20 2d _OK;.}.../*. * -
fc80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
fc90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
fca0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
fcb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
fcc0: 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 4f 62 6a 65 -----. *. * Obje
fcd0: 63 74 46 69 6c 74 65 72 47 65 74 2c 20 4f 62 6a ctFilterGet, Obj
fce0: 65 63 74 46 69 6c 74 65 72 53 65 74 20 2d 2d 0a ectFilterSet --.
fcf0: 20 2a 09 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f *.Implementatio
fd00: 6e 20 6f 66 20 74 68 65 20 22 66 69 6c 74 65 72 n of the "filter
fd10: 22 20 73 6c 6f 74 20 61 63 63 65 73 73 6f 72 73 " slot accessors
fd20: 20 6f 66 20 74 68 65 20 22 6f 6f 3a 3a 6f 62 6a of the "oo::obj
fd30: 64 65 66 69 6e 65 22 0a 20 2a 09 63 6f 6d 6d 61 define". *.comma
fd40: 6e 64 2e 0a 20 2a 0a 20 2a 20 2d 2d 2d 2d 2d 2d nd.. *. * ------
fd50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
fd60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
fd70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
fd80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
fd90: 0a 20 2a 2f 0a 0a 73 74 61 74 69 63 20 69 6e 74 . */..static int
fda0: 0a 4f 62 6a 46 69 6c 74 65 72 47 65 74 28 0a 20 .ObjFilterGet(.
fdb0: 20 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c ClientData cl
fdc0: 69 65 6e 74 44 61 74 61 2c 0a 20 20 20 20 54 63 ientData,. Tc
fdd0: 6c 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 l_Interp *interp
fde0: 2c 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 65 63 74 ,. Tcl_Object
fdf0: 43 6f 6e 74 65 78 74 20 63 6f 6e 74 65 78 74 2c Context context,
fe00: 0a 20 20 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 . int objc,.
fe10: 20 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 Tcl_Obj *cons
fe20: 74 20 2a 6f 62 6a 76 29 0a 7b 0a 20 20 20 20 4f t *objv).{. O
fe30: 62 6a 65 63 74 20 2a 6f 50 74 72 20 3d 20 28 4f bject *oPtr = (O
fe40: 62 6a 65 63 74 20 2a 29 20 54 63 6c 4f 4f 47 65 bject *) TclOOGe
fe50: 74 44 65 66 69 6e 65 43 6d 64 43 6f 6e 74 65 78 tDefineCmdContex
fe60: 74 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 54 t(interp);. T
fe70: 63 6c 5f 4f 62 6a 20 2a 72 65 73 75 6c 74 4f 62 cl_Obj *resultOb
fe80: 6a 2c 20 2a 66 69 6c 74 65 72 4f 62 6a 3b 0a 20 j, *filterObj;.
fe90: 20 20 20 69 6e 74 20 69 3b 0a 0a 20 20 20 20 69 int i;.. i
fea0: 66 20 28 54 63 6c 5f 4f 62 6a 65 63 74 43 6f 6e f (Tcl_ObjectCon
feb0: 74 65 78 74 53 6b 69 70 70 65 64 41 72 67 73 28 textSkippedArgs(
fec0: 63 6f 6e 74 65 78 74 29 20 21 3d 20 6f 62 6a 63 context) != objc
fed0: 29 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 ) {..Tcl_WrongNu
fee0: 6d 41 72 67 73 28 69 6e 74 65 72 70 2c 20 54 63 mArgs(interp, Tc
fef0: 6c 5f 4f 62 6a 65 63 74 43 6f 6e 74 65 78 74 53 l_ObjectContextS
ff00: 6b 69 70 70 65 64 41 72 67 73 28 63 6f 6e 74 65 kippedArgs(conte
ff10: 78 74 29 2c 20 6f 62 6a 76 2c 0a 09 09 4e 55 4c xt), objv,...NUL
ff20: 4c 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f L);..return TCL_
ff30: 45 52 52 4f 52 3b 0a 20 20 20 20 7d 20 65 6c 73 ERROR;. } els
ff40: 65 20 69 66 20 28 6f 50 74 72 20 3d 3d 20 4e 55 e if (oPtr == NU
ff50: 4c 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 LL) {..return TC
ff60: 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a L_ERROR;. }..
ff70: 20 20 20 20 72 65 73 75 6c 74 4f 62 6a 20 3d 20 resultObj =
ff80: 54 63 6c 5f 4e 65 77 4f 62 6a 28 29 3b 0a 20 20 Tcl_NewObj();.
ff90: 20 20 46 4f 52 45 41 43 48 28 66 69 6c 74 65 72 FOREACH(filter
ffa0: 4f 62 6a 2c 20 6f 50 74 72 2d 3e 66 69 6c 74 65 Obj, oPtr->filte
ffb0: 72 73 29 20 7b 0a 09 54 63 6c 5f 4c 69 73 74 4f rs) {..Tcl_ListO
ffc0: 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 6e 74 28 bjAppendElement(
ffd0: 4e 55 4c 4c 2c 20 72 65 73 75 6c 74 4f 62 6a 2c NULL, resultObj,
ffe0: 20 66 69 6c 74 65 72 4f 62 6a 29 3b 0a 20 20 20 filterObj);.
fff0: 20 7d 0a 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 }. Tcl_SetOb
10000 6a 52 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 jResult(interp,
10010 72 65 73 75 6c 74 4f 62 6a 29 3b 0a 20 20 20 20 resultObj);.
10020 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b 3b 0a 7d return TCL_OK;.}
10030 0a 0a 73 74 61 74 69 63 20 69 6e 74 0a 4f 62 6a ..static int.Obj
10040 46 69 6c 74 65 72 53 65 74 28 0a 20 20 20 20 43 FilterSet(. C
10050 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e 74 lientData client
10060 44 61 74 61 2c 0a 20 20 20 20 54 63 6c 5f 49 6e Data,. Tcl_In
10070 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 20 terp *interp,.
10080 20 20 54 63 6c 5f 4f 62 6a 65 63 74 43 6f 6e 74 Tcl_ObjectCont
10090 65 78 74 20 63 6f 6e 74 65 78 74 2c 0a 20 20 20 ext context,.
100a0 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 20 20 54 int objc,. T
100b0 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 2a 6f cl_Obj *const *o
100c0 62 6a 76 29 0a 7b 0a 20 20 20 20 4f 62 6a 65 63 bjv).{. Objec
100d0 74 20 2a 6f 50 74 72 20 3d 20 28 4f 62 6a 65 63 t *oPtr = (Objec
100e0 74 20 2a 29 20 54 63 6c 4f 4f 47 65 74 44 65 66 t *) TclOOGetDef
100f0 69 6e 65 43 6d 64 43 6f 6e 74 65 78 74 28 69 6e ineCmdContext(in
10100 74 65 72 70 29 3b 0a 20 20 20 20 69 6e 74 20 66 terp);. int f
10110 69 6c 74 65 72 63 3b 0a 20 20 20 20 54 63 6c 5f ilterc;. Tcl_
10120 4f 62 6a 20 2a 2a 66 69 6c 74 65 72 76 3b 0a 0a Obj **filterv;..
10130 20 20 20 20 69 66 20 28 54 63 6c 5f 4f 62 6a 65 if (Tcl_Obje
10140 63 74 43 6f 6e 74 65 78 74 53 6b 69 70 70 65 64 ctContextSkipped
10150 41 72 67 73 28 63 6f 6e 74 65 78 74 29 2b 31 20 Args(context)+1
10160 21 3d 20 6f 62 6a 63 29 20 7b 0a 09 54 63 6c 5f != objc) {..Tcl_
10170 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 WrongNumArgs(int
10180 65 72 70 2c 20 54 63 6c 5f 4f 62 6a 65 63 74 43 erp, Tcl_ObjectC
10190 6f 6e 74 65 78 74 53 6b 69 70 70 65 64 41 72 67 ontextSkippedArg
101a0 73 28 63 6f 6e 74 65 78 74 29 2c 20 6f 62 6a 76 s(context), objv
101b0 2c 0a 09 09 22 66 69 6c 74 65 72 4c 69 73 74 22 ,..."filterList"
101c0 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 );..return TCL_E
101d0 52 52 4f 52 3b 0a 20 20 20 20 7d 20 65 6c 73 65 RROR;. } else
101e0 20 69 66 20 28 6f 50 74 72 20 3d 3d 20 4e 55 4c if (oPtr == NUL
101f0 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c L) {..return TCL
10200 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 _ERROR;. }.
10210 20 20 6f 62 6a 76 20 2b 3d 20 54 63 6c 5f 4f 62 objv += Tcl_Ob
10220 6a 65 63 74 43 6f 6e 74 65 78 74 53 6b 69 70 70 jectContextSkipp
10230 65 64 41 72 67 73 28 63 6f 6e 74 65 78 74 29 3b edArgs(context);
10240 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 4c 69 73 . if (Tcl_Lis
10250 74 4f 62 6a 47 65 74 45 6c 65 6d 65 6e 74 73 28 tObjGetElements(
10260 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 30 5d 2c interp, objv[0],
10270 20 26 66 69 6c 74 65 72 63 2c 0a 09 20 20 20 20 &filterc,..
10280 26 66 69 6c 74 65 72 76 29 20 21 3d 20 54 43 4c &filterv) != TCL
10290 5f 4f 4b 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 _OK) {..return T
102a0 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a CL_ERROR;. }.
102b0 0a 20 20 20 20 54 63 6c 4f 4f 4f 62 6a 65 63 74 . TclOOObject
102c0 53 65 74 46 69 6c 74 65 72 73 28 6f 50 74 72 2c SetFilters(oPtr,
102d0 20 66 69 6c 74 65 72 63 2c 20 66 69 6c 74 65 72 filterc, filter
102e0 76 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 v);. return T
102f0 43 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a CL_OK;.}.../*. *
10300 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ---------------
10310 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10320 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10330 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10340 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 4f 62 -------. *. * Ob
10350 6a 65 63 74 4d 69 78 69 6e 47 65 74 2c 20 4f 62 jectMixinGet, Ob
10360 6a 65 63 74 4d 69 78 69 6e 53 65 74 20 2d 2d 0a jectMixinSet --.
10370 20 2a 09 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f *.Implementatio
10380 6e 20 6f 66 20 74 68 65 20 22 6d 69 78 69 6e 22 n of the "mixin"
10390 20 73 6c 6f 74 20 61 63 63 65 73 73 6f 72 73 20 slot accessors
103a0 6f 66 20 74 68 65 20 22 6f 6f 3a 3a 6f 62 6a 64 of the "oo::objd
103b0 65 66 69 6e 65 22 0a 20 2a 09 63 6f 6d 6d 61 6e efine". *.comman
103c0 64 2e 0a 20 2a 0a 20 2a 20 2d 2d 2d 2d 2d 2d 2d d.. *. * -------
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 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10400 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
10410 20 2a 2f 0a 0a 73 74 61 74 69 63 20 69 6e 74 0a */..static int.
10420 4f 62 6a 4d 69 78 69 6e 47 65 74 28 0a 20 20 20 ObjMixinGet(.
10430 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 ClientData clie
10440 6e 74 44 61 74 61 2c 0a 20 20 20 20 54 63 6c 5f ntData,. Tcl_
10450 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a Interp *interp,.
10460 20 20 20 20 54 63 6c 5f 4f 62 6a 65 63 74 43 6f Tcl_ObjectCo
10470 6e 74 65 78 74 20 63 6f 6e 74 65 78 74 2c 0a 20 ntext context,.
10480 20 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 20 int objc,.
10490 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 Tcl_Obj *const
104a0 2a 6f 62 6a 76 29 0a 7b 0a 20 20 20 20 4f 62 6a *objv).{. Obj
104b0 65 63 74 20 2a 6f 50 74 72 20 3d 20 28 4f 62 6a ect *oPtr = (Obj
104c0 65 63 74 20 2a 29 20 54 63 6c 4f 4f 47 65 74 44 ect *) TclOOGetD
104d0 65 66 69 6e 65 43 6d 64 43 6f 6e 74 65 78 74 28 efineCmdContext(
104e0 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 54 63 6c interp);. Tcl
104f0 5f 4f 62 6a 20 2a 72 65 73 75 6c 74 4f 62 6a 3b _Obj *resultObj;
10500 0a 20 20 20 20 43 6c 61 73 73 20 2a 6d 69 78 69 . Class *mixi
10510 6e 50 74 72 3b 0a 20 20 20 20 69 6e 74 20 69 3b nPtr;. int i;
10520 0a 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 4f 62 .. if (Tcl_Ob
10530 6a 65 63 74 43 6f 6e 74 65 78 74 53 6b 69 70 70 jectContextSkipp
10540 65 64 41 72 67 73 28 63 6f 6e 74 65 78 74 29 20 edArgs(context)
10550 21 3d 20 6f 62 6a 63 29 20 7b 0a 09 54 63 6c 5f != objc) {..Tcl_
10560 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 WrongNumArgs(int
10570 65 72 70 2c 20 54 63 6c 5f 4f 62 6a 65 63 74 43 erp, Tcl_ObjectC
10580 6f 6e 74 65 78 74 53 6b 69 70 70 65 64 41 72 67 ontextSkippedArg
10590 73 28 63 6f 6e 74 65 78 74 29 2c 20 6f 62 6a 76 s(context), objv
105a0 2c 0a 09 09 4e 55 4c 4c 29 3b 0a 09 72 65 74 75 ,...NULL);..retu
105b0 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 20 20 rn TCL_ERROR;.
105c0 20 20 7d 20 65 6c 73 65 20 69 66 20 28 6f 50 74 } else if (oPt
105d0 72 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 72 65 r == NULL) {..re
105e0 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a turn TCL_ERROR;.
105f0 20 20 20 20 7d 0a 0a 20 20 20 20 72 65 73 75 6c }.. resul
10600 74 4f 62 6a 20 3d 20 54 63 6c 5f 4e 65 77 4f 62 tObj = Tcl_NewOb
10610 6a 28 29 3b 0a 20 20 20 20 46 4f 52 45 41 43 48 j();. FOREACH
10620 28 6d 69 78 69 6e 50 74 72 2c 20 6f 50 74 72 2d (mixinPtr, oPtr-
10630 3e 6d 69 78 69 6e 73 29 20 7b 0a 09 69 66 20 28 >mixins) {..if (
10640 6d 69 78 69 6e 50 74 72 29 20 7b 0a 09 20 20 20 mixinPtr) {..
10650 20 54 63 6c 5f 4c 69 73 74 4f 62 6a 41 70 70 65 Tcl_ListObjAppe
10660 6e 64 45 6c 65 6d 65 6e 74 28 4e 55 4c 4c 2c 20 ndElement(NULL,
10670 72 65 73 75 6c 74 4f 62 6a 2c 0a 09 09 20 20 20 resultObj,...
10680 20 54 63 6c 4f 4f 4f 62 6a 65 63 74 4e 61 6d 65 TclOOObjectName
10690 28 69 6e 74 65 72 70 2c 20 6d 69 78 69 6e 50 74 (interp, mixinPt
106a0 72 2d 3e 74 68 69 73 50 74 72 29 29 3b 0a 09 7d r->thisPtr));..}
106b0 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f 53 . }. Tcl_S
106c0 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 65 etObjResult(inte
106d0 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 29 3b 0a rp, resultObj);.
106e0 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f return TCL_O
106f0 4b 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e 74 K;.}..static int
10700 0a 4f 62 6a 4d 69 78 69 6e 53 65 74 28 0a 20 20 .ObjMixinSet(.
10710 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 ClientData cli
10720 65 6e 74 44 61 74 61 2c 0a 20 20 20 20 54 63 6c entData,. Tcl
10730 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c _Interp *interp,
10740 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 65 63 74 43 . Tcl_ObjectC
10750 6f 6e 74 65 78 74 20 63 6f 6e 74 65 78 74 2c 0a ontext context,.
10760 20 20 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 int objc,.
10770 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 Tcl_Obj *const
10780 20 2a 6f 62 6a 76 29 0a 7b 0a 20 20 20 20 4f 62 *objv).{. Ob
10790 6a 65 63 74 20 2a 6f 50 74 72 20 3d 20 28 4f 62 ject *oPtr = (Ob
107a0 6a 65 63 74 20 2a 29 20 54 63 6c 4f 4f 47 65 74 ject *) TclOOGet
107b0 44 65 66 69 6e 65 43 6d 64 43 6f 6e 74 65 78 74 DefineCmdContext
107c0 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 69 6e (interp);. in
107d0 74 20 6d 69 78 69 6e 63 3b 0a 20 20 20 20 54 63 t mixinc;. Tc
107e0 6c 5f 4f 62 6a 20 2a 2a 6d 69 78 69 6e 76 3b 0a l_Obj **mixinv;.
107f0 20 20 20 20 43 6c 61 73 73 20 2a 2a 6d 69 78 69 Class **mixi
10800 6e 73 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 0a ns;. int i;..
10810 20 20 20 20 69 66 20 28 54 63 6c 5f 4f 62 6a 65 if (Tcl_Obje
10820 63 74 43 6f 6e 74 65 78 74 53 6b 69 70 70 65 64 ctContextSkipped
10830 41 72 67 73 28 63 6f 6e 74 65 78 74 29 2b 31 20 Args(context)+1
10840 21 3d 20 6f 62 6a 63 29 20 7b 0a 09 54 63 6c 5f != objc) {..Tcl_
10850 57 72 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 WrongNumArgs(int
10860 65 72 70 2c 20 54 63 6c 5f 4f 62 6a 65 63 74 43 erp, Tcl_ObjectC
10870 6f 6e 74 65 78 74 53 6b 69 70 70 65 64 41 72 67 ontextSkippedArg
10880 73 28 63 6f 6e 74 65 78 74 29 2c 20 6f 62 6a 76 s(context), objv
10890 2c 0a 09 09 22 6d 69 78 69 6e 4c 69 73 74 22 29 ,..."mixinList")
108a0 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 ;..return TCL_ER
108b0 52 4f 52 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 ROR;. } else
108c0 69 66 20 28 6f 50 74 72 20 3d 3d 20 4e 55 4c 4c if (oPtr == NULL
108d0 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f ) {..return TCL_
108e0 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 20 ERROR;. }.
108f0 20 6f 62 6a 76 20 2b 3d 20 54 63 6c 5f 4f 62 6a objv += Tcl_Obj
10900 65 63 74 43 6f 6e 74 65 78 74 53 6b 69 70 70 65 ectContextSkippe
10910 64 41 72 67 73 28 63 6f 6e 74 65 78 74 29 3b 0a dArgs(context);.
10920 20 20 20 20 69 66 20 28 54 63 6c 5f 4c 69 73 74 if (Tcl_List
10930 4f 62 6a 47 65 74 45 6c 65 6d 65 6e 74 73 28 69 ObjGetElements(i
10940 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 30 5d 2c 20 nterp, objv[0],
10950 26 6d 69 78 69 6e 63 2c 0a 09 20 20 20 20 26 6d &mixinc,.. &m
10960 69 78 69 6e 76 29 20 21 3d 20 54 43 4c 5f 4f 4b ixinv) != TCL_OK
10970 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f ) {..return TCL_
10980 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 ERROR;. }..
10990 20 20 6d 69 78 69 6e 73 20 3d 20 54 63 6c 53 74 mixins = TclSt
109a0 61 63 6b 41 6c 6c 6f 63 28 69 6e 74 65 72 70 2c ackAlloc(interp,
109b0 20 73 69 7a 65 6f 66 28 43 6c 61 73 73 20 2a 29 sizeof(Class *)
109c0 20 2a 20 6d 69 78 69 6e 63 29 3b 0a 0a 20 20 20 * mixinc);..
109d0 20 66 6f 72 20 28 69 3d 30 20 3b 20 69 3c 6d 69 for (i=0 ; i<mi
109e0 78 69 6e 63 20 3b 20 69 2b 2b 29 20 7b 0a 09 6d xinc ; i++) {..m
109f0 69 78 69 6e 73 5b 69 5d 20 3d 20 47 65 74 43 6c ixins[i] = GetCl
10a00 61 73 73 49 6e 4f 75 74 65 72 43 6f 6e 74 65 78 assInOuterContex
10a10 74 28 69 6e 74 65 72 70 2c 20 6d 69 78 69 6e 76 t(interp, mixinv
10a20 5b 69 5d 2c 0a 09 09 22 6d 61 79 20 6f 6e 6c 79 [i],..."may only
10a30 20 6d 69 78 20 69 6e 20 63 6c 61 73 73 65 73 22 mix in classes"
10a40 29 3b 0a 09 69 66 20 28 6d 69 78 69 6e 73 5b 69 );..if (mixins[i
10a50 5d 20 3d 3d 20 4e 55 4c 4c 29 20 7b 0a 09 20 20 ] == NULL) {..
10a60 20 20 54 63 6c 53 74 61 63 6b 46 72 65 65 28 69 TclStackFree(i
10a70 6e 74 65 72 70 2c 20 6d 69 78 69 6e 73 29 3b 0a nterp, mixins);.
10a80 09 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f . return TCL_
10a90 45 52 52 4f 52 3b 0a 09 7d 0a 20 20 20 20 7d 0a ERROR;..}. }.
10aa0 0a 20 20 20 20 54 63 6c 4f 4f 4f 62 6a 65 63 74 . TclOOObject
10ab0 53 65 74 4d 69 78 69 6e 73 28 6f 50 74 72 2c 20 SetMixins(oPtr,
10ac0 6d 69 78 69 6e 63 2c 20 6d 69 78 69 6e 73 29 3b mixinc, mixins);
10ad0 0a 20 20 20 20 54 63 6c 53 74 61 63 6b 46 72 65 . TclStackFre
10ae0 65 28 69 6e 74 65 72 70 2c 20 6d 69 78 69 6e 73 e(interp, mixins
10af0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 );. return TC
10b00 4c 5f 4f 4b 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 20 L_OK;.}.../*. *
10b10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10b20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10b30 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10b40 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10b50 2d 2d 2d 2d 2d 2d 0a 20 2a 0a 20 2a 20 4f 62 6a ------. *. * Obj
10b60 65 63 74 56 61 72 73 47 65 74 2c 20 4f 62 6a 65 ectVarsGet, Obje
10b70 63 74 56 61 72 73 53 65 74 20 2d 2d 0a 20 2a 09 ctVarsSet --. *.
10b80 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f Implementation o
10b90 66 20 74 68 65 20 22 76 61 72 69 61 62 6c 65 22 f the "variable"
10ba0 20 73 6c 6f 74 20 61 63 63 65 73 73 6f 72 73 20 slot accessors
10bb0 6f 66 20 74 68 65 20 22 6f 6f 3a 3a 6f 62 6a 64 of the "oo::objd
10bc0 65 66 69 6e 65 22 0a 20 2a 09 63 6f 6d 6d 61 6e efine". *.comman
10bd0 64 2e 0a 20 2a 0a 20 2a 20 2d 2d 2d 2d 2d 2d 2d d.. *. * -------
10be0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10bf0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10c00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
10c10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
10c20 20 2a 2f 0a 0a 73 74 61 74 69 63 20 69 6e 74 0a */..static int.
10c30 4f 62 6a 56 61 72 73 47 65 74 28 0a 20 20 20 20 ObjVarsGet(.
10c40 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 65 6e ClientData clien
10c50 74 44 61 74 61 2c 0a 20 20 20 20 54 63 6c 5f 49 tData,. Tcl_I
10c60 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c 0a 20 nterp *interp,.
10c70 20 20 20 54 63 6c 5f 4f 62 6a 65 63 74 43 6f 6e Tcl_ObjectCon
10c80 74 65 78 74 20 63 6f 6e 74 65 78 74 2c 0a 20 20 text context,.
10c90 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 20 20 int objc,.
10ca0 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 20 2a Tcl_Obj *const *
10cb0 6f 62 6a 76 29 0a 7b 0a 20 20 20 20 4f 62 6a 65 objv).{. Obje
10cc0 63 74 20 2a 6f 50 74 72 20 3d 20 28 4f 62 6a 65 ct *oPtr = (Obje
10cd0 63 74 20 2a 29 20 54 63 6c 4f 4f 47 65 74 44 65 ct *) TclOOGetDe
10ce0 66 69 6e 65 43 6d 64 43 6f 6e 74 65 78 74 28 69 fineCmdContext(i
10cf0 6e 74 65 72 70 29 3b 0a 20 20 20 20 54 63 6c 5f nterp);. Tcl_
10d00 4f 62 6a 20 2a 72 65 73 75 6c 74 4f 62 6a 2c 20 Obj *resultObj,
10d10 2a 76 61 72 69 61 62 6c 65 4f 62 6a 3b 0a 20 20 *variableObj;.
10d20 20 20 69 6e 74 20 69 3b 0a 0a 20 20 20 20 69 66 int i;.. if
10d30 20 28 54 63 6c 5f 4f 62 6a 65 63 74 43 6f 6e 74 (Tcl_ObjectCont
10d40 65 78 74 53 6b 69 70 70 65 64 41 72 67 73 28 63 extSkippedArgs(c
10d50 6f 6e 74 65 78 74 29 20 21 3d 20 6f 62 6a 63 29 ontext) != objc)
10d60 20 7b 0a 09 54 63 6c 5f 57 72 6f 6e 67 4e 75 6d {..Tcl_WrongNum
10d70 41 72 67 73 28 69 6e 74 65 72 70 2c 20 54 63 6c Args(interp, Tcl
10d80 5f 4f 62 6a 65 63 74 43 6f 6e 74 65 78 74 53 6b _ObjectContextSk
10d90 69 70 70 65 64 41 72 67 73 28 63 6f 6e 74 65 78 ippedArgs(contex
10da0 74 29 2c 20 6f 62 6a 76 2c 0a 09 09 4e 55 4c 4c t), objv,...NULL
10db0 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 );..return TCL_E
10dc0 52 52 4f 52 3b 0a 20 20 20 20 7d 20 65 6c 73 65 RROR;. } else
10dd0 20 69 66 20 28 6f 50 74 72 20 3d 3d 20 4e 55 4c if (oPtr == NUL
10de0 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c L) {..return TCL
10df0 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 _ERROR;. }..
10e00 20 20 20 72 65 73 75 6c 74 4f 62 6a 20 3d 20 54 resultObj = T
10e10 63 6c 5f 4e 65 77 4f 62 6a 28 29 3b 0a 20 20 20 cl_NewObj();.
10e20 20 46 4f 52 45 41 43 48 28 76 61 72 69 61 62 6c FOREACH(variabl
10e30 65 4f 62 6a 2c 20 6f 50 74 72 2d 3e 76 61 72 69 eObj, oPtr->vari
10e40 61 62 6c 65 73 29 20 7b 0a 09 54 63 6c 5f 4c 69 ables) {..Tcl_Li
10e50 73 74 4f 62 6a 41 70 70 65 6e 64 45 6c 65 6d 65 stObjAppendEleme
10e60 6e 74 28 4e 55 4c 4c 2c 20 72 65 73 75 6c 74 4f nt(NULL, resultO
10e70 62 6a 2c 20 76 61 72 69 61 62 6c 65 4f 62 6a 29 bj, variableObj)
10e80 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 63 6c 5f ;. }. Tcl_
10e90 53 65 74 4f 62 6a 52 65 73 75 6c 74 28 69 6e 74 SetObjResult(int
10ea0 65 72 70 2c 20 72 65 73 75 6c 74 4f 62 6a 29 3b erp, resultObj);
10eb0 0a 20 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f . return TCL_
10ec0 4f 4b 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69 6e OK;.}..static in
10ed0 74 0a 4f 62 6a 56 61 72 73 53 65 74 28 0a 20 20 t.ObjVarsSet(.
10ee0 20 20 43 6c 69 65 6e 74 44 61 74 61 20 63 6c 69 ClientData cli
10ef0 65 6e 74 44 61 74 61 2c 0a 20 20 20 20 54 63 6c entData,. Tcl
10f00 5f 49 6e 74 65 72 70 20 2a 69 6e 74 65 72 70 2c _Interp *interp,
10f10 0a 20 20 20 20 54 63 6c 5f 4f 62 6a 65 63 74 43 . Tcl_ObjectC
10f20 6f 6e 74 65 78 74 20 63 6f 6e 74 65 78 74 2c 0a ontext context,.
10f30 20 20 20 20 69 6e 74 20 6f 62 6a 63 2c 0a 20 20 int objc,.
10f40 20 20 54 63 6c 5f 4f 62 6a 20 2a 63 6f 6e 73 74 Tcl_Obj *const
10f50 20 2a 6f 62 6a 76 29 0a 7b 0a 20 20 20 20 4f 62 *objv).{. Ob
10f60 6a 65 63 74 20 2a 6f 50 74 72 20 3d 20 28 4f 62 ject *oPtr = (Ob
10f70 6a 65 63 74 20 2a 29 20 54 63 6c 4f 4f 47 65 74 ject *) TclOOGet
10f80 44 65 66 69 6e 65 43 6d 64 43 6f 6e 74 65 78 74 DefineCmdContext
10f90 28 69 6e 74 65 72 70 29 3b 0a 20 20 20 20 69 6e (interp);. in
10fa0 74 20 76 61 72 63 2c 20 69 3b 0a 20 20 20 20 54 t varc, i;. T
10fb0 63 6c 5f 4f 62 6a 20 2a 2a 76 61 72 76 2c 20 2a cl_Obj **varv, *
10fc0 76 61 72 69 61 62 6c 65 4f 62 6a 3b 0a 0a 20 20 variableObj;..
10fd0 20 20 69 66 20 28 54 63 6c 5f 4f 62 6a 65 63 74 if (Tcl_Object
10fe0 43 6f 6e 74 65 78 74 53 6b 69 70 70 65 64 41 72 ContextSkippedAr
10ff0 67 73 28 63 6f 6e 74 65 78 74 29 2b 31 20 21 3d gs(context)+1 !=
11000 20 6f 62 6a 63 29 20 7b 0a 09 54 63 6c 5f 57 72 objc) {..Tcl_Wr
11010 6f 6e 67 4e 75 6d 41 72 67 73 28 69 6e 74 65 72 ongNumArgs(inter
11020 70 2c 20 54 63 6c 5f 4f 62 6a 65 63 74 43 6f 6e p, Tcl_ObjectCon
11030 74 65 78 74 53 6b 69 70 70 65 64 41 72 67 73 28 textSkippedArgs(
11040 63 6f 6e 74 65 78 74 29 2c 20 6f 62 6a 76 2c 0a context), objv,.
11050 09 09 22 76 61 72 69 61 62 6c 65 4c 69 73 74 22 .."variableList"
11060 29 3b 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 );..return TCL_E
11070 52 52 4f 52 3b 0a 20 20 20 20 7d 20 65 6c 73 65 RROR;. } else
11080 20 69 66 20 28 6f 50 74 72 20 3d 3d 20 4e 55 4c if (oPtr == NUL
11090 4c 29 20 7b 0a 09 72 65 74 75 72 6e 20 54 43 4c L) {..return TCL
110a0 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 _ERROR;. }.
110b0 20 20 6f 62 6a 76 20 2b 3d 20 54 63 6c 5f 4f 62 objv += Tcl_Ob
110c0 6a 65 63 74 43 6f 6e 74 65 78 74 53 6b 69 70 70 jectContextSkipp
110d0 65 64 41 72 67 73 28 63 6f 6e 74 65 78 74 29 3b edArgs(context);
110e0 0a 20 20 20 20 69 66 20 28 54 63 6c 5f 4c 69 73 . if (Tcl_Lis
110f0 74 4f 62 6a 47 65 74 45 6c 65 6d 65 6e 74 73 28 tObjGetElements(
11100 69 6e 74 65 72 70 2c 20 6f 62 6a 76 5b 30 5d 2c interp, objv[0],
11110 20 26 76 61 72 63 2c 0a 09 20 20 20 20 26 76 61 &varc,.. &va
11120 72 76 29 20 21 3d 20 54 43 4c 5f 4f 4b 29 20 7b rv) != TCL_OK) {
11130 0a 09 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 ..return TCL_ERR
11140 4f 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 OR;. }.. f
11150 6f 72 20 28 69 3d 30 20 3b 20 69 3c 76 61 72 63 or (i=0 ; i<varc
11160 20 3b 20 69 2b 2b 29 20 7b 0a 09 63 6f 6e 73 74 ; i++) {..const
11170 20 63 68 61 72 20 2a 76 61 72 4e 61 6d 65 20 3d char *varName =
11180 20 54 63 6c 5f 47 65 74 53 74 72 69 6e 67 28 76 Tcl_GetString(v
11190 61 72 76 5b 69 5d 29 3b 0a 0a 09 69 66 20 28 73 arv[i]);...if (s
111a0 74 72 73 74 72 28 76 61 72 4e 61 6d 65 2c 20 22 trstr(varName, "
111b0 3a 3a 22 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a ::") != NULL) {.
111c0 09 20 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 . Tcl_SetObjR
111d0 65 73 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 esult(interp, Tc
111e0 6c 5f 4f 62 6a 50 72 69 6e 74 66 28 0a 09 09 20 l_ObjPrintf(...
111f0 20 20 20 22 69 6e 76 61 6c 69 64 20 64 65 63 6c "invalid decl
11200 61 72 65 64 20 76 61 72 69 61 62 6c 65 20 6e 61 ared variable na
11210 6d 65 20 5c 22 25 73 5c 22 3a 20 6d 75 73 74 20 me \"%s\": must
11220 6e 6f 74 20 25 73 22 2c 0a 09 09 20 20 20 20 76 not %s",... v
11230 61 72 4e 61 6d 65 2c 20 22 63 6f 6e 74 61 69 6e arName, "contain
11240 20 6e 61 6d 65 73 70 61 63 65 20 73 65 70 61 72 namespace separ
11250 61 74 6f 72 73 22 29 29 3b 0a 09 20 20 20 20 54 ators"));.. T
11260 63 6c 5f 53 65 74 45 72 72 6f 72 43 6f 64 65 28 cl_SetErrorCode(
11270 69 6e 74 65 72 70 2c 20 22 54 43 4c 22 2c 20 22 interp, "TCL", "
11280 4f 4f 22 2c 20 22 42 41 44 5f 44 45 43 4c 56 41 OO", "BAD_DECLVA
11290 52 22 2c 20 4e 55 4c 4c 29 3b 0a 09 20 20 20 20 R", NULL);..
112a0 72 65 74 75 72 6e 20 54 43 4c 5f 45 52 52 4f 52 return TCL_ERROR
112b0 3b 0a 09 7d 0a 09 69 66 20 28 54 63 6c 5f 53 74 ;..}..if (Tcl_St
112c0 72 69 6e 67 4d 61 74 63 68 28 76 61 72 4e 61 6d ringMatch(varNam
112d0 65 2c 20 22 2a 28 2a 29 22 29 29 20 7b 0a 09 20 e, "*(*)")) {..
112e0 20 20 20 54 63 6c 5f 53 65 74 4f 62 6a 52 65 73 Tcl_SetObjRes
112f0 75 6c 74 28 69 6e 74 65 72 70 2c 20 54 63 6c 5f ult(interp, Tcl_
11300 4f 62 6a 50 72 69 6e 74 66 28 0a 09 09 20 20 20 ObjPrintf(...
11310 20 22 69 6e 76 61 6c 69 64 20 64 65 63 6c 61 72 "invalid declar
11320 65 64 20 76 61 72 69 61 62 6c 65 20 6e 61 6d 65 ed variable name
11330 20 5c 22 25 73 5c 22 3a 20 6d 75 73 74 20 6e 6f \"%s\": must no
11340 74 20 25 73 22 2c 0a 09 09 20 20 20 20 76 61 72 t %s",... var
11350 4e 61 6d 65 2c 20 22 72 65 66 65 72 20 74 6f 20 Name, "refer to
11360 61 6e 20 61 72 72 61 79 20 65 6c 65 6d 65 6e 74 an array element
11370 22 29 29 3b 0a 09 20 20 20 20 54 63 6c 5f 53 65 "));.. Tcl_Se
11380 74 45 72 72 6f 72 43 6f 64 65 28 69 6e 74 65 72 tErrorCode(inter
11390 70 2c 20 22 54 43 4c 22 2c 20 22 4f 4f 22 2c 20 p, "TCL", "OO",
113a0 22 42 41 44 5f 44 45 43 4c 56 41 52 22 2c 20 4e "BAD_DECLVAR", N
113b0 55 4c 4c 29 3b 0a 09 20 20 20 20 72 65 74 75 72 ULL);.. retur
113c0 6e 20 54 43 4c 5f 45 52 52 4f 52 3b 0a 09 7d 0a n TCL_ERROR;..}.
113d0 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 20 28 69 }. for (i
113e0 3d 30 20 3b 20 69 3c 76 61 72 63 20 3b 20 69 2b =0 ; i<varc ; i+
113f0 2b 29 20 7b 0a 09 54 63 6c 5f 49 6e 63 72 52 65 +) {..Tcl_IncrRe
11400 66 43 6f 75 6e 74 28 76 61 72 76 5b 69 5d 29 3b fCount(varv[i]);
11410 0a 20 20 20 20 7d 0a 0a 20 20 20 20 46 4f 52 45 . }.. FORE
11420 41 43 48 28 76 61 72 69 61 62 6c 65 4f 62 6a 2c ACH(variableObj,
11430 20 6f 50 74 72 2d 3e 76 61 72 69 61 62 6c 65 73 oPtr->variables
11440 29 20 7b 0a 09 54 63 6c 5f 44 65 63 72 52 65 66 ) {..Tcl_DecrRef
11450 43 6f 75 6e 74 28 76 61 72 69 61 62 6c 65 4f 62 Count(variableOb
11460 6a 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 j);. }. if
11470 20 28 69 20 21 3d 20 76 61 72 63 29 20 7b 0a 09 (i != varc) {..
11480 69 66 20 28 76 61 72 63 20 3d 3d 20 30 29 20 7b if (varc == 0) {
11490 0a 09 20 20 20 20 63 6b 66 72 65 65 28 28 63 68 .. ckfree((ch
114a0 61 72 20 2a 29 20 6f 50 74 72 2d 3e 76 61 72 69 ar *) oPtr->vari
114b0 61 62 6c 65 73 2e 6c 69 73 74 29 3b 0a 09 7d 20 ables.list);..}
114c0 65 6c 73 65 20 69 66 20 28 69 29 20 7b 0a 09 20 else if (i) {..
114d0 20 20 20 6f 50 74 72 2d 3e 76 61 72 69 61 62 6c oPtr->variabl
114e0 65 73 2e 6c 69 73 74 20 3d 20 28 54 63 6c 5f 4f es.list = (Tcl_O
114f0 62 6a 20 2a 2a 29 0a 09 09 20 20 20 20 63 6b 72 bj **)... ckr
11500 65 61 6c 6c 6f 63 28 28 63 68 61 72 20 2a 29 20 ealloc((char *)
11510 6f 50 74 72 2d 3e 76 61 72 69 61 62 6c 65 73 2e oPtr->variables.
11520 6c 69 73 74 2c 0a 09 09 20 20 20 20 73 69 7a 65 list,... size
11530 6f 66 28 54 63 6c 5f 4f 62 6a 20 2a 29 20 2a 20 of(Tcl_Obj *) *
11540 76 61 72 63 29 3b 0a 09 7d 20 65 6c 73 65 20 7b varc);..} else {
11550 0a 09 20 20 20 20 6f 50 74 72 2d 3e 76 61 72 69 .. oPtr->vari
11560 61 62 6c 65 73 2e 6c 69 73 74 20 3d 20 28 54 63 ables.list = (Tc
11570 6c 5f 4f 62 6a 20 2a 2a 29 0a 09 09 20 20 20 20 l_Obj **)...
11580 63 6b 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 54 ckalloc(sizeof(T
11590 63 6c 5f 4f 62 6a 20 2a 29 20 2a 20 76 61 72 63 cl_Obj *) * varc
115a0 29 3b 0a 09 7d 0a 20 20 20 20 7d 0a 20 20 20 20 );..}. }.
115b0 6f 50 74 72 2d 3e 76 61 72 69 61 62 6c 65 73 2e oPtr->variables.
115c0 6e 75 6d 20 3d 20 30 3b 0a 20 20 20 20 69 66 20 num = 0;. if
115d0 28 76 61 72 63 20 3e 20 30 29 20 7b 0a 09 69 6e (varc > 0) {..in
115e0 74 20 63 72 65 61 74 65 64 2c 20 6e 3b 0a 09 54 t created, n;..T
115f0 63 6c 5f 48 61 73 68 54 61 62 6c 65 20 75 6e 69 cl_HashTable uni
11600 71 75 65 54 61 62 6c 65 3b 0a 0a 09 54 63 6c 5f queTable;...Tcl_
11610 49 6e 69 74 4f 62 6a 48 61 73 68 54 61 62 6c 65 InitObjHashTable
11620 28 26 75 6e 69 71 75 65 54 61 62 6c 65 29 3b 0a (&uniqueTable);.
11630 09 66 6f 72 20 28 69 3d 6e 3d 30 20 3b 20 69 3c .for (i=n=0 ; i<
11640 76 61 72 63 20 3b 20 69 2b 2b 29 20 7b 0a 09 20 varc ; i++) {..
11650 20 20 20 54 63 6c 5f 43 72 65 61 74 65 48 61 73 Tcl_CreateHas
11660 68 45 6e 74 72 79 28 26 75 6e 69 71 75 65 54 61 hEntry(&uniqueTa
11670 62 6c 65 2c 20 76 61 72 76 5b 69 5d 2c 20 26 63 ble, varv[i], &c
11680 72 65 61 74 65 64 29 3b 0a 09 20 20 20 20 69 66 reated);.. if
11690 20 28 63 72 65 61 74 65 64 29 20 7b 0a 09 09 6f (created) {...o
116a0 50 74 72 2d 3e 76 61 72 69 61 62 6c 65 73 2e 6c Ptr->variables.l
116b0 69 73 74 5b 6e 2b 2b 5d 20 3d 20 76 61 72 76 5b ist[n++] = varv[
116c0 69 5d 3b 0a 09 20 20 20 20 7d 20 65 6c 73 65 20 i];.. } else
116d0 7b 0a 09 09 54 63 6c 5f 44 65 63 72 52 65 66 43 {...Tcl_DecrRefC
116e0 6f 75 6e 74 28 76 61 72 76 5b 69 5d 29 3b 0a 09 ount(varv[i]);..
116f0 20 20 20 20 7d 0a 09 7d 0a 09 6f 50 74 72 2d 3e }..}..oPtr->
11700 76 61 72 69 61 62 6c 65 73 2e 6e 75 6d 20 3d 20 variables.num =
11710 6e 3b 0a 0a 09 2f 2a 0a 09 20 2a 20 53 68 6f 75 n;.../*.. * Shou
11720 6c 64 6e 27 74 20 62 65 20 6e 65 63 65 73 73 61 ldn't be necessa
11730 72 79 2c 20 62 75 74 20 6d 61 69 6e 74 61 69 6e ry, but maintain
11740 20 6e 75 6d 2f 6c 69 73 74 20 69 6e 76 61 72 69 num/list invari
11750 61 6e 74 2e 0a 09 20 2a 2f 0a 0a 09 6f 50 74 72 ant... */...oPtr
11760 2d 3e 76 61 72 69 61 62 6c 65 73 2e 6c 69 73 74 ->variables.list
11770 20 3d 20 28 54 63 6c 5f 4f 62 6a 20 2a 2a 29 0a = (Tcl_Obj **).
11780 09 09 63 6b 72 65 61 6c 6c 6f 63 28 28 63 68 61 ..ckrealloc((cha
11790 72 20 2a 29 20 6f 50 74 72 2d 3e 76 61 72 69 61 r *) oPtr->varia
117a0 62 6c 65 73 2e 6c 69 73 74 2c 0a 09 09 73 69 7a bles.list,...siz
117b0 65 6f 66 28 54 63 6c 5f 4f 62 6a 20 2a 29 20 2a eof(Tcl_Obj *) *
117c0 20 6e 29 3b 0a 09 54 63 6c 5f 44 65 6c 65 74 65 n);..Tcl_Delete
117d0 48 61 73 68 54 61 62 6c 65 28 26 75 6e 69 71 75 HashTable(&uniqu
117e0 65 54 61 62 6c 65 29 3b 0a 20 20 20 20 7d 0a 20 eTable);. }.
117f0 20 20 20 72 65 74 75 72 6e 20 54 43 4c 5f 4f 4b return TCL_OK
11800 3b 0a 7d 0a 0c 0a 2f 2a 0a 20 2a 20 4c 6f 63 61 ;.}.../*. * Loca
11810 6c 20 56 61 72 69 61 62 6c 65 73 3a 0a 20 2a 20 l Variables:. *
11820 6d 6f 64 65 3a 20 63 0a 20 2a 20 63 2d 62 61 73 mode: c. * c-bas
11830 69 63 2d 6f 66 66 73 65 74 3a 20 34 0a 20 2a 20 ic-offset: 4. *
11840 66 69 6c 6c 2d 63 6f 6c 75 6d 6e 3a 20 37 38 0a fill-column: 78.
11850 20 2a 20 45 6e 64 3a 0a 20 2a 2f 0a * End:. */.